mirror of
https://github.com/aclist/dztui.git
synced 2026-11-05 17:45:10 +01:00
Compare commits
1
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
12daf041ff |
No files matched your search
+3
-3
@@ -121,7 +121,7 @@ def load_steam_icon() -> None:
|
||||
logger.critical(e)
|
||||
|
||||
|
||||
def build_gui(version: str, is_debug: bool) -> App | None:
|
||||
def load_gui(version: str, is_debug: bool) -> None:
|
||||
lock = lock_acquire() # noqa
|
||||
|
||||
set_locale()
|
||||
@@ -151,7 +151,7 @@ def build_gui(version: str, is_debug: bool) -> App | None:
|
||||
wizard = SetupWizard(_is_steam_deck, XDG, xdg_paths)
|
||||
|
||||
if not wizard.is_setup_complete():
|
||||
return None
|
||||
return
|
||||
|
||||
setup_logger(XDG.debug)
|
||||
with open(XDG.debug, "w") as f:
|
||||
@@ -186,4 +186,4 @@ def build_gui(version: str, is_debug: bool) -> App | None:
|
||||
print(boot.all_ok)
|
||||
load_steam_icon()
|
||||
app = App(prefs)
|
||||
return app
|
||||
app.run(None)
|
||||
+2
-5
@@ -42,9 +42,6 @@ def main() -> None:
|
||||
test_libgi_missing()
|
||||
|
||||
# NOTE: only import ligbirepository modules after the above check
|
||||
from dzgui.app_init import build_gui
|
||||
from dzgui.app_init import load_gui
|
||||
|
||||
app = build_gui(version, args.debug)
|
||||
if app is None:
|
||||
sys.exit(0)
|
||||
app.run(None)
|
||||
load_gui(version, args.debug)
|
||||
@@ -1,80 +0,0 @@
|
||||
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
|
||||
+2
-20
@@ -1,7 +1,7 @@
|
||||
import logging
|
||||
import signal
|
||||
|
||||
from typing import Any, Literal, Self, TYPE_CHECKING
|
||||
from typing import TYPE_CHECKING, Literal, Self
|
||||
|
||||
from dzgui.const.constants import (
|
||||
APP_NAME,
|
||||
@@ -47,7 +47,7 @@ logger = logging.getLogger(APP_NAME)
|
||||
|
||||
|
||||
class OuterWindow(Gtk.ApplicationWindow):
|
||||
def __init__(self, app: "App") -> None:
|
||||
def __init__(self, app: Gtk.Application) -> None:
|
||||
super().__init__(
|
||||
application=app, title=APP_NAME, border_width=10, icon_name=APP_NAME_LOWER
|
||||
)
|
||||
@@ -78,15 +78,6 @@ class OuterWindow(Gtk.ApplicationWindow):
|
||||
MainController.loaded = True
|
||||
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:
|
||||
self.halt_proc_and_quit()
|
||||
|
||||
@@ -300,14 +291,6 @@ class App(ColorAwareApp, Gtk.Application): # type: ignore
|
||||
self._setup_signals()
|
||||
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:
|
||||
self.win = OuterWindow(app)
|
||||
|
||||
@@ -348,5 +331,4 @@ class App(ColorAwareApp, Gtk.Application): # type: ignore
|
||||
) -> None:
|
||||
self.win.halt_proc_and_quit()
|
||||
|
||||
|
||||
MainController = Controller()
|
||||
@@ -16,7 +16,9 @@ logger = logging.getLogger(APP_NAME)
|
||||
|
||||
class ContextMixin(TreeView):
|
||||
def present_menu(
|
||||
self, widget: Gtk.Widget, event: Gdk.Event
|
||||
self,
|
||||
widget: Gtk.Widget,
|
||||
event: Gdk.EventButton | Gdk.EventKey,
|
||||
) -> bool:
|
||||
|
||||
if self.menu is None:
|
||||
|
||||
@@ -3,7 +3,6 @@ from pathlib import Path
|
||||
|
||||
root = Path(__file__).resolve().parents[1]
|
||||
|
||||
|
||||
def get_entrypoint() -> None:
|
||||
p = root.joinpath("pyproject.toml")
|
||||
with open(p, "rb") as f:
|
||||
|
||||
@@ -0,0 +1,47 @@
|
||||
import pytest
|
||||
|
||||
from dzgui.model.model_factory import FastInsertListStore
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def heterogeneous_list() -> None:
|
||||
return [["a", 0, True], ["b", 1, False]]
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def mismatched_length_list() -> None:
|
||||
return [["a", 0, True], ["b", 1, False, 0]]
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def extended_list(heterogeneous_list) -> None:
|
||||
fs = FastInsertListStore(str, int, bool)
|
||||
fs.extend(heterogeneous_list)
|
||||
return fs
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def appended_list(heterogeneous_list) -> None:
|
||||
fs = FastInsertListStore(str, int, bool)
|
||||
for row in heterogeneous_list:
|
||||
fs.append(row)
|
||||
return fs
|
||||
|
||||
|
||||
@pytest.mark.parametrize("target", ["extended_list", "appended_list"])
|
||||
def test_list_parity(heterogeneous_list, request, target) -> None:
|
||||
target = request.getfixturevalue(target)
|
||||
extracted = [[el for el in row] for row in target]
|
||||
assert heterogeneous_list == extracted
|
||||
|
||||
|
||||
def test_type_disparity(heterogeneous_list) -> None:
|
||||
with pytest.raises(TypeError):
|
||||
fs = FastInsertListStore(str, bool, bool)
|
||||
fs.extend(heterogeneous_list)
|
||||
|
||||
|
||||
def test_length_disparity(mismatched_length_list) -> None:
|
||||
with pytest.raises(ValueError):
|
||||
fs = FastInsertListStore(str, int, bool)
|
||||
fs.extend(mismatched_length_list)
|
||||
Reference in new issue
Block a user