implement saving
[melted_gui] / src / instance.c
index 757d8a6..20066dd 100644 (file)
 #include "opts.h"
 #include "timecode.h"
 #include "player.h"
+#include "library.h"
+#include "playlist.h"
+
+GtkTargetEntry drag_targets[] = { { (char*) "application/playlist_item_t", 0, 0 } };
+
+static gboolean library_tree_key(GtkWidget *widget, GdkEventKey *event, gpointer data)
+{
+    instance_t* app = (instance_t*)data;
+
+    switch(event->keyval)
+    {
+        case GDK_C:
+        case GDK_c:
+            if(event->state & GDK_CONTROL_MASK)
+            {
+                int count;
+                playlist_item_t* items;
+
+                items = library_get_selected_items(app, &count);
+
+                if(items)
+                {
+                    int i;
+
+                    for(i = 0; i < count; i++)
+                        app->clipboard.item[i] = items[i];
+
+                    app->clipboard.count = count;
+                };
+
+                return TRUE;
+            };
+            break;
+        case GDK_V:
+        case GDK_v:
+            if(event->state & GDK_CONTROL_MASK)
+            {
+                g_warning("CTRL+v\n");
+                return TRUE;
+            };
+            break;
+        case GDK_X:
+        case GDK_x:
+            if(event->state & GDK_CONTROL_MASK)
+            {
+                g_warning("CTRL+x\n");
+                return TRUE;
+            };
+            break;
+        case GDK_KEY_BackSpace:
+//            omnplay_library_add(app, 0);
+            return TRUE;
+        case GDK_KEY_F5:
+//            omnplay_library_refresh(app);
+            return TRUE;
+    };
+
+    return FALSE;
+};
+
+static gboolean playlist_grid_key(GtkWidget *widget, GdkEventKey *event, gpointer data)
+{
+    instance_t* app = (instance_t*)data;
+
+    switch(event->keyval)
+    {
+        case GDK_C:
+        case GDK_c:
+            if(event->state & GDK_CONTROL_MASK)
+            {
+                playlist_item_copy(app);
+                return TRUE;
+            };
+            break;
+        case GDK_V:
+        case GDK_v:
+            if(event->state & GDK_CONTROL_MASK)
+            {
+                playlist_item_paste(app, 0);
+                return TRUE;
+            };
+            break;
+        case GDK_X:
+        case GDK_x:
+            if(event->state & GDK_CONTROL_MASK)
+            {
+                playlist_item_copy(app);
+                playlist_delete_selected_items(app);
+                return TRUE;
+            };
+            break;
+        case GDK_S:
+        case GDK_s:
+            if(event->state & GDK_CONTROL_MASK)
+            {
+//                omnplay_playlist_save(app);
+                return TRUE;
+            };
+            break;
+        case GDK_O:
+        case GDK_o:
+            if(event->state & GDK_CONTROL_MASK)
+            {
+//                omnplay_playlist_load(app);
+                return TRUE;
+            };
+            break;
+        case GDK_KEY_uparrow:
+            if(event->state & GDK_CONTROL_MASK)
+            {
+                playlist_item_swap(app, -1);
+                return TRUE;
+            };
+            break;
+        case GDK_KEY_downarrow:
+            if(event->state & GDK_CONTROL_MASK)
+            {
+                playlist_item_swap(app, -1);
+                return TRUE;
+            };
+            break;
+        case GDK_KEY_space:
+//            omnplay_ctl(app, BUTTON_PLAYER_PLAY);
+            return TRUE;
+        case GDK_KEY_Return:
+//            omnplay_ctl(app, BUTTON_PLAYER_CUE);
+            return TRUE;
+        case GDK_KEY_Insert:
+//            omnplay_playlist_item_add(app, 0);
+            return TRUE;
+        case GDK_KEY_Delete:
+            playlist_delete_selected_items(app);
+            return TRUE;
+        case GDK_E:
+        case GDK_e:
+//            omnplay_playlist_item_edit(app);
+            return TRUE;
+    };
+
+    return FALSE;
+};
+
+static gboolean library_tree_button(GtkWidget *widget, GdkEventButton *event, gpointer data)
+{
+//    g_warning("on_library_grid_button: event->button=%d, event->type=%d", event->button, event->type);
+
+    if(event->button==1 && event->type==GDK_2BUTTON_PRESS)
+    {
+//        omnplay_library_add((omnplay_instance_t* )data, 0);
+        return TRUE;
+    };
+
+    return FALSE;
+};
+
+static gboolean playlist_grid_button(GtkWidget *widget, GdkEventButton *event, gpointer data)
+{
+    instance_t* app = (instance_t*)data;
+
+//    g_warning("on_playlist_grid_button");
+
+    if(event->button==1 && event->type==GDK_2BUTTON_PRESS)
+    {
+//        omnplay_playlist_item_edit(app);
+        return TRUE;
+    };
+
+    return FALSE;
+};
+
+static gboolean instance_button_click(instance_t* app, control_buttons_t button)
+{
+    switch(button)
+    {
+        case BUTTON_PLAYLIST_ITEM_ADD:
+            playlist_item_add(app, 0);
+            break;
+        case BUTTON_PLAYLIST_ITEM_DEL:
+            playlist_delete_selected_items(app);
+            break;
+        case BUTTON_PLAYLIST_ITEM_EDIT:
+            playlist_item_edit(app);
+            break;
+        case BUTTON_PLAYLIST_LOAD:
+            playlist_load(app);
+            break;
+        case BUTTON_PLAYLIST_SAVE:
+            playlist_save(app);
+            break;
+        case BUTTON_PLAYLIST_BLOCK_SINGLE:
+        case BUTTON_PLAYLIST_BLOCK_LOOP:
+            playlist_block(app, (BUTTON_PLAYLIST_BLOCK_LOOP == button)?1:0);
+            break;
+        case BUTTON_PLAYLIST_ITEM_UP:
+            playlist_item_swap(app, -1);
+            break;
+        case BUTTON_PLAYLIST_ITEM_DOWN:
+            playlist_item_swap(app, +1);
+            break;
+        case BUTTON_PLAYER_CUE:
+        case BUTTON_PLAYER_PLAY:
+        case BUTTON_PLAYER_PAUSE:
+        case BUTTON_PLAYER_STOP:
+//            omnplay_ctl(app, button);
+            break;
+        case BUTTON_LIBRARY_ADD:
+//            omnplay_library_add(app, 0);
+            playlist_item_add_from_library(app, 0);
+            break;
+        case BUTTON_LIBRARY_REFRESH:
+//            omnplay_library_refresh(app);
+            break;
+        case BUTTON_LIBRARY_FIND:
+//            omnplay_library_search(app, 0);
+            break;
+        case BUTTON_LIBRARY_FIND_NEXT:
+//            omnplay_library_search(app, 1);
+            break;
+        case BUTTON_PLAYLIST_RELINK:
+//            omnplay_playlist_relink(app);
+            break;
+        default:
+            g_warning("instance_button_click: unknow button clicked");
+    };
+    return TRUE;
+};
+
+static gboolean on_button_click(GtkWidget *button, gpointer user_data)
+{
+    int i;
+    instance_t* app = (instance_t*)user_data;
+
+    for(i = 1; i < BUTTON_LAST; i++)
+        if(app->buttons[i] == button)
+            return instance_button_click(app, (control_buttons_t)i);
+
+    return FALSE;
+};
 
 static gboolean on_main_window_delete_event( GtkWidget *widget, GdkEvent *event, gpointer user_data )
 {
@@ -83,34 +321,31 @@ void instance_init(instance_t* app)
     int i;
     pthread_mutexattr_t attr;
 
-    pthread_mutexattr_init(&attr);
-    pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);
-
     gtk_signal_connect( GTK_OBJECT( app->window ), "delete-event",
         GTK_SIGNAL_FUNC(on_main_window_delete_event), app);
 
     gtk_signal_connect( GTK_OBJECT( app->window ), "destroy",
         GTK_SIGNAL_FUNC(on_main_window_destroy), app);
 
-#if 0
     gtk_widget_add_events(app->playlist_grid, GDK_BUTTON_PRESS_MASK);
     gtk_widget_add_events(app->playlist_grid, GDK_KEY_PRESS_MASK);
     gtk_signal_connect(GTK_OBJECT(app->playlist_grid), "key-press-event",
-        GTK_SIGNAL_FUNC(on_playlist_grid_key), app);
+        GTK_SIGNAL_FUNC(playlist_grid_key), app);
 
-    gtk_widget_add_events(app->library_grid, GDK_BUTTON_PRESS_MASK);
-    gtk_widget_add_events(app->library_grid, GDK_KEY_PRESS_MASK);
-    gtk_signal_connect(GTK_OBJECT(app->library_grid), "key-press-event",
-        GTK_SIGNAL_FUNC(on_library_grid_key), app);
+    gtk_widget_add_events(app->library_tree, GDK_BUTTON_PRESS_MASK);
+    gtk_widget_add_events(app->library_tree, GDK_KEY_PRESS_MASK);
+    gtk_signal_connect(GTK_OBJECT(app->library_tree), "key-press-event",
+        GTK_SIGNAL_FUNC(library_tree_key), app);
 
     gtk_signal_connect(GTK_OBJECT(app->playlist_grid), "button-press-event",
-        GTK_SIGNAL_FUNC(on_playlist_grid_button), app);
+        GTK_SIGNAL_FUNC(playlist_grid_button), app);
 
-    gtk_signal_connect(GTK_OBJECT(app->library_grid), "button-press-event",
-        GTK_SIGNAL_FUNC(on_library_grid_button), app);
-#endif
+    gtk_signal_connect(GTK_OBJECT(app->library_tree), "button-press-event",
+        GTK_SIGNAL_FUNC(library_tree_button), app);
 
     /* create lock */
+    pthread_mutexattr_init(&attr);
+    pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);
     pthread_mutex_init(&app->players.lock, &attr);
     pthread_mutex_init(&app->playlist.lock, &attr);
     pthread_mutex_init(&app->library.lock, &attr);
@@ -120,38 +355,16 @@ void instance_init(instance_t* app)
     for(i = 0; i < app->players.count; i++)
         player_run(app, i);
 
-#if 0
-
     /* attach buttons click */
     for(i = 1; i < BUTTON_LAST; i++)
         gtk_signal_connect(GTK_OBJECT(app->buttons[i]), "clicked",
             GTK_SIGNAL_FUNC( on_button_click), app );
 
-    /* load library */
-    omnplay_library_load(app);
-#endif
-
-#if 0
-    /* setup drag n drop source/target */
-    static GtkTargetEntry drag_targets[] = { { (char*) "application/playlist_item_t", 0, 0 } };
-
-    gtk_drag_source_set(app->library_grid, GDK_BUTTON1_MASK,
-        drag_targets, 1, (GdkDragAction)(GDK_ACTION_COPY));
-
-    gtk_drag_source_set(app->playlist_grid, GDK_BUTTON1_MASK,
-        drag_targets, 1, (GdkDragAction)(GDK_ACTION_COPY | GDK_ACTION_MOVE));
+    /* init library */
+    library_init(app);
 
-    gtk_drag_dest_set(app->playlist_grid, (GtkDestDefaults)(GTK_DEST_DEFAULT_HIGHLIGHT | GTK_DEST_DEFAULT_DROP),
-        drag_targets, 1, (GdkDragAction)(GDK_ACTION_COPY | GDK_ACTION_MOVE));
-
-    g_signal_connect (app->library_grid, "drag_data_get", G_CALLBACK(library_grid_drag_data_get_cb), app);
-    g_signal_connect (app->playlist_grid, "drag_data_get", G_CALLBACK(playlist_grid_drag_data_get_cb), app);
-    g_signal_connect (app->library_grid, "drag_begin", G_CALLBACK(library_grid_drag_begin_cb), app);
-    g_signal_connect (app->playlist_grid, "drag_begin", G_CALLBACK(playlist_grid_drag_begin_cb), app);
-    g_signal_connect (app->playlist_grid, "drag_data_received", G_CALLBACK (playlist_grid_drag_data_received), app);
-    g_signal_connect (app->playlist_grid, "drag_data_delete", G_CALLBACK (playlist_grid_drag_data_delete), app);
-    g_signal_connect (app->playlist_grid, "drag_motion", G_CALLBACK (playlist_grid_drag_motion), app);
-#endif
+    /* init playlist */
+    playlist_init(app);
 };
 
 void instance_release(instance_t* app)
@@ -164,17 +377,18 @@ void instance_release(instance_t* app)
     for(i = 0; i < app->players.count; i++)
         player_stop(app, i);
 
+    /* release laylist */
+    playlist_release(app);
+
+    /* release library */
+    library_release(app);
+
     /* destroy lock */
     pthread_mutex_destroy(&app->players.lock);
 
     /* destroy lock */
     pthread_mutex_destroy(&app->playlist.lock);
 
-#if 0
-    /* load library */
-    omnplay_library_save(app);
-#endif
-
     /* destroy library lock */
     pthread_mutex_destroy(&app->library.lock);
 };