From fa2f86b03e5fdc286d02909eb79f4eb895d1f55f Mon Sep 17 00:00:00 2001 From: aclist <92275929+aclist@users.noreply.github.com> Date: Tue, 10 Nov 2026 02:41:24 +0900 Subject: [PATCH] chore: abstract string literals --- dzgui/managers/connection.py | 8 +++---- dzgui/managers/filter.py | 12 +++------- dzgui/model/proxy_model.py | 3 ++- dzgui/util/strings.py | 3 --- dzgui/views/components/buttons.py | 10 ++++----- dzgui/views/components/connect_panel.py | 18 +++++++-------- dzgui/views/components/entry.py | 7 +++--- dzgui/views/components/filter_panel.py | 21 ++++++++++------- dzgui/views/components/right_panel.py | 9 ++++---- dzgui/views/dialogs/generic.py | 3 +-- dzgui/views/dialogs/note.py | 30 +++++++++---------------- dzgui/views/dialogs/wizard.py | 2 +- dzgui/views/pages/servers.py | 4 ++-- 13 files changed, 56 insertions(+), 74 deletions(-) diff --git a/dzgui/managers/connection.py b/dzgui/managers/connection.py index 89c35f0..19a69d2 100644 --- a/dzgui/managers/connection.py +++ b/dzgui/managers/connection.py @@ -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 +from dzgui.strings.server_mods import checkmark, resync, invalid_mod 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,9 +197,8 @@ 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( @@ -277,8 +276,7 @@ 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] == "": - # TODO: strings - mod[2] = "Invalid mod" + mod[2] = invalid_mod return alpha_mods, missing_mods diff --git a/dzgui/managers/filter.py b/dzgui/managers/filter.py index 4151bc5..ffb41ef 100644 --- a/dzgui/managers/filter.py +++ b/dzgui/managers/filter.py @@ -2,7 +2,7 @@ from typing import TYPE_CHECKING from dzgui.model.model_factory import ModelFactory from dzgui.util import strings -from dzgui.util.strings import all_maps +from dzgui.strings.filters import all_maps if TYPE_CHECKING: from dzgui.model.model_factory import FastInsertListStore @@ -106,16 +106,10 @@ class FilterManager: self.reinit_map_store() maps.sort() - for m in maps: - # TODO: strings - if m == "All maps": - continue + clean = [m for m in maps if m != all_maps] + for m in clean: 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() diff --git a/dzgui/model/proxy_model.py b/dzgui/model/proxy_model.py index c892110..0ec9a12 100644 --- a/dzgui/model/proxy_model.py +++ b/dzgui/model/proxy_model.py @@ -5,6 +5,7 @@ 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 @@ -175,7 +176,7 @@ class ProxyModelManager: rows = self.filtered sel_map = self.filter_man.get_active_map_name() - if sel_map == strings.all_maps: + if sel_map == str_filters.all_maps: return rows rows = [row for row in rows if row[1] == sel_map] diff --git a/dzgui/util/strings.py b/dzgui/util/strings.py index 931ca88..095d49a 100644 --- a/dzgui/util/strings.py +++ b/dzgui/util/strings.py @@ -159,9 +159,6 @@ filter_unofficial = "Unofficial" filter_modded = "Modded" filter_unmodded = "Unmodded" -# maps -all_maps = "All maps" - # state unknown = "Unknown" none_provided = "None provided" diff --git a/dzgui/views/components/buttons.py b/dzgui/views/components/buttons.py index bb3d45d..7306319 100644 --- a/dzgui/views/components/buttons.py +++ b/dzgui/views/components/buttons.py @@ -106,8 +106,7 @@ class ClipboardButton(IconTextButton): self.controller = controller self.connect("clicked", self._on_button_clicked, func) - # TODO: strings - self.set_tooltip_text("Copy to clipboard") + self.set_tooltip_text(buttons.clipboard_button) def _on_button_clicked(self, button: Self, func: Callable) -> None: def revert() -> Literal[False]: @@ -125,16 +124,14 @@ class CopyIpButton(ClipboardButton): def __init__(self, controller: Union["Controller", None], func: Callable) -> None: super().__init__(controller, func) - # TODO: strings - self.set_tooltip_text("Copy IP to clipboard") + self.set_tooltip_text(buttons.clipboard_ip_button) class CloseButton(IconTextButton): def __init__(self, label: str) -> None: super().__init__(icon=CLOSE, label=label) - # TODO: strings - self.set_tooltip_text("Unset this server as favorite") + self.set_tooltip_text(buttons.unset_button_tooltip) class WebButton(IconTextButton): @@ -252,6 +249,7 @@ 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 = "" diff --git a/dzgui/views/components/connect_panel.py b/dzgui/views/components/connect_panel.py index 17d0a71..da1ecd4 100644 --- a/dzgui/views/components/connect_panel.py +++ b/dzgui/views/components/connect_panel.py @@ -3,6 +3,11 @@ 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, @@ -36,21 +41,18 @@ 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(self.collapse_text) + self.set_tooltip_text(dock_button_collapse) def collapse(self) -> None: self.set_image(Icon(CARET_UP)) self.child.hide() - self.set_tooltip_text(self.expand_text) + self.set_tooltip_text(dock_button_expand) def expand(self) -> None: self.set_image(Icon(CARET_DOWN)) self.child.show() - self.set_tooltip_text(self.collapse_text) + self.set_tooltip_text(dock_button_collapse) def _on_click(self, button: Self) -> None: if self.expanded: @@ -81,7 +83,6 @@ 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) @@ -189,8 +190,7 @@ class FavPanel(Gtk.Frame): self.fav_button.connect("clicked", self._on_connect_clicked) self.copy_button = CopyIpButton(self.controller, self.get_fav_ip) - # TODO: strings - self.unset_button = CloseButton("Unset") + self.unset_button = CloseButton(unset_button_label) self.unset_button.connect("clicked", self._on_unset_clicked) if favorite is None: diff --git a/dzgui/views/components/entry.py b/dzgui/views/components/entry.py index e1b3e7e..ef29d71 100644 --- a/dzgui/views/components/entry.py +++ b/dzgui/views/components/entry.py @@ -4,6 +4,7 @@ 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 @@ -143,9 +144,8 @@ class APIEntry(Gtk.Box): self.func: Callable | None = None - # TODO: strings self.entry = Gtk.Entry( - width_chars=60, hexpand=True, placeholder_text="Enter API key" + width_chars=60, hexpand=True, placeholder_text=api_placeholder ) self.entry.set_icon_from_icon_name(Gtk.EntryIconPosition.SECONDARY, VIEW_REVEAL) self.entry.set_icon_activatable(Gtk.EntryIconPosition.SECONDARY, True) @@ -154,8 +154,7 @@ class APIEntry(Gtk.Box): self.entry.connect("icon-release", self._on_icon_release) self.entry.connect("activate", self._on_field_activated) - # TODO: strings - self.submit = Gtk.Button(label="Validate") + self.submit = Gtk.Button(label=api_validate) self.submit.set_sensitive(False) self.submit.connect("clicked", self._on_submit) diff --git a/dzgui/views/components/filter_panel.py b/dzgui/views/components/filter_panel.py index 75c51e9..b715835 100644 --- a/dzgui/views/components/filter_panel.py +++ b/dzgui/views/components/filter_panel.py @@ -10,7 +10,12 @@ from dzgui.const.constants import ( SEARCH_ICON, ) from dzgui.util.format import format_exception -from dzgui.util.strings import all_maps +from dzgui.strings.filters import ( + all_maps, + filters_heading, + keyword_placeholder, + map_placeholder, +) from dzgui.views.components.maps_combo import MapsCombo from dzgui.views.components.labels import BoldLabel @@ -42,7 +47,10 @@ 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(): @@ -99,8 +107,7 @@ class ButtonGrid(Gtk.Grid): class KeywordEntry(Gtk.Entry): def __init__(self, controller: "Controller") -> None: - # TODO :strings - super().__init__(placeholder_text="Filter by keyword") + super().__init__(placeholder_text=keyword_placeholder) self.keyword = "" self.controller = controller @@ -174,8 +181,7 @@ class FilterPanel(Gtk.Box): self.keyword_entry = KeywordEntry(self.controller) self.button_grid = ButtonGrid(self.controller, defaults, tooltips) - # TODO: strings - self.filters_label = BoldLabel("Filters") + self.filters_label = BoldLabel(filters_heading) self.emitter.connect( "request_keyword_focus", lambda _: self.keyword_entry.grab_focus() @@ -195,8 +201,7 @@ class FilterPanel(Gtk.Box): self.maps_entry: Gtk.Entry = self.maps_combo.get_child() # type: ignore self.maps_entry.set_completion(completion) - # TODO: strings - self.maps_entry.set_placeholder_text("Filter by map") + self.maps_entry.set_placeholder_text(map_placeholder) 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) diff --git a/dzgui/views/components/right_panel.py b/dzgui/views/components/right_panel.py index f38def4..7e0f753 100644 --- a/dzgui/views/components/right_panel.py +++ b/dzgui/views/components/right_panel.py @@ -13,6 +13,7 @@ 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 @@ -65,8 +66,7 @@ class RightPanel(Gtk.Box): vexpand=True, halign=Gtk.Align.END, valign=Gtk.Align.END, - # TODO: strings - tooltip_text="Click to copy to clipboard", + tooltip_text=version_tooltip, ) 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="Updates available" + "dialog-information-symbolic", label=update_button ) self.gutter_box = Gtk.Box( @@ -131,7 +131,6 @@ class RightPanel(Gtk.Box): return self.copying = True version = self.version_label.get_text() - # TODO: strings - self.version_label.set_text("Copied!") + self.version_label.set_text(version_notifier) copy_clipboard(version) GLib.timeout_add_seconds(1, revert) diff --git a/dzgui/views/dialogs/generic.py b/dzgui/views/dialogs/generic.py index cff1e2a..ad355e9 100644 --- a/dzgui/views/dialogs/generic.py +++ b/dzgui/views/dialogs/generic.py @@ -140,8 +140,7 @@ class WaitDialog(GenericDialog): self.cur_job += 1 def _on_cancel_clicked(self, button: Gtk.Button) -> None: - # TODO: strings - GLib.idle_add(self.update_text, "Caught cancel signal, cleaning up") + GLib.idle_add(self.update_text, dialogs.caught_cancel_signal) self.controller.set_cancel_event() def show_cancel(self, state: bool) -> None: diff --git a/dzgui/views/dialogs/note.py b/dzgui/views/dialogs/note.py index b595e90..362f1d8 100644 --- a/dzgui/views/dialogs/note.py +++ b/dzgui/views/dialogs/note.py @@ -1,12 +1,13 @@ 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 # noqa E402 +import gi gi.require_version("Gtk", "3.0") -from gi.repository import Gdk, Gtk # noqa E402 +from gi.repository import Gtk if TYPE_CHECKING: from dzgui.controllers.mc import Controller @@ -14,23 +15,20 @@ 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=title, + text=notes.dialog_title, buttons=Gtk.ButtonsType.NONE, mtype=Gtk.MessageType.INFO, - secondary=secondary, + secondary=notes.dialog_subtitle, ) self.controller = controller - delete_button = Gtk.Button(label="Delete note") + delete_button = Gtk.Button(label=notes.delete_button) delete_button.set_sensitive(False) self.add_action_widget(delete_button, Gtk.ResponseType.CANCEL) - self.ok = self.add_button("Update note", Gtk.ResponseType.OK) + self.ok = self.add_button(notes.ok_button, Gtk.ResponseType.OK) self.ok.grab_default() self.entry = ValidatedEntry(controller, self.validate) @@ -42,7 +40,7 @@ class NoteDialog(GenericDialog): self.entry.set_text(note) if len(note) > 0: delete_button.set_sensitive(True) - self.format_secondary_text(f"Current note: '{note}'") + self.format_secondary_text(notes.current_note.format(note)) elif len(note) == 0: self.ok.set_sensitive(False) @@ -55,9 +53,6 @@ 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) @@ -71,14 +66,11 @@ 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() - self.destroy() - case Gtk.ResponseType.CANCEL | Gtk.ResponseType.CLOSE: - self.destroy() + case _: + pass + self.destroy() diff --git a/dzgui/views/dialogs/wizard.py b/dzgui/views/dialogs/wizard.py index 5dbcdb4..8591ba3 100644 --- a/dzgui/views/dialogs/wizard.py +++ b/dzgui/views/dialogs/wizard.py @@ -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 diff --git a/dzgui/views/pages/servers.py b/dzgui/views/pages/servers.py index caefe21..c482929 100644 --- a/dzgui/views/pages/servers.py +++ b/dzgui/views/pages/servers.py @@ -5,6 +5,7 @@ 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 @@ -147,8 +148,7 @@ class ServerNotebook(Gtk.ScrolledWindow): label = self.notebook.get_tab_label_text(child) if label is not None: - # TODO: strings - text = label.strip("*") + text = label.strip(tab_changed_label) self.notebook.set_tab_label_text(child, text) tree = child.get_tree()