fix root dir type
[melted_gui] / src / instance.c
index 1ae08c3..df64987 100644 (file)
 #include <gdk/gdkkeysyms.h>
 #include <pthread.h>
 
+#if defined(__MINGW32__)
+#include <winsock2.h>
+#endif
+
 #include "instance.h"
 #include "ui.h"
 #include "opts.h"
 #include "timecode.h"
 #include "player.h"
 #include "library.h"
+#include "playlist.h"
+#include "control.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)
+            {
+                playlist_save(app);
+                return TRUE;
+            };
+            break;
+        case GDK_O:
+        case GDK_o:
+            if(event->state & GDK_CONTROL_MASK)
+            {
+                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:
+            control_route(app, BUTTON_PLAYER_PLAY);
+            return TRUE;
+        case GDK_KEY_Return:
+            control_route(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:
+            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)
+    {
+        playlist_item_add_from_library((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;
 
-gboolean instance_button_click(instance_t* app, control_buttons_t button)
+//    g_warning("on_playlist_grid_button");
+
+    if(event->button==1 && event->type==GDK_2BUTTON_PRESS)
+    {
+        playlist_item_edit(app);
+        return TRUE;
+    };
+
+    return FALSE;
+};
+
+static gboolean instance_button_click(instance_t* app, control_buttons_t button)
 {
-#if 0
     switch(button)
     {
         case BUTTON_PLAYLIST_ITEM_ADD:
-            omnplay_playlist_item_add(app, 0);
+            playlist_item_add(app, 0);
             break;
         case BUTTON_PLAYLIST_ITEM_DEL:
-            omnplay_playlist_item_del(app);
+            playlist_delete_selected_items(app);
             break;
         case BUTTON_PLAYLIST_ITEM_EDIT:
-            omnplay_playlist_item_edit(app);
+            playlist_item_edit(app);
             break;
         case BUTTON_PLAYLIST_LOAD:
-            omnplay_playlist_load(app);
+            playlist_load(app);
             break;
         case BUTTON_PLAYLIST_SAVE:
-            omnplay_playlist_save(app);
+            playlist_save(app);
             break;
         case BUTTON_PLAYLIST_BLOCK_SINGLE:
         case BUTTON_PLAYLIST_BLOCK_LOOP:
-            omnplay_playlist_block(app, button);
+            playlist_block(app, (BUTTON_PLAYLIST_BLOCK_LOOP == button)?1:0);
             break;
         case BUTTON_PLAYLIST_ITEM_UP:
-            omnplay_playlist_item_swap(app, -1);
+            playlist_item_swap(app, -1);
             break;
         case BUTTON_PLAYLIST_ITEM_DOWN:
-            omnplay_playlist_item_swap(app, +1);
+            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);
+            control_route(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);
+//            omnplay_library_refresh(app);
             break;
         case BUTTON_LIBRARY_FIND:
-            omnplay_library_search(app, 0);
+//            omnplay_library_search(app, 0);
             break;
         case BUTTON_LIBRARY_FIND_NEXT:
-            omnplay_library_search(app, 1);
+//            omnplay_library_search(app, 1);
             break;
         case BUTTON_PLAYLIST_RELINK:
-            omnplay_playlist_relink(app);
+//            omnplay_playlist_relink(app);
             break;
+        default:
+            g_warning("instance_button_click: unknow button clicked");
     };
-#endif
     return TRUE;
 };
 
@@ -152,8 +325,12 @@ void instance_init(instance_t* app)
     int i;
     pthread_mutexattr_t attr;
 
-    pthread_mutexattr_init(&attr);
-    pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);
+#if defined(__MINGW32__)
+    WORD wVersionRequested;
+    WSADATA wsaData;
+    wVersionRequested = MAKEWORD(2, 2);
+    WSAStartup(wVersionRequested, &wsaData);
+#endif
 
     gtk_signal_connect( GTK_OBJECT( app->window ), "delete-event",
         GTK_SIGNAL_FUNC(on_main_window_delete_event), app);
@@ -161,25 +338,25 @@ void instance_init(instance_t* 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);
@@ -194,30 +371,11 @@ void instance_init(instance_t* app)
         gtk_signal_connect(GTK_OBJECT(app->buttons[i]), "clicked",
             GTK_SIGNAL_FUNC( on_button_click), app );
 
-    /* load library */
+    /* init library */
     library_init(app);
 
-#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));
-
-    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)
@@ -226,23 +384,22 @@ void instance_release(instance_t* app)
 
     app->f_exit = 1;
 
-    library_release(app);
-
     /* stop unit monitoring threads */
     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);
 };