From: Maksym Veremeyenko Date: Mon, 9 Jul 2012 03:21:02 +0000 (+0300) Subject: playlist save/load: step 1 X-Git-Url: http://research.m1stereo.tv/gitweb?a=commitdiff_plain;h=86c9dd5a491cd7ebead02b73896af7e65084a3d4;p=melted_gui playlist save/load: step 1 --- diff --git a/src/playlist.c b/src/playlist.c index 95ecf04..287d964 100644 --- a/src/playlist.c +++ b/src/playlist.c @@ -679,7 +679,7 @@ void playlist_item_swap(instance_t* app, int dir) pthread_mutex_unlock(&app->playlist.lock); }; - +#if 0 static int playlist_load_file_ply(instance_t* app, char* filename) { FILE* f; @@ -801,56 +801,6 @@ static int playlist_load_file_ply(instance_t* app, char* filename) return count; }; -void playlist_load(instance_t* app) -{ - int r; - GtkWidget *dialog; - GtkFileFilter *filter; - - dialog = gtk_file_chooser_dialog_new("Open File", - GTK_WINDOW (app->window), - GTK_FILE_CHOOSER_ACTION_OPEN, - GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, - GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, - NULL); - - gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(dialog), - (app->playlist.path)?app->playlist.path:getenv("HOME")); - - filter = gtk_file_filter_new(); - gtk_file_filter_set_name(filter, "Playlist formatted (*.ply)"); - gtk_file_filter_add_pattern(filter, "*.ply"); - gtk_file_chooser_add_filter(GTK_FILE_CHOOSER (dialog), filter); - filter = gtk_file_filter_new(); - gtk_file_filter_set_name(filter, "All types (*.*)"); - gtk_file_filter_add_pattern(filter, "*.*"); - gtk_file_chooser_add_filter(GTK_FILE_CHOOSER (dialog), filter); - - r = gtk_dialog_run(GTK_DIALOG(dialog)); - - if(r == GTK_RESPONSE_ACCEPT) - { - char *filename; - - filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog)); - - r = playlist_load_file_ply(app, filename); - - if(r) - ui_playlist_draw(app); - - if(app->playlist.path) - g_free(app->playlist.path); - if((app->playlist.path = filename)) - { - char* e = strrchr(app->playlist.path, '/'); - if(e) *e = 0; - } - } - - gtk_widget_destroy (dialog); -}; - static int playlist_save_file_ply(instance_t* app, char* filename) { int i; @@ -882,58 +832,58 @@ static int playlist_save_file_ply(instance_t* app, char* filename) return 0; }; +#endif -void playlist_save(instance_t* app) +static int playlist_load_plm(instance_t* app, char* filename) { - int r; - GtkWidget *dialog; - GtkFileFilter *filter; - - dialog = gtk_file_chooser_dialog_new("Save File", - GTK_WINDOW (app->window), - GTK_FILE_CHOOSER_ACTION_SAVE, - GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, - GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT, - NULL); - - gtk_file_chooser_set_do_overwrite_confirmation(GTK_FILE_CHOOSER(dialog), TRUE); - - gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(dialog), - (app->playlist.path)?app->playlist.path:getenv("HOME")); - - filter = gtk_file_filter_new(); - gtk_file_filter_set_name(filter, "Playlist formatted (*.ply)"); - gtk_file_filter_add_pattern(filter, "*.ply"); - gtk_file_chooser_add_filter(GTK_FILE_CHOOSER (dialog), filter); - g_object_set_data(G_OBJECT(filter), "id", GINT_TO_POINTER(0)); - filter = gtk_file_filter_new(); - gtk_file_filter_set_name(filter, "Text (*.txt)"); - gtk_file_filter_add_pattern(filter, "*.*"); - gtk_file_chooser_add_filter(GTK_FILE_CHOOSER (dialog), filter); - g_object_set_data(G_OBJECT(filter), "id", GINT_TO_POINTER(1)); - - r = gtk_dialog_run(GTK_DIALOG(dialog)); - - if(r == GTK_RESPONSE_ACCEPT) - { - char *filename; + return 0; +}; - filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog)); +static int playlist_save_plm(instance_t* app, char* filename) +{ + return 0; +}; - r = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(gtk_file_chooser_get_filter(GTK_FILE_CHOOSER(dialog))), "id")); +static int playlist_load_plx(instance_t* app, char* filename) +{ + return -1; +}; - r = playlist_save_file_ply(app, filename); +static int playlist_save_plx(instance_t* app, char* filename) +{ + return -1; +}; - if(app->playlist.path) - g_free(app->playlist.path); - if((app->playlist.path = filename)) - { - char* e = strrchr(app->playlist.path, '/'); - if(e) *e = 0; - } +static struct ui_playlist_io_funcs playlist_io[] = +{ + { + "Text formatted playlist (*.plt)", + "*.plm", + playlist_load_plm, + playlist_save_plm + }, + { + "Xml formatted playlist (*.plx)", + "*.plx", + playlist_load_plx, + playlist_save_plx, + }, + { + NULL, + NULL, + NULL, + NULL } +}; + +void playlist_load(instance_t* app) +{ + ui_playlist_load(app, (app->playlist.path)?app->playlist.path:getenv("HOME"), playlist_io); +}; - gtk_widget_destroy (dialog); +void playlist_save(instance_t* app) +{ + ui_playlist_save(app, (app->playlist.path)?app->playlist.path:getenv("HOME"), playlist_io); }; diff --git a/src/ui.c b/src/ui.c index b7c230e..cf5168f 100644 --- a/src/ui.c +++ b/src/ui.c @@ -984,3 +984,120 @@ void ui_playlist_draw_item(instance_t* app, int idx) pthread_mutex_unlock(&app->playlist.lock); }; + +void ui_set_status(instance_t* app, char* str) +{ + gdk_threads_enter(); + gtk_label_set_text(GTK_LABEL(app->status_label), str); + gdk_flush(); + gdk_threads_leave(); +}; + +int ui_playlist_load(instance_t* app, char* path, struct ui_playlist_io_funcs* procs) +{ + int r, i; + + GtkWidget *dialog; + GtkFileFilter *filter; + + dialog = gtk_file_chooser_dialog_new("Open File", + GTK_WINDOW (app->window), + GTK_FILE_CHOOSER_ACTION_OPEN, + GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, + GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, + NULL); + + gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(dialog), path); + + for(i = 0; procs[i].title; i++) + { + filter = gtk_file_filter_new(); + gtk_file_filter_set_name(filter, procs[i].title); + gtk_file_filter_add_pattern(filter, procs[i].ext); + g_object_set_data(G_OBJECT(filter), "id", GINT_TO_POINTER(i)); + gtk_file_chooser_add_filter(GTK_FILE_CHOOSER (dialog), filter); + }; + + r = gtk_dialog_run(GTK_DIALOG(dialog)); + + if(r == GTK_RESPONSE_ACCEPT) + { + char *filename; + + filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog)); + + i = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(gtk_file_chooser_get_filter(GTK_FILE_CHOOSER(dialog))), "id")); + + r = procs[i].load(app, filename); + + ui_playlist_draw(app); + + if(app->playlist.path) + g_free(app->playlist.path); + if((app->playlist.path = filename)) + { + char* e = strrchr(app->playlist.path, '/'); + if(e) *e = 0; + } + } + else + r = -1; + + gtk_widget_destroy (dialog); + + return r; +}; + +int ui_playlist_save(instance_t* app, char* path, struct ui_playlist_io_funcs* procs) +{ + int r, i; + GtkWidget *dialog; + GtkFileFilter *filter; + + dialog = gtk_file_chooser_dialog_new("Save File", + GTK_WINDOW (app->window), + GTK_FILE_CHOOSER_ACTION_SAVE, + GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, + GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT, + NULL); + + gtk_file_chooser_set_do_overwrite_confirmation(GTK_FILE_CHOOSER(dialog), TRUE); + + gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(dialog), path); + + for(i = 0; procs[i].title; i++) + { + filter = gtk_file_filter_new(); + gtk_file_filter_set_name(filter, procs[i].title); + gtk_file_filter_add_pattern(filter, procs[i].ext); + g_object_set_data(G_OBJECT(filter), "id", GINT_TO_POINTER(i)); + gtk_file_chooser_add_filter(GTK_FILE_CHOOSER (dialog), filter); + }; + + r = gtk_dialog_run(GTK_DIALOG(dialog)); + + if(r == GTK_RESPONSE_ACCEPT) + { + char *filename; + + filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog)); + + i = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(gtk_file_chooser_get_filter(GTK_FILE_CHOOSER(dialog))), "id")); + + r = procs[i].save(app, filename); + + if(app->playlist.path) + g_free(app->playlist.path); + if((app->playlist.path = filename)) + { + char* e = strrchr(app->playlist.path, '/'); + if(e) *e = 0; + } + } + else + r = -1; + + gtk_widget_destroy (dialog); + + return r; +}; diff --git a/src/ui.h b/src/ui.h index 88301cb..8e7353a 100644 --- a/src/ui.h +++ b/src/ui.h @@ -34,6 +34,19 @@ void ui_playlist_draw_item(instance_t* app, int idx); void ui_playlist_select_item(instance_t* app, int idx); int ui_playlist_item_dialog(instance_t* app, playlist_item_t* item); void ui_playlist_draw(instance_t* app); +void ui_set_status(instance_t* app, char* str); + +struct ui_playlist_io_funcs +{ + char* title; + char* ext; + int (*load)(instance_t* app, char* filename); + int (*save)(instance_t* app, char* filename); +}; + +int ui_playlist_load(instance_t* app, char* path, struct ui_playlist_io_funcs* procs); +int ui_playlist_save(instance_t* app, char* path, struct ui_playlist_io_funcs* procs); + #ifdef __cplusplus };