commit 0d5490894e397111ca70c3306a05a3372c35c58f Author: phantomjinx <p.g.richard...@phantomjinx.co.uk> Date: Sun Oct 17 23:06:00 2010 +0100
Tidy up the context menus * Categorise and create sub menus where necessary * Replace play and enqueue with sub menu dedicated to execute any track commands that have been registered. libgtkpod/context_menus.c | 66 +++++++++++++------ libgtkpod/context_menus.h | 6 +- libgtkpod/gtkpod_app_iface.c | 12 +--- libgtkpod/track_command_iface.c | 9 +++ libgtkpod/track_command_iface.h | 2 + .../playlist_display_context_menu.c | 42 ++++++++----- .../sorttab_display/sorttab_display_context_menu.c | 37 +++++++----- plugins/track_display/track_display_context_menu.c | 38 +++++++----- 8 files changed, 131 insertions(+), 81 deletions(-) --- diff --git a/libgtkpod/context_menus.c b/libgtkpod/context_menus.c index 05268e0..4311b26 100644 --- a/libgtkpod/context_menus.c +++ b/libgtkpod/context_menus.c @@ -40,6 +40,7 @@ #include "prefs.h" #include "tools.h" #include "syncdir.h" +#include "track_command_iface.h" #define LOCALDEBUG 0 @@ -74,6 +75,27 @@ GtkWidget *hookup_menu_item(GtkWidget *m, const gchar *str, const gchar *stock, return mi; } +GtkWidget *add_sub_menu(GtkWidget *menu, gchar* label, gchar* stockid) { + GtkWidget *item; + GtkWidget *submenu; + GtkWidget *image; + + item = gtk_image_menu_item_new_with_mnemonic(label); + gtk_widget_set_sensitive(item, TRUE); + gtk_widget_add_events(item, GDK_BUTTON_RELEASE_MASK); + + image = gtk_image_new_from_stock(stockid, GTK_ICON_SIZE_MENU); + gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM (item), image); + + submenu = gtk_menu_new(); + gtk_menu_item_set_submenu(GTK_MENU_ITEM(item), submenu); + + gtk_menu_append(menu, item); + gtk_widget_show_all(item); + + return submenu; +} + /** * Add separator to Menu @m and return pointer to separator widget */ @@ -93,30 +115,32 @@ void context_menu_delete_track_head(GtkMenuItem *mi, gpointer data) { delete_track_head(deleteaction); } -/* - * play_entries_now - play the entries currently selected in xmms - * @mi - the menu item selected - * @data - Ignored, should be NULL - */ -static void play_entries_now(GtkMenuItem *mi, gpointer data) { - tools_play_tracks(gtkpod_get_selected_tracks()); -} +GtkWidget *add_exec_commands(GtkWidget *menu) { + GList *trkcmds = gtkpod_get_registered_track_commands(); + GList *cmds = trkcmds; + gint trksize = g_list_length(trkcmds); + GtkWidget *mm; -GtkWidget *add_play_now(GtkWidget *menu) { - return hookup_menu_item(menu, _("Play Now"), GTK_STOCK_CDROM, G_CALLBACK (play_entries_now), NULL); -} + if (trksize == 0) + return NULL; + else if (trksize == 1) { + mm = menu; + } + else { + GtkWidget *submenu = add_sub_menu(menu, "Execute", GTK_STOCK_EXECUTE); + mm = submenu; + } -/* - * play_entries_now - play the entries currently selected in xmms - * @mi - the menu item selected - * @data - Ignored, should be NULL - */ -static void play_entries_enqueue(GtkMenuItem *mi, gpointer data) { - tools_enqueue_tracks(gtkpod_get_selected_tracks()); -} + while(cmds != NULL) { + TrackCommandInterface *cmd = cmds->data; + GPtrArray *pairarr = g_ptr_array_new (); + g_ptr_array_add (pairarr, cmd); + g_ptr_array_add (pairarr, gtkpod_get_selected_tracks()); + hookup_menu_item(mm, cmd->text, GTK_STOCK_EXECUTE, G_CALLBACK (on_track_command_menuitem_activate), pairarr); + cmds = cmds->next; + } -GtkWidget *add_enqueue(GtkWidget *menu) { - return hookup_menu_item(menu, _("Enqueue"), GTK_STOCK_CDROM, G_CALLBACK (play_entries_enqueue), NULL); + return mm; } /* diff --git a/libgtkpod/context_menus.h b/libgtkpod/context_menus.h index d525d91..8024010 100644 --- a/libgtkpod/context_menus.h +++ b/libgtkpod/context_menus.h @@ -40,6 +40,10 @@ */ GtkWidget *hookup_menu_item(GtkWidget *m, const gchar *str, const gchar *stock, GCallback func, gpointer userdata); +GtkWidget *add_sub_menu(GtkWidget *menu, gchar* label, gchar* stockid); + +GtkWidget *add_exec_commands(GtkWidget *menu); + /** * Add separator to Menu @m and return pointer to separator widget */ @@ -47,8 +51,6 @@ GtkWidget *add_separator(GtkWidget *menu); void context_menu_delete_track_head(GtkMenuItem *mi, gpointer data); -GtkWidget *add_play_now (GtkWidget *menu); -GtkWidget *add_enqueue (GtkWidget *menu); GtkWidget *add_copy_track_to_filesystem (GtkWidget *menu); GtkWidget *add_create_playlist_file (GtkWidget *menu); GtkWidget *add_update_tracks_from_file (GtkWidget *menu); diff --git a/libgtkpod/gtkpod_app_iface.c b/libgtkpod/gtkpod_app_iface.c index 00b8699..2e48dc6 100644 --- a/libgtkpod/gtkpod_app_iface.c +++ b/libgtkpod/gtkpod_app_iface.c @@ -566,16 +566,6 @@ void gtkpod_unregister_track_command(TrackCommandInterface *command) { gp_iface->track_commands = g_list_remove(gp_iface->track_commands, command); } -static void execute_track_command(GtkMenuItem *mi, gpointer data) { - GPtrArray *pairarr = (GPtrArray *) data; - - TrackCommandInterface *cmd = g_ptr_array_index(pairarr, 0); - GList *tracks = g_ptr_array_index(pairarr, 1); - - cmd->execute(tracks); - g_ptr_array_free(pairarr, FALSE); -} - static void gtkpod_display_command_ctx_menu(GList *track_cmds, GList *tracks) { GtkWidget *menu = NULL; GList *cmds; @@ -597,7 +587,7 @@ static void gtkpod_display_command_ctx_menu(GList *track_cmds, GList *tracks) { GPtrArray *pairarr = g_ptr_array_new (); g_ptr_array_add (pairarr, cmd); g_ptr_array_add (pairarr, tracks); - hookup_menu_item(menu, cmd->text, GTK_STOCK_EXECUTE, G_CALLBACK (execute_track_command), pairarr); + hookup_menu_item(menu, cmd->text, GTK_STOCK_EXECUTE, G_CALLBACK (on_track_command_menuitem_activate), pairarr); cmds = cmds->next; } diff --git a/libgtkpod/track_command_iface.c b/libgtkpod/track_command_iface.c index 7053957..1ac814f 100644 --- a/libgtkpod/track_command_iface.c +++ b/libgtkpod/track_command_iface.c @@ -50,3 +50,12 @@ GType track_command_get_type(void) { } return type; } + +void on_track_command_menuitem_activate(GtkMenuItem *mi, gpointer data) { + GPtrArray *pairarr = (GPtrArray *) data; + + TrackCommandInterface *cmd = g_ptr_array_index(pairarr, 0); + GList *tracks = g_ptr_array_index(pairarr, 1); + cmd->execute(tracks); + g_ptr_array_free(pairarr, FALSE); +} diff --git a/libgtkpod/track_command_iface.h b/libgtkpod/track_command_iface.h index 8fc7935..cb9d99e 100644 --- a/libgtkpod/track_command_iface.h +++ b/libgtkpod/track_command_iface.h @@ -56,4 +56,6 @@ GType track_command_get_type(void); #define TRACK_IS_COMMAND(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TRACK_COMMAND_TYPE)) #define TRACK_COMMAND_GET_INTERFACE(inst) (G_TYPE_INSTANCE_GET_INTERFACE ((inst), TRACK_COMMAND_TYPE, TrackCommandInterface)) +void on_track_command_menuitem_activate(GtkMenuItem *mi, gpointer data); + #endif /* TRACK_COMMAND_IFACE_H_ */ diff --git a/plugins/playlist_display/playlist_display_context_menu.c b/plugins/playlist_display/playlist_display_context_menu.c index 84214c1..6f509f9 100644 --- a/plugins/playlist_display/playlist_display_context_menu.c +++ b/plugins/playlist_display/playlist_display_context_menu.c @@ -297,12 +297,8 @@ void pm_context_menu_init(void) { if (itdb->usertype & GP_ITDB_TYPE_IPOD) { if (eitdb->itdb_imported) { - add_play_now(menu); - add_enqueue(menu); - add_update_tracks_from_file(menu); - if (!pl->is_spl) { - add_sync_playlist_with_dirs(menu); - } + add_exec_commands(menu); + add_separator(menu); if (itdb_playlist_is_mpl(pl)) { add_delete_all_tracks_from_ipod(menu); @@ -311,10 +307,19 @@ void pm_context_menu_init(void) { add_delete_all_podcasts_from_ipod(menu); } else { - add_delete_playlist_including_tracks_ipod(menu); - add_delete_playlist_but_keep_tracks(menu); + GtkWidget *delete_menu = add_sub_menu(menu, "Delete", GTK_STOCK_DELETE); + add_delete_playlist_including_tracks_ipod(delete_menu); + add_delete_playlist_but_keep_tracks(delete_menu); } + add_separator(menu); add_copy_selected_playlist_to_target_itdb(menu, _("Copy selected playlist to...")); + + add_separator(menu); + add_update_tracks_from_file(menu); + if (!pl->is_spl) { + add_sync_playlist_with_dirs(menu); + } + add_separator(menu); add_edit_track_details(menu); if (pl->is_spl) { @@ -336,23 +341,26 @@ void pm_context_menu_init(void) { } } if (itdb->usertype & GP_ITDB_TYPE_LOCAL) { - add_play_now(menu); - add_enqueue(menu); - add_update_tracks_from_file(menu); - if (!pl->is_spl) { - add_sync_playlist_with_dirs(menu); - } + add_exec_commands(menu); add_separator(menu); + if (itdb_playlist_is_mpl(pl)) { add_delete_all_tracks_from_database(menu); } else { - add_delete_playlist_including_tracks_database(menu); - add_delete_playlist_including_tracks_harddisk(menu); - add_delete_playlist_but_keep_tracks(menu); + GtkWidget *delete_menu = add_sub_menu(menu, "Delete", GTK_STOCK_DELETE); + add_delete_playlist_including_tracks_database(delete_menu); + add_delete_playlist_including_tracks_harddisk(delete_menu); + add_delete_playlist_but_keep_tracks(delete_menu); } add_copy_selected_playlist_to_target_itdb(menu, _("Copy selected playlist to...")); add_separator(menu); + add_update_tracks_from_file(menu); + if (!pl->is_spl) { + add_sync_playlist_with_dirs(menu); + } + + add_separator(menu); add_edit_track_details(menu); if (pl->is_spl) { add_edit_smart_playlist(menu); diff --git a/plugins/sorttab_display/sorttab_display_context_menu.c b/plugins/sorttab_display/sorttab_display_context_menu.c index f210484..497037d 100644 --- a/plugins/sorttab_display/sorttab_display_context_menu.c +++ b/plugins/sorttab_display/sorttab_display_context_menu.c @@ -267,31 +267,38 @@ void st_context_menu_init(gint inst) { menu = gtk_menu_new(); - add_play_now(menu); - add_enqueue(menu); - add_copy_track_to_filesystem(menu); - add_create_playlist_file(menu); - add_create_new_playlist(menu); - add_update_tracks_from_file(menu); - if (!pl->is_spl) { - add_sync_playlist_with_dirs(menu); - } + add_exec_commands(menu); + add_separator(menu); + + GtkWidget *create_menu = add_sub_menu(menu, "Create Playlist", GTK_STOCK_NEW); + add_create_playlist_file(create_menu); + add_create_new_playlist(create_menu); add_separator(menu); + + GtkWidget *copy_menu = add_sub_menu(menu, "Copy", GTK_STOCK_COPY); + add_copy_track_to_filesystem(copy_menu); + add_copy_selected_entry_to_target_itdb(copy_menu, _("Copy selected track(s) to...")); + add_separator(menu); + if (itdb->usertype & GP_ITDB_TYPE_IPOD) { - add_delete_entry_from_ipod(menu); if (!itdb_playlist_is_mpl(pl)) { - add_delete_entry_from_playlist(menu); + GtkWidget *delete_menu = add_sub_menu(menu, "Delete", GTK_STOCK_DELETE); + add_delete_entry_from_ipod(delete_menu); + add_delete_entry_from_playlist(delete_menu); + } else { + add_delete_entry_from_ipod(menu); } } if (itdb->usertype & GP_ITDB_TYPE_LOCAL) { - add_delete_entry_from_harddisk(menu); - add_delete_entry_from_database(menu); + GtkWidget *delete_menu = add_sub_menu(menu, "Delete", GTK_STOCK_DELETE); + add_delete_entry_from_harddisk(delete_menu); + add_delete_entry_from_database(delete_menu); if (!itdb_playlist_is_mpl(pl)) { - add_delete_entry_from_playlist(menu); + add_delete_entry_from_playlist(delete_menu); } } - add_copy_selected_entry_to_target_itdb(menu, _("Copy selected track(s) to...")); add_separator(menu); + add_update_tracks_from_file(menu); add_edit_track_details(menu); /* diff --git a/plugins/track_display/track_display_context_menu.c b/plugins/track_display/track_display_context_menu.c index 61de20b..e512c6f 100644 --- a/plugins/track_display/track_display_context_menu.c +++ b/plugins/track_display/track_display_context_menu.c @@ -155,31 +155,39 @@ void tm_context_menu_init(void) { menu = gtk_menu_new(); - add_play_now(menu); - add_enqueue(menu); - add_copy_track_to_filesystem(menu); - add_create_playlist_file(menu); - add_create_new_playlist(menu); - add_update_tracks_from_file(menu); - if (!pl->is_spl) { - add_sync_playlist_with_dirs(menu); - } + add_exec_commands(menu); add_separator(menu); + + GtkWidget *create_menu = add_sub_menu(menu, "Create Playlist", GTK_STOCK_NEW); + add_create_playlist_file(create_menu); + add_create_new_playlist(create_menu); + add_separator(menu); + + GtkWidget *copy_menu = add_sub_menu(menu, "Copy", GTK_STOCK_COPY); + add_copy_track_to_filesystem(copy_menu); + add_copy_selected_tracks_to_target_itdb(copy_menu, _("Copy selected track(s) to...")); + add_separator(menu); + if (itdb->usertype & GP_ITDB_TYPE_IPOD) { - add_delete_tracks_from_ipod(menu); if (!itdb_playlist_is_mpl(pl)) { - add_delete_tracks_from_playlist(menu); + GtkWidget *delete_menu = add_sub_menu(menu, "Delete", GTK_STOCK_DELETE); + add_delete_tracks_from_ipod(delete_menu); + add_delete_tracks_from_playlist(delete_menu); + } else { + add_delete_tracks_from_ipod(menu); } } if (itdb->usertype & GP_ITDB_TYPE_LOCAL) { - add_delete_tracks_from_harddisk(menu); - add_delete_tracks_from_database(menu); + GtkWidget *delete_menu = add_sub_menu(menu, "Delete", GTK_STOCK_DELETE); + add_delete_tracks_from_harddisk(delete_menu); + add_delete_tracks_from_database(delete_menu); if (!itdb_playlist_is_mpl(pl)) { - add_delete_tracks_from_playlist(menu); + add_delete_tracks_from_playlist(delete_menu); } } - add_copy_selected_tracks_to_target_itdb(menu, _("Copy selected track(s) to...")); + add_separator(menu); + add_update_tracks_from_file(menu); add_edit_track_details(menu); /* ------------------------------------------------------------------------------ Download new Adobe(R) Flash(R) Builder(TM) 4 The new Adobe(R) Flex(R) 4 and Flash(R) Builder(TM) 4 (formerly Flex(R) Builder(TM)) enable the development of rich applications that run across multiple browsers and platforms. Download your free trials today! http://p.sf.net/sfu/adobe-dev2dev _______________________________________________ gtkpod-cvs2 mailing list gtkpod-cvs2@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/gtkpod-cvs2