chore: register signals

This commit is contained in:
aclist committed 2026-01-24 13:30:01 +09:00
1 parent c952fef5e8
commit f05374bc7d
10 files changed
+139 -137

No files matched your search

+14 -7
View File
@@ -5,12 +5,14 @@ from dzgui.util.css import add_class, remove_class
from dzgui.util.strings import connect_panel, lan_panel
import gi
gi.require_version("Gtk", "3.0")
from gi.repository import Gtk, Gdk, GObject # noqa E402
from gi.repository import Gtk, Gdk, GObject # noqa E402
if TYPE_CHECKING:
from dzgui.controllers.mc import Controller
def validate_port(text: str) -> bool:
if text.isdigit():
if int(text) < 1:
@@ -21,6 +23,7 @@ def validate_port(text: str) -> bool:
else:
return False
def validate_ip_or_id(text: str) -> bool:
try:
validate_ip(text)
@@ -31,15 +34,13 @@ def validate_ip_or_id(text: str) -> bool:
else:
return False
class ValidatedEntry(Gtk.Entry):
__gsignals__ = {
"string_validated": (GObject.SignalFlags.RUN_FIRST, None, (object,)),
}
def __init__(self, controller: "Controller", func: Callable) -> None:
super().__init__(
hexpand=True,
placeholder_text=connect_panel.placeholder,
tooltip_text=connect_panel.entry_tooltip
tooltip_text=connect_panel.entry_tooltip,
)
self.func: Callable
@@ -50,6 +51,10 @@ class ValidatedEntry(Gtk.Entry):
self.connect("key-press-event", self._on_entry_keypress)
self.connect("changed", self._on_text_changed)
@GObject.Signal(flags=GObject.SignalFlags.RUN_LAST, arg_types=(bool,))
def string_validated(self, valid: bool) -> None:
pass
def mark_valid(self) -> None:
self.emit("string_validated", True)
remove_class(self, self.classname)
@@ -66,7 +71,9 @@ class ValidatedEntry(Gtk.Entry):
self.func = func
def insert_icon(self) -> None:
self.set_icon_from_icon_name(Gtk.EntryIconPosition.SECONDARY, "edit-clear-symbolic")
self.set_icon_from_icon_name(
Gtk.EntryIconPosition.SECONDARY, "edit-clear-symbolic"
)
self.set_icon_activatable(Gtk.EntryIconPosition.SECONDARY, True)
self.connect("icon-release", self._on_icon_release)
@@ -98,7 +105,6 @@ class ValidatedEntry(Gtk.Entry):
entry.set_text("")
self.remove_icon()
def _on_entry_keypress(self, entry: Gtk.Entry, event: Gdk.EventKey) -> None:
if event.keyval == Gdk.KEY_Escape:
# NOTE: unselect text
@@ -112,6 +118,7 @@ class IpEntry(ValidatedEntry):
self.set_placeholder_text(connect_panel.placeholder)
self.set_tooltip_text(connect_panel.entry_tooltip)
class PortEntry(ValidatedEntry):
def __init__(self, controller: "Controller") -> None:
super().__init__(controller, func=validate_port)
+11 -5
View File
@@ -1,14 +1,20 @@
from typing import TYPE_CHECKING
from dzgui.const.constants import HELP_BUBBLE
import gi
gi.require_version("Gtk", "3.0")
from gi.repository import Gtk, Gdk # noqa E402
if TYPE_CHECKING:
from dzgui.controllers.mc import Controller
class InfoEventBox(Gtk.EventBox):
def __init__(self, text: str, parent: Gtk.Widget):
def __init__(self, text: str, controller: "Controller"):
super().__init__(margin_start=10)
self.parent = parent
self.controller = controller
self.text = text
self.icon = Gtk.Image.new_from_icon_name(
@@ -26,14 +32,14 @@ class InfoEventBox(Gtk.EventBox):
self, eventbox: Gtk.EventBox, eventcrossing: Gdk.EventCrossing
) -> None:
self.icon.set_opacity(1)
self.parent.controller.set_statusbar(self.text, "Options")
self.controller.set_statusbar(self.text, "Options")
def _on_leave_tooltip(
self, eventbox: Gtk.EventBox, eventcrossing: Gdk.EventCrossing
) -> None:
self.icon.set_opacity(0.8)
#self.parent.controller.set_statusbar("", "Options")
self.parent.controller.remove_statusbar("Options")
# self.parent.controller.set_statusbar("", "Options")
self.controller.remove_statusbar("Options")
def set_text(self, text: str) -> None:
self.text = text
+46 -35
View File
@@ -1,7 +1,7 @@
from warnings import deprecated
from typing import Self, Union, TYPE_CHECKING
from dzgui.const.enum import NotebookPage, RowType
from dzgui.const.enum import NotebookPage, ServerTab
import gi
@@ -11,17 +11,11 @@ from gi.repository import Gtk, GObject # noqa E402
if TYPE_CHECKING:
from dzgui.const.enum import ServerTab
from dzgui.controllers.mc import Controller
from dzgui.views.trees.tree_base import TreeView
from dzgui.views.base import Notebook
class Statusbar(Gtk.Grid):
__gsignals__ = {
"server_page_changed": (GObject.SignalFlags.RUN_FIRST, None, (object,)),
"notebook_page_changed": (GObject.SignalFlags.RUN_FIRST, None, (object,)),
"notebook_page_returned": (GObject.SignalFlags.RUN_FIRST, None, (object,)),
"distcalc_ended": (GObject.SignalFlags.RUN_FIRST, None, (object, str)),
"server_row_changed": (GObject.SignalFlags.RUN_FIRST, None, ()),
}
def __init__(self, controller: "Controller") -> None:
super().__init__(orientation=Gtk.Orientation.HORIZONTAL)
@@ -46,37 +40,58 @@ class Statusbar(Gtk.Grid):
self.players = ""
controller.mediator.menu.connect(
"generic_treesel_changed", self._help_row_changed
)
controller.mediator.notebook.connect_after(
"switch-page", self._on_notebook_page_changed
)
self.connect("server_row_changed", self._on_server_row_changed)
self.connect("server_page_changed", self._on_server_page_changed)
self.connect("notebook_page_changed", self._on_notebook_page_changed)
self.connect("notebook_page_returned", self._on_notebook_page_returned)
self.connect("distcalc_ended", self._on_distcalc_ended)
@GObject.Signal(flags=GObject.SignalFlags.RUN_LAST, arg_types=(object,))
def server_page_changed(self, tab: ServerTab) -> None:
pass
@GObject.Signal(flags=GObject.SignalFlags.RUN_LAST, arg_types=())
def server_row_changed(self) -> None:
pass
@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, statusbar: Self, context: "NotebookPage"
self, notebook: "Notebook", child: Gtk.Widget, index: int
) -> None:
if self.controller.loaded is False:
return
status = context.dict["statusbar"]
bar = ""
if status is False:
self.set_by_context(context, "")
enum = notebook.get_page_by_enum()
show_statusbar = enum.dict["statusbar"]
if show_statusbar is False:
self.set_by_context(enum, "")
return
match context:
match enum:
case NotebookPage.MODS:
bar = self.controller.format_mod_statusbar()
case NotebookPage.HELP:
bar = self.controller.get_help_row()
case NotebookPage.SERVERS:
# TODO:
from dzgui.const.enum import ServerTab
self.emit("server_page_changed", ServerTab.BROWSER)
return
self.set_by_context(context, bar)
self.set_by_context(enum, bar)
def _on_notebook_page_returned(
self, statusbar: Self, prior_context: NotebookPage
@@ -96,9 +111,12 @@ class Statusbar(Gtk.Grid):
if dist is None:
self.set_by_context(context, self.playercount)
else:
pretty = f"{self.playercount} | Distance: {dist}"
pretty = self.append_distance(dist)
self.set_by_context(context, pretty)
def append_distance(self, dist: str) -> str:
return f"{self.playercount} | Distance: {dist}"
def _on_server_page_changed(self, statusbar: Self, context: "ServerTab") -> None:
count = self.controller.get_player_count()
self.playercount = count
@@ -134,16 +152,9 @@ class Statusbar(Gtk.Grid):
self.statusbar.push(meta, string)
self.set_cache(string)
@deprecated("use set_by_context()")
def refresh(self, row: "RowType") -> None:
# FIXME: brittle
if row is None:
formatted = ""
else:
formatted = self.format_metadata(row)
self.set_text(formatted, "Help")
@deprecated("use controller")
def format_metadata(self, row: "RowType") -> str:
prefix = row.dict["tooltip"]
return prefix
def _help_row_changed(self, tree: "TreeView", sel: Gtk.TreeSelection) -> None:
row = tree.get_value_at_index(1)
if self.controller.loaded is False:
return
tooltip = row.dict["tooltip"]
self.set_by_context(NotebookPage.HELP, tooltip)