From cbbf952787ec2b4ec1be4523a0f1e65394bbde0c Mon Sep 17 00:00:00 2001 From: 3wc <3wc@doesthisthing.work> Date: Fri, 27 Oct 2023 16:28:46 +0100 Subject: [PATCH] Improve filtering, add "move facts" --- hamstertools/app.py | 48 +++++++++++++++++++++++++++++++++++++-------- hamstertools/db.py | 18 ++++++++++++++++- 2 files changed, 57 insertions(+), 9 deletions(-) diff --git a/hamstertools/app.py b/hamstertools/app.py index 6bd04c4..4ea2baa 100644 --- a/hamstertools/app.py +++ b/hamstertools/app.py @@ -12,6 +12,7 @@ class ActivitiesScreen(Screen): BINDINGS = [ ("q", "quit", "Quit"), ("s", "sort", "Sort"), + ("f", "move_facts", "Move facts"), ("r", "refresh", "Refresh"), ("d", "delete", "Delete activity"), ("/", "filter", "Search"), @@ -60,19 +61,30 @@ class ActivitiesScreen(Screen): def action_sort(self) -> None: self.table.cursor_type = "column" + def on_data_table_column_selected(self, event): + self.sort = (event.column_key,) + event.data_table.sort(*self.sort) + event.data_table.cursor_type = "row" + def action_filter(self) -> None: filter_input = self.query_one("#filter") filter_input.display = True + self._refresh(filter_input.value) filter_input.focus() - print(filter_input) + + def on_input_submitted(self, event): + self.table.focus() + def action_cancelfilter(self) -> None: filter_input = self.query_one("#filter") filter_input.display = False + filter_input.clear() + self.table.focus() self._refresh() def action_delete(self) -> None: - # get the keys for the row and column under the cursor. + # get the keys for the row and column under the cursor. row_key, _ = self.table.coordinate_to_cell_key(self.table.cursor_coordinate) activity_id = self.table.get_cell_at( @@ -85,15 +97,30 @@ class ActivitiesScreen(Screen): # supply the row key to `remove_row` to delete the row. self.table.remove_row(row_key) - def on_data_table_column_selected(self, event): - self.sort = (event.column_key,) - event.data_table.sort(*self.sort) - event.data_table.cursor_type = "row" + def action_move_facts(self) -> None: + row_idx: int = self.table.cursor_row + row_cells = self.table.get_row_at(row_idx) + self.move_from_activity = Activity.get_by_id(self.db_manager, row_cells[2]) + for col_idx, cell_value in enumerate(row_cells): + cell_coordinate = Coordinate(row_idx, col_idx) + self.table.update_cell_at( + cell_coordinate, + f"[red]{cell_value}[/red]", + ) + self.table.move_cursor(row=self.table.cursor_coordinate[0]+1) + + def on_data_table_row_selected(self, event): + if getattr(self, "move_from_activity", None) is not None: + move_to_activity = Activity.get_by_id(self.db_manager, self.table.get_cell_at( + Coordinate(event.cursor_row, 2) + )) + self.move_from_activity.move_facts(move_to_activity) + self._refresh() + del self.move_from_activity def on_input_changed(self, event): self._refresh(event.value) - class CategoriesScreen(Screen): BINDINGS = [ ("s", "sort", "Sort"), @@ -149,12 +176,17 @@ class CategoriesScreen(Screen): def action_filter(self) -> None: filter_input = self.query_one("#filter") filter_input.display = True + self._refresh(filter_input.value) filter_input.focus() - print(filter_input) + + def on_input_submitted(self, event): + self.table.focus() def action_cancelfilter(self) -> None: filter_input = self.query_one("#filter") filter_input.display = False + filter_input.clear() + self.table.focus() self._refresh() def on_input_changed(self, event): diff --git a/hamstertools/db.py b/hamstertools/db.py index 6193361..bf9bf3e 100644 --- a/hamstertools/db.py +++ b/hamstertools/db.py @@ -92,6 +92,22 @@ class Activity(BaseORM): self.category_name = category_name self.facts_count = facts_count + def move_facts(self, to_activity): + cursor = self.db_manager.get_cursor() + + print(f"moving from {self.id} to {to_activity.id}") + + cursor.execute(""" + UPDATE + facts + SET + activity_id = ? + WHERE + activity_id = ? + """, (to_activity.id, self.id)) + + self.conn.commit() + @staticmethod def list_activities(db_manager, filter_query=None): cursor = db_manager.get_cursor() @@ -121,7 +137,7 @@ class Activity(BaseORM): """ if filter_query is not None: - cursor.execute(sql, ("%{}%".format(filter_query),) * 2 ) + cursor.execute(sql, ("%{}%".format(filter_query),) * 2) else: cursor.execute(sql)