X-Git-Url: http://research.m1stereo.tv/gitweb?a=blobdiff_plain;f=src%2Fomnplay.cpp;h=a58b8ee90ab300945328dc9d2003db83b5655446;hb=032fec4a7dc8982450bf5b170f70222b90981239;hp=33efdd6cf4ea5c8a4310254d35a9005cb542d968;hpb=96b75bbe817138205ca313e5be93d952a888a4ef;p=omnplay diff --git a/src/omnplay.cpp b/src/omnplay.cpp index 33efdd6..a58b8ee 100644 --- a/src/omnplay.cpp +++ b/src/omnplay.cpp @@ -415,9 +415,84 @@ static omnplay_player_t *get_player_at_pos(omnplay_instance_t* app, int pos) return NULL; }; +static void omnplay_playlist_delete_items(omnplay_instance_t* app, int* idxs, int count) +{ + int i, j, idx; + GtkTreePath* path; + + pthread_mutex_lock(&app->playlist.lock); + pthread_mutex_lock(&app->players.lock); + + for(j = 0; j < count; j++) + { + idx = idxs[j] - j; + + /* fix block types */ + 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) + app->playlist.item[idx + 1].type = (playlist_item_type_t)(app->playlist.item[idx + 1].type | + OMNPLAY_PLAYLIST_BLOCK_BEGIN); + + /* shift playlist items */ + memmove + ( + &app->playlist.item[idx], + &app->playlist.item[idx + 1], + (app->playlist.count - idx - 1) * sizeof(playlist_item_t) + ); + + /* decrement items count */ + app->playlist.count--; + + /* increment servers indexes */ + for(i = 0; i < app->players.count; i++) + if(app->players.item[i].playlist_start >= idx) + app->players.item[i].playlist_start--; + + + }; + + /* redraw playlist */ + omnplay_playlist_draw(app); + + /* select */ + path = gtk_tree_path_new_from_indices(idxs[0], -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 void omnplay_playlist_item_del(omnplay_instance_t* app) { + int i, idx, c; + int *list, *list2; + list = get_selected_items_playlist(app); + if(!list) return; + + list2 = (int*)malloc(sizeof(int) * list[0]); + + for(i = 0, c = 0; i < list[0]; i++) + { + /* check for playing block */ + if(idx_in_players_range(app, list[i + 1])) + continue; + + /* save index */ + list2[c++] = list[i + 1]; + }; + + if(c) + omnplay_playlist_delete_items(app, list2, c); + + free(list2); + free(list); }; static int omnplay_playlist_insert_check(omnplay_instance_t* app, int idx, playlist_item_type_t* t) @@ -520,7 +595,26 @@ static void omnplay_playlist_item_add(omnplay_instance_t* app, int after) static void omnplay_playlist_item_edit(omnplay_instance_t* app) { + int idx; + playlist_item_t item; + + /* find insert position */ + idx = get_first_selected_item_playlist(app); + if(idx < 0) + return; + + /* check for playing block */ + if(idx_in_players_range(app, idx)) + return; + + item = app->playlist.item[idx]; + + if(ui_playlist_item_dialog(app, &item)) + { + app->playlist.item[idx] = item; + omnplay_playlist_draw_item(app, idx); + }; }; static void omnplay_ctl(omnplay_instance_t* app, control_buttons_t button) @@ -675,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) @@ -699,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: @@ -727,6 +892,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; @@ -737,6 +952,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);