X-Git-Url: http://research.m1stereo.tv/gitweb?a=blobdiff_plain;f=src%2Fomnplay.cpp;h=c5fe925ccaa72576b915f5abed64e8ec2e31c152;hb=8ed1e720aacd066d1d7870d1f02b35ccd02c81db;hp=d460135026002b7e79464d43bc23850862100f06;hpb=0eacb2babbab14c5318e883963073b32079a9aff;p=omnplay diff --git a/src/omnplay.cpp b/src/omnplay.cpp index d460135..c5fe925 100644 --- a/src/omnplay.cpp +++ b/src/omnplay.cpp @@ -402,7 +402,7 @@ static void omnplay_playlist_block(omnplay_instance_t* app, control_buttons_t bu }; /* update border items */ - if(!start && !(app->playlist.item[start - 1].type & OMNPLAY_PLAYLIST_BLOCK_END)) + if(start && !(app->playlist.item[start - 1].type & OMNPLAY_PLAYLIST_BLOCK_END)) { app->playlist.item[start - 1].type = (playlist_item_type_t)(OMNPLAY_PLAYLIST_BLOCK_END | app->playlist.item[start - 1].type); @@ -482,12 +482,16 @@ static void omnplay_playlist_delete_items(omnplay_instance_t* app, int* idxs, in 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); + if( app->playlist.item[idx].type != OMNPLAY_PLAYLIST_ITEM_BLOCK_BODY && + app->playlist.item[idx].type != OMNPLAY_PLAYLIST_ITEM_LOOP_BODY) + { + 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 @@ -642,6 +646,7 @@ static void omnplay_playlist_item_add(omnplay_instance_t* app, int after) memset(&item, 0, sizeof(playlist_item_t)); if(ui_playlist_item_dialog(app, &item)) { + omnplay_library_normalize_item(app, &item); item.type = t; omnplay_playlist_insert_items(app, idx, &item, 1); }; @@ -666,6 +671,7 @@ static void omnplay_playlist_item_edit(omnplay_instance_t* app) if(ui_playlist_item_dialog(app, &item)) { + omnplay_library_normalize_item(app, &item); app->playlist.item[idx] = item; omnplay_playlist_draw_item(app, idx); }; @@ -766,11 +772,13 @@ static void omnplay_ctl(omnplay_instance_t* app, control_buttons_t button) fprintf(stderr, "cue: failed with %d, %s\n", r, OmPlrGetErrorString((OmPlrError)r)); app->playlist.item[i].omn_idx = -1; app->playlist.item[i].omn_offset = -1; + app->playlist.item[i].error |= PLAYLIST_ITEM_ERROR_CUE; } else { app->playlist.item[i].omn_idx = c; app->playlist.item[i].omn_offset = o; + app->playlist.item[i].error &= 0xF ^ PLAYLIST_ITEM_ERROR_CUE; /* save selected item offset */ if(i == idx) p = o; @@ -825,7 +833,7 @@ static void omnplay_ctl(omnplay_instance_t* app, control_buttons_t button) static void omnplay_playlist_item_swap(omnplay_instance_t* app, int dir) { - int sel, a, b; + int sel, a, b, e = 1; GtkTreePath* path; playlist_item_t item; @@ -860,21 +868,25 @@ static void omnplay_playlist_item_swap(omnplay_instance_t* app, int dir) 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; + if(app->playlist.item[a].type != app->playlist.item[b].type) + { + e = 0; + 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) + if(a && !e) { 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) + if(b + 1 < app->playlist.count && !e) { app->playlist.item[b + 1].type = (playlist_item_type_t)(app->playlist.item[b + 1].type | OMNPLAY_PLAYLIST_BLOCK_BEGIN); @@ -891,6 +903,37 @@ static void omnplay_playlist_item_swap(omnplay_instance_t* app, int dir) pthread_mutex_unlock(&app->playlist.lock); }; +static void omnplay_library_add(omnplay_instance_t* app, int after) +{ + int idx, c, i; + playlist_item_t* items; + playlist_item_type_t t; + + /* find insert position */ + idx = get_first_selected_item_playlist(app); + if(idx < 0) + idx = 0; + else + idx += (after)?1:0; + + if(!omnplay_playlist_insert_check(app, idx, &t)) + return; + + items = omnplay_library_get_selected(app, &c); + + /* clear item */ + if(items) + { + for(i = 0; i < c; i++) + { + items[i].type = t; + items[i].error = 0; + }; + omnplay_playlist_insert_items(app, idx, items, c); + }; +}; + + static gboolean omnplay_button_click(omnplay_instance_t* app, control_buttons_t button) { switch(button) @@ -927,10 +970,17 @@ static gboolean omnplay_button_click(omnplay_instance_t* app, control_buttons_t omnplay_ctl(app, button); break; case BUTTON_LIBRARY_ADD: + omnplay_library_add(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; }; return TRUE; @@ -948,6 +998,48 @@ static gboolean on_button_click(GtkWidget *button, gpointer user_data) return FALSE; }; +static void omnplay_playlist_item_copy(omnplay_instance_t* app) +{ + int *list, i; + + list = get_selected_items_playlist(app); + if(!list) return; + + for(i = 0; i < list[0]; i++) + app->clipboard.item[i] = app->playlist.item[list[i + 1]]; + app->clipboard.count = list[0]; + + free(list); +}; + +static void omnplay_playlist_item_paste(omnplay_instance_t* app, int after) +{ + int idx, i; + playlist_item_t* items; + playlist_item_type_t t; + + /* find insert position */ + idx = get_first_selected_item_playlist(app); + if(idx < 0) + idx = 0; + else + idx += (after)?1:0; + + if(!omnplay_playlist_insert_check(app, idx, &t)) + return; + + /* clear item */ + if(app->clipboard.count) + { + for(i = 0; i < app->clipboard.count; i++) + { + app->clipboard.item[i].type = t; + app->clipboard.item[i].error = 0; + }; + omnplay_playlist_insert_items(app, idx, app->clipboard.item, app->clipboard.count); + }; +}; + static gboolean on_playlist_grid_key(GtkWidget *widget, GdkEventKey *event, gpointer data) { omnplay_instance_t* app = (omnplay_instance_t*)data; @@ -958,7 +1050,7 @@ static gboolean on_playlist_grid_key(GtkWidget *widget, GdkEventKey *event, gpoi case GDK_c: if(event->state & GDK_CONTROL_MASK) { - fprintf(stderr, "CTRL+c\n"); + omnplay_playlist_item_copy(app); return TRUE; }; break; @@ -966,7 +1058,7 @@ static gboolean on_playlist_grid_key(GtkWidget *widget, GdkEventKey *event, gpoi case GDK_v: if(event->state & GDK_CONTROL_MASK) { - fprintf(stderr, "CTRL+v\n"); + omnplay_playlist_item_paste(app, 0); return TRUE; }; break; @@ -974,7 +1066,24 @@ static gboolean on_playlist_grid_key(GtkWidget *widget, GdkEventKey *event, gpoi case GDK_x: if(event->state & GDK_CONTROL_MASK) { - fprintf(stderr, "CTRL+x\n"); + omnplay_playlist_item_copy(app); + omnplay_playlist_item_del(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; @@ -998,6 +1107,55 @@ static gboolean on_playlist_grid_key(GtkWidget *widget, GdkEventKey *event, gpoi return FALSE; }; +static gboolean on_library_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) + { + int count; + playlist_item_t* items; + + items = omnplay_library_get_selected(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) + { + 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; + }; + + return FALSE; +}; + void omnplay_init(omnplay_instance_t* app) { int i; @@ -1015,6 +1173,10 @@ void omnplay_init(omnplay_instance_t* app) gtk_signal_connect(GTK_OBJECT(app->playlist_grid), "key-press-event", GTK_SIGNAL_FUNC(on_playlist_grid_key), app); + gtk_widget_add_events(app->library_grid, GDK_BUTTON_PRESS_MASK); + gtk_signal_connect(GTK_OBJECT(app->library_grid), "key-press-event", + GTK_SIGNAL_FUNC(on_library_grid_key), app); + /* create lock */ pthread_mutex_init(&app->players.lock, &attr); @@ -1061,3 +1223,13 @@ void omnplay_release(omnplay_instance_t* app) /* destroy library lock */ pthread_mutex_destroy(&app->library.lock); }; + +void omnplay_playlist_normalize(omnplay_instance_t* app) +{ + int i; + + /* normalize playlist */ + for(i = 0; i < app->playlist.count; i++) + if(omnplay_library_normalize_item(app, &app->playlist.item[i])) + omnplay_playlist_draw_item(app, i); +};