feat: dynamic tooltip

This commit is contained in:
aclist committed 2026-04-11 22:35:52 +09:00
1 parent 600fea8a82
commit 82cddf261e
9 files changed
+61 -28

No files matched your search

+18 -11
View File
@@ -39,6 +39,7 @@ from dzgui.controllers.emitter import Emitter
from dzgui.managers.config import ConfigManager from dzgui.managers.config import ConfigManager
from dzgui.managers.connection import ConnectionManager from dzgui.managers.connection import ConnectionManager
from dzgui.managers.contextmenu import ContextMenuManager from dzgui.managers.contextmenu import ContextMenuManager
from dzgui.managers.notes import NoteManager
from dzgui.model.proxy_model import ProxyModelManager from dzgui.model.proxy_model import ProxyModelManager
from dzgui.model.servers import ServerModelManager from dzgui.model.servers import ServerModelManager
from dzgui.model.model_factory import ModelFactory from dzgui.model.model_factory import ModelFactory
@@ -103,8 +104,8 @@ class StoredFunc:
class Controller(GObject.GObject): class Controller(GObject.GObject):
def __init__(self) -> None: def __init__(self) -> None:
self.dist_cache: dict[str, "Haversine", "ServerTab"] = {} self.dist_cache: dict[str, "Haversine", "ServerTab"] = {}
self.notes_cache: dict[str, str] = {}
self.mediator = AppNavigation() self.mediator = AppNavigation()
self.prefs: UserPrefs self.prefs: UserPrefs
self.cleanup_func: StoredFunc = None self.cleanup_func: StoredFunc = None
@@ -150,6 +151,7 @@ class Controller(GObject.GObject):
def set_prefs(self, prefs: UserPrefs) -> None: def set_prefs(self, prefs: UserPrefs) -> None:
self.config_man = ConfigManager(prefs) self.config_man = ConfigManager(prefs)
self.notes_man = NoteManager(self, prefs.paths.notes)
self.prefs = prefs self.prefs = prefs
def query_config(self, key: Preferences) -> str | bool | list: def query_config(self, key: Preferences) -> str | bool | list:
@@ -627,21 +629,26 @@ class Controller(GObject.GObject):
cmd = self.query_config(Preferences.CLIENT) cmd = self.query_config(Preferences.CLIENT)
open_workshop_page(mod, cmd) open_workshop_page(mod, cmd)
def get_note(self) -> None: def has_note(self) -> bool:
# TODO: load from file 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() tv = self.get_active_treeview()
record = tv.get_record_string() record = tv.get_record_string()
try: return self.notes_man.get_note(record)
text = self.notes_cache[record]
return text
except Exception:
return ""
def add_note(self, note: str) -> None: 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: def delete_note(self) -> None:
tv = self.get_active_treeview() tv = self.get_active_treeview()
record = tv.get_record_string() record = tv.get_record_string()
del self.notes_cache[record] self.notes_man.delete_note(record)
# TODO: serialize into file
+2 -2
View File
@@ -5,7 +5,7 @@ import dzgui.api.servers as Servers
from dzgui.api.mods import get_local_mod_ids from dzgui.api.mods import get_local_mod_ids
from dzgui.const.enum import Preferences from dzgui.const.enum import Preferences
from dzgui.managers.thread_man import call_on_thread, StoredFunc, ThreadingManager 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.generic import ExceptionDialog
from dzgui.views.dialogs.servers import ServerDetailsDialog, ServerModDialog from dzgui.views.dialogs.servers import ServerDetailsDialog, ServerModDialog
@@ -87,7 +87,7 @@ class ConnectionManager:
[ [
mod.name, mod.name,
str(mod.workshop_id), str(mod.workshop_id),
checkmark if mod.workshop_id in local else "" checkmark if mod.workshop_id in local else "",
] ]
for mod in mods for mod in mods
] ]
-1
View File
@@ -36,7 +36,6 @@ class ContextMenuManager:
case ContextMenu.ADD_NOTE: case ContextMenu.ADD_NOTE:
dialog = NoteDialog(self.controller) dialog = NoteDialog(self.controller)
dialog.run() dialog.run()
print("DEBUG: unimplemented")
case ContextMenu.COPY_LOG_CLIPBOARD: case ContextMenu.COPY_LOG_CLIPBOARD:
self.copy_log() self.copy_log()
case ContextMenu.COPY_SERVER_IP: case ContextMenu.COPY_SERVER_IP:
+1 -1
View File
@@ -4,7 +4,7 @@ import threading
from typing import Any from typing import Any
from functools import wraps from functools import wraps
from typing import Callable, Optional from typing import Callable
from dzgui.views.dialogs.generic import WaitDialog from dzgui.views.dialogs.generic import WaitDialog
+1 -1
View File
@@ -1,5 +1,5 @@
from dataclasses import dataclass 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.const.enum import HELP_MENU_ROWS
from dzgui.util.redact import redact_log from dzgui.util.redact import redact_log
+1 -1
View File
@@ -2,7 +2,7 @@ import logging
import threading import threading
from concurrent.futures import as_completed from concurrent.futures import as_completed
from concurrent.futures import ThreadPoolExecutor from concurrent.futures import ThreadPoolExecutor
from typing import Union, TYPE_CHECKING from typing import TYPE_CHECKING
import dzgui.api.servers as Servers import dzgui.api.servers as Servers
from dzgui.const.enum import FilterMode, Preferences, ServerTab from dzgui.const.enum import FilterMode, Preferences, ServerTab
+1 -7
View File
@@ -16,12 +16,6 @@ def read_json(path: Path) -> dict:
def write_json(data: dict, path: Path) -> None: def write_json(data: dict, path: Path) -> None:
try: try:
j = json.dumps(data, indent=2) j = json.dumps(data, indent=2)
path.write_text(j)
except Exception as e: except Exception as e:
raise e raise e
# TODO: Path.write_text()
try:
with open(path, "w") as outfile:
outfile.write(j)
except OSError as e:
raise e
+5 -4
View File
@@ -1,6 +1,7 @@
import logging import logging
from dzgui.const.enum import ContextMenu from dzgui.const.enum import ContextMenu
from dzgui.util.keys import is_navkey from dzgui.util.keys import is_navkey
from dzgui.util.strings import edit_note
from dzgui.views.trees.tree_base import TreeView from dzgui.views.trees.tree_base import TreeView
import gi import gi
@@ -65,11 +66,11 @@ class ContextMixin(TreeView):
if row == ContextMenu.SHOW_MODS: if row == ContextMenu.SHOW_MODS:
item.set_sensitive(self.is_modded()) item.set_sensitive(self.is_modded())
if row == ContextMenu.ADD_NOTE:
if self.controller.has_note():
item.set_label(edit_note)
return item 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: def _process_button_event(self, event: Gdk.EventButton) -> bool:
try: try:
+32
View File
@@ -121,9 +121,41 @@ class ServerTreeView(ContextMixin, TreeView):
self.connect("map", self._on_map) self.connect("map", self._on_map)
self.connect("unmap", self._on_unmap) self.connect("unmap", self._on_unmap)
self.set_has_tooltip(True)
self.connect("query-tooltip", self._on_tooltip)
# TODO: why is this being saved? # TODO: why is this being saved?
self.thread = None 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: def start_queue_checker(self) -> None:
self.queue_id = GLib.timeout_add(QUEUE_CHECK_DELAY, self._check_result_queue) self.queue_id = GLib.timeout_add(QUEUE_CHECK_DELAY, self._check_result_queue)