Revision: 1696
          http://gtkpod.svn.sourceforge.net/gtkpod/?rev=1696&view=rev
Author:   phantom_sf
Date:     2007-09-16 11:19:50 -0700 (Sun, 16 Sep 2007)

Log Message:
-----------
- cleanup of function names
- implementation of dnd between image view and album view, ie. drag and image 
onto a different album
  in the album list to move the image to it.

Modified Paths:
--------------
    gtkpod/branches/photo_support_branch/src/display_photo.c
    gtkpod/branches/photo_support_branch/src/display_photo.h
    gtkpod/branches/photo_support_branch/src/display_playlists.c
    gtkpod/branches/photo_support_branch/src/file_itunesdb.c
    gtkpod/branches/photo_support_branch/src/misc.c
    gtkpod/branches/photo_support_branch/src/misc.h

Modified: gtkpod/branches/photo_support_branch/src/display_photo.c
===================================================================
--- gtkpod/branches/photo_support_branch/src/display_photo.c    2007-09-15 
15:33:37 UTC (rev 1695)
+++ gtkpod/branches/photo_support_branch/src/display_photo.c    2007-09-16 
18:19:50 UTC (rev 1696)
@@ -64,30 +64,47 @@
 static GtkMenuItem *photo_remove_album_menuItem= NULL;
 static GtkMenuItem *photo_remove_image_menuItem= NULL;
 
+/* Drag n Drop Definitions */
+static GtkTargetEntry photo_drag_types [] = {
+               { DND_GTKPOD_PHOTOIMAGELIST_TYPE, 0, DND_GTKPOD_PHOTOIMAGELIST 
},
+               { "text/plain", 0, DND_TEXT_PLAIN },
+               { "STRING", 0, DND_TEXT_PLAIN }
+};
+
+static GtkTargetEntry photo_drop_types [] = {
+               { DND_GTKPOD_PHOTOIMAGELIST_TYPE, 0, DND_GTKPOD_PHOTOIMAGELIST 
},
+               { "text/plain", 0, DND_TEXT_PLAIN },
+               { "STRING", 0, DND_TEXT_PLAIN }
+};
+
 /* Declarations */
-static void gp_create_albumview();
-static void gp_create_thumbnailview();
-static void gp_build_thumbnail_model(gchar *album_name);
-static void gp_album_selection_changed(GtkTreeSelection *selection, gpointer 
user_data);
-static void gp_thumb_selection_changed(GtkIconView *iconview, gpointer 
user_data);
-static void gp_display_photo_preview(Artwork *artwork);
+static void gphoto_create_albumview();
+static void gphoto_create_thumbnailview();
+static void gphoto_build_thumbnail_model(gchar *album_name);
+static void gphoto_album_selection_changed(GtkTreeSelection *selection, 
gpointer user_data);
+static void gphoto_thumb_selection_changed(GtkIconView *iconview, gpointer 
user_data);
+static void gphoto_display_photo_preview(Artwork *artwork);
 void on_photodb_add_album_menuItem_activate(GtkMenuItem *menuItem, gpointer 
user_data);
 void on_photodb_add_image_menuItem_activate(GtkMenuItem *menuItem, gpointer 
user_data);
 void on_photodb_add_image_dir_menuItem_activate(GtkMenuItem *menuItem, 
gpointer user_data);
-void on_photodb_remove_album_menuItem_activate (GtkMenuItem *menuItem, 
gpointer user_data);
-void on_photodb_remove_image_menuItem_activate (GtkMenuItem *menuItem, 
gpointer user_data);
+void on_photodb_remove_album_menuItem_activate(GtkMenuItem *menuItem, gpointer 
user_data);
+void on_photodb_remove_image_menuItem_activate(GtkMenuItem *menuItem, gpointer 
user_data);
 static void signal_data_changed();
-static gchar *get_selected_album_name();
-static void gp_add_image_to_database(gchar *photo_filename);
-static void gp_remove_album_from_database();
-static void gp_add_image_to_iconview(Artwork *photo, gint index);
-static void gp_remove_photo_from_album();
-static gboolean gp_photodb_button_press(GtkWidget *w, GdkEventButton *e, 
gpointer data);
+static gchar *gphoto_get_selected_album_name();
+static void gphoto_add_image_to_database(gchar *photo_filename);
+static void gphoto_remove_album_from_database ();
+static void gphoto_add_image_to_iconview(Artwork *photo, gint index);
+static void gphoto_remove_selected_photos_from_album (gboolean show_dialogs);
+static gboolean gphoto_button_press(GtkWidget *w, GdkEventButton *e, gpointer 
data);
 /* Create popup menu */
-static void create_context_menu(gint view_component);
+static void gphoto_create_context_menu(gint view_component);
 /* Menu Items displayed in popup menu */
-static GtkWidget *add_remove_album_from_db_item(GtkWidget *menu);
-static GtkWidget *add_remove_photo_from_album_item(GtkWidget *menu);
+static GtkWidget *gphoto_menuitem_remove_album_from_db_item(GtkWidget *menu);
+static GtkWidget *gphoto_menuitem_remove_photo_from_album_item(GtkWidget 
*menu);
+/* DnD */
+static gboolean dnd_album_drag_drop(GtkWidget *widget, GdkDragContext 
*drag_context, gint x, gint y, guint time, gpointer user_data);
+static void dnd_album_drag_data_received(GtkWidget *widget, GdkDragContext 
*dc, gint x, gint y, GtkSelectionData *data, guint info, guint time, gpointer 
user_data);
+static void dnd_images_drag_data_get(GtkWidget *widget, GdkDragContext *dc, 
GtkSelectionData *data, guint info, guint time, gpointer user_data);
 
 enum
 {
@@ -151,7 +168,7 @@
 }
 
 /**
- * gp_photodb_load_photodb:
+ * gphoto_load_photodb:
  *
  * Using the info in the provided itunes db, load the photo db
  * from the ipod if there is one present. Reference it in the
@@ -160,7 +177,7 @@
  * @ itdb: itunes database
  * 
  */
-void gp_photodb_load_photodb(iTunesDB *itdb)
+void gphoto_load_photodb(iTunesDB *itdb)
 {
        ExtraiTunesDBData *eitdb;
        PhotoDB *db;
@@ -190,11 +207,11 @@
 
        /* Set the reference to the photo database */
        eitdb->photodb = db;
-       printf ("Reference to photo db successfully set\n");
+       /*printf ("Reference to photo db successfully set\n");*/
 }
 
 /**
- * gp_photodb_ipod_supports_photos
+ * gphoto_ipod_supports_photos
  *
  * Convenience function that passes onto libgpod and requests
  * whether the ipod has photo support
@@ -202,20 +219,20 @@
  * Returns:
  * true/false whether the ipod has photo support
  */
-gboolean gp_photodb_ipod_supports_photos(iTunesDB *itdb)
+gboolean gphoto_ipod_supports_photos(iTunesDB *itdb)
 {
-       printf ("Checking ipod has photo support: ");
        gboolean status =itdb_device_supports_photo (itdb->device);
+/*
        if (status)
                printf ("device supports photos\n");
        else
                printf ("photos not supported\n");
-
+*/
        return status;
 }
 
 /**
- * gp_photodb_is_photo_playlist
+ * gphoto_is_photo_playlist
  *
  * Convenience function that determines whether the
  * playlist is the photo playlist.
@@ -225,13 +242,13 @@
  * Returns:
  * true/false whether the playlist is the photo playlist
  */
-gboolean gp_photodb_is_photo_playlist(Playlist *pl)
+gboolean gphoto_is_photo_playlist(Playlist *pl)
 {
        return pl->type == GP_PL_TYPE_PHOTO;
 }
 
 /**
- * gp_photodb_display_photo_window
+ * gphoto_display_photo_window
  *
  * When the photo playlist is clicked on, it hands off to this
  * function which changes the entire display to the photo
@@ -239,7 +256,7 @@
  * 
  * @itdb: itunes db associated with the photo playlist clicked on
  */
-void gp_photodb_display_photo_window(iTunesDB *itdb)
+void gphoto_display_photo_window(iTunesDB *itdb)
 {
        ExtraiTunesDBData *eitdb;
 
@@ -257,24 +274,24 @@
                return;
        }
 
-       gp_photodb_change_to_photo_window (TRUE);
+       gphoto_change_to_photo_window (TRUE);
 
-       gp_create_albumview ();
-       gp_create_thumbnailview ();
+       gphoto_create_albumview ();
+       gphoto_create_thumbnailview ();
 
        if (eitdb->photo_data_changed != TRUE)
                eitdb->photo_data_changed = FALSE;
 }
 
 /**
- * gp_photodb_change_to_photo_window
+ * gphoto_change_to_photo_window
  *
  * When the photo playlist is NOT clicked on;
  * this changes the entire display back to original
  * rather than the photo window.
  * 
  */
-void gp_photodb_change_to_photo_window(gboolean showflag)
+void gphoto_change_to_photo_window(gboolean showflag)
 {
        GtkWidget *paned1 = gtkpod_xml_get_widget (main_window_xml, "paned1");
        GtkWidget *downbutton = gtkpod_xml_get_widget (main_window_xml, 
"cover_down_button");
@@ -370,8 +387,7 @@
                NULL);
                g_signal_connect (G_OBJECT(photo_remove_image_menuItem), 
"activate", G_CALLBACK(on_photodb_remove_image_menuItem_activate), 
                NULL);
-       } 
-       else
+       } else
        {
                if (!GTK_WIDGET_VISIBLE (paned1))
                {
@@ -417,7 +433,7 @@
 }
 
 /* Create album listview */
-static void gp_create_albumview()
+static void gphoto_create_albumview()
 {
        GtkListStore *model;
        GtkTreeSelection *selection;
@@ -471,17 +487,35 @@
 
        /* function to be enacted when the album is changed */
        selection = gtk_tree_view_get_selection (album_view);
-       g_signal_connect (G_OBJECT (selection), "changed", G_CALLBACK 
(gp_album_selection_changed), 
+       g_signal_connect (G_OBJECT (selection), "changed", G_CALLBACK 
(gphoto_album_selection_changed), 
        NULL);
 
-       g_signal_connect (G_OBJECT (album_view), "button-press-event", 
G_CALLBACK (gp_photodb_button_press), (gpointer) ALBUM_VIEW);
+       g_signal_connect (G_OBJECT (album_view), "button-press-event", 
G_CALLBACK (gphoto_button_press), (gpointer) ALBUM_VIEW);
 
-       /* Disable the remove album menu item until an album is selected */ 
+       /* Disable the remove album menu item until an album is selected */
        gtk_widget_set_sensitive (GTK_WIDGET(photo_remove_album_menuItem), 
FALSE);
+
+       /* Dnd destinaton for album view */
+       gtk_drag_dest_set (
+                       GTK_WIDGET (album_view), 
+                       GTK_DEST_DEFAULT_MOTION | GTK_DEST_DEFAULT_HIGHLIGHT, 
+                       photo_drop_types, 
+                       TGNR (photo_drop_types), 
+                       GDK_ACTION_COPY|GDK_ACTION_MOVE);
+
+       g_signal_connect ((gpointer) album_view, "drag-drop",
+                       G_CALLBACK (dnd_album_drag_drop), 
+                       NULL);
+       
+       g_signal_connect ((gpointer) album_view, "drag-data-received",
+                       G_CALLBACK (dnd_album_drag_data_received), 
+                       NULL);
+
+
 }
 
 /* Create thumbnail view */
-static void gp_create_thumbnailview()
+static void gphoto_create_thumbnailview()
 {
        /* destroy old listview */
        if (thumbnail_view)
@@ -497,16 +531,28 @@
        if (!GTK_WIDGET_REALIZED(thumbnail_view))
                gtk_widget_set_events (GTK_WIDGET(thumbnail_view), 
GDK_KEY_PRESS_MASK);
 
-       gp_build_thumbnail_model (NULL);
+       gphoto_build_thumbnail_model (NULL);
 
        gtk_container_add (GTK_CONTAINER (photo_thumb_window), 
GTK_WIDGET(thumbnail_view));
        gtk_widget_show_all (photo_thumb_window);
 
-       g_signal_connect (G_OBJECT (thumbnail_view), "button-press-event", 
G_CALLBACK (gp_photodb_button_press), (gpointer) ICON_VIEW);
+       g_signal_connect (G_OBJECT (thumbnail_view), "button-press-event", 
G_CALLBACK (gphoto_button_press), (gpointer) ICON_VIEW);
+
+       /* DnD */
+       gtk_drag_source_set (
+                       GTK_WIDGET (thumbnail_view),
+                       GDK_BUTTON1_MASK,
+                       photo_drag_types, 
+                       TGNR (photo_drag_types),
+                       GDK_ACTION_COPY|GDK_ACTION_MOVE);
+
+       g_signal_connect ((gpointer) thumbnail_view, "drag-data-get", 
+                       G_CALLBACK (dnd_images_drag_data_get), 
+                       NULL);
 }
 
 /* Build the thumbnail model */
-static void gp_build_thumbnail_model(gchar *album_name)
+static void gphoto_build_thumbnail_model(gchar *album_name)
 {
        GtkListStore *model;
        PhotoAlbum *album;
@@ -532,11 +578,11 @@
                Artwork *photo = g_list_nth_data (photos, i);
                g_return_if_fail (photo);
 
-               gp_add_image_to_iconview (photo, (i + 1));
+               gphoto_add_image_to_iconview (photo, (i + 1));
 
                /* On creation of the model, place the first image into the 
preview pane */
                if (i == 0)
-                       gp_display_photo_preview (photo);
+                       gphoto_display_photo_preview (photo);
        }
 
        gtk_icon_view_set_pixbuf_column (thumbnail_view, 0);
@@ -546,32 +592,32 @@
        gtk_icon_view_set_item_width(thumbnail_view, -1); // let the model 
decide how wide
 
        /* function to be enacted when the thumbnail is changed */
-       g_signal_connect (thumbnail_view, "selection-changed", G_CALLBACK 
(gp_thumb_selection_changed), 
+       g_signal_connect (thumbnail_view, "selection-changed", G_CALLBACK 
(gphoto_thumb_selection_changed), 
        NULL);
-       
-       /* Disable the remove image menu item until an image is selected */ 
-               gtk_widget_set_sensitive 
(GTK_WIDGET(photo_remove_image_menuItem), FALSE);
+
+       /* Disable the remove image menu item until an image is selected */
+       gtk_widget_set_sensitive (GTK_WIDGET(photo_remove_image_menuItem), 
FALSE);
 }
 
 /* Callback when the selection of the album is changed */
-static void gp_album_selection_changed(GtkTreeSelection *selection, gpointer 
user_data)
+static void gphoto_album_selection_changed(GtkTreeSelection *selection, 
gpointer user_data)
 {
        gchar *album_name= NULL;
 
-       album_name = get_selected_album_name (selection);
+       album_name = gphoto_get_selected_album_name (selection);
 
        /* if album_name returns NULL then it merely selects the default Photo 
Library */
-       gp_build_thumbnail_model (album_name);
-       
+       gphoto_build_thumbnail_model (album_name);
+
        if (album_name != NULL)
        {
-               /* Enable the remove album menu item now that one is selected 
*/ 
+               /* Enable the remove album menu item now that one is selected */
                gtk_widget_set_sensitive 
(GTK_WIDGET(photo_remove_album_menuItem), TRUE);
        }
 }
 
 /* Callback when the selection of a thumbnail image is changed */
-static void gp_thumb_selection_changed(GtkIconView *iconview, gpointer 
user_data)
+static void gphoto_thumb_selection_changed(GtkIconView *iconview, gpointer 
user_data)
 {
        GtkTreeModel *model;
        GtkTreeIter iter;
@@ -587,14 +633,14 @@
        gtk_tree_model_get_iter (model, &iter, selected_items->data);
        gtk_tree_model_get (model, &iter, COL_THUMB_ARTWORK, &artwork, -1);
        g_return_if_fail (artwork);
-       gp_display_photo_preview (artwork);
-       
-       /* Enable the remove image menu item until an album is selected */ 
+       gphoto_display_photo_preview (artwork);
+
+       /* Enable the remove image menu item until an album is selected */
        gtk_widget_set_sensitive (GTK_WIDGET(photo_remove_image_menuItem), 
TRUE);
 }
 
 /* Display the selected thumbnail image in the preview window */
-static void gp_display_photo_preview(Artwork *artwork)
+static void gphoto_display_photo_preview(Artwork *artwork)
 {
        Thumb *thumb;
        GdkPixbuf *pixbuf, *scaled;
@@ -658,7 +704,7 @@
  * Returns:
  * string value representing the album name selected
  */
-static gchar *get_selected_album_name(GtkTreeSelection *selection)
+static gchar *gphoto_get_selected_album_name(GtkTreeSelection *selection)
 {
        gchar *album_name= NULL;
        GtkTreeModel *album_model;
@@ -676,7 +722,7 @@
 }
 
 /**
- * gp_add_image_to_database
+ * gphoto_add_image_to_database
  *
  * Add a photo from file name to the photo database and
  * hence to the gui. If an album is selected other than the
@@ -685,7 +731,7 @@
  * @ photo_filename: gchar *
  * 
  */
-static void gp_add_image_to_database(gchar *photo_filename)
+static void gphoto_add_image_to_database(gchar *photo_filename)
 {
        gchar *album_name= NULL;
        PhotoAlbum *selected_album;
@@ -710,7 +756,7 @@
        }
 
        /* Add the image to the selected album if there is one selected */
-       album_name= get_selected_album_name (gtk_tree_view_get_selection 
(album_view));
+       album_name= gphoto_get_selected_album_name (gtk_tree_view_get_selection 
(album_view));
 
        /* Find the selected album. If no selection then returns the Main Album 
*/
        selected_album = itdb_photodb_photoalbum_by_name (photodb, album_name);
@@ -724,20 +770,20 @@
                itdb_photodb_photoalbum_add_photo (photodb, selected_album, 
image, -1);
        }
 
-       gp_add_image_to_iconview (image, g_list_length 
(selected_album->members));
+       gphoto_add_image_to_iconview (image, g_list_length 
(selected_album->members));
 
        signal_data_changed ();
 }
 
 /**
- * gp_add_image_to_iconview
+ * gphoto_add_image_to_iconview
  *
  * Add an Artwork image to the icon_view
  * 
  * @ photo: Artwork
  * 
  */
-static void gp_add_image_to_iconview(Artwork *photo, gint index)
+static void gphoto_add_image_to_iconview(Artwork *photo, gint index)
 {
        GdkPixbuf *pixbuf= NULL;
        Thumb *thumb= NULL;
@@ -764,12 +810,12 @@
 }
 
 /**
- * gp_remove_album_from_database
+ * gphoto_remove_album_from_database
  *
  * Remove the selected album from the photo database and the view
  * 
  */
-static void gp_remove_album_from_database()
+static void gphoto_remove_album_from_database()
 {
        GtkTreeModel *album_model;
        GtkTreeIter iter;
@@ -782,9 +828,10 @@
                return;
 
        if (gtk_tree_selection_get_selected (curr_selection, &album_model, 
&iter) == TRUE)
-       { /* handle new selection */
                gtk_tree_model_get (album_model, &iter, COL_ALBUM_NAME, 
&album_name, -1);
-       }
+       else
+               return;
+       
        g_return_if_fail (album_name);
 
        /* Find the selected album. If no selection then returns the Main Album 
*/
@@ -804,10 +851,10 @@
                gint result;
                GtkWindow *parent = GTK_WINDOW (gtkpod_xml_get_widget 
(main_window_xml, "gtkpod"));
                GtkWidget *dialog = gtk_message_dialog_new (parent,
-                                                                               
GTK_DIALOG_DESTROY_WITH_PARENT,
-                                                                               
GTK_MESSAGE_QUESTION,
-                                                                               
GTK_BUTTONS_YES_NO,
-                                                                               
_("Do you want to remove the album's photos too?"));
+                               GTK_DIALOG_DESTROY_WITH_PARENT,
+                               GTK_MESSAGE_QUESTION,
+                               GTK_BUTTONS_YES_NO,
+                               _("Do you want to remove the album's photos 
too?"));
 
                result = gtk_dialog_run (GTK_DIALOG (dialog));
                gtk_widget_destroy (dialog);
@@ -821,6 +868,7 @@
                                break;
                }
        }
+       album_model = gtk_tree_view_get_model (album_view);
        gtk_list_store_remove (GTK_LIST_STORE(album_model), &iter);
 
        itdb_photodb_photoalbum_remove (photodb, selected_album, remove_pics);
@@ -828,18 +876,18 @@
        g_free (album_name);
 
        /* Display the default Photo Library */
-       gp_build_thumbnail_model (NULL);
+       gphoto_build_thumbnail_model (NULL);
 
        signal_data_changed ();
 }
 
 /**
- * gp_remove_image_from_album
+ * gphoto_remove_image_from_album
  *
  * Remove the selected image from the album
  * 
  */
-static void gp_remove_photo_from_album()
+static void gphoto_remove_selected_photos_from_album (gboolean show_dialogs)
 {
        GList *selected_images;
        GtkTreeModel *thumbnail_model;
@@ -855,7 +903,7 @@
                return;
 
        /* Find which album is selected if any */
-       album_name = get_selected_album_name (gtk_tree_view_get_selection 
(album_view));
+       album_name = gphoto_get_selected_album_name 
(gtk_tree_view_get_selection (album_view));
 
        selected_album = itdb_photodb_photoalbum_by_name (photodb, album_name);
        GtkWindow *parent = GTK_WINDOW (gtkpod_xml_get_widget (main_window_xml, 
"gtkpod"));
@@ -863,14 +911,17 @@
        gchar *message;
        if (selected_album != NULL&& selected_album->album_type != 0x01)
                message
-                                                                               
= _("The photo selection will be removed from the selected album.\nTo remove 
the photo from the database, remove it from the Photo Library album.");
+                               = _("The photo selection will be removed from 
the selected album.\nTo remove the photo from the database, remove it from the 
Photo Library album.");
        else
                message = _("The photo selection will be deleted from the Photo 
Library album");
 
-       GtkWidget *dialog = gtk_message_dialog_new (parent, 
GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_INFO, GTK_BUTTONS_OK, message);
-       gtk_dialog_run (GTK_DIALOG (dialog));
-       gtk_widget_destroy (dialog);
-
+       if (show_dialogs)
+       {
+               GtkWidget *dialog = gtk_message_dialog_new (parent, 
GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_INFO, GTK_BUTTONS_OK, message);
+               gtk_dialog_run (GTK_DIALOG (dialog));
+               gtk_widget_destroy (dialog);
+       }
+       
        thumbnail_model = gtk_icon_view_get_model (thumbnail_view);
        for (i = 0; i < g_list_length (selected_images); ++i)
        {
@@ -890,14 +941,14 @@
 /* When right mouse button is pressed on one of the widgets,
  * a popup menu is displayed.
  */
-static gboolean gp_photodb_button_press(GtkWidget *w, GdkEventButton *e, 
gpointer data)
+static gboolean gphoto_button_press(GtkWidget *w, GdkEventButton *e, gpointer 
data)
 {
        g_return_val_if_fail (w && e, FALSE);
        switch (e->button)
        {
                case 3:
                        printf ("Button press has occurred\n");
-                       create_context_menu ((gint) data);
+                       gphoto_create_context_menu ((gint) data);
                        return TRUE;
                default:
                        break;
@@ -906,7 +957,7 @@
 }
 
 /* create the popup menu for one of the three widgets */
-static void create_context_menu(gint view_component)
+static void gphoto_create_context_menu(gint view_component)
 {
        static GtkWidget *menu= NULL;
 
@@ -921,10 +972,10 @@
        switch (view_component)
        {
                case ALBUM_VIEW:
-                       add_remove_album_from_db_item (menu);
+                       gphoto_menuitem_remove_album_from_db_item (menu);
                        break;
                case ICON_VIEW:
-                       add_remove_photo_from_album_item (menu);
+                       gphoto_menuitem_remove_photo_from_album_item (menu);
                        break;
                case PREVIEW:
 
@@ -938,16 +989,18 @@
        }
 }
 
-static GtkWidget *add_remove_album_from_db_item(GtkWidget *menu)
+static GtkWidget *gphoto_menuitem_remove_album_from_db_item(GtkWidget *menu)
 {
-       return hookup_mi (menu, _("Remove Album"), GTK_STOCK_DELETE, G_CALLBACK 
(gp_remove_album_from_database), 
+       return hookup_mi (menu, _("Remove Album"), GTK_STOCK_DELETE, G_CALLBACK 
(gphoto_remove_album_from_database), 
        NULL);
 }
 
-static GtkWidget *add_remove_photo_from_album_item(GtkWidget *menu)
+static GtkWidget *gphoto_menuitem_remove_photo_from_album_item(GtkWidget *menu)
 {
-       return hookup_mi (menu, _("Remove Photo"), GTK_STOCK_DELETE, G_CALLBACK 
(gp_remove_photo_from_album), 
-       NULL);
+       return hookup_mi (menu, 
+                       _("Remove Photo"), GTK_STOCK_DELETE, 
+                       G_CALLBACK (gphoto_remove_selected_photos_from_album), 
+                       TRUE);
 }
 
 /* Callbacks for the menu items in the photo window */
@@ -962,7 +1015,7 @@
        NULL, 
        NULL);
 
-       if (album_name == NULL || strlen (album_name) == 0)
+       if (album_name == NULL|| strlen (album_name) == 0)
                return;
 
        /* Check an album with this name doesnt already exist */
@@ -999,7 +1052,7 @@
        if (image_name == NULL)
                return;
 
-       gp_add_image_to_database (image_name);
+       gphoto_add_image_to_database (image_name);
 
        g_free (image_name);
 }
@@ -1056,7 +1109,7 @@
                        fileformat = gdk_pixbuf_get_file_info (full_filename, 
NULL, NULL);
                        if (fileformat != NULL)
                        {
-                               gp_add_image_to_database (full_filename);
+                               gphoto_add_image_to_database (full_filename);
                        }
                        g_free (full_filename);
                }
@@ -1066,12 +1119,176 @@
        g_free(dir_name);
 }
 
-void on_photodb_remove_album_menuItem_activate (GtkMenuItem *menuItem, 
gpointer user_data)
+void on_photodb_remove_album_menuItem_activate(GtkMenuItem *menuItem, gpointer 
user_data)
 {
-       gp_remove_album_from_database ();
+       gphoto_remove_album_from_database ();
 }
 
-void on_photodb_remove_image_menuItem_activate (GtkMenuItem *menuItem, 
gpointer user_data)
+void on_photodb_remove_image_menuItem_activate(GtkMenuItem *menuItem, gpointer 
user_data)
 {
-       gp_remove_photo_from_album ();
+       gphoto_remove_selected_photos_from_album (TRUE);
 }
+
+/* -----------------------------------------------------------*/
+/* Section for album display                                  */
+/* drag and drop                                                   */
+/* -----------------------------------------------------------*/
+
+/* remove dragged playlist after successful MOVE */
+
+static gboolean dnd_album_drag_drop(GtkWidget *widget, GdkDragContext 
*drag_context, gint x, gint y, guint time, gpointer user_data)
+{
+       GdkAtom target;
+       target = gtk_drag_dest_find_target (widget, drag_context, NULL);
+
+       if (target != GDK_NONE)
+       {
+               gboolean rowfound;
+               
+               /* determine whether a row has been dropped over in album view 
*/
+               rowfound = gtk_tree_view_get_dest_row_at_pos 
(GTK_TREE_VIEW(widget), x, y, NULL, NULL);
+               if (rowfound == TRUE)
+               {
+                       gtk_drag_get_data (widget, drag_context, target, time);
+                       return TRUE;
+               }
+               else
+                       return FALSE;
+       }
+       return FALSE;
+}
+
+static void dnd_images_drag_data_get(GtkWidget *widget, GdkDragContext *dc, 
GtkSelectionData *data, guint info, guint time,
+               gpointer user_data)
+{
+       GtkTreeModel *model;
+       GList *selected_images;
+       gint i;
+       
+       if (!data)
+               return;
+
+       /* Find which images are selected */
+       selected_images = gtk_icon_view_get_selected_items 
(GTK_ICON_VIEW(widget));
+       if (selected_images == NULL|| g_list_length (selected_images) == 0)
+               return;
+
+       model = gtk_icon_view_get_model (GTK_ICON_VIEW(widget));
+       
+       GtkTreePath *treePath = NULL;
+       GtkTreeIter iter;
+       Artwork *artwork = NULL;
+       GString *reply = g_string_sized_new (2000);
+                               
+       for (i = 0; i < g_list_length(selected_images); ++i)
+       {
+               treePath = g_list_nth_data (selected_images, i);
+               gtk_tree_model_get_iter (model, &iter, treePath);
+               gtk_tree_model_get (model, &iter, COL_THUMB_ARTWORK, &artwork, 
-1);
+               g_string_append_printf (reply, "%p\n", artwork);
+       }
+       
+       switch (info)
+       {
+               case DND_GTKPOD_PHOTOIMAGELIST:
+                       gtk_selection_data_set(data, data->target, 8, 
reply->str, reply->len);
+                       g_string_free (reply, TRUE);
+                       break;
+               default:
+                       g_warning ("Programming error: pm_drag_data_get 
received unknown info type (%d)\n", info);
+                       break;
+       }
+}
+
+static void dnd_album_drag_data_received(GtkWidget *widget, GdkDragContext 
*dc, gint x, gint y, GtkSelectionData *data, guint info,
+               guint time, gpointer user_data)
+{
+       g_return_if_fail (widget);
+       g_return_if_fail (dc);
+       g_return_if_fail (data);
+       g_return_if_fail (data->length > 0);
+       g_return_if_fail (data->data);
+       g_return_if_fail (data->format == 8);
+
+       gboolean rowfound;
+       GtkTreePath *treepath;
+       GtkTreeModel *model;
+       GtkTreeIter iter;
+       gchar *tgt_name;
+       gchar *src_name;
+       PhotoAlbum *tgt_album;
+       PhotoAlbum *src_album;
+       
+       /* determine whether a row has been dropped over in album view */
+       rowfound = gtk_tree_view_get_dest_row_at_pos (GTK_TREE_VIEW(widget), x, 
y, &treepath, NULL);
+       if (! rowfound)
+       {
+               gtk_drag_finish (dc, FALSE, FALSE, time);
+               return;
+       }
+       
+       g_return_if_fail (treepath);
+       
+       model = gtk_tree_view_get_model (GTK_TREE_VIEW(widget));
+       
+       /* Find the target album to drop the artwork into */
+       if(gtk_tree_model_get_iter (model, &iter, treepath))
+               gtk_tree_model_get (model, &iter, COL_ALBUM_NAME, &tgt_name, 
-1);
+       
+       gtk_tree_path_free (treepath);
+       treepath = NULL;
+       g_return_if_fail (tgt_name);
+       
+       tgt_album = itdb_photodb_photoalbum_by_name (photodb, tgt_name);
+       g_return_if_fail (tgt_album);
+       if (tgt_name != NULL)
+               g_free (tgt_name);
+       
+       /* Find the selected album, ie. the source, or else the Photo Library 
if no selection */
+       GtkTreeSelection *selection = NULL;
+       selection = gtk_tree_view_get_selection (GTK_TREE_VIEW(widget));
+       if (selection != NULL)
+               src_name = gphoto_get_selected_album_name (selection);
+       else
+               src_name = NULL;
+       
+       /* Find the selected album. If no selection then returns the Photo 
Library */
+       src_album = itdb_photodb_photoalbum_by_name (photodb, src_name);
+       g_return_if_fail (src_album);
+       if (src_name != NULL)
+               g_free (src_name);
+       
+       if (src_album == tgt_album)
+       {
+               gtk_drag_finish (dc, FALSE, FALSE, time);
+               return;
+       }
+       
+       Artwork *artwork;
+       GList *artwork_list = NULL;
+       gchar *datap = data->data;
+       gint i = 0;
+       
+       /* parse artwork and add each one to a GList */
+       while (parse_artwork_from_string (&datap, &artwork))
+               artwork_list = g_list_append (artwork_list, artwork);
+                           
+       if (tgt_album->album_type != 0x01)
+       {
+               /* Only if the target is not the Photo Library (which should 
have the photo
+                * already) should the artwork be added to the album
+                */
+               for (i = 0; i < g_list_length (artwork_list); ++i)
+               {
+                       artwork = g_list_nth_data (artwork_list, i);
+                       itdb_photodb_photoalbum_add_photo (photodb, tgt_album, 
artwork, -1);
+               }
+       }
+       
+       /* Remove the artwork from the selected album if it is not the Photo 
Library */ 
+       if (src_album->album_type != 0x01)
+               gphoto_remove_selected_photos_from_album (FALSE);
+       
+       signal_data_changed ();
+}
+       

Modified: gtkpod/branches/photo_support_branch/src/display_photo.h
===================================================================
--- gtkpod/branches/photo_support_branch/src/display_photo.h    2007-09-15 
15:33:37 UTC (rev 1695)
+++ gtkpod/branches/photo_support_branch/src/display_photo.h    2007-09-16 
18:19:50 UTC (rev 1696)
@@ -45,12 +45,17 @@
 #define PHOTO_FULL_SCREEN_WIDTH 220
 #define PHOTO_FULL_SCREEN_HEIGHT 176
 
-void gp_photodb_load_photodb (iTunesDB *itdb);
-gboolean gp_photodb_ipod_supports_photos (iTunesDB *itdb);
-gboolean gp_photodb_is_photo_playlist (Playlist *pl);
-void gp_photodb_display_photo_window (iTunesDB *itdb);
-void gp_photodb_change_to_photo_window (gboolean showflag);
+/* Drag n Drop */
+#define DND_GTKPOD_PHOTOIMAGELIST_TYPE "application/gtkpod-photoimagelist"
+#define DND_GTKPOD_PHOTOIMAGELIST 1
 
 
+void gphoto_load_photodb (iTunesDB *itdb);
+gboolean gphoto_ipod_supports_photos (iTunesDB *itdb);
+gboolean gphoto_is_photo_playlist (Playlist *pl);
+void gphoto_display_photo_window (iTunesDB *itdb);
+void gphoto_change_to_photo_window (gboolean showflag);
 
+
+
 #endif /*DISPLAY_PHOTO_H_*/

Modified: gtkpod/branches/photo_support_branch/src/display_playlists.c
===================================================================
--- gtkpod/branches/photo_support_branch/src/display_playlists.c        
2007-09-15 15:33:37 UTC (rev 1695)
+++ gtkpod/branches/photo_support_branch/src/display_playlists.c        
2007-09-16 18:19:50 UTC (rev 1696)
@@ -1415,16 +1415,16 @@
          space_set_ipod_itdb (new_playlist->itdb);
       }
       
-      if (gp_photodb_is_photo_playlist (new_playlist))
+      if (gphoto_is_photo_playlist (new_playlist))
       {
                                /* This is the photo playlist so need to load 
photo database
       * rather than get tracks.
                                */
-                               gp_photodb_display_photo_window 
(new_playlist->itdb);
+                               gphoto_display_photo_window 
(new_playlist->itdb);
       }
       else
       {
-                               gp_photodb_change_to_photo_window (FALSE);
+                               gphoto_change_to_photo_window (FALSE);
       }
 
       /* remove all entries from sort tab 0 */
@@ -1529,7 +1529,7 @@
     /* Add the photo playlist onto IPOD itdb if the
         * IPOD supports photos
         */
-       if (gp_photodb_ipod_supports_photos (itdb))
+       if (gphoto_ipod_supports_photos (itdb))
        {   /* add photo playlist */
                printf ("Photos supported. Adding node.\n");
                GtkTreeIter itdb_iter;

Modified: gtkpod/branches/photo_support_branch/src/file_itunesdb.c
===================================================================
--- gtkpod/branches/photo_support_branch/src/file_itunesdb.c    2007-09-15 
15:33:37 UTC (rev 1695)
+++ gtkpod/branches/photo_support_branch/src/file_itunesdb.c    2007-09-16 
18:19:50 UTC (rev 1696)
@@ -956,7 +956,7 @@
     }
     
     /* All successfully loaded so try loading the photo database */
-    gp_photodb_load_photodb (new_itdb);
+    gphoto_load_photodb (new_itdb);
     return new_itdb;
 }
 
@@ -2010,7 +2010,7 @@
    */
   if (success &&  
                  (itdb->usertype & GP_ITDB_TYPE_IPOD) &&
-                 gp_photodb_ipod_supports_photos (itdb) &&
+                 gphoto_ipod_supports_photos (itdb) &&
                  eitdb->photodb != NULL &&
                  eitdb->photo_data_changed == TRUE)
   {

Modified: gtkpod/branches/photo_support_branch/src/misc.c
===================================================================
--- gtkpod/branches/photo_support_branch/src/misc.c     2007-09-15 15:33:37 UTC 
(rev 1695)
+++ gtkpod/branches/photo_support_branch/src/misc.c     2007-09-16 18:19:50 UTC 
(rev 1696)
@@ -325,8 +325,35 @@
     return FALSE;
 }
 
+gboolean
+parse_artwork_from_string(gchar **s, Artwork **artwork)
+{
+    g_return_val_if_fail (artwork, FALSE);
+    *artwork = NULL;
+    g_return_val_if_fail (s, FALSE);
 
+    if(*s)
+    {
+       gchar *str = *s;
+       gchar *strp = strchr (str, '\n');
+       int tokens;
 
+       if (strp == NULL)
+       {
+           *artwork = NULL;
+           *s = NULL;
+           return FALSE;
+       }
+       tokens = sscanf (str, "%p", artwork);
+       ++strp;
+       if (*strp) *s = strp;
+       else       *s = NULL;
+       if (tokens == 1)        return TRUE;
+       else                    return FALSE;
+    }
+    return FALSE;
+}
+
 /* Duplicate a GList (shallow copy) */
 GList *glist_duplicate (GList *list)
 {
@@ -1934,7 +1961,7 @@
                /* Change the windows back to track view to ensure the
                 * sorttab state is saved correctly/
                 */
-               gp_photodb_change_to_photo_window (FALSE);
+               gphoto_change_to_photo_window (FALSE);
                
     /* Sort column order needs to be stored */
     tm_store_col_order();

Modified: gtkpod/branches/photo_support_branch/src/misc.h
===================================================================
--- gtkpod/branches/photo_support_branch/src/misc.h     2007-09-15 15:33:37 UTC 
(rev 1695)
+++ gtkpod/branches/photo_support_branch/src/misc.h     2007-09-16 18:19:50 UTC 
(rev 1696)
@@ -108,6 +108,7 @@
 void open_about_window (void);
 void close_about_window (void);
 gboolean parse_tracks_from_string (gchar **s, Track **track);
+gboolean parse_artwork_from_string(gchar **s, Artwork **artwork);
 void gtkpod_init (int argc, char *argv[]);
 void gtkpod_shutdown (void);
 


This was sent by the SourceForge.net collaborative development platform, the 
world's largest Open Source development site.

-------------------------------------------------------------------------
This SF.net email is sponsored by: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2005.
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
_______________________________________________
gtkpod-cvs2 mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/gtkpod-cvs2

Reply via email to