[gnome-builder] project-tree: extract project tree settings



commit 538344fbfe9274133fdc5fff4161b3914b71dd78
Author: Christian Hergert <christian hergert me>
Date:   Thu Apr 9 22:21:36 2015 -0700

    project-tree: extract project tree settings
    
    This moves project-tree settings into their own schema. I'm still not
    happy with things long term, there is far too much coupling going on
    here.
    
    But this simplifies things a bit in the process, so net win for now.

 configure.ac                                       |    1 +
 data/gsettings.mk                                  |    1 +
 .../org.gnome.builder.editor.gschema.xml.in        |    5 -
 .../org.gnome.builder.project-tree.gschema.xml.in  |   20 +++++
 src/editor/gb-editor-workspace-actions.c           |   39 +++------
 src/editor/gb-editor-workspace-private.h           |    4 +-
 src/editor/gb-editor-workspace.c                   |   87 ++++++++++++++++++--
 src/project-tree/gb-project-tree.c                 |   25 ++++++-
 src/project-tree/gb-project-tree.h                 |   10 ++-
 9 files changed, 144 insertions(+), 48 deletions(-)
---
diff --git a/configure.ac b/configure.ac
index 725dc19..490a4e1 100644
--- a/configure.ac
+++ b/configure.ac
@@ -74,6 +74,7 @@ AC_CONFIG_FILES([
        data/gsettings/org.gnome.builder.editor.gschema.xml
        data/gsettings/org.gnome.builder.editor.language.gschema.xml
        data/gsettings/org.gnome.builder.experimental.gschema.xml
+       data/gsettings/org.gnome.builder.project-tree.gschema.xml
        po/Makefile.in
 ])
 
diff --git a/data/gsettings.mk b/data/gsettings.mk
index cb77de0..cad1ce8 100644
--- a/data/gsettings.mk
+++ b/data/gsettings.mk
@@ -2,6 +2,7 @@ gsettingsschema_in_files = \
        data/gsettings/org.gnome.builder.editor.gschema.xml.in \
        data/gsettings/org.gnome.builder.editor.language.gschema.xml.in \
        data/gsettings/org.gnome.builder.experimental.gschema.xml.in \
+       data/gsettings/org.gnome.builder.project-tree.gschema.xml.in \
        $(NULL)
 
 gsettings_SCHEMAS = $(gsettingsschema_in_files:.xml.in=.xml)
diff --git a/data/gsettings/org.gnome.builder.editor.gschema.xml.in 
b/data/gsettings/org.gnome.builder.editor.gschema.xml.in
index 97e6fa3..8565165 100644
--- a/data/gsettings/org.gnome.builder.editor.gschema.xml.in
+++ b/data/gsettings/org.gnome.builder.editor.gschema.xml.in
@@ -63,10 +63,5 @@
       <range min="0" max="999"/>
       <default>0</default>
     </key>
-    <key name="show-sidebar" type="b">
-      <default>false</default>
-      <summary>Show Project Sidebar</summary>
-      <description>If enabled, the sidebar will be visible in the editor workspace.</description>
-    </key>
   </schema>
 </schemalist>
diff --git a/data/gsettings/org.gnome.builder.project-tree.gschema.xml.in 
b/data/gsettings/org.gnome.builder.project-tree.gschema.xml.in
new file mode 100644
index 0000000..0798bb5
--- /dev/null
+++ b/data/gsettings/org.gnome.builder.project-tree.gschema.xml.in
@@ -0,0 +1,20 @@
+<schemalist>
+  <schema id="org.gnome.builder.project-tree" path="/org/gnome/builder/project-tree/" 
gettext-domain="gnome-builder">
+    <key name="show" type="b">
+      <default>false</default>
+      <summary>Show Project Sidebar</summary>
+      <description>If enabled, the sidebar will be visible in the editor workspace.</description>
+    </key>
+    <key name="show-icons" type="b">
+      <default>false</default>
+      <summary>Show Icons</summary>
+      <description>If enabled, the sidebar will display icons next to each item.</description>
+    </key>
+    <key name="width" type="i">
+      <range min="1" max="1000"/>
+      <default>250</default>
+      <summary>Project Tree Width</summary>
+      <description>The width in pixels of the project tree.</description>
+    </key>
+  </schema>
+</schemalist>
diff --git a/src/editor/gb-editor-workspace-actions.c b/src/editor/gb-editor-workspace-actions.c
index 95a3dc7..6cf801e 100644
--- a/src/editor/gb-editor-workspace-actions.c
+++ b/src/editor/gb-editor-workspace-actions.c
@@ -24,7 +24,6 @@
 #include "gb-workbench.h"
 
 #define ANIMATION_DURATION_MSEC 250
-#define MIN_PANED_SAVE_POSTION  100
 
 static void
 gb_editor_workspace_actions_show_sidebar (GSimpleAction *action,
@@ -40,12 +39,7 @@ gb_editor_workspace_actions_show_sidebar (GSimpleAction *action,
 
   if (!g_variant_get_boolean (variant) && visible)
     {
-      guint position;
-
-      position = gtk_paned_get_position (self->project_paned);
-      if (position > MIN_PANED_SAVE_POSTION)
-        self->sidebar_position = position;
-
+      gb_project_tree_save_desired_width (self->project_tree);
       ide_object_animate_full (self->project_paned,
                                IDE_ANIMATION_EASE_IN_CUBIC,
                                ANIMATION_DURATION_MSEC,
@@ -55,18 +49,23 @@ gb_editor_workspace_actions_show_sidebar (GSimpleAction *action,
                                "position", 0,
                                NULL);
       g_simple_action_set_state (action, variant);
+      g_settings_set_boolean (self->project_tree_settings, "show", FALSE);
     }
   else if (g_variant_get_boolean (variant) && !visible)
     {
+      guint position;
+
+      position = gb_project_tree_get_desired_width (self->project_tree);
       gtk_paned_set_position (self->project_paned, 0);
       gtk_widget_show (GTK_WIDGET (self->project_sidebar));
       ide_object_animate (self->project_paned,
                           IDE_ANIMATION_EASE_IN_CUBIC,
                           ANIMATION_DURATION_MSEC,
                           NULL,
-                          "position", self->sidebar_position,
+                          "position", position,
                           NULL);
       g_simple_action_set_state (action, variant);
+      g_settings_set_boolean (self->project_tree_settings, "show", TRUE);
     }
 }
 
@@ -89,17 +88,6 @@ gb_editor_workspace_actions_toggle_sidebar (GSimpleAction *action,
   g_variant_unref (state);
 }
 
-static void
-gb_editor_workspace_actions__show_sidebar_notify_state (GbEditorWorkspace *self,
-                                                        GParamSpec        *pspec,
-                                                        GAction           *action)
-{
-  g_autoptr(GVariant) state = NULL;
-
-  state = g_action_get_state (action);
-  g_settings_set_boolean (self->editor_settings, "show-sidebar", g_variant_get_boolean (state));
-}
-
 static const GActionEntry GbEditorWorkspaceActions[] = {
   { "show-sidebar", NULL, NULL, "false", gb_editor_workspace_actions_show_sidebar },
   { "toggle-sidebar", gb_editor_workspace_actions_toggle_sidebar },
@@ -119,16 +107,13 @@ gb_editor_workspace_actions_init (GbEditorWorkspace *self)
   action = g_action_map_lookup_action (G_ACTION_MAP (group), "show-sidebar");
   g_assert (G_IS_SIMPLE_ACTION (action));
 
-  if (g_settings_get_boolean (self->editor_settings, "show-sidebar"))
+  if (g_settings_get_boolean (self->project_tree_settings, "show"))
     {
+      guint position;
+
       g_simple_action_set_state (G_SIMPLE_ACTION (action), g_variant_new_boolean (TRUE));
-      gtk_paned_set_position (self->project_paned, self->sidebar_position);
+      position = g_settings_get_int (self->project_tree_settings, "width");
+      gtk_paned_set_position (self->project_paned, position);
       gtk_widget_show (GTK_WIDGET (self->project_sidebar));
     }
-
-  g_signal_connect_object (action,
-                           "notify::state",
-                           G_CALLBACK (gb_editor_workspace_actions__show_sidebar_notify_state),
-                           self,
-                           G_CONNECT_SWAPPED);
 }
diff --git a/src/editor/gb-editor-workspace-private.h b/src/editor/gb-editor-workspace-private.h
index f4950aa..8abee09 100644
--- a/src/editor/gb-editor-workspace-private.h
+++ b/src/editor/gb-editor-workspace-private.h
@@ -29,7 +29,7 @@ struct _GbEditorWorkspace
 {
   GbWorkspace    parent_instance;
 
-  GSettings     *editor_settings;
+  GSettings     *project_tree_settings;
 
   GtkPaned      *project_paned;
   GtkBox        *project_sidebar;
@@ -37,8 +37,6 @@ struct _GbEditorWorkspace
   GtkSpinner    *project_spinner;
   GbProjectTree *project_tree;
   GbViewGrid    *view_grid;
-
-  guint          sidebar_position;
 };
 
 G_END_DECLS
diff --git a/src/editor/gb-editor-workspace.c b/src/editor/gb-editor-workspace.c
index 17816d3..04b18fb 100644
--- a/src/editor/gb-editor-workspace.c
+++ b/src/editor/gb-editor-workspace.c
@@ -35,6 +35,26 @@
 
 G_DEFINE_TYPE (GbEditorWorkspace, gb_editor_workspace, GB_TYPE_WORKSPACE)
 
+enum {
+  PROP_0,
+  PROP_SHOW_PROJECT_TREE,
+  LAST_PROP
+};
+
+static GParamSpec *gParamSpecs [LAST_PROP];
+
+gboolean
+gb_editor_workspace_get_show_project_tree (GbEditorWorkspace *self)
+{
+  return FALSE;
+}
+
+static void
+gb_editor_workspace_set_show_project_tree (GbEditorWorkspace *self,
+                                           gboolean           show_project_tree)
+{
+}
+
 static void
 gb_editor_workspace__load_buffer_cb (GbEditorWorkspace *self,
                                      IdeBuffer         *buffer,
@@ -147,9 +167,6 @@ gb_editor_workspace_constructed (GObject *object)
 
   G_OBJECT_CLASS (gb_editor_workspace_parent_class)->constructed (object);
 
-  self->editor_settings = g_settings_new ("org.gnome.builder.editor");
-  self->sidebar_position = gtk_paned_get_position (self->project_paned) ?: SIDEBAR_POSITION;
-
   gb_editor_workspace_actions_init (self);
 
   IDE_EXIT;
@@ -158,15 +175,56 @@ gb_editor_workspace_constructed (GObject *object)
 static void
 gb_editor_workspace_finalize (GObject *object)
 {
-  GbEditorWorkspace *self = (GbEditorWorkspace *)object;
-
   IDE_ENTRY;
+  G_OBJECT_CLASS (gb_editor_workspace_parent_class)->finalize (object);
+  IDE_EXIT;
+}
 
-  g_clear_object (&self->editor_settings);
+static void
+gb_editor_workspace_get_property (GObject    *object,
+                                  guint       prop_id,
+                                  GValue     *value,
+                                  GParamSpec *pspec)
+{
+  GbEditorWorkspace *self = GB_EDITOR_WORKSPACE(object);
 
-  G_OBJECT_CLASS (gb_editor_workspace_parent_class)->finalize (object);
+  switch (prop_id)
+    {
+    case PROP_SHOW_PROJECT_TREE:
+      g_value_set_boolean (value, gb_editor_workspace_get_show_project_tree (self));
+      break;
 
-  IDE_EXIT;
+    default:
+      G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
+    }
+}
+
+/**
+ * gb_editor_workspace_set_property:
+ * @object: (in): A #GObject.
+ * @prop_id: (in): The property identifier.
+ * @value: (in): The given property.
+ * @pspec: (in): A #ParamSpec.
+ *
+ * Set a given #GObject property.
+ */
+static void
+gb_editor_workspace_set_property (GObject      *object,
+                                  guint         prop_id,
+                                  const GValue *value,
+                                  GParamSpec   *pspec)
+{
+  GbEditorWorkspace *self = GB_EDITOR_WORKSPACE(object);
+
+  switch (prop_id)
+    {
+    case PROP_SHOW_PROJECT_TREE:
+      gb_editor_workspace_set_show_project_tree (self, g_value_get_boolean (value));
+      break;
+
+    default:
+      G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
+    }
 }
 
 static void
@@ -177,9 +235,20 @@ gb_editor_workspace_class_init (GbEditorWorkspaceClass *klass)
 
   object_class->constructed = gb_editor_workspace_constructed;
   object_class->finalize = gb_editor_workspace_finalize;
+  object_class->get_property = gb_editor_workspace_get_property;
+  object_class->set_property = gb_editor_workspace_set_property;
 
   widget_class->grab_focus = gb_editor_workspace_grab_focus;
 
+  gParamSpecs [PROP_SHOW_PROJECT_TREE] =
+    g_param_spec_boolean ("show-project-tree",
+                          _("Show Project Tree"),
+                          _("Show Project Tree"),
+                          FALSE,
+                          (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+  g_object_class_install_property (object_class, PROP_SHOW_PROJECT_TREE,
+                                   gParamSpecs [PROP_SHOW_PROJECT_TREE]);
+
   GB_WIDGET_CLASS_TEMPLATE (klass, "gb-editor-workspace.ui");
 
   GB_WIDGET_CLASS_BIND (klass, GbEditorWorkspace, project_button);
@@ -198,6 +267,8 @@ gb_editor_workspace_init (GbEditorWorkspace *self)
 {
   gtk_widget_init_template (GTK_WIDGET (self));
 
+  self->project_tree_settings = g_settings_new ("org.gnome.builder.project-tree");
+
   gb_widget_set_context_handler (self, gb_editor_workspace_context_changed);
 }
 
diff --git a/src/project-tree/gb-project-tree.c b/src/project-tree/gb-project-tree.c
index e72402a..9584225 100644
--- a/src/project-tree/gb-project-tree.c
+++ b/src/project-tree/gb-project-tree.c
@@ -23,6 +23,9 @@
 #include "gb-project-tree-builder.h"
 #include "gb-project-tree-private.h"
 
+#define WIDTH_MIN 1
+#define WIDTH_MAX 1000
+
 G_DEFINE_TYPE (GbProjectTree, gb_project_tree, GB_TYPE_TREE)
 
 GtkWidget *
@@ -31,6 +34,23 @@ gb_project_tree_new (void)
   return g_object_new (GB_TYPE_PROJECT_TREE, NULL);
 }
 
+guint
+gb_project_tree_get_desired_width (GbProjectTree *self)
+{
+  return g_settings_get_int (self->settings, "width");
+}
+
+void
+gb_project_tree_save_desired_width (GbProjectTree *self)
+{
+  GtkAllocation alloc;
+  guint width;
+
+  gtk_widget_get_allocation (GTK_WIDGET (self), &alloc);
+  width = CLAMP (alloc.width, WIDTH_MIN, WIDTH_MAX);
+  g_settings_set_int (self->settings, "width", width);
+}
+
 IdeContext *
 gb_project_tree_get_context (GbProjectTree *self)
 {
@@ -66,6 +86,7 @@ gb_project_tree_set_context (GbProjectTree *self,
   gb_tree_rebuild (GB_TREE (self));
 }
 
+
 static void
 gb_project_tree_notify_selection (GbProjectTree *self)
 {
@@ -99,7 +120,9 @@ gb_project_tree_init (GbProjectTree *self)
 
   gb_tree_set_root (GB_TREE (self), gb_tree_node_new ());
 
-  //self->settings = g_settings_new ("org.gnome.builder.project-tree");
+  self->settings = g_settings_new ("org.gnome.builder.project-tree");
+  g_settings_bind (self->settings, "show-icons", self, "show-icons",
+                   G_SETTINGS_BIND_DEFAULT);
 
   builder = gb_project_tree_builder_new ();
   gb_tree_add_builder (GB_TREE (self), builder);
diff --git a/src/project-tree/gb-project-tree.h b/src/project-tree/gb-project-tree.h
index 872d7f8..d91d703 100644
--- a/src/project-tree/gb-project-tree.h
+++ b/src/project-tree/gb-project-tree.h
@@ -29,10 +29,12 @@ G_BEGIN_DECLS
 
 G_DECLARE_FINAL_TYPE (GbProjectTree, gb_project_tree, GB, PROJECT_TREE, GbTree)
 
-GtkWidget  *gb_project_tree_new         (void);
-void        gb_project_tree_set_context (GbProjectTree *self,
-                                         IdeContext    *context);
-IdeContext *gb_project_tree_get_context (GbProjectTree *self);
+GtkWidget  *gb_project_tree_new                (void);
+void        gb_project_tree_set_context        (GbProjectTree *self,
+                                                IdeContext    *context);
+IdeContext *gb_project_tree_get_context        (GbProjectTree *self);
+guint       gb_project_tree_get_desired_width  (GbProjectTree *self);
+void        gb_project_tree_save_desired_width (GbProjectTree *self);
 
 G_END_DECLS
 


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