From c72f35a27a748e7b55fe428c3ca13fc3b905d015 Mon Sep 17 00:00:00 2001 From: VikingKong Date: Wed, 9 Nov 2022 23:24:35 +0300 Subject: [PATCH] Implement j/k navigation, clearing DataTable and getting current cell value --- App.py | 80 +++++++++++++++++++++++++++++++++++++--------------------- 1 file changed, 51 insertions(+), 29 deletions(-) diff --git a/App.py b/App.py index 8db128d..119e31e 100644 --- a/App.py +++ b/App.py @@ -1,19 +1,46 @@ from textual.containers import Container, Vertical from textual.app import ComposeResult, App from textual.widgets import Static, Header, DataTable +from textual.widget import Widget -class FeedPane(Vertical): - def __init__(self, content): +class FeedPane(Widget): + def __init__(self): super().__init__() - self.content = content self.id = "feed-pane" - def add(self, e): - self.content.append(e) + def add(self, content): + table = self.query_one(DataTable) + table.add_rows([[item] for item in content]) + + def addColumn(self, title): + table = self.query_one(DataTable) + table.add_column(title, width=60) + + def clear(self): + table = self.query_one(DataTable) + table.data = {} + table.rows = {} + table.row_count = 0 + table._line_no = 0 + table._y_offsets = [] + table._new_rows = set() + table._clear_caches() + table._require_update_dimensions = True + table.check_idle() + + def currentValue(self): + table = self.query_one(DataTable) + row_num = table.cursor_cell.row + column_num = table.cursor_cell.column + return table.data[row_num][column_num] + + def focus(self): + table = self.query_one(DataTable) + table.focus() def compose(self): - yield Vertical(*self.content, id="left-container") + yield DataTable(id="feeds_table") class FeedItem(Static): @@ -34,36 +61,30 @@ class GUI(App): def __init__(self): super().__init__() - self.i = 0 def on_key(self, event): - # item = self.query(FeedItem)[self.i] - # item.set_styles("color: auto;") if event.key == "j": - self.i += 1 + pane = self.query_one(DataTable) + pane.key_down(event) elif event.key == "k": - self.i -= 1 - elif event.key == "r": pane = self.query_one(DataTable) - pane.data = {} - pane.row_count = 0 - pane._line_no = 0 - pane._y_offsets = [] - pane._require_update_dimensions = True - pane.check_idle() + pane.key_up(event) elif event.key == "a": - pane = self.query_one(DataTable) - pane.add_rows([["XXX"]]) + pane = self.query_one(FeedPane) + pane.add(["XXX"]) + elif event.key == "r": + pane = self.query_one(FeedPane) + pane.clear() + elif event.key == "space": + pane = self.query_one(FeedPane) + pane.add([pane.currentValue()]) else: pass - # item = self.query(FeedItem)[self.i] - # item.set_styles("color: blue;") def compose(self) -> ComposeResult: yield Header() yield Container( - # FeedPane([FeedItem(f"Feed# {number}", number) for number in range(15)]), - DataTable(), + FeedPane(), Vertical( *[Static("Horizontally"), Static("Positioned"), @@ -75,11 +96,12 @@ class GUI(App): ) def on_mount(self): - dt = self.query_one(DataTable) - dt.add_column("Feeds", width = 60) - # dt.add_rows([[FeedItem(f"Feed# {number}", number)] for number in range(15)]) - dt.add_rows([[str(number)] for number in range(15)]) - dt.focus() + fp = self.query_one(FeedPane) + fp.addColumn("Feeds") + fp.add(["Feed#" + str(number) for number in range(15)]) + # fp.add_rows([[FeedItem(f"Feed# {number}", number)] for number in range(15)]) + fp.focus() + if __name__ == "__main__": app = GUI()