[bijiben/wip/gbsneto/ui-tweaks: 1/5] settings-dialog: Modernize code



commit 01a6b40660acec1f7bd001f8884a7073874171d6
Author: Georges Basile Stavracas Neto <georges stavracas gmail com>
Date:   Sun Jun 4 11:54:58 2017 -0300

    settings-dialog: Modernize code
    
    The current settings dialog fails in many places, such
    as constructing the entire UI with code (when the ideal
    way is to use GtkBuilder files), and it has many design
    flaws, making it not compilant to the GNOME HIG.
    
    This commit updates the code of BjbSettingsDialog in the
    following forms:
     * Use G_DECLARE_FINAL_TYPE() and get rid of the boilerplate.
     * Turn into a composite class, and add a 'settings-dialog.ui'
       file with all the UI definitions.
     * Brutally simplify the code.
     * Fix a couple of issues in the way.

 src/bjb-settings-dialog.c        |  384 +++++++++-----------------------------
 src/bjb-settings-dialog.h        |   29 +---
 src/bjb-settings.c               |    4 +-
 src/bjb.gresource.xml            |    4 +
 src/resources/settings-dialog.ui |  182 ++++++++++++++++++
 5 files changed, 276 insertions(+), 327 deletions(-)
---
diff --git a/src/bjb-settings-dialog.c b/src/bjb-settings-dialog.c
index b3a9d6d..4d78ebd 100644
--- a/src/bjb-settings-dialog.c
+++ b/src/bjb-settings-dialog.c
@@ -27,93 +27,54 @@
 #include "bjb-settings.h"
 #include "bjb-settings-dialog.h"
 
-
-enum
+struct _BjbSettingsDialog
 {
-  PROP_0,
-  PROP_PARENT,
-  N_PROPERTIES
-};
-
+  GtkDialog         parent;
 
-struct BjbSettingsDialogPrivate_
-{
-  GtkWidget        *parent;
+  GtkWidget        *parent_window;
   BjbSettings      *settings;
-  BijiManager     *manager;
+  BijiManager      *manager;
 
   GtkStack         *stack;
-  GtkStackSwitcher *switcher;
 
   /* Primary NoteBook page */
-
-  GtkListBox       *box;
+  GtkListBox       *listbox;
   GList            *children;
 
-
   /* Note Edition page */
-
-  GtkWidget       *font_lbl;
-  GtkWidget       *font_bt;
+  GtkColorChooser *color_button;
+  GtkFontButton   *font_button;
+  GtkSwitch       *system_font_switch;
 };
 
-
-
-
 G_DEFINE_TYPE (BjbSettingsDialog, bjb_settings_dialog, GTK_TYPE_DIALOG)
 
-
-static void
-update_buttons (BjbSettingsDialog *self)
-{
-  BjbSettingsDialogPrivate *priv;
-  gboolean use_system_font;
-
-  priv = self->priv;
-  use_system_font = bjb_settings_use_system_font (priv->settings);
-
-  gtk_widget_set_sensitive (priv->font_lbl, !use_system_font);
-  gtk_widget_set_sensitive (priv->font_bt, !use_system_font);
-}
-
-
 /* Callbacks */
 
 static void
-on_system_font_toggled (GtkSwitch         *button,
-                        GParamSpec        *pspec,
-                        BjbSettingsDialog *self)
+on_font_selected (GtkFontButton     *widget,
+                  BjbSettingsDialog *self)
 {
   BjbSettings *settings;
 
+  settings = self->settings;
 
-  settings = self->priv->settings;
-  g_settings_set_boolean (G_SETTINGS (settings),
-                          "use-system-font",
-                          gtk_switch_get_active (button));
-  update_buttons (self);
-}
-
-
-static void
-on_font_selected (GtkFontButton     *widget,
-                  BjbSettings       *settings)
-{
   g_settings_set_string (G_SETTINGS (settings),
                          "font",
                          gtk_font_button_get_font_name (widget));
 
 }
 
-
-
 static void
-on_color_set (GtkColorButton *button,
-              BjbSettings    *settings)
+on_color_set (GtkColorButton    *button,
+              BjbSettingsDialog *self)
 {
+  BjbSettings *settings;
   GdkRGBA color;
   gchar *color_str;
 
+  settings = self->settings;
+
   gtk_color_chooser_get_rgba (GTK_COLOR_CHOOSER (button), &color);
   color_str = gdk_rgba_to_string (&color);
 
@@ -124,16 +85,10 @@ on_color_set (GtkColorButton *button,
   g_free (color_str);
 }
 
-
-
-
-
-
 /* Primary Provider page */
 
 typedef struct
 {
-  GtkWidget      *overlay;
   GtkWidget      *widget;
   GtkWidget      *toggle;
 
@@ -152,7 +107,6 @@ provider_child_new (void)
   ProviderChild *retval;
 
   retval = g_slice_new (ProviderChild);
-  retval->overlay = NULL;
   retval->widget = NULL;
   retval->toggle = NULL;
   retval->selected = FALSE;
@@ -188,7 +142,7 @@ child_toggle_new (void)
   GtkWidget *w;
 
   w = gtk_image_new_from_icon_name ("object-select-symbolic", GTK_ICON_SIZE_INVALID);
-  gtk_image_set_pixel_size (GTK_IMAGE (w), 48);
+  gtk_image_set_pixel_size (GTK_IMAGE (w), 16);
   gtk_widget_set_halign (w, GTK_ALIGN_END);
   gtk_widget_show (w);
   return w;
@@ -201,22 +155,20 @@ toggle_child (gpointer iter,
 {
   ProviderChild *child;
 
-
   child = (ProviderChild*) iter;
 
-
   if (child->selected)
-  {
-    child->toggle = child_toggle_new ();
-    gtk_overlay_add_overlay (GTK_OVERLAY (child->overlay), child->toggle);
-  }
-
-
+    {
+      child->toggle = child_toggle_new ();
+      gtk_container_add (GTK_CONTAINER (child->widget), child->toggle);
+    }
   else
-  {
-    if (child->toggle && GTK_IS_WIDGET (child->toggle))
-      gtk_widget_destroy (child->toggle);
-  }
+    {
+      if (child->toggle && GTK_IS_WIDGET (child->toggle))
+        gtk_widget_destroy (child->toggle);
+
+      child->toggle = NULL;
+    }
 }
 
 
@@ -224,7 +176,7 @@ toggle_child (gpointer iter,
 static void
 update_providers (BjbSettingsDialog *self)
 {
-  g_list_foreach (self->priv->children, toggle_child, self);
+  g_list_foreach (self->children, toggle_child, self);
 }
 
 
@@ -262,7 +214,7 @@ on_row_activated_cb    (GtkListBox    *list_box,
 
 
   /* Toggle everything : unselect all but this one */
-  g_list_foreach (self->priv->children, unselect_child, NULL);
+  g_list_foreach (self->children, unselect_child, NULL);
   child->selected = TRUE;
   update_providers (self);
 }
@@ -285,231 +237,86 @@ static void
 add_child (gpointer provider_info, gpointer user_data)
 {
   BjbSettingsDialog           *self;
-  BjbSettingsDialogPrivate    *priv;
   const BijiProviderInfo      *info;
   ProviderChild               *child;
   GtkWidget                   *box, *w;
 
   self = BJB_SETTINGS_DIALOG (user_data);
-  priv = self->priv;
   info = (const BijiProviderInfo*) provider_info;
 
-
   child = provider_child_new ();
   child->id = info->unique_id;
   child->icon = info->icon;
   child->name = info->name;
 
-
-  // what if (child->id != NULL && g_strcmp0 (child->id, "") != 0)
-
-
   /* Is the provider the primary ? */
-  if (g_strcmp0 (child->id, bjb_settings_get_default_location (priv->settings)) ==0)
+  if (g_strcmp0 (child->id, bjb_settings_get_default_location (self->settings)) ==0)
     child->selected = TRUE;
 
   /* Create the widget */
 
-  child->widget = box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 12);
-  child->overlay = gtk_overlay_new ();
-  gtk_container_add (GTK_CONTAINER (priv->box), child->overlay);
-  gtk_container_add (GTK_CONTAINER (child->overlay), box);
+  child->widget = box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 24);
+  gtk_widget_set_margin_start (box, 12);
+  gtk_widget_set_margin_end (box, 12);
+  gtk_container_add (GTK_CONTAINER (self->listbox), child->widget);
 
 
-  g_object_set_qdata_full (G_OBJECT (child->overlay), application_quark (),
+  g_object_set_qdata_full (G_OBJECT (child->widget), application_quark (),
                            child, provider_child_free);
 
-  w = child->icon;
-  gtk_widget_set_margin_start (w, 12);
-  gtk_container_add (GTK_CONTAINER (box), w);
 
+  w = g_object_ref (child->icon);
+  gtk_container_add (GTK_CONTAINER (box), w);
 
   w = gtk_label_new (child->name);
-  gtk_widget_set_margin_end (w, 180);
+  gtk_label_set_xalign (GTK_LABEL (w), 0.0);
+  gtk_widget_set_hexpand (w, TRUE);
   gtk_container_add (GTK_CONTAINER (box), w);
-  gtk_widget_set_valign (w, GTK_ALIGN_CENTER);
-  gtk_box_pack_end (GTK_BOX (box), w, FALSE, FALSE, 0);
 
-  self->priv->children = g_list_prepend (priv->children, child);
+  self->children = g_list_prepend (self->children, child);
   gtk_widget_show_all (box);
 }
 
-
-static GtkWidget *
-create_page_primary (BjbSettingsDialog *self)
+static void
+bjb_settings_dialog_constructed (GObject *object)
 {
-  BjbSettingsDialogPrivate *priv;
-  GList *providers_info;
+  BjbSettingsDialog *self;
+  GApplication      *app;
+  GList             *providers;
+  GdkRGBA            color;
 
-  priv = self->priv;
-  priv->box = GTK_LIST_BOX (gtk_list_box_new ());
+  G_OBJECT_CLASS (bjb_settings_dialog_parent_class)->constructed (object);
 
-  /* Create the list */
+  self = BJB_SETTINGS_DIALOG (object);
+  app = g_application_get_default ();
+  self->manager = bijiben_get_manager (BIJIBEN_APPLICATION (app));
+  self->settings = bjb_app_get_settings (app);
 
-  gtk_list_box_set_selection_mode (priv->box, GTK_SELECTION_NONE);
-  gtk_list_box_set_header_func (priv->box, header_func, NULL, NULL);
+  gtk_list_box_set_selection_mode (self->listbox, GTK_SELECTION_NONE);
+  gtk_list_box_set_header_func (self->listbox, header_func, NULL, NULL);
 
-  g_signal_connect (priv->box, "row-activated",
-                    G_CALLBACK (on_row_activated_cb), self);
+  g_object_bind_property (self->settings,
+                          "use-system-font",
+                          self->system_font_switch,
+                          "active",
+                          G_BINDING_BIDIRECTIONAL | G_BINDING_SYNC_CREATE);
 
+  gtk_font_button_set_font_name (self->font_button,
+                                 bjb_settings_get_default_font (self->settings));
 
-  /* Add providers */
+  gdk_rgba_parse (&color, bjb_settings_get_default_color (self->settings));
+  gtk_color_chooser_set_rgba (self->color_button, &color);
 
-  providers_info = biji_manager_get_providers (priv->manager);
-  g_list_foreach (providers_info, add_child, self);
-  g_list_free (providers_info);
 
+  /* Add providers */
+  providers = biji_manager_get_providers (self->manager);
+  g_list_foreach (providers, add_child, self);
+  g_list_free (providers);
 
   /* Check GSettings : toggle the actual default provider */
   update_providers (self);
-
-  return GTK_WIDGET (priv->box);
-}
-
-
-
-
-/* Edition page (font, color) */
-
-
-static GtkWidget *
-create_page_edition (BjbSettingsDialog *self)
-{
-  BjbSettingsDialogPrivate   *priv;
-  BjbSettings                *settings;
-  GtkWidget                  *grid, *label, *picker, *box;
-  GdkRGBA                    color;
-
-  priv = self->priv;
-  settings = priv->settings;
-
-  grid = gtk_grid_new ();
-  gtk_grid_set_column_spacing (GTK_GRID (grid), 36);
-  gtk_grid_set_row_spacing (GTK_GRID (grid), 6);
-  gtk_widget_set_halign (grid, GTK_ALIGN_CENTER);
-
-
-
-  /* Use System Font */
-  label = gtk_label_new (_("Use System Font"));
-  gtk_widget_set_halign (label, GTK_ALIGN_END);
-  gtk_grid_attach (GTK_GRID (grid), label, 1, 1, 1, 1);
-  picker = gtk_switch_new ();
-  box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
-  gtk_box_pack_start (GTK_BOX (box), picker, FALSE, FALSE, 0);
-  gtk_switch_set_active (GTK_SWITCH (picker),
-                         bjb_settings_use_system_font (settings));
-  g_signal_connect (picker, "notify::active",
-                    G_CALLBACK (on_system_font_toggled), self);
-  gtk_grid_attach (GTK_GRID (grid), box, 2, 1, 1, 1);
-
-
-  /* Default font */
-  label = priv->font_lbl = gtk_label_new (_("Note Font"));
-  gtk_widget_set_halign (label, GTK_ALIGN_END);
-  gtk_grid_attach (GTK_GRID (grid), label, 1, 2, 1, 1);
-
-  picker = priv->font_bt = gtk_font_button_new_with_font (bjb_settings_get_default_font (settings));
-  g_signal_connect (picker, "font-set",
-                    G_CALLBACK (on_font_selected), settings);
-  gtk_grid_attach (GTK_GRID (grid), picker, 2, 2, 1, 1);
-  update_buttons (self);
-
-
-  /* Default color */
-  label = gtk_label_new (_("Default Color"));
-  gtk_widget_set_halign (label, GTK_ALIGN_END);
-  gtk_grid_attach (GTK_GRID (grid), label, 1, 3, 1, 1);
-
-  picker = bjb_color_button_new ();
-  box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
-  gtk_box_pack_start (GTK_BOX (box), picker, FALSE, FALSE, 0);
-  gdk_rgba_parse (&color, bjb_settings_get_default_color (settings));
-  gtk_color_chooser_set_rgba (GTK_COLOR_CHOOSER (picker), &color);
-  g_signal_connect (picker, "color-set",
-                    G_CALLBACK (on_color_set), settings);
-  gtk_grid_attach (GTK_GRID (grid), box, 2, 3, 1, 1);
-
-  return grid;
 }
 
-
-
-/* Packaging */
-
-static void
-bjb_settings_dialog_constructed (GObject *object)
-{
-  BjbSettingsDialog          *self;
-  GtkDialog                  *dialog; //also self
-  BjbSettingsDialogPrivate   *priv;
-  GtkWidget                  *area, *grid, *hbox, *page, *scroll, *viewport;
-  GtkWindow                  *window;
-  GApplication               *app;
-
-
-  G_OBJECT_CLASS (bjb_settings_dialog_parent_class)->constructed (object);
-
-  self = BJB_SETTINGS_DIALOG (object);
-  dialog = GTK_DIALOG (self);
-  window = GTK_WINDOW (self);
-  priv = self->priv;
-
-
-  app = g_application_get_default ();
-  priv->manager = bijiben_get_manager (BIJIBEN_APPLICATION (app));
-  priv->settings = bjb_app_get_settings (app);
-
-
-  gtk_window_set_modal (window, TRUE);
-  gtk_window_set_resizable (window, FALSE);
-  gtk_window_set_title (window, _("Preferences"));
-  gtk_header_bar_set_show_close_button (GTK_HEADER_BAR
-    (gtk_dialog_get_header_bar (dialog)), TRUE);
-
-  /* Dialog Area */
-  area = gtk_dialog_get_content_area (dialog);
-  gtk_container_set_border_width (GTK_CONTAINER (area), 38);
-
-  priv->stack = GTK_STACK (gtk_stack_new ());
-  gtk_widget_set_hexpand (GTK_WIDGET (priv->stack), TRUE);
-  gtk_widget_set_vexpand (GTK_WIDGET (priv->stack), TRUE);
-
-  priv->switcher = GTK_STACK_SWITCHER (gtk_stack_switcher_new ());
-  gtk_header_bar_set_custom_title (GTK_HEADER_BAR (gtk_dialog_get_header_bar (dialog)), GTK_WIDGET 
(priv->switcher));
-  gtk_widget_show (GTK_WIDGET (priv->switcher));
-
-  hbox = gtk_grid_new ();
-  gtk_widget_set_vexpand (hbox, TRUE);
-  gtk_widget_set_halign (hbox, GTK_ALIGN_CENTER);
-  gtk_widget_set_valign (hbox, GTK_ALIGN_CENTER);
-  gtk_stack_switcher_set_stack (priv->switcher, priv->stack);
-
-  grid = gtk_grid_new ();
-  gtk_container_add (GTK_CONTAINER (area),grid);
-  gtk_grid_attach (GTK_GRID (grid), hbox, 1, 1, 1, 1);
-  gtk_grid_attach (GTK_GRID (grid), GTK_WIDGET (priv->stack), 1, 2, 1, 1);
-  gtk_widget_set_valign (GTK_WIDGET (priv->stack), GTK_ALIGN_CENTER);
-
-
-  /* Dialog Pages */
-  page = create_page_edition (self);
-  gtk_widget_set_vexpand (page, TRUE);
-  gtk_stack_add_titled (priv->stack, page, "edition", _("Note Edition"));
-
-  page = create_page_primary (self);
-  scroll = gtk_scrolled_window_new (NULL, NULL);
-  gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scroll), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
-  viewport = gtk_viewport_new (NULL, NULL);
-  gtk_container_add (GTK_CONTAINER (viewport), page);
-  gtk_container_add (GTK_CONTAINER (scroll), viewport);
-  gtk_stack_add_titled (priv->stack, scroll, "provider", _("Primary Book"));
-
-  gtk_widget_show_all (area);
-}
-
-
-
 static void
 bjb_settings_dialog_finalize (GObject *object)
 {
@@ -518,8 +325,8 @@ bjb_settings_dialog_finalize (GObject *object)
   g_return_if_fail (BJB_IS_SETTINGS_DIALOG (object));
 
   self = BJB_SETTINGS_DIALOG (object);
-  //g_list_free_full (self->priv->children, provider_child_free); uh?
-  g_list_free (self->priv->children);
+
+  g_list_free (self->children);
 
   G_OBJECT_CLASS (bjb_settings_dialog_parent_class)->finalize (object);
 }
@@ -531,18 +338,7 @@ bjb_settings_dialog_get_property (GObject    *object,
                                   GValue     *value,
                                   GParamSpec *pspec)
 {
-  BjbSettingsDialog *self = BJB_SETTINGS_DIALOG (object);
-
-  switch (prop_id)
-  {
-    case PROP_PARENT:
-      g_value_set_object (value, self->priv->parent);
-      break;
-
-    default:
-      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
-      break;
-  }
+  G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
 }
 
 static void
@@ -551,57 +347,47 @@ bjb_settings_dialog_set_property (GObject      *object,
                                   const GValue *value,
                                   GParamSpec   *pspec)
 {
-  BjbSettingsDialog *self = BJB_SETTINGS_DIALOG (object);
-
-  switch (prop_id)
-  {
-    case PROP_PARENT:
-      self->priv->parent = g_value_get_object (value);
-      break;
-
-    default:
-      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
-      break;
-  }
+  G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
 }
 
 static void
 bjb_settings_dialog_init (BjbSettingsDialog *self)
 {
-  self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self, BJB_TYPE_SETTINGS_DIALOG, BjbSettingsDialogPrivate);
+  gtk_widget_init_template (GTK_WIDGET (self));
 }
 
-
-
 static void
 bjb_settings_dialog_class_init (BjbSettingsDialogClass *klass)
 {
-  GObjectClass *g_object_class;
+  GtkWidgetClass *gtk_widget_class;
+  GObjectClass   *g_object_class;
 
   g_object_class = G_OBJECT_CLASS (klass);
+  gtk_widget_class = GTK_WIDGET_CLASS (klass);
 
   g_object_class->set_property = bjb_settings_dialog_set_property;
   g_object_class->get_property = bjb_settings_dialog_get_property;
   g_object_class->finalize = bjb_settings_dialog_finalize;
   g_object_class->constructed = bjb_settings_dialog_constructed;
 
-  g_type_class_add_private ((gpointer)klass, sizeof (BjbSettingsDialogPrivate));
+  gtk_widget_class_set_template_from_resource (gtk_widget_class, "/org/gnome/bijiben/ui/settings-dialog.ui");
+
+  gtk_widget_class_bind_template_child (gtk_widget_class, BjbSettingsDialog, color_button);
+  gtk_widget_class_bind_template_child (gtk_widget_class, BjbSettingsDialog, font_button);
+  gtk_widget_class_bind_template_child (gtk_widget_class, BjbSettingsDialog, listbox);
+  gtk_widget_class_bind_template_child (gtk_widget_class, BjbSettingsDialog, stack);
+  gtk_widget_class_bind_template_child (gtk_widget_class, BjbSettingsDialog, system_font_switch);
 
-  g_object_class_install_property (g_object_class,PROP_PARENT,
-                                   g_param_spec_object ("parent",
-                                                        "Parent Window",
-                                                        "Parent Window Transient For",
-                                                        GTK_TYPE_WINDOW,
-                                                        G_PARAM_READWRITE |
-                                                        G_PARAM_STATIC_STRINGS));
+  gtk_widget_class_bind_template_callback (gtk_widget_class, on_color_set);
+  gtk_widget_class_bind_template_callback (gtk_widget_class, on_font_selected);
+  gtk_widget_class_bind_template_callback (gtk_widget_class, on_row_activated_cb);
 }
 
 
 GtkDialog *
-bjb_settings_dialog_new (GtkWidget *parent_window)
+bjb_settings_dialog_new (void)
 {
   return g_object_new (BJB_TYPE_SETTINGS_DIALOG,
-                       "parent", parent_window,
                        "use-header-bar", TRUE,
                        NULL);
 }
diff --git a/src/bjb-settings-dialog.h b/src/bjb-settings-dialog.h
index ae75d80..8015f59 100644
--- a/src/bjb-settings-dialog.h
+++ b/src/bjb-settings-dialog.h
@@ -25,36 +25,11 @@
 
 G_BEGIN_DECLS
 
-
 #define BJB_TYPE_SETTINGS_DIALOG             (bjb_settings_dialog_get_type ())
-#define BJB_SETTINGS_DIALOG(obj)             (G_TYPE_CHECK_INSTANCE_CAST ((obj), BJB_TYPE_SETTINGS_DIALOG, 
BjbSettingsDialog))
-#define BJB_SETTINGS_DIALOG_CLASS(klass)     (G_TYPE_CHECK_CLASS_CAST ((klass), BJB_TYPE_SETTINGS_DIALOG, 
BjbSettingsDialogClass))
-#define BJB_IS_SETTINGS_DIALOG(obj)          (G_TYPE_CHECK_INSTANCE_TYPE ((obj), BJB_TYPE_SETTINGS_DIALOG))
-#define BJB_IS_SETTINGS_DIALOG_CLASS(klass)  (G_TYPE_CHECK_CLASS_TYPE ((klass), BJB_TYPE_SETTINGS_DIALOG))
-#define BJB_SETTINGS_DIALOG_GET_CLASS(obj)   (G_TYPE_INSTANCE_GET_CLASS ((obj), BJB_TYPE_SETTINGS_DIALOG, 
BjbSettingsDialogClass))
-
-typedef struct BjbSettingsDialog_         BjbSettingsDialog;
-typedef struct BjbSettingsDialogClass_    BjbSettingsDialogClass;
-typedef struct BjbSettingsDialogPrivate_  BjbSettingsDialogPrivate;
-
-struct BjbSettingsDialog_
-{
-  GtkDialog parent;
-  BjbSettingsDialogPrivate *priv;
-};
-
-
-struct BjbSettingsDialogClass_
-{
-  GtkDialogClass parent_class;
-};
-
-
-GType                  bjb_settings_dialog_get_type            (void);
-
 
-GtkDialog             *bjb_settings_dialog_new                 (GtkWidget *window);
+G_DECLARE_FINAL_TYPE (BjbSettingsDialog, bjb_settings_dialog, BJB, SETTINGS_DIALOG, GtkDialog)
 
+GtkDialog             *bjb_settings_dialog_new                 (void);
 
 G_END_DECLS
 
diff --git a/src/bjb-settings.c b/src/bjb-settings.c
index e49dc25..cb8784e 100644
--- a/src/bjb-settings.c
+++ b/src/bjb-settings.c
@@ -287,7 +287,9 @@ show_bijiben_settings_window (GtkWidget *parent_window)
 {
   GtkDialog *dialog;
 
-  dialog = bjb_settings_dialog_new (parent_window);
+  dialog = bjb_settings_dialog_new ();
+  gtk_window_set_transient_for (GTK_WINDOW (dialog), GTK_WINDOW (parent_window));
+
   /* result = */ gtk_dialog_run (dialog);
   gtk_widget_destroy (GTK_WIDGET (dialog));
 }
diff --git a/src/bjb.gresource.xml b/src/bjb.gresource.xml
index 2283dfc..a3f5149 100644
--- a/src/bjb.gresource.xml
+++ b/src/bjb.gresource.xml
@@ -7,4 +7,8 @@
     <file alias="thumbnail-frame.png">resources/thumbnail-frame.png</file>
     <file alias="note-symbolic.svg">resources/note-symbolic.svg</file>
   </gresource>
+
+  <gresource prefix="/org/gnome/bijiben/ui">
+    <file alias="settings-dialog.ui">resources/settings-dialog.ui</file>
+  </gresource>
 </gresources>
diff --git a/src/resources/settings-dialog.ui b/src/resources/settings-dialog.ui
new file mode 100644
index 0000000..4b55d0e
--- /dev/null
+++ b/src/resources/settings-dialog.ui
@@ -0,0 +1,182 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+  <requires lib="gtk+" version="3.20"/>
+  <template class="BjbSettingsDialog" parent="GtkDialog">
+    <property name="can_focus">False</property>
+    <property name="resizable">False</property>
+    <property name="modal">True</property>
+    <property name="default_width">400</property>
+    <property name="type_hint">dialog</property>
+    <property name="title" translatable="yes">Preferences</property>
+    <property name="border_width">0</property>
+    <child internal-child="vbox">
+      <object class="GtkBox">
+        <property name="can_focus">False</property>
+        <property name="orientation">vertical</property>
+        <property name="spacing">0</property>
+        <property name="border_width">0</property>
+        <child>
+          <object class="GtkStack" id="stack">
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+            <property name="hexpand">True</property>
+            <property name="vexpand">True</property>
+            <property name="border_width">24</property>
+            <child>
+              <object class="GtkGrid">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <property name="halign">center</property>
+                <property name="valign">start</property>
+                <property name="row_spacing">6</property>
+                <property name="column_spacing">12</property>
+                <child>
+                  <object class="GtkLabel">
+                    <property name="visible">True</property>
+                    <property name="can_focus">False</property>
+                    <property name="label" translatable="yes">Use System Font</property>
+                    <property name="xalign">1</property>
+                  </object>
+                  <packing>
+                    <property name="left_attach">0</property>
+                    <property name="top_attach">0</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkLabel">
+                    <property name="visible">True</property>
+                    <property name="can_focus">False</property>
+                    <property name="sensitive" bind-source="system_font_switch" bind-property="active" 
bind-flags="default|invert-boolean" />
+                    <property name="label" translatable="yes">Note Font</property>
+                    <property name="xalign">1</property>
+                  </object>
+                  <packing>
+                    <property name="left_attach">0</property>
+                    <property name="top_attach">1</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkLabel">
+                    <property name="visible">True</property>
+                    <property name="can_focus">False</property>
+                    <property name="label" translatable="yes">Default Color</property>
+                    <property name="xalign">1</property>
+                  </object>
+                  <packing>
+                    <property name="left_attach">0</property>
+                    <property name="top_attach">2</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkSwitch" id="system_font_switch">
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="halign">start</property>
+                  </object>
+                  <packing>
+                    <property name="left_attach">1</property>
+                    <property name="top_attach">0</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkFontButton" id="font_button">
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="sensitive" bind-source="system_font_switch" bind-property="active" 
bind-flags="default|invert-boolean" />
+                    <property name="receives_default">True</property>
+                    <property name="halign">start</property>
+                    <property name="font">Sans 12</property>
+                    <property name="preview_text"/>
+                    <signal name="font-set" handler="on_font_selected" object="BjbSettingsDialog" 
swapped="no" />
+                  </object>
+                  <packing>
+                    <property name="left_attach">1</property>
+                    <property name="top_attach">1</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkColorButton" id="color_button">
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="receives_default">True</property>
+                    <property name="halign">start</property>
+                    <signal name="color-set" handler="on_color_set" object="BjbSettingsDialog" swapped="no" 
/>
+                  </object>
+                  <packing>
+                    <property name="left_attach">1</property>
+                    <property name="top_attach">2</property>
+                  </packing>
+                </child>
+              </object>
+              <packing>
+                <property name="name">edition</property>
+                <property name="title" translatable="yes">Note Edition</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkBox">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <property name="orientation">vertical</property>
+                <property name="spacing">12</property>
+                <child>
+                  <object class="GtkLabel">
+                    <property name="visible">True</property>
+                    <property name="can_focus">False</property>
+                    <property name="label" translatable="yes">Select the default storage location:</property>
+                    <property name="xalign">0</property>
+                  </object>
+                </child>
+                <child>
+                  <object class="GtkScrolledWindow">
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="shadow_type">in</property>
+                    <property name="propagate-natural-height">True</property>
+                    <property name="max_content_width">350</property>
+                    <child>
+                      <object class="GtkViewport">
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="shadow_type">none</property>
+                        <child>
+                          <object class="GtkListBox" id="listbox">
+                            <property name="visible">True</property>
+                            <property name="can_focus">False</property>
+                            <property name="selection_mode">none</property>
+                            <signal name="row-activated" handler="on_row_activated_cb" 
object="BjbSettingsDialog" swapped="no" />
+                          </object>
+                        </child>
+                      </object>
+                    </child>
+                  </object>
+                </child>
+              </object>
+              <packing>
+                <property name="name">provider</property>
+                <property name="title" translatable="yes">Primary Book</property>
+              </packing>
+            </child>
+          </object>
+          <packing>
+            <property name="position">1</property>
+          </packing>
+        </child>
+      </object>
+    </child>
+    <child type="titlebar">
+      <object class="GtkHeaderBar">
+        <property name="visible">True</property>
+        <property name="can_focus">False</property>
+        <property name="show_close_button">True</property>
+        <child type="title">
+          <object class="GtkStackSwitcher">
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+            <property name="stack">stack</property>
+          </object>
+        </child>
+      </object>
+    </child>
+  </template>
+</interface>


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