Skip to content

Commit 8d0a27d

Browse files
authored
refactor: add missing type hints to template children and other objects
1 parent 5329cdf commit 8d0a27d

File tree

7 files changed

+92
-90
lines changed

7 files changed

+92
-90
lines changed

halftone/main.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,8 @@ def __init__(self):
2626
)
2727
self.set_resource_base_path(rootdir)
2828

29-
self.window = None
30-
self.settings = Gio.Settings.new(app_id)
29+
self.window: Adw.ApplicationWindow = None
30+
self.settings: Gio.Settings = Gio.Settings.new(app_id)
3131

3232
self.setup_actions()
3333

@@ -82,15 +82,15 @@ def setup_actions(self):
8282
#self.set_accels_for_action('app.preferences', ['<Primary>comma'])
8383
self.set_accels_for_action('app.quit', ['<Primary>Q', '<Primary>W'])
8484

85-
def show_preview_image(self, _action, *args):
85+
def show_preview_image(self, _action: Gio.SimpleAction, *args):
8686
""" Helper for `show-preview-image` action. """
8787

8888
preview_image_path = self.window.dither_page.preview_image_path # pyright: ignore
8989
image_path_variant = GLib.Variant("s", preview_image_path)
9090

9191
self.show_image_external(None, image_path_variant)
9292

93-
def show_image_external(self, _action, image_path: GLib.Variant, *args):
93+
def show_image_external(self, _action: Gio.SimpleAction | None, image_path: GLib.Variant, *args):
9494
"""
9595
Launch an external application to display provided image.
9696

halftone/views/about_window.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,15 @@
33

44
from wand.version import MAGICK_VERSION_INFO, VERSION, MAGICK_VERSION_FEATURES
55

6-
from gi.repository import Gtk, Adw
6+
from gi.repository import Adw, Gtk
77

88
from halftone import constants # pyright: ignore
99

1010

1111
class HalftoneAboutWindow:
12-
def __init__(self, parent):
12+
def __init__(self, parent: Gtk.Widget):
1313
self.parent = parent
14-
self.app = self.parent.get_application()
14+
self.app: Adw.Application = self.parent.get_application()
1515

1616
self.setup()
1717
self.set_debug_info()

halftone/views/dither_page.py

Lines changed: 53 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -20,68 +20,70 @@
2020

2121
logging = Logger()
2222

23+
LOADING_OVERLAY_DELAY = 2000 # In milliseconds
24+
2325

2426
@Gtk.Template(resource_path=f"{rootdir}/ui/dither_page.ui")
2527
class HalftoneDitherPage(Adw.BreakpointBin):
2628
__gtype_name__ = "HalftoneDitherPage"
2729

28-
image_box = Gtk.Template.Child()
29-
image_dithered = Gtk.Template.Child()
30+
image_box: Gtk.Box = Gtk.Template.Child()
31+
image_dithered: Gtk.Picture = Gtk.Template.Child()
3032

31-
image_prefs_bin = Gtk.Template.Child()
33+
image_prefs_bin: Adw.Bin = Gtk.Template.Child()
3234

33-
split_view = Gtk.Template.Child()
34-
sidebar_view = Gtk.Template.Child()
35+
split_view: Adw.OverlaySplitView = Gtk.Template.Child()
36+
sidebar_view: Adw.ToolbarView = Gtk.Template.Child()
3537

36-
bottom_sheet_box = Gtk.Template.Child()
37-
bottom_sheet = Gtk.Template.Child()
38+
bottom_sheet_box: Gtk.Box = Gtk.Template.Child()
39+
bottom_sheet: Adw.Bin = Gtk.Template.Child()
3840

39-
preview_scroll_window = Gtk.Template.Child()
41+
preview_scroll_window: Gtk.ScrolledWindow = Gtk.Template.Child()
4042

41-
save_image_button = Gtk.Template.Child()
42-
toggle_sheet_button = Gtk.Template.Child()
43+
save_image_button: Gtk.Button = Gtk.Template.Child()
44+
toggle_sheet_button: Gtk.Button = Gtk.Template.Child()
4345

44-
export_format_combo = Gtk.Template.Child()
45-
dither_algorithms_combo = Gtk.Template.Child()
46+
export_format_combo: Adw.ComboRow = Gtk.Template.Child()
47+
dither_algorithms_combo: Adw.ComboRow = Gtk.Template.Child()
4648

47-
image_width_row = Gtk.Template.Child()
48-
aspect_ratio_toggle = Gtk.Template.Child()
49-
image_height_row = Gtk.Template.Child()
49+
image_width_row: Adw.SpinRow = Gtk.Template.Child()
50+
aspect_ratio_toggle: Adw.SwitchRow = Gtk.Template.Child()
51+
image_height_row: Adw.SpinRow = Gtk.Template.Child()
5052

51-
brightness_row = Gtk.Template.Child()
52-
contrast_row = Gtk.Template.Child()
53+
brightness_row: Adw.SpinRow = Gtk.Template.Child()
54+
contrast_row: Adw.SpinRow = Gtk.Template.Child()
5355

54-
image_formats_stringlist = Gtk.Template.Child()
55-
algorithms_stringlist = Gtk.Template.Child()
56+
image_formats_stringlist: Gtk.StringList = Gtk.Template.Child()
57+
algorithms_stringlist: Gtk.StringList = Gtk.Template.Child()
5658

57-
color_amount_row = Gtk.Template.Child()
59+
color_amount_row: Adw.SpinRow = Gtk.Template.Child()
5860

59-
save_image_dialog = Gtk.Template.Child()
60-
all_filter = Gtk.Template.Child()
61+
save_image_dialog: Gtk.FileDialog = Gtk.Template.Child()
62+
all_filter: Gtk.FileFilter = Gtk.Template.Child()
6163

62-
preview_loading_overlay = Gtk.Template.Child()
64+
preview_loading_overlay: Gtk.Box = Gtk.Template.Child()
6365

64-
mobile_breakpoint = Gtk.Template.Child()
66+
mobile_breakpoint: Adw.Breakpoint = Gtk.Template.Child()
6567

66-
def __init__(self, parent, **kwargs):
68+
def __init__(self, parent: Gtk.Widget, **kwargs):
6769
super().__init__(**kwargs)
6870

6971
self.parent = parent
70-
self.settings = parent.settings
72+
self.settings: Gio.Settings = parent.settings
7173

72-
self.app = self.parent.get_application()
73-
self.win = self.app.get_active_window()
74+
self.app: Adw.Application = self.parent.get_application()
75+
self.win: Adw.ApplicationWindow = self.app.get_active_window()
7476

75-
self.toast_overlay = self.parent.toast_overlay
77+
self.toast_overlay: Adw.ToastOverlay = self.parent.toast_overlay
7678

7779
self.is_image_ready: bool = False
7880
self.is_mobile: bool = False
7981

8082
self.origin_x: float = None
8183
self.origin_y: float = None
8284

83-
self.task_id = None
84-
self.tasks = []
85+
self.task_id: int | None = None
86+
self.tasks: list[KillableThread] = []
8587

8688
self.input_image_path: str = None
8789
self.preview_image_path: str = None
@@ -90,9 +92,7 @@ def __init__(self, parent, **kwargs):
9092
self.updated_paintable: Gdk.Paintable = None
9193

9294
self.output_options: OutputOptions = OutputOptions()
93-
94-
self.keep_aspect_ratio = True
95-
self.loading_overlay_delay = 2000 # In milliseconds
95+
self.keep_aspect_ratio: bool = True
9696

9797
self.setup_signals()
9898
self.setup()
@@ -161,7 +161,7 @@ def preview_drag_begin(self, x: float, y: float, *args):
161161
self.origin_x = self.preview_scroll_window.get_hadjustment().get_value()
162162
self.origin_y = self.preview_scroll_window.get_vadjustment().get_value()
163163

164-
def preview_drag_update(self, widget, offset_x: float, offset_y: float, *args):
164+
def preview_drag_update(self, widget: Gtk.GestureDrag, offset_x: float, offset_y: float, *args):
165165
hadj = self.preview_scroll_window.get_hadjustment()
166166
vadj = self.preview_scroll_window.get_vadjustment()
167167

@@ -175,7 +175,7 @@ def update_preview_image(self, path: str, output_options: OutputOptions,
175175
self.is_image_ready = False
176176

177177
if run_delay:
178-
GLib.timeout_add(self.loading_overlay_delay, self.on_awaiting_image_load)
178+
GLib.timeout_add(LOADING_OVERLAY_DELAY, self.on_awaiting_image_load)
179179
else:
180180
self.on_awaiting_image_load()
181181

@@ -216,8 +216,8 @@ def load_preview_image(self, file: Gio.File):
216216
self.win.show_error_page()
217217
raise
218218

219-
self.set_size_spins(self.original_paintable.get_width(),
220-
self.original_paintable.get_height())
219+
self.set_size_spins(self.original_paintable.get_intrinsic_width(),
220+
self.original_paintable.get_intrinsic_height())
221221

222222
self.start_task(self.update_preview_image,
223223
self.input_image_path,
@@ -248,7 +248,7 @@ def save_image(self, paintable: Gdk.Paintable, output_path: str,
248248
""" Signal callbacks """
249249

250250
@Gtk.Template.Callback()
251-
def on_color_amount_changed(self, widget):
251+
def on_color_amount_changed(self, widget: Adw.SpinRow):
252252
new_color_amount = self.get_color_amount_pref(widget)
253253

254254
if new_color_amount == self.output_options.color_amount:
@@ -264,7 +264,7 @@ def on_color_amount_changed(self, widget):
264264
self.on_successful_image_load)
265265

266266
@Gtk.Template.Callback()
267-
def on_brightness_changed(self, widget):
267+
def on_brightness_changed(self, widget: Adw.SpinRow):
268268
new_brightness = int(widget.props.value)
269269

270270
if new_brightness == self.output_options.brightness:
@@ -279,7 +279,7 @@ def on_brightness_changed(self, widget):
279279
self.on_successful_image_load)
280280

281281
@Gtk.Template.Callback()
282-
def on_contrast_changed(self, widget):
282+
def on_contrast_changed(self, widget: Adw.SpinRow):
283283
new_contrast = int(widget.props.value)
284284

285285
if new_contrast == self.output_options.contrast:
@@ -294,7 +294,7 @@ def on_contrast_changed(self, widget):
294294
self.on_successful_image_load)
295295

296296
@Gtk.Template.Callback()
297-
def on_image_width_changed(self, widget):
297+
def on_image_width_changed(self, widget: Adw.SpinRow):
298298
new_width = self.get_image_width_pref(widget)
299299

300300
if new_width == self.output_options.width:
@@ -318,7 +318,7 @@ def on_image_width_changed(self, widget):
318318
self.on_successful_image_load)
319319

320320
@Gtk.Template.Callback()
321-
def on_image_height_changed(self, widget):
321+
def on_image_height_changed(self, widget: Adw.SpinRow):
322322
new_height = self.get_image_height_pref(widget)
323323

324324
if new_height == self.output_options.height:
@@ -344,7 +344,7 @@ def on_save_image(self, *args):
344344
self.save_image_dialog.set_initial_name(output_filename)
345345
self.save_image_dialog.save(self.win, None, self.on_image_dialog_result)
346346

347-
def on_toggle_sheet(self, widget, *args):
347+
def on_toggle_sheet(self, action: Gio.SimpleAction, *args):
348348
if self.is_mobile:
349349
if self.bottom_sheet_box.props.visible:
350350
self.bottom_sheet_box.set_visible(False)
@@ -358,7 +358,7 @@ def on_toggle_sheet(self, widget, *args):
358358

359359
self.split_view.set_show_sidebar(True)
360360

361-
def on_aspect_ratio_toggled(self, widget, *args):
361+
def on_aspect_ratio_toggled(self, widget: Adw.SwitchRow, *args):
362362
if widget.props.active is True:
363363
self.keep_aspect_ratio = True
364364
#widget.props.icon_name = "chain-link-symbolic"
@@ -391,7 +391,7 @@ def on_image_dialog_result(self, dialog: Gtk.FileDialog, result: Gio.AsyncResult
391391
self.output_options,
392392
self.win.show_dither_page)
393393

394-
def on_dither_algorithm_selected(self, widget, *args):
394+
def on_dither_algorithm_selected(self, widget: Adw.ComboRow, *args):
395395
algorithm_string = self.get_dither_algorithm_pref(widget)
396396

397397
self.output_options.algorithm = algorithm_string
@@ -403,7 +403,7 @@ def on_dither_algorithm_selected(self, widget, *args):
403403
True,
404404
self.on_successful_image_load)
405405

406-
def on_save_format_selected(self, widget, *args):
406+
def on_save_format_selected(self, widget: Adw.ComboRow, *args):
407407
selected_format = widget.props.selected
408408
format_string = self.image_formats_stringlist.get_string(selected_format)
409409

@@ -468,21 +468,22 @@ def get_output_format_suffix(self) -> str:
468468
selected_format = self.export_format_combo.props.selected
469469
format_string = self.image_formats_stringlist.get_string(selected_format)
470470

471+
# TODO: Possible edge case; Make sure to return something when string is None
471472
return format_string
472473

473-
def get_color_amount_pref(self, widget) -> int:
474+
def get_color_amount_pref(self, widget: Adw.SpinRow) -> int:
474475
color_amount = int(widget.props.value)
475476
return color_amount
476477

477-
def get_image_width_pref(self, widget) -> int:
478+
def get_image_width_pref(self, widget: Adw.SpinRow) -> int:
478479
new_width = int(widget.props.value)
479480
return new_width
480481

481-
def get_image_height_pref(self, widget) -> int:
482+
def get_image_height_pref(self, widget: Adw.SpinRow) -> int:
482483
new_height = int(widget.props.value)
483484
return new_height
484485

485-
def get_dither_algorithm_pref(self, widget) -> Literal['floyd_steinberg', 'riemersma', 'ordered'] | None:
486+
def get_dither_algorithm_pref(self, widget: Adw.ComboRow) -> Literal['floyd_steinberg', 'riemersma', 'ordered'] | None:
486487
selected_algorithm = widget.props.selected
487488

488489
class selectedAlgo(Enum):
@@ -520,7 +521,7 @@ def update_preview_content_fit(self, *args):
520521

521522
self.image_dithered.set_content_fit(content_fit)
522523

523-
def set_size_spins(self, width, height):
524+
def set_size_spins(self, width: int, height: int):
524525
self.image_width_row.set_value(width)
525526
self.image_height_row.set_value(height)
526527

halftone/views/error_page.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
# Copyright 2025, tfuxu <https://github.com/tfuxu>
22
# SPDX-License-Identifier: GPL-3.0-or-later
33

4-
from gi.repository import Adw, Gtk
4+
from gi.repository import Adw, Gtk, Gio
55

66
from halftone.constants import rootdir # pyright: ignore
77

@@ -10,14 +10,14 @@
1010
class HalftoneErrorPage(Adw.Bin):
1111
__gtype_name__ = "HalftoneErrorPage"
1212

13-
def __init__(self, parent, **kwargs):
13+
def __init__(self, parent: Gtk.Widget, **kwargs):
1414
super().__init__(**kwargs)
1515

1616
self.parent = parent
17-
self.settings = parent.settings
17+
self.settings: Gio.Settings = parent.settings
1818

19-
self.app = self.parent.get_application()
20-
self.win = self.app.get_active_window()
19+
self.app: Adw.Application = self.parent.get_application()
20+
self.win: Adw.ApplicationWindow = self.app.get_active_window()
2121

2222
self.setup_signals()
2323
self.setup()

halftone/views/main_window.py

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -22,13 +22,13 @@
2222
class HalftoneMainWindow(Adw.ApplicationWindow):
2323
__gtype_name__ = 'HalftoneMainWindow'
2424

25-
toast_overlay = Gtk.Template.Child()
25+
toast_overlay: Adw.ToastOverlay = Gtk.Template.Child()
2626

27-
main_stack = Gtk.Template.Child()
28-
open_image_button = Gtk.Template.Child()
27+
main_stack: Gtk.Stack = Gtk.Template.Child()
28+
open_image_button: Gtk.Button = Gtk.Template.Child()
2929

30-
open_image_dialog = Gtk.Template.Child()
31-
all_filter = Gtk.Template.Child()
30+
open_image_dialog: Gtk.FileDialog = Gtk.Template.Child()
31+
all_filter: Gtk.FileFilter = Gtk.Template.Child()
3232

3333
content = Gdk.ContentFormats.new_for_gtype(Gio.File)
3434
drop_target = Gtk.DropTarget(formats=content, actions=Gdk.DragAction.COPY)
@@ -37,16 +37,16 @@ def __init__(self, **kwargs):
3737
super().__init__(**kwargs)
3838

3939
# Application object
40-
self.app = kwargs['application']
41-
self.settings = Gio.Settings(app_id)
40+
self.app: Adw.Application = kwargs['application']
41+
self.settings: Gio.Settings = Gio.Settings(app_id)
4242

43-
self.latest_traceback = ""
43+
self.latest_traceback: str = ""
4444

4545
self.add_controller(self.drop_target)
4646

47-
self.error_page = HalftoneErrorPage(self)
48-
self.dither_page = HalftoneDitherPage(self)
49-
self.report_page = HalftoneReportPage(self)
47+
self.error_page: Adw.Bin = HalftoneErrorPage(self)
48+
self.dither_page: Adw.BreakpointBin = HalftoneDitherPage(self)
49+
self.report_page: Gtk.Box = HalftoneReportPage(self)
5050

5151
self.setup_actions()
5252
self.setup_signals()
@@ -169,7 +169,8 @@ def on_target_enter(self, *args) -> Literal[Gdk.DragAction.COPY]:
169169
return Gdk.DragAction.COPY
170170

171171
def on_target_leave(self, *args):
172-
self.main_stack.set_visible_child_name(self.previous_stack)
172+
if self.previous_stack:
173+
self.main_stack.set_visible_child_name(self.previous_stack)
173174

174175
def show_loading_page(self, *args):
175176
self.toggle_sheet_action.set_enabled(False)

0 commit comments

Comments
 (0)