commit 0d5490894e397111ca70c3306a05a3372c35c58f
Author: phantomjinx <[email protected]>
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
[email protected]
https://lists.sourceforge.net/lists/listinfo/gtkpod-cvs2