Enlightenment CVS committal Author : moom16 Project : e17 Module : apps/eclair
Dir : e17/apps/eclair/src Modified Files: eclair.c eclair_args.c eclair_callbacks.c eclair_config.c eclair_dialogs.c eclair_dialogs.h eclair_playlist.c eclair_playlist.h eclair_private.h Log Message: * Should fix a segv which happened on exit, related to gtk * Improve the behavior of the gtk file chooser: - We can now add folders - an "All" and a "None" buttons to select the files in the chooser - Save the last location opened - Add a file chooser for load a playlist * Save the the playlist on exit, and reload it during the next start of eclair * Some code cleanup =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/eclair/src/eclair.c,v retrieving revision 1.16 retrieving revision 1.17 diff -u -3 -r1.16 -r1.17 --- eclair.c 18 May 2005 15:36:25 -0000 1.16 +++ eclair.c 20 May 2005 13:50:32 -0000 1.17 @@ -76,10 +76,15 @@ eclair_cover_init(&eclair->cover_manager, eclair); eclair_update_current_file_info(eclair, 0); - for (l = filenames; l; l = l->next) - eclair_playlist_add_uri(&eclair->playlist, (char *)l->data, 0); - evas_list_free(filenames); - eclair_playlist_container_update(eclair->playlist_container); + if ((l = filenames)) + { + for (; l; l = l->next) + eclair_playlist_add_uri(&eclair->playlist, (char *)l->data, 0); + evas_list_free(filenames); + eclair_playlist_container_update(eclair->playlist_container); + } + else + eclair_playlist_add_uri(&eclair->playlist, eclair->config.default_playlist_path, 0); ecore_event_handler_add(ECORE_X_EVENT_XDND_POSITION, eclair_gui_dnd_position_cb, eclair); ecore_event_handler_add(ECORE_X_EVENT_XDND_DROP, eclair_gui_dnd_drop_cb, eclair); @@ -106,9 +111,11 @@ fprintf(stderr, "Eclair: Debug: Destroying create video object thread\n"); pthread_join(eclair->video_create_thread, NULL); fprintf(stderr, "Eclair: Debug: Create video object thread destroyed\n"); + eclair_dialogs_shutdown(&eclair->dialogs_manager); eclair_subtitles_free(&eclair->subtitles); eclair_meta_tag_shutdown(&eclair->meta_tag_manager); eclair_cover_shutdown(&eclair->cover_manager); + eclair_playlist_save(&eclair->playlist, eclair->config.default_playlist_path); eclair_playlist_shutdown(&eclair->playlist); eclair_config_shutdown(&eclair->config); free(eclair->gui_theme_file); =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/eclair/src/eclair_args.c,v retrieving revision 1.5 retrieving revision 1.6 diff -u -3 -r1.5 -r1.6 --- eclair_args.c 18 May 2005 15:36:25 -0000 1.5 +++ eclair_args.c 20 May 2005 13:50:32 -0000 1.6 @@ -73,7 +73,7 @@ static void _eclair_args_print_usage() { - printf("Usage: eclair [arguments] file(s)\n" + fprintf(stdout, "Usage: eclair [arguments] file(s)\n" "\n" "Available arguments:\n" "-h, --help Print this message and exit\n" =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/eclair/src/eclair_callbacks.c,v retrieving revision 1.11 retrieving revision 1.12 diff -u -3 -r1.11 -r1.12 --- eclair_callbacks.c 18 May 2005 15:36:25 -0000 1.11 +++ eclair_callbacks.c 20 May 2005 13:50:32 -0000 1.12 @@ -183,7 +183,7 @@ if (!eclair) return; - eclair_dialogs_open_file_dialog(&eclair->dialogs_manager); + eclair_dialogs_open_add_files_fc(&eclair->dialogs_manager); } //Called when the user clicks on play button =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/eclair/src/eclair_config.c,v retrieving revision 1.6 retrieving revision 1.7 diff -u -3 -r1.6 -r1.7 --- eclair_config.c 18 May 2005 15:36:25 -0000 1.6 +++ eclair_config.c 20 May 2005 13:50:32 -0000 1.7 @@ -17,6 +17,7 @@ config->config_dir_path[0] = 0; config->covers_dir_path[0] = 0; config->config_file_path[0] = 0; + config->default_playlist_path[0] = 0; if (!(home = getenv("HOME"))) return 0; @@ -26,6 +27,7 @@ sprintf(config->covers_dir_path, "%scovers/", config->config_dir_path); ecore_file_mkdir(config->covers_dir_path); sprintf(config->config_file_path, "%seclair.cfg", config->config_dir_path); + sprintf(config->default_playlist_path, "%splaylist.m3u", config->config_dir_path); eclair_config_load(config); =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/eclair/src/eclair_dialogs.c,v retrieving revision 1.1 retrieving revision 1.2 diff -u -3 -r1.1 -r1.2 --- eclair_dialogs.c 18 May 2005 15:36:25 -0000 1.1 +++ eclair_dialogs.c 20 May 2005 13:50:32 -0000 1.2 @@ -1,40 +1,46 @@ #include "eclair_dialogs.h" #include <gtk/gtk.h> #include "eclair.h" +#include "eclair_config.h" #include "eclair_playlist.h" #include "eclair_playlist_container.h" -static void _eclair_dialogs_on_open_files(gpointer data, guint action, GtkWidget *widget); -static void _eclair_dialogs_on_select_all(gpointer data, guint action, GtkWidget *widget); -static void _eclair_dialogs_on_select_none(gpointer data, guint action, GtkWidget *widget); -static void _eclair_dialogs_on_invert_selection(gpointer data, guint action, GtkWidget *widget); -static void _eclair_dialogs_on_remove_selected(gpointer data, guint action, GtkWidget *widget); -static void _eclair_dialogs_on_remove_unselected(gpointer data, guint action, GtkWidget *widget); -static void _eclair_dialogs_on_remove_all(gpointer data, guint action, GtkWidget *widget); +static void *_eclair_dialogs_thread(void *param); +static gint _eclair_dialogs_update(gpointer data); +static void _eclair_dialogs_open_fc_open(Eclair_Dialogs_Manager *dialogs_manager, Eclair_Dialog_Open_FC_Type fc_type); +static gboolean _eclair_dialogs_open_fc_on_ok(GtkWidget *widget, gpointer data); +static gboolean _eclair_dialogs_open_fc_on_delete(GtkWidget *widget, GdkEvent *event, gpointer data); +static void _eclair_dialogs_menu_on_add_files(gpointer data, guint action, GtkWidget *widget); +static void _eclair_dialogs_menu_on_load_list(gpointer data, guint action, GtkWidget *widget); +static void _eclair_dialogs_menu_on_save_list(gpointer data, guint action, GtkWidget *widget); +static void _eclair_dialogs_menu_on_select_all(gpointer data, guint action, GtkWidget *widget); +static void _eclair_dialogs_menu_on_select_none(gpointer data, guint action, GtkWidget *widget); +static void _eclair_dialogs_menu_on_invert_selection(gpointer data, guint action, GtkWidget *widget); +static void _eclair_dialogs_menu_on_remove_selected(gpointer data, guint action, GtkWidget *widget); +static void _eclair_dialogs_menu_on_remove_unselected(gpointer data, guint action, GtkWidget *widget); +static void _eclair_dialogs_menu_on_remove_all(gpointer data, guint action, GtkWidget *widget); static GtkItemFactoryEntry menu_items[] = { - { "/tear", NULL, NULL, 0, "<Tearoff>" }, - { "/Open", NULL, NULL, 0, "<Branch>" }, - { "/Open/tear", NULL, NULL, 0, "<Tearoff>" }, - { "/Open/Open Files...", NULL, _eclair_dialogs_on_open_files, 1, "<Item>" }, - { "/Playlist", NULL, NULL, 0, "<Branch>" }, - { "/Playlist/tear", NULL, NULL, 0, "<Tearoff>" }, - { "/Playlist/Select All", NULL, _eclair_dialogs_on_select_all, 1, "<Item>" }, - { "/Playlist/Select None", NULL, _eclair_dialogs_on_select_none, 1, "<Item>" }, - { "/Playlist/Invert Selection", NULL, _eclair_dialogs_on_invert_selection, 1, "<Item>" }, - { "/Playlist/separator1", NULL, NULL, 0, "<Separator>" }, - { "/Playlist/Remove Selected", NULL, _eclair_dialogs_on_remove_selected, 1, "<Item>" }, - { "/Playlist/Remove Unselected", NULL, _eclair_dialogs_on_remove_unselected, 1, "<Item>" }, - { "/Playlist/Remove All", NULL, _eclair_dialogs_on_remove_all, 1, "<Item>" } + { "/tear", NULL, NULL, 0, "<Tearoff>" }, + { "/Open", NULL, NULL, 0, "<Branch>" }, + { "/Open/tear", NULL, NULL, 0, "<Tearoff>" }, + { "/Open/Add Files", NULL, _eclair_dialogs_menu_on_add_files, 1, "<Item>" }, + { "/Playlist", NULL, NULL, 0, "<Branch>" }, + { "/Playlist/tear", NULL, NULL, 0, "<Tearoff>" }, + { "/Playlist/Load List", NULL, _eclair_dialogs_menu_on_load_list, 1, "<Item>" }, + { "/Playlist/Save List", NULL, _eclair_dialogs_menu_on_save_list, 1, "<Item>" }, + { "/Playlist/separator1", NULL, NULL, 0, "<Separator>" }, + { "/Playlist/Select All", NULL, _eclair_dialogs_menu_on_select_all, 1, "<Item>" }, + { "/Playlist/Select None", NULL, _eclair_dialogs_menu_on_select_none, 1, "<Item>" }, + { "/Playlist/Invert Selection", NULL, _eclair_dialogs_menu_on_invert_selection, 1, "<Item>" }, + { "/Playlist/separator2", NULL, NULL, 0, "<Separator>" }, + { "/Playlist/Remove Selected", NULL, _eclair_dialogs_menu_on_remove_selected, 1, "<Item>" }, + { "/Playlist/Remove Unselected", NULL, _eclair_dialogs_menu_on_remove_unselected, 1, "<Item>" }, + { "/Playlist/Remove All", NULL, _eclair_dialogs_menu_on_remove_all, 1, "<Item>" } }; static gint num_menu_items = sizeof(menu_items) / sizeof(menu_items[0]); - -static void *_eclair_dialogs_thread(void *param); -static gint _eclair_dialogs_update(gpointer data); -static void _eclair_dialogs_file_chooser(Eclair_Dialogs_Manager *dialogs_manager); - //Initialize dialogs manager void eclair_dialogs_init(Eclair_Dialogs_Manager *dialogs_manager, Eclair *eclair) { @@ -42,10 +48,22 @@ return; dialogs_manager->eclair = eclair; - dialogs_manager->file_chooser_dialog = NULL; + + dialogs_manager->open_fc_all_button = NULL; + dialogs_manager->open_fc_none_button = NULL; + dialogs_manager->open_fc_ok_button = NULL; + dialogs_manager->open_fc_close_button = NULL; + dialogs_manager->open_fc_widget = NULL; + dialogs_manager->open_fc_dialog = NULL; + dialogs_manager->save_fc_ok_button = NULL; + dialogs_manager->save_fc_close_button = NULL; + dialogs_manager->save_fc_widget = NULL; + dialogs_manager->save_fc_dialog = NULL; dialogs_manager->menu_widget = NULL; + + dialogs_manager->should_quit = FALSE; dialogs_manager->should_popup_menu = FALSE; - dialogs_manager->should_open_file_chooser = FALSE; + dialogs_manager->should_open_open_fc = ECLAIR_FC_NONE; pthread_create(&dialogs_manager->dialogs_thread, NULL, _eclair_dialogs_thread, eclair); } @@ -53,77 +71,49 @@ //Shutdown dialogs manager void eclair_dialogs_shutdown(Eclair_Dialogs_Manager *dialogs_manager) { + gchar *last_location_path; + if (!dialogs_manager) return; - + + if (dialogs_manager->open_fc_widget && dialogs_manager->eclair && (last_location_path = gtk_file_chooser_get_current_folder(GTK_FILE_CHOOSER(dialogs_manager->open_fc_widget)))) + { + eclair_config_set_prop_string(&dialogs_manager->eclair->config, "last_location", "path", last_location_path); + g_free(last_location_path); + } + + dialogs_manager->should_quit = TRUE; fprintf(stderr, "Dialogs: Debug: Destroying dialogs thread\n"); pthread_join(dialogs_manager->dialogs_thread, NULL); - fprintf(stderr, "Meta tag: Debug: Meta dialogs destroyed\n"); + fprintf(stderr, "Dialogs: Debug: Dialogs thread destroyed\n"); } -//Will open the file selection dialog -void eclair_dialogs_open_file_dialog(Eclair_Dialogs_Manager *dialogs_manager) +//Will open the file chooser dialog to add files +void eclair_dialogs_open_add_files_fc(Eclair_Dialogs_Manager *dialogs_manager) { if (!dialogs_manager) return; - dialogs_manager->should_open_file_chooser = TRUE; + dialogs_manager->should_open_open_fc = ECLAIR_FC_ADD_FILES; } -//Will popup the eclair menu -void eclair_popup_menu(Eclair_Dialogs_Manager *dialogs_manager) +//Will open the file chooser dialog to load playlist +void eclair_dialogs_open_load_playlist_fc(Eclair_Dialogs_Manager *dialogs_manager) { if (!dialogs_manager) return; - dialogs_manager->should_popup_menu = TRUE; + dialogs_manager->should_open_open_fc = ECLAIR_FC_LOAD_PLAYLIST; } -//Open the file chooser -static void _eclair_dialogs_file_chooser(Eclair_Dialogs_Manager *dialogs_manager) +//Will popup the eclair menu +void eclair_popup_menu(Eclair_Dialogs_Manager *dialogs_manager) { - Eclair *eclair; - GSList *filenames, *l; - - if (!dialogs_manager || !(eclair = dialogs_manager->eclair)) + if (!dialogs_manager) return; - dialogs_manager->file_chooser_dialog = gtk_file_chooser_dialog_new("Open files...", NULL, GTK_FILE_CHOOSER_ACTION_OPEN, - GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, NULL); - gtk_dialog_set_default_response(GTK_DIALOG(dialogs_manager->file_chooser_dialog), GTK_RESPONSE_ACCEPT); - gtk_file_chooser_set_select_multiple(GTK_FILE_CHOOSER(dialogs_manager->file_chooser_dialog), 1); - gtk_file_chooser_set_local_only(GTK_FILE_CHOOSER(dialogs_manager->file_chooser_dialog), 0); - - gtk_widget_show(dialogs_manager->file_chooser_dialog); - - if (gtk_dialog_run(GTK_DIALOG(dialogs_manager->file_chooser_dialog)) == GTK_RESPONSE_ACCEPT) - { - filenames = gtk_file_chooser_get_filenames(GTK_FILE_CHOOSER(dialogs_manager->file_chooser_dialog)); - for (l = filenames; l; l = l->next) - eclair_playlist_add_uri(&eclair->playlist, (char *)l->data, 0); - eclair_playlist_container_update(eclair->playlist_container); - - g_slist_foreach(filenames, (GFunc)g_free, NULL); - g_slist_free(filenames); - } - - gtk_widget_destroy(dialogs_manager->file_chooser_dialog); - dialogs_manager->file_chooser_dialog = NULL; - //gtk_window_present(GTK_WINDOW(dialogs_manager->file_chooser_dialog)); + dialogs_manager->should_popup_menu = TRUE; } -/* -static void _eclair_dialogs_file_chooser_add(GtkFileChooser *file_chooser) -{ - GSList *filenames, *l; - - if (!(filenames = gtk_file_chooser_get_filenames(GTK_FILE_CHOOSER(file_chooser)))) - return; - - for (l = filenames; l; l = l->next) - eclair_playlist_add_uri(&eclair->playlist, (char *)l->data); - g_slist_foreach(filenames, (GFunc)g_free, NULL); - g_slist_free(filenames); -}*/ //Called each 50ms and check if we must do something (popup menu, open file selection dialog...) static gint _eclair_dialogs_update(gpointer data) @@ -133,15 +123,21 @@ if (!dialogs_manager) return 1; + if (dialogs_manager->should_quit) + { + gtk_main_quit(); + return 0; + } + if (dialogs_manager->should_popup_menu) { gtk_menu_popup(GTK_MENU(dialogs_manager->menu_widget), NULL, NULL, NULL, NULL, 0, gtk_get_current_event_time()); dialogs_manager->should_popup_menu = FALSE; } - if (dialogs_manager->should_open_file_chooser) + if (dialogs_manager->should_open_open_fc != ECLAIR_FC_NONE) { - _eclair_dialogs_file_chooser(dialogs_manager); - dialogs_manager->should_open_file_chooser = FALSE; + _eclair_dialogs_open_fc_open(dialogs_manager, dialogs_manager->should_open_open_fc); + dialogs_manager->should_open_open_fc = ECLAIR_FC_NONE; } return 1; @@ -161,11 +157,12 @@ dialogs_manager = &eclair->dialogs_manager; + //Create the menu item_factory = gtk_item_factory_new(GTK_TYPE_MENU, "<main>", NULL); gtk_item_factory_create_items(item_factory, num_menu_items, menu_items, eclair); dialogs_manager->menu_widget = gtk_item_factory_get_widget(item_factory, "<main>"); - g_timeout_add(50, G_CALLBACK(_eclair_dialogs_update), dialogs_manager); + g_timeout_add(50, _eclair_dialogs_update, dialogs_manager); gtk_main(); @@ -173,61 +170,198 @@ } //------------------------------ +// File chooser functions +//------------------------------ + +//Open the file chooser +static void _eclair_dialogs_open_fc_open(Eclair_Dialogs_Manager *dialogs_manager, Eclair_Dialog_Open_FC_Type fc_type) +{ + char *last_location_path; + Eclair *eclair; + + if (!dialogs_manager || !(eclair = dialogs_manager->eclair) || fc_type == ECLAIR_FC_NONE) + return; + + if (!dialogs_manager->open_fc_dialog) + { + //Create the file chooser + dialogs_manager->open_fc_dialog = gtk_dialog_new_with_buttons("Add Files", NULL, GTK_DIALOG_NO_SEPARATOR, NULL); + gtk_window_set_wmclass(GTK_WINDOW(dialogs_manager->open_fc_dialog), "eclair", "eclair"); + gtk_window_set_default_size(GTK_WINDOW(dialogs_manager->open_fc_dialog), 600, 420); + dialogs_manager->open_fc_widget = gtk_file_chooser_widget_new(GTK_FILE_CHOOSER_ACTION_OPEN); + gtk_file_chooser_set_local_only(GTK_FILE_CHOOSER(dialogs_manager->open_fc_widget), FALSE); + if (eclair_config_get_prop_string(&eclair->config, "last_location", "path", &last_location_path)) + { + if (strlen(last_location_path) > 0) + gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(dialogs_manager->open_fc_widget), last_location_path); + free(last_location_path); + } + gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialogs_manager->open_fc_dialog)->vbox), dialogs_manager->open_fc_widget, TRUE, TRUE, 0); + + dialogs_manager->open_fc_all_button = gtk_button_new_with_label("All"); + gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialogs_manager->open_fc_dialog)->action_area), dialogs_manager->open_fc_all_button, TRUE, TRUE, 0); + dialogs_manager->open_fc_none_button = gtk_button_new_with_label("None"); + gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialogs_manager->open_fc_dialog)->action_area), dialogs_manager->open_fc_none_button, TRUE, TRUE, 0); + dialogs_manager->open_fc_ok_button = gtk_button_new_with_label("Add Files"); + gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialogs_manager->open_fc_dialog)->action_area), dialogs_manager->open_fc_ok_button, TRUE, TRUE, 0); + dialogs_manager->open_fc_close_button = gtk_button_new_with_label("Close"); + gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialogs_manager->open_fc_dialog)->action_area), dialogs_manager->open_fc_close_button, TRUE, TRUE, 0); + + g_signal_connect_swapped(dialogs_manager->open_fc_all_button, "clicked", G_CALLBACK(gtk_file_chooser_select_all), dialogs_manager->open_fc_widget); + g_signal_connect_swapped(dialogs_manager->open_fc_none_button, "clicked", G_CALLBACK(gtk_file_chooser_unselect_all), dialogs_manager->open_fc_widget); + g_signal_connect(dialogs_manager->open_fc_ok_button, "clicked", G_CALLBACK(_eclair_dialogs_open_fc_on_ok), eclair); + g_signal_connect_swapped(dialogs_manager->open_fc_close_button, "clicked", G_CALLBACK(gtk_widget_hide), dialogs_manager->open_fc_dialog); + g_signal_connect(dialogs_manager->open_fc_dialog, "delete_event", G_CALLBACK(_eclair_dialogs_open_fc_on_delete), eclair); + + gtk_widget_show_all(dialogs_manager->open_fc_dialog); + } + + if (fc_type == ECLAIR_FC_ADD_FILES) + { + gtk_file_chooser_set_select_multiple(GTK_FILE_CHOOSER(dialogs_manager->open_fc_widget), TRUE); + gtk_button_set_label(GTK_BUTTON(dialogs_manager->open_fc_ok_button), "Add Files"); + gtk_window_set_title(GTK_WINDOW(dialogs_manager->open_fc_dialog), "Add Files"); + gtk_widget_show(dialogs_manager->open_fc_all_button); + gtk_widget_show(dialogs_manager->open_fc_none_button); + } + else if (fc_type == ECLAIR_FC_LOAD_PLAYLIST) + { + gtk_file_chooser_set_select_multiple(GTK_FILE_CHOOSER(dialogs_manager->open_fc_widget), FALSE); + gtk_button_set_label(GTK_BUTTON(dialogs_manager->open_fc_ok_button), "Load Playlist"); + gtk_window_set_title(GTK_WINDOW(dialogs_manager->open_fc_dialog), "Load Playlist"); + gtk_widget_hide(dialogs_manager->open_fc_all_button); + gtk_widget_hide(dialogs_manager->open_fc_none_button); + } + + gtk_window_present(GTK_WINDOW(dialogs_manager->open_fc_dialog)); +} + +//Add the files to the playlist +static gboolean _eclair_dialogs_open_fc_on_ok(GtkWidget *widget, gpointer data) +{ + Eclair *eclair = (Eclair *)data; + GtkWidget *file_chooser; + GSList *filenames, *l; + + if (!eclair || !(file_chooser = eclair->dialogs_manager.open_fc_widget)) + return FALSE; + + if (!(filenames = gtk_file_chooser_get_filenames(GTK_FILE_CHOOSER(file_chooser)))) + return FALSE; + + + for (l = filenames; l; l = l->next) + eclair_playlist_add_uri(&eclair->playlist, (char *)l->data, 0); + eclair_playlist_container_update(eclair->playlist_container); + g_slist_foreach(filenames, (GFunc)g_free, NULL); + g_slist_free(filenames); + + gtk_file_chooser_unselect_all(GTK_FILE_CHOOSER(file_chooser)); + gtk_widget_hide(eclair->dialogs_manager.open_fc_dialog); + return TRUE; +} + +//Do not delete the open file chooser, just hide it +static gboolean _eclair_dialogs_open_fc_on_delete(GtkWidget *widget, GdkEvent *event, gpointer data) +{ + Eclair *eclair = (Eclair *)data; + + if (!eclair) + return FALSE; + + gtk_file_chooser_unselect_all(GTK_FILE_CHOOSER(eclair->dialogs_manager.open_fc_widget)); + gtk_widget_hide(eclair->dialogs_manager.open_fc_dialog); + return TRUE; +} + +//------------------------------ // Menu functions //------------------------------ -static void _eclair_dialogs_on_open_files(gpointer data, guint action, GtkWidget *widget) +static void _eclair_dialogs_menu_on_add_files(gpointer data, guint action, GtkWidget *widget) { Eclair *eclair = (Eclair *)data; + + if (!eclair) + return; + + eclair_dialogs_open_add_files_fc(&eclair->dialogs_manager); +} + +static void _eclair_dialogs_menu_on_load_list(gpointer data, guint action, GtkWidget *widget) +{ + Eclair *eclair = (Eclair *)data; + + if (!eclair) + return; + + eclair_dialogs_open_load_playlist_fc(&eclair->dialogs_manager); +} + +static void _eclair_dialogs_menu_on_save_list(gpointer data, guint action, GtkWidget *widget) +{ + Eclair *eclair = (Eclair *)data; + if (!eclair) return; - eclair_dialogs_open_file_dialog(&eclair->dialogs_manager); } -static void _eclair_dialogs_on_select_all(gpointer data, guint action, GtkWidget *widget) +static void _eclair_dialogs_menu_on_select_all(gpointer data, guint action, GtkWidget *widget) { Eclair *eclair = (Eclair *)data; + if (!eclair) return; + eclair_playlist_container_select_all(eclair->playlist_container); } -static void _eclair_dialogs_on_select_none(gpointer data, guint action, GtkWidget *widget) +static void _eclair_dialogs_menu_on_select_none(gpointer data, guint action, GtkWidget *widget) { Eclair *eclair = (Eclair *)data; + if (!eclair) return; + eclair_playlist_container_select_none(eclair->playlist_container); } -static void _eclair_dialogs_on_invert_selection(gpointer data, guint action, GtkWidget *widget) +static void _eclair_dialogs_menu_on_invert_selection(gpointer data, guint action, GtkWidget *widget) { Eclair *eclair = (Eclair *)data; + if (!eclair) return; + eclair_playlist_container_invert_selection(eclair->playlist_container); } -static void _eclair_dialogs_on_remove_selected(gpointer data, guint action, GtkWidget *widget) +static void _eclair_dialogs_menu_on_remove_selected(gpointer data, guint action, GtkWidget *widget) { Eclair *eclair = (Eclair *)data; + if (!eclair) return; + eclair_playlist_remove_selected_media_files(&eclair->playlist); } -static void _eclair_dialogs_on_remove_unselected(gpointer data, guint action, GtkWidget *widget) +static void _eclair_dialogs_menu_on_remove_unselected(gpointer data, guint action, GtkWidget *widget) { Eclair *eclair = (Eclair *)data; + if (!eclair) return; + eclair_playlist_remove_unselected_media_files(&eclair->playlist); } -static void _eclair_dialogs_on_remove_all(gpointer data, guint action, GtkWidget *widget) +static void _eclair_dialogs_menu_on_remove_all(gpointer data, guint action, GtkWidget *widget) { Eclair *eclair = (Eclair *)data; + if (!eclair) return; + eclair_playlist_empty(&eclair->playlist); } =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/eclair/src/eclair_dialogs.h,v retrieving revision 1.1 retrieving revision 1.2 diff -u -3 -r1.1 -r1.2 --- eclair_dialogs.h 18 May 2005 15:36:25 -0000 1.1 +++ eclair_dialogs.h 20 May 2005 13:50:32 -0000 1.2 @@ -5,7 +5,8 @@ void eclair_dialogs_init(Eclair_Dialogs_Manager *dialogs_manager, Eclair *eclair); void eclair_dialogs_shutdown(Eclair_Dialogs_Manager *dialogs_manager); -void eclair_dialogs_open_file_dialog(Eclair_Dialogs_Manager *dialogs_manager); +void eclair_dialogs_open_add_files_fc(Eclair_Dialogs_Manager *dialogs_manager); +void eclair_dialogs_open_load_playlist_fc(Eclair_Dialogs_Manager *dialogs_manager); void eclair_popup_menu(Eclair_Dialogs_Manager *dialogs_manager); #endif =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/eclair/src/eclair_playlist.c,v retrieving revision 1.9 retrieving revision 1.10 diff -u -3 -r1.9 -r1.10 --- eclair_playlist.c 18 May 2005 15:36:25 -0000 1.9 +++ eclair_playlist.c 20 May 2005 13:50:32 -0000 1.10 @@ -34,6 +34,30 @@ eclair_playlist_empty(playlist); } +//Save the playlist +//0 if failed +Evas_Bool eclair_playlist_save(Eclair_Playlist *playlist, const char *path) +{ + Evas_List *l; + FILE *playlist_file; + Eclair_Media_File *media_file; + + if (!playlist || !path) + return 0; + + if (!(playlist_file = fopen(path, "wt"))) + return 0; + + for (l = playlist->playlist; l; l = l->next) + { + if (!(media_file = (Eclair_Media_File *)l->data) || !media_file->path || strlen(media_file->path) <= 0) + continue; + fprintf(playlist_file, "%s\n", media_file->path); + } + fclose(playlist_file); + return 1; +} + //Return the active media file Eclair_Media_File *eclair_playlist_current_media_file(Eclair_Playlist *playlist) { @@ -79,11 +103,15 @@ continue; filepath = (char *)malloc(strlen(dir) + strlen(filename) + 2); sprintf(filepath, "%s/%s", dir, filename); - eclair_playlist_add_uri(playlist, filepath, update_container); + eclair_playlist_add_uri(playlist, filepath, 0); free(filepath); } ecore_list_destroy(files); } + + if (playlist->eclair && update_container) + eclair_playlist_container_update(playlist->eclair->playlist_container); + return 1; } @@ -107,18 +135,22 @@ *c = 0; if (line[0] == '/') - eclair_playlist_add_uri(playlist, line, update_container); + eclair_playlist_add_uri(playlist, line, 0); else if (m3u_dir) { path = (char *)malloc(strlen(m3u_dir) + strlen(line) + 2); sprintf(path, "%s/%s", m3u_dir, line); - eclair_playlist_add_uri(playlist, path, update_container); + eclair_playlist_add_uri(playlist, path, 0); free(path); } } free(m3u_dir); fclose(m3u_file); + + if (playlist->eclair && update_container) + eclair_playlist_container_update(playlist->eclair->playlist_container); + return 1; } @@ -150,14 +182,14 @@ if (!strstr(new_path, "://")) { - if (eclair_playlist_add_dir(playlist, new_path, update_container)) + if (eclair_playlist_add_dir(playlist, new_path, 0)) { free(new_path); return 1; } if ((ext = eclair_utils_file_get_extension(new_path)) && strcmp(ext, "m3u") == 0) { - eclair_playlist_add_m3u(playlist, new_path, update_container); + eclair_playlist_add_m3u(playlist, new_path, 0); free(new_path); return 1; } @@ -260,15 +292,12 @@ { Evas_List *l; - printf("Rohhhh\n"); - if (!playlist) return; for (l = playlist->playlist; l; l = eclair_playlist_remove_media_file_list(playlist, l, 0)); playlist->playlist = evas_list_free(playlist->playlist); playlist->current = NULL; - printf("playlist->playlist: %p\n", playlist->playlist); if (playlist->eclair && playlist->eclair->playlist_container) eclair_playlist_container_update(playlist->eclair->playlist_container); =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/eclair/src/eclair_playlist.h,v retrieving revision 1.7 retrieving revision 1.8 diff -u -3 -r1.7 -r1.8 --- eclair_playlist.h 18 May 2005 15:36:25 -0000 1.7 +++ eclair_playlist.h 20 May 2005 13:50:32 -0000 1.8 @@ -5,6 +5,7 @@ void eclair_playlist_init(Eclair_Playlist *playlist, Eclair *eclair); void eclair_playlist_shutdown(Eclair_Playlist *playlist); +Evas_Bool eclair_playlist_save(Eclair_Playlist *playlist, const char *path); Eclair_Media_File *eclair_playlist_current_media_file(Eclair_Playlist *playlist); Eclair_Media_File *eclair_playlist_prev_media_file(Eclair_Playlist *playlist); =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/eclair/src/eclair_private.h,v retrieving revision 1.12 retrieving revision 1.13 diff -u -3 -r1.12 -r1.13 --- eclair_private.h 18 May 2005 15:36:25 -0000 1.12 +++ eclair_private.h 20 May 2005 13:50:32 -0000 1.13 @@ -23,6 +23,7 @@ typedef struct _Eclair_Config Eclair_Config; typedef enum _Eclair_Config_Type Eclair_Config_Type; typedef enum _Eclair_Drop_Object Eclair_Drop_Object; +typedef enum _Eclair_Dialog_Open_FC_Type Eclair_Dialog_Open_FC_Type; typedef struct _Eclair_Dialogs_Manager Eclair_Dialogs_Manager; typedef struct _Eclair_Playlist_Container Eclair_Playlist_Container; typedef struct _Eclair_Playlist_Container_Object Eclair_Playlist_Container_Object; @@ -64,6 +65,7 @@ char config_dir_path[256]; char covers_dir_path[256]; char config_file_path[256]; + char default_playlist_path[256]; xmlDocPtr config_doc; xmlNodePtr root_node; }; @@ -75,12 +77,33 @@ ECLAIR_ADDING_FILE_TO_TREAT }; +enum _Eclair_Dialog_Open_FC_Type +{ + ECLAIR_FC_NONE = 0, + ECLAIR_FC_ADD_FILES, + ECLAIR_FC_LOAD_PLAYLIST +}; + struct _Eclair_Dialogs_Manager { - GtkWidget *file_chooser_dialog; + GtkWidget *open_fc_all_button; + GtkWidget *open_fc_none_button; + GtkWidget *open_fc_ok_button; + GtkWidget *open_fc_close_button; + GtkWidget *open_fc_widget; + GtkWidget *open_fc_dialog; + + GtkWidget *save_fc_ok_button; + GtkWidget *save_fc_close_button; + GtkWidget *save_fc_widget; + GtkWidget *save_fc_dialog; + GtkWidget *menu_widget; + gboolean should_popup_menu; - gboolean should_open_file_chooser; + Eclair_Dialog_Open_FC_Type should_open_open_fc; + gboolean should_quit; + pthread_t dialogs_thread; Eclair *eclair; }; ------------------------------------------------------- This SF.Net email is sponsored by Oracle Space Sweepstakes Want to be the first software developer in space? Enter now for the Oracle Space Sweepstakes! http://ads.osdn.com/?ad_id=7412&alloc_id=16344&op=click _______________________________________________ enlightenment-cvs mailing list enlightenment-cvs@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs