diff --git a/hamstertools/__init__.py b/hamstertools/__init__.py index 666b530..be12c92 100755 --- a/hamstertools/__init__.py +++ b/hamstertools/__init__.py @@ -9,8 +9,9 @@ import click import requests import sqlite3 -HAMSTER_DIR = Path.home() / '.local/share/hamster' -HAMSTER_FILE = HAMSTER_DIR / 'hamster.db' +# HAMSTER_DIR = Path.home() / '.local/share/hamster' +# HAMSTER_FILE = HAMSTER_DIR / 'hamster.db' +HAMSTER_FILE = 'hamster-testing.db' conn = sqlite3.connect(HAMSTER_FILE) c = conn.cursor() @@ -703,7 +704,7 @@ def _import(username, mapping_path=None, output=None, category_search=None, afte @cli.command() def app(): from .app import HamsterToolsApp - app = HamsterToolsApp(db_cursor=c) + app = HamsterToolsApp(db_cursor=c, db_connection=conn) app.run() diff --git a/hamstertools/app.py b/hamstertools/app.py index e8d6d2d..3836cc7 100644 --- a/hamstertools/app.py +++ b/hamstertools/app.py @@ -1,32 +1,58 @@ from textual.app import App, ComposeResult from textual.widgets import Header, Footer, DataTable +from textual.coordinate import Coordinate -ROWS = [ - ("lane", "swimmer", "country", "time"), - (4, "Joseph Schooling", "Singapore", 50.39), - (2, "Michael Phelps", "United States", 51.14), - (5, "Chad le Clos", "South Africa", 51.14), - (6, "László Cseh", "Hungary", 51.14), - (3, "Li Zhuhao", "China", 51.26), - (8, "Mehdy Metella", "France", 51.58), - (7, "Tom Shields", "United States", 51.73), - (1, "Aleksandr Sadovnikov", "Russia", 51.84), - (10, "Darren Burns", "Scotland", 51.84), -] - class HamsterToolsApp(App): """A Textual app to manage stopwatches.""" BINDINGS = [ ("q", "quit", "Quit"), - ("m", "mark", "Mark"), + ("s", "sort", "Sort"), + ("r", "refresh", "Refresh"), + ("d", "delete_activity", "Delete activity"), ] - def __init__(self, db_cursor): + def __init__(self, db_cursor, db_connection): self.db_cursor = db_cursor + self.db_connection = db_connection super().__init__() + def _refresh(self): + self.table.clear() + + sql = ''' + SELECT + categories.id AS category_id, + COALESCE(categories.name, '') AS category_name, + activities.id AS activity_id, + activities.name AS activity_name, + COALESCE(facts_count, 0) AS total_facts + FROM + activities + LEFT JOIN + categories + ON + activities.category_id = categories.id + LEFT JOIN ( + SELECT + activity_id, + COUNT(*) AS facts_count + FROM + facts + GROUP BY + activity_id + ) AS facts_count_subquery + ON + activities.id = facts_count_subquery.activity_id; + ''' + + results = self.db_cursor.execute(sql) + # results = [[cell or "" for cell in row] for row in self.db_cursor.fetchall()] + + self.table.add_rows(results) + self.table.sort(self.columns[1], self.columns[3]) + def compose(self) -> ComposeResult: """Create child widgets for the app.""" yield Header() @@ -34,26 +60,38 @@ class HamsterToolsApp(App): yield Footer() def on_mount(self) -> None: - table = self.query_one(DataTable) - - sql = ''' - SELECT - categories.id, categories.name, activities.id, activities.name - FROM - activities - LEFT JOIN - categories - ON - activities.category_id = categories.id ''' - - results = self.db_cursor.execute(sql) - results = [[cell or "" for cell in row] for row in self.db_cursor.fetchall()] - - columns = table.add_columns("category id","category","activity ID","activity") - - table.add_rows(results) - table.sort(columns[1], columns[3]) - table.cursor_type = "row" + self.table = self.query_one(DataTable) + self.table.cursor_type = "row" + self.columns = self.table.add_columns("category id","category","activity ID","activity","entries") + self._refresh() def action_quit(self) -> None: self.exit() + + def action_refresh(self) -> None: + self._refresh() + + def action_sort(self) -> None: + self.table.cursor_type = "column" + + def action_delete_activity(self) -> None: + # 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( + Coordinate(self.table.cursor_coordinate.row, 2), + ) + + sql = 'DELETE FROM activities WHERE id = ?' + print(Coordinate(2, self.table.cursor_coordinate.row),) + print(activity_id) + + self.db_cursor.execute(sql, (activity_id,)) + self.db_connection.commit() + + # 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): + event.data_table.sort(event.column_key) + event.data_table.cursor_type = "row"