#include "instance.h"
#include "ui.h"
#include "timecode.h"
+#include "support.h"
void library_release(instance_t* app)
{
mvcp_parser_close(app->library.handle[1]);
};
+static void library_add_fake(instance_t* app, GtkTreeStore *tree_store, GtkTreeIter* parent)
+{
+ GtkTreeIter iter;
+ gtk_tree_store_append(tree_store, &iter, parent);
+ gtk_tree_store_set(tree_store, &iter, -1);
+};
+
+static int library_init_load(instance_t* app)
+{
+ GtkTreeIter iter;
+ GtkTreeStore *tree_store;
+
+ tree_store = GTK_TREE_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(app->library_tree)));
+ gtk_tree_store_clear(tree_store);
+
+ gtk_tree_store_append(tree_store, &iter, NULL);
+ gtk_tree_store_set(tree_store, &iter,
+ 0, app->library.icons[0],
+ 1, "<dir>>",
+ 2, "LIBRARY",
+ 3, NULL,
+ 4, NULL,
+ 5, FALSE,
+ 6, "red",
+ -1 );
+ library_add_fake(app, tree_store, &iter);
+
+ gtk_tree_view_collapse_all(GTK_TREE_VIEW(app->library_tree));
+
+ return 0;
+};
+
+static void library_add_item(instance_t* app, GtkTreeStore *treestore, GtkTreeIter *iter,
+ mvcp_dir_entry e, mvcp_list_entry p)
+{
+ GtkTreeIter this, child;
+
+ if(e->dir)
+ {
+ gtk_tree_store_prepend(treestore, &this, iter);
+
+ gtk_tree_store_set(treestore, &this,
+ 0, app->library.icons[0],
+ 1, "<dir>",
+ 2, e->name,
+ 3, e,
+ 4, NULL,
+ 5, FALSE,
+ 6, "red",
+ -1 );
+
+ gtk_tree_store_append(treestore, &child, &this);
+ gtk_tree_store_set(treestore, &child, -1);
+ }
+ 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, dur,
+ 2, e->name,
+ 3, e,
+ 4, p,
+ 5, FALSE,
+ 6, "red",
+ -1 );
+ };
+};
+
+static void on_library_row_expanded
+(
+ GtkTreeView *treeview,
+ GtkTreeIter *iter,
+ GtkTreePath *path,
+ gpointer user_data
+)
+{
+ int i;
+ char* p;
+ GtkTreeIter fake;
+ GtkTreeModel *model;
+ GdkCursor* cursor;
+ mvcp_dir dir;
+ mvcp_dir_entry_t *e;
+ instance_t* app = (instance_t*)user_data;
+
+// g_warning("on_library_row_expanded: HERE");
+
+ /* Set busy cursor */
+ cursor = gdk_cursor_new(GDK_WATCH);
+ gdk_window_set_cursor(gtk_widget_get_toplevel(GTK_WIDGET(treeview))->window, cursor);
+ gdk_cursor_unref(cursor);
+ gdk_flush();
+
+ model = gtk_tree_view_get_model(treeview);
+
+ /* save fake item */
+ gtk_tree_model_iter_children(GTK_TREE_MODEL(model), &fake, iter);
+
+ /* request mvcp entry */
+ gtk_tree_model_get(GTK_TREE_MODEL(model), iter,
+ 3, &e,
+ -1);
+
+ /* setup root path */
+ if(!e)
+ 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++)
+ {
+ 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));
+ *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, list_e);
+ };
+
+ /* restore cursor */
+ gdk_window_set_cursor(gtk_widget_get_toplevel(GTK_WIDGET(treeview))->window, NULL);
+
+ /* delete fake item */
+ gtk_tree_store_remove(GTK_TREE_STORE(model), &fake);
+};
+
+static void on_library_row_collapsed
+(
+ GtkTreeView *treeview,
+ GtkTreeIter *iter,
+ GtkTreePath *path,
+ gpointer user_data
+)
+{
+ GtkTreeModel *model;
+ GtkTreeIter child;
+// 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);
+ };
+
+ /* add a fake element */
+ library_add_fake(user_data, GTK_TREE_STORE(model), iter);
+};
+
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)
{
g_warning("library_init: failed to connect to server %s", app->players.host);
return;
};
+
+ /* setup icons */
+ app->library.icons[0] = create_pixbuf("Axialis_Team_playlist_open_16x16.png");
+ app->library.icons[1] = create_pixbuf("Axialis_Team_playlist_save_16x16.png");
+
+ /* load lib */
+ library_init_load(app);
+
+ /* 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);
+
#if 0
pthread_mutex_lock(&app->library.lock);