[gnome-builder] project-tree: stash tree paned position after timeout



commit c6fa24741790d293cbbcb8576d37851e7cf27236
Author: Christian Hergert <christian hergert me>
Date:   Sat Apr 25 00:36:25 2015 -0700

    project-tree: stash tree paned position after timeout
    
    We were only updating the value when we would save/hide the project tree.
    This does it after a second delay when the paned is moved. That should
    still handle the animation case, where this will be spuriously updated.
    
    Clearly, this is the type of stuff that belongs in a layout manager
    abstraction.

 src/editor/gb-editor-workspace-private.h |    2 +
 src/editor/gb-editor-workspace.c         |   47 ++++++++++++++++++++++++------
 2 files changed, 40 insertions(+), 9 deletions(-)
---
diff --git a/src/editor/gb-editor-workspace-private.h b/src/editor/gb-editor-workspace-private.h
index 34fbb87..5f4e2b5 100644
--- a/src/editor/gb-editor-workspace-private.h
+++ b/src/editor/gb-editor-workspace-private.h
@@ -39,6 +39,8 @@ struct _GbEditorWorkspace
   GtkSpinner    *project_spinner;
   GbProjectTree *project_tree;
   GbViewGrid    *view_grid;
+
+  guint          project_tree_position_timeout;
 };
 
 G_END_DECLS
diff --git a/src/editor/gb-editor-workspace.c b/src/editor/gb-editor-workspace.c
index cf3482c..8b59b1a 100644
--- a/src/editor/gb-editor-workspace.c
+++ b/src/editor/gb-editor-workspace.c
@@ -215,6 +215,30 @@ gb_editor_workspace_hierarchy_changed (GtkWidget *widget,
     }
 }
 
+static gboolean
+save_project_tree_position_timeout (gpointer data)
+{
+  GbEditorWorkspace *self = data;
+
+  g_assert (GB_IS_EDITOR_WORKSPACE (self));
+
+  gb_project_tree_save_desired_width (self->project_tree);
+
+  return G_SOURCE_REMOVE;
+}
+
+static void
+gb_editor_workspace__project_paned_notify_position (GbEditorWorkspace *self,
+                                                    GParamSpec        *pspec,
+                                                    GtkPaned          *paned)
+{
+  g_assert (GB_IS_EDITOR_WORKSPACE (self));
+
+  if (self->project_tree_position_timeout != 0)
+    g_source_remove (self->project_tree_position_timeout);
+  g_timeout_add_seconds (1, save_project_tree_position_timeout, self);
+}
+
 static void
 gb_editor_workspace_constructed (GObject *object)
 {
@@ -232,8 +256,16 @@ gb_editor_workspace_constructed (GObject *object)
 static void
 gb_editor_workspace_finalize (GObject *object)
 {
+  GbEditorWorkspace *self = (GbEditorWorkspace *)object;
+
   IDE_ENTRY;
 
+  if (self->project_tree_position_timeout)
+    {
+      g_source_remove (self->project_tree_position_timeout);
+      self->project_tree_position_timeout = 0;
+    }
+
   G_OBJECT_CLASS (gb_editor_workspace_parent_class)->finalize (object);
 
   IDE_EXIT;
@@ -258,15 +290,6 @@ gb_editor_workspace_get_property (GObject    *object,
     }
 }
 
-/**
- * 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,
@@ -331,6 +354,12 @@ gb_editor_workspace_init (GbEditorWorkspace *self)
 
   self->project_tree_settings = g_settings_new ("org.gnome.builder.project-tree");
 
+  g_signal_connect_object (self->project_paned,
+                           "notify::position",
+                           G_CALLBACK (gb_editor_workspace__project_paned_notify_position),
+                           self,
+                           G_CONNECT_SWAPPED);
+
   gb_widget_set_context_handler (self, gb_editor_workspace_context_changed);
 }
 


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