Update of /cvsroot/gtkpod/gtkpod/src
In directory sc8-pr-cvs2.sourceforge.net:/tmp/cvs-serv15562/src

Modified Files:
        context_menus.c 
Log Message:
        * context_menus.c: Implemented Andrzej Palejko's patch to
          allow copying of tracks and playlists from within the
          context menu without using DND.



Index: context_menus.c
===================================================================
RCS file: /cvsroot/gtkpod/gtkpod/src/context_menus.c,v
retrieving revision 1.67
retrieving revision 1.68
diff -u -d -r1.67 -r1.68
--- context_menus.c     24 Nov 2006 11:18:21 -0000      1.67
+++ context_menus.c     26 Mar 2007 13:23:35 -0000      1.68
@@ -1,4 +1,4 @@
-/* Time-stamp: <2006-11-24 20:14:54 jcs>
+/* Time-stamp: <2007-03-26 22:20:32 jcs>
 |
 |  Copyright (C) 2003 Corey Donohoe <atmos at atmos dot org>
 |  Copyright (C) 2003-2005 Jorg Schuler <jcsjcs at users sourceforge net>
@@ -33,8 +33,10 @@
 #endif
 
 #include "itdb.h"
+#include "info.h"
 #include "details.h"
 #include "display.h"
+#include "display_itdb.h"
 #include "file.h"
 #include "misc.h"
 #include "misc_track.h"
@@ -314,6 +316,169 @@
 
 
 
+
+/* ------------------------------------------------------------
+
+      Copying selected item(s) to target destination
+
+   ------------------------------------------------------------ */
+
+
+/*
+ * Copy the selected playlist to a specified itdb.
+ */
+void
+copy_playlist_to_target_itdb (Playlist     *pl,
+                             iTunesDB     *t_itdb)
+{
+    Playlist   *pl_n;
+    GList      *addtracks = NULL;
+    g_return_if_fail (pl);
+    g_return_if_fail (t_itdb);
+    if (pl->itdb != t_itdb)
+    {
+       addtracks = export_trackglist_when_necessary (pl->itdb,
+                                                     t_itdb,
+                                                     pl->members);
+       if (addtracks || !pl->members)
+       {
+           pl_n = gp_playlist_add_new(t_itdb, pl->name, FALSE, -1);
+           add_trackglist_to_playlist (pl_n, addtracks);
+           gtkpod_statusbar_message (_("Copied \"%s\" playlist to %s"),
+                                     pl->name, (itdb_playlist_mpl 
(t_itdb))->name);
+       }
+       g_list_free (addtracks);
+       addtracks = NULL;
+    }
+    else
+    {
+       pl_n = itdb_playlist_duplicate (pl);
+       g_return_if_fail (pl_n);
+       gp_playlist_add (t_itdb, pl_n, -1);
+    }
+}
+
+
+/*
+ * Copy selected tracks to a specified itdb.
+ */
+void
+copy_tracks_to_target_itdb (GList        *tracks,
+                           iTunesDB     *t_itdb)
+{
+    GList       *addtracks = NULL;
+    Track      *first = tracks->data;
+    Playlist    *mpl;
+    gint        n;
+
+    g_return_if_fail(tracks);
+    g_return_if_fail(t_itdb);
+
+    mpl = itdb_playlist_mpl (t_itdb);
+    g_return_if_fail(mpl);
+
+    addtracks = export_trackglist_when_necessary (first->itdb, t_itdb, tracks);
+
+    if (addtracks)
+    {
+       add_trackglist_to_playlist (mpl, addtracks);
+       n = g_list_length (addtracks);
+       gtkpod_statusbar_message (ngettext ("Copied %d track to '%s'",
+                                           "Copied %d tracks to '%s'", n),
+                                 n, mpl->name);
+       g_list_free (addtracks);
+       addtracks = NULL;
+    }
+}
+
+
+void
+copy_playlist_to_target_playlist (Playlist     *pl,
+                                 Playlist     *t_pl)
+{
+    GList      *addtracks = NULL;
+    Playlist    *t_mpl;
+
+    g_return_if_fail (pl);
+    g_return_if_fail (t_pl);
+
+    t_mpl = itdb_playlist_mpl (t_pl->itdb);
+    g_return_if_fail(t_mpl);
+
+    addtracks = export_trackglist_when_necessary (pl->itdb,
+                                                 t_pl->itdb,
+                                                 pl->members);
+    if (addtracks || !pl->members)
+    {
+       add_trackglist_to_playlist (t_pl, addtracks);
+       gtkpod_statusbar_message (_("Copied '%s' playlist to '%s' in '%s'"),
+                                 pl->name, t_pl->name, t_mpl->name);
+       g_list_free(addtracks);
+       addtracks = NULL;
+    }
+}
+
+
+
+void
+copy_tracks_to_target_playlist (GList        *tracks,
+                               Playlist     *t_pl)
+{
+    GList      *addtracks = NULL;
+    Track      *first;
+    Playlist    *mpl;
+    gint        n;
+
+    g_return_if_fail (tracks);
+    g_return_if_fail (t_pl);
+    g_return_if_fail (t_pl->itdb);
+
+    mpl = itdb_playlist_mpl (t_pl->itdb);
+    g_return_if_fail(mpl);
+
+    if (tracks)
+    {
+       first = tracks->data;
+       g_return_if_fail (first);
+       addtracks = export_trackglist_when_necessary (first->itdb, t_pl->itdb, 
tracks);
+       add_trackglist_to_playlist (t_pl, addtracks);
+    }
+    n = g_list_length (addtracks);
+    gtkpod_statusbar_message (ngettext ("Copied %d track to '%s' in '%s'",
+                                       "Copied %d tracks to %s in '%s'", n),
+                             n, t_pl->name, mpl->name);
+    g_list_free (addtracks);
+    addtracks = NULL;
+}
+
+
+
+static void copy_selected_to_target_itdb (GtkMenuItem *mi, gpointer *userdata)
+{
+    iTunesDB *t_itdb = *userdata;
+    g_return_if_fail (t_itdb);
+    if (selected_playlist)
+       copy_playlist_to_target_itdb (selected_playlist, t_itdb);
+    else if (selected_entry)
+       copy_tracks_to_target_itdb (selected_entry->members, t_itdb);
+    else if (selected_tracks)
+       copy_tracks_to_target_itdb (selected_tracks, t_itdb);
+}
+
+
+static void copy_selected_to_target_playlist (GtkMenuItem *mi, gpointer 
*userdata)
+{
+    Playlist *t_pl = *userdata;
+    g_return_if_fail (t_pl);
+    if (selected_playlist)
+       copy_playlist_to_target_playlist (selected_playlist, t_pl);
+    else if (selected_entry)
+       copy_tracks_to_target_playlist (selected_entry->members, t_pl);
+    else if (selected_tracks)
+       copy_tracks_to_target_playlist (selected_tracks, t_pl);
+}
+
+
 /* Attach a menu item to your context menu */
 /* @m - the GtkMenu we're attaching to
  * @str - a gchar* with the menu label
@@ -321,7 +486,11 @@
  * @func - the callback for when the item is selected (or NULL)
  * @mi - the GtkWidget we're gonna hook into the menu
  */
-GtkWidget *hookup_mi (GtkWidget *m, gchar *str, gchar *stock, GCallback func, 
gpointer userdata)
+GtkWidget *hookup_mi (GtkWidget *m,
+                     const gchar *str,
+                     const gchar *stock,
+                     GCallback func,
+                     gpointer userdata)
 {
     GtkWidget *mi;
 
@@ -362,6 +531,77 @@
 }
 
 
+static GtkWidget *add_copy_selected_to_target_itdb (GtkWidget *menu,
+                                                   const gchar *title)
+{
+    GtkWidget *mi;
+    GtkWidget *sub;
+    GtkWidget *pl_mi;
+    GtkWidget *pl_sub;
+    GList *itdbs;
+    GList *db;
+    struct itdbs_head *itdbs_head;
+    iTunesDB *itdb;
+    gchar *stock_id = NULL;
+    Playlist *pl;
+
+  
+    g_return_val_if_fail (gtkpod_window, NULL);
+    itdbs_head = g_object_get_data (G_OBJECT (gtkpod_window),
+                                    "itdbs_head");
+
+    mi = hookup_mi (menu, title,
+                   GTK_STOCK_COPY,
+                   NULL, NULL);
+    sub = gtk_menu_new ();
+    gtk_widget_show (sub);
+    gtk_menu_item_set_submenu (GTK_MENU_ITEM (mi), sub);
+
+    for (itdbs=itdbs_head->itdbs; itdbs; itdbs=itdbs->next)
+           {
+               itdb = itdbs->data;
+               ExtraiTunesDBData *eitdb=itdb->userdata;
+               if (itdb->usertype & GP_ITDB_TYPE_LOCAL)
+               {
+                       stock_id = GTK_STOCK_HARDDISK;
+               }
+               else
+               {
+                   if (eitdb->itdb_imported)
+                   {
+                       stock_id = GTK_STOCK_CONNECT;
+                   }
+                   else
+                   {
+                       stock_id = GTK_STOCK_DISCONNECT;
+                   }
+               }
+               pl_mi = hookup_mi (sub, _(itdb_playlist_mpl(itdb)->name),
+                                  stock_id, NULL, NULL);
+               pl_sub = gtk_menu_new ();
+               gtk_widget_show (pl_sub);
+               gtk_menu_item_set_submenu (GTK_MENU_ITEM (pl_mi), pl_sub);
+               hookup_mi (pl_sub, _(itdb_playlist_mpl(itdb)->name),
+                          stock_id, G_CALLBACK(copy_selected_to_target_itdb), 
&itdbs->data);
+               add_separator(pl_sub);
+               for (db=itdb->playlists; db; db=db->next)
+               {
+                       pl=db->data;
+                       if (!itdb_playlist_is_mpl (pl))
+                       {
+                               if (pl->is_spl)
+                                       stock_id = GTK_STOCK_PROPERTIES;
+                               else
+                                       stock_id = GTK_STOCK_JUSTIFY_LEFT;
+                               hookup_mi(pl_sub, _(pl->name), stock_id, 
+                               G_CALLBACK(copy_selected_to_target_playlist) , 
&db->data);
+                       }
+               }
+           }
+    return mi;
+}
+
+
 static GtkWidget *add_play_now (GtkWidget *menu)
 {
     return hookup_mi (menu, _("Play Now"), GTK_STOCK_CDROM,
@@ -658,6 +898,8 @@
                        add_delete_including_tracks (menu);
                        add_delete_but_keep_tracks (menu);
                    }
+                   add_copy_selected_to_target_itdb (menu,
+                                                     _("Copy selected playlist 
to..."));
                    add_separator (menu);
                    add_edit_track_details (menu);
                    if (pl->is_spl)
@@ -705,6 +947,8 @@
                    add_delete_including_tracks_harddisk (menu);
                    add_delete_but_keep_tracks (menu);
                }
+               add_copy_selected_to_target_itdb (menu,
+                                                 _("Copy selected playlist 
to..."));
                add_separator (menu);
                add_edit_track_details (menu);
                if (pl->is_spl)
@@ -756,6 +1000,8 @@
                    add_delete_from_playlist (menu);
                }
            }
+           add_copy_selected_to_target_itdb (menu,
+                                             _("Copy selected track(s) 
to..."));
            add_separator (menu);
            add_edit_track_details (menu);
 #if LOCALDEBUG


-------------------------------------------------------------------------
Take Surveys. Earn Cash. Influence the Future of IT
Join SourceForge.net's Techsay panel and you'll get the chance to share your
opinions on IT & business topics through brief surveys-and earn cash
http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
_______________________________________________
gtkpod-cvs2 mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/gtkpod-cvs2

Reply via email to