Skip to content

Commit 73eb8b0

Browse files
committed
gtk template: settings dialog (subdialogs)
1 parent a26fedf commit 73eb8b0

File tree

4 files changed

+72
-77
lines changed

4 files changed

+72
-77
lines changed

safeeyes/glade/new_break.glade

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
~ You should have received a copy of the GNU General Public License
2020
~ along with this program. If not, see <http://www.gnu.org/licenses/>.
2121
-->
22-
<interface>
22+
<interface domain="safeeyes">
2323
<requires lib="gtk" version="4.0"/>
2424
<object class="GtkAdjustment" id="adjustment_duration">
2525
<property name="upper">100</property>
@@ -40,14 +40,15 @@
4040
</row>
4141
</data>
4242
</object>
43-
<object class="GtkWindow" id="dialog_new_break">
43+
<template parent="GtkWindow" class="NewBreakDialog">
4444
<property name="title" translatable="yes">New Break</property>
4545
<property name="resizable">0</property>
4646
<property name="modal">1</property>
4747
<property name="default-width">500</property>
4848
<property name="default-height">50</property>
4949
<property name="destroy-with-parent">1</property>
5050
<property name="icon-name">io.github.slgobinath.SafeEyes</property>
51+
<signal name="close-request" handler="on_window_delete" swapped="no" />
5152
<child>
5253
<object class="GtkBox" id="box_settings">
5354
<property name="visible">1</property>
@@ -130,6 +131,7 @@
130131
<property name="visible">1</property>
131132
<property name="can-focus">1</property>
132133
<property name="receives-default">1</property>
134+
<signal name="clicked" handler="discard" swapped="no"/>
133135
</object>
134136
</child>
135137
<child>
@@ -138,11 +140,12 @@
138140
<property name="visible">1</property>
139141
<property name="can-focus">1</property>
140142
<property name="receives-default">1</property>
143+
<signal name="clicked" handler="save" swapped="no"/>
141144
</object>
142145
</child>
143146
</object>
144147
</child>
145148
</object>
146149
</child>
147-
</object>
150+
</template>
148151
</interface>

safeeyes/glade/settings_break.glade

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
~ You should have received a copy of the GNU General Public License
2020
~ along with this program. If not, see <http://www.gnu.org/licenses/>.
2121
-->
22-
<interface>
22+
<interface domain="safeeyes">
2323
<requires lib="gtk" version="4.0"/>
2424
<object class="GtkAdjustment" id="adjustment_duration">
2525
<property name="lower">1</property>
@@ -47,14 +47,15 @@
4747
</row>
4848
</data>
4949
</object>
50-
<object class="GtkWindow" id="dialog_settings_break">
50+
<template parent="GtkWindow" class="BreakSettingsDialog">
5151
<property name="title" translatable="yes">Break Settings</property>
5252
<property name="resizable">0</property>
5353
<property name="modal">1</property>
5454
<property name="default-width">500</property>
5555
<property name="default-height">50</property>
5656
<property name="destroy-with-parent">1</property>
5757
<property name="icon-name">io.github.slgobinath.SafeEyes</property>
58+
<signal name="close-request" handler="on_window_delete" swapped="no" />
5859
<child>
5960
<object class="GtkBox" id="box_settings">
6061
<property name="visible">1</property>
@@ -134,6 +135,7 @@
134135
<property name="can-focus">1</property>
135136
<property name="receives-default">1</property>
136137
<property name="icon-name">gtk-missing-image</property>
138+
<signal name="clicked" handler="select_image" swapped="no"/>
137139
</object>
138140
</child>
139141
</object>
@@ -179,6 +181,7 @@
179181
<property name="can-focus">1</property>
180182
<property name="halign">end</property>
181183
<property name="valign">center</property>
184+
<signal name="state-set" handler="on_switch_override_interval_activate" swapped="no"/>
182185
</object>
183186
</child>
184187
</object>
@@ -250,6 +253,7 @@
250253
<property name="can-focus">1</property>
251254
<property name="halign">end</property>
252255
<property name="valign">center</property>
256+
<signal name="state-set" handler="on_switch_override_duration_activate" swapped="no"/>
253257
</object>
254258
</child>
255259
</object>
@@ -322,6 +326,7 @@
322326
<property name="can-focus">1</property>
323327
<property name="halign">end</property>
324328
<property name="valign">center</property>
329+
<signal name="state-set" handler="on_switch_override_plugins_activate" swapped="no"/>
325330
</object>
326331
</child>
327332
</object>
@@ -347,5 +352,5 @@
347352
</child>
348353
</object>
349354
</child>
350-
</object>
355+
</template>
351356
</interface>

safeeyes/glade/settings_plugin.glade

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,16 +19,17 @@
1919
~ You should have received a copy of the GNU General Public License
2020
~ along with this program. If not, see <http://www.gnu.org/licenses/>.
2121
-->
22-
<interface>
22+
<interface domain="safeeyes">
2323
<requires lib="gtk" version="4.0"/>
24-
<object class="GtkWindow" id="dialog_settings_plugin">
24+
<template parent="GtkWindow" class="PluginSettingsDialog">
2525
<property name="title" translatable="yes">Plugin Settings</property>
2626
<property name="resizable">0</property>
2727
<property name="modal">1</property>
2828
<property name="default-width">400</property>
2929
<property name="default-height">10</property>
3030
<property name="destroy-with-parent">1</property>
3131
<property name="icon-name">io.github.slgobinath.SafeEyes</property>
32+
<signal name="close-request" handler="on_window_delete" swapped="no" />
3233
<child>
3334
<object class="GtkBox" id="box_settings">
3435
<property name="visible">1</property>
@@ -39,5 +40,5 @@
3940
<property name="homogeneous">1</property>
4041
</object>
4142
</child>
42-
</object>
43+
</template>
4344
</interface>

safeeyes/ui/settings_dialog.py

Lines changed: 54 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -476,18 +476,20 @@ def get_value(self):
476476
return self.switch_value.get_active()
477477

478478

479-
class PluginSettingsDialog:
479+
@Gtk.Template(filename=SETTINGS_DIALOG_PLUGIN_GLADE)
480+
class PluginSettingsDialog(Gtk.Window):
480481
"""Builds a settings dialog based on the configuration of a plugin."""
481482

483+
__gtype_name__ = "PluginSettingsDialog"
484+
485+
box_settings = Gtk.Template.Child()
486+
482487
def __init__(self, parent, config):
488+
super().__init__(transient_for=parent)
489+
483490
self.config = config
484491
self.property_controls = []
485492

486-
builder = utility.create_gtk_builder(SETTINGS_DIALOG_PLUGIN_GLADE)
487-
self.window = builder.get_object("dialog_settings_plugin")
488-
self.window.set_transient_for(parent)
489-
box_settings = builder.get_object("box_settings")
490-
self.window.set_title(_("Plugin Settings"))
491493
for setting in config.get("settings"):
492494
if setting["type"].upper() == "INT":
493495
box = IntItem(
@@ -508,26 +510,39 @@ def __init__(self, parent, config):
508510
continue
509511

510512
self.property_controls.append({"key": setting["id"], "box": box})
511-
box_settings.append(box.box)
512-
513-
self.window.connect("close-request", self.on_window_delete)
513+
self.box_settings.append(box.box)
514514

515+
@Gtk.Template.Callback()
515516
def on_window_delete(self, *args):
516517
"""Event handler for Properties dialog close action."""
517518
for property_control in self.property_controls:
518519
self.config["active_plugin_config"][property_control["key"]] = (
519520
property_control["box"].get_value()
520521
)
521-
self.window.destroy()
522+
self.destroy()
522523

523524
def show(self):
524525
"""Show the Properties dialog."""
525-
self.window.present()
526+
self.present()
526527

527528

528-
class BreakSettingsDialog:
529+
@Gtk.Template(filename=SETTINGS_DIALOG_BREAK_GLADE)
530+
class BreakSettingsDialog(Gtk.Window):
529531
"""Builds a settings dialog based on the configuration of a plugin."""
530532

533+
__gtype_name__ = "BreakSettingsDialog"
534+
535+
txt_break = Gtk.Template.Child()
536+
switch_override_interval = Gtk.Template.Child()
537+
switch_override_duration = Gtk.Template.Child()
538+
switch_override_plugins = Gtk.Template.Child()
539+
spin_interval = Gtk.Template.Child()
540+
spin_duration = Gtk.Template.Child()
541+
btn_image = Gtk.Template.Child()
542+
cmb_type = Gtk.Template.Child()
543+
grid_plugins = Gtk.Template.Child()
544+
lst_break_types = Gtk.Template.Child()
545+
531546
def __init__(
532547
self,
533548
parent,
@@ -539,6 +554,8 @@ def __init__(
539554
on_add,
540555
on_remove,
541556
):
557+
super().__init__(transient_for=parent)
558+
542559
self.break_config = break_config
543560
self.parent_config = parent_config
544561
self.plugin_check_buttons = {}
@@ -547,34 +564,16 @@ def __init__(
547564
self.on_add = on_add
548565
self.on_remove = on_remove
549566

550-
builder = utility.create_gtk_builder(SETTINGS_DIALOG_BREAK_GLADE)
551-
self.window = builder.get_object("dialog_settings_break")
552-
self.window.set_transient_for(parent)
553-
self.txt_break = builder.get_object("txt_break")
554-
self.switch_override_interval = builder.get_object("switch_override_interval")
555-
self.switch_override_duration = builder.get_object("switch_override_duration")
556-
self.switch_override_plugins = builder.get_object("switch_override_plugins")
557-
self.spin_interval = builder.get_object("spin_interval")
558-
self.spin_duration = builder.get_object("spin_duration")
559-
self.btn_image = builder.get_object("btn_image")
560-
self.cmb_type = builder.get_object("cmb_type")
561-
562-
grid_plugins = builder.get_object("grid_plugins")
563-
list_types = builder.get_object("lst_break_types")
564-
565567
interval_overriden = break_config.get("interval", None) is not None
566568
duration_overriden = break_config.get("duration", None) is not None
567569
plugins_overriden = break_config.get("plugins", None) is not None
568570

569571
# Set the values
570-
self.window.set_title(_("Break Settings"))
571572
self.txt_break.set_text(_(break_config["name"]))
572573
self.switch_override_interval.set_active(interval_overriden)
573574
self.switch_override_duration.set_active(duration_overriden)
574575
self.switch_override_plugins.set_active(plugins_overriden)
575576
self.cmb_type.set_active(0 if is_short else 1)
576-
list_types[0][0] = _(list_types[0][0])
577-
list_types[1][0] = _(list_types[1][0])
578577

579578
if interval_overriden:
580579
self.spin_interval.set_value(break_config["interval"])
@@ -596,7 +595,7 @@ def __init__(
596595
for plugin_id in plugin_map.keys():
597596
chk_button = Gtk.CheckButton.new_with_label(_(plugin_map[plugin_id]))
598597
self.plugin_check_buttons[plugin_id] = chk_button
599-
grid_plugins.attach(chk_button, row, col, 1, 1)
598+
self.grid_plugins.attach(chk_button, row, col, 1, 1)
600599
if plugins_overriden:
601600
chk_button.set_active(plugin_id in break_config["plugins"])
602601
else:
@@ -613,18 +612,6 @@ def __init__(
613612
image = Gtk.Image.new_from_pixbuf(pixbuf)
614613
self.btn_image.set_child(image)
615614

616-
self.window.connect("close-request", self.on_window_delete)
617-
self.btn_image.connect("clicked", self.select_image)
618-
619-
self.switch_override_interval.connect(
620-
"state-set", self.on_switch_override_interval_activate
621-
)
622-
self.switch_override_duration.connect(
623-
"state-set", self.on_switch_override_duration_activate
624-
)
625-
self.switch_override_plugins.connect(
626-
"state-set", self.on_switch_override_plugins_activate
627-
)
628615
self.on_switch_override_interval_activate(
629616
self.switch_override_interval, self.switch_override_interval.get_active()
630617
)
@@ -635,19 +622,23 @@ def __init__(
635622
self.switch_override_plugins, self.switch_override_plugins.get_active()
636623
)
637624

625+
@Gtk.Template.Callback()
638626
def on_switch_override_interval_activate(self, switch_button, state):
639627
"""switch_override_interval state change event handler."""
640628
self.spin_interval.set_sensitive(state)
641629

630+
@Gtk.Template.Callback()
642631
def on_switch_override_duration_activate(self, switch_button, state):
643632
"""switch_override_duration state change event handler."""
644633
self.spin_duration.set_sensitive(state)
645634

635+
@Gtk.Template.Callback()
646636
def on_switch_override_plugins_activate(self, switch_button, state):
647637
"""switch_override_plugins state change event handler."""
648638
for chk_box in self.plugin_check_buttons.values():
649639
chk_box.set_sensitive(state)
650640

641+
@Gtk.Template.Callback()
651642
def select_image(self, button):
652643
"""Show a file chooser dialog and let the user to select an image."""
653644
dialog = Gtk.FileDialog()
@@ -661,7 +652,7 @@ def select_image(self, button):
661652
filters.append(png_filter)
662653
dialog.set_filters(filters)
663654

664-
dialog.open(self.window, None, self.select_image_callback)
655+
dialog.open(self, None, self.select_image_callback)
665656

666657
def select_image_callback(self, dialog, result):
667658
response = None
@@ -683,6 +674,7 @@ def select_image_callback(self, dialog, result):
683674
self.break_config.pop("image", None)
684675
self.btn_image.set_icon_name("gtk-missing-image")
685676

677+
@Gtk.Template.Callback()
686678
def on_window_delete(self, *args):
687679
"""Event handler for Properties dialog close action."""
688680
break_name = self.txt_break.get_text().strip()
@@ -719,41 +711,34 @@ def on_window_delete(self, *args):
719711
self.on_add(not self.is_short, self.break_config)
720712
else:
721713
self.on_close(self.break_config)
722-
self.window.destroy()
714+
self.destroy()
723715

724716
def show(self):
725717
"""Show the Properties dialog."""
726-
self.window.present()
718+
self.present()
727719

728720

729-
class NewBreakDialog:
721+
@Gtk.Template(filename=SETTINGS_DIALOG_NEW_BREAK_GLADE)
722+
class NewBreakDialog(Gtk.Window):
730723
"""Builds a new break dialog."""
731724

732-
def __init__(self, parent, parent_config, on_add):
733-
self.parent_config = parent_config
734-
self.on_add = on_add
735-
736-
builder = utility.create_gtk_builder(SETTINGS_DIALOG_NEW_BREAK_GLADE)
737-
self.window = builder.get_object("dialog_new_break")
738-
self.window.set_transient_for(parent)
739-
self.txt_break = builder.get_object("txt_break")
740-
self.cmb_type = builder.get_object("cmb_type")
741-
list_types = builder.get_object("lst_break_types")
725+
__gtype_name__ = "NewBreakDialog"
742726

743-
list_types[0][0] = _(list_types[0][0])
744-
list_types[1][0] = _(list_types[1][0])
727+
txt_break = Gtk.Template.Child()
728+
cmb_type = Gtk.Template.Child()
745729

746-
self.window.connect("close-request", self.on_window_delete)
747-
builder.get_object("btn_discard").connect("clicked", self.discard)
748-
builder.get_object("btn_save").connect("clicked", self.save)
730+
def __init__(self, parent, parent_config, on_add):
731+
super().__init__(transient_for=parent)
749732

750-
# Set the values
751-
self.window.set_title(_("New Break"))
733+
self.parent_config = parent_config
734+
self.on_add = on_add
752735

736+
@Gtk.Template.Callback()
753737
def discard(self, button):
754738
"""Close the dialog."""
755-
self.window.destroy()
739+
self.destroy()
756740

741+
@Gtk.Template.Callback()
757742
def save(self, button):
758743
"""Event handler for Properties dialog close action."""
759744
break_config = {"name": self.txt_break.get_text().strip()}
@@ -764,12 +749,13 @@ def save(self, button):
764749
else:
765750
self.parent_config.get("long_breaks").append(break_config)
766751
self.on_add(False, break_config)
767-
self.window.destroy()
752+
self.destroy()
768753

754+
@Gtk.Template.Callback()
769755
def on_window_delete(self, *args):
770756
"""Event handler for dialog close action."""
771-
self.window.destroy()
757+
self.destroy()
772758

773759
def show(self):
774760
"""Show the Properties dialog."""
775-
self.window.present()
761+
self.present()

0 commit comments

Comments
 (0)