feat: apply scrollable mixin to pages

This commit is contained in:
aclist committed 2026-01-01 23:49:16 +09:00
1 parent aba00f732a
commit 5f0c8f7654
11 files changed
+115 -88

No files matched your search

+9 -9
View File
@@ -77,15 +77,15 @@ class Preferences(EnumWithAttrs):
class NotebookPage(EnumWithAttrs): class NotebookPage(EnumWithAttrs):
CHANGELOG = {"crumbs": strings.crumbs.changelog,} CHANGELOG = {"crumbs": strings.crumbs.changelog, "statusbar": False}
KEYS = {"crumbs": strings.crumbs.keys,} KEYS = {"crumbs": strings.crumbs.keys, "statusbar": False}
LOG = {"crumbs": strings.crumbs.log,} LOG = {"crumbs": strings.crumbs.log, "statusbar": False}
HELP = {"crumbs": strings.crumbs._help,} HELP = {"crumbs": strings.crumbs._help, "statusbar": True}
MODS = {"crumbs": strings.crumbs.mods,} MODS = {"crumbs": strings.crumbs.mods, "statusbar": True}
OPTIONS = {"crumbs": strings.crumbs.options,} OPTIONS = {"crumbs": strings.crumbs.options, "statusbar": False}
SERVERS = {"crumbs": strings.crumbs.servers,} SERVERS = {"crumbs": strings.crumbs.servers, "statusbar": True}
THANKS = {"crumbs": strings.crumbs.thanks,} THANKS = {"crumbs": strings.crumbs.thanks, "statusbar": False}
DEVELOPERS = {"crumbs": strings.crumbs.developers,} DEVELOPERS = {"crumbs": strings.crumbs.developers, "statusbar": False}
class RowType(EnumWithAttrs): class RowType(EnumWithAttrs):
+17 -7
View File
@@ -155,13 +155,6 @@ class Controller:
def append_map(self, map_row: list) -> None: def append_map(self, map_row: list) -> None:
self.model_manager.append_map(map_row) self.model_manager.append_map(map_row)
# TODO: drop
# def set_mediator(self, mediator: "AppNavigation") -> None:
# self.mediator = mediator
# def get_mediator(self) -> "AppNavigation":
# return self.mediator
def unblock_signals(self) -> None: def unblock_signals(self) -> None:
self.block_signals(False) self.block_signals(False)
@@ -643,6 +636,7 @@ class Controller:
model = treeview.get_model() model = treeview.get_model()
model.clear() model.clear()
data = func() data = func()
# TODO: threading
model.append(data) model.append(data)
treeview.set_loaded(True) treeview.set_loaded(True)
self.update_server_status() self.update_server_status()
@@ -656,3 +650,19 @@ class Controller:
self.update_server_status() self.update_server_status()
crumbs = self.mediator.servers.get_cached_label() crumbs = self.mediator.servers.get_cached_label()
self.set_crumbs(crumbs) self.set_crumbs(crumbs)
def toggle_check(self, event: Gdk.EventKey) -> None:
keyname = Gdk.keyval_name(event.keyval)
if keyname.isnumeric() and int(keyname) > 0:
digit = int(keyname) - 1
self.mediator.grid.right_panel.filters_vbox.toggle_check(digit)
else:
match event.keyval:
case Gdk.KEY_0:
self.mediator.grid.right_panel.filters_vbox.toggle_check(9)
case Gdk.KEY_minus:
self.mediator.grid.right_panel.filters_vbox.toggle_check(10)
case Gdk.KEY_backslash:
self.mediator.grid.right_panel.filters_vbox.toggle_check(11)
case _:
return False
+19
View File
@@ -23,3 +23,22 @@ def is_ctrl_mask(event: Gdk.EventKey) -> bool:
return True return True
else: else:
return False return False
def is_filterkey(key: int) -> bool:
keys = (
Gdk.KEY_0,
Gdk.KEY_1,
Gdk.KEY_2,
Gdk.KEY_3,
Gdk.KEY_4,
Gdk.KEY_5,
Gdk.KEY_6,
Gdk.KEY_7,
Gdk.KEY_8,
Gdk.KEY_9,
Gdk.KEY_backslash,
Gdk.KEY_minus,
)
if key in keys:
return True
return False
+10 -32
View File
@@ -277,27 +277,27 @@ class Notebook(ScrollableMixin, Gtk.Notebook):
MainController.register_widget("notebook", self) MainController.register_widget("notebook", self)
self.help = Help(MainController) self.help = Help(MainController)
self.change = Changelog(MainController) self.clog = Changelog(MainController)
self.clog = ScrollableNote(self.change, back_button=False)
self.clog.scrollable.set_propagate_natural_width(False)
# TODO: scrollable internally
# TODO: make all treeviews internally scrollable in base class # TODO: make all treeviews internally scrollable in base class
self.keys = ScrollableNote(Keybindings()) self.keys = Keybindings()
self.settings = Options(MainController) self.settings = Options(MainController)
# NOTE: server and quad tables should have hexpand property set to True # NOTE: server and quad tables should have hexpand property set to True
self.servers = ServerNotebook(MainController) self.servers = ServerNotebook(MainController)
self.mods = Mods(MainController) self.mods = Mods(MainController)
# TODO: change this class to scrolledwindow
self.scroll_log = Gtk.ScrolledWindow() self.scroll_log = Gtk.ScrolledWindow()
self.scroll_log.set_hexpand(True) self.scroll_log.set_hexpand(True)
self.log_table = LogTreeView(MainController) self.log_table = LogTreeView(MainController)
self.scroll_log.add(self.log_table) self.scroll_log.add(self.log_table)
# TODO: change this class to scrolledwindow
self.thanks = ScrollableNote(Thanks(), back_button=False) self.thanks = ScrollableNote(Thanks(), back_button=False)
developers = Developers(MainController) developers = Developers(MainController)
# TODO: change this class to scrolledwindow
self.developers = ScrollableNote(developers) self.developers = ScrollableNote(developers)
self.pages = { self.pages = {
@@ -328,8 +328,6 @@ class Notebook(ScrollableMixin, Gtk.Notebook):
self.connect("key-press-event", self._on_keypress) self.connect("key-press-event", self._on_keypress)
def _on_keypress(self, widget: Gtk.Widget, event: Gdk.EventKey) -> None: def _on_keypress(self, widget: Gtk.Widget, event: Gdk.EventKey) -> None:
page = self.get_page()
match event.keyval: match event.keyval:
case Gdk.KEY_Right | Gdk.KEY_l: case Gdk.KEY_Right | Gdk.KEY_l:
if event.state is Gdk.ModifierType.CONTROL_MASK: if event.state is Gdk.ModifierType.CONTROL_MASK:
@@ -338,23 +336,6 @@ class Notebook(ScrollableMixin, Gtk.Notebook):
case Gdk.KEY_question: case Gdk.KEY_question:
self.toggle_keybindings() self.toggle_keybindings()
# NOTE: abort on non scrollable pages
# TODO: deprecated
#allowed = (NotebookPage.KEYS, NotebookPage.CHANGELOG, NotebookPage.THANKS)
#if self.pages[page] not in allowed:
# return
# FIXME: may already be delegated to some pages (e.g. keys)
#match event.keyval:
# case Gdk.KEY_k | Gdk.KEY_Up:
# page._set_adjustment(VAdjustment.UP)
# case Gdk.KEY_Down | Gdk.KEY_j:
# page._set_adjustment(VAdjustment.DOWN)
# case Gdk.KEY_g:
# page._set_adjustment(VAdjustment.TOP)
# case Gdk.KEY_G:
# page._set_adjustment(VAdjustment.BOTTOM)
def return_prior(self) -> None: def return_prior(self) -> None:
""" """
Gtk.Notebook focuses the first input field when changing pages; Gtk.Notebook focuses the first input field when changing pages;
@@ -423,6 +404,7 @@ class Notebook(ScrollableMixin, Gtk.Notebook):
enum = self.get_page_by_enum() enum = self.get_page_by_enum()
if enum is not None: if enum is not None:
crumbs = enum.dict["crumbs"] crumbs = enum.dict["crumbs"]
status = enum.dict["statusbar"]
MainController.set_crumbs(crumbs) MainController.set_crumbs(crumbs)
is_mods = True if enum is NotebookPage.MODS else False is_mods = True if enum is NotebookPage.MODS else False
@@ -431,13 +413,10 @@ class Notebook(ScrollableMixin, Gtk.Notebook):
MainController.toggle_mod_panel(is_mods) MainController.toggle_mod_panel(is_mods)
MainController.toggle_server_panels(is_servers) MainController.toggle_server_panels(is_servers)
match enum: if status is False:
case NotebookPage.KEYS | NotebookPage.OPTIONS: MainController.set_statusbar("")
MainController.set_statusbar("") if enum is NotebookPage.SERVERS:
case NotebookPage.SERVERS: MainController.present_servers()
MainController.present_servers()
case _:
pass
class Grid(Gtk.Grid): class Grid(Gtk.Grid):
@@ -459,7 +438,6 @@ class Grid(Gtk.Grid):
self.notebook = Notebook() self.notebook = Notebook()
self.conpan = ConnectPanel() self.conpan = ConnectPanel()
self.attach(self.notebook, 0, 0, MAX_COLS, 1) self.attach(self.notebook, 0, 0, MAX_COLS, 1)
els = ( els = (
+5 -6
View File
@@ -2,10 +2,11 @@ import logging
import gi # noqa E402 import gi # noqa E402
gi.require_version("Gtk", "3.0") gi.require_version("Gtk", "3.0")
from gi.repository import Gtk, Gdk, Pango from gi.repository import Gtk, Gdk, Pango, GLib
from typing import Literal from typing import Literal
from dzgui.util import strings from dzgui.util import strings
from dzgui.util.format import embolden
from dzgui.util.margins import set_surrounding_margins from dzgui.util.margins import set_surrounding_margins
from dzgui.const.enum import FilterMode from dzgui.const.enum import FilterMode
from dzgui.const.constants import NO_EXPAND, NO_FILL, NO_PADDING from dzgui.const.constants import NO_EXPAND, NO_FILL, NO_PADDING
@@ -71,8 +72,9 @@ class FilterPanel(Gtk.Box):
self.set_margin_top(1) self.set_margin_top(1)
# TODO: strings # TODO: strings
# TODO: embolden text = embolden("Filters")
self.filters_label = Gtk.Label(label="Filters") self.filters_label = Gtk.Label()
self.filters_label.set_markup(text)
self.keyword_entry = Gtk.Entry() self.keyword_entry = Gtk.Entry()
self.keyword_entry.set_placeholder_text("Filter by keyword") self.keyword_entry.set_placeholder_text("Filter by keyword")
@@ -262,9 +264,6 @@ class FilterPanel(Gtk.Box):
def _on_check_toggled(self, button: Gtk.CheckButton) -> None: def _on_check_toggled(self, button: Gtk.CheckButton) -> None:
treeview = self.controller.get_active_treeview() treeview = self.controller.get_active_treeview()
# TODO: drop
if not treeview.is_server_context(self.AppNav.treeview.view):
return
label = button.get_label() label = button.get_label()
state = button.get_active() state = button.get_active()
logger.info(f"User toggled button '{label}' to {state}") logger.info(f"User toggled button '{label}' to {state}")
+14 -3
View File
@@ -3,11 +3,22 @@ from dzgui.const.constants import SCROLL_INCREMENT
import gi import gi
gi.require_version("Gtk", "3.0") gi.require_version("Gtk", "3.0")
from gi.repository import Gdk # noqa from gi.repository import Gtk, Gdk # noqa
class ScrollableMixin: class ScrollableMixin:
def _set_adjustment(self, adjustment = VAdjustment) -> None: def _on_keypress(self, widget: Gtk.Widget, event: Gdk.EventKey) -> None:
vadj = self.scrollable.get_vadjustment() match event.keyval:
case Gdk.KEY_k | Gdk.KEY_Up:
self._set_adjustment(VAdjustment.UP)
case Gdk.KEY_Down | Gdk.KEY_j:
self._set_adjustment(VAdjustment.DOWN)
case Gdk.KEY_g:
self._set_adjustment(VAdjustment.TOP)
case Gdk.KEY_G:
self._set_adjustment(VAdjustment.BOTTOM)
def _set_adjustment(self, adjustment: VAdjustment) -> None:
vadj = self.get_vadjustment()
match adjustment: match adjustment:
case VAdjustment.TOP: case VAdjustment.TOP:
adj = vadj.get_lower() adj = vadj.get_lower()
+8 -3
View File
@@ -5,6 +5,7 @@ from importlib import resources
from dzgui.const.constants import APP_NAME_LOWER from dzgui.const.constants import APP_NAME_LOWER
from dzgui.util.format import format_pango from dzgui.util.format import format_pango
from dzgui.views.mixins.scrollable_mixin import ScrollableMixin
import gi import gi
gi.require_version("Gtk", "3.0") gi.require_version("Gtk", "3.0")
@@ -16,9 +17,9 @@ logger = logging.getLogger(__name__)
if TYPE_CHECKING: if TYPE_CHECKING:
from dzgui.controllers.mc import Controller from dzgui.controllers.mc import Controller
class Changelog(Gtk.Box): class Changelog(ScrollableMixin, Gtk.ScrolledWindow):
def __init__(self, controller: "Controller"): def __init__(self, controller: "Controller"):
super().__init__() super().__init__(propagate_natural_width=False)
try: try:
changelog = resources.read_text(APP_NAME_LOWER, "data/CHANGELOG.md") changelog = resources.read_text(APP_NAME_LOWER, "data/CHANGELOG.md")
@@ -30,4 +31,8 @@ class Changelog(Gtk.Box):
formatted = format_pango(changelog) formatted = format_pango(changelog)
self.changelog_label = Gtk.Label(valign=Gtk.Align.START, margin=15) self.changelog_label = Gtk.Label(valign=Gtk.Align.START, margin=15)
self.changelog_label.set_markup(formatted) self.changelog_label.set_markup(formatted)
self.add(self.changelog_label) self.box = Gtk.Box(orientation=Gtk.Orientation.VERTICAL)
self.box.add(self.changelog_label)
self.add(self.box)
self.connect("key-press-event", self._on_keypress)
+11 -5
View File
@@ -1,25 +1,31 @@
from dzgui.views.mixins.scrollable_mixin import ScrollableMixin
from dzgui.util.strings import navigation, servers, vim, key_header, key_contexts from dzgui.util.strings import navigation, servers, vim, key_header, key_contexts
from dzgui.util.css import add_class from dzgui.util.css import add_class
import gi import gi
gi.require_version("Gtk", "3.0") gi.require_version("Gtk", "3.0")
from gi.repository import Gtk # noqa E402 from gi.repository import Gtk, Gdk # noqa E402
class Keybindings(Gtk.Box): class Keybindings(ScrollableMixin, Gtk.ScrolledWindow):
""" """
Notebook page holding a prearranged grid Notebook page holding a prearranged grid
of keybindings and their descriptions of keybindings and their descriptions
""" """
def __init__(self) -> None: def __init__(self) -> None:
super().__init__(orientation=Gtk.Orientation.VERTICAL) super().__init__()
self.box = Gtk.Box(orientation=Gtk.Orientation.VERTICAL)
label = Gtk.Label(label=key_header) label = Gtk.Label(label=key_header)
add_class(label, "page-heading") add_class(label, "page-heading")
self.add(label)
grid = self.build_grid([servers, navigation, vim]) grid = self.build_grid([servers, navigation, vim])
self.add(grid) self.box.add(label)
self.box.add(grid)
self.add(self.box)
self.connect("key-press-event", self._on_keypress)
def build_keys(self, items: list) -> Gtk.Grid: def build_keys(self, items: list) -> Gtk.Grid:
grid = Gtk.Grid(row_spacing=10, column_homogeneous=True) grid = Gtk.Grid(row_spacing=10, column_homogeneous=True)
+11 -5
View File
@@ -67,6 +67,11 @@ class TreeView(CursorMixin, Gtk.TreeView):
it = self.get_selection().get_selected()[1] it = self.get_selection().get_selected()[1]
return it return it
def get_focused_row_iter(self) -> Gtk.TreeIter:
path = self.get_focused_row_path()
model = self.get_model()
return model.get_iter(path)
def get_focused_row_path(self) -> Gtk.TreePath: def get_focused_row_path(self) -> Gtk.TreePath:
return self.get_cursor().path return self.get_cursor().path
@@ -84,15 +89,11 @@ class TreeView(CursorMixin, Gtk.TreeView):
if is_navkey(event.keyval): if is_navkey(event.keyval):
# TODO: investigate this # TODO: investigate this
# TODO: get active tree if server view is open tv = self.controller.get_active_treeview()
servers = self.controller.mediator.notebook.servers
tv = servers.get_active_treeview()
if self.sel_blocked is False: if self.sel_blocked is False:
self.controller.suppress_signal( self.controller.suppress_signal(
tv, tv,
tv.selected_row, tv.selected_row,
#self.controller.mediator.treeview,
#self.controller.mediator.treeview.selected_row,
"_on_tree_selection_changed", "_on_tree_selection_changed",
True, True,
) )
@@ -106,6 +107,11 @@ class TreeView(CursorMixin, Gtk.TreeView):
""" """
Suppresses spamming on keydown Suppresses spamming on keydown
""" """
#if event.keyval is Gdk.KEY_space:
# it = self.get_focused_row_iter()
# self.get_selection().select_iter(it)
# return True
if is_navkey(event.keyval): if is_navkey(event.keyval):
if self.sel_blocked is True: if self.sel_blocked is True:
self.controller.suppress_signal( self.controller.suppress_signal(
+8 -1
View File
@@ -43,7 +43,7 @@ class ModTreeView(ModsMixin, ContextMixin, TreeView):
column.set_fixed_width(500) column.set_fixed_width(500)
else: else:
column.set_fixed_width(150) column.set_fixed_width(150)
# hidden color property column # NOTE: hidden color property column
column.set_sizing(Gtk.TreeViewColumnSizing.FIXED) column.set_sizing(Gtk.TreeViewColumnSizing.FIXED)
column.set_sort_column_id(i) column.set_sort_column_id(i)
if i != 4: if i != 4:
@@ -61,6 +61,13 @@ class ModTreeView(ModsMixin, ContextMixin, TreeView):
self.s = self.get_selection().get_selected_rows() self.s = self.get_selection().get_selected_rows()
def _on_mods_keypress(self, widget: Gtk.Widget, event: Gdk.EventKey) -> None: def _on_mods_keypress(self, widget: Gtk.Widget, event: Gdk.EventKey) -> None:
#if event.keyval is Gdk.KEY_space:
# it = self.get_focused_row_iter()
# self.get_selection().select_iter(it)
# path = self.get_focused_row_path()
# self.set_cursor(path)
# return False
# TODO: parse keys
self.present_menu(widget, event) self.present_menu(widget, event)
def _on_mods_button_press(self, def _on_mods_button_press(self,
+3 -17
View File
@@ -171,7 +171,6 @@ class ServerTreeView(TreeView):
def _on_server_keypress( def _on_server_keypress(
self, treeview: Gtk.TreeView, event: Gdk.EventKey self, treeview: Gtk.TreeView, event: Gdk.EventKey
) -> bool | None: ) -> bool | None:
# TODO: rewrite AppNav
# TODO: use mixins # TODO: use mixins
# CONTROL_MASK + KEY_l # CONTROL_MASK + KEY_l
if event.state is Gdk.ModifierType.CONTROL_MASK: if event.state is Gdk.ModifierType.CONTROL_MASK:
@@ -181,28 +180,15 @@ class ServerTreeView(TreeView):
case Gdk.KEY_r: case Gdk.KEY_r:
self.refresh_player_count() self.refresh_player_count()
case Gdk.KEY_f: case Gdk.KEY_f:
AppNav.right_panel.filters_vbox.keyword_entry.grab_focus() self.controller.mediator.grid.right_panel.filters_vbox.keyword_entry.grab_focus()
case Gdk.KEY_m: case Gdk.KEY_m:
AppNav.right_panel.filters_vbox.maps_entry.grab_focus() self.controller.mediator.grid.right_panel.filters_vbox.maps_entry.grab_focus()
else: else:
keyname = Gdk.keyval_name(event.keyval)
if keyname.isnumeric() and int(keyname) > 0:
digit = int(keyname) - 1
AppNav.grid.right_panel.filters_vbox.toggle_check(digit)
return False
match event.keyval: match event.keyval:
case Gdk.KEY_l | Gdk.KEY_Right: case Gdk.KEY_l | Gdk.KEY_Right:
#if event.state is Gdk.ModifierType.CONTROL_MASK:
# return
self.controller.mediator.right_panel.focus_button_box() self.controller.mediator.right_panel.focus_button_box()
case Gdk.KEY_0:
grid.right_panel.filters_vbox.toggle_check(9)
case Gdk.KEY_minus:
grid.right_panel.filters_vbox.toggle_check(10)
case Gdk.KEY_backslash:
grid.right_panel.filters_vbox.toggle_check(11)
case _: case _:
return False self.controller.toggle_check(event)
def set_context_menu(self, items: ContextMenuGroup) -> None: def set_context_menu(self, items: ContextMenuGroup) -> None:
# TODO: if debug is on, add raw command # TODO: if debug is on, add raw command