Disconnect all mark keyword connections
authorColin Clark <colin.clark@cclark.uk>
Fri, 17 Nov 2017 16:46:18 +0000 (16:46 +0000)
committerColin Clark <colin.clark@cclark.uk>
Fri, 17 Nov 2017 16:46:18 +0000 (16:46 +0000)
Additional keyword menu item to disconnect all marks keywords
connections

src/bar_keywords.c
src/metadata.c
src/metadata.h

index b59a089..b62b988 100644 (file)
@@ -1016,6 +1016,35 @@ static void bar_pane_keywords_connect_mark_cb(GtkWidget *menu_widget, gpointer d
        meta_data_connect_mark_with_keyword(keyword_tree, &kw_iter, mark);
 }
 
+static void bar_pane_keywords_disconnect_marks_ok_cb(GenericDialog *gd, gpointer data)
+{
+       keyword_tree_disconnect_marks();
+}
+
+static void dummy_cancel_cb(GenericDialog *gd, gpointer data)
+{
+       /* no op, only so cancel button appears */
+}
+
+static void bar_pane_keywords_disconnect_marks_cb(GtkWidget *menu_widget, gpointer data)
+{
+       PaneKeywordsData *pkd = data;
+
+       GenericDialog *gd;
+       GString *message = g_string_new("");
+
+       message = g_string_append(message, _("This will disconnect all Marks Keywords connections"));
+
+       gd = generic_dialog_new(_("Marks Keywords"),
+                               "marks_keywords", menu_widget, TRUE, dummy_cancel_cb, pkd);
+       generic_dialog_add_message(gd, GTK_STOCK_DIALOG_WARNING,
+                               "Disconnect all Marks Keywords connections?", message->str, TRUE);
+       generic_dialog_add_button(gd, GTK_STOCK_OK, NULL, bar_pane_keywords_disconnect_marks_ok_cb, TRUE);
+
+       gtk_widget_show(gd->dialog);
+
+       g_string_free(message, TRUE);
+}
 
 static void bar_pane_keywords_delete_cb(GtkWidget *menu_widget, gpointer data)
 {
@@ -1322,6 +1351,12 @@ static void bar_pane_keywords_menu_popup(GtkWidget *widget, PaneKeywordsData *pk
                        g_free(text);
                        }
 
+               if (keyword)
+                       {
+                       text = g_strdup_printf(_("Disconnect all Mark Keyword connections"));
+                       menu_item_add_stock(menu, text, GTK_STOCK_DELETE, G_CALLBACK(bar_pane_keywords_disconnect_marks_cb), pkd);
+                       g_free(text);
+                       }
                menu_item_add_divider(menu);
                g_free(mark);
                g_free(name);
index 74dbcd3..dfd2057 100644 (file)
@@ -1812,6 +1812,35 @@ void keyword_tree_write_config(GString *outstr, gint indent)
        WRITE_NL(); WRITE_STRING("</keyword_tree>");
 }
 
+ void keyword_tree_node_disconnect_marks(GtkTreeModel *keyword_tree, GtkTreeIter *iter_ptr)
+{
+       GtkTreeIter iter = *iter_ptr;
+
+       while (TRUE)
+               {
+               GtkTreeIter children;
+
+               meta_data_connect_mark_with_keyword((keyword_tree), &iter, -1);
+
+               if (gtk_tree_model_iter_children((keyword_tree), &children, &iter))
+                       {
+                       keyword_tree_node_disconnect_marks((keyword_tree), &children);
+                       }
+
+               if (!gtk_tree_model_iter_next((keyword_tree), &iter)) return;
+               }
+}
+
+void keyword_tree_disconnect_marks()
+{
+       GtkTreeIter iter;
+
+       if (keyword_tree && gtk_tree_model_get_iter_first(GTK_TREE_MODEL(keyword_tree), &iter))
+               {
+               keyword_tree_node_disconnect_marks(GTK_TREE_MODEL(keyword_tree), &iter);
+               }
+}
+
 GtkTreeIter *keyword_add_from_config(GtkTreeStore *keyword_tree, GtkTreeIter *parent, const gchar **attribute_names, const gchar **attribute_values)
 {
        gchar *name = NULL;
index ec56579..0c0dd4b 100644 (file)
@@ -111,5 +111,6 @@ void keyword_tree_new(void);
 void keyword_tree_write_config(GString *outstr, gint indent);
 GtkTreeIter *keyword_add_from_config(GtkTreeStore *keyword_tree, GtkTreeIter *parent, const gchar **attribute_names, const gchar **attribute_values);
 
+void keyword_tree_disconnect_marks();
 #endif
 /* vim: set shiftwidth=8 softtabstop=0 cindent cinoptions={1s: */