From 00ca59698cb2a889d784a3b99f3c6979b0b2c447 Mon Sep 17 00:00:00 2001 From: aclist <92275929+aclist@users.noreply.github.com> Date: Tue, 13 Jan 2026 02:56:56 +0900 Subject: [PATCH] feat: threading WIP --- dzgui/controllers/mc.py | 39 +++++++++++++++++++----- dzgui/util/strings.py | 6 ++-- dzgui/views/base.py | 4 ++- dzgui/views/components/right_panel.py | 3 +- dzgui/views/dialogs/generic.py | 3 +- dzgui/views/pages/servers.py | 43 ++++++++++++++++----------- 6 files changed, 66 insertions(+), 32 deletions(-) diff --git a/dzgui/controllers/mc.py b/dzgui/controllers/mc.py index 2fbe2d8..dd52852 100644 --- a/dzgui/controllers/mc.py +++ b/dzgui/controllers/mc.py @@ -91,8 +91,9 @@ class Controller: self.crumbs_cache = "" self.mediator = AppNavigation() self.prefs: UserPrefs - self.model_manager = ModelManager() + # TODO: poc + self.loaded = False def register_widget(self, attr: str, widget: Gtk.Widget) -> None: try: @@ -483,6 +484,8 @@ class Controller: # NOTE: manipulates mod store case ContextMenu.DELETE_MOD: self.delete_single_mod(path) + # TODO: hook treeview changed signal + # Gtk.TreeModel, row-inserted/row-deleted self.update_mod_statusbar() remove_stale_signatures( self.prefs.paths.config, @@ -545,11 +548,31 @@ class Controller: def unselect_all_mods(self) -> None: self.mediator.modtreeview.get_selection().unselect_all() + def dump_test(self) -> None: + import time + time.sleep(1) + # TODO: use model managers, etc. + self.data = (["BAR", "a", "a", "a", 1, 1, 1, "185.207.214.16:2302", 0, 0, "a", False]) + # TODO: refer to prior implementation--should need to load data into model while in thread + self.get_func_data() + self.destroy_on_idle() + + def get_func_data(self) -> tuple: + # TODO: use model manager + treeview = self.get_active_treeview() + model = treeview.get_model() + data = self.data + model.append(data) + treeview.set_loaded(True) + self.update_server_status() + treeview.grab_focus() + def highlight_stale(self) -> None: self.call_on_thread(self.colorize_mods) def call_on_thread(self, func: Callable, *args) -> None: - self.wait_dialog = GenericDialog(self, strings.dialog.fetching, Popup.WAIT) + from dzgui.views.dialogs.generic import WaitDialog + self.wait_dialog = WaitDialog(self, strings.dialog.fetching) self.wait_dialog.show_all() thread = threading.Thread(target=func, args=args) thread.start() @@ -644,21 +667,21 @@ class Controller: self.populate_model() def populate_model(self) -> None: + print("POPULATING MODEL") # TODO: always use same server model, store in servertreeview class treeview = self.get_active_treeview() if treeview.get_loaded() is False: new_model = self.model_manager.new_model() # NOTE: set_query_func() func = treeview.get_query_func() + print(func) if func is not None: model = treeview.get_model() + print(model) + # TODO: this may lag? model.clear() - data = func() - # TODO: threading - model.append(data) - treeview.set_loaded(True) - self.update_server_status() - treeview.grab_focus() + self.set_callback(None, None)#self.get_func_data) + self.call_on_thread(func) def focus_button_box(self) -> None: self.mediator.right_panel.focus_button_box() diff --git a/dzgui/util/strings.py b/dzgui/util/strings.py index a72bd6e..709d816 100644 --- a/dzgui/util/strings.py +++ b/dzgui/util/strings.py @@ -549,6 +549,7 @@ class LanPanel: scan_button: str placeholder: str entry_tooltip: str + scan_tooltip: str lan_panel = LanPanel( heading="LAN query port", @@ -556,11 +557,10 @@ lan_panel = LanPanel( custom_button="Custom port", scan_button="Scan", placeholder="Enter the query port (1-65535)", - entry_tooltip="Specify the port to search for DayZ servers on the local network" + entry_tooltip="Specify the port to search for DayZ servers on the local network", + scan_tooltip="Scan for servers" ) - - distance_suffix = "Distance: calculating..." dialog_error = "ERROR" diff --git a/dzgui/views/base.py b/dzgui/views/base.py index 3982d20..bdcd715 100644 --- a/dzgui/views/base.py +++ b/dzgui/views/base.py @@ -216,10 +216,12 @@ class OuterWindow(Gtk.Window): self.show_all() css.load_css() - MainController.open_page(NotebookPage.SERVERS) # TODO: first run + MainController.open_page(NotebookPage.SERVERS) MainController.mediator.grid.conpan.lan.set_visible(False) self.grid.right_panel.sel_panel.hide() + # TODO: POC, trigger page change here + MainController.loaded = True def _on_delete_event( self, window: "OuterWindow", event: Gdk.EventKey diff --git a/dzgui/views/components/right_panel.py b/dzgui/views/components/right_panel.py index 00e26e3..0344e85 100644 --- a/dzgui/views/components/right_panel.py +++ b/dzgui/views/components/right_panel.py @@ -12,10 +12,11 @@ gi.require_version("Gtk", "3.0") from gi.repository import Gtk, GLib # noqa E402 if TYPE_CHECKING: + from dzgui.controllers.mc import Controller from GLib import SOURCE_REMOVE class RightPanel(Gtk.Box): - def __init__(self, controller): + def __init__(self, controller: "Controller"): super().__init__(spacing=6, orientation=Gtk.Orientation.VERTICAL) self.controller = controller diff --git a/dzgui/views/dialogs/generic.py b/dzgui/views/dialogs/generic.py index 423caad..367b700 100644 --- a/dzgui/views/dialogs/generic.py +++ b/dzgui/views/dialogs/generic.py @@ -100,7 +100,8 @@ class WaitDialog(GenericDialog): content.pack_end(spinner, NO_EXPAND, NO_FILL, 0) spinner.start() - self.show_all() + # FIXME: center on parent window + #self.show_all() def _on_dialog_delete( self, response_id: Gtk.ResponseType, event: Gdk.Event diff --git a/dzgui/views/pages/servers.py b/dzgui/views/pages/servers.py index 6a76d06..78579ba 100644 --- a/dzgui/views/pages/servers.py +++ b/dzgui/views/pages/servers.py @@ -29,6 +29,7 @@ class ServerNotebook(Gtk.ScrolledWindow): self.recent = ServerTreeView(controller, ServerTab.RECENT) self.lan = ServerTreeView(controller, ServerTab.LAN) + self.browser.set_query_func(self.query_test2) self.lan.set_query_func(self.query_test) # TODO: set context menu on init self.browser.set_context_menu(ContextMenuGroup.SERVER_BROWSER) @@ -51,23 +52,24 @@ class ServerNotebook(Gtk.ScrolledWindow): if label == "LAN": pass else: - store.append(["BAR", "a", "a", "a", 0, 0, 0, "189.127.165.207:2302", 0, 0, "a", False]) - store.append(["BAR", "a", "a", "a", 0, 0, 0, "189.127.165.207:2302", 0, 0, "a", False]) - store.append(["BAR", "a", "a", "a", 0, 0, 0, "189.127.165.207:2302", 0, 0, "a", False]) - store.append(["BAR", "a", "a", "a", 0, 0, 0, "189.127.165.207:2302", 0, 0, "a", False]) - store.append(["BAR", "a", "a", "a", 0, 0, 0, "189.127.165.207:2302", 0, 0, "a", False]) - store.append(["BAR", "a", "a", "a", 0, 0, 0, "189.127.165.207:2302", 0, 0, "a", False]) - store.append(["BAR", "a", "a", "a", 0, 0, 0, "189.127.165.207:2302", 0, 0, "a", False]) - store.append(["BAR", "a", "a", "a", 0, 0, 0, "189.127.165.207:2302", 0, 0, "a", False]) - store.append(["BAR", "a", "a", "a", 0, 0, 0, "189.127.165.207:2302", 0, 0, "a", False]) - store.append(["BAR", "a", "a", "a", 0, 0, 0, "189.127.165.207:2302", 0, 0, "a", False]) - store.append(["BAR", "a", "a", "a", 0, 0, 0, "189.127.165.207:2302", 0, 0, "a", False]) - store.append(["BAR", "a", "a", "a", 0, 0, 0, "189.127.165.207:2302", 0, 0, "a", False]) - store.append(["BAR", "a", "a", "a", 0, 0, 0, "189.127.165.207:2302", 0, 0, "a", False]) - store.append(["BAR", "a", "a", "a", 0, 0, 0, "189.127.165.207:2302", 0, 0, "a", False]) - store.append(["BAR", "a", "a", "a", 0, 0, 0, "189.127.165.207:2302", 0, 0, "a", False]) - store.append(["BAR", "a", "a", "a", 0, 0, 0, "189.127.165.207:2302", 0, 0, "a", False]) - tree.loaded = True + pass + #store.append(["BAR", "a", "a", "a", 0, 0, 0, "189.127.165.207:2302", 0, 0, "a", False]) + #store.append(["BAR", "a", "a", "a", 0, 0, 0, "189.127.165.207:2302", 0, 0, "a", False]) + #store.append(["BAR", "a", "a", "a", 0, 0, 0, "189.127.165.207:2302", 0, 0, "a", False]) + #store.append(["BAR", "a", "a", "a", 0, 0, 0, "189.127.165.207:2302", 0, 0, "a", False]) + #store.append(["BAR", "a", "a", "a", 0, 0, 0, "189.127.165.207:2302", 0, 0, "a", False]) + #store.append(["BAR", "a", "a", "a", 0, 0, 0, "189.127.165.207:2302", 0, 0, "a", False]) + #store.append(["BAR", "a", "a", "a", 0, 0, 0, "189.127.165.207:2302", 0, 0, "a", False]) + #store.append(["BAR", "a", "a", "a", 0, 0, 0, "189.127.165.207:2302", 0, 0, "a", False]) + #store.append(["BAR", "a", "a", "a", 0, 0, 0, "189.127.165.207:2302", 0, 0, "a", False]) + #store.append(["BAR", "a", "a", "a", 0, 0, 0, "189.127.165.207:2302", 0, 0, "a", False]) + #store.append(["BAR", "a", "a", "a", 0, 0, 0, "189.127.165.207:2302", 0, 0, "a", False]) + #store.append(["BAR", "a", "a", "a", 0, 0, 0, "189.127.165.207:2302", 0, 0, "a", False]) + #store.append(["BAR", "a", "a", "a", 0, 0, 0, "189.127.165.207:2302", 0, 0, "a", False]) + #store.append(["BAR", "a", "a", "a", 0, 0, 0, "189.127.165.207:2302", 0, 0, "a", False]) + #store.append(["BAR", "a", "a", "a", 0, 0, 0, "189.127.165.207:2302", 0, 0, "a", False]) + #store.append(["BAR", "a", "a", "a", 0, 0, 0, "189.127.165.207:2302", 0, 0, "a", False]) + #tree.loaded = True # TODO: set model on init of servertreeview tree.set_model(store) @@ -98,8 +100,9 @@ class ServerNotebook(Gtk.ScrolledWindow): return self.get_active_treeview().grab_focus() - def _on_page_changed(self, notebook: Gtk.Notebook, child: Gtk.Widget, index: int) -> None: + if self.controller.loaded is False: + return # TODO: abstract label = self.notebook.get_tab_label_text(child) if label is None: @@ -126,6 +129,10 @@ class ServerNotebook(Gtk.ScrolledWindow): # self.controller.mediator.grid.conpan.lan.set_visible(False) # TODO: put in controller + def query_test2(self) -> None: + # TODO: should trigger first page action after entire UI is loaded + self.controller.dump_test() + def query_test(self) -> None: data = (["BAR", "a", "a", "a", 1, 1, 1, "185.207.214.16:2302", 0, 0, "a", False]) return data