/* vim: set ai et ts=4 sw=4: */ #ifdef HAVE_CONFIG_H #include #endif #include #include #include "liteamp.h" #include "dnd.h" #include "util.h" /*-----------------------------------------------------------------*/ static void dnd_drag_data_received_cb( GtkWidget* widget, GdkDragContext* context, gint x, gint y, GtkSelectionData* selection_data, guint info, guint time, gpointer data); // drag and drop target type #define DND_TARGET_TYPE_TEXT_URI_LIST "text/uri-list" #define DND_TARGET_TYPE_PLAYLIST_IDICES "liteamp-playlist-indices" // drag and drop target id typedef enum { DND_TARGET_ID_TEXT_URI_LIST, // from nautilus DND_TARGET_ID_PLAYLIST_INDICES, // from other playlists(local D&D) } DndTargetId; // drag and drop targets // playlist receives text/uri-list only from nautilus static const GtkTargetEntry dnd_targets[] = { { DND_TARGET_TYPE_TEXT_URI_LIST, 0, DND_TARGET_ID_TEXT_URI_LIST }, //{ DND_TARGET_TYPE_PLAYLIST_INDICES, 0, DND_TARGET_ID_LITEAMP_PLAYLIST_INDICES }, }; #define DND_MIME_TYPE_DIR "x-directory/normal" #define DND_MIME_TYPE_MP3 "audio/x-mp3" #define DND_MIME_TYPE_OGG "application/x-ogg" /*-----------------------------------------------------------------*/ void dnd_connect(GtkWidget* widget) { g_signal_connect( G_OBJECT(widget), "drag-data-received", G_CALLBACK(dnd_drag_data_received_cb), NULL); } void dnd_enable(GtkWidget* widget) { gtk_drag_dest_set(widget, GTK_DEST_DEFAULT_ALL, dnd_targets, G_N_ELEMENTS(dnd_targets), GDK_ACTION_COPY); } void dnd_disable(GtkWidget* widget) { gtk_drag_dest_unset(widget); } void dnd_drag_data_received_cb(GtkWidget* widget, GdkDragContext* context, gint x, gint y, GtkSelectionData* selection_data, guint info, guint time, gpointer data) { GtkTargetList* target_list; GdkAtom target; GList* uri_list; GList* i; GnomeVFSURI* uri; gchar* uri_str; gchar* mime_type; gchar* local_path; gchar* short_uri; gchar* item_title; gboolean drop_on_sidebar; Sidebar* sidebar; SidebarItem* item; Playlist* pl; // check targets target_list = gtk_target_list_new(dnd_targets, G_N_ELEMENTS(dnd_targets)); target = gtk_drag_dest_find_target(widget, context, target_list); gtk_target_list_unref(target_list); if(target == GDK_NONE) { gtk_drag_finish(context, FALSE, FALSE, time); return; } uri_list = gnome_vfs_uri_list_parse(selection_data->data); if(uri_list == NULL) { gtk_drag_finish(context, FALSE, FALSE, time); return; } drop_on_sidebar = IS_SIDEBAR(widget); //drop_on_playlist = IS_PLAYLIST(widget); sidebar = liteamp_get_sidebar(); pl = liteamp_get_playlist(); for(i = uri_list; i != NULL; i = g_list_next(i)) { uri = i->data; if(!uri) continue; uri_str = gnome_vfs_uri_to_string(uri, GNOME_VFS_URI_HIDE_NONE); mime_type = (gchar*)gnome_vfs_get_mime_type(uri_str); local_path = gnome_vfs_get_local_path_from_uri(uri_str); if(is_dnd_mime_type_dir(mime_type)) { if(drop_on_sidebar) { // create new sidebar item // titled with basename of dropped directory short_uri = gnome_vfs_uri_extract_short_name(uri); item_title = filename_to_utf8(short_uri); item = SIDEBAR_ITEM(sidebar_item_new(item_title, NULL, NULL, SIDEBAR_ITEM_STOCK_NONE)); g_free(short_uri); g_free(item_title); sidebar_add_item(sidebar, item); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(item), TRUE); sidebar_write(sidebar); } playlist_add_dir(pl, local_path, TRUE); } else if(is_dnd_mime_type_supported_file(mime_type)) { playlist_add_file(pl, local_path, TRUE); } else { // ignore unknown mime type! g_print("unknown mime type: %s\n", mime_type); } playlist_write(pl); g_free(local_path); g_free(uri_str); } gnome_vfs_uri_list_free(uri_list); gtk_drag_finish(context, TRUE, FALSE, time); } gboolean is_dnd_mime_type_dir(const gchar* mime_type) { return !strcasecmp(mime_type, DND_MIME_TYPE_DIR); } gboolean is_dnd_mime_type_supported_file(const gchar* mime_type) { return (!strcasecmp(mime_type, DND_MIME_TYPE_MP3) || !strcasecmp(mime_type, DND_MIME_TYPE_OGG)); } /*dnd.c*/