From a2231e3cb90dc51fba3eaf34168ddb9c50be5462 Mon Sep 17 00:00:00 2001 From: aclist <92275929+aclist@users.noreply.github.com> Date: Tue, 21 Apr 2026 22:20:06 +0900 Subject: [PATCH] feat: toggle log levels --- dzgui/managers/thread_man.py | 6 +++++- dzgui/views/pages/log.py | 27 ++++++++++++++++----------- dzgui/views/trees/tree_log.py | 25 +++++++++++++++++++++++-- 3 files changed, 44 insertions(+), 14 deletions(-) diff --git a/dzgui/managers/thread_man.py b/dzgui/managers/thread_man.py index 41d72bf..e3f6013 100644 --- a/dzgui/managers/thread_man.py +++ b/dzgui/managers/thread_man.py @@ -1,12 +1,14 @@ import inspect import logging import threading -from typing import Any +from typing import Any, TYPE_CHECKING from functools import wraps from typing import Callable from dzgui.views.dialogs.generic import WaitDialog +if TYPE_CHECKING: + from dzgui.controllers.mc import Controller import gi @@ -29,7 +31,9 @@ def call_on_thread(dialog_str: str) -> Callable: "Attribute 'thread_man' must be of type 'ThreadingManager'" ) self.thread_man.call_on_thread(dialog_str, stored) + return wrapper + return decorator diff --git a/dzgui/views/pages/log.py b/dzgui/views/pages/log.py index 88f15da..dcd717a 100644 --- a/dzgui/views/pages/log.py +++ b/dzgui/views/pages/log.py @@ -13,29 +13,34 @@ if TYPE_CHECKING: from dzgui.controllers.mc import Controller -class Log(CursorMixin, HelpMenuMixin, Gtk.ScrolledWindow): # type: ignore +class Log(CursorMixin, HelpMenuMixin, Gtk.Box): # type: ignore def __init__(self, controller: "Controller") -> None: - super().__init__() + super().__init__(orientation=Gtk.Orientation.VERTICAL) + self.scrolled = Gtk.ScrolledWindow() self.treeview = LogTreeView(controller) - self.box = Gtk.Box(orientation=Gtk.Orientation.VERTICAL) - self.box.add(self.treeview) - - #self.add(self.treeview) - # TODO proxymodel into this + self.scrolled.add(self.treeview) self.check_bar = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL) - for check in ("Warning", "Critical", "Debug", "Info"): + # TODO: strings + active = ("WARNING", "CRITICAL", "INFO") + for check in ("WARNING", "CRITICAL", "INFO", "DEBUG"): c = Gtk.CheckButton(label=check) self.check_bar.pack_start(c, False, False, 0) - # c.set_active(True) - self.box.add(self.check_bar) - self.add(self.box) + if check in active: + c.set_active(True) + c.connect("clicked", self._on_checkbox_clicked) + self.add(self.scrolled) + self.add(self.check_bar) self.controller = controller self.controller.register_widget("logtreeview", self.treeview) self.connect("key-press-event", self._on_esc_keypress) + def _on_checkbox_clicked(self, checkbox: Gtk.CheckButton) -> None: + label = checkbox.get_label() + self.treeview.toggle_filter(label) + def get_treeview(self) -> LogTreeView: return self.treeview diff --git a/dzgui/views/trees/tree_log.py b/dzgui/views/trees/tree_log.py index 3bc0866..3a479de 100644 --- a/dzgui/views/trees/tree_log.py +++ b/dzgui/views/trees/tree_log.py @@ -1,6 +1,6 @@ import logging -from typing import TYPE_CHECKING +from typing import Any, TYPE_CHECKING from dzgui.const.enum import ContextMenuGroup from dzgui.model.model_factory import ModelFactory @@ -28,9 +28,13 @@ class LogTreeView(ContextMixin, TreeView): self.set_headers_visible(True) self.set_fixed_height_mode(True) + self.set_vexpand(True) self.get_selection().set_mode(Gtk.SelectionMode.MULTIPLE) self.set_model(None) + self.filter: Gtk.TreeModelFilter + # TODO: strings + self.filters = ["INFO", "CRITICAL", "WARNING"] for i, column_title in enumerate(strings.log_cols): renderer = Gtk.CellRendererText() @@ -45,9 +49,26 @@ class LogTreeView(ContextMixin, TreeView): def populate_log(self, filepath: str) -> None: model = ModelFactory().new_model_from_logfile(filepath) - self.set_model(model) + self.filter = model.filter_new() + self.filter.set_visible_func(self._filter_rows) + self.set_model(self.filter) + self.filter.refilter() self.set_cursor(0) + def toggle_filter(self, _filter: str) -> None: + if _filter in self.filters: + self.filters.remove(_filter) + else: + self.filters.append(_filter) + self.filter.refilter() + + def _filter_rows( + self, model: Gtk.ListStore, _iter: Gtk.TreeIter, data: Any + ) -> None: + if len(self.filters) < 1: + return False + return model[_iter][1] in self.filters + def _on_log_buttonpress(self, widget: Gtk.Widget, event: Gdk.EventButton) -> None: if event.button == Gdk.BUTTON_SECONDARY: self.present_menu(widget, event)