From eebd5d8c6d8a756384b6cf1b2cc76b8a83cdf929 Mon Sep 17 00:00:00 2001 From: Mia Herkt Date: Tue, 20 Dec 2022 15:45:55 +0100 Subject: Add moderation TUI This ended up way fancier than I imagined. --- modui/filetable.py | 72 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 modui/filetable.py (limited to 'modui/filetable.py') diff --git a/modui/filetable.py b/modui/filetable.py new file mode 100644 index 0000000..7be0f1b --- /dev/null +++ b/modui/filetable.py @@ -0,0 +1,72 @@ +from textual.widgets import DataTable, Static +from textual.reactive import Reactive +from textual.message import Message, MessageTarget +from textual import events, log +from jinja2.filters import do_filesizeformat + +from fhost import File +from modui import mime + +class FileTable(DataTable): + query = Reactive(None) + order_col = Reactive(0) + order_desc = Reactive(True) + limit = 10000 + colmap = [File.id, File.removed, File.nsfw_score, None, File.ext, File.size, File.mime] + + def __init__(self, **kwargs): + super().__init__(**kwargs) + self.add_columns("#", "☣️", "🔞", "📂", "name", "size", "mime") + self.base_query = File.query.filter(File.size != None) + self.query = self.base_query + + class Selected(Message): + def __init__(self, sender: MessageTarget, f: File) -> None: + self.file = f + super().__init__(sender) + + def watch_order_col(self, old, value) -> None: + self.watch_query(None, None) + + def watch_order_desc(self, old, value) -> None: + self.watch_query(None, None) + + def watch_query(self, old, value) -> None: + def fmt_file(f: File) -> tuple: + return ( + str(f.id), + "🔴" if f.removed else " ", + "🚩" if f.is_nsfw else " ", + "👻" if not f.getpath().is_file() else " ", + f.getname(), + do_filesizeformat(f.size, True), + f"{mime.mimemoji.get(f.mime.split('/')[0], mime.mimemoji.get(f.mime)) or ' '} " + f.mime, + ) + + if (self.query): + self.clear() + order = FileTable.colmap[self.order_col] + q = self.query + if order: q = q.order_by(order.desc() if self.order_desc else order, File.id) + self.add_rows(map(fmt_file, q.limit(self.limit))) + + def _scroll_cursor_in_to_view(self, animate: bool = False) -> None: + region = self._get_cell_region(self.cursor_row, 0) + spacing = self._get_cell_border() + self.scroll_to_region(region, animate=animate, spacing=spacing) + + async def watch_cursor_cell(self, old, value) -> None: + super().watch_cursor_cell(old, value) + if value[0] < len(self.data) and value[0] >= 0: + f = File.query.get(int(self.data[value[0]][0])) + await self.emit(self.Selected(self, f)) + + def on_click(self, event: events.Click) -> None: + super().on_click(event) + meta = self.get_style_at(event.x, event.y).meta + if meta: + if meta["row"] == -1: + qi = FileTable.colmap[meta["column"]] + if meta["column"] == self.order_col: + self.order_desc = not self.order_desc + self.order_col = meta["column"] -- cgit v1.2.3