mirror of
https://github.com/aclist/dztui.git
synced 2026-11-09 11:30:39 +01:00
Compare commits
25
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ae13dc9a89 | ||
|
|
d5706f969c | ||
|
|
790e34b20c | ||
|
|
35230ae03f | ||
|
|
46117ecdda | ||
|
|
30119fec46 | ||
|
|
ac01818549 | ||
|
|
d486712a4c | ||
|
|
d116702145 | ||
|
|
5bee3614bd | ||
|
|
c73b07991f | ||
|
|
199cd07982 | ||
|
|
e3d62c6749 | ||
|
|
5134bf02fb | ||
|
|
f97be9352d | ||
|
|
b092a809f4 | ||
|
|
2cc7710807 | ||
|
|
5fb10d9758 | ||
|
|
100cb43afc | ||
|
|
7e2a585812 | ||
|
|
c1181435b3 | ||
|
|
22a7814ce4 | ||
|
|
b030da5c65 | ||
|
|
3c0acdd068 | ||
|
|
141f96fb9f |
No files matched your search
@@ -17,7 +17,7 @@ DZGUI follows a specific set of guidelines, enumerated below:
|
|||||||
- Provide a free and open-source tool under GPL
|
- Provide a free and open-source tool under GPL
|
||||||
- Do not use undocumented, third-party servers to aggregate data; no central "DZGUI" server
|
- Do not use undocumented, third-party servers to aggregate data; no central "DZGUI" server
|
||||||
- All connections go to Steam and DayZ servers directly; the tool should function in perpetuity without intermediary endpoints
|
- All connections go to Steam and DayZ servers directly; the tool should function in perpetuity without intermediary endpoints
|
||||||
- Target Linux desktop and Steam deck specifically; not a cross-platform tool
|
- Target Linux desktop and Steam Deck specifically; not a cross-platform tool
|
||||||
|
|
||||||
## Setup and usage
|
## Setup and usage
|
||||||
|
|
||||||
|
|||||||
@@ -173,11 +173,12 @@ class Shortcuts:
|
|||||||
self.save_shortcuts()
|
self.save_shortcuts()
|
||||||
|
|
||||||
def save_shortcuts(self) -> None:
|
def save_shortcuts(self) -> None:
|
||||||
try:
|
if self.shortcuts_path.is_file():
|
||||||
backup = self.shortcuts_path.with_suffix(".vdf.bak")
|
try:
|
||||||
shutil.copy(self.shortcuts_path, backup)
|
backup = self.shortcuts_path.with_suffix(".vdf.bak")
|
||||||
except Exception as e:
|
shutil.copy(self.shortcuts_path, backup)
|
||||||
logger.critical(e)
|
except Exception as e:
|
||||||
|
logger.critical(e)
|
||||||
try:
|
try:
|
||||||
with open(self.shortcuts_path, "wb") as f:
|
with open(self.shortcuts_path, "wb") as f:
|
||||||
vdf.binary_dump(self.shortcuts, f)
|
vdf.binary_dump(self.shortcuts, f)
|
||||||
|
|||||||
+3
-5
@@ -13,7 +13,7 @@ from warnings import deprecated
|
|||||||
|
|
||||||
from dzgui.api.acf import ACF
|
from dzgui.api.acf import ACF
|
||||||
from dzgui.init.prereqs import has_any_client
|
from dzgui.init.prereqs import has_any_client
|
||||||
from dzgui.init.proc import has_cmd
|
from dzgui.init.prereqs import has_flatpak_client, has_steam_client
|
||||||
from dzgui.const.constants import (
|
from dzgui.const.constants import (
|
||||||
APPID_DAYZ,
|
APPID_DAYZ,
|
||||||
APPID_DAYZ_EXP,
|
APPID_DAYZ_EXP,
|
||||||
@@ -23,11 +23,9 @@ from dzgui.const.constants import (
|
|||||||
DEBIAN_STEAM_PATH,
|
DEBIAN_STEAM_PATH,
|
||||||
DEFAULT_STEAM_PATH,
|
DEFAULT_STEAM_PATH,
|
||||||
DOWNLOADS_PATH,
|
DOWNLOADS_PATH,
|
||||||
FLATPAK_CMD,
|
|
||||||
FLATPAK_STEAM_PATH,
|
FLATPAK_STEAM_PATH,
|
||||||
LIBRARYFOLDERS_PATH,
|
LIBRARYFOLDERS_PATH,
|
||||||
REQUEST_TIMEOUT,
|
REQUEST_TIMEOUT,
|
||||||
STEAM_CMD,
|
|
||||||
UBUNTU_STEAM_PATH,
|
UBUNTU_STEAM_PATH,
|
||||||
VDF_PATH,
|
VDF_PATH,
|
||||||
)
|
)
|
||||||
@@ -85,9 +83,9 @@ def get_steam_paths() -> list[tuple[Path, str]]:
|
|||||||
}
|
}
|
||||||
|
|
||||||
for path in DEFAULT_PATH, FLATPAK_PATH, UBUNTU_PATH, DEBIAN_PATH:
|
for path in DEFAULT_PATH, FLATPAK_PATH, UBUNTU_PATH, DEBIAN_PATH:
|
||||||
if path is FLATPAK_PATH and has_cmd(FLATPAK_CMD) is False:
|
if path is FLATPAK_PATH and has_flatpak_client() is False:
|
||||||
continue
|
continue
|
||||||
if path is not FLATPAK_PATH and has_cmd(STEAM_CMD) is False:
|
if path is not FLATPAK_PATH and has_steam_client() is False:
|
||||||
continue
|
continue
|
||||||
if path.joinpath(VDF_PATH).is_file():
|
if path.joinpath(VDF_PATH).is_file():
|
||||||
paths.append((path, human[path]))
|
paths.append((path, human[path]))
|
||||||
|
|||||||
+11
-5
@@ -7,7 +7,12 @@ from pathlib import Path
|
|||||||
from typing import TYPE_CHECKING
|
from typing import TYPE_CHECKING
|
||||||
|
|
||||||
|
|
||||||
from dzgui.const.constants import APP_NAME, APP_NAME_LOWER, FLATPAK_ROOT_PATH, ICONS_PATH
|
from dzgui.const.constants import (
|
||||||
|
APP_NAME,
|
||||||
|
APP_NAME_LOWER,
|
||||||
|
FLATPAK_ROOT_PATH,
|
||||||
|
ICONS_PATH,
|
||||||
|
)
|
||||||
from dzgui.const.enum import Preferences
|
from dzgui.const.enum import Preferences
|
||||||
from dzgui.config.query import lookup
|
from dzgui.config.query import lookup
|
||||||
from dzgui.config.userprefs import UserPrefs
|
from dzgui.config.userprefs import UserPrefs
|
||||||
@@ -103,7 +108,8 @@ def load_steam_icon() -> None:
|
|||||||
import gi
|
import gi
|
||||||
|
|
||||||
gi.require_version("Gtk", "3.0")
|
gi.require_version("Gtk", "3.0")
|
||||||
from gi.repository import Gtk # noqa
|
from gi.repository import Gtk # noqa
|
||||||
|
|
||||||
try:
|
try:
|
||||||
traversable = resources.files(APP_NAME_LOWER).joinpath(ICONS_PATH)
|
traversable = resources.files(APP_NAME_LOWER).joinpath(ICONS_PATH)
|
||||||
icons = Path(str(traversable))
|
icons = Path(str(traversable))
|
||||||
@@ -115,7 +121,7 @@ def load_steam_icon() -> None:
|
|||||||
logger.critical(e)
|
logger.critical(e)
|
||||||
|
|
||||||
|
|
||||||
def load_gui(version: str, is_debug: bool) -> None:
|
def build_gui(version: str, is_debug: bool) -> App | None:
|
||||||
lock = lock_acquire() # noqa
|
lock = lock_acquire() # noqa
|
||||||
|
|
||||||
set_locale()
|
set_locale()
|
||||||
@@ -145,7 +151,7 @@ def load_gui(version: str, is_debug: bool) -> None:
|
|||||||
wizard = SetupWizard(_is_steam_deck, XDG, xdg_paths)
|
wizard = SetupWizard(_is_steam_deck, XDG, xdg_paths)
|
||||||
|
|
||||||
if not wizard.is_setup_complete():
|
if not wizard.is_setup_complete():
|
||||||
return
|
return None
|
||||||
|
|
||||||
setup_logger(XDG.debug)
|
setup_logger(XDG.debug)
|
||||||
with open(XDG.debug, "w") as f:
|
with open(XDG.debug, "w") as f:
|
||||||
@@ -180,4 +186,4 @@ def load_gui(version: str, is_debug: bool) -> None:
|
|||||||
print(boot.all_ok)
|
print(boot.all_ok)
|
||||||
load_steam_icon()
|
load_steam_icon()
|
||||||
app = App(prefs)
|
app = App(prefs)
|
||||||
app.run(None)
|
return app
|
||||||
@@ -96,6 +96,7 @@ LOG_FILTERS = ("CRITICAL", "WARNING", "INFO", "DEBUG")
|
|||||||
TMP_PATH = "/tmp"
|
TMP_PATH = "/tmp"
|
||||||
TMP_TARBALL = "/tmp/dzgui.tar.gz"
|
TMP_TARBALL = "/tmp/dzgui.tar.gz"
|
||||||
TMP_EXE = "/tmp/dzgui/dzgui"
|
TMP_EXE = "/tmp/dzgui/dzgui"
|
||||||
|
LOCK_FILE = "/tmp/dzgui.flock"
|
||||||
|
|
||||||
DAYZ_COMMUNITY_ROOT = "Missions"
|
DAYZ_COMMUNITY_ROOT = "Missions"
|
||||||
|
|
||||||
|
|||||||
@@ -111,6 +111,10 @@ class Emitter(GObject.GObject):
|
|||||||
def check_toggled(self, label: str, state: bool) -> None:
|
def check_toggled(self, label: str, state: bool) -> None:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
@GObject.Signal(flags=GObject.SignalFlags.RUN_LAST, arg_types=())
|
||||||
|
def servers_timed_out(self) -> None:
|
||||||
|
pass
|
||||||
|
|
||||||
@GObject.Signal(flags=GObject.SignalFlags.RUN_LAST, arg_types=(object,))
|
@GObject.Signal(flags=GObject.SignalFlags.RUN_LAST, arg_types=(object,))
|
||||||
def servers_loaded(self, tag: "ServerTab") -> None:
|
def servers_loaded(self, tag: "ServerTab") -> None:
|
||||||
pass
|
pass
|
||||||
|
|||||||
+3
-2
@@ -5,8 +5,9 @@ import sys
|
|||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
from typing import TextIO
|
from typing import TextIO
|
||||||
|
|
||||||
from dzgui.views.dialogs.early_alert import EarlyAlertDialog
|
from dzgui.const.constants import LOCK_FILE
|
||||||
from dzgui.util.strings import cannot_acquire_lock
|
from dzgui.util.strings import cannot_acquire_lock
|
||||||
|
from dzgui.views.dialogs.early_alert import EarlyAlertDialog
|
||||||
|
|
||||||
|
|
||||||
def lock_release(lock: TextIO) -> None:
|
def lock_release(lock: TextIO) -> None:
|
||||||
@@ -15,7 +16,7 @@ def lock_release(lock: TextIO) -> None:
|
|||||||
|
|
||||||
|
|
||||||
def lock_acquire() -> TextIO:
|
def lock_acquire() -> TextIO:
|
||||||
lockfile = Path("/tmp/dzgui.flock")
|
lockfile = Path(LOCK_FILE)
|
||||||
lock = open(lockfile, "w")
|
lock = open(lockfile, "w")
|
||||||
try:
|
try:
|
||||||
fcntl.flock(lock, fcntl.LOCK_EX | fcntl.LOCK_NB)
|
fcntl.flock(lock, fcntl.LOCK_EX | fcntl.LOCK_NB)
|
||||||
|
|||||||
@@ -3,11 +3,14 @@ import shutil
|
|||||||
import subprocess
|
import subprocess
|
||||||
|
|
||||||
from dzgui.const.constants import APP_NAME, FLATPAK_APPID, FLATPAK_CMD, STEAM_CMD
|
from dzgui.const.constants import APP_NAME, FLATPAK_APPID, FLATPAK_CMD, STEAM_CMD
|
||||||
|
from dzgui.init.proc import is_sandboxed
|
||||||
|
|
||||||
logger = logging.getLogger(APP_NAME)
|
logger = logging.getLogger(APP_NAME)
|
||||||
|
|
||||||
|
|
||||||
def has_flatpak_client() -> bool:
|
def has_flatpak_client() -> bool:
|
||||||
|
if is_sandboxed():
|
||||||
|
return True
|
||||||
try:
|
try:
|
||||||
res = subprocess.run(
|
res = subprocess.run(
|
||||||
[FLATPAK_CMD, "list", "--columns=application"],
|
[FLATPAK_CMD, "list", "--columns=application"],
|
||||||
|
|||||||
+5
-2
@@ -42,6 +42,9 @@ def main() -> None:
|
|||||||
test_libgi_missing()
|
test_libgi_missing()
|
||||||
|
|
||||||
# NOTE: only import ligbirepository modules after the above check
|
# NOTE: only import ligbirepository modules after the above check
|
||||||
from dzgui.app_init import load_gui
|
from dzgui.app_init import build_gui
|
||||||
|
|
||||||
load_gui(version, args.debug)
|
app = build_gui(version, args.debug)
|
||||||
|
if app is None:
|
||||||
|
sys.exit(0)
|
||||||
|
app.run(None)
|
||||||
@@ -92,6 +92,7 @@ class ServerModelManager:
|
|||||||
job = Servers.query_api
|
job = Servers.query_api
|
||||||
params = Servers.params
|
params = Servers.params
|
||||||
servers = []
|
servers = []
|
||||||
|
|
||||||
with ThreadPoolExecutor() as executor:
|
with ThreadPoolExecutor() as executor:
|
||||||
futures = [executor.submit(job, key, APPID_DAYZ, param) for param in params]
|
futures = [executor.submit(job, key, APPID_DAYZ, param) for param in params]
|
||||||
for future in as_completed(futures):
|
for future in as_completed(futures):
|
||||||
@@ -414,6 +415,8 @@ class ServerModelManager:
|
|||||||
# TODO: disable map, keyword, and filter widgets if model is None
|
# TODO: disable map, keyword, and filter widgets if model is None
|
||||||
# signal driven (servers_empty, servers_failed_to_load)
|
# signal driven (servers_empty, servers_failed_to_load)
|
||||||
|
|
||||||
|
self.emitter.emit("servers_timed_out")
|
||||||
|
|
||||||
if self.preserve_on_fail is False:
|
if self.preserve_on_fail is False:
|
||||||
self.tv.set_model(None)
|
self.tv.set_model(None)
|
||||||
filter_man = self.tv.get_filter_man()
|
filter_man = self.tv.get_filter_man()
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import logging
|
import logging
|
||||||
import subprocess
|
import subprocess
|
||||||
|
|
||||||
from dzgui.const.constants import APP_NAME, FLATPAK_APPID, GTK_APP_ID
|
from dzgui.const.constants import APP_NAME, FLATPAK_APPID, GTK_APP_ID, TMP_PATH
|
||||||
|
|
||||||
logger = logging.getLogger(APP_NAME)
|
logger = logging.getLogger(APP_NAME)
|
||||||
|
|
||||||
@@ -18,7 +18,11 @@ def apply_overrides(xdg: dict[str, str]) -> None:
|
|||||||
]
|
]
|
||||||
subprocess.run([*args], capture_output=True)
|
subprocess.run([*args], capture_output=True)
|
||||||
|
|
||||||
for path in xdg.values():
|
paths: list[str] = []
|
||||||
|
paths.extend([*xdg.values()])
|
||||||
|
paths.append(TMP_PATH)
|
||||||
|
|
||||||
|
for path in paths:
|
||||||
args = [
|
args = [
|
||||||
"flatpak",
|
"flatpak",
|
||||||
"--user",
|
"--user",
|
||||||
|
|||||||
@@ -0,0 +1,80 @@
|
|||||||
|
from pathlib import Path
|
||||||
|
from typing import cast, TYPE_CHECKING
|
||||||
|
|
||||||
|
import gi
|
||||||
|
|
||||||
|
gi.require_version("Gtk", "3.0")
|
||||||
|
from gi.repository import Gtk, Gdk, GLib # noqa E402
|
||||||
|
|
||||||
|
if TYPE_CHECKING:
|
||||||
|
from dzgui.controllers.mc import Controller
|
||||||
|
from dzgui.views.base import OuterWindow
|
||||||
|
from dzgui.views.mixins.context_mixin import ContextMixin
|
||||||
|
from gi.repository import GdkPixbuf
|
||||||
|
|
||||||
|
# TODO: randomize/mock PII distance values
|
||||||
|
|
||||||
|
|
||||||
|
class IdleScreenshot:
|
||||||
|
def __init__(
|
||||||
|
self, controller: "Controller", window: "OuterWindow", scrot_path: Path
|
||||||
|
) -> None:
|
||||||
|
self.window = window
|
||||||
|
self.controller = controller
|
||||||
|
self.scrot_path = scrot_path
|
||||||
|
|
||||||
|
clock = window.get_frame_clock()
|
||||||
|
if clock is None:
|
||||||
|
raise TypeError("Widget not realized, FrameClock not initialized")
|
||||||
|
clock.connect("after-paint", self.callback)
|
||||||
|
|
||||||
|
def callback(self, clock: Gdk.FrameClock) -> None:
|
||||||
|
GLib.timeout_add(1000, self.check_idle)
|
||||||
|
|
||||||
|
def check_idle(self) -> bool:
|
||||||
|
tv = self.controller.get_active_treeview()
|
||||||
|
loaded = tv.is_loaded()
|
||||||
|
if loaded is True:
|
||||||
|
self.emit_key_press(tv)
|
||||||
|
GLib.timeout_add(1000, self.save_and_quit)
|
||||||
|
return True
|
||||||
|
return False
|
||||||
|
|
||||||
|
def emit_key_press(self, widget: "ContextMixin") -> None:
|
||||||
|
window = widget.get_parent_window()
|
||||||
|
if window is None:
|
||||||
|
raise TypeError(f"Failed to find a valid parent window for {widget}")
|
||||||
|
event = Gdk.EventKey.new(Gdk.EventType.KEY_PRESS)
|
||||||
|
# NOTE: GTK introspection returns Gdk.Event type
|
||||||
|
event_key = cast(Gdk.EventKey, event)
|
||||||
|
event_key.keyval = Gdk.KEY_l
|
||||||
|
event_key.state = Gdk.ModifierType.CONTROL_MASK
|
||||||
|
event_key.window = window
|
||||||
|
event_key.time = Gdk.CURRENT_TIME
|
||||||
|
event_key.send_event = True
|
||||||
|
# TODO: suppress errors from synthetic key events
|
||||||
|
widget.present_menu(widget, event)
|
||||||
|
|
||||||
|
def save_and_quit(self) -> None:
|
||||||
|
self.save_pixbuf()
|
||||||
|
self.controller.save_res_and_quit()
|
||||||
|
|
||||||
|
def save_pixbuf(self) -> None:
|
||||||
|
pixbuf = self.capture_application()
|
||||||
|
if pixbuf:
|
||||||
|
pixbuf.savev(str(self.scrot_path), "png", [], [])
|
||||||
|
|
||||||
|
def capture_application(self) -> "GdkPixbuf.Pixbuf":
|
||||||
|
# NOTE: composited context menu over X11 window
|
||||||
|
root = Gdk.get_default_root_window()
|
||||||
|
|
||||||
|
xwindow = self.window.get_window()
|
||||||
|
if xwindow is None:
|
||||||
|
raise ValueError("Failed to get a valid X11 window")
|
||||||
|
index, x, y = xwindow.get_origin()
|
||||||
|
width, height = self.window.get_size()
|
||||||
|
|
||||||
|
application = Gdk.pixbuf_get_from_window(root, x, y, width, height)
|
||||||
|
if application is None:
|
||||||
|
raise ValueError("Failed to get a valid GdkPixbuf")
|
||||||
|
return application
|
||||||
+20
-2
@@ -1,7 +1,7 @@
|
|||||||
import logging
|
import logging
|
||||||
import signal
|
import signal
|
||||||
|
|
||||||
from typing import TYPE_CHECKING, Literal, Self
|
from typing import Any, Literal, Self, TYPE_CHECKING
|
||||||
|
|
||||||
from dzgui.const.constants import (
|
from dzgui.const.constants import (
|
||||||
APP_NAME,
|
APP_NAME,
|
||||||
@@ -47,7 +47,7 @@ logger = logging.getLogger(APP_NAME)
|
|||||||
|
|
||||||
|
|
||||||
class OuterWindow(Gtk.ApplicationWindow):
|
class OuterWindow(Gtk.ApplicationWindow):
|
||||||
def __init__(self, app: Gtk.Application) -> None:
|
def __init__(self, app: "App") -> None:
|
||||||
super().__init__(
|
super().__init__(
|
||||||
application=app, title=APP_NAME, border_width=10, icon_name=APP_NAME_LOWER
|
application=app, title=APP_NAME, border_width=10, icon_name=APP_NAME_LOWER
|
||||||
)
|
)
|
||||||
@@ -78,6 +78,15 @@ class OuterWindow(Gtk.ApplicationWindow):
|
|||||||
MainController.loaded = True
|
MainController.loaded = True
|
||||||
MainController.populate_model(MainController.get_active_treeview())
|
MainController.populate_model(MainController.get_active_treeview())
|
||||||
|
|
||||||
|
try:
|
||||||
|
from dzgui.util.save_screenshot import IdleScreenshot
|
||||||
|
|
||||||
|
scrot = app.get_automation_param("screenshot_path")
|
||||||
|
self.fullscreen()
|
||||||
|
IdleScreenshot(MainController, self, scrot)
|
||||||
|
except KeyError:
|
||||||
|
pass
|
||||||
|
|
||||||
def _on_delete_event(self, window: "OuterWindow", event: Gdk.EventKey) -> None:
|
def _on_delete_event(self, window: "OuterWindow", event: Gdk.EventKey) -> None:
|
||||||
self.halt_proc_and_quit()
|
self.halt_proc_and_quit()
|
||||||
|
|
||||||
@@ -291,6 +300,14 @@ class App(ColorAwareApp, Gtk.Application): # type: ignore
|
|||||||
self._setup_signals()
|
self._setup_signals()
|
||||||
self.connect("activate", self._on_activate)
|
self.connect("activate", self._on_activate)
|
||||||
|
|
||||||
|
self.automation_params: dict[str, Any] = {}
|
||||||
|
|
||||||
|
def get_automation_param(self, key: str) -> Any:
|
||||||
|
return self.automation_params[key]
|
||||||
|
|
||||||
|
def set_automation_param(self, key: str, value: Any) -> None:
|
||||||
|
self.automation_params[key] = value
|
||||||
|
|
||||||
def _on_activate(self, app: Self) -> None:
|
def _on_activate(self, app: Self) -> None:
|
||||||
self.win = OuterWindow(app)
|
self.win = OuterWindow(app)
|
||||||
|
|
||||||
@@ -331,4 +348,5 @@ class App(ColorAwareApp, Gtk.Application): # type: ignore
|
|||||||
) -> None:
|
) -> None:
|
||||||
self.win.halt_proc_and_quit()
|
self.win.halt_proc_and_quit()
|
||||||
|
|
||||||
|
|
||||||
MainController = Controller()
|
MainController = Controller()
|
||||||
@@ -163,18 +163,24 @@ class RefreshButton(IconTextButton):
|
|||||||
self.set_tooltip_text(atomic_buttons.refresh_tooltip)
|
self.set_tooltip_text(atomic_buttons.refresh_tooltip)
|
||||||
|
|
||||||
self.connect("clicked", self._on_refresh_clicked)
|
self.connect("clicked", self._on_refresh_clicked)
|
||||||
emitter.connect("servers_loaded", self.start_decrement)
|
emitter.connect("servers_loaded", self._on_load)
|
||||||
|
emitter.connect("servers_timed_out", self._on_timeout)
|
||||||
|
|
||||||
|
def _on_timeout(self, emitter: "Emitter") -> None:
|
||||||
|
self.is_clicked = True
|
||||||
|
self.start_decrement()
|
||||||
|
|
||||||
|
def _on_load(self, emitter: "Emitter", tab: "ServerTab") -> None:
|
||||||
|
self.start_decrement()
|
||||||
|
|
||||||
def _on_refresh_clicked(self, button: Self) -> None:
|
def _on_refresh_clicked(self, button: Self) -> None:
|
||||||
"""Spawned in a thread"""
|
"""Spawned in a thread"""
|
||||||
if self.controller.get_active_treeview().is_loaded() is False:
|
|
||||||
return
|
|
||||||
self.is_clicked = True
|
self.is_clicked = True
|
||||||
self.controller.refresh_tree()
|
self.controller.refresh_tree()
|
||||||
# TODO: get server tab enum
|
# TODO: get server tab enum
|
||||||
# if LAN tab, reload existing entries in place
|
# if LAN tab, reload existing entries in place
|
||||||
|
|
||||||
def start_decrement(self, emitter: "Emitter", tab: "ServerTab") -> None:
|
def start_decrement(self) -> None:
|
||||||
if self.is_clicked is False:
|
if self.is_clicked is False:
|
||||||
return
|
return
|
||||||
if self.loading:
|
if self.loading:
|
||||||
|
|||||||
@@ -14,6 +14,7 @@ from dzgui.const.constants import (
|
|||||||
HERO_PATH,
|
HERO_PATH,
|
||||||
FLATPAK_ROOT_PATH,
|
FLATPAK_ROOT_PATH,
|
||||||
LEGACY_CONFIG_PATH,
|
LEGACY_CONFIG_PATH,
|
||||||
|
TMP_PATH
|
||||||
)
|
)
|
||||||
from dzgui.const.boilerplate import config_boilerplate
|
from dzgui.const.boilerplate import config_boilerplate
|
||||||
from dzgui.const.endpoints import STEAM_API_SETUP
|
from dzgui.const.endpoints import STEAM_API_SETUP
|
||||||
@@ -432,6 +433,8 @@ class FlatpakOverridePage(EnumeratedWizardPage):
|
|||||||
store = Gtk.ListStore(str)
|
store = Gtk.ListStore(str)
|
||||||
for path in xdg_paths.values():
|
for path in xdg_paths.values():
|
||||||
store.append((str(path),))
|
store.append((str(path),))
|
||||||
|
store.append((TMP_PATH,))
|
||||||
|
|
||||||
tree = SimpleTree(store, wizard.tree_column)
|
tree = SimpleTree(store, wizard.tree_column)
|
||||||
tree.set_halign(Gtk.Align.CENTER)
|
tree.set_halign(Gtk.Align.CENTER)
|
||||||
|
|
||||||
|
|||||||
@@ -16,9 +16,7 @@ logger = logging.getLogger(APP_NAME)
|
|||||||
|
|
||||||
class ContextMixin(TreeView):
|
class ContextMixin(TreeView):
|
||||||
def present_menu(
|
def present_menu(
|
||||||
self,
|
self, widget: Gtk.Widget, event: Gdk.Event
|
||||||
widget: Gtk.Widget,
|
|
||||||
event: Gdk.EventButton | Gdk.EventKey,
|
|
||||||
) -> bool:
|
) -> bool:
|
||||||
|
|
||||||
if self.menu is None:
|
if self.menu is None:
|
||||||
|
|||||||
+1
-1
@@ -4,7 +4,7 @@ description = "DayZ server browser and mod manager for Linux"
|
|||||||
authors = [
|
authors = [
|
||||||
{name = "aclist"}
|
{name = "aclist"}
|
||||||
]
|
]
|
||||||
version = "7.0.0b28"
|
version = "7.0.0b29"
|
||||||
license = "GPL-3.0-or-later"
|
license = "GPL-3.0-or-later"
|
||||||
license-files = ["LICENSE"]
|
license-files = ["LICENSE"]
|
||||||
readme = "README.md"
|
readme = "README.md"
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ from pathlib import Path
|
|||||||
|
|
||||||
root = Path(__file__).resolve().parents[1]
|
root = Path(__file__).resolve().parents[1]
|
||||||
|
|
||||||
|
|
||||||
def get_entrypoint() -> None:
|
def get_entrypoint() -> None:
|
||||||
p = root.joinpath("pyproject.toml")
|
p = root.joinpath("pyproject.toml")
|
||||||
with open(p, "rb") as f:
|
with open(p, "rb") as f:
|
||||||
|
|||||||
Reference in new issue
Block a user