[gnome-commander/get_rid_of_xml] Store open file list tabs via GSettings instead of GKeyFile



commit e69c2a014bbc8548405c6d51d7946a8f704017cb
Author: Uwe Scholz <u scholz83 gmx de>
Date:   Sun Nov 11 22:18:11 2018 +0100

    Store open file list tabs via GSettings instead of GKeyFile

 data/org.gnome.gnome-commander.gschema.xml |   7 ++
 src/gnome-cmd-data.cc                      | 164 ++++++++++++++---------------
 src/gnome-cmd-data.h                       |   3 +
 3 files changed, 91 insertions(+), 83 deletions(-)
---
diff --git a/data/org.gnome.gnome-commander.gschema.xml b/data/org.gnome.gnome-commander.gschema.xml
index 0170fb28..b5d84b14 100644
--- a/data/org.gnome.gnome-commander.gschema.xml
+++ b/data/org.gnome.gnome-commander.gschema.xml
@@ -444,6 +444,13 @@
           This option defines the shortcut for quick search.
       </description>
     </key>
+    <key name="file-list-tabs" type="a(syybb)">
+      <default>[]</default>
+      <summary>List of file tabs</summary>
+      <description>
+          The tab entries in this list are used for restoring the tabs from the last session.
+      </description>
+    </key>
   </schema>
   <schema gettext-domain="gnome-commander" id="org.gnome.gnome-commander.preferences.network" 
path="/org/gnome/gnome-commander/preferences/network/">
     <key name="quick-connect-uri" type="s">
diff --git a/src/gnome-cmd-data.cc b/src/gnome-cmd-data.cc
index f6325568..939246e8 100644
--- a/src/gnome-cmd-data.cc
+++ b/src/gnome-cmd-data.cc
@@ -1748,105 +1748,69 @@ void GnomeCmdData::save_advrename_profiles (const gchar *fname)
 
 
 /**
- * Save tabs of a FileSelectorID in a given GKeyFile
+ * Save tabs in given gSettings and in given key
  */
-static void save_tabs(GKeyFile* keyFile, enum FileSelectorID fileSelectorId)
+static void save_tabs_via_gsettings(GSettings *gSettings, const char *gSettingsKey)
 {
-    static gint counter = 1;
-    string fileSelectorIdString;
+    GVariant* fileListTabs;
+    GVariantBuilder gVariantBuilder;
+    g_variant_builder_init (&gVariantBuilder, G_VARIANT_TYPE_ARRAY);
 
-    switch (fileSelectorId)
+    for (int fileSelectorIdInt = LEFT; fileSelectorIdInt <= RIGHT; fileSelectorIdInt++)
     {
-        case LEFT:
-        {
-            fileSelectorIdString = "left";
-            break;
-        }
-        case RIGHT:
-        {
-            fileSelectorIdString = "right";
-            break;
-        }
-        case ACTIVE:
-        {
-            fileSelectorIdString = "active";
-            break;
-        }
-        case INACTIVE:
-        {
-            fileSelectorIdString = "inactive";
-            break;
-        }
-    }
-
-    GnomeCmdFileSelector gnomeCmdFileSelector = *main_win->fs(fileSelectorId);
-    GList *tabs = gnomeCmdFileSelector.GetTabs();
+        FileSelectorID fileSelectorId = static_cast<FileSelectorID>(fileSelectorIdInt);
+        GnomeCmdFileSelector gnomeCmdFileSelector = *main_win->fs(fileSelectorId);
+        GList *tabs = gnomeCmdFileSelector.GetTabs();
 
-    for (GList *i=tabs; i; i=i->next)
-    {
-        string alias = to_string(counter);
-        if (gnome_cmd_data.options.save_tabs_on_exit)
+        for (GList *i=tabs; i; i=i->next)
         {
-                GnomeCmdFileList *fl = (GnomeCmdFileList *) gtk_bin_get_child (GTK_BIN (i->data));
-                if (GNOME_CMD_FILE_LIST (fl) && gnome_cmd_con_is_local (fl->con))
-                {
-                    g_key_file_set_string(keyFile, alias.c_str(), TAB_PATH, GNOME_CMD_FILE 
(fl->cwd)->get_real_path());
-                    g_key_file_set_string(keyFile, alias.c_str(), TAB_FILESLECTORID, 
fileSelectorIdString.c_str());
-                    g_key_file_set_boolean(keyFile, alias.c_str(), TAB_SORT, fl->get_sort_column());
-                    g_key_file_set_boolean(keyFile, alias.c_str(), TAB_ASC, fl->get_sort_order());
-                    g_key_file_set_boolean(keyFile, alias.c_str(), TAB_LOCK, fl->locked);
-                }
-        }
-        else
-        {
-            if (gnome_cmd_data.options.save_dirs_on_exit)
+            if (gnome_cmd_data.options.save_tabs_on_exit)
             {
                 GnomeCmdFileList *fl = (GnomeCmdFileList *) gtk_bin_get_child (GTK_BIN (i->data));
-                if (GNOME_CMD_FILE_LIST (fl) && gnome_cmd_con_is_local (fl->con) && 
(fl==gnomeCmdFileSelector.file_list() || fl->locked))
+                if (GNOME_CMD_FILE_LIST (fl) && gnome_cmd_con_is_local (fl->con))
                 {
-                    g_key_file_set_string(keyFile, alias.c_str(), TAB_PATH, GNOME_CMD_FILE 
(fl->cwd)->get_real_path());
-                    g_key_file_set_string(keyFile, alias.c_str(), TAB_FILESLECTORID, 
fileSelectorIdString.c_str());
-                    g_key_file_set_boolean(keyFile, alias.c_str(), TAB_SORT, fl->get_sort_column());
-                    g_key_file_set_boolean(keyFile, alias.c_str(), TAB_ASC, fl->get_sort_order());
-                    g_key_file_set_boolean(keyFile, alias.c_str(), TAB_LOCK, fl->locked);
+                    g_variant_builder_add (&gVariantBuilder, "(syybb)",
+                                            GNOME_CMD_FILE (fl->cwd)->get_real_path(),
+                                            (guchar) fileSelectorId,
+                                            fl->get_sort_column(),
+                                            fl->get_sort_order(),
+                                            fl->locked);
                 }
             }
             else
             {
-                GnomeCmdFileList *fl = (GnomeCmdFileList *) gtk_bin_get_child (GTK_BIN (i->data));
-                if (GNOME_CMD_FILE_LIST (fl) && gnome_cmd_con_is_local (fl->con) && fl->locked)
+                if (gnome_cmd_data.options.save_dirs_on_exit)
                 {
-                    g_key_file_set_string(keyFile, alias.c_str(), TAB_PATH, GNOME_CMD_FILE 
(fl->cwd)->get_real_path());
-                    g_key_file_set_string(keyFile, alias.c_str(), TAB_FILESLECTORID, 
fileSelectorIdString.c_str());
-                    g_key_file_set_boolean(keyFile, alias.c_str(), TAB_SORT, fl->get_sort_column());
-                    g_key_file_set_boolean(keyFile, alias.c_str(), TAB_ASC, fl->get_sort_order());
-                    g_key_file_set_boolean(keyFile, alias.c_str(), TAB_LOCK, fl->locked);
+                    GnomeCmdFileList *fl = (GnomeCmdFileList *) gtk_bin_get_child (GTK_BIN (i->data));
+                    if (GNOME_CMD_FILE_LIST (fl) && gnome_cmd_con_is_local (fl->con) && 
(fl==gnomeCmdFileSelector.file_list() || fl->locked))
+                    {
+                        g_variant_builder_add (&gVariantBuilder, "(syybb)",
+                                                GNOME_CMD_FILE (fl->cwd)->get_real_path(),
+                                                (guchar) fileSelectorId,
+                                                fl->get_sort_column(),
+                                                fl->get_sort_order(),
+                                                fl->locked);
+                    }
+                }
+                else
+                {
+                    GnomeCmdFileList *fl = (GnomeCmdFileList *) gtk_bin_get_child (GTK_BIN (i->data));
+                    if (GNOME_CMD_FILE_LIST (fl) && gnome_cmd_con_is_local (fl->con) && fl->locked)
+                    {
+                        g_variant_builder_add (&gVariantBuilder, "(syybb)",
+                                                GNOME_CMD_FILE (fl->cwd)->get_real_path(),
+                                                (guchar) fileSelectorId,
+                                                fl->get_sort_column(),
+                                                fl->get_sort_order(),
+                                                fl->locked);
+                    }
                 }
             }
         }
-        counter++;
+        g_list_free (tabs);
     }
-    g_list_free (tabs);
-}
-
-
-/**
- * Save panes layout in the given file by means of GKeyFile.
- */
-static void save_pane_layout(const gchar *fname)
-{
-    gchar *path = config_dir ?
-        g_build_filename (config_dir, fname, NULL) :
-        g_build_filename (g_get_home_dir (), "." PACKAGE, fname, NULL);
-    GKeyFile *keyFile;
-    keyFile = g_key_file_new ();
-
-    save_tabs(keyFile, LEFT);
-    save_tabs(keyFile, RIGHT);
-
-    gcmd_key_file_save_to_file (path, keyFile);
-    g_key_file_free(keyFile);
-    g_free (path);
+    fileListTabs = g_variant_builder_end (&gVariantBuilder);
+    g_settings_set_value(gSettings, gSettingsKey, fileListTabs);
 }
 
 
@@ -2934,6 +2898,38 @@ gboolean GnomeCmdData::set_valid_color_string(GSettings *settings_given, const c
     return return_value;
 }
 
+
+/**
+ * Loads tabs from gSettings into gcmd options
+ */
+void GnomeCmdData::load_tabs_from_gsettings()
+{
+    GVariant *gvTabs, *tab;
+    GVariantIter iter;
+
+    gvTabs = g_settings_get_value(options.gcmd_settings->general, GCMD_SETTINGS_FILE_LIST_TABS);
+
+    g_variant_iter_init (&iter, gvTabs);
+
+       while ((tab = g_variant_iter_next_value (&iter)) != NULL)
+    {
+        gchar *path;
+        gboolean sort_order, locked;
+        guchar fileSelectorId, sort_column;
+
+               g_assert (g_variant_is_of_type (tab, G_VARIANT_TYPE 
(GCMD_SETTINGS_FILE_LIST_TAB_FORMAT_STRING)));
+               g_variant_get(tab, GCMD_SETTINGS_FILE_LIST_TAB_FORMAT_STRING, &path, &fileSelectorId, 
&sort_column, &sort_order, &locked);
+        string directory_path(path);
+        if (!directory_path.empty() && sort_column < GnomeCmdFileList::NUM_COLUMNS)
+        {
+            this->tabs[(FileSelectorID) fileSelectorId].push_back(make_pair(directory_path, 
make_triple((GnomeCmdFileList::ColumnID) sort_column, (GtkSortType) sort_order, locked)));
+        }
+               g_variant_unref(tab);
+        g_free(path);
+    }
+    g_variant_unref(gvTabs);
+}
+
 void GnomeCmdData::load()
 {
     gchar *colorstring;
@@ -3316,6 +3312,8 @@ void GnomeCmdData::load()
 
     advrename_defaults.templates.ents = get_list_from_gsettings_string_array 
(options.gcmd_settings->general, GCMD_SETTINGS_ADVRENAME_TOOL_TEMPLATE_HISTORY);
 
+    load_tabs_from_gsettings();
+
     static struct
     {
         guint code;
@@ -3541,7 +3539,6 @@ void GnomeCmdData::load()
 
         // Convert xml to keyfiles by using the save methods.
         save_advrename_profiles(ADVRENAME_CONFIG_FILENAME);
-        save_pane_layout(TABS_LAYOUT_FILENAME);
 
         // Move gnome-commander.xml to gnome-commander.xml.deprecated
         gchar *xml_cfg_path_old = config_dir ? g_build_filename (config_dir, PACKAGE ".xml", NULL) : 
g_build_filename (g_get_home_dir (), "." PACKAGE, PACKAGE ".xml", NULL);
@@ -3920,11 +3917,12 @@ void GnomeCmdData::save()
     set_gsettings_when_changed      (options.gcmd_settings->general, GCMD_SETTINGS_ADVRENAME_TOOL_HEIGHT, 
&(advrename_defaults.height));
     set_gsettings_string_array_from_glist(options.gcmd_settings->general, 
GCMD_SETTINGS_ADVRENAME_TOOL_TEMPLATE_HISTORY, advrename_defaults.templates.ents);
 
+    save_tabs_via_gsettings         (options.gcmd_settings->general, GCMD_SETTINGS_FILE_LIST_TABS);
+
     save_cmdline_history();
     save_devices (DEVICES_FILENAME);
     save_fav_apps (FAV_APPS_FILENAME);
     save_advrename_profiles(ADVRENAME_CONFIG_FILENAME);
-    save_pane_layout(TABS_LAYOUT_FILENAME);
     save_intviewer_defaults();
 
     save_auto_load_plugins();
diff --git a/src/gnome-cmd-data.h b/src/gnome-cmd-data.h
index 0f488bfb..bbecd94d 100644
--- a/src/gnome-cmd-data.h
+++ b/src/gnome-cmd-data.h
@@ -116,6 +116,8 @@ GcmdSettings *gcmd_settings_new (void);
 #define GCMD_SETTINGS_ADVRENAME_TOOL_WIDTH            "advrename-win-width"
 #define GCMD_SETTINGS_ADVRENAME_TOOL_HEIGHT           "advrename-win-height"
 #define GCMD_SETTINGS_ADVRENAME_TOOL_TEMPLATE_HISTORY "advrename-template-history"
+#define GCMD_SETTINGS_FILE_LIST_TABS                  "file-list-tabs"
+#define GCMD_SETTINGS_FILE_LIST_TAB_FORMAT_STRING     "(syybb)"
 
 #define GCMD_PREF_FILTER                              "org.gnome.gnome-commander.preferences.filter"
 #define GCMD_SETTINGS_FILTER_HIDE_UNKNOWN             "hide-unknown"
@@ -682,6 +684,7 @@ struct GnomeCmdData
     void free();                // FIXME: free() -> ~GnomeCmdData()
 
     void load();
+    void load_tabs_from_gsettings();
     void gsettings_init();
     void migrate_all_data_to_gsettings();
     gint migrate_data_int_value_into_gsettings(gint user_value, GSettings *settings, const char *key);


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