Merge branch 'main' into fix/type_checking

This commit is contained in:
aclist 2025-12-20 22:17:19 +09:00 committed by GitHub
commit f49e0bf560
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 63 additions and 58 deletions

View File

@ -18,9 +18,6 @@ from dzgui.api.mods import (
from dzgui.const.enum import (
Preferences,
Popup,
MAIN_MENU_ROWS,
HELP_MENU_ROWS,
RowType,
NotebookPage,
ButtonType,
ContextMenu,
@ -57,60 +54,48 @@ logger = logging.getLogger(__name__)
if TYPE_CHECKING:
from dzgui.views.components.buttonbox import ContextualButton
from dzgui.views.base import AppNavigation
from dzgui.const.enum import ContextMenu
from dzgui.const.enum import ContextMenu, RowType
from dzgui.views.base import OuterWindow
class Controller:
def __init__(self) -> None:
# TODO: main controller delegates to model manager
self.map_store = Gtk.ListStore(str)
self.row_store = Gtk.ListStore(str, GObject.TYPE_PYOBJECT)
self.help_store = Gtk.ListStore(str, GObject.TYPE_PYOBJECT)
# NOTE: long timestamp numbers
self.modlist_store = Gtk.ListStore(str, GObject.TYPE_INT64, str)
self.log_store = Gtk.ListStore(str, str, str, str)
self.notes_cache: dict[str, str] = {}
self.is_developer: bool
self.mediator: AppNavigation
self.prefs: UserPrefs
self.cooldown = 0
for row in MAIN_MENU_ROWS:
label = row.dict["label"]
self.row_store.append([label, row])
for row in HELP_MENU_ROWS:
label = row.dict["label"]
self.help_store.append([label, row])
self.model_manager = ModelManager()
def set_help_menu_crumbs(self) -> None:
# TODO: going to be deprecated after server notebook is added
tip = self.mediator.treeview.get_model()[0][0]
store = self.model_manager.get_help_store()[0][0]
if tip == store:
self.set_crumbs("Help")
def set_crumbs(self, crumbs: str) -> None:
self.mediator.grid.set_breadcrumbs(crumbs)
def get_crumbs(self) -> str:
return self.mediator.grid.get_breadcrumbs()
def get_row_store(self) -> Gtk.ListStore:
return self.model_manager.get_row_store()
def get_help_store(self) -> Gtk.ListStore:
return self.help_store
return self.model_manager.get_help_store()
def get_map_store(self) -> Gtk.ListStore:
return self.map_store
def get_row_store(self) -> Gtk.ListStore:
return self.row_store
return self.model_manager.get_map_store()
def get_modlist_store(self) -> Gtk.ListStore:
return self.modlist_store
return self.model_manager.get_modlist_store()
def get_mod_store(self) -> Gtk.ListStore:
return self.model_manager.get_mod_store()
def get_log_store(self) -> Gtk.ListStore:
return self.log_store
return self.model_manager.get_log_store()
def terminate_process(self) -> None:
# TODO: only used by server table multiprocessing queue
@ -130,11 +115,10 @@ class Controller:
return self.query_config(Preferences.INSTALL)
def reinit_map_store(self) -> None:
self.map_store.clear()
self.map_store.append(["All maps"])
self.model_manager.set_all_maps()
def append_map(self, map_row: list) -> None:
self.map_store.append(map_row)
self.model_manager.append_map(map_row)
def set_mediator(self, mediator: "AppNavigation") -> None:
self.mediator = mediator
@ -280,7 +264,7 @@ class Controller:
return True
return False
def set_statusbar_by_row(self, row: RowType) -> None:
def set_statusbar_by_row(self, row: "RowType") -> None:
self.mediator.grid.statusbar.refresh(row)
def toggle_mod_panel(self, state: bool) -> None:
@ -303,9 +287,12 @@ class Controller:
case ButtonType.MODS:
self.load_mods()
case ButtonType.HELP:
self.mediator.treeview.set_model(self.help_store)
help_store = self.model_manager.get_help_store()
self.mediator.treeview.set_model(help_store)
case ButtonType.MAIN_MENU:
self.mediator.treeview.set_model(self.row_store)
# TODO: going to be deprecated after server notebook is added
row_store = self.model_manager.get_row_store()
self.mediator.treeview.set_model(row_store)
self.mediator.grid.notebook.set_page_by_enum(button.opens)
self.set_crumbs(button.get_label())
@ -360,6 +347,7 @@ class Controller:
shutil.rmtree(mods_path / mod)
# NOTE: second pass to unlink DAYZ_EXP mods
# TODO: test this with working APPID_DAYZ_EXP installation
try:
app_path_exp = PeFile.get_nested_app_path(steam_path, APPID_DAYZ_EXP)
symlink = app_path_exp / md5
@ -367,7 +355,6 @@ class Controller:
except PeFile.AppNotInstalledError:
pass
# TODO: belongs in model manager
model = self.model_manager.get_mod_store()
model.remove(it)
@ -433,8 +420,9 @@ class Controller:
def populate_log(self) -> None:
log = self.prefs.paths.debug
store = self.log_store
store = self.model_manager.get_log_store()
store.clear()
# TODO: pop dialog if log is missing
with open(log, "r") as f:
lines = [line.split(strings.delimiter) for line in f.read().splitlines()]

View File

@ -1,7 +1,8 @@
import re
from dataclasses import dataclass
from typing import Self
from dzgui.const.enum import FilterMode
from dzgui.const.enum import FilterMode, MAIN_MENU_ROWS, HELP_MENU_ROWS
from dzgui.util import strings
import gi
@ -9,7 +10,6 @@ gi.require_version("Gtk", "3.0")
from gi.repository.Gtk import ListStore # noqa E402
from gi.repository import GObject, GLib # noqa E402
@dataclass
@dataclass(slots=True, frozen=True)
class ServerColumns:
@ -64,12 +64,9 @@ class ModelManager:
Methods are not thread-safe in themselves.
"""
# FIXME: do not manipulate keyword/map widgets in here
def __init__(self) -> None:
self.filter_cache = {}
self.ping_cache = {}
self.filter_cache: tuple
self.ping_cache: dict[str, int] = {}
self.map_store = ListStore(str)
self.row_store = self.new_model_from_class(MenuCols)
@ -79,12 +76,19 @@ class ModelManager:
self.log_store = self.new_model_from_class(LogCols)
self.modlist_store = self.new_model_from_class(ServerModCols)
#self.mod_store = ListStore(str, str, str, float, str)
for row in MAIN_MENU_ROWS:
label = row.dict["label"]
self.row_store.append([label, row])
for row in HELP_MENU_ROWS:
label = row.dict["label"]
self.help_store.append([label, row])
self.control_model = None
self.filtered = None
self.success = True
def __new__(cls):
def __new__(cls) -> Self:
if not hasattr(cls, "instance"):
cls.instance = super(ModelManager, cls).__new__(cls)
return cls.instance
@ -93,9 +97,24 @@ class ModelManager:
store = ListStore(*[ftype for field, ftype in cls.__annotations__.items()])
return store
def get_map_store(self) -> ListStore:
return self.map_store
def get_row_store(self) -> ListStore:
return self.row_store
def get_help_store(self) -> ListStore:
return self.help_store
def get_mod_store(self) -> ListStore:
return self.mod_store
def get_modlist_store(self) -> ListStore:
return self.modlist_store
def get_log_store(self) -> ListStore:
return self.log_store
def filter(self, mode: FilterMode, *args, **kwargs) -> None:
"""
Native Gtk.TreeView.refilter() method was not performant enough
@ -317,3 +336,10 @@ class ModelManager:
self.ping_cache = {}
if full:
self.control_model = None
def set_all_maps(self) -> None:
self.map_store.clear()
self.map_store.append(["All maps"])
def append_map(self, row: list) -> None:
self.map_store.append(row)

View File

@ -508,20 +508,11 @@ class Notebook(ScrollableMixin, Gtk.Notebook):
crumbs = enum.dict["crumbs"]
MainController.set_crumbs(crumbs)
if enum is NotebookPage.MODS:
return
# NOTE: Main Menu and Help page are of the same type
# TODO: going to be deprecated after server notebook is added
if enum is not NotebookPage.MAIN:
return
# FIXME: brittle
if crumbs == "Main menu":
if AppNav.treeview.get_model()[0][0] == MainController.help_store[0][0]:
MainController.set_crumbs("Help")
row = MAIN_MENU_ROWS[0]
AppNav.grid.statusbar.refresh(row)
MainController.set_help_menu_crumbs()
class Statusbar(Gtk.Statusbar):