Additional keyword menu entries
authorColin Clark <colin.clark@cclark.uk>
Mon, 5 Jun 2017 15:55:14 +0000 (16:55 +0100)
committerColin Clark <colin.clark@cclark.uk>
Mon, 5 Jun 2017 15:55:14 +0000 (16:55 +0100)
1. Revert all hidden
2. Collapse all
3. Revert (see Help file)

doc/docbook/GuideSidebarsInfo.xml
src/bar_keywords.c
src/metadata.c
src/metadata.h

index 9be78ae..0853b98 100644 (file)
       <link linkend="GuideOptionsMetadata" endterm="titleGuideOptionsMetadata" />\r
       .\r
     </para>\r
+    <para>\r
+      If the right-click menu item\r
+      <guimenu>Revert</guimenu>\r
+      is executed at any time after a\r
+      <guimenu>Show all</guimenu>\r
+      or\r
+      <guimenu>Collapse all</guimenu>\r
+      , the keyword layout will be restored to the state prior to the\r
+      <guimenu>Show all</guimenu>\r
+      or\r
+      <guimenu>Collapse all</guimenu>\r
+      .\r
+      <para />\r
+      If the right-click menu item\r
+      <guimenu>Revert</guimenu>\r
+      is executed at any time before a\r
+      <guimenu>Show all</guimenu>\r
+      or\r
+      <guimenu>Collapse all</guimenu>\r
+      , the keyword layout will be restored to the state existing at start-up.\r
+    </para>\r
+    <note>\r
+      <para>\r
+        The selections in the sub-menu\r
+        <guimenu>On any change</guimenu>\r
+        will affect the operation of the\r
+        <guimenu>Revert</guimenu>\r
+        option.\r
+      </para>\r
+    </note>\r
     <para />\r
   </section>\r
   <section id="Listpanes-ExifFileinfoCopyrightLocationandGPS">\r
index febed42..0f3f436 100644 (file)
@@ -123,6 +123,8 @@ struct _PaneKeywordsData
        FileData *fd;
        gchar *key;
        gint height;
+
+       GList *expanded_rows;
 };
 
 typedef struct _ConfDialogData ConfDialogData;
@@ -1062,6 +1064,11 @@ static void bar_pane_keywords_show_all_cb(GtkWidget *menu_widget, gpointer data)
 
        GtkTreeModel *keyword_tree;
 
+       string_list_free(pkd->expanded_rows);
+       pkd->expanded_rows = NULL;
+       gtk_tree_view_map_expanded_rows(GTK_TREE_VIEW(pkd->keyword_treeview),
+                                                               (bar_keyword_tree_get_expanded_cb), &pkd->expanded_rows);
+
        pkd->hide_unchecked = FALSE;
 
        model = gtk_tree_view_get_model(GTK_TREE_VIEW(pkd->keyword_treeview));
@@ -1073,6 +1080,28 @@ static void bar_pane_keywords_show_all_cb(GtkWidget *menu_widget, gpointer data)
        bar_keyword_tree_sync(pkd);
 }
 
+static void bar_pane_keywords_revert_cb(GtkWidget *menu_widget, gpointer data)
+{
+       PaneKeywordsData *pkd = data;
+       GList *work;
+       GtkTreePath *tree_path;
+       gchar *path;
+
+       gtk_tree_view_collapse_all(GTK_TREE_VIEW(pkd->keyword_treeview));
+
+       work = pkd->expanded_rows;
+       while (work)
+               {
+               path = work->data;
+               tree_path = gtk_tree_path_new_from_string(path);
+               gtk_tree_view_expand_to_path(GTK_TREE_VIEW(pkd->keyword_treeview), tree_path);
+               work = work->next;
+               gtk_tree_path_free(tree_path);
+               }
+
+       bar_keyword_tree_sync(pkd);
+}
+
 static void bar_pane_keywords_expand_checked_cb(GtkWidget *menu_widget, gpointer data)
 {
        PaneKeywordsData *pkd = data;
@@ -1082,6 +1111,34 @@ static void bar_pane_keywords_expand_checked_cb(GtkWidget *menu_widget, gpointer
        gtk_tree_model_foreach(model, bar_keyword_tree_expand_if_set_cb, pkd);
 }
 
+static void bar_pane_keywords_collapse_all_cb(GtkWidget *menu_widget, gpointer data)
+{
+       PaneKeywordsData *pkd = data;
+
+       string_list_free(pkd->expanded_rows);
+       pkd->expanded_rows = NULL;
+       gtk_tree_view_map_expanded_rows(GTK_TREE_VIEW(pkd->keyword_treeview),
+                                                               (bar_keyword_tree_get_expanded_cb), &pkd->expanded_rows);
+
+       gtk_tree_view_collapse_all(GTK_TREE_VIEW(pkd->keyword_treeview));
+
+       bar_keyword_tree_sync(pkd);
+}
+
+static void bar_pane_keywords_revert_hidden_cb(GtkWidget *menu_widget, gpointer data)
+{
+       PaneKeywordsData *pkd = data;
+       GtkTreeModel *model;
+       GtkTreeModel *keyword_tree;
+
+       model = gtk_tree_view_get_model(GTK_TREE_VIEW(pkd->keyword_treeview));
+       keyword_tree = gtk_tree_model_filter_get_model(GTK_TREE_MODEL_FILTER(model));
+
+       keyword_revert_hidden_in(GTK_TREE_STORE(keyword_tree), model);
+
+       bar_keyword_tree_sync(pkd);
+}
+
 static void bar_pane_keywords_collapse_unchecked_cb(GtkWidget *menu_widget, gpointer data)
 {
        PaneKeywordsData *pkd = data;
@@ -1266,7 +1323,12 @@ static void bar_pane_keywords_menu_popup(GtkWidget *widget, PaneKeywordsData *pk
        menu_item_add(menu, _("Expand checked"), G_CALLBACK(bar_pane_keywords_expand_checked_cb), pkd);
        menu_item_add(menu, _("Collapse unchecked"), G_CALLBACK(bar_pane_keywords_collapse_unchecked_cb), pkd);
        menu_item_add(menu, _("Hide unchecked"), G_CALLBACK(bar_pane_keywords_hide_unchecked_cb), pkd);
+       menu_item_add(menu, _("Revert all hidden"), G_CALLBACK(bar_pane_keywords_revert_hidden_cb), pkd);
+       menu_item_add_divider(menu);
        menu_item_add(menu, _("Show all"), G_CALLBACK(bar_pane_keywords_show_all_cb), pkd);
+       menu_item_add(menu, _("Collapse all"), G_CALLBACK(bar_pane_keywords_collapse_all_cb), pkd);
+       menu_item_add(menu, _("Revert"), G_CALLBACK(bar_pane_keywords_revert_cb), pkd);
+       menu_item_add_divider(menu);
 
        submenu = gtk_menu_new();
        item = menu_item_add(menu, _("On any change"), NULL, NULL);
@@ -1312,7 +1374,8 @@ static void bar_pane_keywords_destroy(GtkWidget *widget, gpointer data)
 {
        PaneKeywordsData *pkd = data;
 
-        if (pkd->click_tpath) gtk_tree_path_free(pkd->click_tpath);
+       string_list_free(pkd->expanded_rows);
+       if (pkd->click_tpath) gtk_tree_path_free(pkd->click_tpath);
        if (pkd->idle_id) g_source_remove(pkd->idle_id);
        file_data_unregister_notify_func(bar_pane_keywords_notify_cb, pkd);
 
@@ -1349,6 +1412,7 @@ static GtkWidget *bar_pane_keywords_new(const gchar *id, const gchar *title, con
        pkd->key = g_strdup(key);
 
        pkd->expand_checked = TRUE;
+       pkd->expanded_rows = NULL;
 
        hbox = gtk_hbox_new(FALSE, PREF_PAD_GAP);
 
@@ -1559,6 +1623,8 @@ void bar_pane_keywords_entry_add_from_config(GtkWidget *pane, const gchar **attr
                        {
                        tree_path = gtk_tree_path_new_from_string(path);
                        gtk_tree_view_expand_to_path(GTK_TREE_VIEW(pkd->keyword_treeview), tree_path);
+                       gtk_tree_path_free(tree_path);
+                       pkd->expanded_rows = g_list_append(pkd->expanded_rows, g_strdup(path));
                        continue;
                        }
                log_printf("unknown attribute %s = %s\n", option, value);
index ba4e6c6..563b7b8 100644 (file)
@@ -1605,6 +1605,20 @@ void keyword_show_all_in(GtkTreeStore *keyword_tree, gpointer id)
        gtk_tree_model_foreach(GTK_TREE_MODEL(keyword_tree), keyword_show_all_in_cb, id);
 }
 
+static gboolean keyword_revert_hidden_in_cb(GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, gpointer data)
+{
+       if (keyword_is_hidden_in(GTK_TREE_MODEL(keyword_tree), iter, data))
+               {
+               keyword_show_in(GTK_TREE_STORE(model), iter, data);
+               }
+       return FALSE;
+}
+
+void keyword_revert_hidden_in(GtkTreeStore *keyword_tree, gpointer id)
+{
+       gtk_tree_model_foreach(GTK_TREE_MODEL(keyword_tree), keyword_revert_hidden_in_cb, id);
+}
+
 static void keyword_hide_unset_in_recursive(GtkTreeStore *keyword_tree, GtkTreeIter *iter_ptr, gpointer id, GList *keywords)
 {
        GtkTreeIter iter = *iter_ptr;
index be332c9..f92e447 100644 (file)
@@ -100,6 +100,7 @@ void keyword_hide_in(GtkTreeStore *keyword_tree, GtkTreeIter *iter, gpointer id)
 void keyword_show_in(GtkTreeStore *keyword_tree, GtkTreeIter *iter, gpointer id);
 gboolean keyword_is_hidden_in(GtkTreeModel *keyword_tree, GtkTreeIter *iter, gpointer id);
 void keyword_show_all_in(GtkTreeStore *keyword_tree, gpointer id);
+void keyword_revert_hidden_in(GtkTreeStore *keyword_tree, gpointer id);
 void keyword_hide_unset_in(GtkTreeStore *keyword_tree, gpointer id, GList *keywords);
 void keyword_show_set_in(GtkTreeStore *keyword_tree, gpointer id, GList *keywords);