From c45cc78548cb66fde513b8b2554afd84e49829e8 Mon Sep 17 00:00:00 2001 From: TingPing Date: Tue, 4 Jun 2013 12:25:12 -0300 Subject: Add copy option to right click in banlist Closes #626 --- src/fe-gtk/banlist.c | 75 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) diff --git a/src/fe-gtk/banlist.c b/src/fe-gtk/banlist.c index 8c396d14..897e61d6 100644 --- a/src/fe-gtk/banlist.c +++ b/src/fe-gtk/banlist.c @@ -317,6 +317,80 @@ fe_ban_list_end (struct session *sess, int rplcode) else return FALSE; } +static void +banlist_copyentry (GtkWidget *menuitem, GtkTreeView *view) +{ + GtkTreeModel *model; + GtkTreeSelection *sel; + GtkTreeIter iter; + GValue mask = G_VALUE_INIT; + GValue from = G_VALUE_INIT; + GValue date = G_VALUE_INIT; + char *str; + + /* get selection (which should have been set on click) + * and temporarily switch to single mode to get selected iter */ + sel = gtk_tree_view_get_selection (view); + gtk_tree_selection_set_mode (sel, GTK_SELECTION_SINGLE); + if (gtk_tree_selection_get_selected (sel, &model, &iter)) + { + gtk_tree_model_get_value (model, &iter, MASK_COLUMN, &mask); + gtk_tree_model_get_value (model, &iter, FROM_COLUMN, &from); + gtk_tree_model_get_value (model, &iter, DATE_COLUMN, &date); + + /* poor way to get which is selected but it works */ + if (strcmp (_("Copy mask"), gtk_menu_item_get_label (GTK_MENU_ITEM(menuitem))) == 0) + str = g_value_dup_string (&mask); + else + str = g_strdup_printf (_("%s on %s by %s"), g_value_get_string (&mask), + g_value_get_string (&date), g_value_get_string (&from)); + + if (str[0] != 0) + gtkutil_copy_to_clipboard (menuitem, NULL, str); + + g_value_unset (&mask); + g_value_unset (&from); + g_value_unset (&date); + g_free (str); + } + gtk_tree_selection_set_mode (sel, GTK_SELECTION_MULTIPLE); +} + +static gboolean +banlist_button_pressed (GtkWidget *wid, GdkEventButton *event, gpointer userdata) +{ + GtkTreePath *path; + GtkWidget *menu, *maskitem, *allitem; + + /* Check for right click */ + if (event->type == GDK_BUTTON_PRESS && event->button == 3) + { + if (gtk_tree_view_get_path_at_pos (GTK_TREE_VIEW (wid), event->x, event->y, + &path, NULL, NULL, NULL)) + { + /* Must set the row active for use in callback */ + gtk_tree_view_set_cursor (GTK_TREE_VIEW(wid), path, NULL, FALSE); + gtk_tree_path_free (path); + + menu = gtk_menu_new (); + maskitem = gtk_menu_item_new_with_label (_("Copy mask")); + allitem = gtk_menu_item_new_with_label (_("Copy entry")); + g_signal_connect (maskitem, "activate", G_CALLBACK(banlist_copyentry), wid); + g_signal_connect (allitem, "activate", G_CALLBACK(banlist_copyentry), wid); + gtk_menu_shell_append (GTK_MENU_SHELL(menu), maskitem); + gtk_menu_shell_append (GTK_MENU_SHELL(menu), allitem); + gtk_widget_show_all (menu); + + gtk_menu_popup (GTK_MENU(menu), NULL, NULL, NULL, NULL, + event->button, gtk_get_current_event_time ()); + } + + return TRUE; + } + + return FALSE; +} + static void banlist_select_changed (GtkWidget *item, banlist_info *banl) { @@ -644,6 +718,7 @@ banlist_treeview_new (GtkWidget *box, banlist_info *banl) MASK_COLUMN, _("Mask"), FROM_COLUMN, _("From"), DATE_COLUMN, _("Date"), -1); + g_signal_connect (G_OBJECT (view), "button-press-event", G_CALLBACK (banlist_button_pressed), NULL); col = gtk_tree_view_get_column (GTK_TREE_VIEW (view), MASK_COLUMN); gtk_tree_view_column_set_alignment (col, 0.5); -- cgit 1.4.1