20
20
21
21
logging = Logger ()
22
22
23
+ LOADING_OVERLAY_DELAY = 2000 # In milliseconds
24
+
23
25
24
26
@Gtk .Template (resource_path = f"{ rootdir } /ui/dither_page.ui" )
25
27
class HalftoneDitherPage (Adw .BreakpointBin ):
26
28
__gtype_name__ = "HalftoneDitherPage"
27
29
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 ()
30
32
31
- image_prefs_bin = Gtk .Template .Child ()
33
+ image_prefs_bin : Adw . Bin = Gtk .Template .Child ()
32
34
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 ()
35
37
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 ()
38
40
39
- preview_scroll_window = Gtk .Template .Child ()
41
+ preview_scroll_window : Gtk . ScrolledWindow = Gtk .Template .Child ()
40
42
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 ()
43
45
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 ()
46
48
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 ()
50
52
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 ()
53
55
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 ()
56
58
57
- color_amount_row = Gtk .Template .Child ()
59
+ color_amount_row : Adw . SpinRow = Gtk .Template .Child ()
58
60
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 ()
61
63
62
- preview_loading_overlay = Gtk .Template .Child ()
64
+ preview_loading_overlay : Gtk . Box = Gtk .Template .Child ()
63
65
64
- mobile_breakpoint = Gtk .Template .Child ()
66
+ mobile_breakpoint : Adw . Breakpoint = Gtk .Template .Child ()
65
67
66
- def __init__ (self , parent , ** kwargs ):
68
+ def __init__ (self , parent : Gtk . Widget , ** kwargs ):
67
69
super ().__init__ (** kwargs )
68
70
69
71
self .parent = parent
70
- self .settings = parent .settings
72
+ self .settings : Gio . Settings = parent .settings
71
73
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 ()
74
76
75
- self .toast_overlay = self .parent .toast_overlay
77
+ self .toast_overlay : Adw . ToastOverlay = self .parent .toast_overlay
76
78
77
79
self .is_image_ready : bool = False
78
80
self .is_mobile : bool = False
79
81
80
82
self .origin_x : float = None
81
83
self .origin_y : float = None
82
84
83
- self .task_id = None
84
- self .tasks = []
85
+ self .task_id : int | None = None
86
+ self .tasks : list [ KillableThread ] = []
85
87
86
88
self .input_image_path : str = None
87
89
self .preview_image_path : str = None
@@ -90,9 +92,7 @@ def __init__(self, parent, **kwargs):
90
92
self .updated_paintable : Gdk .Paintable = None
91
93
92
94
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
96
96
97
97
self .setup_signals ()
98
98
self .setup ()
@@ -161,7 +161,7 @@ def preview_drag_begin(self, x: float, y: float, *args):
161
161
self .origin_x = self .preview_scroll_window .get_hadjustment ().get_value ()
162
162
self .origin_y = self .preview_scroll_window .get_vadjustment ().get_value ()
163
163
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 ):
165
165
hadj = self .preview_scroll_window .get_hadjustment ()
166
166
vadj = self .preview_scroll_window .get_vadjustment ()
167
167
@@ -175,7 +175,7 @@ def update_preview_image(self, path: str, output_options: OutputOptions,
175
175
self .is_image_ready = False
176
176
177
177
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 )
179
179
else :
180
180
self .on_awaiting_image_load ()
181
181
@@ -216,8 +216,8 @@ def load_preview_image(self, file: Gio.File):
216
216
self .win .show_error_page ()
217
217
raise
218
218
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 ())
221
221
222
222
self .start_task (self .update_preview_image ,
223
223
self .input_image_path ,
@@ -248,7 +248,7 @@ def save_image(self, paintable: Gdk.Paintable, output_path: str,
248
248
""" Signal callbacks """
249
249
250
250
@Gtk .Template .Callback ()
251
- def on_color_amount_changed (self , widget ):
251
+ def on_color_amount_changed (self , widget : Adw . SpinRow ):
252
252
new_color_amount = self .get_color_amount_pref (widget )
253
253
254
254
if new_color_amount == self .output_options .color_amount :
@@ -264,7 +264,7 @@ def on_color_amount_changed(self, widget):
264
264
self .on_successful_image_load )
265
265
266
266
@Gtk .Template .Callback ()
267
- def on_brightness_changed (self , widget ):
267
+ def on_brightness_changed (self , widget : Adw . SpinRow ):
268
268
new_brightness = int (widget .props .value )
269
269
270
270
if new_brightness == self .output_options .brightness :
@@ -279,7 +279,7 @@ def on_brightness_changed(self, widget):
279
279
self .on_successful_image_load )
280
280
281
281
@Gtk .Template .Callback ()
282
- def on_contrast_changed (self , widget ):
282
+ def on_contrast_changed (self , widget : Adw . SpinRow ):
283
283
new_contrast = int (widget .props .value )
284
284
285
285
if new_contrast == self .output_options .contrast :
@@ -294,7 +294,7 @@ def on_contrast_changed(self, widget):
294
294
self .on_successful_image_load )
295
295
296
296
@Gtk .Template .Callback ()
297
- def on_image_width_changed (self , widget ):
297
+ def on_image_width_changed (self , widget : Adw . SpinRow ):
298
298
new_width = self .get_image_width_pref (widget )
299
299
300
300
if new_width == self .output_options .width :
@@ -318,7 +318,7 @@ def on_image_width_changed(self, widget):
318
318
self .on_successful_image_load )
319
319
320
320
@Gtk .Template .Callback ()
321
- def on_image_height_changed (self , widget ):
321
+ def on_image_height_changed (self , widget : Adw . SpinRow ):
322
322
new_height = self .get_image_height_pref (widget )
323
323
324
324
if new_height == self .output_options .height :
@@ -344,7 +344,7 @@ def on_save_image(self, *args):
344
344
self .save_image_dialog .set_initial_name (output_filename )
345
345
self .save_image_dialog .save (self .win , None , self .on_image_dialog_result )
346
346
347
- def on_toggle_sheet (self , widget , * args ):
347
+ def on_toggle_sheet (self , action : Gio . SimpleAction , * args ):
348
348
if self .is_mobile :
349
349
if self .bottom_sheet_box .props .visible :
350
350
self .bottom_sheet_box .set_visible (False )
@@ -358,7 +358,7 @@ def on_toggle_sheet(self, widget, *args):
358
358
359
359
self .split_view .set_show_sidebar (True )
360
360
361
- def on_aspect_ratio_toggled (self , widget , * args ):
361
+ def on_aspect_ratio_toggled (self , widget : Adw . SwitchRow , * args ):
362
362
if widget .props .active is True :
363
363
self .keep_aspect_ratio = True
364
364
#widget.props.icon_name = "chain-link-symbolic"
@@ -391,7 +391,7 @@ def on_image_dialog_result(self, dialog: Gtk.FileDialog, result: Gio.AsyncResult
391
391
self .output_options ,
392
392
self .win .show_dither_page )
393
393
394
- def on_dither_algorithm_selected (self , widget , * args ):
394
+ def on_dither_algorithm_selected (self , widget : Adw . ComboRow , * args ):
395
395
algorithm_string = self .get_dither_algorithm_pref (widget )
396
396
397
397
self .output_options .algorithm = algorithm_string
@@ -403,7 +403,7 @@ def on_dither_algorithm_selected(self, widget, *args):
403
403
True ,
404
404
self .on_successful_image_load )
405
405
406
- def on_save_format_selected (self , widget , * args ):
406
+ def on_save_format_selected (self , widget : Adw . ComboRow , * args ):
407
407
selected_format = widget .props .selected
408
408
format_string = self .image_formats_stringlist .get_string (selected_format )
409
409
@@ -468,21 +468,22 @@ def get_output_format_suffix(self) -> str:
468
468
selected_format = self .export_format_combo .props .selected
469
469
format_string = self .image_formats_stringlist .get_string (selected_format )
470
470
471
+ # TODO: Possible edge case; Make sure to return something when string is None
471
472
return format_string
472
473
473
- def get_color_amount_pref (self , widget ) -> int :
474
+ def get_color_amount_pref (self , widget : Adw . SpinRow ) -> int :
474
475
color_amount = int (widget .props .value )
475
476
return color_amount
476
477
477
- def get_image_width_pref (self , widget ) -> int :
478
+ def get_image_width_pref (self , widget : Adw . SpinRow ) -> int :
478
479
new_width = int (widget .props .value )
479
480
return new_width
480
481
481
- def get_image_height_pref (self , widget ) -> int :
482
+ def get_image_height_pref (self , widget : Adw . SpinRow ) -> int :
482
483
new_height = int (widget .props .value )
483
484
return new_height
484
485
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 :
486
487
selected_algorithm = widget .props .selected
487
488
488
489
class selectedAlgo (Enum ):
@@ -520,7 +521,7 @@ def update_preview_content_fit(self, *args):
520
521
521
522
self .image_dithered .set_content_fit (content_fit )
522
523
523
- def set_size_spins (self , width , height ):
524
+ def set_size_spins (self , width : int , height : int ):
524
525
self .image_width_row .set_value (width )
525
526
self .image_height_row .set_value (height )
526
527
0 commit comments