mirror of
https://github.com/aclist/dztui.git
synced 2026-11-10 03:50:38 +01:00
Compare commits
8
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c94e4e73db | ||
|
|
8da264686a | ||
|
|
598973104c | ||
|
|
15d4b71350 | ||
|
|
16d3df618a | ||
|
|
22dd8fc67f | ||
|
|
03fa707305 | ||
|
|
2479cbd41b |
No files matched your search
@@ -37,6 +37,8 @@ Users wishing to review the licenses to these components can inspect the `LICENS
|
||||
|
||||
Steam and the Steam logo are trademarks and/or registered trademarks of Valve Corporation in the U.S. and/or other countries.
|
||||
|
||||
DayZ is a trademark and brand of Bohemia Interactive a.s.
|
||||
|
||||
## Disclaimer
|
||||
|
||||
DZGUI is beta-quality software and is provided as-is.
|
||||
@@ -24,6 +24,14 @@ from typing import Any
|
||||
logger = logging.getLogger(APP_NAME)
|
||||
|
||||
|
||||
@dataclass
|
||||
class ModMeta:
|
||||
protocol: str
|
||||
published_id: str
|
||||
name: str
|
||||
timestamp: str
|
||||
|
||||
|
||||
def get_local_mod_ids(steam_path: Path) -> list[int]:
|
||||
workshop_path = get_local_mod_path(steam_path)
|
||||
mods = get_local_mods(workshop_path)
|
||||
|
||||
@@ -158,6 +158,9 @@ def build_gui(version: str, is_debug: bool) -> App | None:
|
||||
f.truncate(0)
|
||||
|
||||
if _is_steam_deck is False:
|
||||
# TODO: sudo escalation dialog
|
||||
# count = get_map_count()
|
||||
# TODO: move into module
|
||||
if FLATPAK_ROOT_PATH in lookup(XDG.config, Preferences.DEFAULT):
|
||||
has_client = has_flatpak_client()
|
||||
else:
|
||||
|
||||
@@ -5,6 +5,7 @@ from dzgui.util._json import read_json
|
||||
|
||||
from dzgui.const.enum import Preferences
|
||||
|
||||
|
||||
class ConfigFileError(Exception):
|
||||
pass
|
||||
|
||||
@@ -39,4 +40,4 @@ def get_favorites(path: Path) -> list[str]:
|
||||
|
||||
|
||||
def enum_to_key(enum: Preferences) -> str:
|
||||
return str(enum.dict["key"])
|
||||
return str(enum.key)
|
||||
+224
-206
@@ -1,7 +1,9 @@
|
||||
from __future__ import annotations
|
||||
from dataclasses import dataclass
|
||||
from enum import Enum
|
||||
from typing import Any, Self
|
||||
|
||||
from dzgui.util import strings
|
||||
from dzgui.strings import rows
|
||||
|
||||
|
||||
class Port(Enum):
|
||||
@@ -46,125 +48,61 @@ class FilterMode(Enum):
|
||||
TOGGLE_ON = 3
|
||||
|
||||
|
||||
class EnumWithAttrs(Enum):
|
||||
def __new__(cls, *args: Any, **kwargs: Any) -> Self:
|
||||
value = len(cls.__members__) + 1
|
||||
obj = object.__new__(cls)
|
||||
obj._value_ = value
|
||||
return obj
|
||||
|
||||
def __init__(self, d: dict):
|
||||
self.dict = d
|
||||
@dataclass(slots=True, frozen=True)
|
||||
class ModButtonMeta:
|
||||
label: str
|
||||
tooltip: str
|
||||
|
||||
|
||||
class Preferences(EnumWithAttrs):
|
||||
STEAM = {
|
||||
"key": "steam_api",
|
||||
}
|
||||
CLIENT = {
|
||||
"key": "client",
|
||||
}
|
||||
WINDOW = {
|
||||
"key": "fullscreen",
|
||||
}
|
||||
DIST = {
|
||||
"key": "use_miles",
|
||||
}
|
||||
NAME = {
|
||||
"key": "name",
|
||||
}
|
||||
DEFAULT = {
|
||||
"key": "default_steam_path",
|
||||
}
|
||||
FAV_LBL = {
|
||||
"key": "fav_label",
|
||||
}
|
||||
FAV_SRV = {
|
||||
"key": "fav_server",
|
||||
}
|
||||
IP_LIST = {
|
||||
"key": "ip_list",
|
||||
}
|
||||
START_TAB = {
|
||||
"key": "start_tab",
|
||||
}
|
||||
@dataclass(slots=True, frozen=True)
|
||||
class ButtonTypeMeta:
|
||||
label: str
|
||||
tooltip: str
|
||||
opens: NotebookPage | None
|
||||
|
||||
|
||||
class NotebookPage(EnumWithAttrs):
|
||||
OFFLINE = {"crumbs": strings.crumbs.offline, "statusbar": True}
|
||||
CHANGELOG = {"crumbs": strings.crumbs.changelog, "statusbar": True}
|
||||
DEVELOPERS = {"crumbs": strings.crumbs.developers, "statusbar": False}
|
||||
HELP = {"crumbs": strings.crumbs._help, "statusbar": True}
|
||||
KEYS = {"crumbs": strings.crumbs.keys, "statusbar": True}
|
||||
LOG = {"crumbs": strings.crumbs.log, "statusbar": True}
|
||||
MODS = {"crumbs": strings.crumbs.mods, "statusbar": True}
|
||||
OPTIONS = {"crumbs": strings.crumbs.options, "statusbar": False}
|
||||
SERVERS = {"crumbs": strings.crumbs.servers, "statusbar": True}
|
||||
THANKS = {"crumbs": strings.crumbs.thanks, "statusbar": True}
|
||||
CONNECTION = {"crumbs": "Connect", "statusbar": True}
|
||||
@dataclass(slots=True, frozen=True)
|
||||
class ConfigKey:
|
||||
key: str
|
||||
|
||||
|
||||
class RowType(EnumWithAttrs):
|
||||
# TODO: strings
|
||||
CHANGELOG = {
|
||||
"label": "View changelog",
|
||||
"tooltip": "Opens the DZGUI changelog",
|
||||
}
|
||||
SHOW_LOG = {
|
||||
"label": "Show debug log",
|
||||
"tooltip": "Read the DZGUI log generated since startup",
|
||||
}
|
||||
SEPARATOR = {
|
||||
"label": "SEPARATOR",
|
||||
"tooltip": "",
|
||||
}
|
||||
DUMP_LOG = {
|
||||
"label": "Output system info to log file",
|
||||
"tooltip": "Dump diagnostic data for troubleshooting",
|
||||
}
|
||||
DOCS = {
|
||||
"label": "Documentation/help files (GitHub) ⧉",
|
||||
"tooltip": "Open the DZGUI documentation in a browser",
|
||||
}
|
||||
DOCS_FALLBACK = {
|
||||
"label": "Documentation/help files (Codeberg mirror) ⧉",
|
||||
"tooltip": "Open the DZGUI documentation in a browser",
|
||||
}
|
||||
BUGS = {
|
||||
"label": "Report a bug (GitHub) ⧉",
|
||||
"tooltip": "Open the DZGUI issue tracker in a browser",
|
||||
}
|
||||
FORUM = {
|
||||
"label": "DZGUI Subreddit ⧉",
|
||||
"tooltip": "Open the DZGUI discussion forum in a browser",
|
||||
}
|
||||
SPONSOR = {
|
||||
"label": "Sponsor (GitHub) ⧉",
|
||||
"tooltip": "Sponsor development of the DZGUI project",
|
||||
}
|
||||
THANKS = {
|
||||
"label": "Special thanks",
|
||||
"tooltip": "A list of contributors, testers, and sponsors",
|
||||
}
|
||||
@dataclass(slots=True, frozen=True)
|
||||
class NotebookMeta:
|
||||
crumbs: str
|
||||
has_statusbar: bool
|
||||
|
||||
|
||||
# TODO: rename to ContextMenuItem
|
||||
class ContextMenu(EnumWithAttrs):
|
||||
ADD_NOTE = {"label": strings.add_note}
|
||||
ADD_SERVER = {"label": strings.add}
|
||||
CONNECT = {"label": strings.connect}
|
||||
COPY_LOG_CLIPBOARD = {"label": strings.copy_log}
|
||||
COPY_SERVER_IP = {"label": strings.copy_ip}
|
||||
COPY_SERVER_NAME = {"label": strings.copy_name}
|
||||
UNSUB_MOD = {"label": strings.unsub_mod}
|
||||
VALIDATE_MOD = {"label": strings.validate_mod}
|
||||
OPEN_WORKSHOP = {"label": strings.open_workshop}
|
||||
REFRESH_PLAYERS = {"label": strings.refresh_players}
|
||||
REMOVE_HISTORY = {"label": strings.remove_history}
|
||||
REMOVE_SERVER = {"label": strings.remove}
|
||||
SET_FAV = {"label": strings.add_fav}
|
||||
SHOW_DETAILS = {"label": strings.show_details}
|
||||
SHOW_MODS = {"label": strings.show_mods}
|
||||
@dataclass(slots=True, frozen=True)
|
||||
class RowMeta:
|
||||
label: str
|
||||
tooltip: str
|
||||
|
||||
|
||||
@dataclass(slots=True, frozen=True)
|
||||
class ContextMenuMeta:
|
||||
label: str
|
||||
|
||||
|
||||
class ContextMenuItem(Enum):
|
||||
ADD_NOTE = ContextMenuMeta(strings.add_note)
|
||||
ADD_SERVER = ContextMenuMeta(strings.add)
|
||||
CONNECT = ContextMenuMeta(strings.connect)
|
||||
COPY_LOG_CLIPBOARD = ContextMenuMeta(strings.copy_log)
|
||||
COPY_SERVER_IP = ContextMenuMeta(strings.copy_ip)
|
||||
COPY_SERVER_NAME = ContextMenuMeta(strings.copy_name)
|
||||
UNSUB_MOD = ContextMenuMeta(strings.unsub_mod)
|
||||
VALIDATE_MOD = ContextMenuMeta(strings.validate_mod)
|
||||
OPEN_WORKSHOP = ContextMenuMeta(strings.open_workshop)
|
||||
REFRESH_PLAYERS = ContextMenuMeta(strings.refresh_players)
|
||||
REMOVE_HISTORY = ContextMenuMeta(strings.remove_history)
|
||||
REMOVE_SERVER = ContextMenuMeta(strings.remove)
|
||||
SET_FAV = ContextMenuMeta(strings.add_fav)
|
||||
SHOW_DETAILS = ContextMenuMeta(strings.show_details)
|
||||
SHOW_MODS = ContextMenuMeta(strings.show_mods)
|
||||
|
||||
@property
|
||||
def label(self) -> str:
|
||||
return self.value.label
|
||||
|
||||
|
||||
class ContextMenuGroup(Enum):
|
||||
@@ -172,113 +110,193 @@ class ContextMenuGroup(Enum):
|
||||
Groupings of context menu items
|
||||
"""
|
||||
|
||||
SERVER_MOD = (ContextMenu.OPEN_WORKSHOP,)
|
||||
MOD = (ContextMenu.OPEN_WORKSHOP, ContextMenu.UNSUB_MOD, ContextMenu.VALIDATE_MOD)
|
||||
SERVER_MOD = (ContextMenuItem.OPEN_WORKSHOP,)
|
||||
MOD = (
|
||||
ContextMenuItem.OPEN_WORKSHOP,
|
||||
ContextMenuItem.UNSUB_MOD,
|
||||
ContextMenuItem.VALIDATE_MOD,
|
||||
)
|
||||
MOD_OFFLINE = (None,)
|
||||
LOG = (ContextMenu.COPY_LOG_CLIPBOARD,)
|
||||
LOG = (ContextMenuItem.COPY_LOG_CLIPBOARD,)
|
||||
SERVER_BROWSER = (
|
||||
ContextMenu.CONNECT,
|
||||
ContextMenu.ADD_SERVER,
|
||||
ContextMenu.SET_FAV,
|
||||
ContextMenu.COPY_SERVER_NAME,
|
||||
ContextMenu.COPY_SERVER_IP,
|
||||
ContextMenu.ADD_NOTE,
|
||||
ContextMenu.SHOW_MODS,
|
||||
ContextMenu.SHOW_DETAILS,
|
||||
ContextMenu.REFRESH_PLAYERS,
|
||||
ContextMenuItem.CONNECT,
|
||||
ContextMenuItem.ADD_SERVER,
|
||||
ContextMenuItem.SET_FAV,
|
||||
ContextMenuItem.COPY_SERVER_NAME,
|
||||
ContextMenuItem.COPY_SERVER_IP,
|
||||
ContextMenuItem.ADD_NOTE,
|
||||
ContextMenuItem.SHOW_MODS,
|
||||
ContextMenuItem.SHOW_DETAILS,
|
||||
ContextMenuItem.REFRESH_PLAYERS,
|
||||
)
|
||||
SCAN_LAN = (
|
||||
ContextMenu.CONNECT,
|
||||
ContextMenu.SET_FAV,
|
||||
ContextMenu.COPY_SERVER_NAME,
|
||||
ContextMenu.COPY_SERVER_IP,
|
||||
ContextMenu.ADD_NOTE,
|
||||
ContextMenu.SHOW_MODS,
|
||||
ContextMenu.SHOW_DETAILS,
|
||||
ContextMenu.REFRESH_PLAYERS,
|
||||
ContextMenuItem.CONNECT,
|
||||
ContextMenuItem.SET_FAV,
|
||||
ContextMenuItem.COPY_SERVER_NAME,
|
||||
ContextMenuItem.COPY_SERVER_IP,
|
||||
ContextMenuItem.ADD_NOTE,
|
||||
ContextMenuItem.SHOW_MODS,
|
||||
ContextMenuItem.SHOW_DETAILS,
|
||||
ContextMenuItem.REFRESH_PLAYERS,
|
||||
)
|
||||
SAVED = (
|
||||
ContextMenu.CONNECT,
|
||||
ContextMenu.SET_FAV,
|
||||
ContextMenu.REMOVE_SERVER,
|
||||
ContextMenu.COPY_SERVER_NAME,
|
||||
ContextMenu.COPY_SERVER_IP,
|
||||
ContextMenu.ADD_NOTE,
|
||||
ContextMenu.SHOW_MODS,
|
||||
ContextMenu.SHOW_DETAILS,
|
||||
ContextMenu.REFRESH_PLAYERS,
|
||||
ContextMenuItem.CONNECT,
|
||||
ContextMenuItem.SET_FAV,
|
||||
ContextMenuItem.REMOVE_SERVER,
|
||||
ContextMenuItem.COPY_SERVER_NAME,
|
||||
ContextMenuItem.COPY_SERVER_IP,
|
||||
ContextMenuItem.ADD_NOTE,
|
||||
ContextMenuItem.SHOW_MODS,
|
||||
ContextMenuItem.SHOW_DETAILS,
|
||||
ContextMenuItem.REFRESH_PLAYERS,
|
||||
)
|
||||
RECENT = (
|
||||
ContextMenu.CONNECT,
|
||||
ContextMenu.ADD_SERVER,
|
||||
ContextMenu.SET_FAV,
|
||||
ContextMenu.REMOVE_HISTORY,
|
||||
ContextMenu.COPY_SERVER_NAME,
|
||||
ContextMenu.COPY_SERVER_IP,
|
||||
ContextMenu.ADD_NOTE,
|
||||
ContextMenu.SHOW_MODS,
|
||||
ContextMenu.SHOW_DETAILS,
|
||||
ContextMenu.REFRESH_PLAYERS,
|
||||
ContextMenuItem.CONNECT,
|
||||
ContextMenuItem.ADD_SERVER,
|
||||
ContextMenuItem.SET_FAV,
|
||||
ContextMenuItem.REMOVE_HISTORY,
|
||||
ContextMenuItem.COPY_SERVER_NAME,
|
||||
ContextMenuItem.COPY_SERVER_IP,
|
||||
ContextMenuItem.ADD_NOTE,
|
||||
ContextMenuItem.SHOW_MODS,
|
||||
ContextMenuItem.SHOW_DETAILS,
|
||||
ContextMenuItem.REFRESH_PLAYERS,
|
||||
)
|
||||
|
||||
|
||||
class ModButton(EnumWithAttrs):
|
||||
SELECT_ALL = {
|
||||
"label": strings.mod_panel.select_all,
|
||||
"tooltip": strings.mod_panel.select_all_tooltip,
|
||||
}
|
||||
UNSELECT_ALL = {
|
||||
"label": strings.mod_panel.unselect_all,
|
||||
"tooltip": strings.mod_panel.unselect_all_tooltip,
|
||||
}
|
||||
HIGHLIGHT_STALE = {
|
||||
"label": strings.mod_panel.highlight_stale,
|
||||
"tooltip": strings.mod_panel.highlight_stale_tooltip,
|
||||
}
|
||||
UNHIGHLIGHT_STALE = {
|
||||
"label": strings.mod_panel.unhighlight_stale,
|
||||
"tooltip": strings.mod_panel.unhighlight_stale_tooltip,
|
||||
}
|
||||
UNSUB_SELECTED = {
|
||||
"label": strings.mod_panel.unsub_selected,
|
||||
"tooltip": strings.mod_panel.unsub_selected_tooltip,
|
||||
}
|
||||
SELECT_STALE = {
|
||||
"label": strings.mod_panel.select_stale,
|
||||
"tooltip": strings.mod_panel.select_stale_tooltip,
|
||||
}
|
||||
VALIDATE = {
|
||||
"label": strings.mod_panel.validate,
|
||||
"tooltip": strings.mod_panel.validate_tooltip,
|
||||
}
|
||||
class Preferences(Enum):
|
||||
STEAM = ConfigKey("steam_api")
|
||||
CLIENT = ConfigKey("client")
|
||||
WINDOW = ConfigKey("fullscreen")
|
||||
DIST = ConfigKey("use_miles")
|
||||
NAME = ConfigKey("name")
|
||||
DEFAULT = ConfigKey("default_steam_path")
|
||||
FAV_LBL = ConfigKey("fav_label")
|
||||
FAV_SRV = ConfigKey("fav_server")
|
||||
IP_LIST = ConfigKey("ip_list")
|
||||
START_TAB = ConfigKey("start_tab")
|
||||
|
||||
@property
|
||||
def key(self) -> str:
|
||||
return self.value.key
|
||||
|
||||
|
||||
class ButtonType(EnumWithAttrs):
|
||||
SERVERS = {
|
||||
"label": strings.buttons.servers_label,
|
||||
"tooltip": strings.buttons.servers_tooltip,
|
||||
"opens": NotebookPage.SERVERS,
|
||||
}
|
||||
MODS = {
|
||||
"label": strings.buttons.mods_label,
|
||||
"tooltip": strings.buttons.mods_tooltip,
|
||||
"opens": NotebookPage.MODS,
|
||||
}
|
||||
OPTIONS = {
|
||||
"label": strings.buttons.options_label,
|
||||
"tooltip": strings.buttons.options_tooltip,
|
||||
"opens": NotebookPage.OPTIONS,
|
||||
}
|
||||
HELP = {
|
||||
"label": strings.buttons.help_label,
|
||||
"tooltip": strings.buttons.help_tooltip,
|
||||
"opens": NotebookPage.HELP,
|
||||
}
|
||||
EXIT = {
|
||||
"label": strings.buttons.exit_label,
|
||||
"tooltip": strings.buttons.exit_tooltip,
|
||||
"opens": None,
|
||||
}
|
||||
class NotebookPage(Enum):
|
||||
OFFLINE = NotebookMeta(strings.crumbs.offline, True)
|
||||
CHANGELOG = NotebookMeta(strings.crumbs.changelog, True)
|
||||
DEVELOPERS = NotebookMeta(strings.crumbs.developers, False)
|
||||
HELP = NotebookMeta(strings.crumbs._help, True)
|
||||
KEYS = NotebookMeta(strings.crumbs.keys, True)
|
||||
LOG = NotebookMeta(strings.crumbs.log, True)
|
||||
MODS = NotebookMeta(strings.crumbs.mods, True)
|
||||
OPTIONS = NotebookMeta(strings.crumbs.options, False)
|
||||
SERVERS = NotebookMeta(strings.crumbs.servers, True)
|
||||
THANKS = NotebookMeta(strings.crumbs.thanks, True)
|
||||
CONNECTION = NotebookMeta(strings.crumbs.connect, True)
|
||||
|
||||
@property
|
||||
def crumbs(self) -> str:
|
||||
return self.value.crumbs
|
||||
|
||||
@property
|
||||
def has_statusbar(self) -> bool:
|
||||
return self.value.has_statusbar
|
||||
|
||||
|
||||
class RowType(Enum):
|
||||
CHANGELOG = RowMeta(rows.changelog_label, rows.changelog_status)
|
||||
SHOW_LOG = RowMeta(rows.log_label, rows.log_status)
|
||||
SEPARATOR = RowMeta(rows.separator_label, rows.separator_status)
|
||||
DUMP_LOG = RowMeta(rows.system_log_label, rows.system_log_status)
|
||||
DOCS = RowMeta(rows.docs_label, rows.docs_status)
|
||||
DOCS_FALLBACK = RowMeta(rows.docs_fallback_label, rows.docs_fallback_status)
|
||||
BUGS = RowMeta(rows.bugs_label, rows.bugs_status)
|
||||
FORUM = RowMeta(rows.forum_label, rows.forum_status)
|
||||
SPONSOR = RowMeta(rows.sponsor_label, rows.sponsor_status)
|
||||
THANKS = RowMeta(rows.thanks_label, rows.thanks_status)
|
||||
|
||||
@property
|
||||
def label(self) -> str:
|
||||
return self.value.label
|
||||
|
||||
@property
|
||||
def tooltip(self) -> str:
|
||||
return self.value.tooltip
|
||||
|
||||
|
||||
class ModButton(Enum):
|
||||
SELECT_ALL = ModButtonMeta(
|
||||
strings.mod_panel.select_all, strings.mod_panel.select_all_tooltip
|
||||
)
|
||||
UNSELECT_ALL = ModButtonMeta(
|
||||
strings.mod_panel.unselect_all, strings.mod_panel.unselect_all_tooltip
|
||||
)
|
||||
HIGHLIGHT_STALE = ModButtonMeta(
|
||||
strings.mod_panel.highlight_stale, strings.mod_panel.highlight_stale_tooltip
|
||||
)
|
||||
UNHIGHLIGHT_STALE = ModButtonMeta(
|
||||
strings.mod_panel.unhighlight_stale, strings.mod_panel.unhighlight_stale_tooltip
|
||||
)
|
||||
UNSUB_SELECTED = ModButtonMeta(
|
||||
strings.mod_panel.unsub_selected,
|
||||
strings.mod_panel.unsub_selected_tooltip,
|
||||
)
|
||||
SELECT_STALE = ModButtonMeta(
|
||||
strings.mod_panel.select_stale,
|
||||
strings.mod_panel.select_stale_tooltip,
|
||||
)
|
||||
VALIDATE = ModButtonMeta(
|
||||
strings.mod_panel.validate,
|
||||
strings.mod_panel.validate_tooltip,
|
||||
)
|
||||
|
||||
@property
|
||||
def label(self) -> str:
|
||||
return self.value.label
|
||||
|
||||
@property
|
||||
def tooltip(self) -> str:
|
||||
return self.value.tooltip
|
||||
|
||||
|
||||
class ButtonType(Enum):
|
||||
SERVERS = ButtonTypeMeta(
|
||||
strings.buttons.servers_label,
|
||||
strings.buttons.servers_tooltip,
|
||||
NotebookPage.SERVERS,
|
||||
)
|
||||
MODS = ButtonTypeMeta(
|
||||
strings.buttons.mods_label,
|
||||
strings.buttons.mods_tooltip,
|
||||
NotebookPage.MODS,
|
||||
)
|
||||
OPTIONS = ButtonTypeMeta(
|
||||
strings.buttons.options_label,
|
||||
strings.buttons.options_tooltip,
|
||||
NotebookPage.OPTIONS,
|
||||
)
|
||||
HELP = ButtonTypeMeta(
|
||||
strings.buttons.help_label,
|
||||
strings.buttons.help_tooltip,
|
||||
NotebookPage.HELP,
|
||||
)
|
||||
EXIT = ButtonTypeMeta(
|
||||
strings.buttons.exit_label,
|
||||
strings.buttons.exit_tooltip,
|
||||
None,
|
||||
)
|
||||
|
||||
@property
|
||||
def label(self) -> str:
|
||||
return self.value.label
|
||||
|
||||
@property
|
||||
def tooltip(self) -> str:
|
||||
return self.value.tooltip
|
||||
|
||||
@property
|
||||
def opens(self) -> NotebookPage | None:
|
||||
return self.value.opens
|
||||
|
||||
|
||||
HELP_MENU_ROWS = (
|
||||
|
||||
@@ -8,7 +8,7 @@ import dzgui.util._json as JSON # noqa
|
||||
|
||||
from dzgui.const.enum import (
|
||||
ButtonType,
|
||||
ContextMenu,
|
||||
ContextMenuItem,
|
||||
FilterMode,
|
||||
NotebookPage,
|
||||
Preferences,
|
||||
@@ -196,7 +196,9 @@ class Controller(GObject.GObject):
|
||||
def show_developers_page(self) -> None:
|
||||
self.open_page(NotebookPage.DEVELOPERS)
|
||||
|
||||
def open_page(self, page: NotebookPage) -> None:
|
||||
def open_page(self, page: NotebookPage | None) -> None:
|
||||
if page is None:
|
||||
return
|
||||
self.mediator.grid.notebook.set_page_by_enum(page)
|
||||
|
||||
def open_page_by_button(self, button: "ContextualButton") -> None:
|
||||
@@ -262,7 +264,7 @@ class Controller(GObject.GObject):
|
||||
logger.critical(e)
|
||||
return
|
||||
|
||||
def menu_action(self, action: ContextMenu, tree: "ServerTreeView") -> None:
|
||||
def menu_action(self, action: ContextMenuItem, tree: "ServerTreeView") -> None:
|
||||
context_man = ContextMenuManager(tree, self)
|
||||
context_man.process(action)
|
||||
|
||||
@@ -274,7 +276,7 @@ class Controller(GObject.GObject):
|
||||
except Exception as e:
|
||||
dialog = ExceptionDialog(self, str(e))
|
||||
dialog.show_all()
|
||||
dialog.run()
|
||||
dialog.run() # type: ignore[no-untyped-call]
|
||||
|
||||
def select_colorized(self) -> None:
|
||||
mod_man = self.mediator.modtreeview.get_mod_man()
|
||||
@@ -308,7 +310,7 @@ class Controller(GObject.GObject):
|
||||
except Exception as e:
|
||||
dialog = ExceptionDialog(self, str(e))
|
||||
dialog.show_all()
|
||||
dialog.run()
|
||||
dialog.run() # type: ignore[no-untyped-call]
|
||||
|
||||
def update_steam_api_key(self, text: str) -> None:
|
||||
self.config_man.update_steam_api_key(text)
|
||||
@@ -365,12 +367,11 @@ class Controller(GObject.GObject):
|
||||
filter_man = self.get_filter_man()
|
||||
return filter_man.get_map_store()
|
||||
|
||||
def get_enabled_filters(self) -> dict:
|
||||
def get_enabled_filters(self) -> dict[str, bool]:
|
||||
filter_man = self.get_filter_man()
|
||||
return filter_man.get_filters()
|
||||
|
||||
# FIXME: wipe maps store when changing tabs if model is none
|
||||
|
||||
def has_server_model(self) -> bool:
|
||||
treeview = self.get_active_treeview()
|
||||
proxy_man = treeview.get_proxy_man()
|
||||
|
||||
@@ -124,7 +124,7 @@ class ConfigManager:
|
||||
return False
|
||||
|
||||
def enum_to_key(self, enum: Preferences) -> str:
|
||||
return str(enum.dict["key"])
|
||||
return str(enum.key)
|
||||
|
||||
def toggle_config(self, key: Preferences) -> None:
|
||||
try:
|
||||
|
||||
@@ -48,7 +48,7 @@ from dzgui.strings.dialogs import (
|
||||
waiting_for_directories,
|
||||
)
|
||||
from dzgui.strings import kb
|
||||
from dzgui.strings.server_mods import checkmark, resync, invalid_mod
|
||||
from dzgui.strings.server_mods import checkmark, resync
|
||||
from dzgui.util.format import format_exception, format_mib
|
||||
from dzgui.util.strings import dialog, server_timeout
|
||||
from dzgui.util.symlink import rebuild_symlinks
|
||||
@@ -197,8 +197,9 @@ class ConnectionManager:
|
||||
|
||||
is_last = self.is_last_server()
|
||||
|
||||
# TODO: strings
|
||||
invalid_mods = [
|
||||
(mod[0], mod[1]) for mod in remote_mods if mod[2] == invalid_mod
|
||||
(mod[0], mod[1]) for mod in remote_mods if mod[2] == "Invalid mod"
|
||||
]
|
||||
|
||||
prereqs = Prerequisites(
|
||||
@@ -276,7 +277,8 @@ class ConnectionManager:
|
||||
for mod in alpha_mods:
|
||||
# NOTE: if the mod is neither synched or out of date, it is a malformed mod
|
||||
if mod[2] == "":
|
||||
mod[2] = invalid_mod
|
||||
# TODO: strings
|
||||
mod[2] = "Invalid mod"
|
||||
|
||||
return alpha_mods, missing_mods
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@ import logging
|
||||
from typing import TYPE_CHECKING
|
||||
|
||||
from dzgui.const.constants import APP_NAME
|
||||
from dzgui.const.enum import ContextMenu, Preferences
|
||||
from dzgui.const.enum import ContextMenuItem, Preferences
|
||||
from dzgui.util.clip import copy_clipboard
|
||||
from dzgui.util.open_links import open_workshop_page
|
||||
|
||||
@@ -34,7 +34,7 @@ class ContextMenuManager:
|
||||
self.controller = controller
|
||||
self.treeview = treeview
|
||||
|
||||
def process(self, action: ContextMenu) -> None:
|
||||
def process(self, action: ContextMenuItem) -> None:
|
||||
if isinstance(self.treeview, ServerTreeView):
|
||||
record = self.treeview.get_record()
|
||||
if record is None:
|
||||
@@ -42,14 +42,14 @@ class ContextMenuManager:
|
||||
|
||||
match action:
|
||||
# UNTHREADED
|
||||
case ContextMenu.ADD_NOTE:
|
||||
case ContextMenuItem.ADD_NOTE:
|
||||
dialog = NoteDialog(self.controller)
|
||||
dialog.run()
|
||||
case ContextMenu.COPY_SERVER_IP:
|
||||
dialog.run() # type: ignore[no-untyped-call]
|
||||
case ContextMenuItem.COPY_SERVER_IP:
|
||||
self.copy_server_ip()
|
||||
case ContextMenu.COPY_SERVER_NAME:
|
||||
case ContextMenuItem.COPY_SERVER_NAME:
|
||||
self.copy_server_name()
|
||||
case ContextMenu.SET_FAV:
|
||||
case ContextMenuItem.SET_FAV:
|
||||
name = self.treeview.get_value_at_index(0)
|
||||
# NOTE: fully qualified ip
|
||||
fqip = self.treeview.get_record_string()
|
||||
@@ -58,40 +58,40 @@ class ContextMenuManager:
|
||||
self.controller.set_fav(name, fqip, simple)
|
||||
|
||||
# THREADED
|
||||
case ContextMenu.ADD_SERVER:
|
||||
case ContextMenuItem.ADD_SERVER:
|
||||
self.controller.add_by_record(record)
|
||||
case ContextMenu.CONNECT:
|
||||
case ContextMenuItem.CONNECT:
|
||||
self.controller.connect_by_record(record)
|
||||
case ContextMenu.REFRESH_PLAYERS:
|
||||
case ContextMenuItem.REFRESH_PLAYERS:
|
||||
self.controller.refresh_players(record)
|
||||
case ContextMenu.REMOVE_HISTORY:
|
||||
case ContextMenuItem.REMOVE_HISTORY:
|
||||
self.controller.remove_from_history(record)
|
||||
case ContextMenu.REMOVE_SERVER:
|
||||
case ContextMenuItem.REMOVE_SERVER:
|
||||
self.controller.remove_by_record(record)
|
||||
case ContextMenu.SHOW_DETAILS:
|
||||
case ContextMenuItem.SHOW_DETAILS:
|
||||
self.controller.get_details(record)
|
||||
case ContextMenu.SHOW_MODS:
|
||||
case ContextMenuItem.SHOW_MODS:
|
||||
self.controller.get_modlist(record)
|
||||
|
||||
if isinstance(self.treeview, (ModTreeView, OfflineModTreeView)):
|
||||
match action:
|
||||
case ContextMenu.OPEN_WORKSHOP:
|
||||
case ContextMenuItem.OPEN_WORKSHOP:
|
||||
self.open_mod_page()
|
||||
case ContextMenu.UNSUB_MOD:
|
||||
case ContextMenuItem.UNSUB_MOD:
|
||||
self.controller.unsub_mods(self.treeview)
|
||||
case ContextMenu.VALIDATE_MOD:
|
||||
case ContextMenuItem.VALIDATE_MOD:
|
||||
self.controller.validate_mods(self.treeview)
|
||||
case _:
|
||||
pass
|
||||
|
||||
if isinstance(self.treeview, LogTreeView):
|
||||
match action:
|
||||
case ContextMenu.COPY_LOG_CLIPBOARD:
|
||||
case ContextMenuItem.COPY_LOG_CLIPBOARD:
|
||||
self.copy_log()
|
||||
|
||||
if isinstance(self.treeview, ServerModTreeView):
|
||||
match action:
|
||||
case ContextMenu.OPEN_WORKSHOP:
|
||||
case ContextMenuItem.OPEN_WORKSHOP:
|
||||
self.open_mod_page()
|
||||
|
||||
def copy_server_ip(self) -> None:
|
||||
|
||||
@@ -2,7 +2,7 @@ from typing import TYPE_CHECKING
|
||||
|
||||
from dzgui.model.model_factory import ModelFactory
|
||||
from dzgui.util import strings
|
||||
from dzgui.strings.filters import all_maps
|
||||
from dzgui.util.strings import all_maps
|
||||
|
||||
if TYPE_CHECKING:
|
||||
from dzgui.model.model_factory import FastInsertListStore
|
||||
@@ -106,10 +106,16 @@ class FilterManager:
|
||||
|
||||
self.reinit_map_store()
|
||||
maps.sort()
|
||||
clean = [m for m in maps if m != all_maps]
|
||||
for m in clean:
|
||||
for m in maps:
|
||||
# TODO: strings
|
||||
if m == "All maps":
|
||||
continue
|
||||
self.append_map([m])
|
||||
|
||||
# TODO: currently unused
|
||||
def get_unique_maps(self) -> list[str]:
|
||||
return [row[0] for row in self.map_store if row[0] != "All maps"]
|
||||
|
||||
def get_all_filters(self) -> tuple:
|
||||
map_name = self.get_active_map_name()
|
||||
enabled = self.get_filters()
|
||||
|
||||
@@ -147,7 +147,7 @@ class ModelFactory:
|
||||
|
||||
def make_help_store(self) -> FastInsertListStore:
|
||||
store = self.new_model_from_class(MenuCols)
|
||||
rows = [[row.dict["label"], row] for row in HELP_MENU_ROWS]
|
||||
rows = [[row.label, row] for row in HELP_MENU_ROWS]
|
||||
store.extend(rows)
|
||||
return store
|
||||
|
||||
|
||||
@@ -5,7 +5,6 @@ from typing import Any, TYPE_CHECKING, Union
|
||||
from dzgui.const.enum import FilterMode
|
||||
from dzgui.model.model_factory import ModelFactory
|
||||
from dzgui.util import strings
|
||||
from dzgui.strings import filters as str_filters
|
||||
|
||||
if TYPE_CHECKING:
|
||||
from dzgui.managers.filter import FilterManager
|
||||
@@ -176,7 +175,7 @@ class ProxyModelManager:
|
||||
rows = self.filtered
|
||||
sel_map = self.filter_man.get_active_map_name()
|
||||
|
||||
if sel_map == str_filters.all_maps:
|
||||
if sel_map == strings.all_maps:
|
||||
return rows
|
||||
|
||||
rows = [row for row in rows if row[1] == sel_map]
|
||||
|
||||
@@ -1,16 +1,2 @@
|
||||
clipboard_button = "Copy to clipboard"
|
||||
clipboard_ip_button = "Copy IP to clipboard"
|
||||
|
||||
dock_button_collapse = "Collapse the connection panel"
|
||||
dock_button_expand = "Expand the connection panel"
|
||||
|
||||
workshop = "Steam Workshop"
|
||||
workshop_tooltip = "Open your Workshop subscriptions"
|
||||
|
||||
version_notifier = "Copied!"
|
||||
version_tooltip = "Click to copy to clipboard"
|
||||
|
||||
update_button = "Updates available"
|
||||
|
||||
unset_button_label = "Unset"
|
||||
unset_button_tooltip = "Unset this server as favorite"
|
||||
@@ -29,5 +29,3 @@ toggle_calc = "Toggle calculator"
|
||||
|
||||
server_details = "Server details"
|
||||
server_message = "Server message"
|
||||
|
||||
caught_cancel_signal = "Caught cancel signal, cleaning up"
|
||||
@@ -1,4 +0,0 @@
|
||||
all_maps = "All maps"
|
||||
filters_heading = "Filters"
|
||||
keyword_placeholder = "Filter by keyword"
|
||||
map_placeholder = "Filter by map"
|
||||
@@ -1,2 +1 @@
|
||||
tab_changed_label = "*"
|
||||
selectable_tree = "Ctrl-click to select multiple; Shift-click to select a range."
|
||||
@@ -1,5 +0,0 @@
|
||||
dialog_title = "Add a short note/reminder"
|
||||
dialog_subtitle = "Limit 30 chars"
|
||||
delete_button = "Delete note"
|
||||
ok_button = "Update note"
|
||||
current_note = "Current note: '{0}'"
|
||||
@@ -16,9 +16,7 @@ lan_combo = "LAN"
|
||||
fullscreen_eventbox = "This option is not available on Steam Deck."
|
||||
save_button = "Save"
|
||||
|
||||
api_placeholder = "Enter API key"
|
||||
api_failed = "API validation failed"
|
||||
api_validate = "Validate"
|
||||
|
||||
flatpak_label = "Flatpak client"
|
||||
flatpak_standard = "Standard"
|
||||
|
||||
@@ -0,0 +1,29 @@
|
||||
changelog_label = "View changelog"
|
||||
changelog_status = "Opens the DZGUI changelog"
|
||||
|
||||
log_label = "Show debug log"
|
||||
log_status = "Read the DZGUI log generated since startup"
|
||||
|
||||
separator_label = "SEPARATOR"
|
||||
separator_status = ""
|
||||
|
||||
system_log_label = "Output system info to log file"
|
||||
system_log_status = "Dump diagnostic data for troubleshooting"
|
||||
|
||||
docs_label = "Documentation/help files (GitHub) ⧉"
|
||||
docs_status = "Open the DZGUI documentation in a browser"
|
||||
|
||||
docs_fallback_label = "Documentation/help files (Codeberg mirror) ⧉"
|
||||
docs_fallback_status = "Open the DZGUI documentation in a browser"
|
||||
|
||||
bugs_label = "Report a bug (GitHub) ⧉"
|
||||
bugs_status = "Open the DZGUI issue tracker in a browser"
|
||||
|
||||
forum_label = "DZGUI Subreddit ⧉"
|
||||
forum_status = "Open the DZGUI discussion forum in a browser"
|
||||
|
||||
sponsor_label = "Sponsor (GitHub) ⧉"
|
||||
sponsor_status = "Sponsor development of the DZGUI project"
|
||||
|
||||
thanks_label = "Special thanks"
|
||||
thanks_status = "A list of contributors, testers, and sponsors"
|
||||
@@ -4,4 +4,3 @@ up_to_date = "Up to date"
|
||||
modlist = "Modlist"
|
||||
checkmark = "✓"
|
||||
resync="⟳"
|
||||
invalid_mod = "Invalid mod"
|
||||
@@ -159,6 +159,9 @@ filter_unofficial = "Unofficial"
|
||||
filter_modded = "Modded"
|
||||
filter_unmodded = "Unmodded"
|
||||
|
||||
# maps
|
||||
all_maps = "All maps"
|
||||
|
||||
# state
|
||||
unknown = "Unknown"
|
||||
none_provided = "None provided"
|
||||
@@ -249,6 +252,7 @@ class Crumbs:
|
||||
developers: str
|
||||
default: str
|
||||
offline: str
|
||||
connect: str
|
||||
|
||||
|
||||
@dataclass(slots=True, frozen=True)
|
||||
@@ -436,6 +440,7 @@ crumbs = Crumbs(
|
||||
developers="Options > Developers",
|
||||
default="Servers > ",
|
||||
offline="Mods > Play offline",
|
||||
connect="Connect",
|
||||
)
|
||||
|
||||
no_mods = "No local mods found."
|
||||
|
||||
@@ -19,7 +19,7 @@ if TYPE_CHECKING:
|
||||
|
||||
class ContextualButton(Gtk.Button):
|
||||
def __init__(
|
||||
self, label: str, opens: "NotebookPage", tooltip: str, context: ButtonType
|
||||
self, label: str, opens: "NotebookPage" | None, tooltip: str, context: ButtonType
|
||||
) -> None:
|
||||
super().__init__(
|
||||
label=label,
|
||||
@@ -51,9 +51,9 @@ class ButtonBox(Gtk.Box):
|
||||
|
||||
for side_button in ButtonType:
|
||||
button = ContextualButton(
|
||||
label=side_button.dict["label"],
|
||||
opens=side_button.dict["opens"],
|
||||
tooltip=side_button.dict["tooltip"],
|
||||
label=side_button.label,
|
||||
opens=side_button.opens,
|
||||
tooltip=side_button.tooltip,
|
||||
context=side_button,
|
||||
)
|
||||
|
||||
|
||||
@@ -106,7 +106,8 @@ class ClipboardButton(IconTextButton):
|
||||
self.controller = controller
|
||||
self.connect("clicked", self._on_button_clicked, func)
|
||||
|
||||
self.set_tooltip_text(buttons.clipboard_button)
|
||||
# TODO: strings
|
||||
self.set_tooltip_text("Copy to clipboard")
|
||||
|
||||
def _on_button_clicked(self, button: Self, func: Callable) -> None:
|
||||
def revert() -> Literal[False]:
|
||||
@@ -124,14 +125,16 @@ class CopyIpButton(ClipboardButton):
|
||||
def __init__(self, controller: Union["Controller", None], func: Callable) -> None:
|
||||
super().__init__(controller, func)
|
||||
|
||||
self.set_tooltip_text(buttons.clipboard_ip_button)
|
||||
# TODO: strings
|
||||
self.set_tooltip_text("Copy IP to clipboard")
|
||||
|
||||
|
||||
class CloseButton(IconTextButton):
|
||||
def __init__(self, label: str) -> None:
|
||||
super().__init__(icon=CLOSE, label=label)
|
||||
|
||||
self.set_tooltip_text(buttons.unset_button_tooltip)
|
||||
# TODO: strings
|
||||
self.set_tooltip_text("Unset this server as favorite")
|
||||
|
||||
|
||||
class WebButton(IconTextButton):
|
||||
@@ -249,7 +252,6 @@ class AddButton(IconTextButton):
|
||||
self.set_tooltip_text(connect_panel.add_tooltip)
|
||||
|
||||
|
||||
# TODO: drop
|
||||
class LoggerAlertsButton(IconTextButton):
|
||||
def __init__(self, warnings: int, errors: int) -> None:
|
||||
warnings_text = ""
|
||||
|
||||
@@ -3,11 +3,6 @@ from typing import Self, TYPE_CHECKING
|
||||
from dzgui.const.constants import CARET_DOWN, CARET_UP, UDP_PORT
|
||||
from dzgui.model.servers import ServerModelManager
|
||||
from dzgui.strings import connect_panel
|
||||
from dzgui.strings.buttons import (
|
||||
dock_button_collapse,
|
||||
dock_button_expand,
|
||||
unset_button_label,
|
||||
)
|
||||
from dzgui.util.keys import is_ctrl_mask
|
||||
from dzgui.views.components.buttons import (
|
||||
AddButton,
|
||||
@@ -41,18 +36,21 @@ class DockButton(IconButton):
|
||||
self.child = child
|
||||
self.connect("clicked", self._on_click)
|
||||
|
||||
self.collapse_text = "Collapse the connection panel"
|
||||
self.expand_text = "Expand the connection panel"
|
||||
|
||||
self.set_margin_top(10)
|
||||
self.set_tooltip_text(dock_button_collapse)
|
||||
self.set_tooltip_text(self.collapse_text)
|
||||
|
||||
def collapse(self) -> None:
|
||||
self.set_image(Icon(CARET_UP))
|
||||
self.child.hide()
|
||||
self.set_tooltip_text(dock_button_expand)
|
||||
self.set_tooltip_text(self.expand_text)
|
||||
|
||||
def expand(self) -> None:
|
||||
self.set_image(Icon(CARET_DOWN))
|
||||
self.child.show()
|
||||
self.set_tooltip_text(dock_button_collapse)
|
||||
self.set_tooltip_text(self.collapse_text)
|
||||
|
||||
def _on_click(self, button: Self) -> None:
|
||||
if self.expanded:
|
||||
@@ -83,6 +81,7 @@ class LanPanel(Gtk.Frame):
|
||||
self.scan = Gtk.Button(label=connect_panel.lan_scan_button)
|
||||
self.scan.connect("clicked", self._on_scan_clicked)
|
||||
|
||||
# TODO: strings
|
||||
self.early_abort = Gtk.CheckButton(label=connect_panel.lan_checkbox)
|
||||
self.early_abort.set_active(True)
|
||||
self.early_abort.set_tooltip_text(connect_panel.lan_abort_tooltip)
|
||||
@@ -190,7 +189,8 @@ class FavPanel(Gtk.Frame):
|
||||
self.fav_button.connect("clicked", self._on_connect_clicked)
|
||||
self.copy_button = CopyIpButton(self.controller, self.get_fav_ip)
|
||||
|
||||
self.unset_button = CloseButton(unset_button_label)
|
||||
# TODO: strings
|
||||
self.unset_button = CloseButton("Unset")
|
||||
self.unset_button.connect("clicked", self._on_unset_clicked)
|
||||
|
||||
if favorite is None:
|
||||
|
||||
@@ -43,7 +43,7 @@ class Breadcrumbs(Gtk.Label):
|
||||
label = page.get_current_tab_text()
|
||||
self.set_server_crumbs(label)
|
||||
else:
|
||||
crumbs = enum.dict["crumbs"]
|
||||
crumbs = enum.crumbs
|
||||
self.set_crumbs(crumbs)
|
||||
|
||||
def set_server_crumbs(self, suffix: str) -> None:
|
||||
|
||||
@@ -4,7 +4,6 @@ from dzgui.api.servers import validate_ip
|
||||
from dzgui.const.constants import VIEW_CONCEAL, VIEW_REVEAL
|
||||
from dzgui.util.css import add_class, remove_class
|
||||
from dzgui.strings import connect_panel
|
||||
from dzgui.strings.options import api_placeholder, api_validate
|
||||
from dzgui.strings.errors import api_popover
|
||||
|
||||
import gi
|
||||
@@ -144,8 +143,9 @@ class APIEntry(Gtk.Box):
|
||||
|
||||
self.func: Callable | None = None
|
||||
|
||||
# TODO: strings
|
||||
self.entry = Gtk.Entry(
|
||||
width_chars=60, hexpand=True, placeholder_text=api_placeholder
|
||||
width_chars=60, hexpand=True, placeholder_text="Enter API key"
|
||||
)
|
||||
self.entry.set_icon_from_icon_name(Gtk.EntryIconPosition.SECONDARY, VIEW_REVEAL)
|
||||
self.entry.set_icon_activatable(Gtk.EntryIconPosition.SECONDARY, True)
|
||||
@@ -154,7 +154,8 @@ class APIEntry(Gtk.Box):
|
||||
self.entry.connect("icon-release", self._on_icon_release)
|
||||
self.entry.connect("activate", self._on_field_activated)
|
||||
|
||||
self.submit = Gtk.Button(label=api_validate)
|
||||
# TODO: strings
|
||||
self.submit = Gtk.Button(label="Validate")
|
||||
self.submit.set_sensitive(False)
|
||||
self.submit.connect("clicked", self._on_submit)
|
||||
|
||||
|
||||
@@ -10,12 +10,7 @@ from dzgui.const.constants import (
|
||||
SEARCH_ICON,
|
||||
)
|
||||
from dzgui.util.format import format_exception
|
||||
from dzgui.strings.filters import (
|
||||
all_maps,
|
||||
filters_heading,
|
||||
keyword_placeholder,
|
||||
map_placeholder,
|
||||
)
|
||||
from dzgui.util.strings import all_maps
|
||||
from dzgui.views.components.maps_combo import MapsCombo
|
||||
from dzgui.views.components.labels import BoldLabel
|
||||
|
||||
@@ -47,10 +42,7 @@ class ButtonGrid(Gtk.Grid):
|
||||
self.checks: list[Gtk.CheckButton] = []
|
||||
|
||||
flowbox = Gtk.FlowBox(
|
||||
halign=Gtk.Align.CENTER,
|
||||
min_children_per_line=3,
|
||||
max_children_per_line=3,
|
||||
selection_mode=Gtk.SelectionMode.NONE,
|
||||
halign=Gtk.Align.CENTER, min_children_per_line=3, max_children_per_line=3, selection_mode=Gtk.SelectionMode.NONE
|
||||
)
|
||||
|
||||
for check in defaults.keys():
|
||||
@@ -107,7 +99,8 @@ class ButtonGrid(Gtk.Grid):
|
||||
|
||||
class KeywordEntry(Gtk.Entry):
|
||||
def __init__(self, controller: "Controller") -> None:
|
||||
super().__init__(placeholder_text=keyword_placeholder)
|
||||
# TODO :strings
|
||||
super().__init__(placeholder_text="Filter by keyword")
|
||||
|
||||
self.keyword = ""
|
||||
self.controller = controller
|
||||
@@ -181,7 +174,8 @@ class FilterPanel(Gtk.Box):
|
||||
self.keyword_entry = KeywordEntry(self.controller)
|
||||
self.button_grid = ButtonGrid(self.controller, defaults, tooltips)
|
||||
|
||||
self.filters_label = BoldLabel(filters_heading)
|
||||
# TODO: strings
|
||||
self.filters_label = BoldLabel("Filters")
|
||||
|
||||
self.emitter.connect(
|
||||
"request_keyword_focus", lambda _: self.keyword_entry.grab_focus()
|
||||
@@ -201,7 +195,8 @@ class FilterPanel(Gtk.Box):
|
||||
|
||||
self.maps_entry: Gtk.Entry = self.maps_combo.get_child() # type: ignore
|
||||
self.maps_entry.set_completion(completion)
|
||||
self.maps_entry.set_placeholder_text(map_placeholder)
|
||||
# TODO: strings
|
||||
self.maps_entry.set_placeholder_text("Filter by map")
|
||||
self.maps_entry.connect("changed", self._on_map_completion, True)
|
||||
self.maps_entry.connect("key-press-event", self._on_map_entry_keypress)
|
||||
self.maps_entry.connect("activate", self._on_maps_activated)
|
||||
|
||||
@@ -20,8 +20,8 @@ class EnumeratedModButton(Gtk.Button):
|
||||
super().__init__(margin_start=10, margin_end=10, focus_on_click=False)
|
||||
|
||||
self.enum = enum
|
||||
self.set_label(enum.dict["label"])
|
||||
self.set_tooltip_text(enum.dict["tooltip"])
|
||||
self.set_label(enum.label)
|
||||
self.set_tooltip_text(enum.tooltip)
|
||||
|
||||
|
||||
class ModPanelButton(EnumeratedModButton):
|
||||
|
||||
@@ -13,7 +13,6 @@ from dzgui.const.constants import (
|
||||
)
|
||||
from dzgui.const.enum import ServerTab
|
||||
from dzgui.managers.update import UpdateManager
|
||||
from dzgui.strings.buttons import update_button, version_notifier, version_tooltip
|
||||
from dzgui.util.clip import copy_clipboard
|
||||
from dzgui.util.file import is_writeable
|
||||
from dzgui.views.components.buttonbox import ButtonBox
|
||||
@@ -66,7 +65,8 @@ class RightPanel(Gtk.Box):
|
||||
vexpand=True,
|
||||
halign=Gtk.Align.END,
|
||||
valign=Gtk.Align.END,
|
||||
tooltip_text=version_tooltip,
|
||||
# TODO: strings
|
||||
tooltip_text="Click to copy to clipboard",
|
||||
)
|
||||
eb = Gtk.EventBox(halign=Gtk.Align.END, valign=Gtk.Align.END)
|
||||
eb.add(self.version_label)
|
||||
@@ -78,7 +78,7 @@ class RightPanel(Gtk.Box):
|
||||
self.pack_start(self.sel_panel, NO_EXPAND, NO_FILL, NO_PADDING)
|
||||
|
||||
self.update_button = IconTextButton(
|
||||
"dialog-information-symbolic", label=update_button
|
||||
"dialog-information-symbolic", label="Updates available"
|
||||
)
|
||||
|
||||
self.gutter_box = Gtk.Box(
|
||||
@@ -131,6 +131,7 @@ class RightPanel(Gtk.Box):
|
||||
return
|
||||
self.copying = True
|
||||
version = self.version_label.get_text()
|
||||
self.version_label.set_text(version_notifier)
|
||||
# TODO: strings
|
||||
self.version_label.set_text("Copied!")
|
||||
copy_clipboard(version)
|
||||
GLib.timeout_add_seconds(1, revert)
|
||||
@@ -60,7 +60,7 @@ class Statusbar(Gtk.Grid):
|
||||
return
|
||||
|
||||
enum = notebook.get_page_by_enum()
|
||||
show_statusbar = enum.dict["statusbar"]
|
||||
show_statusbar = enum.has_statusbar
|
||||
|
||||
if show_statusbar is False:
|
||||
self.set_by_context(enum, "")
|
||||
@@ -152,5 +152,5 @@ class Statusbar(Gtk.Grid):
|
||||
row = tree.get_value_at_index(1)
|
||||
if self.controller.loaded is False:
|
||||
return
|
||||
tooltip = row.dict["tooltip"]
|
||||
tooltip = row.tooltip
|
||||
self.set_by_context(NotebookPage.HELP, tooltip)
|
||||
@@ -140,7 +140,8 @@ class WaitDialog(GenericDialog):
|
||||
self.cur_job += 1
|
||||
|
||||
def _on_cancel_clicked(self, button: Gtk.Button) -> None:
|
||||
GLib.idle_add(self.update_text, dialogs.caught_cancel_signal)
|
||||
# TODO: strings
|
||||
GLib.idle_add(self.update_text, "Caught cancel signal, cleaning up")
|
||||
self.controller.set_cancel_event()
|
||||
|
||||
def show_cancel(self, state: bool) -> None:
|
||||
|
||||
+18
-10
@@ -1,13 +1,12 @@
|
||||
from typing import Self, TYPE_CHECKING
|
||||
|
||||
from dzgui.strings import notes
|
||||
from dzgui.views.components.entry import ValidatedEntry
|
||||
from dzgui.views.dialogs.generic import GenericDialog
|
||||
|
||||
import gi
|
||||
import gi # noqa E402
|
||||
|
||||
gi.require_version("Gtk", "3.0")
|
||||
from gi.repository import Gtk
|
||||
from gi.repository import Gdk, Gtk # noqa E402
|
||||
|
||||
if TYPE_CHECKING:
|
||||
from dzgui.controllers.mc import Controller
|
||||
@@ -15,20 +14,23 @@ if TYPE_CHECKING:
|
||||
|
||||
class NoteDialog(GenericDialog):
|
||||
def __init__(self, controller: "Controller"):
|
||||
# TODO: add to strings
|
||||
title = "Add a short note/reminder."
|
||||
secondary = "Limit 30 chars"
|
||||
super().__init__(
|
||||
controller=controller,
|
||||
text=notes.dialog_title,
|
||||
text=title,
|
||||
buttons=Gtk.ButtonsType.NONE,
|
||||
mtype=Gtk.MessageType.INFO,
|
||||
secondary=notes.dialog_subtitle,
|
||||
secondary=secondary,
|
||||
)
|
||||
|
||||
self.controller = controller
|
||||
|
||||
delete_button = Gtk.Button(label=notes.delete_button)
|
||||
delete_button = Gtk.Button(label="Delete note")
|
||||
delete_button.set_sensitive(False)
|
||||
self.add_action_widget(delete_button, Gtk.ResponseType.CANCEL)
|
||||
self.ok = self.add_button(notes.ok_button, Gtk.ResponseType.OK)
|
||||
self.ok = self.add_button("Update note", Gtk.ResponseType.OK)
|
||||
self.ok.grab_default()
|
||||
|
||||
self.entry = ValidatedEntry(controller, self.validate)
|
||||
@@ -40,7 +42,7 @@ class NoteDialog(GenericDialog):
|
||||
self.entry.set_text(note)
|
||||
if len(note) > 0:
|
||||
delete_button.set_sensitive(True)
|
||||
self.format_secondary_text(notes.current_note.format(note))
|
||||
self.format_secondary_text(f"Current note: '{note}'")
|
||||
elif len(note) == 0:
|
||||
self.ok.set_sensitive(False)
|
||||
|
||||
@@ -53,6 +55,9 @@ class NoteDialog(GenericDialog):
|
||||
self.entry.connect("changed", self._on_text_changed)
|
||||
|
||||
def _on_text_changed(self, entry: Gtk.Entry) -> None:
|
||||
"""
|
||||
Called in conjunction with signal callback in the parent class
|
||||
"""
|
||||
if len(entry.get_text()) == 0:
|
||||
self.ok.set_sensitive(False)
|
||||
|
||||
@@ -66,11 +71,14 @@ class NoteDialog(GenericDialog):
|
||||
|
||||
def _on_response(self, dialog: Self, response: Gtk.ResponseType) -> None:
|
||||
match response:
|
||||
case Gtk.ResponseType.DELETE_EVENT:
|
||||
self.destroy()
|
||||
case Gtk.ResponseType.OK:
|
||||
note = self.entry.get_text()
|
||||
self.controller.add_note(note)
|
||||
self.destroy()
|
||||
case Gtk.ResponseType.CANCEL:
|
||||
self.controller.delete_note()
|
||||
case _:
|
||||
pass
|
||||
self.destroy()
|
||||
case Gtk.ResponseType.CANCEL | Gtk.ResponseType.CLOSE:
|
||||
self.destroy()
|
||||
@@ -14,7 +14,7 @@ from dzgui.const.constants import (
|
||||
HERO_PATH,
|
||||
FLATPAK_ROOT_PATH,
|
||||
LEGACY_CONFIG_PATH,
|
||||
TMP_PATH,
|
||||
TMP_PATH
|
||||
)
|
||||
from dzgui.const.boilerplate import config_boilerplate
|
||||
from dzgui.const.endpoints import STEAM_API_SETUP
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import logging
|
||||
|
||||
from dzgui.const.constants import APP_NAME
|
||||
from dzgui.const.enum import ContextMenu
|
||||
from dzgui.const.enum import ContextMenuItem
|
||||
from dzgui.util.keys import is_ctrl_mask, is_navkey
|
||||
from dzgui.util.strings import edit_note
|
||||
from dzgui.views.trees.tree_base import TreeView
|
||||
@@ -15,9 +15,7 @@ logger = logging.getLogger(APP_NAME)
|
||||
|
||||
|
||||
class ContextMixin(TreeView):
|
||||
def present_menu(
|
||||
self, widget: Gtk.Widget, event: Gdk.Event
|
||||
) -> bool:
|
||||
def present_menu(self, widget: Gtk.Widget, event: Gdk.Event) -> bool:
|
||||
|
||||
if self.menu is None:
|
||||
return False
|
||||
@@ -60,17 +58,17 @@ class ContextMixin(TreeView):
|
||||
self.context_menu.select_first(False)
|
||||
return True
|
||||
|
||||
def _process_dynamic_row(self, row: ContextMenu) -> Gtk.MenuItem:
|
||||
if row == ContextMenu.ADD_SERVER and self.is_in_favs(): # type: ignore
|
||||
row = ContextMenu.REMOVE_SERVER
|
||||
def _process_dynamic_row(self, row: ContextMenuItem) -> Gtk.MenuItem:
|
||||
if row == ContextMenuItem.ADD_SERVER and self.is_in_favs(): # type: ignore
|
||||
row = ContextMenuItem.REMOVE_SERVER
|
||||
|
||||
item = Gtk.MenuItem(label=row.dict["label"])
|
||||
item = Gtk.MenuItem(label=row.label)
|
||||
item.connect("activate", self._on_menu_click, row)
|
||||
|
||||
if row == ContextMenu.SHOW_MODS:
|
||||
if row == ContextMenuItem.SHOW_MODS:
|
||||
item.set_sensitive(self.is_modded()) # type: ignore
|
||||
|
||||
if row == ContextMenu.ADD_NOTE:
|
||||
if row == ContextMenuItem.ADD_NOTE:
|
||||
if self.controller.has_note():
|
||||
item.set_label(edit_note)
|
||||
|
||||
@@ -94,7 +92,7 @@ class ContextMixin(TreeView):
|
||||
except AttributeError:
|
||||
return False
|
||||
|
||||
def _on_menu_click(self, widget: Gtk.MenuItem, enum: ContextMenu) -> None:
|
||||
def _on_menu_click(self, widget: Gtk.MenuItem, enum: ContextMenuItem) -> None:
|
||||
self.controller.menu_action(enum, self) # type: ignore
|
||||
|
||||
def _on_key(self, menu: Gtk.Menu, event: Gdk.EventKey) -> bool | None:
|
||||
|
||||
@@ -5,7 +5,6 @@ from typing import Self, TYPE_CHECKING
|
||||
from dzgui.const.constants import APP_NAME
|
||||
from dzgui.const.enum import ContextMenuGroup, ServerTab
|
||||
from dzgui.views.trees.tree_servers import ServerTreeView
|
||||
from dzgui.strings.generic import tab_changed_label
|
||||
from dzgui.util.strings import server_labels
|
||||
|
||||
import gi
|
||||
@@ -148,7 +147,8 @@ class ServerNotebook(Gtk.ScrolledWindow):
|
||||
|
||||
label = self.notebook.get_tab_label_text(child)
|
||||
if label is not None:
|
||||
text = label.strip(tab_changed_label)
|
||||
# TODO: strings
|
||||
text = label.strip("*")
|
||||
self.notebook.set_tab_label_text(child, text)
|
||||
|
||||
tree = child.get_tree()
|
||||
|
||||
@@ -77,4 +77,4 @@ class MenuTreeView(TreeView):
|
||||
raise ValueError("Trying to call a method on non-existent model")
|
||||
_iter = self.get_focused_row_iter()
|
||||
rowtype = model.get_value(_iter, 1)
|
||||
return str(rowtype.dict["tooltip"])
|
||||
return str(rowtype.tooltip)
|
||||
@@ -7,7 +7,7 @@ from warnings import deprecated
|
||||
|
||||
from dzgui.api.servers import ping, Record
|
||||
from dzgui.const.constants import APP_NAME
|
||||
from dzgui.const.enum import ContextMenu, ContextMenuGroup, ServerTab
|
||||
from dzgui.const.enum import ContextMenuItem, ContextMenuGroup, ServerTab
|
||||
from dzgui.managers.filter import FilterManager
|
||||
from dzgui.model.proxy_model import ProxyModelManager
|
||||
from dzgui.util import strings
|
||||
@@ -250,9 +250,9 @@ class ServerTreeView(ContextMixin, TreeView): # type: ignore
|
||||
if self.enum is ServerTab.LAN:
|
||||
self.emitter.emit("request_custom_port_focus")
|
||||
case Gdk.KEY_c:
|
||||
self.controller.menu_action(ContextMenu.COPY_SERVER_IP, self)
|
||||
self.controller.menu_action(ContextMenuItem.COPY_SERVER_IP, self)
|
||||
case Gdk.KEY_r:
|
||||
self.controller.menu_action(ContextMenu.REFRESH_PLAYERS, self)
|
||||
self.controller.menu_action(ContextMenuItem.REFRESH_PLAYERS, self)
|
||||
else:
|
||||
match event.keyval:
|
||||
case Gdk.KEY_l | Gdk.KEY_Right:
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
from pathlib import Path
|
||||
from shared import get_git_root
|
||||
|
||||
BOILERPLATE = """
|
||||
This file includes the combined licenses to the following components:
|
||||
@@ -40,7 +40,7 @@ class CombinedLicense:
|
||||
|
||||
def concat_license() -> str:
|
||||
combined = CombinedLicense()
|
||||
root = Path(__file__).resolve().parents[1]
|
||||
root = get_git_root()
|
||||
licenses = root.joinpath("docs/licenses")
|
||||
|
||||
main_license = root.joinpath(LICENSE_FILE)
|
||||
|
||||
@@ -1,10 +1,11 @@
|
||||
import shutil
|
||||
import subprocess
|
||||
from pathlib import Path
|
||||
|
||||
par = Path(__file__).parent.parent
|
||||
clog = par / "CHANGELOG.md"
|
||||
target = par / "dzgui/data/CHANGELOG.md"
|
||||
from shared import get_git_root
|
||||
|
||||
root = get_git_root()
|
||||
clog = root.joinpath("CHANGELOG.md")
|
||||
target = root.joinpath("dzgui/data/CHANGELOG.md")
|
||||
|
||||
shutil.copy(clog, target)
|
||||
|
||||
|
||||
@@ -1,10 +1,9 @@
|
||||
import tomllib
|
||||
from pathlib import Path
|
||||
|
||||
root = Path(__file__).resolve().parents[1]
|
||||
from shared import get_git_root
|
||||
|
||||
|
||||
def get_entrypoint() -> None:
|
||||
root = get_git_root()
|
||||
p = root.joinpath("pyproject.toml")
|
||||
with open(p, "rb") as f:
|
||||
t = tomllib.load(f)
|
||||
|
||||
+3
-2
@@ -3,14 +3,15 @@ import requests
|
||||
import subprocess
|
||||
import tarfile
|
||||
|
||||
from pathlib import Path
|
||||
from urllib.parse import unquote
|
||||
|
||||
from shared import get_git_root
|
||||
|
||||
BUILD = "3.13.9"
|
||||
DATE = "20251014"
|
||||
CPYTHON_BUILD = f"cpython-{BUILD}"
|
||||
|
||||
root = Path(__file__).resolve().parents[1]
|
||||
root = get_git_root()
|
||||
build_dir = root.joinpath("build")
|
||||
cpython_dir = build_dir.joinpath(CPYTHON_BUILD)
|
||||
|
||||
|
||||
+2
-1
@@ -9,6 +9,7 @@ from pathlib import Path
|
||||
from concat_licenses import concat_license
|
||||
from parse_toml import get_entrypoint
|
||||
from prebuild import get_pyapp, rebuild_cpython
|
||||
from shared import get_git_root
|
||||
|
||||
|
||||
def update_uname(info: tarfile.TarInfo) -> tarfile.TarInfo:
|
||||
@@ -17,7 +18,7 @@ def update_uname(info: tarfile.TarInfo) -> tarfile.TarInfo:
|
||||
return info
|
||||
|
||||
|
||||
root = Path(__file__).resolve().parents[1]
|
||||
root = get_git_root()
|
||||
dist_dir = root.joinpath("dist")
|
||||
build_dir = root.joinpath("build")
|
||||
|
||||
|
||||
+1
-10
@@ -1,16 +1,7 @@
|
||||
import subprocess
|
||||
from pathlib import Path
|
||||
|
||||
from dzgui.app_init import build_gui
|
||||
|
||||
|
||||
def get_git_root() -> Path:
|
||||
proc = subprocess.run(
|
||||
["git", "rev-parse", "--show-toplevel"], capture_output=True, text=True
|
||||
)
|
||||
if proc.returncode != 0:
|
||||
raise OSError("Failed to parse git root")
|
||||
return Path(proc.stdout.rstrip())
|
||||
from shared import get_git_root
|
||||
|
||||
|
||||
def get_image_path() -> Path:
|
||||
|
||||
@@ -0,0 +1,11 @@
|
||||
import subprocess
|
||||
from pathlib import Path
|
||||
|
||||
|
||||
def get_git_root() -> Path:
|
||||
proc = subprocess.run(
|
||||
["git", "rev-parse", "--show-toplevel"], capture_output=True, text=True
|
||||
)
|
||||
if proc.returncode != 0:
|
||||
raise OSError("Failed to parse git root")
|
||||
return Path(proc.stdout.rstrip())
|
||||
Reference in new issue
Block a user