mirror of
https://github.com/aclist/dztui.git
synced 2026-10-30 22:52:42 +01:00
feat: dynamic tooltip
This commit is contained in:
1 parent
600fea8a82
commit
82cddf261e
9 files changed
+61
-28
No files matched your search
+18
-11
@@ -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
|
|
||||||
@@ -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
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
@@ -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,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
|
||||||
|
|||||||
@@ -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
@@ -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
|
|
||||||
@@ -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:
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|
||||||
|
|||||||
Reference in new issue
Block a user