mirror of
https://github.com/aclist/dztui.git
synced 2026-11-10 12:00:38 +01:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
72e3d95808 |
No files matched your search
@@ -37,30 +37,15 @@ 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
|
||||||
|
|||||||
@@ -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"
|
||||||
@@ -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
|
from dzgui.const.constants import APP_NAME, NO_EXPAND, NO_FILL, NO_PADDING
|
||||||
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, expand=False, fill=False, padding=0)
|
self.pack_start(button, NO_EXPAND, NO_FILL, NO_PADDING)
|
||||||
|
|
||||||
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()
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|
||||||
|
|||||||
@@ -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()
|
||||||
|
|||||||
@@ -3,8 +3,12 @@ from typing import Literal, TYPE_CHECKING
|
|||||||
|
|
||||||
from dzgui.const.constants import (
|
from dzgui.const.constants import (
|
||||||
APP_NAME,
|
APP_NAME,
|
||||||
SEARCH_ICON,
|
EXPAND,
|
||||||
|
NO_EXPAND,
|
||||||
|
NO_FILL,
|
||||||
|
NO_PADDING,
|
||||||
)
|
)
|
||||||
|
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
|
||||||
@@ -38,10 +42,7 @@ class ButtonGrid(Gtk.Grid):
|
|||||||
self.checks: list[Gtk.CheckButton] = []
|
self.checks: list[Gtk.CheckButton] = []
|
||||||
|
|
||||||
flowbox = Gtk.FlowBox(
|
flowbox = Gtk.FlowBox(
|
||||||
halign=Gtk.Align.CENTER,
|
halign=Gtk.Align.CENTER, min_children_per_line=3, max_children_per_line=3, selection_mode=Gtk.SelectionMode.NONE
|
||||||
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():
|
||||||
@@ -108,7 +109,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)
|
||||||
@@ -200,7 +201,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=True)
|
self.maps_combo.pack_start(renderer_text, EXPAND)
|
||||||
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)
|
||||||
|
|
||||||
@@ -210,7 +211,7 @@ class FilterPanel(Gtk.Box):
|
|||||||
self.maps_combo,
|
self.maps_combo,
|
||||||
self.button_grid,
|
self.button_grid,
|
||||||
):
|
):
|
||||||
self.pack_start(el, expand=False, fill=False, padding=0)
|
self.pack_start(el, NO_EXPAND, NO_FILL, NO_PADDING)
|
||||||
|
|
||||||
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()
|
||||||
|
|||||||
@@ -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()
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
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
|
||||||
|
|
||||||
@@ -54,7 +55,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, expand=False, fill=True, padding=0)
|
self.main_panel.pack_start(b, NO_EXPAND, FILL, NO_PADDING)
|
||||||
|
|
||||||
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)
|
||||||
@@ -66,11 +67,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, expand=False, fill=True, padding=0)
|
self.stale_panel.pack_start(b, NO_EXPAND, FILL, NO_PADDING)
|
||||||
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, expand=False, fill=True, padding=0)
|
self.pack_start(el, NO_EXPAND, FILL, NO_PADDING)
|
||||||
|
|
||||||
self.connect("map", self._reinit_button)
|
self.connect("map", self._reinit_button)
|
||||||
|
|
||||||
|
|||||||
@@ -6,6 +6,10 @@ 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
|
||||||
@@ -69,9 +73,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, expand=False, fill=True, padding=0)
|
self.pack_start(el, NO_EXPAND, FILL, NO_PADDING)
|
||||||
|
|
||||||
self.pack_start(self.sel_panel, expand=False, fill=True, padding=0)
|
self.pack_start(self.sel_panel, NO_EXPAND, NO_FILL, NO_PADDING)
|
||||||
|
|
||||||
self.update_button = IconTextButton(
|
self.update_button = IconTextButton(
|
||||||
"dialog-information-symbolic", label="Updates available"
|
"dialog-information-symbolic", label="Updates available"
|
||||||
@@ -92,7 +96,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, expand=False, fill=True, padding=0)
|
self.pack_start(self.gutter_box, NO_EXPAND, FILL, NO_PADDING)
|
||||||
|
|
||||||
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
|
||||||
|
|||||||
@@ -14,6 +14,7 @@ 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
|
||||||
@@ -117,8 +118,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=True, fill=True, padding=0)
|
self.content.pack_start(self.scrollable_tree, EXPAND, FILL, 0)
|
||||||
self.content.pack_start(self.error_box, expand=True, fill=True, padding=0)
|
self.content.pack_start(self.error_box, EXPAND, FILL, 0)
|
||||||
self.show_all()
|
self.show_all()
|
||||||
|
|
||||||
self.error_box.hide()
|
self.error_box.hide()
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
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
|
||||||
@@ -45,7 +46,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=True, fill=True, padding=0)
|
content.pack_start(widget, EXPAND, FILL, NO_PADDING)
|
||||||
|
|
||||||
|
|
||||||
class ConfirmationDialog(GenericDialog):
|
class ConfirmationDialog(GenericDialog):
|
||||||
@@ -120,13 +121,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, expand=False, fill=False, padding=0)
|
content.pack_start(self.prog, NO_EXPAND, NO_FILL, 0)
|
||||||
else:
|
else:
|
||||||
content.pack_start(spinner_box, expand=False, fill=False, padding=0)
|
content.pack_start(spinner_box, NO_EXPAND, NO_FILL, 0)
|
||||||
spinner.start()
|
spinner.start()
|
||||||
|
|
||||||
if show_cancel is True:
|
if show_cancel is True:
|
||||||
content.pack_start(self.cancel, expand=False, fill=False, padding=0)
|
content.pack_start(self.cancel, NO_EXPAND, NO_FILL, 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)
|
||||||
@@ -271,7 +272,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=True, fill=True, padding=0)
|
box.pack_start(textview, EXPAND, FILL, 0)
|
||||||
|
|
||||||
self.error_details = Gtk.ScrolledWindow(
|
self.error_details = Gtk.ScrolledWindow(
|
||||||
overlay_scrolling=False,
|
overlay_scrolling=False,
|
||||||
@@ -295,7 +296,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=True, fill=True, padding=10)
|
details_box.pack_start(details_textview, EXPAND, FILL, 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,6 +1,7 @@
|
|||||||
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
|
||||||
@@ -41,7 +42,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, expand=False, fill=False, padding=0)
|
self.dialogBox.pack_end(button, NO_EXPAND, NO_FILL, 0)
|
||||||
|
|
||||||
self.show_all()
|
self.show_all()
|
||||||
self.connect("response", self._on_dialog_response)
|
self.connect("response", self._on_dialog_response)
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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])
|
||||||
|
|
||||||
|
|||||||
@@ -13,9 +13,11 @@ from dzgui.const.constants import (
|
|||||||
FLATPAK_RUN_CMD,
|
FLATPAK_RUN_CMD,
|
||||||
FLATPAK_SANDBOX,
|
FLATPAK_SANDBOX,
|
||||||
FLATPAK_STEAM_PATH,
|
FLATPAK_STEAM_PATH,
|
||||||
VIEW_CONCEAL,
|
NO_EXPAND,
|
||||||
VIEW_REVEAL,
|
NO_FILL,
|
||||||
|
NO_PADDING,
|
||||||
)
|
)
|
||||||
|
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
|
||||||
@@ -64,7 +66,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)
|
||||||
@@ -128,9 +130,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)
|
||||||
|
|
||||||
@@ -231,8 +233,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, expand=False, fill=False, padding=0)
|
self.pack_start(self.radio1, NO_EXPAND, NO_FILL, NO_PADDING)
|
||||||
self.pack_start(self.radio2, expand=False, fill=False, padding=0)
|
self.pack_start(self.radio2, NO_EXPAND, NO_FILL, NO_PADDING)
|
||||||
|
|
||||||
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
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
Reference in new issue
Block a user