X-Git-Url: http://research.m1stereo.tv/gitweb?a=blobdiff_plain;f=src%2Fomnplay.cpp;h=55358283cf1c3fc75b3811ca7a7ffd2511e59b5f;hb=2fa18b4bcda04deff180348cf675f571f79aad17;hp=e35479f9610e53983e2d120f3316d8f972798acc;hpb=5ad064d3b7783d03e72c8d2b3a20888b84619625;p=melted_gui diff --git a/src/omnplay.cpp b/src/omnplay.cpp index e35479f..5535828 100644 --- a/src/omnplay.cpp +++ b/src/omnplay.cpp @@ -428,7 +428,7 @@ static void omnplay_playlist_delete_items(omnplay_instance_t* app, int* idxs, in idx = idxs[j] - j; /* fix block types */ - if(!idx) + if(idx) app->playlist.item[idx - 1].type = (playlist_item_type_t)(app->playlist.item[idx - 1].type | OMNPLAY_PLAYLIST_BLOCK_END); if(idx + 1 < app->playlist.count) @@ -769,6 +769,74 @@ static void omnplay_ctl(omnplay_instance_t* app, control_buttons_t button) pthread_mutex_unlock(&app->playlist.lock); }; +static void omnplay_playlist_item_swap(omnplay_instance_t* app, int dir) +{ + int sel, a, b; + GtkTreePath* path; + playlist_item_t item; + + /* find insert position */ + sel = get_first_selected_item_playlist(app); + if(sel < 0) + return; + + if(dir < 0) + { + a = sel - 1; + b = sel; + sel = a; + } + else + { + a = sel; + b = sel + 1; + sel = b; + }; + + /* check for playing block */ + if(idx_in_players_range(app, a) || idx_in_players_range(app, b)) + return; + + pthread_mutex_lock(&app->playlist.lock); + pthread_mutex_lock(&app->players.lock); + + /* swap */ + item = app->playlist.item[a]; + app->playlist.item[a] = app->playlist.item[b]; + app->playlist.item[b] = item; + + /* rewite type */ + app->playlist.item[a].type = OMNPLAY_PLAYLIST_ITEM_BLOCK_SINGLE; + app->playlist.item[b].type = OMNPLAY_PLAYLIST_ITEM_BLOCK_SINGLE; + + /* redraw main items */ + omnplay_playlist_draw_item(app, a); + omnplay_playlist_draw_item(app, b); + + /* fix block types */ + if(a) + { + app->playlist.item[a - 1].type = (playlist_item_type_t)(app->playlist.item[a - 1].type | + OMNPLAY_PLAYLIST_BLOCK_END); + omnplay_playlist_draw_item(app, a - 1); + }; + if(b + 1 < app->playlist.count) + { + app->playlist.item[b + 1].type = (playlist_item_type_t)(app->playlist.item[b + 1].type | + OMNPLAY_PLAYLIST_BLOCK_BEGIN); + omnplay_playlist_draw_item(app, b + 1); + }; + + /* select */ + path = gtk_tree_path_new_from_indices(sel, -1); + gtk_tree_selection_select_path(gtk_tree_view_get_selection(GTK_TREE_VIEW(app->playlist_grid)), path); + gtk_tree_view_set_cursor(GTK_TREE_VIEW(app->playlist_grid), path, NULL, FALSE); + gtk_tree_path_free(path); + + pthread_mutex_unlock(&app->players.lock); + pthread_mutex_unlock(&app->playlist.lock); +}; + static gboolean omnplay_button_click(omnplay_instance_t* app, control_buttons_t button) { switch(button) @@ -793,7 +861,10 @@ static gboolean omnplay_button_click(omnplay_instance_t* app, control_buttons_t omnplay_playlist_block(app, button); break; case BUTTON_PLAYLIST_ITEM_UP: + omnplay_playlist_item_swap(app, -1); + break; case BUTTON_PLAYLIST_ITEM_DOWN: + omnplay_playlist_item_swap(app, +1); break; case BUTTON_PLAYER_CUE: case BUTTON_PLAYER_PLAY: @@ -802,7 +873,9 @@ static gboolean omnplay_button_click(omnplay_instance_t* app, control_buttons_t omnplay_ctl(app, button); break; case BUTTON_LIBRARY_ADD: + break; case BUTTON_LIBRARY_REFRESH: + omnplay_library_refresh(app); break; }; @@ -821,6 +894,56 @@ static gboolean on_button_click(GtkWidget *button, gpointer user_data) return FALSE; }; +static gboolean on_playlist_grid_key(GtkWidget *widget, GdkEventKey *event, gpointer data) +{ + omnplay_instance_t* app = (omnplay_instance_t*)data; + + switch(event->keyval) + { + case GDK_C: + case GDK_c: + if(event->state & GDK_CONTROL_MASK) + { + fprintf(stderr, "CTRL+c\n"); + return TRUE; + }; + break; + case GDK_V: + case GDK_v: + if(event->state & GDK_CONTROL_MASK) + { + fprintf(stderr, "CTRL+v\n"); + return TRUE; + }; + break; + case GDK_X: + case GDK_x: + if(event->state & GDK_CONTROL_MASK) + { + fprintf(stderr, "CTRL+x\n"); + 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: + omnplay_playlist_item_del(app); + return TRUE; + case GDK_KEY_BackSpace: + omnplay_playlist_item_edit(app); + return TRUE; + }; + + return FALSE; +}; + void omnplay_init(omnplay_instance_t* app) { int i; @@ -831,6 +954,10 @@ void omnplay_init(omnplay_instance_t* app) gtk_signal_connect( GTK_OBJECT( app->window ), "destroy", GTK_SIGNAL_FUNC(on_main_window_delete_event), app); + gtk_widget_add_events(app->playlist_grid, GDK_BUTTON_PRESS_MASK); + gtk_signal_connect(GTK_OBJECT(app->playlist_grid), "key-press-event", + GTK_SIGNAL_FUNC(on_playlist_grid_key), app); + /* create lock */ pthread_mutex_init(&app->players.lock, &attr); @@ -847,6 +974,11 @@ void omnplay_init(omnplay_instance_t* app) gtk_signal_connect(GTK_OBJECT(app->buttons[i]), "clicked", GTK_SIGNAL_FUNC( on_button_click), app ); + /* create lock */ + pthread_mutex_init(&app->library.lock, &attr); + + /* load library */ + omnplay_library_load(app); }; void omnplay_release(omnplay_instance_t* app) @@ -865,4 +997,10 @@ void omnplay_release(omnplay_instance_t* app) /* destroy lock */ pthread_mutex_destroy(&app->playlist.lock); + + /* load library */ + omnplay_library_save(app); + + /* destroy library lock */ + pthread_mutex_destroy(&app->library.lock); };