OSDN Git Service

LinGui: save preset folder collapsed/expanded state. restore at startup.
authorjstebbins <jstebbins@b64f7644-9d1e-0410-96f1-a4d463321fa5>
Thu, 26 Mar 2009 00:34:38 +0000 (00:34 +0000)
committerjstebbins <jstebbins@b64f7644-9d1e-0410-96f1-a4d463321fa5>
Thu, 26 Mar 2009 00:34:38 +0000 (00:34 +0000)
git-svn-id: svn://localhost/HandBrake/trunk@2275 b64f7644-9d1e-0410-96f1-a4d463321fa5

gtk/src/main.c
gtk/src/presets.c

index bc19b6b..7a0e66f 100644 (file)
@@ -368,6 +368,7 @@ bind_audio_tree_model (signal_user_data_t *ud)
 extern void presets_list_selection_changed_cb(void);
 extern void presets_drag_cb(void);
 extern void presets_drag_motion_cb(void);
+extern void presets_row_expanded_cb(void);
 
 // Create and bind the tree model to the tree view for the preset list
 // Also, connect up the signal that lets us know the selection has changed
@@ -405,6 +406,8 @@ bind_presets_tree_model (signal_user_data_t *ud)
 
        g_signal_connect(treeview, "drag_data_received", presets_drag_cb, ud);
        g_signal_connect(treeview, "drag_motion", presets_drag_motion_cb, ud);
+       g_signal_connect(treeview, "row_expanded", presets_row_expanded_cb, ud);
+       g_signal_connect(treeview, "row_collapsed", presets_row_expanded_cb, ud);
        g_signal_connect(selection, "changed", presets_list_selection_changed_cb, ud);
        widget = GHB_WIDGET (ud->builder, "presets_remove");
        gtk_widget_set_sensitive(widget, FALSE);
index 203a911..cbe5393 100644 (file)
@@ -254,6 +254,17 @@ preset_get_name(GValue *dict)
        return g_value_get_string(preset_dict_get_value(dict, "PresetName"));
 }
 
+static gboolean
+preset_folder_is_open(GValue *dict)
+{
+       const GValue *gval;
+
+       gval = preset_dict_get_value(dict, "FolderOpen");
+       if (gval != NULL)
+               return g_value_get_boolean(gval);
+       return FALSE;
+}
+
 gboolean
 ghb_preset_folder(GValue *dict)
 {
@@ -645,6 +656,20 @@ presets_set_default(gint *indices, gint len)
        store_presets();
 }
 
+static void
+presets_set_folder_open(gboolean open, gint *indices, gint len)
+{
+       GValue *dict;
+       
+       g_debug("presets_set_folder_open ()");
+       dict = presets_get_dict(presetsPlist, indices, len);
+       if (dict)
+       {
+               ghb_dict_insert(dict, g_strdup("FolderOpen"), 
+                                               ghb_boolean_value_new(open));
+       }
+}
+
 // Used for sorting dictionaries.
 gint
 key_cmp(gconstpointer a, gconstpointer b)
@@ -1424,6 +1449,20 @@ ghb_presets_list_init(
                if (folder)
                {
                        ghb_presets_list_init(ud, more_indices, len+1);
+                       if (preset_folder_is_open(dict))
+                       {
+                               GtkTreePath *path;
+
+                               if (piter != NULL)
+                               {
+                                       path = gtk_tree_model_get_path(GTK_TREE_MODEL(store), piter);
+                                       gtk_tree_view_expand_row(treeview, path, FALSE);
+                                       gtk_tree_path_free(path);
+                               }
+                               path = gtk_tree_model_get_path(GTK_TREE_MODEL(store), &iter);
+                               gtk_tree_view_expand_row(treeview, path, FALSE);
+                               gtk_tree_path_free(path);
+                       }
                }
        }
        g_free(more_indices);
@@ -3130,6 +3169,52 @@ presets_drag_cb(
        }
 }
 
+void
+presets_row_expanded_cb(
+       GtkTreeView *treeview, 
+       GtkTreeIter *iter, 
+       GtkTreePath *path, 
+       signal_user_data_t *ud)
+{
+       gint *indices, len;
+       gboolean expanded, folder;
+
+       expanded = gtk_tree_view_row_expanded(treeview, path);
+       indices = gtk_tree_path_get_indices(path);
+       len = gtk_tree_path_get_depth(path);
+       folder = ghb_presets_get_folder(presetsPlist, indices, len);
+       if (folder)
+       {
+               presets_set_folder_open(expanded, indices, len);
+       }
+
+       // Collapsing parent folder collapses all children
+       if (!expanded)
+       {
+               GValue *presets = NULL;
+               GValue *dict;
+               gint *more_indices, count, ii;
+
+               more_indices = g_malloc((len+1)*sizeof(gint));
+               memcpy(more_indices, indices, len*sizeof(gint));
+
+               presets = presets_get_folder(presetsPlist, indices, len);
+               count = ghb_array_len(presets);
+               for (ii = 0; ii < count; ii++)
+               {
+                       dict = ghb_array_get_nth(presets, ii);
+                       folder = ghb_preset_folder(dict);
+                       if (folder)
+                       {
+                               more_indices[len] = ii;
+                               presets_set_folder_open(expanded, more_indices, len+1);
+                       }
+               }
+               g_free(more_indices);
+       }
+       store_presets();
+}
+
 static void
 preset_update_title_deps(signal_user_data_t *ud, ghb_title_info_t *tinfo)
 {