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
1 file
+ 12
45
Compare changes
  • Side-by-side
  • Inline
@@ -107,7 +107,6 @@ class CartItem(CliveCheckerboardTableRow, CliveWidget, can_focus=True):
classes="actions",
),
)
self._ready_for_deletion = False
def __repr__(self) -> str:
return f"{self.__class__.__name__}(idx={self._idx})"
@@ -160,14 +159,6 @@ class CartItem(CliveCheckerboardTableRow, CliveWidget, can_focus=True):
assert self.is_valid(self._idx), "cannot get operation, position is invalid"
return self.profile.cart[self._idx]
@property
def ready_for_deletion(self) -> bool:
return self._ready_for_deletion
@ready_for_deletion.setter
def ready_for_deletion(self, value: bool) -> None:
self._ready_for_deletion = value
@property
def __operations_count(self) -> int:
return len(self.profile.cart)
@@ -192,11 +183,7 @@ class CartItem(CliveCheckerboardTableRow, CliveWidget, can_focus=True):
@on(CliveButton.Pressed, "#delete-button")
def delete(self) -> None:
self.post_message(self.RemovalCheck(self))
logger.debug(f"DELETE CLICKED, READY?: {self._ready_for_deletion}")
if self._ready_for_deletion:
self.post_message(self.StartRemovalProcess())
self.post_message(self.Delete(self))
self.post_message(self.Delete(self))
@on(Move)
def move_item(self, event: CartItem.Move) -> None:
@@ -215,29 +202,18 @@ class CartHeader(Horizontal):
class CartTable(CliveCheckerboardTable):
"""Table with CartItems."""
def __init__(self) -> None:
super().__init__(header=CartHeader(), title=Static(""))
self._removal_in_progress = False
@property
def ready_to_delete_item(self) -> bool:
return not self._removal_in_progress
self.rows = None
def create_static_rows(self, start_index: int = 0, end_index: int | None = None) -> list[CartItem]:
if end_index:
assert end_index <= len(self.app.world.profile.cart) - 1, "End index is greater than cart's last item index"
return [
self.rows = [
CartItem(idx)
for idx in range(start_index, len(self.app.world.profile.cart) if end_index is None else end_index + 1)
]
def _start_removal_process(self) -> None:
self._removal_in_progress = True
def _end_removal_process(self) -> None:
self.app.trigger_profile_watchers()
self._removal_in_progress = False
return self.rows
def _handle_remove_event(self, triggering_widget: CartItem) -> None:
def devalue_indexes(rows: Sequence[CartItem]) -> None:
@@ -245,13 +221,12 @@ class CartTable(CliveCheckerboardTable):
row.reactive_idx = row.reactive_idx - 1
start_index = triggering_widget.reactive_idx
rows = self.query(CartItem)[start_index:]
devalue_indexes(rows)
self.set_evenness_styles(rows, starting_index=start_index)
devalue_indexes(self.rows[start_index:])
self.set_evenness_styles(self.rows[start_index:], 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]
row = self.rows[row_index]
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]
@@ -265,19 +240,13 @@ class CartTable(CliveCheckerboardTable):
for cell, value in zip(cells, data):
cell.update_content(value) # type: ignore[arg-type]
@on(CartItem.RemovalCheck)
def check_removal(self, event: CartItem.RemovalCheck) -> None:
event.widget.ready_for_deletion = self.ready_to_delete_item
@on(CartItem.StartRemovalProcess)
def start_removal_process(self) -> None:
self._start_removal_process()
@on(CartItem.Delete)
async def remove_item(self, event: CartItem.Delete) -> None:
await self.query(CliveCheckerboardTableRow)[event.widget.reactive_idx].remove()
self.rows.remove(event.widget)
await event.widget.remove()
self.profile.cart.remove(event.widget.operation)
self._handle_remove_event(triggering_widget=event.widget)
self.app.trigger_profile_watchers()
if len(self.app.world.profile.cart) > 0 and event.widget.reactive_idx == 0:
# disable first ButtomMoveUp if first element was removed
@@ -286,8 +255,6 @@ class CartTable(CliveCheckerboardTable):
# disable last ButtonMoveDown if only last element was removed
self.query(ButtonMoveDown)[-1].disabled = True
self._end_removal_process()
@on(CartItem.Move)
async def move_item(self, event: CartItem.Move) -> None:
assert event.to_idx >= 0, "Item cannot be moved to id lower than 0."
@@ -297,7 +264,7 @@ class CartTable(CliveCheckerboardTable):
self.app.trigger_profile_watchers()
self._update_values_of_swapped_rows(from_index=event.from_idx, to_index=event.to_idx)
# focus item that was moved
for cart_item in self.query(CartItem):
for cart_item in self.rows:
if event.to_idx == cart_item.reactive_idx:
self.app.set_focus(cart_item)
if event.focus_button:
@@ -305,7 +272,7 @@ class CartTable(CliveCheckerboardTable):
@on(CartItem.Focus)
def focus_item(self, event: CartItem.Focus) -> None:
for cart_item in self.query(CartItem):
for cart_item in self.rows:
if event.target_idx == cart_item.reactive_idx:
self.app.set_focus(cart_item)
if event.focus_button:
Loading