mirror of
https://github.com/aclist/dztui.git
synced 2026-10-30 22:52:42 +01:00
feat: wrap TreeModelFilter in TreeModelSort
This commit is contained in:
1 parent
8665292ff8
commit
2f6a78fc65
10 files changed
+32
-15
No files matched your search
@@ -216,7 +216,7 @@ def query_direct(ip: str, qport: int, TIMEOUT: float = 3.0) -> dict | None:
|
|||||||
res["ping"] = ping
|
res["ping"] = ping
|
||||||
return res
|
return res
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logger.critical(e)
|
logger.critical(f"{type(e).__name__}: {e}")
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -140,4 +140,8 @@ class Emitter(GObject.GObject):
|
|||||||
def keyword_set(self, keyword: str) -> None:
|
def keyword_set(self, keyword: str) -> None:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
@GObject.Signal(flags=GObject.SignalFlags.RUN_LAST, arg_types=())
|
||||||
|
def log_page_loaded(self) -> None:
|
||||||
|
pass
|
||||||
|
|
||||||
# TODO: if servers fail to load, may leave dangling widgets waiting for a signal
|
# TODO: if servers fail to load, may leave dangling widgets waiting for a signal
|
||||||
@@ -554,6 +554,9 @@ class Controller(GObject.GObject):
|
|||||||
def get_notebook(self) -> "Notebook":
|
def get_notebook(self) -> "Notebook":
|
||||||
return self.mediator.notebook
|
return self.mediator.notebook
|
||||||
|
|
||||||
|
def get_prior_page(self) -> NotebookPage:
|
||||||
|
return self.mediator.notebook.get_prior_page()
|
||||||
|
|
||||||
def get_servers(self) -> "Notebook":
|
def get_servers(self) -> "Notebook":
|
||||||
return self.mediator.servers
|
return self.mediator.servers
|
||||||
|
|
||||||
|
|||||||
@@ -143,4 +143,5 @@ def main() -> None:
|
|||||||
use_miles,
|
use_miles,
|
||||||
)
|
)
|
||||||
print("All OK. Loading UI...")
|
print("All OK. Loading UI...")
|
||||||
|
logger.critical("e")
|
||||||
App(prefs)
|
App(prefs)
|
||||||
@@ -180,6 +180,9 @@ class Notebook(ScrollableMixin, Gtk.Notebook): # type: ignore
|
|||||||
return
|
return
|
||||||
self.set_page_by_enum(self.prior_page)
|
self.set_page_by_enum(self.prior_page)
|
||||||
|
|
||||||
|
def get_prior_page(self) -> NotebookPage:
|
||||||
|
return self.prior_page
|
||||||
|
|
||||||
def get_page_by_enum(self) -> NotebookPage | None:
|
def get_page_by_enum(self) -> NotebookPage | None:
|
||||||
for k, v in self.indexes.items():
|
for k, v in self.indexes.items():
|
||||||
if v == self.get_current_page():
|
if v == self.get_current_page():
|
||||||
|
|||||||
@@ -78,7 +78,7 @@ class LanPanel(Gtk.Frame):
|
|||||||
|
|
||||||
self.entry.set_sensitive(False)
|
self.entry.set_sensitive(False)
|
||||||
|
|
||||||
def _on_lan_keypress(self, widget: Gtk.Entry, event: Gdk.EventKey) -> None:
|
def _on_lan_keypress(self, widget: Gtk.Entry, event: Gdk.EventKey) -> bool:
|
||||||
if event.state & Gdk.ModifierType.CONTROL_MASK:
|
if event.state & Gdk.ModifierType.CONTROL_MASK:
|
||||||
if event.keyval == Gdk.KEY_d:
|
if event.keyval == Gdk.KEY_d:
|
||||||
self.default_radio.set_active(True)
|
self.default_radio.set_active(True)
|
||||||
|
|||||||
@@ -36,11 +36,11 @@ class Statusbar(Gtk.Grid):
|
|||||||
warnings, errors = self.controller.get_alerts()
|
warnings, errors = self.controller.get_alerts()
|
||||||
|
|
||||||
if warnings + errors > 0:
|
if warnings + errors > 0:
|
||||||
alert_button = LoggerAlertsButton(warnings, errors)
|
self.alert_button = LoggerAlertsButton(warnings, errors)
|
||||||
self.attach_next_to(
|
self.attach_next_to(
|
||||||
alert_button, self.spinner, Gtk.PositionType.RIGHT, 3, 1
|
self.alert_button, self.spinner, Gtk.PositionType.RIGHT, 3, 1
|
||||||
)
|
)
|
||||||
alert_button.connect("clicked", self._on_alerts_clicked)
|
self.alert_button.connect("clicked", self._on_alerts_clicked)
|
||||||
|
|
||||||
# TODO: pack version event box in right panel into hbox with update button
|
# TODO: pack version event box in right panel into hbox with update button
|
||||||
# TODO: spawns a modal or just jumps right to install page
|
# TODO: spawns a modal or just jumps right to install page
|
||||||
@@ -61,13 +61,14 @@ class Statusbar(Gtk.Grid):
|
|||||||
self.emitter.connect("distcalc_ended", self._on_distcalc_ended)
|
self.emitter.connect("distcalc_ended", self._on_distcalc_ended)
|
||||||
self.emitter.connect("servers_loaded", self._on_servers_loaded)
|
self.emitter.connect("servers_loaded", self._on_servers_loaded)
|
||||||
self.emitter.connect("mod_page_loaded", self._on_mod_page_loaded)
|
self.emitter.connect("mod_page_loaded", self._on_mod_page_loaded)
|
||||||
|
self.emitter.connect("log_page_loaded", self._on_log_page_loaded)
|
||||||
|
|
||||||
def _on_alerts_clicked(self, button: LoggerAlertsButton) -> None:
|
def _on_alerts_clicked(self, button: LoggerAlertsButton) -> None:
|
||||||
button.hide()
|
|
||||||
# FIXME: hitting ESC from here goes to help list instead of main menu
|
|
||||||
# need some kind of flag
|
|
||||||
self.controller.populate_log()
|
self.controller.populate_log()
|
||||||
|
|
||||||
|
def _on_log_page_loaded(self, emitter: "Emitter") -> None:
|
||||||
|
self.alert_button.hide()
|
||||||
|
|
||||||
def _on_mod_page_loaded(self, emitter: "Emitter") -> None:
|
def _on_mod_page_loaded(self, emitter: "Emitter") -> None:
|
||||||
msg = self.controller.format_mod_statusbar()
|
msg = self.controller.format_mod_statusbar()
|
||||||
self.set_by_context(NotebookPage.MODS, msg)
|
self.set_by_context(NotebookPage.MODS, msg)
|
||||||
|
|||||||
@@ -13,5 +13,6 @@ class HelpMenuMixin:
|
|||||||
self, widget: Gtk.Widget, event: Gdk.EventKey
|
self, widget: Gtk.Widget, event: Gdk.EventKey
|
||||||
) -> Literal[True]:
|
) -> Literal[True]:
|
||||||
if event.keyval == Gdk.KEY_Escape:
|
if event.keyval == Gdk.KEY_Escape:
|
||||||
self.controller.open_page(NotebookPage.HELP) # type: ignore
|
prior = self.controller.get_prior_page()
|
||||||
|
self.controller.open_page(prior) # type: ignore
|
||||||
return True
|
return True
|
||||||
@@ -39,8 +39,10 @@ class Log(CursorMixin, HelpMenuMixin, Gtk.Box): # type: ignore
|
|||||||
|
|
||||||
self.controller = controller
|
self.controller = controller
|
||||||
self.controller.register_widget("logtreeview", self.treeview)
|
self.controller.register_widget("logtreeview", self.treeview)
|
||||||
|
self.emitter = controller.get_emitter()
|
||||||
|
|
||||||
self.connect("key-press-event", self._on_esc_keypress)
|
self.connect("key-press-event", self._on_esc_keypress)
|
||||||
|
self.connect("map", lambda _: self.emitter.emit("log_page_loaded"))
|
||||||
|
|
||||||
def _on_checkbox_clicked(self, checkbox: Gtk.CheckButton) -> None:
|
def _on_checkbox_clicked(self, checkbox: Gtk.CheckButton) -> None:
|
||||||
label = checkbox.get_label()
|
label = checkbox.get_label()
|
||||||
|
|||||||
@@ -32,7 +32,7 @@ class LogTreeView(ContextMixin, TreeView):
|
|||||||
self.get_selection().set_mode(Gtk.SelectionMode.MULTIPLE)
|
self.get_selection().set_mode(Gtk.SelectionMode.MULTIPLE)
|
||||||
|
|
||||||
self.set_model(None)
|
self.set_model(None)
|
||||||
self.filter: Gtk.TreeModelFilter
|
# self.filter: Gtk.TreeModelFilter
|
||||||
|
|
||||||
# TODO: strings
|
# TODO: strings
|
||||||
# NOTE: default filters that should be shown on startup
|
# NOTE: default filters that should be shown on startup
|
||||||
@@ -52,10 +52,11 @@ class LogTreeView(ContextMixin, TreeView):
|
|||||||
|
|
||||||
def populate_log(self, filepath: str) -> None:
|
def populate_log(self, filepath: str) -> None:
|
||||||
model = ModelFactory().new_model_from_logfile(filepath)
|
model = ModelFactory().new_model_from_logfile(filepath)
|
||||||
self.filter = model.filter_new()
|
_filter = model.filter_new()
|
||||||
self.filter.set_visible_func(self._filter_rows)
|
_filter.set_visible_func(self._filter_rows)
|
||||||
self.set_model(self.filter)
|
sortable = Gtk.TreeModelSort(_filter)
|
||||||
self.filter.refilter()
|
self.set_model(sortable)
|
||||||
|
_filter.refilter()
|
||||||
self.set_cursor(0)
|
self.set_cursor(0)
|
||||||
|
|
||||||
def toggle_filter(self, _filter: str) -> None:
|
def toggle_filter(self, _filter: str) -> None:
|
||||||
@@ -63,7 +64,8 @@ class LogTreeView(ContextMixin, TreeView):
|
|||||||
self.filters.remove(_filter)
|
self.filters.remove(_filter)
|
||||||
else:
|
else:
|
||||||
self.filters.append(_filter)
|
self.filters.append(_filter)
|
||||||
self.filter.refilter()
|
# NOTE: unwrap TreeModelSort and TreeModelFilter
|
||||||
|
self.get_model().get_model().refilter()
|
||||||
|
|
||||||
def _filter_rows(
|
def _filter_rows(
|
||||||
self, model: Gtk.ListStore, _iter: Gtk.TreeIter, data: Any
|
self, model: Gtk.ListStore, _iter: Gtk.TreeIter, data: Any
|
||||||
|
|||||||
Reference in new issue
Block a user