summaryrefslogtreecommitdiff
path: root/modui/filetable.py
diff options
context:
space:
mode:
authorMia Herkt <mia@0x0.st>2022-12-20 15:45:55 +0100
committerMia Herkt <mia@0x0.st>2022-12-20 16:19:49 +0100
commiteebd5d8c6d8a756384b6cf1b2cc76b8a83cdf929 (patch)
tree764a7c28cbdc165d0cf843f8cc0f6bc53ab224b6 /modui/filetable.py
parentdcea8bffe19b8ba308f9361d6c8ef08281ddff1b (diff)
Add moderation TUI
This ended up way fancier than I imagined.
Diffstat (limited to 'modui/filetable.py')
-rw-r--r--modui/filetable.py72
1 files changed, 72 insertions, 0 deletions
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"]