feat: dynamic connect panel (WIP)

This commit is contained in:
aclist committed 2026-01-02 05:25:00 +09:00
1 parent 5f0c8f7654
commit 06e6065236
14 files changed
+185 -180

No files matched your search

+10 -3
View File
@@ -329,13 +329,15 @@ class Controller:
def toggle_server_panels(self, state: bool) -> None: def toggle_server_panels(self, state: bool) -> None:
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)
self.mediator.grid.toggle_refresh_button(state)
def toggle_mod_panel(self, state: bool) -> None: def toggle_mod_panel(self, state: bool) -> None:
self.mediator.grid.right_panel.sel_panel.set_visible(state) self.mediator.grid.right_panel.sel_panel.set_visible(state)
def show_developers_page(self) -> None: def show_developers_page(self) -> None:
self.open_page(NotebookPage.DEVELOPERS) self.open_page(NotebookPage.DEVELOPERS)
# TODO: focus first row # TODO: put cursor on first row
#self.mediator.developers.focus_first_row()
def open_page(self, page: NotebookPage) -> None: def open_page(self, page: NotebookPage) -> None:
self.mediator.grid.notebook.set_page_by_enum(page) self.mediator.grid.notebook.set_page_by_enum(page)
@@ -363,8 +365,7 @@ class Controller:
self.mediator.notebook.set_page_by_enum(button.opens) self.mediator.notebook.set_page_by_enum(button.opens)
self.set_crumbs(button.get_label()) self.set_crumbs(button.get_label())
# TODO: deprecated? def open_user_workshop(self, uid: str) -> None:
def open_self_workshop(self, uid: str) -> None:
# NOTE: uid may contain leading zeroes, not a real integer # NOTE: uid may contain leading zeroes, not a real integer
client = self.query_config(Preferences.CLIENT) client = self.query_config(Preferences.CLIENT)
open_workshop_page(uid, client) open_workshop_page(uid, client)
@@ -666,3 +667,9 @@ class Controller:
self.mediator.grid.right_panel.filters_vbox.toggle_check(11) self.mediator.grid.right_panel.filters_vbox.toggle_check(11)
case _: case _:
return False return False
def get_favorite_label(self) -> str | None:
fav = str(self.query_config(Preferences.FAV_LBL))
if len(fav) < 1:
return None
return fav
-2
View File
@@ -69,9 +69,7 @@ class ModelManager:
self.ping_cache: dict[str, int] = {} self.ping_cache: dict[str, int] = {}
self.map_store = ListStore(str) self.map_store = ListStore(str)
#self.row_store = self.new_model_from_class(MenuCols)
self.help_store = self.new_model_from_class(MenuCols) self.help_store = self.new_model_from_class(MenuCols)
self.mod_store = self.new_model_from_class(ModCols) self.mod_store = self.new_model_from_class(ModCols)
self.log_store = self.new_model_from_class(LogCols) self.log_store = self.new_model_from_class(LogCols)
self.modlist_store = self.new_model_from_class(ServerModCols) self.modlist_store = self.new_model_from_class(ServerModCols)
-19
View File
@@ -23,22 +23,3 @@ def is_ctrl_mask(event: Gdk.EventKey) -> bool:
return True return True
else: else:
return False return False
def is_filterkey(key: int) -> bool:
keys = (
Gdk.KEY_0,
Gdk.KEY_1,
Gdk.KEY_2,
Gdk.KEY_3,
Gdk.KEY_4,
Gdk.KEY_5,
Gdk.KEY_6,
Gdk.KEY_7,
Gdk.KEY_8,
Gdk.KEY_9,
Gdk.KEY_backslash,
Gdk.KEY_minus,
)
if key in keys:
return True
return False
+29
View File
@@ -508,4 +508,33 @@ server_labels = ServerLabels(
lan="LAN", lan="LAN",
) )
@dataclass(slots=True, frozen=True)
class ConnectPanel:
connect: str
add: str
edit: str
favorite: str
add_con: str
placeholder: str
entry_tooltip: str
add_tooltip: str
connect_tooltip: str
no_fav: str
connect_panel = ConnectPanel(
connect="Connect",
add="Add",
edit="Edit",
favorite="Favorite server",
add_con="Add/connect",
placeholder="Enter IP or Battlemetrics ID",
entry_tooltip=(
"- IP: Format as IP:Query port\ne.g. 192.168.1.1:27016\n"
"- Battlemetrics: numeric server ID\ne.g. 123456"
),
add_tooltip="Add to my servers",
connect_tooltip="Connect to this server",
no_fav="None set. Right click a server and select 'Set favorite' to set.",
)
distance_suffix = "Distance: calculating..." distance_suffix = "Distance: calculating..."
+10 -6
View File
@@ -66,6 +66,7 @@ logger = logging.getLogger(__name__)
warnings.filterwarnings("ignore", ".*g_value_get_int", Warning) warnings.filterwarnings("ignore", ".*g_value_get_int", Warning)
# TODO: move to controller # TODO: move to controller
# kilometer cache; note, user may change measurement it partway through, flush cache
#cache: dict[str, int] = {} #cache: dict[str, int] = {}
## TODO: move to configs/servers ## TODO: move to configs/servers
@@ -283,7 +284,7 @@ class Notebook(ScrollableMixin, Gtk.Notebook):
self.keys = Keybindings() self.keys = Keybindings()
self.settings = Options(MainController) self.settings = Options(MainController)
# NOTE: server and quad tables should have hexpand property set to True # NOTE: server, mod, and log tables should have hexpand property set to True
self.servers = ServerNotebook(MainController) self.servers = ServerNotebook(MainController)
self.mods = Mods(MainController) self.mods = Mods(MainController)
@@ -295,9 +296,8 @@ class Notebook(ScrollableMixin, Gtk.Notebook):
# TODO: change this class to scrolledwindow # TODO: change this class to scrolledwindow
self.thanks = ScrollableNote(Thanks(), back_button=False) self.thanks = ScrollableNote(Thanks(), back_button=False)
developers = Developers(MainController)
# TODO: change this class to scrolledwindow # TODO: change this class to scrolledwindow
developers = Developers(MainController)
self.developers = ScrollableNote(developers) self.developers = ScrollableNote(developers)
self.pages = { self.pages = {
@@ -314,7 +314,7 @@ class Notebook(ScrollableMixin, Gtk.Notebook):
self.indexes = {} self.indexes = {}
""" """
Note that due to historical reasons, GtkNotebook refuses to switch to a page Note that due to historical reasons, Gtk.Notebook refuses to switch to a page
unless the child widget is visible. Therefore, it is recommended to show child unless the child widget is visible. Therefore, it is recommended to show child
widgets before adding them to a notebook. widgets before adding them to a notebook.
""" """
@@ -436,9 +436,9 @@ class Grid(Gtk.Grid):
self.set_breadcrumbs(strings.label_main_menu) self.set_breadcrumbs(strings.label_main_menu)
self.notebook = Notebook() self.notebook = Notebook()
self.conpan = ConnectPanel() self.conpan = ConnectPanel(MainController)
self.attach(self.notebook, 0, 0, MAX_COLS, 1) self.attach(self.notebook, 0, 0, MAX_COLS, SINGLE_ROW)
els = ( els = (
(self.breadcrumbs, self.notebook, Gtk.PositionType.TOP, MAX_COLS, SINGLE_ROW), (self.breadcrumbs, self.notebook, Gtk.PositionType.TOP, MAX_COLS, SINGLE_ROW),
@@ -457,6 +457,10 @@ class Grid(Gtk.Grid):
def toggle_connect_panel(self, state: bool) -> None: def toggle_connect_panel(self, state: bool) -> None:
self.conpan.set_visible(state) self.conpan.set_visible(state)
def toggle_refresh_button(self, state: bool) -> None:
self.right_panel.refresh_button.set_visible(state)
# TODO make this method internal to Statusbar
def get_breadcrumbs(self) -> str: def get_breadcrumbs(self) -> str:
return self.breadcrumbs.get_text() return self.breadcrumbs.get_text()
@@ -1,5 +1,5 @@
from dzgui.views.components.icon import Icon from dzgui.views.components.icon import Icon
from dzgui.const.constants import REFRESH_ICON, WEB_BROWSER from dzgui.const.constants import REFRESH_ICON, WEB_BROWSER, INPUT_KEYBOARD
import gi import gi
gi.require_version("Gtk", "3.0") gi.require_version("Gtk", "3.0")
@@ -9,7 +9,6 @@ from gi.repository import Gtk # noqa E402
class IconButton(Gtk.Button): class IconButton(Gtk.Button):
def __init__(self, icon: str, margin: int = 0): def __init__(self, icon: str, margin: int = 0):
super().__init__() super().__init__()
i = Icon(icon, l_margin=margin) i = Icon(icon, l_margin=margin)
self.set_image(i) self.set_image(i)
self.set_image_position(Gtk.PositionType.RIGHT) self.set_image_position(Gtk.PositionType.RIGHT)
@@ -18,7 +17,6 @@ class IconButton(Gtk.Button):
class IconTextButton(IconButton): class IconTextButton(IconButton):
def __init__(self, icon: str, label: str): def __init__(self, icon: str, label: str):
super().__init__(icon, margin=5) super().__init__(icon, margin=5)
self.set_label(label) self.set_label(label)
@@ -31,4 +29,14 @@ class WebButton(IconTextButton):
class RefreshButton(IconTextButton): class RefreshButton(IconTextButton):
def __init__(self, label: str): def __init__(self, label: str):
super().__init__(icon=REFRESH_ICON, label=label) super().__init__(icon=REFRESH_ICON, label=label)
pass self.set_margin_top(10)
self.set_margin_start(80)
self.set_margin_end(80)
class KeysButton(IconTextButton):
def __init__(self, label: str):
super().__init__(icon=INPUT_KEYBOARD, label=label)
self.set_margin_top(10)
self.set_margin_start(80)
self.set_margin_end(80)
+55 -30
View File
@@ -1,47 +1,72 @@
from dzgui.util.format import embolden from typing import TYPE_CHECKING
from dzgui.views.components.web_button import WebButton
from dzgui.util.strings import connect_panel
from dzgui.views.components.buttons import WebButton
from dzgui.views.components.labels import BoldLabel
import gi import gi
gi.require_version("Gtk", "3.0") gi.require_version("Gtk", "3.0")
from gi.repository import Gtk # noqa E402 from gi.repository import Gtk # noqa E402
if TYPE_CHECKING:
from dzgui.controllers.mc import Controller
class ConnectPanel(Gtk.Frame): class ConnectPanel(Gtk.Frame):
def __init__(self) -> None: def __init__(self, controller: "Controller") -> None:
super().__init__(margin_top=10, margin_bottom=5) super().__init__(margin_top=10, margin_bottom=5)
self.label = Gtk.Label(label="Add/connect") COLS = 1
self.label2 = Gtk.Label(label="Favorite server") ROWS = 1
self.controller = controller
# TODO: strings self.entry = Gtk.Entry(
text = embolden("Favorite server") placeholder_text=connect_panel.placeholder,
self.label2.set_markup(text) hexpand=True,
self.entry1 = Gtk.Entry(placeholder_text="Enter IP or Battlemetrics ID", hexpand=False) tooltip_text=connect_panel.entry_tooltip
self.entry2 = Gtk.Entry() )
self.fav = Gtk.Label(label="MY favorite server very long title")
self.favedit = Gtk.Button("Edit")
self.edit = WebButton(label="EDIT")
self.favbutton = Gtk.Button(label="Connect")
# TODO: dedent # TODO: get ip as well?
long = """IP: Format as IP:Query port, e.g.\n192.168.1.1:27016\n user_fav = self.controller.get_favorite_label()
Battlemetrics: numeric server ID
"""
# TODO: add tooltips to all buttons server_name = user_fav if user_fav is not None else connect_panel.no_fav
self.entry1.set_tooltip_text(long) scrollable_label = Gtk.ScrolledWindow()
label = Gtk.Label(label=server_name, halign=Gtk.Align.START)
scrollable_label.add(label)
self.con = Gtk.Button(label="Connect") self.fav_button = Gtk.Button(label=connect_panel.connect,
self.addb = Gtk.Button(label="Add") tooltip_text=connect_panel.connect_tooltip
)
self.fav_edit = Gtk.Button(label=connect_panel.edit)
self.edit_server = WebButton(label="EDIT")
self.conn_server= Gtk.Button(label=connect_panel.connect,
tooltip_text=connect_panel.connect_tooltip
)
self.add_server = Gtk.Button(label=connect_panel.add,
tooltip_text=connect_panel.add_tooltip
)
self.conn_server.set_sensitive(False)
self.add_server.set_sensitive(False)
if server_name is None:
self.fav_button.set_sensitive(False)
add_label = BoldLabel(connect_panel.add_con)
conn_label = BoldLabel(connect_panel.favorite)
self.grid = Gtk.Grid(margin=10, vexpand=False, column_spacing=15, row_spacing=5) self.grid = Gtk.Grid(margin=10, vexpand=False, column_spacing=15, row_spacing=5)
self.grid.attach(self.label2, 0, 0, 3, 1) self.grid.attach(conn_label, 0, 0, COLS, ROWS)
button = Gtk.Button(label="Connect")
self.grid.attach_next_to(self.fav, self.label2, Gtk.PositionType.RIGHT, 3, 1) els = (
self.grid.attach_next_to(self.favbutton, self.fav, Gtk.PositionType.RIGHT, 3, 1) (scrollable_label, conn_label, Gtk.PositionType.RIGHT, 3, ROWS),
self.grid.attach_next_to(self.label, self.label2, Gtk.PositionType.BOTTOM, 3, 1) (self.fav_button, scrollable_label, Gtk.PositionType.RIGHT, COLS, ROWS),
self.grid.attach_next_to(self.entry1, self.label, Gtk.PositionType.RIGHT, 3, 1) (add_label, conn_label, Gtk.PositionType.BOTTOM, COLS, ROWS),
self.grid.attach_next_to(self.addb, self.entry1, Gtk.PositionType.RIGHT, 3, 1) (self.entry, scrollable_label, Gtk.PositionType.BOTTOM, COLS, ROWS),
self.grid.attach_next_to(self.con, self.addb, Gtk.PositionType.RIGHT, 3, 1) (self.add_server, self.fav_button, Gtk.PositionType.BOTTOM, COLS, ROWS),
(self.conn_server, self.add_server, Gtk.PositionType.RIGHT, COLS, ROWS),
)
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.add(self.grid)
+12 -17
View File
@@ -1,15 +1,15 @@
import logging import logging
from typing import Literal
import gi # noqa E402 import gi # noqa E402
gi.require_version("Gtk", "3.0") gi.require_version("Gtk", "3.0")
from gi.repository import Gtk, Gdk, Pango, GLib from gi.repository import Gtk, Gdk, Pango, GLib
from typing import Literal
from dzgui.util import strings
from dzgui.util.format import embolden
from dzgui.util.margins import set_surrounding_margins
from dzgui.const.enum import FilterMode from dzgui.const.enum import FilterMode
from dzgui.const.constants import NO_EXPAND, NO_FILL, NO_PADDING from dzgui.const.constants import NO_EXPAND, NO_FILL, NO_PADDING
from dzgui.util import strings
from dzgui.util.margins import set_surrounding_margins
from dzgui.views.components.labels import BoldLabel
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@@ -17,7 +17,6 @@ class FilterPanel(Gtk.Box):
def __init__(self, controller): def __init__(self, controller):
super().__init__(spacing=6, vexpand=False) super().__init__(spacing=6, vexpand=False)
# TODO: set strings in constants
self.default_filters = { self.default_filters = {
strings.filter_1pp: True, strings.filter_1pp: True,
strings.filter_day: True, strings.filter_day: True,
@@ -39,10 +38,11 @@ class FilterPanel(Gtk.Box):
self.checks = [] self.checks = []
self.maps_hr = [] self.maps_hr = []
self.enabled_filters = dict(self.default_filters) self.enabled_filters = dict(self.default_filters)
self.keyword_filter = "" self.keyword_filter: str
self.selected_map = strings.all_maps self.selected_map: str = strings.all_maps
self.prior_map = strings.all_maps self.prior_map: str = strings.all_maps
button_grid = Gtk.Grid( button_grid = Gtk.Grid(
halign=Gtk.Align.CENTER, column_spacing=5, column_homogeneous=True halign=Gtk.Align.CENTER, column_spacing=5, column_homogeneous=True
@@ -72,9 +72,7 @@ class FilterPanel(Gtk.Box):
self.set_margin_top(1) self.set_margin_top(1)
# TODO: strings # TODO: strings
text = embolden("Filters") self.filters_label = BoldLabel("Filters")
self.filters_label = Gtk.Label()
self.filters_label.set_markup(text)
self.keyword_entry = Gtk.Entry() self.keyword_entry = Gtk.Entry()
self.keyword_entry.set_placeholder_text("Filter by keyword") self.keyword_entry.set_placeholder_text("Filter by keyword")
@@ -99,16 +97,13 @@ class FilterPanel(Gtk.Box):
self.maps_entry.connect("key-press-event", self._on_map_entry_keypress) self.maps_entry.connect("key-press-event", self._on_map_entry_keypress)
# FIXME: only giving two params to pack_start # FIXME: only giving two params to pack_start
# cf. EXPAND # cf. EXPAND, NO_EXPAND
self.maps_combo.pack_start(renderer_text, True) self.maps_combo.pack_start(renderer_text, True)
self.maps_combo.connect("changed", self._on_map_changed) self.maps_combo.connect("changed", self._on_map_changed)
self.maps_combo.connect("key-press-event", self._on_combo_keypress) self.maps_combo.connect("key-press-event", self._on_combo_keypress)
# TODO: consolidate for el in self.filters_label, self.keyword_entry, self.maps_combo, button_grid:
self.pack_start(self.filters_label, NO_EXPAND, NO_FILL, NO_PADDING) self.pack_start(el, NO_EXPAND, NO_FILL, NO_PADDING)
self.pack_start(self.keyword_entry, NO_EXPAND, NO_FILL, NO_PADDING)
self.pack_start(self.maps_combo, NO_EXPAND, NO_FILL, NO_PADDING)
self.pack_start(button_grid, NO_EXPAND, NO_FILL, NO_PADDING)
def set_unique_maps(self, maps: list) -> None: def set_unique_maps(self, maps: list) -> None:
if len(maps) < 1: if len(maps) < 1:
+2 -4
View File
@@ -3,7 +3,7 @@ from typing import TYPE_CHECKING
from dzgui.const.enum import ModButton from dzgui.const.enum import ModButton
from dzgui.const.constants import NO_EXPAND, FILL, NO_PADDING from dzgui.const.constants import NO_EXPAND, FILL, NO_PADDING
from dzgui.util.strings import mod_panel from dzgui.util.strings import mod_panel
from dzgui.util.format import embolden from dzgui.views.components.labels import BoldLabel
import gi import gi
gi.require_version("Gtk", "3.0") gi.require_version("Gtk", "3.0")
@@ -27,9 +27,7 @@ class ModSelectionPanel(Gtk.Box):
self.controller = controller self.controller = controller
header = Gtk.Label() header = BoldLabel(mod_panel.header)
text = embolden(mod_panel.header)
header.set_markup(text)
self.main_panel = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=6) self.main_panel = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=6)
buttons = ( buttons = (
+41 -82
View File
@@ -7,8 +7,7 @@ from dzgui.views.components.buttonbox import ButtonBox
from dzgui.views.components.filter_panel import FilterPanel from dzgui.views.components.filter_panel import FilterPanel
from dzgui.views.components.mod_panel import ModSelectionPanel from dzgui.views.components.mod_panel import ModSelectionPanel
from dzgui.views.components.icon import Icon from dzgui.views.components.icon import Icon
from dzgui.views.components.web_button import RefreshButton from dzgui.views.components.buttons import RefreshButton, KeysButton
# TODO: rename web_button
from dzgui.const.constants import NO_EXPAND, NO_FILL, EXPAND, FILL, INPUT_KEYBOARD, NO_PADDING from dzgui.const.constants import NO_EXPAND, NO_FILL, EXPAND, FILL, INPUT_KEYBOARD, NO_PADDING
from dzgui.util import strings from dzgui.util import strings
@@ -17,71 +16,31 @@ class RightPanel(Gtk.Box):
def __init__(self, controller): def __init__(self, controller):
super().__init__(spacing=6, orientation=Gtk.Orientation.VERTICAL) super().__init__(spacing=6, orientation=Gtk.Orientation.VERTICAL)
self.controller = controller self.controller = controller
self.controller.register_widget("right_panel", self)
self.button_vbox = ButtonBox(controller) self.button_vbox = ButtonBox(controller)
self.filters_vbox = FilterPanel(controller) self.filters_vbox = FilterPanel(controller)
self.sel_panel = ModSelectionPanel(controller) self.sel_panel = ModSelectionPanel(controller)
self.controller.register_widget("right_panel", self) # TODO: strings, move strings into buttons.py
self.sel_panel.set_visible(False)
self.filters_vbox.set_visible(False)
# TODO: more custom button classes
self.ping = Gtk.Button(
label=strings.ping_servers,
margin_top=10,
margin_start=80,
margin_end=80,
tooltip_text=strings.ping_tooltip,
)
self.ping.connect("clicked", self._on_ping_clicked)
# TODO: drop after adding context menu row
self.debug_toggle = Gtk.ToggleButton(
label=strings.debug_mode,
margin_top=10,
margin_start=80,
margin_end=80,
tooltip_text=strings.debug_tooltip,
)
# TODO: icon
self.refresh_button = RefreshButton("Refresh") self.refresh_button = RefreshButton("Refresh")
self.refresh_button.set_margin_top(10) # TODO: tooltip, strings
self.refresh_button.set_margin_start(80) # TODO: update refresh button sensitivity on cooldown
self.refresh_button.set_margin_end(80) self.refresh_button.set_tooltip_text("Refresh server data")
self.refresh_button.connect("clicked", self._on_refresh_clicked) self.refresh_button.connect("clicked", self._on_refresh_clicked)
#if controller.query_config(Preferences.DEBUG) == True: self.keys = KeysButton(strings.keys_button)
# self.debug_toggle.set_active(True) self.keys.set_tooltip_text(strings.keys_tooltip)
#self.debug_toggle.connect("toggled", self._on_debug_toggled)
# TODO: make button class
i = Icon(INPUT_KEYBOARD)
i.set_margin_start(5)
self.keys = Gtk.Button(
label=strings.keys_button,
margin_start=80,
margin_end=80,
tooltip_text=strings.keys_tooltip,
image = i,
)
self.keys.set_image_position(Gtk.PositionType.RIGHT)
self.keys.connect("clicked", self._on_question_clicked) self.keys.connect("clicked", self._on_question_clicked)
for el in self.button_vbox, self.filters_vbox, self.refresh_button: for el in self.button_vbox, self.keys, self.filters_vbox, self.refresh_button:
self.pack_start(el, NO_EXPAND, FILL, NO_PADDING) self.pack_start(el, NO_EXPAND, FILL, NO_PADDING)
self.pack_start(self.sel_panel, NO_EXPAND, NO_FILL, NO_PADDING) self.pack_start(self.sel_panel, NO_EXPAND, NO_FILL, NO_PADDING)
self.pack_start(self.keys, NO_EXPAND, FILL, NO_PADDING)
def enable_ping_button(self, state: bool) -> None:
self.ping.set_visible(state)
# TODO: move to filter panel
def reinit_maps(self, rows: list) -> None: def reinit_maps(self, rows: list) -> None:
self.controller.reinit_map_store() self.controller.reinit_map_store()
# TODO: communicate with controller # TODO: communicate with controller
@@ -93,38 +52,38 @@ class RightPanel(Gtk.Box):
def _on_refresh_clicked(self, button: RefreshButton) -> None: def _on_refresh_clicked(self, button: RefreshButton) -> None:
self.controller.refresh_tree() self.controller.refresh_tree()
def _on_ping_clicked(self, button: Gtk.Button) -> None: #def _on_ping_clicked(self, button: Gtk.Button) -> None:
# TODO # # TODO
block_signals() # block_signals()
def _update_pings(): # def _update_pings():
# TODO # # TODO
rows = ModelManager.get_filtered() # rows = ModelManager.get_filtered()
with ThreadPoolExecutor(100) as executor: # with ThreadPoolExecutor(100) as executor:
futures = [ # futures = [
executor.submit(Servers.ping, i, row) # executor.submit(Servers.ping, i, row)
for i, row in enumerate(rows) # for i, row in enumerate(rows)
] # ]
wait(futures) # wait(futures)
for future in futures: # for future in futures:
res = future.result() # res = future.result()
path = Gtk.TreePath.new_from_indices([res.iteration]) # path = Gtk.TreePath.new_from_indices([res.iteration])
temp_model[path][9] = res.ping # temp_model[path][9] = res.ping
ModelManager.ping_cache[res.addr] = res.ping # ModelManager.ping_cache[res.addr] = res.ping
# TODO: drop/rewrite # # TODO: drop/rewrite
self.AppNav.treeview.set_model(temp_model) # self.AppNav.treeview.set_model(temp_model)
self.AppNav.treeview.wait_dialog.destroy() # self.AppNav.treeview.wait_dialog.destroy()
self.AppNav.treeview.grab_focus() # self.AppNav.treeview.grab_focus()
# TODO: # # TODO:
unblock_signals() # unblock_signals()
temp_model = self.AppNav.treeview.get_model() # temp_model = self.AppNav.treeview.get_model()
self.AppNav.treeview.set_model(None) # self.AppNav.treeview.set_model(None)
self.AppNav.treeview.wait_dialog = GenericDialog("Pinging servers", Popup.WAIT) # self.AppNav.treeview.wait_dialog = GenericDialog("Pinging servers", Popup.WAIT)
self.AppNav.treeview.wait_dialog.show_all() # self.AppNav.treeview.wait_dialog.show_all()
thread = threading.Thread(target=_update_pings, args=()) # thread = threading.Thread(target=_update_pings, args=())
thread.start() # thread.start()
def _on_question_clicked(self, button: Gtk.Button) -> None: def _on_question_clicked(self, button: Gtk.Button) -> None:
self.controller.open_keybindings() self.controller.open_keybindings()
+4 -3
View File
@@ -5,7 +5,7 @@ from dzgui.const.enum import Popup, Preferences
from dzgui.const.constants import NO_EXPAND, NO_FILL from dzgui.const.constants import NO_EXPAND, NO_FILL
from dzgui.util.open_links import open_user_workshop from dzgui.util.open_links import open_user_workshop
from dzgui.views.dialogs.generic import GenericDialog from dzgui.views.dialogs.generic import GenericDialog
from dzgui.views.components.web_button import WebButton from dzgui.views.components.buttons import WebButton
import gi import gi
gi.require_version("Gtk", "3.0") gi.require_version("Gtk", "3.0")
@@ -41,8 +41,9 @@ class WorkshopLinkDialog(GenericDialog):
def _on_button_clicked(self, button: Gtk.Button, uid: str) -> None: def _on_button_clicked(self, button: Gtk.Button, uid: str) -> None:
# TODO: currently checks user id on instantiation # TODO: currently checks user id on instantiation
client = self.controller.query_config(Preferences.CLIENT) self.controller.open_user_workshop(uid)
open_user_workshop(uid, client) #client = self.controller.query_config(Preferences.CLIENT)
#open_user_workshop(uid, client)
def _on_dialog_response( def _on_dialog_response(
self, dialog: Self, resp: Gtk.ResponseType self, dialog: Self, resp: Gtk.ResponseType
+3 -7
View File
@@ -3,8 +3,8 @@ from typing import Union, TYPE_CHECKING
from dzgui.const.enum import NotebookPage from dzgui.const.enum import NotebookPage
from dzgui.util.css import add_class from dzgui.util.css import add_class
from dzgui.util.format import embolden
from dzgui.util.strings import developers from dzgui.util.strings import developers
from dzgui.views.components.labels import BoldLabel
import gi # noqa E402 import gi # noqa E402
gi.require_version("Gtk", "3.0") gi.require_version("Gtk", "3.0")
@@ -35,13 +35,9 @@ class Developers(Gtk.Box):
back_button = Gtk.Button(label="Back", halign=Gtk.Align.START) back_button = Gtk.Button(label="Back", halign=Gtk.Align.START)
back_button.connect("clicked", self._on_back_clicked) back_button.connect("clicked", self._on_back_clicked)
paths_label = Gtk.Label()
text = embolden(developers.paths_label)
paths_label.set_markup(text)
prefs_label = Gtk.Label() paths_label = BoldLabel(developers.paths_label)
text = embolden(developers.prefs_label) prefs_label = BoldLabel(developers.prefs_label)
prefs_label.set_markup(text)
paths_tree = self._make_tree(self.controller.prefs.paths) paths_tree = self._make_tree(self.controller.prefs.paths)
prefs_tree = self._make_tree(self.controller.prefs) prefs_tree = self._make_tree(self.controller.prefs)
+4 -2
View File
@@ -8,7 +8,7 @@ from dzgui.util import strings, css, open_links
from dzgui.views.components.label import LeftLabel from dzgui.views.components.label import LeftLabel
from dzgui.views.components.eventbox import InfoEventBox from dzgui.views.components.eventbox import InfoEventBox
from dzgui.views.components.web_button import WebButton from dzgui.views.components.buttons import WebButton
from dzgui.views.dialogs.link_dialog import WorkshopLinkDialog from dzgui.views.dialogs.link_dialog import WorkshopLinkDialog
from dzgui.const.enum import Preferences, Popup from dzgui.const.enum import Preferences, Popup
@@ -303,6 +303,7 @@ class Options(Gtk.Box):
#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
client = combo.get_active_text() client = combo.get_active_text()
match client: match client:
case "Steam": case "Steam":
@@ -423,9 +424,10 @@ class Options(Gtk.Box):
return box return box
def populate_settings(self) -> None: def populate_settings(self) -> None:
# TODO: controller.get_config()
prefs = self.controller.get_prefs() prefs = self.controller.get_prefs()
if prefs.paths.config.is_file() is False: if prefs.paths.config.is_file() is False:
# in case file got deleted locally # NOTE: in case file got deleted locally
self.controller.spawn_dialog(strings.config_not_found, Popup.QUIT) self.controller.spawn_dialog(strings.config_not_found, Popup.QUIT)
return return
+3 -1
View File
@@ -180,6 +180,7 @@ class ServerTreeView(TreeView):
case Gdk.KEY_r: case Gdk.KEY_r:
self.refresh_player_count() self.refresh_player_count()
case Gdk.KEY_f: case Gdk.KEY_f:
# TODO: register filter panel instead of mediating thru right panel
self.controller.mediator.grid.right_panel.filters_vbox.keyword_entry.grab_focus() self.controller.mediator.grid.right_panel.filters_vbox.keyword_entry.grab_focus()
case Gdk.KEY_m: case Gdk.KEY_m:
self.controller.mediator.grid.right_panel.filters_vbox.maps_entry.grab_focus() self.controller.mediator.grid.right_panel.filters_vbox.maps_entry.grab_focus()
@@ -191,7 +192,7 @@ class ServerTreeView(TreeView):
self.controller.toggle_check(event) self.controller.toggle_check(event)
def set_context_menu(self, items: ContextMenuGroup) -> None: def set_context_menu(self, items: ContextMenuGroup) -> None:
# TODO: if debug is on, add raw command # TODO: if debug is on, add raw command copy to context menu
for item in items.value: for item in items.value:
menu_item = EnumeratedMenuItem(item) menu_item = EnumeratedMenuItem(item)
menu_item.connect("activate", self._on_menu_click) menu_item.connect("activate", self._on_menu_click)
@@ -199,6 +200,7 @@ class ServerTreeView(TreeView):
self.menu.show_all() self.menu.show_all()
def _on_menu_click(self, item) -> None: def _on_menu_click(self, item) -> None:
print(f"UNIMPLEMENTED: {item.enum}")
pass pass
def _on_server_button_release( def _on_server_button_release(