From: Maksym Veremeyenko Date: Tue, 3 Jul 2012 15:28:15 +0000 (+0300) Subject: minimal library drag support elements X-Git-Url: http://research.m1stereo.tv/gitweb?a=commitdiff_plain;h=07c6d84a23c9043e2334987fc8533f68e5e23183;p=melted_gui minimal library drag support elements --- diff --git a/src/instance.c b/src/instance.c index 1ae08c3..05400b3 100644 --- a/src/instance.c +++ b/src/instance.c @@ -39,6 +39,8 @@ #include "player.h" #include "library.h" +GtkTargetEntry drag_targets[] = { { (char*) "application/playlist_item_t", 0, 0 } }; + gboolean instance_button_click(instance_t* app, control_buttons_t button) { #if 0 diff --git a/src/library.c b/src/library.c index 5915ed5..19e4637 100644 --- a/src/library.c +++ b/src/library.c @@ -36,11 +36,13 @@ #include #include -#include "instance.h" +#include "library.h" #include "ui.h" #include "timecode.h" #include "support.h" +extern GtkTargetEntry drag_targets[]; + void library_release(instance_t* app) { mvcp_close(app->library.handle[0]); @@ -233,6 +235,33 @@ static void on_library_row_collapsed library_add_fake(user_data, GTK_TREE_STORE(model), iter); }; +static void library_drag_data_get_cb(GtkWidget *widget, GdkDragContext *context, + GtkSelectionData *selection_data, guint info, guint time, gpointer userdata) +{ + int c; + playlist_item_t* items; + instance_t* app = (instance_t*)userdata; + + g_warning("library_drag_data_get_cb"); + + items = library_get_selected_items(app, &c); + + /* clear item */ + if(items) + { + gtk_selection_data_set(selection_data, selection_data->target, 8, + (const guchar *)items, sizeof(playlist_item_t) * c); + free(items); + }; +}; + +static void library_drag_begin_cb(GtkWidget *widget, GdkDragContext *context, gpointer userdata) +{ + g_warning("library_drag_begin_cb"); + gtk_drag_source_set_icon_stock(widget, GTK_STOCK_DND); +}; + + void library_init(instance_t* app) { /* connect to library */ @@ -251,29 +280,98 @@ void library_init(instance_t* app) /* load lib */ library_init_load(app); + /* allow drag source */ + gtk_drag_source_set(app->library_tree, GDK_BUTTON1_MASK, + drag_targets, 1, (GdkDragAction)(GDK_ACTION_COPY)); + /* set handlers */ gtk_signal_connect(GTK_OBJECT(app->library_tree), "row-expanded", GTK_SIGNAL_FUNC(on_library_row_expanded), app); gtk_signal_connect(GTK_OBJECT(app->library_tree), "row-collapsed", GTK_SIGNAL_FUNC(on_library_row_collapsed), app); + g_signal_connect(GTK_OBJECT(app->library_tree), "drag_data_get", + G_CALLBACK(library_drag_data_get_cb), app); + g_signal_connect(GTK_OBJECT(app->library_tree), "drag_begin", + G_CALLBACK(library_drag_begin_cb), app); -#if 0 - pthread_mutex_lock(&app->library.lock); +}; - if(app->library.filename[0]) +static void library_get_selected_items_iter +( + GtkTreeModel *model, + GtkTreePath *path, + GtkTreeIter *iter, + gpointer data +) +{ + int l; + mvcp_dir_entry_t *dir; + mvcp_list_entry_t *list; + playlist_item_t** pitems = (playlist_item_t**)data; + playlist_item_t* items = *pitems; + + /* request pointers to list and dir entries of library items */ + gtk_tree_model_get(model, iter, + 3, &dir, + 4, &list, + -1); + + /* check if defined */ + if(dir && list) { - app->library.count = MAX_LIBRARY_ITEMS; - omnplay_library_load_file(app->library.item, &app->library.count, app->library.filename); + /* allocate items */ + if(!items) + { + items = (playlist_item_t*)malloc(sizeof(playlist_item_t)); + memset(items, 0, sizeof(playlist_item_t)); + }; + + /* find numbers of items in list */ + for(l = 0; items[l].id[0]; l++); l--; + g_warning("library_get_selected_items_iter: l=%d", l); + + /* realloc items */ + items = (playlist_item_t*)realloc(items, (l + 2) * sizeof(playlist_item_t)); + + /* clean last item */ + memset(&items[l + 1], 0, sizeof(playlist_item_t)); + + /* setup items */ + memset(&items[l + 0], 0, sizeof(playlist_item_t)); + strncpy(items[l].id, dir->name, PATH_MAX); + strncpy(items[l].title, dir->full, PATH_MAX); + items[l].dur = list->size; }; - omnplay_library_sort(app); + *pitems = items; +}; - pthread_mutex_unlock(&app->library.lock); +playlist_item_t* library_get_selected_items(instance_t* app, int *count) +{ + int l = 0; + playlist_item_t* items = NULL; - omnplay_library_draw(app); -#endif + GtkTreeSelection *selection; + + selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(app->library_tree)); + if(selection) + { + gtk_tree_selection_selected_foreach( + selection, + library_get_selected_items_iter, + &items); + + if(items) + { + for(; items[l].id[0]; l++); l--; + }; + }; + + *count = l; + return items; }; + #if 0 playlist_item_t* omnplay_library_find(omnplay_instance_t* app, char* id) { diff --git a/src/library.h b/src/library.h index d7e72db..5cd6f91 100644 --- a/src/library.h +++ b/src/library.h @@ -29,6 +29,7 @@ extern "C" void library_init(instance_t* app); void library_release(instance_t* app); +playlist_item_t* library_get_selected_items(instance_t* app, int *count); #ifdef __cplusplus };