Skip to content
Snippets Groups Projects

Refactor Cart into checkerboard table

Merged Mateusz Kudela requested to merge mkudela/issue-173 into develop
Compare and Show latest version
6 files
+ 38
24
Compare changes
  • Side-by-side
  • Inline
Files
6
from __future__ import annotations
from typing import TYPE_CHECKING
from typing import TYPE_CHECKING, Sequence
from textual import on
from textual.binding import Binding
@@ -214,34 +214,38 @@ class Cart(BaseScreen):
async def __rebuild_items(self, from_index: int = 0, to_index: int | None = None) -> None:
await self._cart_table.rebuild(starting_from_element=from_index, ending_with_element=to_index)
def _devalue_indexes_and_readjust_styles_after_remove(self, triggering_widget: CartItem) -> None:
def _handle_remove_event(self, triggering_widget: CartItem) -> None:
def devalue_indexes(rows: Sequence[CartItem]) -> None:
for row in rows:
row.reactive_idx = row.idx - 1
start_index = triggering_widget.idx
end_index = len(self.app.world.profile_data.cart)
rows = self.query(CartItem)[start_index:end_index]
for row in rows:
row.reactive_idx = row.idx - 1
rows = self.query(CartItem)[start_index:]
devalue_indexes(rows)
self._cart_table.set_evenness_styles(rows, starting_index=start_index)
def _update_values_of_swapped_rows(self, from_index: int, to_index: int) -> None:
def get_cells_with_values(row_index: int) -> tuple[list[CliveCheckerBoardTableCell], list[str | Widget]]:
row = self.query(CartItem)[row_index]
cells = row.query(CliveCheckerBoardTableCell)[1:-1] # exclude index and horizontal with buttons
start_index = 1 # exclude value of first cell - index
end_index = -1 # exclude value of last cell - horizontal with buttons
cells = row.query(CliveCheckerBoardTableCell)[start_index:end_index]
data = [cell.content for cell in cells]
return cells, data
from_cells, from_data = get_cells_with_values(from_index)
to_cells, to_data = get_cells_with_values(to_index)
for x in (to_cells, from_data), (from_cells, to_data):
for cell, value in zip(x[0], x[1]):
cell.update_content(value)
for cells, data in [(to_cells, from_data), (from_cells, to_data)]:
for cell, value in zip(cells, data):
cell.update_content(value) # type: ignore[arg-type]
@on(CartItem.Delete)
async def remove_item(self, event: CartItem.Delete) -> None:
self.app.world.profile_data.cart.remove(event.widget.operation)
self.app.trigger_profile_data_watchers()
await self.query(CliveCheckerboardTableRow)[event.widget.idx].remove()
self._devalue_indexes_and_readjust_styles_after_remove(triggering_widget=event.widget)
self._handle_remove_event(triggering_widget=event.widget)
if len(self.app.world.profile_data.cart) > 0 and event.widget.idx == 0:
# disable first ButtomMoveUp if first element was removed
@@ -252,8 +256,10 @@ class Cart(BaseScreen):
@on(CartItem.Move)
async def move_item(self, event: CartItem.Move) -> None:
assert event.to_idx >= 0
assert event.to_idx < len(self.app.world.profile_data.cart)
assert event.to_idx >= 0, "Item cannot be moved to id lower than 0."
assert event.to_idx < len(
self.app.world.profile_data.cart
), "Item cannot be moved to id greater than cart length."
self.app.world.profile_data.cart.swap(event.from_idx, event.to_idx)
self.app.trigger_profile_data_watchers()
Loading