[gnome-screenshot/wip/exalm/cleanups: 5/15] interactive-dialog: Make a GTK template



commit 481c20e2da6f9092a662b82dfb1293b7eda62c4e
Author: Alexander Mikhaylenko <alexm gnome org>
Date:   Fri Apr 3 06:38:28 2020 +0500

    interactive-dialog: Make a GTK template

 data/ui/screenshot-interactive-dialog.ui |  24 ++--
 src/screenshot-interactive-dialog.c      | 217 ++++++++++++++-----------------
 src/screenshot-interactive-dialog.h      |   8 ++
 3 files changed, 122 insertions(+), 127 deletions(-)
---
diff --git a/data/ui/screenshot-interactive-dialog.ui b/data/ui/screenshot-interactive-dialog.ui
index c19dd2a..4b22d98 100644
--- a/data/ui/screenshot-interactive-dialog.ui
+++ b/data/ui/screenshot-interactive-dialog.ui
@@ -2,8 +2,9 @@
 <!-- Generated with glade 3.22.0 -->
 <interface>
   <requires lib="gtk+" version="3.20"/>
-  <object class="GtkApplicationWindow" id="screenshot_window">
+  <template class="ScreenshotInteractiveDialog" parent="GtkApplicationWindow">
     <property name="resizable">False</property>
+    <property name="window-position">center</property>
     <child>
       <object class="GtkBox">
         <property name="visible">True</property>
@@ -38,7 +39,7 @@
                     <property name="receives_default">True</property>
                     <property name="draw_indicator">False</property>
                     <property name="group">selection</property>
-                    <signal name="toggled" handler="on_screen" swapped="no"/>
+                    <signal name="toggled" handler="screen_toggled_cb"/>
                     <child>
                       <object class="GtkBox">
                         <property name="visible">True</property>
@@ -71,7 +72,7 @@
                     <property name="active">True</property>
                     <property name="draw_indicator">False</property>
                     <property name="group">screen</property>
-                    <signal name="toggled" handler="on_window" swapped="no"/>
+                    <signal name="toggled" handler="window_toggled_cb"/>
                     <child>
                       <object class="GtkBox">
                         <property name="visible">True</property>
@@ -103,7 +104,7 @@
                     <property name="receives_default">True</property>
                     <property name="draw_indicator">False</property>
                     <property name="group">screen</property>
-                    <signal name="toggled" handler="on_selection" swapped="no"/>
+                    <signal name="toggled" handler="selection_toggled_cb"/>
                     <child>
                       <object class="GtkBox">
                         <property name="visible">True</property>
@@ -142,7 +143,7 @@
               <class name="frame"/>
             </style>
             <child>
-              <object class="GtkListBoxRow" id="pointerrow">
+              <object class="GtkListBoxRow" id="pointer_row">
                 <property name="visible">True</property>
                 <property name="can_focus">True</property>
                 <child>
@@ -164,6 +165,7 @@
                     <child>
                       <object class="GtkSwitch" id="pointer">
                         <property name="visible">True</property>
+                        <signal name="state-set" handler="include_pointer_toggled_cb"/>
                       </object>
                     </child>
                   </object>
@@ -200,6 +202,7 @@
                         <property name="climb_rate">1</property>
                         <property name="snap_to_ticks">True</property>
                         <property name="numeric">True</property>
+                        <signal name= "value-changed" handler="delay_spin_value_changed_cb"/>
                       </object>
                     </child>
                   </object>
@@ -221,6 +224,8 @@
             <property name="receives_default">True</property>
             <property name="action_name">app.screen-shot</property>
             <property name="use_underline">True</property>
+            <property name="can-default">True</property>
+            <signal name="clicked" handler="capture_button_clicked_cb"/>
             <style>
               <class name="suggested-action"/>
             </style>
@@ -244,11 +249,12 @@
         </child>
       </object>
     </child>
-  </object>
+  </template>
   <object class="GtkAdjustment" id="delay_adjustment">
-    <property name="upper">100</property>
-    <property name="step_increment">1</property>
-    <property name="page_increment">10</property>
+    <property name="lower">0</property>
+    <property name="upper">99</property>
+    <property name="step-increment">1</property>
+    <property name="page-increment">1</property>
   </object>
   <menu id="primary_menu">
     <section>
diff --git a/src/screenshot-interactive-dialog.c b/src/screenshot-interactive-dialog.c
index 69f36d4..2276f7a 100644
--- a/src/screenshot-interactive-dialog.c
+++ b/src/screenshot-interactive-dialog.c
@@ -30,138 +30,97 @@
 #include "screenshot-interactive-dialog.h"
 #include "screenshot-utils.h"
 
-static GtkWidget *pointer_row = NULL;
-
 #define TARGET_TOGGLE_DESKTOP 0
 #define TARGET_TOGGLE_WINDOW  1
 #define TARGET_TOGGLE_AREA    2
 
+struct _ScreenshotInteractiveDialog
+{
+  GtkApplicationWindow parent_instance;
+
+  GtkWidget *capture_button;
+  GtkWidget *listbox;
+  GtkWidget *pointer;
+  GtkWidget *pointer_row;
+  GtkWidget *delay;
+  GtkAdjustment *delay_adjustment;
+
+  GtkWidget *screen;
+  GtkWidget *window;
+  GtkWidget *selection;
+
+  CaptureClickedCallback callback;
+  gpointer user_data;
+};
+
+G_DEFINE_TYPE (ScreenshotInteractiveDialog, screenshot_interactive_dialog, GTK_TYPE_APPLICATION_WINDOW)
+
 static void
-set_mode (gint mode)
+set_mode (ScreenshotInteractiveDialog *self,
+          gint                         mode)
 {
   gboolean take_window_shot = (mode == TARGET_TOGGLE_WINDOW);
   gboolean take_area_shot = (mode == TARGET_TOGGLE_AREA);
 
-  gtk_widget_set_sensitive (pointer_row, !take_area_shot);
+  gtk_widget_set_sensitive (self->pointer_row, !take_area_shot);
 
   screenshot_config->take_window_shot = take_window_shot;
   screenshot_config->take_area_shot = take_area_shot;
 }
 
 static void
-target_toggled_cb (GtkToggleButton *button,
-                   gpointer         data)
+screen_toggled_cb (GtkToggleButton             *button,
+                   ScreenshotInteractiveDialog *self)
 {
-  int target_toggle = GPOINTER_TO_INT (data);
-
   if (gtk_toggle_button_get_active (button))
-    set_mode (target_toggle);
+    set_mode (self, TARGET_TOGGLE_DESKTOP);
 }
 
 static void
-delay_spin_value_changed_cb (GtkSpinButton *button)
+window_toggled_cb (GtkToggleButton             *button,
+                   ScreenshotInteractiveDialog *self)
 {
-  screenshot_config->delay = gtk_spin_button_get_value_as_int (button);
+  if (gtk_toggle_button_get_active (button))
+    set_mode (self, TARGET_TOGGLE_WINDOW);
 }
 
 static void
-include_pointer_toggled_cb (GtkSwitch *toggle,
-                            gpointer         data)
+selection_toggled_cb (GtkToggleButton             *button,
+                      ScreenshotInteractiveDialog *self)
 {
-  screenshot_config->include_pointer = gtk_switch_get_active (toggle);
-  gtk_switch_set_state (toggle, gtk_switch_get_active (toggle));
+  if (gtk_toggle_button_get_active (button))
+    set_mode (self, TARGET_TOGGLE_AREA);
 }
 
 static void
-connect_effects_frame (GtkBuilder *ui)
+delay_spin_value_changed_cb (GtkSpinButton *button)
 {
-  GtkWidget *pointer;
-
-  /** Include pointer **/
-  pointer = GTK_WIDGET (gtk_builder_get_object (ui, "pointer"));
-  gtk_switch_set_active (GTK_SWITCH (pointer), screenshot_config->include_pointer);
-  g_signal_connect (pointer, "state-set",
-                    G_CALLBACK (include_pointer_toggled_cb),
-                    NULL);
+  screenshot_config->delay = gtk_spin_button_get_value_as_int (button);
 }
 
 static void
-connect_screenshot_frame (GtkBuilder *ui)
+include_pointer_toggled_cb (GtkSwitch *toggle,
+                            gpointer         data)
 {
-  GtkAdjustment *adjust;
-  GtkWidget *screen;
-  GtkWidget *selection;
-  GtkWidget *window;
-  GtkWidget *delay;
-  GSList *group;
-
-  /** Grab whole screen **/
-  group = NULL;
-  screen = GTK_WIDGET (gtk_builder_get_object (ui, "screen"));
-
-  if (screenshot_config->take_window_shot ||
-      screenshot_config->take_area_shot)
-    gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (screen), FALSE);
-
-  g_signal_connect (screen, "toggled",
-                    G_CALLBACK (target_toggled_cb),
-                    GINT_TO_POINTER (TARGET_TOGGLE_DESKTOP));
-  group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (screen));
-
-  /** Grab current window **/
-  window = GTK_WIDGET (gtk_builder_get_object (ui, "window"));
-  gtk_radio_button_set_group (GTK_RADIO_BUTTON (window), group);
-
-  if (screenshot_config->take_window_shot)
-    gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (window), TRUE);
-  g_signal_connect (window, "toggled",
-                    G_CALLBACK (target_toggled_cb),
-                    GINT_TO_POINTER (TARGET_TOGGLE_WINDOW));
-  group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (window));
-
-  /** Grab area of the desktop **/
-  selection = GTK_WIDGET (gtk_builder_get_object (ui, "selection"));
-
-  if (screenshot_config->take_area_shot)
-    gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (selection), TRUE);
-  g_signal_connect (selection, "toggled",
-                    G_CALLBACK (target_toggled_cb),
-                    GINT_TO_POINTER (TARGET_TOGGLE_AREA));
-  pointer_row = GTK_WIDGET (gtk_builder_get_object (ui, "pointerrow"));
-  gtk_widget_set_sensitive (pointer_row, !screenshot_config->take_area_shot);
-
-  /** Grab after delay **/
-  delay = GTK_WIDGET (gtk_builder_get_object (ui, "delay"));
-
-  adjust = GTK_ADJUSTMENT (gtk_adjustment_new ((gdouble) screenshot_config->delay,
-                                               0.0, 99.0,
-                                               1.0,  1.0,
-                                               0.0));
-
-  gtk_spin_button_set_adjustment (GTK_SPIN_BUTTON (delay), adjust);
-  g_signal_connect (delay, "value-changed",
-                    G_CALLBACK (delay_spin_value_changed_cb),
-                    NULL);
+  screenshot_config->include_pointer = gtk_switch_get_active (toggle);
+  gtk_switch_set_state (toggle, gtk_switch_get_active (toggle));
 }
 
-typedef struct {
-  GtkWidget *widget;
-  CaptureClickedCallback callback;
-  gpointer user_data;
-} CaptureData;
-
 static void
-capture_button_clicked_cb (GtkButton *button, CaptureData *data)
+capture_button_clicked_cb (GtkButton                   *button,
+                           ScreenshotInteractiveDialog *self)
 {
-  gtk_widget_destroy (data->widget);
-  data->callback (data->user_data);
-  g_free (data);
+  CaptureClickedCallback callback = self->callback;
+  gpointer user_data = self->user_data;
+
+  gtk_widget_destroy (GTK_WIDGET (self));
+  callback (user_data);
 }
 
 static void
-screenshot_listbox_update_header_func (GtkListBoxRow *row,
-                                       GtkListBoxRow *before,
-                                       gpointer user_data)
+header_func (GtkListBoxRow               *row,
+             GtkListBoxRow               *before,
+             ScreenshotInteractiveDialog *self)
 {
   GtkWidget *current;
 
@@ -180,43 +139,65 @@ screenshot_listbox_update_header_func (GtkListBoxRow *row,
     }
 }
 
+static void
+screenshot_interactive_dialog_class_init (ScreenshotInteractiveDialogClass *klass)
+{
+  GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
+
+  gtk_widget_class_set_template_from_resource (widget_class,
+                                               "/org/gnome/Screenshot/ui/screenshot-interactive-dialog.ui");
+  gtk_widget_class_bind_template_child (widget_class, ScreenshotInteractiveDialog, capture_button);
+  gtk_widget_class_bind_template_child (widget_class, ScreenshotInteractiveDialog, listbox);
+  gtk_widget_class_bind_template_child (widget_class, ScreenshotInteractiveDialog, pointer);
+  gtk_widget_class_bind_template_child (widget_class, ScreenshotInteractiveDialog, pointer_row);
+  gtk_widget_class_bind_template_child (widget_class, ScreenshotInteractiveDialog, delay);
+  gtk_widget_class_bind_template_child (widget_class, ScreenshotInteractiveDialog, delay_adjustment);
+  gtk_widget_class_bind_template_child (widget_class, ScreenshotInteractiveDialog, screen);
+  gtk_widget_class_bind_template_child (widget_class, ScreenshotInteractiveDialog, window);
+  gtk_widget_class_bind_template_child (widget_class, ScreenshotInteractiveDialog, selection);
+  gtk_widget_class_bind_template_callback (widget_class, screen_toggled_cb);
+  gtk_widget_class_bind_template_callback (widget_class, window_toggled_cb);
+  gtk_widget_class_bind_template_callback (widget_class, selection_toggled_cb);
+  gtk_widget_class_bind_template_callback (widget_class, delay_spin_value_changed_cb);
+  gtk_widget_class_bind_template_callback (widget_class, include_pointer_toggled_cb);
+  gtk_widget_class_bind_template_callback (widget_class, capture_button_clicked_cb);
+}
+
+static void
+screenshot_interactive_dialog_init (ScreenshotInteractiveDialog *self)
+{
+  gtk_widget_init_template (GTK_WIDGET (self));
+
+  gtk_list_box_set_header_func (GTK_LIST_BOX (self->listbox),
+                                (GtkListBoxUpdateHeaderFunc) header_func,
+                                self,
+                                NULL);
+}
+
 GtkWidget *
 screenshot_interactive_dialog_new (CaptureClickedCallback f, gpointer user_data)
 {
   ScreenshotApplication *self = user_data;
-  GtkWidget *dialog;
-  GtkWidget *capture_button;
-  GtkWidget *listbox;
-  GtkBuilder *ui;
-  CaptureData *data;
+  ScreenshotInteractiveDialog *dialog;
 
-  ui = gtk_builder_new_from_resource ("/org/gnome/Screenshot/ui/screenshot-interactive-dialog.ui");
-
-  dialog = GTK_WIDGET (gtk_builder_get_object (ui, "screenshot_window"));
+  dialog = g_object_new (SCREENSHOT_TYPE_INTERACTIVE_DIALOG, NULL);
   gtk_window_set_application (GTK_WINDOW (dialog), GTK_APPLICATION (self));
 
-  capture_button = GTK_WIDGET (gtk_builder_get_object (ui, "capture_button"));
+  dialog->callback = f;
+  dialog->user_data = user_data;
 
-  gtk_window_set_position (GTK_WINDOW (dialog), GTK_WIN_POS_CENTER);
+  gtk_widget_show_all (GTK_WIDGET (dialog));
 
-  listbox = GTK_WIDGET (gtk_builder_get_object (ui, "listbox"));
-  gtk_list_box_set_header_func (GTK_LIST_BOX (listbox),
-                                screenshot_listbox_update_header_func,
-                                user_data,
-                                NULL);
+  if (screenshot_config->take_window_shot)
+    gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (dialog->window), TRUE);
 
-  data = g_new (CaptureData, 1);
-  data->widget = dialog;
-  data->callback = f;
-  data->user_data = user_data;
-  g_signal_connect (capture_button, "clicked", G_CALLBACK (capture_button_clicked_cb), data);
-  gtk_widget_set_can_default (capture_button, TRUE);
-  gtk_widget_grab_default (capture_button);
+  if (screenshot_config->take_area_shot)
+    gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (dialog->selection), TRUE);
 
-  gtk_widget_show_all (dialog);
+  gtk_widget_set_sensitive (dialog->pointer_row, !screenshot_config->take_area_shot);
+  gtk_switch_set_active (GTK_SWITCH (dialog->pointer), screenshot_config->include_pointer);
 
-  connect_screenshot_frame (ui);
-  connect_effects_frame (ui);
+  gtk_adjustment_set_value (dialog->delay_adjustment, (gdouble) screenshot_config->delay);
 
-  return dialog;
+  return GTK_WIDGET (dialog);
 }
diff --git a/src/screenshot-interactive-dialog.h b/src/screenshot-interactive-dialog.h
index 1c2d23e..022b662 100644
--- a/src/screenshot-interactive-dialog.h
+++ b/src/screenshot-interactive-dialog.h
@@ -24,6 +24,14 @@
 
 #include <gtk/gtk.h>
 
+G_BEGIN_DECLS
+
+#define SCREENSHOT_TYPE_INTERACTIVE_DIALOG (screenshot_interactive_dialog_get_type())
+
+G_DECLARE_FINAL_TYPE (ScreenshotInteractiveDialog, screenshot_interactive_dialog, SCREENSHOT, 
INTERACTIVE_DIALOG, GtkApplicationWindow)
+
 typedef void (*CaptureClickedCallback) (gpointer *user_data);
 
 GtkWidget *screenshot_interactive_dialog_new (CaptureClickedCallback f, gpointer user_data);
+
+G_END_DECLS


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]