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

Reply via email to