diff --git a/dzgui/controllers/mc.py b/dzgui/controllers/mc.py index 6b636f8..165dbd7 100644 --- a/dzgui/controllers/mc.py +++ b/dzgui/controllers/mc.py @@ -39,6 +39,7 @@ from dzgui.controllers.emitter import Emitter from dzgui.managers.config import ConfigManager from dzgui.managers.connection import ConnectionManager from dzgui.managers.contextmenu import ContextMenuManager +from dzgui.managers.notes import NoteManager from dzgui.model.proxy_model import ProxyModelManager from dzgui.model.servers import ServerModelManager from dzgui.model.model_factory import ModelFactory @@ -103,8 +104,8 @@ class StoredFunc: class Controller(GObject.GObject): def __init__(self) -> None: self.dist_cache: dict[str, "Haversine", "ServerTab"] = {} - self.notes_cache: dict[str, str] = {} self.mediator = AppNavigation() + self.prefs: UserPrefs self.cleanup_func: StoredFunc = None @@ -150,6 +151,7 @@ class Controller(GObject.GObject): def set_prefs(self, prefs: UserPrefs) -> None: self.config_man = ConfigManager(prefs) + self.notes_man = NoteManager(self, prefs.paths.notes) self.prefs = prefs def query_config(self, key: Preferences) -> str | bool | list: @@ -627,21 +629,26 @@ class Controller(GObject.GObject): cmd = self.query_config(Preferences.CLIENT) open_workshop_page(mod, cmd) - def get_note(self) -> None: - # TODO: load from file + def has_note(self) -> bool: + note = self.get_note() + if len(note) > 0: + return True + return False + + def get_note_by_record(self, record: str) -> str: + return self.notes_man.get_note(record) + + def get_note(self) -> str: tv = self.get_active_treeview() record = tv.get_record_string() - try: - text = self.notes_cache[record] - return text - except Exception: - return "" + return self.notes_man.get_note(record) def add_note(self, note: str) -> None: - print(note) + tv = self.get_active_treeview() + record = tv.get_record_string() + self.notes_man.add_note(record, note) def delete_note(self) -> None: tv = self.get_active_treeview() record = tv.get_record_string() - del self.notes_cache[record] - # TODO: serialize into file + self.notes_man.delete_note(record) diff --git a/dzgui/managers/connection.py b/dzgui/managers/connection.py index 0cefaab..b46f6c5 100644 --- a/dzgui/managers/connection.py +++ b/dzgui/managers/connection.py @@ -5,7 +5,7 @@ import dzgui.api.servers as Servers from dzgui.api.mods import get_local_mod_ids from dzgui.const.enum import Preferences from dzgui.managers.thread_man import call_on_thread, StoredFunc, ThreadingManager -from dzgui.util.strings import api_warn_msg, dialog, server_timeout, checkmark +from dzgui.util.strings import dialog, server_timeout, checkmark from dzgui.views.dialogs.generic import ExceptionDialog from dzgui.views.dialogs.servers import ServerDetailsDialog, ServerModDialog @@ -87,7 +87,7 @@ class ConnectionManager: [ mod.name, str(mod.workshop_id), - checkmark if mod.workshop_id in local else "" + checkmark if mod.workshop_id in local else "", ] for mod in mods ] diff --git a/dzgui/managers/contextmenu.py b/dzgui/managers/contextmenu.py index 590fd18..1f698ba 100644 --- a/dzgui/managers/contextmenu.py +++ b/dzgui/managers/contextmenu.py @@ -36,7 +36,6 @@ class ContextMenuManager: case ContextMenu.ADD_NOTE: dialog = NoteDialog(self.controller) dialog.run() - print("DEBUG: unimplemented") case ContextMenu.COPY_LOG_CLIPBOARD: self.copy_log() case ContextMenu.COPY_SERVER_IP: diff --git a/dzgui/managers/thread_man.py b/dzgui/managers/thread_man.py index 3aa1283..c3997c7 100644 --- a/dzgui/managers/thread_man.py +++ b/dzgui/managers/thread_man.py @@ -4,7 +4,7 @@ import threading from typing import Any from functools import wraps -from typing import Callable, Optional +from typing import Callable from dzgui.views.dialogs.generic import WaitDialog diff --git a/dzgui/model/model_factory.py b/dzgui/model/model_factory.py index 4ac37fc..163116c 100644 --- a/dzgui/model/model_factory.py +++ b/dzgui/model/model_factory.py @@ -1,5 +1,5 @@ from dataclasses import dataclass -from typing import Any, Sequence, Union +from typing import Any, Sequence from dzgui.const.enum import HELP_MENU_ROWS from dzgui.util.redact import redact_log diff --git a/dzgui/model/servers.py b/dzgui/model/servers.py index 39be124..69e3345 100644 --- a/dzgui/model/servers.py +++ b/dzgui/model/servers.py @@ -2,7 +2,7 @@ import logging import threading from concurrent.futures import as_completed from concurrent.futures import ThreadPoolExecutor -from typing import Union, TYPE_CHECKING +from typing import TYPE_CHECKING import dzgui.api.servers as Servers from dzgui.const.enum import FilterMode, Preferences, ServerTab diff --git a/dzgui/util/_json.py b/dzgui/util/_json.py index 9961c53..4a46bdf 100644 --- a/dzgui/util/_json.py +++ b/dzgui/util/_json.py @@ -16,12 +16,6 @@ def read_json(path: Path) -> dict: def write_json(data: dict, path: Path) -> None: try: j = json.dumps(data, indent=2) + path.write_text(j) except Exception as e: raise e - - # TODO: Path.write_text() - try: - with open(path, "w") as outfile: - outfile.write(j) - except OSError as e: - raise e diff --git a/dzgui/views/mixins/context_mixin.py b/dzgui/views/mixins/context_mixin.py index bcb9c72..a8d2ef6 100644 --- a/dzgui/views/mixins/context_mixin.py +++ b/dzgui/views/mixins/context_mixin.py @@ -1,6 +1,7 @@ import logging from dzgui.const.enum import ContextMenu from dzgui.util.keys import is_navkey +from dzgui.util.strings import edit_note from dzgui.views.trees.tree_base import TreeView import gi @@ -65,11 +66,11 @@ class ContextMixin(TreeView): if row == ContextMenu.SHOW_MODS: item.set_sensitive(self.is_modded()) + if row == ContextMenu.ADD_NOTE: + if self.controller.has_note(): + item.set_label(edit_note) + return item - # TODO: notes cache - # if row == ContextMenu.ADD_NOTE: - # if self.get_record_string() in notes_cache: - # item.set_label(strings.edit_note) def _process_button_event(self, event: Gdk.EventButton) -> bool: try: diff --git a/dzgui/views/trees/tree_servers.py b/dzgui/views/trees/tree_servers.py index 3e58422..8ba718a 100644 --- a/dzgui/views/trees/tree_servers.py +++ b/dzgui/views/trees/tree_servers.py @@ -121,9 +121,41 @@ class ServerTreeView(ContextMixin, TreeView): self.connect("map", self._on_map) self.connect("unmap", self._on_unmap) + self.set_has_tooltip(True) + self.connect("query-tooltip", self._on_tooltip) + # TODO: why is this being saved? self.thread = None + def _on_tooltip( + self, + widget: Gtk.Widget, + x: int, + y: int, + keyboard_mode: bool, + tooltip: Gtk.Tooltip, + ) -> bool: + """ + Present record data for the hovered row even if it is unfocused + """ + coords = widget.convert_widget_to_bin_window_coords(x, y) + path = self.get_path_at_pos(coords.bx, coords.by) + if path is None: + return False + + model = self.get_model() + tree_iter = model.get_iter(path[0]) + ip = model.get_value(tree_iter, 7) + qport = model.get_value(tree_iter, 8) + addr = ip + ":" + str(qport) + note = self.controller.get_note_by_record(addr) + + if len(note) > 0: + tooltip.set_text(note) + self.set_tooltip_row(tooltip, path[0]) + return True + return False + def start_queue_checker(self) -> None: self.queue_id = GLib.timeout_add(QUEUE_CHECK_DELAY, self._check_result_queue)