# HG changeset patch # User Colin Clark # Date 1510937178 0 # Node ID 598aadefd022ed75a038f97fcbf9dc4f422d68e1 # Parent e2f68d2ff2a0b700ea48f4569ac6a81a2528a2d5 Disconnect all mark keyword connections Additional keyword menu item to disconnect all marks keywords connections diff -r e2f68d2ff2a0 -r 598aadefd022 src/bar_keywords.c --- 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); diff -r e2f68d2ff2a0 -r 598aadefd022 src/metadata.c --- 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(""); } + 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; diff -r e2f68d2ff2a0 -r 598aadefd022 src/metadata.h --- 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: */