changeset 2669:598aadefd022

Disconnect all mark keyword connections Additional keyword menu item to disconnect all marks keywords connections
author Colin Clark <colin.clark@cclark.uk>
date Fri, 17 Nov 2017 16:46:18 +0000
parents e2f68d2ff2a0
children ec21b78a088c
files src/bar_keywords.c src/metadata.c src/metadata.h
diffstat 3 files changed, 65 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/src/bar_keywords.c	Thu Nov 16 10:07:31 2017 +0000
+++ b/src/bar_keywords.c	Fri Nov 17 16:46:18 2017 +0000
@@ -1016,6 +1016,35 @@
 	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 @@
 			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);
--- a/src/metadata.c	Thu Nov 16 10:07:31 2017 +0000
+++ b/src/metadata.c	Fri Nov 17 16:46:18 2017 +0000
@@ -1812,6 +1812,35 @@
 	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;
--- a/src/metadata.h	Thu Nov 16 10:07:31 2017 +0000
+++ b/src/metadata.h	Fri Nov 17 16:46:18 2017 +0000
@@ -111,5 +111,6 @@
 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: */