diff --git a/dzgui/config/userprefs.py b/dzgui/config/userprefs.py index d7c09f9..c2830ad 100644 --- a/dzgui/config/userprefs.py +++ b/dzgui/config/userprefs.py @@ -2,7 +2,9 @@ from dataclasses import dataclass from dzgui.config.xdg import Xdg from dzgui.util.ip import Coords -@dataclass(slots=True, frozen=True) + +# NOTE: mutable dataclass, 'use_miles' key changes on demand +@dataclass(slots=True) class UserPrefs: is_steam_deck: bool is_game_mode: bool @@ -11,3 +13,4 @@ class UserPrefs: version: str allow_updates: bool paths: Xdg + use_miles: bool diff --git a/dzgui/const/constants.py b/dzgui/const/constants.py index b47a05b..ab43f3f 100644 --- a/dzgui/const/constants.py +++ b/dzgui/const/constants.py @@ -34,6 +34,7 @@ CLIPBOARD = "edit-copy-symbolic" LIST_ADD = "list-add-symbolic" STEAM_ICON = "steam_tray_mono" VIEW_CONCEAL = "view-conceal-symbolic" +SEARCH_ICON = "system-search-symbolic" VIEW_REVEAL = "view-reveal-symbolic" INPUT_KEYBOARD = "input-keyboard-symbolic" HELP_BUBBLE = "help-about-symbolic" diff --git a/dzgui/controllers/emitter.py b/dzgui/controllers/emitter.py index 2ed26d9..ee43b00 100644 --- a/dzgui/controllers/emitter.py +++ b/dzgui/controllers/emitter.py @@ -15,6 +15,7 @@ class Emitter(GObject.GObject): def __init__(self) -> None: super().__init__() + # TODO: rename request verbs @GObject.Signal(flags=GObject.SignalFlags.RUN_LAST, arg_types=()) def request_keyword_focus(self) -> None: """User invoked Ctrl-f keybinding from ServerTreeView""" @@ -57,6 +58,14 @@ class Emitter(GObject.GObject): def distcalc_started(self) -> None: pass + @GObject.Signal(flags=GObject.SignalFlags.RUN_LAST, arg_types=(bool,)) + def mod_page_toggled(self, state: bool) -> None: + pass + + @GObject.Signal(flags=GObject.SignalFlags.RUN_LAST, arg_types=(bool,)) + def lan_tab_toggled(self, state: bool) -> None: + pass + @GObject.Signal( flags=GObject.SignalFlags.RUN_LAST, arg_types=( diff --git a/dzgui/controllers/mc.py b/dzgui/controllers/mc.py index a71d65c..313b29f 100644 --- a/dzgui/controllers/mc.py +++ b/dzgui/controllers/mc.py @@ -104,7 +104,7 @@ class Controller(GObject.GObject): 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 = WaitDialog(self, strings.dialog.filtering) self.wait_dialog.show_all() thread = threading.Thread(target=func, args=args) thread.start() @@ -253,7 +253,6 @@ class Controller(GObject.GObject): def set_statusbar_dist(self, haversine: "Haversine", enum: "ServerTab") -> None: context = self.get_active_context() - print(context) page = self.mediator.notebook.get_page_by_enum() """ NOTE: prevents race condition when server tab changed, @@ -261,7 +260,6 @@ class Controller(GObject.GObject): """ if page != NotebookPage.SERVERS: self.emitter.emit("distcalc_ended" , None, context) - #self.mediator.statusbar.spinner.stop() return if enum != context: self.emitter.emit("distcalc_ended" , None, context) @@ -272,8 +270,7 @@ class Controller(GObject.GObject): if haversine is None: dist = "Unknown" else: - # FIXME: always opens file; cache distance pref at boot and when it changes - if self.query_config(Preferences.DIST) is True: + if self.prefs.use_miles: raw = round(haversine.as_miles()) separated = number(raw) dist = str(separated) + " mi" @@ -310,6 +307,9 @@ class Controller(GObject.GObject): config = self.prefs.paths.config try: update.toggle_config(config, context) + # NOTE: 'use_miles' key is updated dynamically for statusbar unit + if context == Preferences.DIST: + self.prefs.use_miles = not self.prefs.use_miles except Exception as e: logger.critical(e) trace = traceback.format_exc() @@ -337,9 +337,6 @@ class Controller(GObject.GObject): notebook = self.mediator.grid.notebook notebook.focus_current() - def toggle_mod_panel(self, state: bool) -> None: - self.mediator.grid.right_panel.sel_panel.set_visible(state) - def show_developers_page(self) -> None: self.open_page(NotebookPage.DEVELOPERS) @@ -631,11 +628,10 @@ class Controller(GObject.GObject): treeview.grab_focus() self.destroy_on_idle() if self.success is False: + # TODO: different dialogs for server tab contexts, e.g. lan timeout + # TODO: if history/favorites is empty, don't even trigger a call to dump data dialog = ExceptionDialog(self, "API TIMEOUT") dialog.run() - #if treeview.get_filter_man().get_model() is None: - # TODO: different dialogs for server tab contexts, e.g. lan timeout - # TODO: if history/favorites is empty, don't even trigger a call def push_data(self, data: tuple, mode: Optional[FilterMode], success: bool) -> None: @@ -772,7 +768,7 @@ class Controller(GObject.GObject): # FIXME: optional label/map/keyword parameter def refilter_model(self, mode: FilterMode, label: Optional[str] = None) -> None: tv = self.get_active_treeview() - if tv.get_model() is None: + if tv.filter_man.get_control() is None: return tv.set_model(None) # TODO: deprecated in this context? diff --git a/dzgui/main.py b/dzgui/main.py index 8b2d154..0b0c29e 100644 --- a/dzgui/main.py +++ b/dzgui/main.py @@ -7,7 +7,9 @@ import warnings from typing import TYPE_CHECKING from dzgui.api.mods import remove_stale_signatures +from dzgui.const.enum import Preferences from dzgui.config.ipdb import get_ipdb +from dzgui.config.query import lookup from dzgui.config.userprefs import UserPrefs from dzgui.config.xdg import get_xdg_paths, parse_filepaths from dzgui.const.update import ALLOW_UPDATES @@ -126,6 +128,7 @@ def main() -> None: # TODO: handle IP DB failure and use coords fallback get_ipdb(XDG.ips) local_coords = get_local_coords(XDG.ips) + use_miles = lookup(XDG.config, Preferences.DIST) prefs = UserPrefs( _is_steam_deck, @@ -135,6 +138,7 @@ def main() -> None: version, allow, XDG, + use_miles, ) print("All OK. Loading UI...") App(prefs) diff --git a/dzgui/views/components/connect_panel.py b/dzgui/views/components/connect_panel.py index 81b206e..4bdcb08 100644 --- a/dzgui/views/components/connect_panel.py +++ b/dzgui/views/components/connect_panel.py @@ -1,20 +1,26 @@ from typing import TYPE_CHECKING from dzgui.util.strings import connect_panel, fav_panel, lan_panel -from dzgui.views.components.buttons import AddButton, ClipboardButton, SteamConnectButton +from dzgui.views.components.buttons import ( + AddButton, + ClipboardButton, + SteamConnectButton, +) from dzgui.views.components.entry import IpEntry, PortEntry from dzgui.views.components.labels import BoldLabel import gi + gi.require_version("Gtk", "3.0") -from gi.repository import Gtk, Gdk # noqa E402 +from gi.repository import Gtk, Gdk # noqa E402 if TYPE_CHECKING: - from dzgui.controllers.mc import Controller + from dzgui.controllers.mc import Controller, Emitter COLS = 1 ROWS = 1 + class LanPanel(Gtk.Frame): def __init__(self, controller: "Controller") -> None: super().__init__(margin_top=10, margin_bottom=5) @@ -27,20 +33,26 @@ class LanPanel(Gtk.Frame): self.set_label_widget(label) radio1 = Gtk.RadioButton.new_with_label(None, lan_panel.default_button) - radio2 = Gtk.RadioButton.new_with_label_from_widget(radio1, lan_panel.custom_button) + radio2 = Gtk.RadioButton.new_with_label_from_widget( + radio1, lan_panel.custom_button + ) self.entry = PortEntry(controller) self.scan = Gtk.Button(label=lan_panel.scan_button) self.entry.connect("string_validated", self._on_port_validated) - self.emitter.connect("request_lan_entry_focus", lambda _: self.entry.grab_focus()) + self.emitter.connect( + "request_lan_entry_focus", lambda _: self.entry.grab_focus() + ) radio1.connect("toggled", self._on_radio_toggled) self.grid = Gtk.Grid(margin=10, vexpand=False, column_spacing=15, row_spacing=5) self.grid.attach(radio1, 0, 0, COLS, ROWS) self.grid.attach_next_to(radio2, radio1, Gtk.PositionType.RIGHT, COLS, ROWS) self.grid.attach_next_to(self.entry, radio2, Gtk.PositionType.RIGHT, COLS, ROWS) - self.grid.attach_next_to(self.scan, self.entry, Gtk.PositionType.RIGHT, COLS, ROWS) + self.grid.attach_next_to( + self.scan, self.entry, Gtk.PositionType.RIGHT, COLS, ROWS + ) self.add(self.grid) @@ -52,6 +64,7 @@ class LanPanel(Gtk.Frame): def _on_port_validated(self, entry: Gtk.Entry, state: bool) -> None: self.scan.set_sensitive(state) + class FavPanel(Gtk.Frame): def __init__(self, controller: "Controller") -> None: super().__init__(margin_top=10, margin_bottom=5) @@ -63,8 +76,17 @@ class FavPanel(Gtk.Frame): # TODO: improve upon this, cache fav ip when changed globally user_fav, self.fav_ip = self.controller.get_favorite() - server_name = f"{user_fav} ({self.fav_ip})" if user_fav is not None else connect_panel.no_fav - self.fav_label = Gtk.Label(label=server_name, track_visited_links=False, halign=Gtk.Align.START, hexpand=True) + server_name = ( + f"{user_fav} ({self.fav_ip})" + if user_fav is not None + else connect_panel.no_fav + ) + self.fav_label = Gtk.Label( + label=server_name, + track_visited_links=False, + halign=Gtk.Align.START, + hexpand=True, + ) # NOTE: disable vscrollbar to prevent layout jumping behavior scrollable_label = Gtk.ScrolledWindow(vscrollbar_policy=Gtk.PolicyType.NEVER) scrollable_label.add(self.fav_label) @@ -108,12 +130,18 @@ class AddPanel(Gtk.Frame): self.entry = IpEntry(controller) self.entry.connect("string_validated", self._on_ip_validated) - self.emitter.connect("request_ip_entry_focus", lambda _: self.entry.grab_focus()) + self.emitter.connect( + "request_ip_entry_focus", lambda _: self.entry.grab_focus() + ) self.grid = Gtk.Grid(margin=10, vexpand=False, column_spacing=15, row_spacing=5) self.grid.attach(self.entry, 0, 0, COLS, ROWS) - self.grid.attach_next_to(self.add_server, self.entry, Gtk.PositionType.RIGHT, COLS, ROWS) - self.grid.attach_next_to(self.conn_server, self.add_server, Gtk.PositionType.RIGHT, COLS, ROWS) + self.grid.attach_next_to( + self.add_server, self.entry, Gtk.PositionType.RIGHT, COLS, ROWS + ) + self.grid.attach_next_to( + self.conn_server, self.add_server, Gtk.PositionType.RIGHT, COLS, ROWS + ) self.add(self.grid) @@ -127,6 +155,8 @@ class ConnectPanel(Gtk.Box): super().__init__(orientation=Gtk.Orientation.VERTICAL) self.controller = controller + emitter = self.controller.get_emitter() + emitter.connect("lan_tab_toggled", self._on_lan_tab_toggled) self.lan = LanPanel(controller) self.fav = FavPanel(controller) @@ -134,3 +164,6 @@ class ConnectPanel(Gtk.Box): for el in self.lan, self.fav, self.add_panel: self.add(el) + + def _on_lan_tab_toggled(self, emitter: "Emitter", state: bool) -> None: + self.lan.set_visible(state) diff --git a/dzgui/views/components/filter_panel.py b/dzgui/views/components/filter_panel.py index b9195ca..8586101 100644 --- a/dzgui/views/components/filter_panel.py +++ b/dzgui/views/components/filter_panel.py @@ -2,7 +2,7 @@ import logging from typing import Literal, TYPE_CHECKING 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, SEARCH_ICON from dzgui.util import strings from dzgui.util.margins import set_surrounding_margins from dzgui.views.components.labels import BoldLabel @@ -42,7 +42,7 @@ class FilterPanel(Gtk.Box): self.controller.register_widget("filters", self) self.emitter = self.controller.get_emitter() - map_store = self.controller.get_map_store() + self.map_store = self.controller.get_map_store() self.checks = [] self.maps_hr = [] @@ -86,8 +86,13 @@ class FilterPanel(Gtk.Box): self.keyword_entry = Gtk.Entry() # TODO :strings self.keyword_entry.set_placeholder_text("Filter by keyword") - self.keyword_entry.connect("activate", self._on_keyword_enter) + self.keyword_entry.connect("activate", self._on_keyword_activated) self.keyword_entry.connect("key-press-event", self._on_keyword_keypress) + self.keyword_entry.set_icon_from_icon_name( + Gtk.EntryIconPosition.SECONDARY, SEARCH_ICON + ) + self.keyword_entry.set_icon_activatable(Gtk.EntryIconPosition.SECONDARY, False) + # entry.connect("icon-release", self._on_icon_release) self.emitter.connect( "request_keyword_focus", lambda _: self.keyword_entry.grab_focus() @@ -103,7 +108,7 @@ class FilterPanel(Gtk.Box): completion.connect("match_selected", self._on_completer_match) renderer_text = Gtk.CellRendererText(ellipsize=Pango.EllipsizeMode.END) - self.maps_combo = Gtk.ComboBox.new_with_model_and_entry(map_store) + self.maps_combo = Gtk.ComboBox.new_with_model_and_entry(self.map_store) self.maps_combo.set_entry_text_column(0) self.maps_entry = self.maps_combo.get_child() @@ -166,7 +171,7 @@ class FilterPanel(Gtk.Box): If entry is exact match for value in liststore, trigger map change function """ - for i in enumerate(map_store): # type: ignore + for i in enumerate(self.map_store): # type: ignore if text == i[1][0]: self.maps_combo.set_active(i[0]) self._on_map_changed(self.maps_combo) @@ -174,7 +179,7 @@ class FilterPanel(Gtk.Box): GLib.idle_add(self.restore_focus_to_treeview) """ This is a workaround for widget.grab_remove() - Sets cursor position to SOL when unfocusing + Sets cursor position to start of line when unfocusing """ text = self.maps_entry.get_text() self.maps_entry.set_position(len(text)) @@ -192,9 +197,8 @@ class FilterPanel(Gtk.Box): def _on_map_completion(self, entry, editable): text = entry.get_text() completion = entry.get_completion() - map_store = self.controller.get_map_store() if len(text) >= completion.get_minimum_key_length(): - completion.set_model(map_store) + completion.set_model(self.map_store) def restore_focus_to_treeview(self) -> Literal[False]: view = self.controller.get_active_treeview() @@ -232,7 +236,7 @@ class FilterPanel(Gtk.Box): def get_keyword_filter(self) -> str: return self.keyword_filter - def _on_keyword_enter(self, entry: Gtk.Entry) -> None: + def _on_keyword_activated(self, entry: Gtk.Entry) -> None: # TODO: self.controller.mediator.window.set_keep_below(False) keyword = entry.get_text().lower() diff --git a/dzgui/views/components/mod_panel.py b/dzgui/views/components/mod_panel.py index e961759..0704136 100644 --- a/dzgui/views/components/mod_panel.py +++ b/dzgui/views/components/mod_panel.py @@ -11,7 +11,7 @@ gi.require_version("Gtk", "3.0") from gi.repository import Gtk # noqa E402 if TYPE_CHECKING: - from dzgui.controllers.mc import Controller + from dzgui.controllers.mc import Controller, Emitter class EnumeratedModButton(Gtk.Button): @@ -28,6 +28,8 @@ class ModSelectionPanel(Gtk.Box): super().__init__(spacing=6, orientation=Gtk.Orientation.VERTICAL, margin_top=15) self.controller = controller + emitter = controller.get_emitter() + emitter.connect("mod_page_toggled", self._on_mod_page_toggled) header = BoldLabel(mod_panel.header) @@ -58,6 +60,9 @@ class ModSelectionPanel(Gtk.Box): for el in header, self.main_panel, self.stale_panel: self.pack_start(el, NO_EXPAND, FILL, NO_PADDING) + def _on_mod_page_toggled(self, emitter: "Emitter", state: bool) -> None: + self.set_visible(state) + def after_colorize(self) -> None: self.controller.unselect_all_mods() self.swap_sensitive(True) diff --git a/dzgui/views/components/right_panel.py b/dzgui/views/components/right_panel.py index 28f0064..7f47ae3 100644 --- a/dzgui/views/components/right_panel.py +++ b/dzgui/views/components/right_panel.py @@ -29,6 +29,7 @@ class RightPanel(Gtk.Box): self.button_vbox = ButtonBox(controller) self.filters_vbox = FilterPanel(controller) + self.sel_panel = ModSelectionPanel(controller) emitter.connect("servers_loaded", self.toggle_refresh_button) diff --git a/dzgui/views/components/statusbar.py b/dzgui/views/components/statusbar.py index cd4a909..27a1d4d 100644 --- a/dzgui/views/components/statusbar.py +++ b/dzgui/views/components/statusbar.py @@ -49,25 +49,10 @@ class Statusbar(Gtk.Grid): "switch-page", self._on_notebook_page_changed ) - # TODO: self.emitter.connect("distcalc_started", self._on_distcalc_started) self.emitter.connect("distcalc_ended", self._on_distcalc_ended) self.emitter.connect("servers_loaded", self._on_servers_loaded) - # self.connect("distcalc_ended", self._on_distcalc_ended) - - # @GObject.Signal( - # flags=GObject.SignalFlags.RUN_LAST, - # arg_types=( - # object, - # object, - # ), - # ) - # def distcalc_ended( - # self, dist: Union[str, None], context: Union["ServerTab", NotebookPage] - # ) -> None: - # pass - def _on_notebook_page_changed( self, notebook: "Notebook", child: Gtk.Widget, index: int ) -> None: @@ -95,7 +80,8 @@ class Statusbar(Gtk.Grid): case NotebookPage.HELP: bar = self.controller.get_help_row() case NotebookPage.SERVERS: - # self.emit("server_page_changed", ServerTab.BROWSER) + context = self.controller.get_active_context() + self.emitter.emit("servers_loaded", context) return case NotebookPage.KEYS: bar = question_to_return diff --git a/dzgui/views/pages/devs.py b/dzgui/views/pages/devs.py index cd4a1ea..e1a086f 100644 --- a/dzgui/views/pages/devs.py +++ b/dzgui/views/pages/devs.py @@ -5,6 +5,7 @@ from dzgui.const.enum import NotebookPage from dzgui.util.css import add_class from dzgui.util.strings import developers from dzgui.views.components.labels import BoldLabel +from dzgui.views.trees.tree_base import TreeView import gi # noqa E402 gi.require_version("Gtk", "3.0") @@ -61,7 +62,6 @@ class Developers(Gtk.ScrolledWindow): self.controller.open_page(NotebookPage.OPTIONS) def _make_tree(self, prefs: Union["Xdg", "UserPrefs"]) -> Gtk.TreeView: - from dzgui.views.trees.tree_base import TreeView view = TreeView(self.controller) renderer = Gtk.CellRendererText() for i, col in enumerate(developers.columns): diff --git a/dzgui/views/pages/mods.py b/dzgui/views/pages/mods.py index 6d0d4a5..89509d6 100644 --- a/dzgui/views/pages/mods.py +++ b/dzgui/views/pages/mods.py @@ -15,6 +15,7 @@ class Mods(Gtk.ScrolledWindow): super().__init__() self.controller = controller + self.emitter = controller.get_emitter() self.tree = ModTreeView(controller) self.add(self.tree) @@ -23,12 +24,11 @@ class Mods(Gtk.ScrolledWindow): self.connect("map", self._on_map) self.connect("unmap", self._on_unmap) - # TODO: use emitter def _on_unmap(self, widget: Self) -> None: - self.controller.toggle_mod_panel(False) + self.emitter.emit("mod_page_toggled", False) def _on_map(self, widget: Self) -> None: - self.controller.toggle_mod_panel(True) + self.emitter.emit("mod_page_toggled", True) def grab_content_area(self) -> None: self.tree.grab_focus() diff --git a/dzgui/views/pages/servers.py b/dzgui/views/pages/servers.py index d9125f8..ab58bc4 100644 --- a/dzgui/views/pages/servers.py +++ b/dzgui/views/pages/servers.py @@ -59,8 +59,10 @@ class ServerNotebook(Gtk.ScrolledWindow): def _on_map(self, widget: Self) -> None: self.emitter.emit("server_page_toggled", True) - print("page changed, starting queue checker") - self.get_active_treeview().start_timeout() + # FIXME: only applies to server notebook, not atomic page + # this can be delegated to the map/unmap signal of the ServerTreeView itself + # print("page changed, starting queue checker") + # self.get_active_treeview().start_timeout() def _on_unmap(self, widget: Self) -> None: self.emitter.emit("server_page_toggled", False) diff --git a/dzgui/views/trees/tree_base.py b/dzgui/views/trees/tree_base.py index c042804..61dacee 100644 --- a/dzgui/views/trees/tree_base.py +++ b/dzgui/views/trees/tree_base.py @@ -125,7 +125,6 @@ class TreeView(CursorMixin, Gtk.TreeView): # type: ignore self._on_tree_selection_changed(selection) def _on_tree_selection_changed(self, selection: Gtk.TreeSelection) -> None: - print("selection changed") self.emit("generic_treesel_changed", selection) def toggle_selection(self, state: bool) -> None: diff --git a/dzgui/views/trees/tree_servers.py b/dzgui/views/trees/tree_servers.py index e8722ac..79bf462 100644 --- a/dzgui/views/trees/tree_servers.py +++ b/dzgui/views/trees/tree_servers.py @@ -1,7 +1,7 @@ import logging import multiprocessing import threading -from typing import Any +from typing import Any, Optional from warnings import deprecated from dzgui.views.mixins.context_mixin import ContextMixin @@ -50,7 +50,8 @@ class ServerTreeView(ContextMixin, TreeView): self.set_fixed_height_mode(True) self.set_headers_visible(True) - self.queue_id: int = 0 + self.queue_id: int + self.handler_id: int self.current_proc = None self.queue = multiprocessing.Queue() @@ -108,10 +109,6 @@ class ServerTreeView(ContextMixin, TreeView): self.connect("key-press-event", self.present_menu) self.connect("button-press-event", self.present_menu) - # TODO: simplify this - self.emitter.connect("statusbar_loaded", self.start_distcalc) - # self.emitter.connect("distcalc_started", self._on_distcalc_started) - def _get_ping( self, column: Gtk.TreeViewColumn, @@ -146,8 +143,6 @@ class ServerTreeView(ContextMixin, TreeView): pass def start_timeout(self) -> None: - if self.queue_id: - GLib.Source.remove(self.queue_id) self.queue_id = GLib.timeout_add(QUEUE_CHECK_DELAY, self._check_result_queue) def get_filter_man(self) -> FilteredModelManager: @@ -180,12 +175,19 @@ class ServerTreeView(ContextMixin, TreeView): def _on_map(self, a) -> None: if self.get_enum() is ServerTab.LAN: - # TODO: use emitter here - self.controller.mediator.grid.conpan.lan.set_visible(True) + self.emitter.emit("lan_tab_toggled", True) + + # FIXME: only if the tab is active + self.handler_id = self.emitter.connect("statusbar_loaded", self.start_distcalc) + self.start_timeout() + self.start_distcalc() def _on_unmap(self, a) -> None: + # NOTE: remove queue checker for this tab + GLib.Source.remove(self.queue_id) + self.emitter.disconnect(self.handler_id) if self.get_enum() is ServerTab.LAN: - self.controller.mediator.grid.conpan.lan.set_visible(False) + self.emitter.emit("lan_tab_toggled", False) def set_query_func(self, func: Callable) -> None: self.query_func = func @@ -206,8 +208,6 @@ class ServerTreeView(ContextMixin, TreeView): if self.current_proc and self.current_proc.is_alive(): self.current_proc.terminate() - from typing import Optional - def start_distcalc(self, emitter: Optional["Emitter"] = None): self.terminate_process() self.emitter.emit("distcalc_started") @@ -230,7 +230,6 @@ class ServerTreeView(ContextMixin, TreeView): self.current_proc.start() def _check_result_queue(self) -> Literal[True]: - # TODO: delegate to controller latest_result = None while not self.queue.empty(): latest_result = self.queue.get() @@ -242,6 +241,7 @@ class ServerTreeView(ContextMixin, TreeView): haversine = latest_result[1] if addr not in cache: cache[addr] = haversine + # TODO: should be emitting a statusbar signal here instead? self.controller.set_statusbar_dist(haversine, self.get_enum()) return True @@ -251,6 +251,7 @@ class ServerTreeView(ContextMixin, TreeView): if event.state is Gdk.ModifierType.CONTROL_MASK: match event.keyval: case Gdk.KEY_r: + # TODO: unimplemented self.refresh_player_count() case Gdk.KEY_f: self.emitter.emit("request_keyword_focus") @@ -260,7 +261,7 @@ class ServerTreeView(ContextMixin, TreeView): self.emitter.emit("request_ip_entry_focus") case Gdk.KEY_p: if self.enum is ServerTab.LAN: - self.emitter.emit("request_lan_entry_focus", self.enum) + self.emitter.emit("request_lan_entry_focus") case Gdk.KEY_c: record = self.get_record() self.controller.copy_ip(record)