X-Git-Url: http://research.m1stereo.tv/gitweb?a=blobdiff_plain;f=src%2Flibrary.c;h=5915ed5f9fbdc8175f152064ebb54d9460dac702;hb=d31575c9e3f5dac1dc7596b4cb2a8457ea2bef6b;hp=bbda4b815d2e6230a26955453cff55ce59dffe20;hpb=fbb2ba0ffc671dfa0622058bc11957f275ebb865;p=melted_gui
diff --git a/src/library.c b/src/library.c
index bbda4b8..5915ed5 100644
--- a/src/library.c
+++ b/src/library.c
@@ -39,6 +39,7 @@
#include "instance.h"
#include "ui.h"
#include "timecode.h"
+#include "support.h"
void library_release(instance_t* app)
{
@@ -46,93 +47,196 @@ void library_release(instance_t* app)
mvcp_parser_close(app->library.handle[1]);
};
-
-static int library_load_node(instance_t* app, GtkTreeStore *tree_store, GtkTreeIter* parent, char* path)
+static void library_add_fake(instance_t* app, GtkTreeStore *tree_store, GtkTreeIter* parent)
{
- int i;
GtkTreeIter iter;
- mvcp_dir_entry_t entry;
- mvcp_dir dir = mvcp_dir_init(app->library.handle[0], path);
-
- for (i = 0; i < mvcp_dir_count(dir); i++)
- {
- if(mvcp_ok != mvcp_dir_get(dir, i, &entry))
- continue;
-
- g_warning("library_load_node: path=[%s], entry.dur=[%d], entry.full=[%s], entry.name[%s]",
- path, entry.dir, entry.full, entry.name);
-
- if(entry.dir)
- {
- gtk_tree_store_prepend(tree_store, &iter, parent);
-
- gtk_tree_store_set(tree_store, &iter,
- 0, app->library.icons[0],
- 1, "
",
- 2, entry.name,
- 3, NULL,
- 4, NULL,
- 5, FALSE,
- 6, "red",
- -1 );
-
- library_load_node(app, tree_store, &iter, entry.full);
- }
- else
- {
- gtk_tree_store_append(tree_store, &iter, parent);
-
- gtk_tree_store_set(tree_store, &iter,
- 0, app->library.icons[1],
- 1, "",
- 2, entry.name,
- 3, NULL,
- 4, NULL,
- 5, FALSE,
- 6, "red",
- -1 );
- };
- };
-
- return 0;
+ gtk_tree_store_append(tree_store, &iter, parent);
+ gtk_tree_store_set(tree_store, &iter, -1);
};
static int library_init_load(instance_t* app)
{
- int i;
- char tc[12];
- GtkTreeStore *tree_store;
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, NULL,
- 1, "/",
- 2, "",
+ 0, app->library.icons[0],
+ 1, ">",
+ 2, "LIBRARY",
3, NULL,
4, NULL,
5, FALSE,
6, "red",
-1 );
-*/
-
- library_load_node(app, tree_store, NULL, "/home/studio/Videos");
+ 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, "",
+ 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, "");
+
+ 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)
{
@@ -140,11 +244,19 @@ void library_init(instance_t* app)
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);