chore: register signals

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

View File

@ -227,7 +227,7 @@ class Controller(GObject.GObject):
c = self.mediator.statusbar.statusbar.get_context_id(context) c = self.mediator.statusbar.statusbar.get_context_id(context)
self.mediator.statusbar.statusbar.pop(c) self.mediator.statusbar.statusbar.pop(c)
# TODO: use set_by_context() @deprecated("use set_by_context")
def set_statusbar(self, text: str, context: str) -> int: def set_statusbar(self, text: str, context: str) -> int:
msg_id = self.mediator.statusbar.set_text(text, context) msg_id = self.mediator.statusbar.set_text(text, context)
return msg_id return msg_id
@ -319,12 +319,8 @@ class Controller(GObject.GObject):
notebook = self.mediator.grid.notebook notebook = self.mediator.grid.notebook
notebook.focus_current() notebook.focus_current()
def set_statusbar_by_row(self, row: "RowType") -> None:
self.mediator.statusbar.refresh(row)
def toggle_server_panels(self, state: bool) -> None: def toggle_server_panels(self, state: bool) -> None:
# TODO: this is going to be signal dependent now # TODO: this is going to be signal dependent now, cf. map/unmap
# cf. map/unmap
#self.mediator.grid.emit("toggle panels", state) #self.mediator.grid.emit("toggle panels", state)
self.mediator.grid.toggle_filter_panel(state) self.mediator.grid.toggle_filter_panel(state)
self.mediator.grid.toggle_connect_panel(state) self.mediator.grid.toggle_connect_panel(state)
@ -579,7 +575,6 @@ class Controller(GObject.GObject):
for row in data: for row in data:
manager.append_row(row) manager.append_row(row)
treeview.set_loaded(True) treeview.set_loaded(True)
# TODO: emit custom "servers finished loading" signal
self.mediator.statusbar.emit("server_page_changed", context) self.mediator.statusbar.emit("server_page_changed", context)
treeview.grab_focus() treeview.grab_focus()

View File

@ -310,9 +310,6 @@ class Grid(Gtk.Grid):
MainController.register_widget("grid", self) MainController.register_widget("grid", self)
self.statusbar = Statusbar(MainController)
self.right_panel = RightPanel(MainController)
# self.bu = Gtk.Button(label="Shrink to fit", halign=Gtk.Align.END) # self.bu = Gtk.Button(label="Shrink to fit", halign=Gtk.Align.END)
# self.bu.connect("clicked", self._shrink) # self.bu.connect("clicked", self._shrink)
# self.crumb_box.add(self.bu) # self.crumb_box.add(self.bu)
@ -320,6 +317,9 @@ class Grid(Gtk.Grid):
self.notebook = Notebook() self.notebook = Notebook()
self.conpan = ConnectPanel(MainController) self.conpan = ConnectPanel(MainController)
self.statusbar = Statusbar(MainController)
self.right_panel = RightPanel(MainController)
self.breadcrumbs = Breadcrumbs(MainController) self.breadcrumbs = Breadcrumbs(MainController)
self.crumb_box = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL) self.crumb_box = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL)
self.crumb_box.add(self.breadcrumbs) self.crumb_box.add(self.breadcrumbs)

View File

@ -5,12 +5,14 @@ from dzgui.util.css import add_class, remove_class
from dzgui.util.strings import connect_panel, lan_panel from dzgui.util.strings import connect_panel, lan_panel
import gi import gi
gi.require_version("Gtk", "3.0") 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: if TYPE_CHECKING:
from dzgui.controllers.mc import Controller from dzgui.controllers.mc import Controller
def validate_port(text: str) -> bool: def validate_port(text: str) -> bool:
if text.isdigit(): if text.isdigit():
if int(text) < 1: if int(text) < 1:
@ -21,6 +23,7 @@ def validate_port(text: str) -> bool:
else: else:
return False return False
def validate_ip_or_id(text: str) -> bool: def validate_ip_or_id(text: str) -> bool:
try: try:
validate_ip(text) validate_ip(text)
@ -31,15 +34,13 @@ def validate_ip_or_id(text: str) -> bool:
else: else:
return False return False
class ValidatedEntry(Gtk.Entry): class ValidatedEntry(Gtk.Entry):
__gsignals__ = {
"string_validated": (GObject.SignalFlags.RUN_FIRST, None, (object,)),
}
def __init__(self, controller: "Controller", func: Callable) -> None: def __init__(self, controller: "Controller", func: Callable) -> None:
super().__init__( super().__init__(
hexpand=True, hexpand=True,
placeholder_text=connect_panel.placeholder, placeholder_text=connect_panel.placeholder,
tooltip_text=connect_panel.entry_tooltip tooltip_text=connect_panel.entry_tooltip,
) )
self.func: Callable self.func: Callable
@ -50,6 +51,10 @@ class ValidatedEntry(Gtk.Entry):
self.connect("key-press-event", self._on_entry_keypress) self.connect("key-press-event", self._on_entry_keypress)
self.connect("changed", self._on_text_changed) 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: def mark_valid(self) -> None:
self.emit("string_validated", True) self.emit("string_validated", True)
remove_class(self, self.classname) remove_class(self, self.classname)
@ -66,7 +71,9 @@ class ValidatedEntry(Gtk.Entry):
self.func = func self.func = func
def insert_icon(self) -> None: 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.set_icon_activatable(Gtk.EntryIconPosition.SECONDARY, True)
self.connect("icon-release", self._on_icon_release) self.connect("icon-release", self._on_icon_release)
@ -98,7 +105,6 @@ class ValidatedEntry(Gtk.Entry):
entry.set_text("") entry.set_text("")
self.remove_icon() self.remove_icon()
def _on_entry_keypress(self, entry: Gtk.Entry, event: Gdk.EventKey) -> None: def _on_entry_keypress(self, entry: Gtk.Entry, event: Gdk.EventKey) -> None:
if event.keyval == Gdk.KEY_Escape: if event.keyval == Gdk.KEY_Escape:
# NOTE: unselect text # NOTE: unselect text
@ -112,6 +118,7 @@ class IpEntry(ValidatedEntry):
self.set_placeholder_text(connect_panel.placeholder) self.set_placeholder_text(connect_panel.placeholder)
self.set_tooltip_text(connect_panel.entry_tooltip) self.set_tooltip_text(connect_panel.entry_tooltip)
class PortEntry(ValidatedEntry): class PortEntry(ValidatedEntry):
def __init__(self, controller: "Controller") -> None: def __init__(self, controller: "Controller") -> None:
super().__init__(controller, func=validate_port) super().__init__(controller, func=validate_port)

View File

@ -1,14 +1,20 @@
from typing import TYPE_CHECKING
from dzgui.const.constants import HELP_BUBBLE from dzgui.const.constants import HELP_BUBBLE
import gi import gi
gi.require_version("Gtk", "3.0") 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
class InfoEventBox(Gtk.EventBox): class InfoEventBox(Gtk.EventBox):
def __init__(self, text: str, parent: Gtk.Widget): def __init__(self, text: str, controller: "Controller"):
super().__init__(margin_start=10) super().__init__(margin_start=10)
self.parent = parent self.controller = controller
self.text = text self.text = text
self.icon = Gtk.Image.new_from_icon_name( self.icon = Gtk.Image.new_from_icon_name(
@ -26,14 +32,14 @@ class InfoEventBox(Gtk.EventBox):
self, eventbox: Gtk.EventBox, eventcrossing: Gdk.EventCrossing self, eventbox: Gtk.EventBox, eventcrossing: Gdk.EventCrossing
) -> None: ) -> None:
self.icon.set_opacity(1) self.icon.set_opacity(1)
self.parent.controller.set_statusbar(self.text, "Options") self.controller.set_statusbar(self.text, "Options")
def _on_leave_tooltip( def _on_leave_tooltip(
self, eventbox: Gtk.EventBox, eventcrossing: Gdk.EventCrossing self, eventbox: Gtk.EventBox, eventcrossing: Gdk.EventCrossing
) -> None: ) -> None:
self.icon.set_opacity(0.8) self.icon.set_opacity(0.8)
#self.parent.controller.set_statusbar("", "Options") # self.parent.controller.set_statusbar("", "Options")
self.parent.controller.remove_statusbar("Options") self.controller.remove_statusbar("Options")
def set_text(self, text: str) -> None: def set_text(self, text: str) -> None:
self.text = text self.text = text

View File

@ -1,7 +1,7 @@
from warnings import deprecated from warnings import deprecated
from typing import Self, Union, TYPE_CHECKING from typing import Self, Union, TYPE_CHECKING
from dzgui.const.enum import NotebookPage, RowType from dzgui.const.enum import NotebookPage, ServerTab
import gi import gi
@ -11,17 +11,11 @@ from gi.repository import Gtk, GObject # noqa E402
if TYPE_CHECKING: if TYPE_CHECKING:
from dzgui.const.enum import ServerTab from dzgui.const.enum import ServerTab
from dzgui.controllers.mc import Controller from dzgui.controllers.mc import Controller
from dzgui.views.trees.tree_base import TreeView
from dzgui.views.base import Notebook
class Statusbar(Gtk.Grid): 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: def __init__(self, controller: "Controller") -> None:
super().__init__(orientation=Gtk.Orientation.HORIZONTAL) super().__init__(orientation=Gtk.Orientation.HORIZONTAL)
@ -46,37 +40,58 @@ class Statusbar(Gtk.Grid):
self.players = "" 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_row_changed", self._on_server_row_changed)
self.connect("server_page_changed", self._on_server_page_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) 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( def _on_notebook_page_changed(
self, statusbar: Self, context: "NotebookPage" self, notebook: "Notebook", child: Gtk.Widget, index: int
) -> None: ) -> None:
if self.controller.loaded is False: if self.controller.loaded is False:
return return
status = context.dict["statusbar"] enum = notebook.get_page_by_enum()
bar = "" show_statusbar = enum.dict["statusbar"]
if status is False: if show_statusbar is False:
self.set_by_context(context, "") self.set_by_context(enum, "")
return return
match context: match enum:
case NotebookPage.MODS: case NotebookPage.MODS:
bar = self.controller.format_mod_statusbar() bar = self.controller.format_mod_statusbar()
case NotebookPage.HELP: case NotebookPage.HELP:
bar = self.controller.get_help_row() bar = self.controller.get_help_row()
case NotebookPage.SERVERS: case NotebookPage.SERVERS:
# TODO:
from dzgui.const.enum import ServerTab
self.emit("server_page_changed", ServerTab.BROWSER) self.emit("server_page_changed", ServerTab.BROWSER)
return return
self.set_by_context(context, bar) self.set_by_context(enum, bar)
def _on_notebook_page_returned( def _on_notebook_page_returned(
self, statusbar: Self, prior_context: NotebookPage self, statusbar: Self, prior_context: NotebookPage
@ -96,9 +111,12 @@ class Statusbar(Gtk.Grid):
if dist is None: if dist is None:
self.set_by_context(context, self.playercount) self.set_by_context(context, self.playercount)
else: else:
pretty = f"{self.playercount} | Distance: {dist}" pretty = self.append_distance(dist)
self.set_by_context(context, pretty) 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: def _on_server_page_changed(self, statusbar: Self, context: "ServerTab") -> None:
count = self.controller.get_player_count() count = self.controller.get_player_count()
self.playercount = count self.playercount = count
@ -134,16 +152,9 @@ class Statusbar(Gtk.Grid):
self.statusbar.push(meta, string) self.statusbar.push(meta, string)
self.set_cache(string) self.set_cache(string)
@deprecated("use set_by_context()") def _help_row_changed(self, tree: "TreeView", sel: Gtk.TreeSelection) -> None:
def refresh(self, row: "RowType") -> None: row = tree.get_value_at_index(1)
# FIXME: brittle if self.controller.loaded is False:
if row is None: return
formatted = "" tooltip = row.dict["tooltip"]
else: self.set_by_context(NotebookPage.HELP, tooltip)
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

View File

@ -28,15 +28,17 @@ from dzgui.const.constants import (
STEAM_CMD, STEAM_CMD,
VIEW_CONCEAL, VIEW_CONCEAL,
VIEW_REVEAL, VIEW_REVEAL,
) )
import gi import gi
gi.require_version("Gtk", "3.0") gi.require_version("Gtk", "3.0")
from gi.repository import Gtk, Gdk # noqa from gi.repository import Gtk, Gdk # noqa
if TYPE_CHECKING: if TYPE_CHECKING:
from dzgui.controllers.mc import Controller from dzgui.controllers.mc import Controller
class Options(Gtk.Box): class Options(Gtk.Box):
def __init__(self, controller: "Controller"): def __init__(self, controller: "Controller"):
super().__init__( super().__init__(
@ -115,8 +117,8 @@ class Options(Gtk.Box):
# NOTE: sensitivity state is updated after config file is loaded # NOTE: sensitivity state is updated after config file is loaded
self.force_button.set_sensitive(False) self.force_button.set_sensitive(False)
eb = InfoEventBox(strings.options.dl_eventbox, self) eb = InfoEventBox(strings.options.dl_eventbox, controller)
eb2 = InfoEventBox(strings.options.force_eventbox, self) eb2 = InfoEventBox(strings.options.force_eventbox, controller)
mod_rows = [ mod_rows = [
[LeftLabel(strings.options.install_mode), self.mod_install_toggle, eb], [LeftLabel(strings.options.install_mode), self.mod_install_toggle, eb],
@ -131,7 +133,7 @@ class Options(Gtk.Box):
self.branch_combo.append_text(strings.options.testing) self.branch_combo.append_text(strings.options.testing)
self.branch_combo.set_active(0) self.branch_combo.set_active(0)
self.branch_combo.connect("changed", self._on_branch_changed) self.branch_combo.connect("changed", self._on_branch_changed)
self.branch_eb = InfoEventBox("", self) self.branch_eb = InfoEventBox("", controller)
version_rows = [ version_rows = [
[LeftLabel(APPNAME_DAYZ), self.dayz_version_label], [LeftLabel(APPNAME_DAYZ), self.dayz_version_label],
@ -149,7 +151,7 @@ class Options(Gtk.Box):
margin_top=5, margin_top=5,
margin_bottom=10, margin_bottom=10,
homogeneous=True, homogeneous=True,
spacing=10 spacing=10,
) )
api_links_box.add(self.steam) api_links_box.add(self.steam)
api_links_box.add(self.bm) api_links_box.add(self.bm)
@ -167,15 +169,13 @@ class Options(Gtk.Box):
hexpand=True, hexpand=True,
) )
developers=Gtk.Button(label="Developers", halign=Gtk.Align.START) developers = Gtk.Button(label="Developers", halign=Gtk.Align.START)
developers.connect("clicked", self._on_developers_clicked) developers.connect("clicked", self._on_developers_clicked)
prefs = self.controller.get_prefs() prefs = self.controller.get_prefs()
is_developer = prefs.is_developer is_developer = prefs.is_developer
if is_developer: if is_developer:
grid.attach( grid.attach(developers, 1, 0, self.DEFAULT_WIDTH, self.DEFAULT_HEIGHT)
developers, 1, 0, self.DEFAULT_WIDTH, self.DEFAULT_HEIGHT
)
for frame in [ for frame in [
self.make_frame(api_box, strings.options.api_keys), self.make_frame(api_box, strings.options.api_keys),
@ -183,9 +183,7 @@ class Options(Gtk.Box):
self.make_frame(mods_grid, strings.options.mods), self.make_frame(mods_grid, strings.options.mods),
self.make_frame(version_grid, strings.options.version), self.make_frame(version_grid, strings.options.version),
]: ]:
grid.attach( grid.attach(frame, col, row, self.DEFAULT_WIDTH, self.DEFAULT_HEIGHT)
frame, col, row, self.DEFAULT_WIDTH, self.DEFAULT_HEIGHT
)
row += 1 row += 1
self.scrollable = Gtk.ScrolledWindow(vexpand=True) self.scrollable = Gtk.ScrolledWindow(vexpand=True)
@ -221,13 +219,11 @@ class Options(Gtk.Box):
entry.connect("insert-text", self._on_text_typed, context, button) entry.connect("insert-text", self._on_text_typed, context, button)
entry.connect("activate", self._on_field_activated, context, button) entry.connect("activate", self._on_field_activated, context, button)
entry.get_property("buffer").connect( entry.get_property("buffer").connect(
"deleted-text", self._on_text_deleted, context, button "deleted-text", self._on_text_deleted, context, button
) )
if private: if private:
entry.set_icon_from_icon_name( entry.set_icon_from_icon_name(Gtk.EntryIconPosition.SECONDARY, VIEW_REVEAL)
Gtk.EntryIconPosition.SECONDARY, VIEW_REVEAL
)
entry.set_icon_activatable(Gtk.EntryIconPosition.SECONDARY, True) entry.set_icon_activatable(Gtk.EntryIconPosition.SECONDARY, True)
entry.connect("icon-release", self._on_icon_release) entry.connect("icon-release", self._on_icon_release)
entry.set_visibility(False) entry.set_visibility(False)
@ -244,7 +240,7 @@ class Options(Gtk.Box):
return box return box
def _on_field_activated( def _on_field_activated(
self, entry: Gtk.Entry, context: Preferences, button: Gtk.Button self, entry: Gtk.Entry, context: Preferences, button: Gtk.Button
) -> None: ) -> None:
text = entry.get_text() text = entry.get_text()
if not self._is_valid_text(text, context): if not self._is_valid_text(text, context):
@ -265,9 +261,7 @@ class Options(Gtk.Box):
for record in rows: for record in rows:
col = 1 col = 1
for el in record: for el in record:
grid.attach( grid.attach(el, col, row, self.DEFAULT_WIDTH, self.DEFAULT_HEIGHT)
el, col, row, self.DEFAULT_WIDTH, self.DEFAULT_HEIGHT
)
col += 1 col += 1
row += 1 row += 1
return grid return grid
@ -299,9 +293,9 @@ class Options(Gtk.Box):
def _on_force_update_clicked(self, button: Gtk.Button) -> None: def _on_force_update_clicked(self, button: Gtk.Button) -> None:
# TODO: unimplemented # TODO: unimplemented
print("UNIMPLEMENTED") print("UNIMPLEMENTED")
#wait_msg = strings.dialog.updating_mods # wait_msg = strings.dialog.updating_mods
#show_wait_dialog = True # show_wait_dialog = True
#call_on_thread(show_wait_dialog, cmd, wait_msg, "") # call_on_thread(show_wait_dialog, cmd, wait_msg, "")
def _on_client_changed(self, combo: Gtk.ComboBoxText) -> None: def _on_client_changed(self, combo: Gtk.ComboBoxText) -> None:
# TODO: use two columns or constants here, not strings # TODO: use two columns or constants here, not strings
@ -320,14 +314,12 @@ class Options(Gtk.Box):
print("UNIMPLEMENTED") print("UNIMPLEMENTED")
print(branch) print(branch)
## TODO: needs to trigger download process ## TODO: needs to trigger download process
#self.controller.toggle_branch(branch) # self.controller.toggle_branch(branch)
#branch = combo.get_active_text().lower() # branch = combo.get_active_text().lower()
#self.controller.update_config("branch", branch) # self.controller.update_config("branch", branch)
#scripts/update # scripts/update
def _on_radio_toggled( def _on_radio_toggled(self, button: Gtk.RadioButton, context: Preferences) -> None:
self, button: Gtk.RadioButton, context: Preferences
) -> None:
try: try:
self.controller.toggle_config(context) self.controller.toggle_config(context)
except Exception: except Exception:
@ -342,12 +334,11 @@ class Options(Gtk.Box):
self.controller, self.controller,
strings.options.manual_sub_msg, strings.options.manual_sub_msg,
strings.self_workshop, strings.self_workshop,
self.uid self.uid,
) )
else: else:
self.force_button.set_sensitive(False) self.force_button.set_sensitive(False)
def _is_valid_text(self, text: str, context: Preferences) -> bool: def _is_valid_text(self, text: str, context: Preferences) -> bool:
if text.isspace(): if text.isspace():
return False return False
@ -458,7 +449,7 @@ class Options(Gtk.Box):
for el, conf_state in [ for el, conf_state in [
(self.mod_install_toggle, install), (self.mod_install_toggle, install),
(self.fullscreen_toggle, config["fullscreen"]), (self.fullscreen_toggle, config["fullscreen"]),
(self.distance_toggle, config["use_miles"]) (self.distance_toggle, config["use_miles"]),
]: ]:
el.get_children()[conf_state].set_active(True) el.get_children()[conf_state].set_active(True)
self._suppress_toggles(False) self._suppress_toggles(False)
@ -473,18 +464,14 @@ class Options(Gtk.Box):
field[1].get_children()[1].set_sensitive(False) field[1].get_children()[1].set_sensitive(False)
try: try:
pe_file_path = PeFile.get_pefile_path( pe_file_path = PeFile.get_pefile_path(steam_path, APPID_DAYZ)
steam_path, APPID_DAYZ
)
vers = PeFile.get_dayz_version(pe_file_path) vers = PeFile.get_dayz_version(pe_file_path)
dayz_version = PeFile.dayz_version_to_str(vers) dayz_version = PeFile.dayz_version_to_str(vers)
except Exception: except Exception:
dayz_version = strings.null dayz_version = strings.null
try: try:
exp_file_path = PeFile.get_pefile_path( exp_file_path = PeFile.get_pefile_path(steam_path, APPID_DAYZ_EXP)
steam_path, APPID_DAYZ_EXP
)
vers = PeFile.get_dayz_version(exp_file_path) vers = PeFile.get_dayz_version(exp_file_path)
dayz_exp_version = PeFile.dayz_version_to_str(vers) dayz_exp_version = PeFile.dayz_version_to_str(vers)
except Exception: except Exception:
@ -497,13 +484,16 @@ class Options(Gtk.Box):
active_combo = query.get_client_index(config["client"]) active_combo = query.get_client_index(config["client"])
self.client_combo.set_active(active_combo) self.client_combo.set_active(active_combo)
active_combo = 1 if config["branch"] == BETA_REPO else 0 active_combo = 1 if config["branch"] == BETA_REPO else 0
self.controller.suppress_signal(self, self.branch_combo, "_on_branch_changed", True) self.controller.suppress_signal(
self, self.branch_combo, "_on_branch_changed", True
)
self.branch_combo.set_active(active_combo) self.branch_combo.set_active(active_combo)
self.branch_combo.set_sensitive(prefs.allow_updates) self.branch_combo.set_sensitive(prefs.allow_updates)
self.controller.suppress_signal(self, self.branch_combo, "_on_branch_changed", False) self.controller.suppress_signal(
self, self.branch_combo, "_on_branch_changed", False
)
if prefs.allow_updates is True: if prefs.allow_updates is True:
msg = strings.options.self_update msg = strings.options.self_update
@ -517,7 +507,9 @@ class Options(Gtk.Box):
self.fullscreen_toggle, self.fullscreen_toggle,
self.distance_toggle, self.distance_toggle,
]: ]:
self.controller.suppress_signal(self, toggle.get_children()[0], "_on_radio_toggled", state) self.controller.suppress_signal(
self, toggle.get_children()[0], "_on_radio_toggled", state
)
def _on_icon_release( def _on_icon_release(
self, self,

View File

@ -7,6 +7,7 @@ from dzgui.util.keys import is_navkey
from dzgui.views.mixins.cursor_mixin import CursorMixin from dzgui.views.mixins.cursor_mixin import CursorMixin
import gi import gi
gi.require_version("Gtk", "3.0") gi.require_version("Gtk", "3.0")
from gi.repository import Gtk, GLib, Gdk, GObject, Pango # noqa from gi.repository import Gtk, GLib, Gdk, GObject, Pango # noqa
@ -16,8 +17,11 @@ if TYPE_CHECKING:
from dzgui.controllers.mc import Controller from dzgui.controllers.mc import Controller
from dzgui.const.enum import ContextMenuGroup from dzgui.const.enum import ContextMenuGroup
class TreeView(CursorMixin, Gtk.TreeView): # type: ignore class TreeView(CursorMixin, Gtk.TreeView): # type: ignore
def __init__(self, controller: "Controller", menu: "ContextMenuGroup" = None) -> None: def __init__(
self, controller: "Controller", menu: "ContextMenuGroup" = None
) -> None:
super().__init__( super().__init__(
enable_search=False, enable_search=False,
search_column=-1, search_column=-1,
@ -32,7 +36,6 @@ class TreeView(CursorMixin, Gtk.TreeView): # type: ignore
self.selected_row = self.get_selection() self.selected_row = self.get_selection()
self.selected_row.set_mode(Gtk.SelectionMode.SINGLE) self.selected_row.set_mode(Gtk.SelectionMode.SINGLE)
self.selected_row.connect("changed", self._on_tree_selection_changed) self.selected_row.connect("changed", self._on_tree_selection_changed)
self.connect("row-activated", self._on_row_activated) self.connect("row-activated", self._on_row_activated)
self.connect("key-press-event", self._on_keypress) self.connect("key-press-event", self._on_keypress)
self.connect("key-release-event", self._on_key_release) self.connect("key-release-event", self._on_key_release)
@ -41,22 +44,22 @@ class TreeView(CursorMixin, Gtk.TreeView): # type: ignore
def generic_treesel_changed(self, selection: Gtk.TreeSelection) -> None: def generic_treesel_changed(self, selection: Gtk.TreeSelection) -> None:
pass pass
@GObject.Signal(flags=GObject.SignalFlags.RUN_LAST, @GObject.Signal(
arg_types=(Gtk.TreePath, Gtk.TreeViewColumn) flags=GObject.SignalFlags.RUN_LAST, arg_types=(Gtk.TreePath, Gtk.TreeViewColumn)
) )
def generic_row_activated(self, def generic_row_activated(
path: Gtk.TreePath, self, path: Gtk.TreePath, column: Gtk.TreeViewColumn
column: Gtk.TreeViewColumn
) -> None: ) -> None:
pass pass
def signal_emission(func: Callable) -> Callable: # @deprecated("signals are localized now")
def wrapper(self, *args, **kwargs): # def signal_emission(func: Callable) -> Callable:
self.controller.block_signals() # def wrapper(self, *args, **kwargs):
func(self, *args, **kwargs) # self.controller.block_signals()
self.controller.unblock_signals() # func(self, *args, **kwargs)
# self.controller.unblock_signals()
return wrapper #
# return wrapper
def _separate(self, model: Gtk.ListStore, iter_: Gtk.TreeIter) -> bool: def _separate(self, model: Gtk.ListStore, iter_: Gtk.TreeIter) -> bool:
if model[iter_][0] == SEPARATOR: if model[iter_][0] == SEPARATOR:
@ -83,9 +86,7 @@ class TreeView(CursorMixin, Gtk.TreeView): # type: ignore
model, rows = sel.get_selected_rows() model, rows = sel.get_selected_rows()
return [model[row] for row in rows] return [model[row] for row in rows]
def _on_keypress( def _on_keypress(self, treeview: Gtk.TreeView, event: Gdk.EventKey) -> None:
self, treeview: Gtk.TreeView, event: Gdk.EventKey
) -> None:
if is_navkey(event.keyval): if is_navkey(event.keyval):
# TODO: if model is None # TODO: if model is None
@ -101,14 +102,13 @@ class TreeView(CursorMixin, Gtk.TreeView): # type: ignore
self._vim_nav(event) self._vim_nav(event)
return return
def _on_key_release( def _on_key_release(self, treeview: Gtk.TreeView, event: Gdk.EventKey) -> None:
self, treeview: Gtk.TreeView, event: Gdk.EventKey
) -> None:
# TODO: explain this better # TODO: explain this better
""" """
Suppresses spamming on keydown Suppresses spamming on keydown
""" """
#if event.keyval is Gdk.KEY_space: # TODO: multisel
# if event.keyval is Gdk.KEY_space:
# it = self.get_focused_row_iter() # it = self.get_focused_row_iter()
# self.get_selection().select_iter(it) # self.get_selection().select_iter(it)
# return True # return True
@ -169,7 +169,7 @@ class TreeView(CursorMixin, Gtk.TreeView): # type: ignore
path = pathlist[0] path = pathlist[0]
return path return path
@signal_emission # @signal_emission
def _on_row_activated( def _on_row_activated(
self, self,
treeview: Gtk.TreeView, treeview: Gtk.TreeView,

View File

@ -41,7 +41,6 @@ class MenuTreeView(TreeView):
self.set_row_separator_func(self._separate) self.set_row_separator_func(self._separate)
self.connect("generic_row_activated", self._parent_row_activated) self.connect("generic_row_activated", self._parent_row_activated)
self.connect("generic_treesel_changed", self._parent_selection_changed)
def _parent_row_activated( def _parent_row_activated(
self, tree: TreeView, path: Gtk.TreePath, column: Gtk.TreeViewColumn self, tree: TreeView, path: Gtk.TreePath, column: Gtk.TreeViewColumn
@ -69,13 +68,3 @@ class MenuTreeView(TreeView):
if row_type in docs: if row_type in docs:
# FIXME: prior method is returning a str, not enum # FIXME: prior method is returning a str, not enum
open_link_by_rowtype(row_type) open_link_by_rowtype(row_type)
def _parent_selection_changed(
self, base_class: TreeView, sel: Gtk.TreeSelection
) -> None:
row = self.get_value_at_index(1)
if row == "":
return
if self.controller.loaded is False:
return
self.controller.set_statusbar_by_row(row)

View File

@ -55,16 +55,16 @@ class ModTreeView(ModsMixin, ContextMixin, TreeView):
self.connect("button-press-event", self._on_mods_button_press) self.connect("button-press-event", self._on_mods_button_press)
self.connect("key-press-event", self._on_mods_keypress) self.connect("key-press-event", self._on_mods_keypress)
self.s = self.get_selection().get_selected_rows() # self.s = self.get_selection().get_selected_rows()
def _on_mods_keypress(self, widget: Gtk.Widget, event: Gdk.EventKey) -> None: def _on_mods_keypress(self, widget: Gtk.Widget, event: Gdk.EventKey) -> None:
# TODO: multiselect
# if event.keyval is Gdk.KEY_space: # if event.keyval is Gdk.KEY_space:
# it = self.get_focused_row_iter() # it = self.get_focused_row_iter()
# self.get_selection().select_iter(it) # self.get_selection().select_iter(it)
# path = self.get_focused_row_path() # path = self.get_focused_row_path()
# self.set_cursor(path) # self.set_cursor(path)
# return False # return False
# TODO: parse keys
self.present_menu(widget, event) self.present_menu(widget, event)
def _on_mods_button_press(self, widget: Gtk.Widget, event: Gdk.EventButton) -> None: def _on_mods_button_press(self, widget: Gtk.Widget, event: Gdk.EventButton) -> None:

View File

@ -34,8 +34,6 @@ class EnumeratedMenuItem(Gtk.MenuItem):
class ServerTreeView(TreeView): class ServerTreeView(TreeView):
__gsignals__ = {"distcalc_started": (GObject.SignalFlags.RUN_FIRST, None, ())}
def __init__( def __init__(
self, controller: "Controller", enum: ServerTab, menu: ContextMenuGroup self, controller: "Controller", enum: ServerTab, menu: ContextMenuGroup
) -> None: ) -> None:
@ -115,6 +113,10 @@ class ServerTreeView(TreeView):
GLib.timeout_add(QUEUE_CHECK_DELAY, self._check_result_queue) GLib.timeout_add(QUEUE_CHECK_DELAY, self._check_result_queue)
@GObject.Signal(flags=GObject.SignalFlags.RUN_FIRST, arg_types=())
def distcalc_started(self) -> None:
pass
def filter(self, mode: FilterMode, label: str) -> None: def filter(self, mode: FilterMode, label: str) -> None:
print("TOGGLE:", mode) print("TOGGLE:", mode)
print("LABEL: ", label) print("LABEL: ", label)