X-Git-Url: http://research.m1stereo.tv/gitweb?a=blobdiff_plain;f=src%2Fplaylist.c;fp=src%2Fplaylist.c;h=95ecf04c08d50daa1b5e288aeb09fc656ebe811d;hb=4327370bd9e07150bdeea7df0416f87f0417b8ab;hp=a3be0e6a38c12df3a308826cf3c38f78a6446938;hpb=cfbef984de0dc53c8b882d7706556656b9934de2;p=melted_gui diff --git a/src/playlist.c b/src/playlist.c index a3be0e6..95ecf04 100644 --- a/src/playlist.c +++ b/src/playlist.c @@ -31,6 +31,7 @@ #include "playlist.h" #include "ui.h" #include "timecode.h" +#include "library.h" extern GtkTargetEntry drag_targets[]; @@ -338,6 +339,9 @@ void playlist_block(instance_t* app, int loop) start = list[0]; stop = list[c - 1]; + if(loop) + loop = PLAYLIST_BLOCK_LOOP; + if(!playlist_range_cued(app, start, stop)) { /* update selected item */ @@ -566,9 +570,117 @@ void playlist_insert_items(instance_t* app, int idx, playlist_item_t* items, int pthread_mutex_unlock(&app->playlist.lock); }; -#if 0 +void playlist_item_copy(instance_t* app) +{ + int *list, i, c; + + list = playlist_get_selected_items_idx(app, &c); + if(!list) return; + + for(i = 0; i < c; i++) + app->clipboard.item[i] = app->playlist.item[list[i]]; + app->clipboard.count = c; + + free(list); +}; + +void playlist_item_paste(instance_t* app, int after) +{ + int idx, i; + playlist_item_type_t t; + + /* find insert position */ + idx = playlist_get_first_selected_item_idx(app); + if(idx < 0) + idx = 0; + else + idx += (after)?1:0; + + if(!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; + }; + playlist_insert_items(app, idx, app->clipboard.item, app->clipboard.count); + }; +}; + +void playlist_item_swap(instance_t* app, int dir) +{ + int sel, a, b, e = 1; + playlist_item_t item; + + /* find insert position */ + sel = playlist_get_first_selected_item_idx(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(playlist_idx_cued(app, a, NULL) || playlist_idx_cued(app, b, NULL)) + 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 */ + if(app->playlist.item[a].type != app->playlist.item[b].type) + { + e = 0; + app->playlist.item[a].type = PLAYLIST_ITEM_BLOCK_SINGLE; + app->playlist.item[b].type = PLAYLIST_ITEM_BLOCK_SINGLE; + }; + + /* redraw main items */ + ui_playlist_draw_item(app, a); + ui_playlist_draw_item(app, b); + + /* fix block types */ + if(a && !e) + { + app->playlist.item[a - 1].type = (playlist_item_type_t)(app->playlist.item[a - 1].type | + PLAYLIST_BLOCK_END); + ui_playlist_draw_item(app, a - 1); + }; + if(b + 1 < app->playlist.count && !e) + { + app->playlist.item[b + 1].type = (playlist_item_type_t)(app->playlist.item[b + 1].type | + PLAYLIST_BLOCK_BEGIN); + ui_playlist_draw_item(app, b + 1); + }; + + /* select */ + ui_playlist_select_item(app, sel); + + pthread_mutex_unlock(&app->players.lock); + pthread_mutex_unlock(&app->playlist.lock); +}; + -static int load_file_ply(omnplay_instance_t* app, char* filename) +static int playlist_load_file_ply(instance_t* app, char* filename) { FILE* f; char *ID, *CH, *B, *IN, *OUT, *DUR, *REST, *l; @@ -669,7 +781,7 @@ static int load_file_ply(omnplay_instance_t* app, char* filename) pthread_mutex_lock(&app->playlist.lock); for(i = 0; i < count && app->playlist.count + 1 < MAX_PLAYLIST_ITEMS; i++) { - omnplay_library_normalize_item(app, &items[i]); +// omnplay_library_normalize_item(app, &items[i]); app->playlist.item[app->playlist.count++] = items[i]; }; app->playlist.ver_curr++; @@ -689,7 +801,7 @@ static int load_file_ply(omnplay_instance_t* app, char* filename) return count; }; -void omnplay_playlist_load(omnplay_instance_t* app) +void playlist_load(instance_t* app) { int r; GtkWidget *dialog; @@ -722,10 +834,10 @@ void omnplay_playlist_load(omnplay_instance_t* app) filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog)); - r = load_file_ply(app, filename); + r = playlist_load_file_ply(app, filename); if(r) - omnplay_playlist_draw(app); + ui_playlist_draw(app); if(app->playlist.path) g_free(app->playlist.path); @@ -739,7 +851,7 @@ void omnplay_playlist_load(omnplay_instance_t* app) gtk_widget_destroy (dialog); }; -static int save_file_ply(omnplay_instance_t* app, char* filename) +static int playlist_save_file_ply(instance_t* app, char* filename) { int i; FILE* f; @@ -762,6 +874,8 @@ static int save_file_ply(omnplay_instance_t* app, char* filename) frames2tc(app->playlist.item[i].in, 25.0, tc1), frames2tc(app->playlist.item[i].in + app->playlist.item[i].dur, 25.0, tc2), frames2tc(app->playlist.item[i].dur, 25.0, tc3)); + + fclose(f); }; free(filename); @@ -769,7 +883,7 @@ static int save_file_ply(omnplay_instance_t* app, char* filename) return 0; }; -void omnplay_playlist_save(omnplay_instance_t* app) +void playlist_save(instance_t* app) { int r; GtkWidget *dialog; @@ -808,7 +922,7 @@ void omnplay_playlist_save(omnplay_instance_t* app) r = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(gtk_file_chooser_get_filter(GTK_FILE_CHOOSER(dialog))), "id")); - r = save_file_ply(app, filename); + r = playlist_save_file_ply(app, filename); if(app->playlist.path) g_free(app->playlist.path); @@ -820,157 +934,99 @@ void omnplay_playlist_save(omnplay_instance_t* app) } gtk_widget_destroy (dialog); - }; -void omnplay_playlist_draw(omnplay_instance_t* app) -{ - int i; - int* sels; - char tc1[12], tc2[12]; - GtkListStore *list_store; - GtkTreeIter iter; - sels = omnplay_selected_idxs_playlist(app); - - list_store = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(app->playlist_grid))); - gtk_list_store_clear(list_store); +void playlist_relink(instance_t* app) +{ + int i, cnt; + int *list; pthread_mutex_lock(&app->playlist.lock); - - for(i = 0;i < app->playlist.count; i++) + list = playlist_get_selected_items_idx(app, &cnt); + if(list) { - char ch[3]; - - if(PLAYLIST_BLOCK_BEGIN & app->playlist.item[i].type) - snprintf(ch, sizeof(ch), "%c", 'A' + app->playlist.item[i].player); - else - ch[0] = 0; - - gtk_list_store_append(list_store, &iter); - - gtk_list_store_set(list_store, &iter, - 0, "", - 1, app->playlist.block_icons[app->playlist.item[i].type], - 2, ch, - 3, app->playlist.item[i].id, - 4, frames2tc(app->playlist.item[i].in, 25.0, tc1), - 5, frames2tc(app->playlist.item[i].dur, 25.0, tc2), - 6, app->playlist.item[i].title, - 7, i, - 8, (app->playlist.item[i].error != 0), - 9, (app->playlist.item[i].error & PLAYLIST_ITEM_ERROR_LIB)?"red":"orange", - -1 ); - } - - app->playlist.ver_prev = app->playlist.ver_curr; - - if(sels) - { - GtkTreePath *path; + for(i = 0; i < cnt; i++) + { + /* check for playing block */ + if(playlist_idx_cued(app, list[i], NULL)) + continue; - /* select */ - path = gtk_tree_path_new_from_indices(sels[1], -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_view_scroll_to_cell(GTK_TREE_VIEW(app->playlist_grid), path, NULL, FALSE, 0, 0); - gtk_tree_path_free(path); + /* relink item */ + library_relink_item(app, &app->playlist.item[list[i]]); + }; - free(sels); + free(list); }; - pthread_mutex_unlock(&app->playlist.lock); + + /* redraw playlist */ + ui_playlist_draw(app); }; -typedef struct omnplay_playlist_draw_item_desc +void playlist_item_add(instance_t* app, int after) { - GtkListStore *list_store; - omnplay_instance_t* app; int idx; -} omnplay_playlist_draw_item_t; + playlist_item_t item; + playlist_item_type_t t; -static gboolean omnplay_playlist_draw_item_proc( - GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, gpointer user_data) -{ - int i; - char tc1[12], tc2[12]; - char ch[3]; - omnplay_playlist_draw_item_t* item = (omnplay_playlist_draw_item_t*)user_data; - omnplay_instance_t* app = item->app; + /* find insert position */ + idx = playlist_get_first_selected_item_idx(app); + if(idx < 0) + idx = 0; + else + idx += (after)?1:0; - gtk_tree_model_get(model, iter, 7, &i, -1); + if(!playlist_insert_check(app, idx, &t)) + return; - if(i != item->idx) return FALSE; + g_warning("allowed insert into idx=%d\n", idx); - if(PLAYLIST_BLOCK_BEGIN & app->playlist.item[i].type) - snprintf(ch, sizeof(ch), "%c", 'A' + app->playlist.item[i].player); - else - ch[0] = 0; - - gtk_list_store_set(item->list_store, iter, - 0, "", - 1, app->playlist.block_icons[app->playlist.item[i].type], - 2, ch, - 3, app->playlist.item[i].id, - 4, frames2tc(app->playlist.item[i].in, 25.0, tc1), - 5, frames2tc(app->playlist.item[i].dur, 25.0, tc2), - 6, app->playlist.item[i].title, - 7, i, - 8, (app->playlist.item[i].error != 0), - 9, (app->playlist.item[i].error & PLAYLIST_ITEM_ERROR_LIB)?"red":"orange", - -1 ); - - return TRUE; + /* clear item */ + memset(&item, 0, sizeof(playlist_item_t)); + if(ui_playlist_item_dialog(app, &item)) + { + library_normalize_item(app, &item); + item.type = t; + playlist_insert_items(app, idx, &item, 1); + }; }; -void omnplay_playlist_draw_item(omnplay_instance_t* app, int idx) +void playlist_item_edit(instance_t* app) { - GtkListStore *list_store; - omnplay_playlist_draw_item_t item; + int idx; + playlist_item_t item; - list_store = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(app->playlist_grid))); + /* find insert position */ + idx = playlist_get_first_selected_item_idx(app); - pthread_mutex_lock(&app->playlist.lock); + if(idx < 0) + return; - item.idx = idx; - item.app = app; - item.list_store = list_store; - gtk_tree_model_foreach(GTK_TREE_MODEL(list_store), omnplay_playlist_draw_item_proc, &item); + /* check for playing block */ + if(playlist_idx_cued(app, idx, NULL)) + return; - pthread_mutex_unlock(&app->playlist.lock); + item = app->playlist.item[idx]; + + if(ui_playlist_item_dialog(app, &item)) + { + library_normalize_item(app, &item); + app->playlist.item[idx] = item; + ui_playlist_draw_item(app, idx); + }; }; -static gboolean omnplay_playlist_draw_item_rem_proc( - GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, gpointer user_data) +void playlist_item_add_from_library(instance_t* app, int after) { - int i; - void** args = (void**)user_data; - GtkListStore *list_store = (GtkListStore *)args[1]; - int idx = (int)args[2]; - char* rem = (char*)args[3]; - - gtk_tree_model_get(model, iter, 7, &i, -1); - - if(i != idx) return FALSE; - - gtk_list_store_set(list_store, iter, 0, rem, -1); - - return TRUE; }; -void omnplay_playlist_draw_item_rem(omnplay_instance_t* app, int idx, char* rem) +void playlist_normalize(instance_t* app) { - void* item[4]; - GtkListStore *list_store; - - list_store = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(app->playlist_grid))); - - item[0] = (void*)app; - item[1] = (void*)list_store; - item[2] = (void*)idx; - item[3] = (void*)rem; + int i; - gtk_tree_model_foreach(GTK_TREE_MODEL(list_store), omnplay_playlist_draw_item_rem_proc, item); + /* normalize playlist */ + for(i = 0; i < app->playlist.count; i++) + if(library_normalize_item(app, &app->playlist.item[i])) + ui_playlist_draw_item(app, i); }; - -#endif