feat: threading decorator

This commit is contained in:
aclist 2026-01-25 09:52:59 +09:00
parent e8e78ee6a1
commit 5d6a7c9775
5 changed files with 40 additions and 24 deletions

View File

@ -95,6 +95,15 @@ class Controller(GObject.GObject):
# NOTE: suppress requests until entire UI is loaded
self.loaded = False
def call_on_thread(func: Callable) -> Callable:
def wrapper(*args, **kwargs):
self = args[0]
self.wait_dialog = WaitDialog(self, strings.dialog.fetching)
self.wait_dialog.show_all()
thread = threading.Thread(target=func, args=args)
thread.start()
return wrapper
def register_widget(self, attr: str, widget: Gtk.Widget) -> None:
try:
setattr(self.mediator, attr, widget)
@ -613,14 +622,15 @@ class Controller(GObject.GObject):
treeview.set_loaded(True)
GLib.idle_add(cleanup)
@call_on_thread
def highlight_stale(self) -> None:
self.call_on_thread(self.colorize_mods)
self.colorize_mods()
def call_on_thread(self, func: Callable, *args) -> None:
self.wait_dialog = WaitDialog(self, strings.dialog.fetching)
self.wait_dialog.show_all()
thread = threading.Thread(target=func, args=args)
thread.start()
# def call_on_thread(self, func: Callable, *args) -> None:
# self.wait_dialog = WaitDialog(self, strings.dialog.fetching)
# self.wait_dialog.show_all()
# thread = threading.Thread(target=func, args=args)
# thread.start()
def get_callback(self) -> Callable | None:
return self.callback["func"]
@ -670,8 +680,9 @@ class Controller(GObject.GObject):
dialog = ExceptionDialog(self, strings.api_error)
dialog.run()
@call_on_thread
def update_api_key(self, text: str, key: Preferences) -> None:
self.call_on_thread(self.test_api_response, text, key)
self.test_api_response(text, key)
def set_resolution(self, window: "OuterWindow") -> None:
if self.prefs.is_game_mode:
@ -715,6 +726,10 @@ class Controller(GObject.GObject):
def get_statusbar(self) -> None:
return self.mediator.statusbar
@call_on_thread
def thread_data_func(self, func: Callable) -> None:
func()
def populate_model(self) -> None:
treeview = self.get_active_treeview()
if treeview.get_loaded() is True:
@ -729,7 +744,8 @@ class Controller(GObject.GObject):
manager = treeview.get_filter_man()
manager.clear_model()
self.set_callback(None, None)
self.call_on_thread(func)
self.thread_data_func(func)
#self.call_on_thread(func)
def focus_button_box(self) -> None:
self.mediator.right_panel.focus_button_box()

View File

@ -115,7 +115,7 @@ class FilteredModelManager:
row[9] = self.ping_cache[row[7]]
if len(rows) > 0:
clone = self.new_model()
clone = self.new_model_from_class(ServerColumns)
rows = self.sort_rows(rows)
for row in rows:
clone.append(row)
@ -243,7 +243,7 @@ class FilteredModelManager:
if row[7] == addr and row[8] == qport:
self.control_model.remove(row)
self.wipe_cache()
# self.wipe_cache()
filters = self.controller.get_filters()
refiltered = self.filter_toggle_on(filters)
self.set_filtered(refiltered)
@ -276,10 +276,10 @@ class FilteredModelManager:
def get_success(self) -> bool:
return self.success
def wipe_cache(self, full=False) -> None:
self.success = True
self.filtered = None
self.filter_cache = {}
self.ping_cache = {}
if full:
self.control_model = None
# def wipe_cache(self, full=False) -> None:
# self.success = True
# self.filtered = None
# self.filter_cache = {}
# self.ping_cache = {}
# if full:
# self.control_model = None

View File

@ -6,12 +6,14 @@ from dzgui.util.strings import mod_panel
from dzgui.views.components.labels import BoldLabel
import gi
gi.require_version("Gtk", "3.0")
from gi.repository import Gtk # noqa E402
from gi.repository import Gtk # noqa E402
if TYPE_CHECKING:
from dzgui.controllers.mc import Controller
class EnumeratedModButton(Gtk.Button):
def __init__(self, enum: ModButton) -> None:
super().__init__(margin_start=10, margin_end=10)
@ -61,7 +63,7 @@ class ModSelectionPanel(Gtk.Box):
self.swap_sensitive(True)
def swap_sensitive(self, state: bool) -> None:
for child in self.extra_panel.get_children():
for child in self.stale_panel.get_children():
child.set_sensitive(state)
for child in self.main_panel.get_children():
if child.enum == ModButton.HIGHLIGHT_STALE:
@ -84,4 +86,3 @@ class ModSelectionPanel(Gtk.Box):
self.swap_sensitive(False)
case ModButton.SELECT_STALE:
self.controller.select_colorized()

View File

@ -35,7 +35,7 @@ class ServerNotebook(Gtk.ScrolledWindow):
self.lan = ServerTreeView(controller, ServerTab.LAN, ContextMenuGroup.SCAN_LAN)
self.lan.set_query_func(self.controller.dump_test_2)
self.browser.set_query_func(self.controller.dump_api)
self.browser.set_query_func(self.controller.dump_test_2)
tabs = [
(self.browser, server_labels.browser),

View File

@ -378,7 +378,8 @@ class ServerTreeView(TreeView):
) -> Any:
"""
Lazy load contents from model manager into visible CellRenderers on demand
N.B., all row data will be stringified
N.B., all row data types will be stringified and must be fetched
from separate model manager, not internally from TreeView
cf. Gtk.TreeViewColumn.set_cell_data_func()
"""
path = model.get_path(it)
@ -391,5 +392,3 @@ class ServerTreeView(TreeView):
real_model = self.filter_man.get_real_model()
value = real_model[row_index][col_index]
cell.set_property("text", str(value))
else:
return