Skip to content

Commit 3730b4a

Browse files
authored
Resolve errors issued by Pyright (#12)
* fix: resolve most errors issued by Pyright - add `__gtype_name__` to GradiaApp and GradientWindow - Inherit from `Adw.ApplicationWindow` in GradientWindow - make `version` parameter required in `main` module - make image filter name string in `FileDialogImageLoader` translatable * feat: remove `self.win` object
1 parent 9fc48ad commit 3730b4a

File tree

5 files changed

+40
-27
lines changed

5 files changed

+40
-27
lines changed

gradia/clipboard.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,12 @@ def copy_file_to_clipboard(local_path: str) -> None:
3333
with open(local_path, "rb") as f:
3434
png_data: bytes = f.read()
3535

36+
display = Gdk.Display.get_default()
37+
if not display:
38+
print("Warning: Failed to retrieve `Gdk.Display` object.")
39+
return
40+
3641
bytes_data: GLib.Bytes = GLib.Bytes.new(png_data)
37-
clipboard: Gdk.Clipboard = Gdk.Display.get_default().get_clipboard()
42+
clipboard: Gdk.Clipboard = display.get_clipboard()
3843
content_provider: Gdk.ContentProvider = Gdk.ContentProvider.new_for_bytes("image/png", bytes_data)
3944
clipboard.set_content(content_provider)

gradia/main.py

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,18 @@
1818
import os
1919
import tempfile
2020
import shutil
21+
22+
from typing import Sequence
23+
2124
from gi.repository import Adw, Gio
25+
2226
from gradia.ui.window import GradientWindow
2327

2428

2529
class GradiaApp(Adw.Application):
26-
def __init__(self, version=None):
30+
__gtype_name__ = "GradiaApp"
31+
32+
def __init__(self, version: str):
2733
super().__init__(
2834
application_id="be.alexandervanhee.gradia",
2935
flags=Gio.ApplicationFlags.HANDLES_OPEN
@@ -33,11 +39,11 @@ def __init__(self, version=None):
3339
self.file_to_open = None
3440

3541
def do_activate(self):
36-
self.ui = GradientWindow(self, self.temp_dir, version=self.version)
42+
self.ui = GradientWindow(self.temp_dir, version=self.version, application=self)
3743
self.ui.build_ui()
3844
self.ui.show()
3945

40-
def do_open(self, files, n_files, hint):
46+
def do_open(self, files: Sequence[Gio.File], hint: str):
4147
self.activate()
4248

4349
def do_shutdown(self):
@@ -50,7 +56,7 @@ def do_shutdown(self):
5056
Gio.Application.do_shutdown(self)
5157

5258

53-
def main(version=None):
59+
def main(version: str):
5460
try:
5561
app = GradiaApp(version=version)
5662
return app.run(sys.argv)

gradia/ui/image_exporters.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,9 +60,9 @@ def save_to_file(self) -> None:
6060
filters.append(file_filter)
6161

6262
save_dialog.set_filters(filters)
63-
save_dialog.save(self.window.win, None, self._on_save_finished)
63+
save_dialog.save(self.window, None, self._on_save_finished)
6464

65-
def _on_save_finished(self, dialog: Gtk.FileDialog, result: Gio.Cancellable) -> None:
65+
def _on_save_finished(self, dialog: Gtk.FileDialog, result: Gio.AsyncResult) -> None:
6666
"""Handle save dialog completion"""
6767
try:
6868
file = dialog.save_finish(result)

gradia/ui/image_loaders.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -62,17 +62,17 @@ def open_file_dialog(self) -> None:
6262
file_dialog.set_title(_("Open Image"))
6363

6464
image_filter = Gtk.FileFilter()
65-
image_filter.set_name("Image Files")
65+
image_filter.set_name(_("Image Files"))
6666
for _ext, mime_type in self.SUPPORTED_INPUT_FORMATS:
6767
image_filter.add_mime_type(mime_type)
6868

6969
filters = Gio.ListStore.new(Gtk.FileFilter)
7070
filters.append(image_filter)
7171
file_dialog.set_filters(filters)
7272

73-
file_dialog.open(self.window.win, None, self._on_file_selected)
73+
file_dialog.open(self.window, None, self._on_file_selected)
7474

75-
def _on_file_selected(self, dialog: Gtk.FileDialog, result: Gio.Cancellable) -> None:
75+
def _on_file_selected(self, dialog: Gtk.FileDialog, result: Gio.AsyncResult) -> None:
7676
"""Handle file selection from dialog"""
7777
try:
7878
file = dialog.open_finish(result)
@@ -138,7 +138,7 @@ def __init__(self, window: Gtk.ApplicationWindow, temp_dir: str) -> None:
138138

139139
def load_from_clipboard(self) -> None:
140140
"""Load image from system clipboard"""
141-
clipboard = Gdk.Display.get_default().get_clipboard()
141+
clipboard = self.window.get_clipboard()
142142
clipboard.read_texture_async(None, self._handle_clipboard_texture)
143143

144144
def _handle_clipboard_texture(

gradia/ui/window.py

Lines changed: 18 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,9 @@
3030
from gradia.ui.image_exporters import ExportManager
3131

3232

33-
class GradientWindow:
33+
class GradientWindow(Adw.ApplicationWindow):
34+
__gtype_name__ = 'GradientWindow'
35+
3436
DEFAULT_WINDOW_WIDTH: int = 900
3537
DEFAULT_WINDOW_HEIGHT: int = 600
3638
DEFAULT_PANED_POSITION: int = 650
@@ -44,8 +46,10 @@ class GradientWindow:
4446
# Temp file names
4547
TEMP_PROCESSED_FILENAME: str = "processed.png"
4648

47-
def __init__(self, app: Adw.Application, temp_dir: str, version: str) -> None:
48-
self.app: Adw.Application = app
49+
def __init__(self, temp_dir: str, version: str, **kwargs) -> None:
50+
super().__init__(**kwargs)
51+
52+
self.app: Adw.Application = kwargs['application']
4953
self.temp_dir: str = temp_dir
5054
self.version: str = version
5155
self.image_path: Optional[str] = None
@@ -81,7 +85,7 @@ def __init__(self, app: Adw.Application, temp_dir: str, version: str) -> None:
8185
self.create_action("save", lambda *_: self.export_manager.save_to_file(), ["<Primary>s"], enabled=False)
8286
self.create_action("copy", lambda *_: self.export_manager.copy_to_clipboard(), ["<Primary>c"], enabled=False)
8387

84-
self.create_action("quit", lambda *_: self.win.close(), ["<Primary>q"])
88+
self.create_action("quit", lambda *_: self.close(), ["<Primary>q"])
8589

8690
def create_action(self, name: str, callback: Callable[..., None], shortcuts: Optional[list[str]] = None, enabled: bool = True) -> None:
8791
action: Gio.SimpleAction = Gio.SimpleAction.new(name, None)
@@ -109,11 +113,10 @@ def build_ui(self) -> None:
109113
self._setup_main_layout()
110114

111115
def _setup_window(self) -> None:
112-
self.win: Adw.ApplicationWindow = Adw.ApplicationWindow(application=self.app)
113-
self.win.set_title("Gradia")
114-
self.win.set_default_size(self.DEFAULT_WINDOW_WIDTH, self.DEFAULT_WINDOW_HEIGHT)
116+
self.set_title("Gradia")
117+
self.set_default_size(self.DEFAULT_WINDOW_WIDTH, self.DEFAULT_WINDOW_HEIGHT)
115118
self.toast_overlay: Adw.ToastOverlay = Adw.ToastOverlay()
116-
self.win.set_content(self.toast_overlay)
119+
self.set_content(self.toast_overlay)
117120

118121
def _setup_toolbar(self) -> None:
119122
self.toolbar_view: Adw.ToolbarView = Adw.ToolbarView()
@@ -158,11 +161,11 @@ def _setup_main_layout(self) -> None:
158161
self.toolbar_view.set_content(self.main_box)
159162
self.toast_overlay.set_child(self.toolbar_view)
160163

161-
self.win.connect("notify::default-width", self._on_window_resize)
162-
self.win.connect("notify::default-height", self._on_window_resize)
164+
self.connect("notify::default-width", self._on_window_resize)
165+
self.connect("notify::default-height", self._on_window_resize)
163166

164167
def _on_window_resize(self, *args: Any) -> None:
165-
width: int = self.win.get_width()
168+
width: int = self.get_width()
166169
if width < 800:
167170
self.main_box.set_orientation(Gtk.Orientation.VERTICAL)
168171
self.sidebar.set_size_request(-1, 200)
@@ -171,7 +174,7 @@ def _on_window_resize(self, *args: Any) -> None:
171174
self.sidebar.set_size_request(300, -1)
172175

173176
def show(self) -> None:
174-
self.win.present()
177+
self.present()
175178

176179
def _start_processing(self) -> None:
177180
self.toolbar_view.set_top_bar_style(Adw.ToolbarStyle.RAISED)
@@ -291,17 +294,16 @@ def _set_loading_state(self, is_loading: bool) -> None:
291294

292295
def _on_about_activated(self, action: Gio.SimpleAction, param) -> None:
293296
about = create_about_dialog(version=self.version)
294-
about.present(self.win)
297+
about.present(self)
295298

296299
def _set_save_and_toggle_(self, enabled: bool) -> None:
297-
app = self.app
298300
for action_name in ["save", "copy"]:
299-
action: Optional[Gio.SimpleAction] = app.lookup_action(action_name)
301+
action: Optional[Gio.SimpleAction] = self.app.lookup_action(action_name)
300302
if action:
301303
action.set_enabled(enabled)
302304

303305
def _on_shortcuts_activated(self, action: Gio.SimpleAction, param) -> None:
304-
shortcuts = create_shortcuts_dialog(self.win)
306+
shortcuts = create_shortcuts_dialog(self)
305307
shortcuts.connect("close-request", self._on_shortcuts_closed)
306308
shortcuts.present()
307309

0 commit comments

Comments
 (0)