feat: lan button WIP

This commit is contained in:
aclist 2026-01-10 21:30:09 +09:00
parent 10037b86d8
commit e2ec093f67
9 changed files with 120 additions and 26 deletions

View File

@ -4,7 +4,7 @@ UDP_PORT = 27016
VM_FILE = "/proc/sys/vm/max_map_count"
MIN_COUNT = 1048576
REQUEST_TIMEOUT = 3
REQUEST_TIMEOUT = 1
APPNAME_DAYZ = "DayZ"
APPNAME_DAYZ_EXP = "DayZ Experimental"

View File

@ -435,3 +435,9 @@ HELP_MENU_ROWS = (
RowType.SEPARATOR,
RowType.THANKS,
)
class ServerTab(Enum):
BROWSER = 1
SAVED = 2
RECENT = 3
LAN = 4

View File

@ -652,7 +652,7 @@ class Controller:
def populate_model(self) -> None:
# TODO: always use same server model, store in servertreeview class
treeview = self.mediator.notebook.servers.get_active_treeview()
treeview = self.get_active_treeview()
if treeview.get_loaded() is False:
new_model = self.model_manager.new_model()
# NOTE: set_query_func()
@ -671,13 +671,14 @@ class Controller:
self.mediator.right_panel.focus_button_box()
def present_servers(self) -> None:
tree = self.get_active_treeview()
# TODO: abstract
self.grab_active_treeview()
self.update_server_status()
crumbs = self.mediator.servers.get_cached_label()
self.set_crumbs(crumbs)
tree.emit("on_distcalc_started")
# TODO: could emit this when treeview gains keyboard focus
#tree = self.get_active_treeview()
#tree.emit("on_distcalc_started")
def toggle_check(self, event: Gdk.EventKey) -> None:
keyname = Gdk.keyval_name(event.keyval)
@ -703,3 +704,6 @@ class Controller:
def get_dist_cache(self) -> dict[str, "Haversine"]:
return self.dist_cache
def toggle_lan_panel(self, state: bool) -> None:
self.mediator.grid.conpan.set_visible(state)

View File

@ -14,7 +14,8 @@ logger = logging.getLogger(__name__)
def get_latest_release() -> str | None:
tag = None
for url in [GITHUB_RELEASES, CODEBERG_RELEASES]:
# TODO: check order; github often has gateway errors
for url in [CODEBERG_RELEASES, GITHUB_RELEASES]:
try:
res = requests.get(url, timeout=REQUEST_TIMEOUT)
if res.status_code == 200:

View File

@ -217,6 +217,9 @@ class OuterWindow(Gtk.Window):
css.load_css()
MainController.open_page(NotebookPage.SERVERS)
# TODO: first run
MainController.mediator.grid.conpan.lan.set_visible(False)
self.grid.right_panel.sel_panel.hide()
def _on_delete_event(
self, window: "OuterWindow", event: Gdk.EventKey
@ -365,11 +368,11 @@ class Notebook(ScrollableMixin, Gtk.Notebook): # type: ignore
status = enum.dict["statusbar"]
MainController.set_crumbs(crumbs)
is_mods = True if enum is NotebookPage.MODS else False
is_servers = True if enum is NotebookPage.SERVERS else False
MainController.toggle_mod_panel(is_mods)
MainController.toggle_server_panels(is_servers)
#is_mods = True if enum is NotebookPage.MODS else False
#is_servers = True if enum is NotebookPage.SERVERS else False
# TODO: use signals internal to servers.py
#MainController.toggle_mod_panel(is_mods)
#MainController.toggle_server_panels(is_servers)
if status is False:
MainController.set_statusbar("")

View File

@ -1,6 +1,7 @@
from typing import TYPE_CHECKING
from dzgui.api.servers import validate_ip
from dzgui.const.constants import NO_EXPAND, NO_FILL, NO_PADDING
from dzgui.util.css import add_class, remove_class
from dzgui.util.strings import connect_panel
from dzgui.views.components.buttons import WebButton
@ -13,10 +14,38 @@ from gi.repository import Gtk, Gdk # noqa E402
if TYPE_CHECKING:
from dzgui.controllers.mc import Controller
class ConnectPanel(Gtk.Frame):
class LanPanel(Gtk.Frame):
def __init__(self, controller: "Controller") -> None:
super().__init__(margin_top=10, margin_bottom=5)
# TODO: use grid, more column spacing
# TODO: hide lan panel on other tabs
hbox = Gtk.Box(margin=10, spacing=5, halign=Gtk.Align.START)
# TODO: strings
label = BoldLabel("LAN query port")
radio1 = Gtk.RadioButton.new_with_label(None, "Default port (27016)")
radio2 = Gtk.RadioButton.new_from_widget(radio1)
radio2.set_label("Custom port")
self.entry = Gtk.Entry(placeholder_text="Query port")
self.button = Gtk.Button(label="Scan")
radio1.connect("toggled", self._on_radio_toggled)
hbox.pack_start(label, NO_EXPAND, NO_FILL, NO_PADDING)
hbox.pack_start(radio1, NO_EXPAND, NO_FILL, NO_PADDING)
hbox.pack_start(radio2, NO_EXPAND, NO_FILL, NO_PADDING)
hbox.pack_start(self.entry, NO_EXPAND, NO_FILL, NO_PADDING)
hbox.pack_start(self.button, NO_EXPAND, NO_FILL, NO_PADDING)
self.entry.set_sensitive(False)
self.button.set_sensitive(False)
self.add(hbox)
def _on_radio_toggled(self, button: Gtk.RadioButton) -> None:
for el in self.entry, self.button:
el.set_sensitive(not button.get_active())
class ConnectPanel(Gtk.Box):
def __init__(self, controller: "Controller") -> None:
super().__init__(orientation=Gtk.Orientation.VERTICAL)
COLS = 1
ROWS = 1
self.classname = "invalid-entry"
@ -74,7 +103,14 @@ class ConnectPanel(Gtk.Frame):
for el, sibling, pos, h_span, v_span in els:
self.grid.attach_next_to(el, sibling, pos, h_span, v_span)
self.add(self.grid)
self.lan = LanPanel(self.controller)
self.add(self.lan)
frame = Gtk.Frame(margin_top=10, margin_bottom=5)
frame.add(self.grid)
self.add(frame)
self.lan.set_visible(False)
def mark_valid(self) -> None:
self.conn_server.set_sensitive(True)

View File

@ -1,4 +1,4 @@
from typing import TYPE_CHECKING
from typing import Self, TYPE_CHECKING
from dzgui.views.trees.tree_mods import ModTreeView
import gi
@ -17,3 +17,12 @@ class Mods(Gtk.ScrolledWindow):
self.add(self.tree)
self.controller.register_widget("modtreeview", self.tree)
self.connect("map", self._on_map)
self.connect("unmap", self._on_unmap)
def _on_unmap(self, widget: Self) -> None:
self.controller.toggle_mod_panel(False)
def _on_map(self, widget: Self) -> None:
self.controller.toggle_mod_panel(True)

View File

@ -2,7 +2,7 @@ import logging
from typing import Self, TYPE_CHECKING
from dzgui.const.enum import ContextMenuGroup
from dzgui.const.enum import ContextMenuGroup, ServerTab
from dzgui.views.trees.tree_servers import ServerTreeView
from dzgui.util.strings import server_labels
@ -24,10 +24,10 @@ class ServerNotebook(Gtk.ScrolledWindow):
self.controller.register_widget("servers", self)
self.notebook = Gtk.Notebook(show_tabs=True)
self.browser = ServerTreeView(controller)
self.saved = ServerTreeView(controller)
self.recent = ServerTreeView(controller)
self.lan = ServerTreeView(controller)
self.browser = ServerTreeView(controller, ServerTab.BROWSER)
self.saved = ServerTreeView(controller, ServerTab.SAVED)
self.recent = ServerTreeView(controller, ServerTab.RECENT)
self.lan = ServerTreeView(controller, ServerTab.LAN)
self.lan.set_query_func(self.query_test)
# TODO: set context menu on init
@ -50,7 +50,6 @@ class ServerNotebook(Gtk.ScrolledWindow):
store = func()
if label == "LAN":
pass
#store.append(["BAR", "a", "a", "a", 1, 1, 1, "1:1", 0, 0, "a", False])
else:
store.append(["BAR", "a", "a", "a", 0, 0, 0, "189.127.165.207:2302", 0, 0, "a", False])
store.append(["BAR", "a", "a", "a", 0, 0, 0, "189.127.165.207:2302", 0, 0, "a", False])
@ -79,6 +78,14 @@ class ServerNotebook(Gtk.ScrolledWindow):
self.add(self.notebook)
self.notebook.connect_after("switch-page", self._on_page_changed)
self.connect("key-press-event", self._on_keypress)
self.connect("map", self._on_map)
self.connect("unmap", self._on_unmap)
def _on_map(self, widget: Self) -> None:
self.controller.toggle_server_panels(True)
def _on_unmap(self, widget: Self) -> None:
self.controller.toggle_server_panels(False)
def _on_keypress(self, widget: Self, event: Gdk.EventKey) -> None:
@ -94,7 +101,6 @@ class ServerNotebook(Gtk.ScrolledWindow):
def _on_page_changed(self, notebook: Gtk.Notebook, child: Gtk.Widget, index: int) -> None:
# TODO: abstract
# TODO: load on first run
label = self.notebook.get_tab_label_text(child)
if label is None:
return
@ -105,20 +111,28 @@ class ServerNotebook(Gtk.ScrolledWindow):
# TODO: strings
string = f"Servers > {text}"
self.controller.set_crumbs(string)
self.tab_cache = string
self.set_cached_label(string)
child.grab_focus()
# FIXME: doesn't fire on first run
#self.controller.update_server_status()
self.controller.present_servers()
self.controller.populate_model()
# TODO: start with lan panel hidden
# FIXME: grid conpan is not set up at init
# TODO: refresh button only usable if LAN has servers?
# or just remove it
#if self.get_active_treeview() is self.lan:
# self.controller.mediator.grid.conpan.lan.set_visible(True)
#else:
# self.controller.mediator.grid.conpan.lan.set_visible(False)
# TODO: put in controller
def query_test(self) -> None:
data = (["BAR", "a", "a", "a", 1, 1, 1, "185.207.214.16:2302", 0, 0, "a", False])
return data
def set_cached_label(self, label: str) -> None:
self.tab_cache = label
def get_cached_label(self) -> str:
return self.tab_cache

View File

@ -12,6 +12,7 @@ from dzgui.const.enum import (
RowType,
)
from dzgui.const.constants import UDP_PORT
from dzgui.const.enum import ServerTab
from dzgui.api.servers import Record
from dzgui.util.dist import CalcDist
from dzgui.util.keys import is_navkey
@ -40,11 +41,12 @@ class ServerTreeView(TreeView):
__gsignals__ = {
"on_distcalc_started": (GObject.SignalFlags.RUN_FIRST, None, ())
}
def __init__(self, controller: "Controller") -> None:
def __init__(self, controller: "Controller", enum: ServerTab) -> None:
super().__init__(controller)
QUEUE_CHECK_DELAY = 200
self.enum = enum
self.loaded = False
self.query_func: Callable = None
@ -97,9 +99,28 @@ class ServerTreeView(TreeView):
self.connect("key-press-event", self._on_server_keypress)
self.connect("generic_row_activated", self._parent_row_activated)
self.connect("generic_treesel_changed", self._parent_selection_changed)
self.connect("map", self._on_map)
self.connect("unmap", self._on_unmap)
self.connect("focus-in-event", self._on_kb_focus)
GLib.timeout_add(QUEUE_CHECK_DELAY, self._check_result_queue)
def _on_kb_focus(self, a, b) -> None:
self.emit("on_distcalc_started")
def get_enum(self) -> None:
return self.enum
def _on_map(self, a) -> None:
if self.get_enum() is ServerTab.LAN:
self.controller.mediator.grid.conpan.lan.set_visible(True)
def _on_unmap(self, a) -> None:
# TODO: could be done just when changing pages?
if self.get_enum() is ServerTab.LAN:
self.controller.mediator.grid.conpan.lan.set_visible(False)
def _on_key(self, menu: Gtk.Menu, event: Gdk.EventKey) -> bool | None:
if not is_navkey(event.keyval):
return False