From b04ba04c6d0d1b81a3509c0f69124ddc8e615016 Mon Sep 17 00:00:00 2001 From: Joel Klinghed Date: Sun, 20 Nov 2011 02:28:45 +0100 Subject: Add popup menu for torrents --- gui/viewtorrents.glade | 68 +++++++++++++++++++++++++++++++++++++------------- src/main.c | 58 ++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 106 insertions(+), 20 deletions(-) diff --git a/gui/viewtorrents.glade b/gui/viewtorrents.glade index 98ffaba..c83ba36 100644 --- a/gui/viewtorrents.glade +++ b/gui/viewtorrents.glade @@ -5,18 +5,20 @@ - - Connect - Connect to rTorrent - gtk-connect + + Rehash + Rehash selected torrent + gtk-refresh + - - Disconnect - Disconnect from rTorrent - gtk-disconnect + + Stop + Stop selected torrent + gtk-media-stop + @@ -27,20 +29,18 @@ - - Stop - Stop selected torrent - gtk-media-stop + + Disconnect + Disconnect from rTorrent + gtk-disconnect - - - Rehash - Rehash selected torrent - gtk-refresh + + Connect + Connect to rTorrent + gtk-connect - @@ -739,4 +739,36 @@ If authentication is needed, enter username and password as well. button1 + + True + False + accelgroup1 + + + startaction + True + False + True + accelgroup1 + + + + + stopaction + True + False + True + accelgroup1 + + + + + rehashaction + True + False + True + accelgroup1 + + + diff --git a/src/main.c b/src/main.c index edeac37..a98a292 100644 --- a/src/main.c +++ b/src/main.c @@ -65,6 +65,7 @@ typedef struct GtkAction* connectaction, * disconnectaction; GtkAction* startaction, * stopaction, * rehashaction; GtkCheckMenuItem* viewtoolbaritem; + GtkWidget* torrentmenu; GtkToolbar* toolbar; @@ -264,6 +265,10 @@ static void do_start(GtkAction* action, gpointer data); static void do_stop(GtkAction* action, gpointer data); static void do_rehash(GtkAction* action, gpointer data); +static gboolean do_popupmenu(GtkWidget* treeview, gpointer data); +static gboolean do_buttonpressed(GtkWidget *treeview, GdkEventButton *event, + gpointer data); + static void do_viewtoolbaritem(GtkCheckMenuItem* checkmenuitem, gpointer data); static void do_about(GtkMenuItem* menuitem, gpointer data); @@ -296,6 +301,7 @@ int main(int argc, char** argv) GtkWidget* pwddlg; GtkCellRenderer* cell; GtkTreeViewColumn* column; + GtkWidget* treeview; GThread* worker; worker_data_t worker_data; master_t master; @@ -402,12 +408,18 @@ int main(int argc, char** argv) gtk_tree_sortable_set_default_sort_func(GTK_TREE_SORTABLE(master.liststore), liststore_default_compare_func, &master, NULL); - master.listselection = gtk_tree_view_get_selection( - GTK_TREE_VIEW(gtk_builder_get_object(builder, "treeview"))); + master.torrentmenu = GTK_WIDGET(gtk_builder_get_object(builder, + "torrentmenu")); + treeview = GTK_WIDGET(gtk_builder_get_object(builder, "treeview")); + master.listselection = gtk_tree_view_get_selection(GTK_TREE_VIEW(treeview)); gtk_tree_selection_set_mode(master.listselection, GTK_SELECTION_SINGLE); g_signal_connect(master.listselection, "changed", G_CALLBACK(listselection_changed), &master); + g_signal_connect(treeview, "button-press-event", + G_CALLBACK(do_buttonpressed), &master); + g_signal_connect(treeview, "popup-menu", G_CALLBACK(do_popupmenu), &master); + cell = custom_cell_renderer_state_new(); column = GTK_TREE_VIEW_COLUMN(gtk_builder_get_object(builder, "statecolumn")); @@ -563,6 +575,7 @@ int main(int argc, char** argv) gtk_widget_destroy(master.top); gtk_widget_destroy(pwddlg); gtk_widget_destroy(master.connectdlg); + gtk_widget_destroy(master.torrentmenu); g_object_unref(builder); g_key_file_free(master.config); @@ -2302,3 +2315,44 @@ void do_about(GtkMenuItem* G_GNUC_UNUSED menuitem, gpointer data) master_t* master = data; gtk_widget_show_all(master->aboutdlg); } + +static void view_contextmenu(GtkWidget* treeview, GdkEventButton* event, + gpointer data) +{ + master_t* master = data; + gtk_widget_show_all(master->torrentmenu); + gtk_menu_popup(GTK_MENU(master->torrentmenu), NULL, NULL, NULL, NULL, + event ? event->button : 0, + gdk_event_get_time((GdkEvent*)event)); +} + +gboolean do_popupmenu(GtkWidget* treeview, gpointer data) +{ + view_contextmenu(treeview, NULL, data); + return TRUE; +} + +gboolean do_buttonpressed(GtkWidget *treeview, GdkEventButton *event, + gpointer data) +{ + if (event->type == GDK_BUTTON_PRESS && event->button == 3) + { + master_t* master = data; + GtkTreePath *path; + + if (gtk_tree_view_get_path_at_pos(GTK_TREE_VIEW(treeview), + (gint)event->x, + (gint)event->y, + &path, NULL, NULL, NULL)) + { + gtk_tree_selection_unselect_all(master->listselection); + gtk_tree_selection_select_path(master->listselection, path); + gtk_tree_path_free(path); + } + + view_contextmenu(treeview, event, data); + return TRUE; + } + + return FALSE; +} -- cgit v1.2.3-70-g09d2