Compare commits

..
Author SHA1 Message Date
aclist d6b5c7bbb4 chore: drop unused imports
Mirror to Codeberg / mirror-to-codeberg (push) Waiting to run
2026-11-11 01:45:00 +09:00
aclist f0a07cbbba Merge branch 'dzgui7' into drop/abstract-constructor-params 2026-11-11 01:41:58 +09:00
aclist 30fa762780 fix: update bool 2026-11-11 01:35:12 +09:00
aclist 807a530550 Merge pull request #529 from aclist/change/normalize-icon-names
change: normalize icon names
2026-11-11 01:31:08 +09:00
aclist f092cfdf4a Merge pull request #530 from aclist/change/normalize-endpoint-names
change: normalize endpoint names
2026-11-11 01:22:59 +09:00
aclist d5c597ab03 Merge pull request #527 from aclist/docs/history-file-2
docs: add history file
2026-11-11 01:15:33 +09:00
aclist 15d4b71350 Merge pull request #533 from aclist/docs/more-attribution
Mirror to Codeberg / mirror-to-codeberg (push) Waiting to run
chore: add remarks to README
2026-11-10 03:08:12 +09:00
aclist 16d3df618a chore: add remarks to README 2026-11-10 03:07:30 +09:00
aclist 22dd8fc67f Merge pull request #525 from aclist/change/get-git-root
change: get git root
2026-11-10 02:44:51 +09:00
aclist 49298d9943 change: normalize endpoint names 2026-11-09 23:51:19 +09:00
aclist 72e3d95808 change: normalize icon names 2026-11-09 23:48:10 +09:00
aclist a42c9d4389 drop: abstracted constructor params 2026-11-09 23:28:50 +09:00
aclist 03fa707305 chore: remove unused imports 2026-11-09 11:04:56 +09:00
aclist 2479cbd41b change: parse repository root 2026-11-09 11:03:50 +09:00
29 changed files with 133 additions and 149 deletions

No files matched your search

+2
View File
@@ -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. 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 ## Disclaimer
DZGUI is beta-quality software and is provided as-is. DZGUI is beta-quality software and is provided as-is.
+6 -6
View File
@@ -31,10 +31,10 @@ from dzgui.const.constants import (
VDF_PATH, VDF_PATH,
) )
from dzgui.const.endpoints import ( from dzgui.const.endpoints import (
APP_DETAILS, STEAM_APP_DETAILS,
SUB_ENDPOINT,
STEAM_PUBLISHED_FILES, STEAM_PUBLISHED_FILES,
UNSUB_ENDPOINT, STEAM_SUB,
STEAM_UNSUB,
) )
from dzgui.strings import wizard from dzgui.strings import wizard
from dzgui.strings.errors import api_validation_error, workshop_endpoint_error from dzgui.strings.errors import api_validation_error, workshop_endpoint_error
@@ -310,11 +310,11 @@ def update_workshop(key: str, mod: int, endpoint: str) -> None:
def subscribe(key: str, mod: int) -> None: def subscribe(key: str, mod: int) -> None:
update_workshop(key, mod, SUB_ENDPOINT) update_workshop(key, mod, STEAM_SUB)
def unsubscribe(key: str, mod: int) -> None: def unsubscribe(key: str, mod: int) -> None:
update_workshop(key, mod, UNSUB_ENDPOINT) update_workshop(key, mod, STEAM_UNSUB)
def validate_mod(client: str, mod: str) -> None: def validate_mod(client: str, mod: str) -> None:
@@ -512,7 +512,7 @@ def get_app_path(folders_path: Path, appid: int) -> Path:
def get_app_name(appid: int) -> str | None: def get_app_name(appid: int) -> str | None:
payload = {"appids": [appid]} payload = {"appids": [appid]}
res = requests.get(APP_DETAILS, params=payload) res = requests.get(STEAM_APP_DETAILS, params=payload)
if res.status_code != 200: if res.status_code != 200:
return None return None
try: try:
-29
View File
@@ -37,37 +37,8 @@ HEX_GREEN = "#32CD32"
HEX_RED = "#FF0000" HEX_RED = "#FF0000"
HEX_ORANGE = "#FFAC1C" HEX_ORANGE = "#FFAC1C"
# TODO: normalize icon names
CALCULATOR = "accessories-calculator-symbolic"
CARET_DOWN = "go-down-symbolic"
CARET_UP = "go-up-symbolic"
CLIPBOARD = "edit-copy-symbolic"
CLOSE = "window-close-symbolic"
FOLDER = "folder-symbolic"
EDIT_DELETE = "edit-delete-symbolic"
ERROR = "dialog-error-symbolic"
HELP_BUBBLE = "help-about-symbolic"
INPUT_KEYBOARD = "input-keyboard-symbolic"
LIST_ADD = "list-add-symbolic"
REFRESH_ICON = "view-refresh-symbolic"
SEARCH_ICON = "system-search-symbolic"
STEAM_ICON = "steam-tray-symbolic"
VIEW_CONCEAL = "view-conceal-symbolic"
VIEW_REVEAL = "view-reveal-symbolic"
WARNING = "dialog-warning-symbolic"
WEB_BROWSER = "web-browser-symbolic"
DAY_ICON = "weather-clear-symbolic"
NIGHT_ICON = "weather-clear-night-symbolic"
SEPARATOR = "SEPARATOR" SEPARATOR = "SEPARATOR"
# TODO: drop
NO_PADDING = 0
NO_EXPAND = False
NO_FILL = False
EXPAND = True
FILL = True
SCROLL_INCREMENT = 50 SCROLL_INCREMENT = 50
WINDOW_DEFAULT_X = 1400 WINDOW_DEFAULT_X = 1400
WINDOW_DEFAULT_Y = 800 WINDOW_DEFAULT_Y = 800
+3 -3
View File
@@ -3,9 +3,9 @@ STEAM_PUBLISHED_FILES = (
"https://api.steampowered.com/ISteamRemoteStorage/GetPublishedFileDetails/v1" "https://api.steampowered.com/ISteamRemoteStorage/GetPublishedFileDetails/v1"
) )
STEAM_SERVERS = "https://api.steampowered.com/IGameServersService/GetServerList/v1" STEAM_SERVERS = "https://api.steampowered.com/IGameServersService/GetServerList/v1"
SUB_ENDPOINT = "https://api.steampowered.com/IPublishedFileService/Subscribe/v1" STEAM_SUB = "https://api.steampowered.com/IPublishedFileService/Subscribe/v1"
UNSUB_ENDPOINT = "https://api.steampowered.com/IPublishedFileService/Unsubscribe/v1" STEAM_UNSUB = "https://api.steampowered.com/IPublishedFileService/Unsubscribe/v1"
APP_DETAILS = "https://store.steampowered.com/api/appdetails?" STEAM_APP_DETAILS = "https://store.steampowered.com/api/appdetails?"
GITHUB = "https://github.com/aclist" GITHUB = "https://github.com/aclist"
GITHUB_RELEASES = "https://api.github.com/repos/aclist/dztui/releases/latest" GITHUB_RELEASES = "https://api.github.com/repos/aclist/dztui/releases/latest"
+20
View File
@@ -0,0 +1,20 @@
ICON_CALCULATOR = "accessories-calculator-symbolic"
ICON_CARET_DOWN = "go-down-symbolic"
ICON_CARET_UP = "go-up-symbolic"
ICON_CLIPBOARD = "edit-copy-symbolic"
ICON_CLOSE = "window-close-symbolic"
ICON_DAY = "weather-clear-symbolic"
ICON_EDIT_DELETE = "edit-delete-symbolic"
ICON_ERROR = "dialog-error-symbolic"
ICON_FOLDER = "folder-symbolic"
ICON_HELP_BUBBLE = "help-about-symbolic"
ICON_INPUT_KEYBOARD = "input-keyboard-symbolic"
ICON_LIST_ADD = "list-add-symbolic"
ICON_NIGHT = "weather-clear-night-symbolic"
ICON_REFRESH = "view-refresh-symbolic"
ICON_SEARCH = "system-search-symbolic"
ICON_STEAM = "steam-tray-symbolic"
ICON_VIEW_CONCEAL = "view-conceal-symbolic"
ICON_VIEW_REVEAL = "view-reveal-symbolic"
ICON_WARNING = "dialog-warning-symbolic"
ICON_WEB_BROWSER = "web-browser-symbolic"
+2 -2
View File
@@ -1,7 +1,7 @@
import logging import logging
from typing import TYPE_CHECKING from typing import TYPE_CHECKING
from dzgui.const.constants import APP_NAME, NO_EXPAND, NO_FILL, NO_PADDING from dzgui.const.constants import APP_NAME
from dzgui.const.enum import ButtonType from dzgui.const.enum import ButtonType
import gi import gi
@@ -63,7 +63,7 @@ class ButtonBox(Gtk.Box):
self.buttons.append(button) self.buttons.append(button)
button.connect("clicked", self._on_selection_button_clicked) button.connect("clicked", self._on_selection_button_clicked)
self.pack_start(button, NO_EXPAND, NO_FILL, NO_PADDING) self.pack_start(button, expand=False, fill=False, padding=0)
def _focus_first_button(self, emitter: "Emitter") -> None: def _focus_first_button(self, emitter: "Emitter") -> None:
self.buttons[0].grab_focus() self.buttons[0].grab_focus()
+17 -17
View File
@@ -7,15 +7,15 @@ from dzgui.util.strings import (
alert_button_tooltip, alert_button_tooltip,
atomic_buttons, atomic_buttons,
) )
from dzgui.const.constants import ( from dzgui.const.icons import (
CLIPBOARD, ICON_CLIPBOARD,
CLOSE, ICON_CLOSE,
INPUT_KEYBOARD, ICON_INPUT_KEYBOARD,
LIST_ADD, ICON_LIST_ADD,
REFRESH_ICON, ICON_REFRESH,
STEAM_ICON, ICON_STEAM,
WARNING, ICON_WARNING,
WEB_BROWSER, ICON_WEB_BROWSER,
) )
from dzgui.strings import connect_panel from dzgui.strings import connect_panel
@@ -102,7 +102,7 @@ class LargeIconTextButton(IconButton):
class ClipboardButton(IconTextButton): class ClipboardButton(IconTextButton):
def __init__(self, controller: Union["Controller", None], func: Callable) -> None: def __init__(self, controller: Union["Controller", None], func: Callable) -> None:
super().__init__(CLIPBOARD, atomic_buttons.copy) super().__init__(ICON_CLIPBOARD, atomic_buttons.copy)
self.controller = controller self.controller = controller
self.connect("clicked", self._on_button_clicked, func) self.connect("clicked", self._on_button_clicked, func)
@@ -131,7 +131,7 @@ class CopyIpButton(ClipboardButton):
class CloseButton(IconTextButton): class CloseButton(IconTextButton):
def __init__(self, label: str) -> None: def __init__(self, label: str) -> None:
super().__init__(icon=CLOSE, label=label) super().__init__(icon=ICON_CLOSE, label=label)
# TODO: strings # TODO: strings
self.set_tooltip_text("Unset this server as favorite") self.set_tooltip_text("Unset this server as favorite")
@@ -139,14 +139,14 @@ class CloseButton(IconTextButton):
class WebButton(IconTextButton): class WebButton(IconTextButton):
def __init__(self, label: str) -> None: def __init__(self, label: str) -> None:
super().__init__(icon=WEB_BROWSER, label=label) super().__init__(icon=ICON_WEB_BROWSER, label=label)
pass pass
class RefreshButton(IconTextButton): class RefreshButton(IconTextButton):
def __init__(self, controller: "Controller") -> None: def __init__(self, controller: "Controller") -> None:
super().__init__( super().__init__(
icon=REFRESH_ICON, icon=ICON_REFRESH,
label=atomic_buttons.refresh, label=atomic_buttons.refresh,
) )
@@ -211,7 +211,7 @@ class RefreshButton(IconTextButton):
class KeysButton(IconTextButton): class KeysButton(IconTextButton):
def __init__(self, controller: "Controller") -> None: def __init__(self, controller: "Controller") -> None:
super().__init__(icon=INPUT_KEYBOARD, label=atomic_buttons.keys) super().__init__(icon=ICON_INPUT_KEYBOARD, label=atomic_buttons.keys)
self.controller = controller self.controller = controller
self.set_margin_top(10) self.set_margin_top(10)
@@ -228,7 +228,7 @@ class KeysButton(IconTextButton):
class SteamConnectButton(LargeIconTextButton): class SteamConnectButton(LargeIconTextButton):
def __init__(self) -> None: def __init__(self) -> None:
super().__init__(icon=STEAM_ICON, label=connect_panel.connect_button) super().__init__(icon=ICON_STEAM, label=connect_panel.connect_button)
self.set_tooltip_text(connect_panel.connect_tooltip) self.set_tooltip_text(connect_panel.connect_tooltip)
@@ -248,7 +248,7 @@ class SteamWorkshopButton(SteamTextButton):
class AddButton(IconTextButton): class AddButton(IconTextButton):
def __init__(self) -> None: def __init__(self) -> None:
super().__init__(icon=LIST_ADD, label=connect_panel.add_button) super().__init__(icon=ICON_LIST_ADD, label=connect_panel.add_button)
self.set_tooltip_text(connect_panel.add_tooltip) self.set_tooltip_text(connect_panel.add_tooltip)
@@ -267,7 +267,7 @@ class LoggerAlertsButton(IconTextButton):
separator = "," separator = ","
concat = warnings_text + separator + errors_text concat = warnings_text + separator + errors_text
super().__init__( super().__init__(
icon=WARNING, icon=ICON_WARNING,
label=f"Loaded with{concat}", label=f"Loaded with{concat}",
) )
self.set_halign(Gtk.Align.END) self.set_halign(Gtk.Align.END)
+5 -4
View File
@@ -1,6 +1,7 @@
from typing import Self, TYPE_CHECKING from typing import Self, TYPE_CHECKING
from dzgui.const.constants import CARET_DOWN, CARET_UP, UDP_PORT from dzgui.const.icons import ICON_CARET_DOWN, ICON_CARET_UP
from dzgui.const.constants import UDP_PORT
from dzgui.model.servers import ServerModelManager from dzgui.model.servers import ServerModelManager
from dzgui.strings import connect_panel from dzgui.strings import connect_panel
from dzgui.util.keys import is_ctrl_mask from dzgui.util.keys import is_ctrl_mask
@@ -30,7 +31,7 @@ ROWS = 1
class DockButton(IconButton): class DockButton(IconButton):
def __init__(self, child: Gtk.Widget) -> None: def __init__(self, child: Gtk.Widget) -> None:
super().__init__(CARET_DOWN) super().__init__(ICON_CARET_DOWN)
self.expanded = True self.expanded = True
self.child = child self.child = child
@@ -43,12 +44,12 @@ class DockButton(IconButton):
self.set_tooltip_text(self.collapse_text) self.set_tooltip_text(self.collapse_text)
def collapse(self) -> None: def collapse(self) -> None:
self.set_image(Icon(CARET_UP)) self.set_image(Icon(ICON_CARET_UP))
self.child.hide() self.child.hide()
self.set_tooltip_text(self.expand_text) self.set_tooltip_text(self.expand_text)
def expand(self) -> None: def expand(self) -> None:
self.set_image(Icon(CARET_DOWN)) self.set_image(Icon(ICON_CARET_DOWN))
self.child.show() self.child.show()
self.set_tooltip_text(self.collapse_text) self.set_tooltip_text(self.collapse_text)
+4 -4
View File
@@ -1,7 +1,7 @@
from typing import Any, Callable, TYPE_CHECKING from typing import Any, Callable, TYPE_CHECKING
from dzgui.api.servers import validate_ip from dzgui.api.servers import validate_ip
from dzgui.const.constants import VIEW_CONCEAL, VIEW_REVEAL from dzgui.const.icons import ICON_VIEW_CONCEAL, ICON_VIEW_REVEAL
from dzgui.util.css import add_class, remove_class from dzgui.util.css import add_class, remove_class
from dzgui.strings import connect_panel from dzgui.strings import connect_panel
from dzgui.strings.errors import api_popover from dzgui.strings.errors import api_popover
@@ -147,7 +147,7 @@ class APIEntry(Gtk.Box):
self.entry = Gtk.Entry( self.entry = Gtk.Entry(
width_chars=60, hexpand=True, placeholder_text="Enter API key" 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_from_icon_name(Gtk.EntryIconPosition.SECONDARY, ICON_VIEW_REVEAL)
self.entry.set_icon_activatable(Gtk.EntryIconPosition.SECONDARY, True) self.entry.set_icon_activatable(Gtk.EntryIconPosition.SECONDARY, True)
self.entry.set_visibility(False) self.entry.set_visibility(False)
self.entry.connect("changed", self._on_text_changed) self.entry.connect("changed", self._on_text_changed)
@@ -206,9 +206,9 @@ class APIEntry(Gtk.Box):
) -> None: ) -> None:
visible = widget.get_visibility() visible = widget.get_visibility()
if visible: if visible:
icon, state = VIEW_REVEAL, False icon, state = ICON_VIEW_REVEAL, False
else: else:
icon, state = VIEW_CONCEAL, True icon, state = ICON_VIEW_CONCEAL, True
widget.set_icon_from_icon_name(Gtk.EntryIconPosition.SECONDARY, icon) widget.set_icon_from_icon_name(Gtk.EntryIconPosition.SECONDARY, icon)
widget.set_visibility(state) widget.set_visibility(state)
+2 -2
View File
@@ -1,7 +1,7 @@
from typing import TYPE_CHECKING from typing import TYPE_CHECKING
from dzgui.const.enum import NotebookPage from dzgui.const.enum import NotebookPage
from dzgui.const.constants import HELP_BUBBLE from dzgui.const.icons import ICON_HELP_BUBBLE
import gi import gi
@@ -20,7 +20,7 @@ class InfoEventBox(Gtk.EventBox):
self.text = text self.text = text
self.icon = Gtk.Image.new_from_icon_name( self.icon = Gtk.Image.new_from_icon_name(
HELP_BUBBLE, Gtk.IconSize.LARGE_TOOLBAR ICON_HELP_BUBBLE, Gtk.IconSize.LARGE_TOOLBAR
) )
self.icon.set_opacity(0.8) self.icon.set_opacity(0.8)
box = Gtk.Box() box = Gtk.Box()
+8 -9
View File
@@ -3,12 +3,8 @@ from typing import Literal, TYPE_CHECKING
from dzgui.const.constants import ( from dzgui.const.constants import (
APP_NAME, APP_NAME,
EXPAND,
NO_EXPAND,
NO_FILL,
NO_PADDING,
SEARCH_ICON,
) )
from dzgui.const.icons import ICON_SEARCH
from dzgui.util.format import format_exception from dzgui.util.format import format_exception
from dzgui.util.strings import all_maps from dzgui.util.strings import all_maps
from dzgui.views.components.maps_combo import MapsCombo from dzgui.views.components.maps_combo import MapsCombo
@@ -42,7 +38,10 @@ class ButtonGrid(Gtk.Grid):
self.checks: list[Gtk.CheckButton] = [] self.checks: list[Gtk.CheckButton] = []
flowbox = Gtk.FlowBox( 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(): for check in defaults.keys():
@@ -109,7 +108,7 @@ class KeywordEntry(Gtk.Entry):
self.connect("key-press-event", self._on_keypress) self.connect("key-press-event", self._on_keypress)
self.connect("icon-release", lambda *args: self.activate()) self.connect("icon-release", lambda *args: self.activate())
self.set_icon_from_icon_name(Gtk.EntryIconPosition.SECONDARY, SEARCH_ICON) self.set_icon_from_icon_name(Gtk.EntryIconPosition.SECONDARY, ICON_SEARCH)
self.set_icon_activatable(Gtk.EntryIconPosition.SECONDARY, True) self.set_icon_activatable(Gtk.EntryIconPosition.SECONDARY, True)
self.emitter.connect("load_maps", self._on_maps_loaded) self.emitter.connect("load_maps", self._on_maps_loaded)
@@ -201,7 +200,7 @@ 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)
self.maps_entry.connect("activate", self._on_maps_activated) self.maps_entry.connect("activate", self._on_maps_activated)
self.maps_combo.pack_start(renderer_text, EXPAND) self.maps_combo.pack_start(renderer_text, expand=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)
@@ -211,7 +210,7 @@ class FilterPanel(Gtk.Box):
self.maps_combo, self.maps_combo,
self.button_grid, self.button_grid,
): ):
self.pack_start(el, NO_EXPAND, NO_FILL, NO_PADDING) self.pack_start(el, expand=False, fill=False, padding=0)
def _on_maps_activated(self, entry: Gtk.Entry) -> None: def _on_maps_activated(self, entry: Gtk.Entry) -> None:
text = entry.get_text() text = entry.get_text()
+3 -2
View File
@@ -1,7 +1,8 @@
from typing import Self from typing import Self
from warnings import deprecated from warnings import deprecated
from dzgui.const.constants import ERROR, FLATPAK_RUN_CMD, FLATPAK_SANDBOX, STEAM_CMD from dzgui.const.constants import FLATPAK_RUN_CMD, FLATPAK_SANDBOX, STEAM_CMD
from dzgui.const.icons import ICON_ERROR
from dzgui.init.prereqs import has_steam_client, has_flatpak_client from dzgui.init.prereqs import has_steam_client, has_flatpak_client
from dzgui.strings import options from dzgui.strings import options
from dzgui.views.components.box import HBox from dzgui.views.components.box import HBox
@@ -73,7 +74,7 @@ class ErrorPopover(Gtk.Popover):
self.hbox = HBox() self.hbox = HBox()
self.label = Gtk.Label(label="", margin_start=10, margin_end=10) self.label = Gtk.Label(label="", margin_start=10, margin_end=10)
error_icon = Icon(ERROR, margin_start=10) error_icon = Icon(ICON_ERROR, margin_start=10)
self.hbox.extend([error_icon, self.label]) self.hbox.extend([error_icon, self.label])
self.add(self.hbox) self.add(self.hbox)
self.show_all() self.show_all()
+3 -4
View File
@@ -1,7 +1,6 @@
from typing import Self, TYPE_CHECKING from typing import Self, 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.util.strings import mod_panel from dzgui.util.strings import mod_panel
from dzgui.views.components.labels import BoldLabel from dzgui.views.components.labels import BoldLabel
@@ -55,7 +54,7 @@ class ModSelectionPanel(Gtk.Box):
for button in buttons: for button in buttons:
b = EnumeratedModButton(button) b = EnumeratedModButton(button)
b.connect("clicked", self._on_button_clicked) b.connect("clicked", self._on_button_clicked)
self.main_panel.pack_start(b, NO_EXPAND, FILL, NO_PADDING) self.main_panel.pack_start(b, expand=False, fill=True, padding=0)
self.stale_panel = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=6) self.stale_panel = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=6)
self.highlight_stale_button = ModPanelButton(ModButton.HIGHLIGHT_STALE) self.highlight_stale_button = ModPanelButton(ModButton.HIGHLIGHT_STALE)
@@ -67,11 +66,11 @@ class ModSelectionPanel(Gtk.Box):
self.unhighlight_stale_button, self.unhighlight_stale_button,
self.select_stale_button, self.select_stale_button,
): ):
self.stale_panel.pack_start(b, NO_EXPAND, FILL, NO_PADDING) self.stale_panel.pack_start(b, expand=False, fill=True, padding=0)
b.connect("clicked", self._on_button_clicked) b.connect("clicked", self._on_button_clicked)
for el in header, self.main_panel, self.stale_panel: for el in header, self.main_panel, self.stale_panel:
self.pack_start(el, NO_EXPAND, FILL, NO_PADDING) self.pack_start(el, expand=False, fill=True, padding=0)
self.connect("map", self._reinit_button) self.connect("map", self._reinit_button)
+3 -7
View File
@@ -6,10 +6,6 @@ from typing import Literal, TYPE_CHECKING
from dzgui.const.constants import ( from dzgui.const.constants import (
APP_NAME, APP_NAME,
NO_EXPAND,
NO_FILL,
FILL,
NO_PADDING,
) )
from dzgui.const.enum import ServerTab from dzgui.const.enum import ServerTab
from dzgui.managers.update import UpdateManager from dzgui.managers.update import UpdateManager
@@ -73,9 +69,9 @@ class RightPanel(Gtk.Box):
eb.connect("button-press-event", self._on_version_clicked) eb.connect("button-press-event", self._on_version_clicked)
for el in self.button_vbox, self.keys, 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, expand=False, fill=True, padding=0)
self.pack_start(self.sel_panel, NO_EXPAND, NO_FILL, NO_PADDING) self.pack_start(self.sel_panel, expand=False, fill=False, padding=0)
self.update_button = IconTextButton( self.update_button = IconTextButton(
"dialog-information-symbolic", label="Updates available" "dialog-information-symbolic", label="Updates available"
@@ -96,7 +92,7 @@ class RightPanel(Gtk.Box):
"clicked", self._on_update_button_clicked, exe_path, update "clicked", self._on_update_button_clicked, exe_path, update
) )
self.gutter_box.add(eb) self.gutter_box.add(eb)
self.pack_start(self.gutter_box, NO_EXPAND, FILL, NO_PADDING) self.pack_start(self.gutter_box, expand=False, fill=True, padding=0)
def _on_update_button_clicked( def _on_update_button_clicked(
self, button: Gtk.Button, exe_path: str, url: str self, button: Gtk.Button, exe_path: str, url: str
+2 -3
View File
@@ -14,7 +14,6 @@ from dzgui.const.constants import HEX_GREEN, HEX_RED
from dzgui.init.coords import get_local_coords from dzgui.init.coords import get_local_coords
from dzgui.init.dayz import is_dayz_installed from dzgui.init.dayz import is_dayz_installed
from dzgui.init.update import check_updates from dzgui.init.update import check_updates
from dzgui.const.constants import EXPAND, FILL
from dzgui.managers.threading import call_on_thread, StoredFunc, ThreadingManager from dzgui.managers.threading import call_on_thread, StoredFunc, ThreadingManager
from dzgui.strings import preboot, dialogs from dzgui.strings import preboot, dialogs
from dzgui.util.format import format_exception from dzgui.util.format import format_exception
@@ -118,8 +117,8 @@ class BootDialog(ColorAwareApp, Gtk.Dialog): # type: ignore
self.error_box.add(self.button_hbox) self.error_box.add(self.button_hbox)
self.content = self.get_content_area() self.content = self.get_content_area()
self.content.pack_start(self.scrollable_tree, EXPAND, FILL, 0) self.content.pack_start(self.scrollable_tree, expand=True, fill=True, padding=0)
self.content.pack_start(self.error_box, EXPAND, FILL, 0) self.content.pack_start(self.error_box, expand=True, fill=True, padding=0)
self.show_all() self.show_all()
self.error_box.hide() self.error_box.hide()
+3 -3
View File
@@ -3,7 +3,7 @@ from dataclasses import dataclass
from datetime import datetime, time, timedelta from datetime import datetime, time, timedelta
from typing import Literal from typing import Literal
from dzgui.const.constants import DAY_ICON, NIGHT_ICON from dzgui.const.icons import ICON_DAY, ICON_NIGHT
from dzgui.strings import calc from dzgui.strings import calc
from dzgui.views.components.icon import Icon from dzgui.views.components.icon import Icon
from dzgui.views.components.labels import BoldLabel from dzgui.views.components.labels import BoldLabel
@@ -385,7 +385,7 @@ class TimePickerFrame(Gtk.Frame):
h1 = BoldLabel(calc.heading_server_time) h1 = BoldLabel(calc.heading_server_time)
h2 = BoldLabel(calc.heading_target_time) h2 = BoldLabel(calc.heading_target_time)
self.icon_indicator = Icon(DAY_ICON) self.icon_indicator = Icon(ICON_DAY)
self.update_server_icon() self.update_server_icon()
server_time_box = HBox(10) server_time_box = HBox(10)
@@ -411,7 +411,7 @@ class TimePickerFrame(Gtk.Frame):
self.add(flowbox) self.add(flowbox)
def update_server_icon(self) -> None: def update_server_icon(self) -> None:
icon = DAY_ICON if self.server_time.is_day() else NIGHT_ICON icon = ICON_DAY if self.server_time.is_day() else ICON_NIGHT
self.icon_indicator.set_icon_name(icon) self.icon_indicator.set_icon_name(icon)
def _on_server_clock_increment(self, emitter: Emitter, time_now: datetime) -> None: def _on_server_clock_increment(self, emitter: Emitter, time_now: datetime) -> None:
+6 -7
View File
@@ -1,6 +1,5 @@
from typing import Literal, Self, TYPE_CHECKING from typing import Literal, Self, TYPE_CHECKING
from dzgui.const.constants import NO_EXPAND, NO_FILL, NO_PADDING, EXPAND, FILL
from dzgui.strings import dialogs from dzgui.strings import dialogs
from dzgui.util import strings from dzgui.util import strings
from dzgui.views.components.buttons import ClipboardButton from dzgui.views.components.buttons import ClipboardButton
@@ -46,7 +45,7 @@ class GenericDialog(Gtk.MessageDialog):
def pack(self, widget: Gtk.Widget) -> None: def pack(self, widget: Gtk.Widget) -> None:
content = self.get_content_area() content = self.get_content_area()
content.pack_start(widget, EXPAND, FILL, NO_PADDING) content.pack_start(widget, expand=True, fill=True, padding=0)
class ConfirmationDialog(GenericDialog): class ConfirmationDialog(GenericDialog):
@@ -121,13 +120,13 @@ class WaitDialog(GenericDialog):
spinner_box.add(spinner) spinner_box.add(spinner)
if self.jobs > 1: if self.jobs > 1:
content.pack_start(self.prog, NO_EXPAND, NO_FILL, 0) content.pack_start(self.prog, expand=False, fill=False, padding=0)
else: else:
content.pack_start(spinner_box, NO_EXPAND, NO_FILL, 0) content.pack_start(spinner_box, expand=False, fill=False, padding=0)
spinner.start() spinner.start()
if show_cancel is True: if show_cancel is True:
content.pack_start(self.cancel, NO_EXPAND, NO_FILL, 0) content.pack_start(self.cancel, expand=False, fill=False, padding=0)
def update_text(self, msg: str) -> None: def update_text(self, msg: str) -> None:
self.format_secondary_text(msg) self.format_secondary_text(msg)
@@ -272,7 +271,7 @@ class ExceptionDialog(TextBufferDialog):
bottom_margin=10, bottom_margin=10,
) )
textview.set_buffer(Gtk.TextBuffer(text=trace)) textview.set_buffer(Gtk.TextBuffer(text=trace))
box.pack_start(textview, EXPAND, FILL, 0) box.pack_start(textview, expand=True, fill=True, padding=0)
self.error_details = Gtk.ScrolledWindow( self.error_details = Gtk.ScrolledWindow(
overlay_scrolling=False, overlay_scrolling=False,
@@ -296,7 +295,7 @@ class ExceptionDialog(TextBufferDialog):
) )
details_textview.set_buffer(self.details_buffer) details_textview.set_buffer(self.details_buffer)
details_box.pack_start(details_textview, EXPAND, FILL, 10) details_box.pack_start(details_textview, expand=True, fill=True, padding=10)
self.error_details.add(details_box) self.error_details.add(details_box)
self.error_notebook = Gtk.Notebook(show_tabs=False, margin_bottom=15) self.error_notebook = Gtk.Notebook(show_tabs=False, margin_bottom=15)
+1 -2
View File
@@ -1,7 +1,6 @@
import textwrap import textwrap
from typing import Self, TYPE_CHECKING from typing import Self, TYPE_CHECKING
from dzgui.const.constants import NO_EXPAND, NO_FILL
from dzgui.util.strings import notice from dzgui.util.strings import notice
from dzgui.views.dialogs.generic import GenericDialog from dzgui.views.dialogs.generic import GenericDialog
from dzgui.views.components.buttons import SteamTextButton from dzgui.views.components.buttons import SteamTextButton
@@ -42,7 +41,7 @@ class WorkshopLinkDialog(GenericDialog):
button.set_margin_start(60) button.set_margin_start(60)
button.set_margin_end(60) button.set_margin_end(60)
button.connect("clicked", self._on_button_clicked, uid) button.connect("clicked", self._on_button_clicked, uid)
self.dialogBox.pack_end(button, NO_EXPAND, NO_FILL, 0) self.dialogBox.pack_end(button, expand=False, fill=False, padding=0)
self.show_all() self.show_all()
self.connect("response", self._on_dialog_response) self.connect("response", self._on_dialog_response)
+2 -2
View File
@@ -2,7 +2,7 @@ import gi
import html import html
from typing import Self, TYPE_CHECKING from typing import Self, TYPE_CHECKING
from dzgui.const.constants import CALCULATOR from dzgui.const.icons import ICON_CALCULATOR
from dzgui.const.enum import ContextMenuGroup from dzgui.const.enum import ContextMenuGroup
from dzgui.model.model_factory import ModelFactory from dzgui.model.model_factory import ModelFactory
from dzgui.util import css from dzgui.util import css
@@ -110,7 +110,7 @@ class ServerDetailsDialog(ServerDialog):
text = format_hyperlinks(text) text = format_hyperlinks(text)
self.description.set_markup(html.escape(text)) self.description.set_markup(html.escape(text))
calc_button = IconTextButton(CALCULATOR, dialogs.toggle_calc) calc_button = IconTextButton(ICON_CALCULATOR, dialogs.toggle_calc)
calc_button.connect("clicked", self._on_calc_pressed) calc_button.connect("clicked", self._on_calc_pressed)
calc_button.set_halign(Gtk.Align.END) calc_button.set_halign(Gtk.Align.END)
calc_button.set_valign(Gtk.Align.START) calc_button.set_valign(Gtk.Align.START)
+4 -6
View File
@@ -3,14 +3,12 @@ from enum import Enum
from typing import Self, TYPE_CHECKING, Union from typing import Self, TYPE_CHECKING, Union
from dzgui.util import css from dzgui.util import css
from dzgui.const.icons import ICON_EDIT_DELETE, ICON_FOLDER, ICON_WARNING
from dzgui.const.constants import ( from dzgui.const.constants import (
APPID_DAYZ, APPID_DAYZ,
APPID_DAYZ_EXP, APPID_DAYZ_EXP,
APPNAME_DAYZ, APPNAME_DAYZ,
APPNAME_DAYZ_EXP_HUMAN, APPNAME_DAYZ_EXP_HUMAN,
EDIT_DELETE,
FOLDER,
WARNING,
) )
from dzgui.const.enum import ContextMenuGroup, NotebookPage from dzgui.const.enum import ContextMenuGroup, NotebookPage
from dzgui.managers.offline import OfflineManager from dzgui.managers.offline import OfflineManager
@@ -87,7 +85,7 @@ class FolderHBox(HBox):
self.emitter = controller.get_emitter() self.emitter = controller.get_emitter()
self.eb = InfoEventBox(eb_text, controller) self.eb = InfoEventBox(eb_text, controller)
self.button = IconTextButton(FOLDER, btn_label, Gtk.PositionType.LEFT) self.button = IconTextButton(ICON_FOLDER, btn_label, Gtk.PositionType.LEFT)
self.button.set_halign(Gtk.Align.START) self.button.set_halign(Gtk.Align.START)
self.button.set_image_position(Gtk.PositionType.LEFT) self.button.set_image_position(Gtk.PositionType.LEFT)
@@ -99,7 +97,7 @@ class FolderHBox(HBox):
self.label = Gtk.Label() self.label = Gtk.Label()
self.scrolled_label.add(self.label) self.scrolled_label.add(self.label)
self.unset_button = IconTextButton(EDIT_DELETE, offline.unset_button) self.unset_button = IconTextButton(ICON_EDIT_DELETE, offline.unset_button)
self.unset_button.connect("clicked", self._on_unset_clicked) self.unset_button.connect("clicked", self._on_unset_clicked)
self.spinner = Gtk.Spinner() self.spinner = Gtk.Spinner()
@@ -195,7 +193,7 @@ class ModFrame(HeadingFrame):
self.tree_vbox.extend([self.scrolled, self.status]) self.tree_vbox.extend([self.scrolled, self.status])
self.no_mods = HBox(spacing=10) self.no_mods = HBox(spacing=10)
no_mods_icon = Icon(WARNING, margin_start=10) no_mods_icon = Icon(ICON_WARNING, margin_start=10)
no_mods_label = Gtk.Label(label=offline.no_local_mods, halign=Gtk.Align.START) no_mods_label = Gtk.Label(label=offline.no_local_mods, halign=Gtk.Align.START)
self.no_mods.extend([no_mods_icon, no_mods_label]) self.no_mods.extend([no_mods_icon, no_mods_label])
+6 -10
View File
@@ -13,12 +13,8 @@ from dzgui.const.constants import (
FLATPAK_RUN_CMD, FLATPAK_RUN_CMD,
FLATPAK_SANDBOX, FLATPAK_SANDBOX,
FLATPAK_STEAM_PATH, FLATPAK_STEAM_PATH,
NO_EXPAND,
NO_FILL,
NO_PADDING,
VIEW_CONCEAL,
VIEW_REVEAL,
) )
from dzgui.const.icons import ICON_VIEW_CONCEAL, ICON_VIEW_REVEAL
from dzgui.const.endpoints import STEAM_API_SETUP from dzgui.const.endpoints import STEAM_API_SETUP
from dzgui.const.enum import Preferences, ServerTab from dzgui.const.enum import Preferences, ServerTab
from dzgui.strings import options from dzgui.strings import options
@@ -67,7 +63,7 @@ class SubmitField(Gtk.Box):
# TODO: audit for all applicable callbacks # TODO: audit for all applicable callbacks
if private: if private:
self.entry.set_icon_from_icon_name( self.entry.set_icon_from_icon_name(
Gtk.EntryIconPosition.SECONDARY, VIEW_REVEAL Gtk.EntryIconPosition.SECONDARY, ICON_VIEW_REVEAL
) )
self.entry.set_icon_activatable(Gtk.EntryIconPosition.SECONDARY, True) self.entry.set_icon_activatable(Gtk.EntryIconPosition.SECONDARY, True)
self.entry.connect("icon-release", self._on_icon_release) self.entry.connect("icon-release", self._on_icon_release)
@@ -131,9 +127,9 @@ class SubmitField(Gtk.Box):
) -> None: ) -> None:
visible = widget.get_visibility() visible = widget.get_visibility()
if visible: if visible:
icon, state = VIEW_REVEAL, False icon, state = ICON_VIEW_REVEAL, False
else: else:
icon, state = VIEW_CONCEAL, True icon, state = ICON_VIEW_CONCEAL, True
widget.set_icon_from_icon_name(Gtk.EntryIconPosition.SECONDARY, icon) widget.set_icon_from_icon_name(Gtk.EntryIconPosition.SECONDARY, icon)
widget.set_visibility(state) widget.set_visibility(state)
@@ -234,8 +230,8 @@ class ToggleField(Gtk.Box):
self.radio1 = Gtk.RadioButton.new_with_label(None, first_option) self.radio1 = Gtk.RadioButton.new_with_label(None, first_option)
self.radio2 = Gtk.RadioButton.new_from_widget(self.radio1) self.radio2 = Gtk.RadioButton.new_from_widget(self.radio1)
self.radio2.set_label(second_option) self.radio2.set_label(second_option)
self.pack_start(self.radio1, NO_EXPAND, NO_FILL, NO_PADDING) self.pack_start(self.radio1, expand=False, fill=False, padding=0)
self.pack_start(self.radio2, NO_EXPAND, NO_FILL, NO_PADDING) self.pack_start(self.radio2, expand=False, fill=False, padding=0)
def set_suboption_active(self, state: bool) -> None: def set_suboption_active(self, state: bool) -> None:
# NOTE: defer connection of signal until after state is set # NOTE: defer connection of signal until after state is set
+5 -5
View File
@@ -1,9 +1,9 @@
from dataclasses import dataclass from dataclasses import dataclass
from typing import Self, Sequence, TYPE_CHECKING from typing import Self, Sequence, TYPE_CHECKING
from dzgui.const.constants import ( from dzgui.const.icons import (
ERROR, ICON_ERROR,
WARNING, ICON_WARNING,
) )
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
@@ -166,7 +166,7 @@ class PreConnectionAssistant(Gtk.Box):
# TODO: abstract into components # TODO: abstract into components
self.warning_box = Gtk.Box(orientation=Gtk.Orientation.VERTICAL) self.warning_box = Gtk.Box(orientation=Gtk.Orientation.VERTICAL)
self.warning_tree = MaskedTree(WARNING) self.warning_tree = MaskedTree(ICON_WARNING)
self.warning_placeholder = Placeholder(preconnect.placeholder_no_warnings) self.warning_placeholder = Placeholder(preconnect.placeholder_no_warnings)
self.warning_box.add(self.warning_tree) self.warning_box.add(self.warning_tree)
self.warning_box.add(self.warning_placeholder) self.warning_box.add(self.warning_placeholder)
@@ -175,7 +175,7 @@ class PreConnectionAssistant(Gtk.Box):
) )
self.error_box = Gtk.Box(orientation=Gtk.Orientation.VERTICAL) self.error_box = Gtk.Box(orientation=Gtk.Orientation.VERTICAL)
self.error_tree = MaskedTree(ERROR) self.error_tree = MaskedTree(ICON_ERROR)
self.error_placeholder = Placeholder(preconnect.no_errors) self.error_placeholder = Placeholder(preconnect.no_errors)
self.error_box.add(self.error_tree) self.error_box.add(self.error_tree)
self.error_box.add(self.error_placeholder) self.error_box.add(self.error_placeholder)
+2 -2
View File
@@ -1,4 +1,4 @@
from pathlib import Path from shared import get_git_root
BOILERPLATE = """ BOILERPLATE = """
This file includes the combined licenses to the following components: This file includes the combined licenses to the following components:
@@ -40,7 +40,7 @@ class CombinedLicense:
def concat_license() -> str: def concat_license() -> str:
combined = CombinedLicense() combined = CombinedLicense()
root = Path(__file__).resolve().parents[1] root = get_git_root()
licenses = root.joinpath("docs/licenses") licenses = root.joinpath("docs/licenses")
main_license = root.joinpath(LICENSE_FILE) main_license = root.joinpath(LICENSE_FILE)
+5 -4
View File
@@ -1,10 +1,11 @@
import shutil import shutil
import subprocess import subprocess
from pathlib import Path
par = Path(__file__).parent.parent from shared import get_git_root
clog = par / "CHANGELOG.md"
target = par / "dzgui/data/CHANGELOG.md" root = get_git_root()
clog = root.joinpath("CHANGELOG.md")
target = root.joinpath("dzgui/data/CHANGELOG.md")
shutil.copy(clog, target) shutil.copy(clog, target)
+2 -3
View File
@@ -1,10 +1,9 @@
import tomllib import tomllib
from pathlib import Path from shared import get_git_root
root = Path(__file__).resolve().parents[1]
def get_entrypoint() -> None: def get_entrypoint() -> None:
root = get_git_root()
p = root.joinpath("pyproject.toml") p = root.joinpath("pyproject.toml")
with open(p, "rb") as f: with open(p, "rb") as f:
t = tomllib.load(f) t = tomllib.load(f)
+3 -2
View File
@@ -3,14 +3,15 @@ import requests
import subprocess import subprocess
import tarfile import tarfile
from pathlib import Path
from urllib.parse import unquote from urllib.parse import unquote
from shared import get_git_root
BUILD = "3.13.9" BUILD = "3.13.9"
DATE = "20251014" DATE = "20251014"
CPYTHON_BUILD = f"cpython-{BUILD}" CPYTHON_BUILD = f"cpython-{BUILD}"
root = Path(__file__).resolve().parents[1] root = get_git_root()
build_dir = root.joinpath("build") build_dir = root.joinpath("build")
cpython_dir = build_dir.joinpath(CPYTHON_BUILD) cpython_dir = build_dir.joinpath(CPYTHON_BUILD)
+2 -1
View File
@@ -9,6 +9,7 @@ from pathlib import Path
from concat_licenses import concat_license from concat_licenses import concat_license
from parse_toml import get_entrypoint from parse_toml import get_entrypoint
from prebuild import get_pyapp, rebuild_cpython from prebuild import get_pyapp, rebuild_cpython
from shared import get_git_root
def update_uname(info: tarfile.TarInfo) -> tarfile.TarInfo: def update_uname(info: tarfile.TarInfo) -> tarfile.TarInfo:
@@ -17,7 +18,7 @@ def update_uname(info: tarfile.TarInfo) -> tarfile.TarInfo:
return info return info
root = Path(__file__).resolve().parents[1] root = get_git_root()
dist_dir = root.joinpath("dist") dist_dir = root.joinpath("dist")
build_dir = root.joinpath("build") build_dir = root.joinpath("build")
+1 -10
View File
@@ -1,16 +1,7 @@
import subprocess
from pathlib import Path from pathlib import Path
from dzgui.app_init import build_gui from dzgui.app_init import build_gui
from shared import get_git_root
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())
def get_image_path() -> Path: def get_image_path() -> Path:
+11
View File
@@ -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())