X-Git-Url: http://research.m1stereo.tv/gitweb?a=blobdiff_plain;f=src%2Flibrary.c;h=19e4637619c44746963f7ee20bd592e43e6a9304;hb=07c6d84a23c9043e2334987fc8533f68e5e23183;hp=fce8426c9e46c3caa9154d9787de66871dcad89b;hpb=16fbcae98727fa1121a830ca376240fdb286dce3;p=melted_gui diff --git a/src/library.c b/src/library.c index fce8426..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]); @@ -79,7 +81,8 @@ static int library_init_load(instance_t* app) return 0; }; -static void library_add_item(instance_t* app, GtkTreeStore *treestore, GtkTreeIter *iter, mvcp_dir_entry_t* e) +static void library_add_item(instance_t* app, GtkTreeStore *treestore, GtkTreeIter *iter, + mvcp_dir_entry e, mvcp_list_entry p) { GtkTreeIter this, child; @@ -102,14 +105,21 @@ static void library_add_item(instance_t* app, GtkTreeStore *treestore, GtkTreeIt } else { + char dur[32]; + + if(p) + frames2tc(p->size, p->fps, dur); + else + strcpy(dur, ""); + gtk_tree_store_append(treestore, &this, iter); gtk_tree_store_set(treestore, &this, 0, app->library.icons[1], - 1, "", + 1, dur, 2, e->name, 3, e, - 4, NULL, + 4, p, 5, FALSE, 6, "red", -1 ); @@ -130,10 +140,10 @@ static void on_library_row_expanded GtkTreeModel *model; GdkCursor* cursor; mvcp_dir dir; - mvcp_dir_entry_t *e, entry; + mvcp_dir_entry_t *e; instance_t* app = (instance_t*)user_data; - g_warning("on_library_row_expanded: HERE"); +// g_warning("on_library_row_expanded: HERE"); /* Set busy cursor */ cursor = gdk_cursor_new(GDK_WATCH); @@ -153,26 +163,33 @@ static void on_library_row_expanded /* setup root path */ if(!e) - p = "/home/studio/Videos"; + p = "/"; else p = e->full; - /* read dir */ dir = mvcp_dir_init(app->library.handle[0], p); for (i = 0; i < mvcp_dir_count(dir); i++) { - if(mvcp_ok != mvcp_dir_get(dir, i, &entry)) + mvcp_dir_entry_t dir_entry; + mvcp_list_entry_t *list_e = NULL, list_entry; + + if(mvcp_ok != mvcp_dir_get(dir, i, &dir_entry)) continue; // g_warning("on_library_row_expanded: path=[%s], entry.dur=[%d], entry.full=[%s], entry.name[%s]", // p, entry.dir, entry.full, entry.name); e = (mvcp_dir_entry_t*)malloc(sizeof(mvcp_dir_entry_t)); - memset(e, 0, sizeof(mvcp_dir_entry_t)); - *e = entry; + *e = dir_entry; - library_add_item(app, GTK_TREE_STORE(model), iter, e); + if(!e->dir && mvcp_ok == mvcp_probe_clip( app->library.handle[0], e->full, &list_entry)) + { + list_e = (mvcp_list_entry_t*)malloc(sizeof(mvcp_list_entry_t)); + *list_e = list_entry; + }; + + library_add_item(app, GTK_TREE_STORE(model), iter, e, list_e); }; /* restore cursor */ @@ -192,21 +209,24 @@ static void on_library_row_collapsed { GtkTreeModel *model; GtkTreeIter child; - g_warning("on_library_row_collapsed: HERE"); +// g_warning("on_library_row_collapsed: HERE"); /* delete all items */ model = gtk_tree_view_get_model(treeview); while (gtk_tree_model_iter_children(GTK_TREE_MODEL(model), &child, iter)) { mvcp_dir_entry_t *e; + mvcp_list_entry_t *l; /* request mvcp entry */ gtk_tree_model_get(GTK_TREE_MODEL(model), &child, 3, &e, + 4, &l, -1); /* free entry */ if(e) free(e); + if(l) free(l); gtk_tree_store_remove(GTK_TREE_STORE(model), &child); }; @@ -215,10 +235,37 @@ 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 */ - app->library.handle[1] = mvcp_parser_init_remote(app->players.host, 5250); + app->library.handle[1] = mvcp_parser_init_remote(app->players.host, app->library.port); app->library.handle[0] = mvcp_init(app->library.handle[1]); if(mvcp_connect(app->library.handle[0]) != mvcp_ok) { @@ -233,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) {