#include <mvcp/mvcp.h>
#include <mvcp/mvcp_remote.h>
-#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]);
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;
}
else
{
+ char dur[32];
+
+ if(p)
+ frames2tc(p->size, p->fps, dur);
+ else
+ strcpy(dur, "<file>");
+
gtk_tree_store_append(treestore, &this, iter);
gtk_tree_store_set(treestore, &this,
0, app->library.icons[1],
- 1, "<file>",
+ 1, dur,
2, e->name,
3, e,
- 4, NULL,
+ 4, p,
5, FALSE,
6, "red",
-1 );
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);
/* 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;
+
+ 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);
+ library_add_item(app, GTK_TREE_STORE(model), iter, e, list_e);
};
/* restore cursor */
{
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);
};
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)
{
/* 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++);
+ 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++);
+ };
+
+ *count = l;
+ return items;
};
+
#if 0
playlist_item_t* omnplay_library_find(omnplay_instance_t* app, char* id)
{