Enlightenment CVS committal Author : moom16 Project : e17 Module : apps/eclair
Dir : e17/apps/eclair/src Modified Files: Makefile.am eclair.c eclair.h eclair_args.c eclair_args.h eclair_callbacks.c eclair_callbacks.h eclair_config.c eclair_config.h eclair_media_file.c eclair_meta_tag.c eclair_playlist.c eclair_playlist.h eclair_private.h Added Files: eclair_dialogs.c eclair_dialogs.h eclair_playlist_container.c eclair_playlist_container.h Log Message: * Better integration of gtk widgets * Add a popup menu (but we still need to add entries in the menu) * Finish config file implementation: - Save the position of the gui window * Do not use esmart container anymore for the playlist. Playlist container has been really optimized, you can now add thousands of medias without slowdowns ;) * We can now select media files in the playlist and delete them with the "delete" key! * Remove spaces at the begining and the end of meta tag fields * Fix segv when we add a file without an extension * Display correctly uris in playlist * [Default theme]Remove soft shadow on playlist entries because it is really slow * [Default theme]Open playlist and left side on start * [Default theme]Adapt playlist entry element to the new playlist container =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/eclair/src/Makefile.am,v retrieving revision 1.3 retrieving revision 1.4 diff -u -3 -r1.3 -r1.4 --- Makefile.am 30 Apr 2005 12:11:16 -0000 1.3 +++ Makefile.am 18 May 2005 15:36:25 -0000 1.4 @@ -24,11 +24,13 @@ eclair_callbacks.c eclair_callbacks.h \ eclair_media_file.c eclair_media_file.h \ eclair_playlist.c eclair_playlist.h \ +eclair_playlist_container.c eclair_playlist_container.h \ eclair_private.h \ eclair_subtitles.c eclair_subtitles.h \ eclair_cover.c eclair_cover.h \ eclair_meta_tag.c eclair_meta_tag.h \ -eclair_config.c eclair_config.h +eclair_config.c eclair_config.h \ +eclair_dialogs.c eclair_dialogs.h eclair_LDADD = \ @gtk_libs@ \ @@ -36,7 +38,7 @@ @ecore_libs@ \ @edje_libs@ \ @emotion_libs@ \ [EMAIL PROTECTED]@ -lesmart_container -lesmart_draggies \ [EMAIL PROTECTED]@ -lesmart_draggies \ @taglib_libs@ -ltag_c \ @libxml2_libs@ \ -lpthread =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/eclair/src/eclair.c,v retrieving revision 1.15 retrieving revision 1.16 diff -u -3 -r1.15 -r1.16 --- eclair.c 8 May 2005 13:23:33 -0000 1.15 +++ eclair.c 18 May 2005 15:36:25 -0000 1.16 @@ -7,10 +7,9 @@ #include <Edje.h> #include <Emotion.h> #include <Esmart/Esmart_Draggies.h> -#include <Esmart/Esmart_Container.h> -#include <gtk/gtk.h> #include <pthread.h> #include "eclair_playlist.h" +#include "eclair_playlist_container.h" #include "eclair_media_file.h" #include "eclair_callbacks.h" #include "eclair_subtitles.h" @@ -19,6 +18,7 @@ #include "eclair_utils.h" #include "eclair_config.h" #include "eclair_args.h" +#include "eclair_dialogs.h" static void *_eclair_create_video_object_thread(void *param); static void _eclair_gui_create_window(Eclair *eclair); @@ -27,7 +27,7 @@ static void _eclair_on_segv(int num); //Initialize eclair -Evas_Bool eclair_init(Eclair *eclair, int *argc, char *argv[]) +Evas_Bool eclair_init(Eclair *eclair, int *argc, char ***argv) { Evas_List *filenames, *l; filenames = NULL; @@ -39,8 +39,9 @@ ecore_file_init(); ecore_evas_init(); edje_init(); - gtk_init(argc, &argv); + eclair->argc = argc; + eclair->argv = argv; eclair->video_window = NULL; eclair->video_object = NULL; eclair->black_background = NULL; @@ -52,50 +53,63 @@ eclair->gui_previous_cover = NULL; eclair->playlist_container = NULL; eclair->playlist_entry_height = -1; - eclair->file_chooser_widget = NULL; eclair->state = ECLAIR_STOP; eclair->seek_to_pos = -1.0; eclair->use_progress_bar_drag_for_time = 0; eclair->dont_update_progressbar = 0; - eclair->file_chooser_th_created = 0; eclair->video_engine = ECLAIR_SOFTWARE; eclair->gui_engine = ECLAIR_SOFTWARE; eclair->gui_theme_file = strdup(PACKAGE_DATA_DIR "/themes/default.edj"); eclair->gui_drop_object = ECLAIR_DROP_NONE; - if (!eclair_args_parse(eclair, *argc, argv, &filenames)) + if (!eclair_args_parse(eclair, &filenames)) return 0; eclair_config_init(&eclair->config); _eclair_gui_create_window(eclair); _eclair_video_create_window(eclair); + eclair_dialogs_init(&eclair->dialogs_manager, eclair); eclair_playlist_init(&eclair->playlist, eclair); + eclair_playlist_container_set_media_list(eclair->playlist_container, &eclair->playlist.playlist); eclair_subtitles_init(&eclair->subtitles); eclair_meta_tag_init(&eclair->meta_tag_manager, eclair); 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); + eclair_playlist_add_uri(&eclair->playlist, (char *)l->data, 0); evas_list_free(filenames); + eclair_playlist_container_update(eclair->playlist_container); + 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); + ecore_event_handler_add(ECORE_X_EVENT_SELECTION_NOTIFY, eclair_gui_dnd_selection_cb, eclair); + ecore_event_handler_add(ECORE_X_EVENT_MOUSE_BUTTON_UP, eclair_mouse_up_cb, eclair); edje_object_part_drag_value_set(eclair->gui_object, "volume_bar_drag", 1.0, 0.0); return 1; } -//Shutdown eclair and the EFL +//Shutdown eclair void eclair_shutdown(Eclair *eclair) { if (eclair) { + if (eclair->gui_window) + { + int gui_x, gui_y; + ecore_evas_geometry_get(eclair->gui_window, &gui_x, &gui_y, NULL, NULL); + eclair_config_set_prop_int(&eclair->config, "gui_window", "x", gui_x); + eclair_config_set_prop_int(&eclair->config, "gui_window", "y", gui_y); + } + 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_subtitles_free(&eclair->subtitles); eclair_meta_tag_shutdown(&eclair->meta_tag_manager); eclair_cover_shutdown(&eclair->cover_manager); - eclair_playlist_empty(&eclair->playlist); + eclair_playlist_shutdown(&eclair->playlist); eclair_config_shutdown(&eclair->config); free(eclair->gui_theme_file); } @@ -162,7 +176,9 @@ edje_object_part_text_set(eclair->gui_object, "current_media_name", artist_title_string); free(artist_title_string); } - else if ((filename = ecore_file_get_file(current_file->path))) + else if (current_file->path && strstr(current_file->path, "://")) + edje_object_part_text_set(eclair->gui_object, "current_media_name", current_file->path); + else if (current_file->path && (filename = ecore_file_get_file(current_file->path))) edje_object_part_text_set(eclair->gui_object, "current_media_name", filename); else edje_object_part_text_set(eclair->gui_object, "current_media_name", "No media opened"); @@ -247,83 +263,6 @@ evas_object_image_file_get(eclair->gui_previous_cover, ¤t_path, NULL); } -//Set the scroll percent of the playlist container -void eclair_playlist_container_scroll_percent_set(Eclair *eclair, double percent) -{ - if (!eclair || !eclair->playlist_container) - return; - - esmart_container_scroll_percent_set(eclair->playlist_container, percent); - if (eclair->gui_object) - edje_object_part_drag_value_set(eclair->gui_object, "playlist_scrollbar_button", 0, percent); -} - -//Scroll the playlist -void eclair_playlist_container_scroll(Eclair *eclair, int num_entries) -{ - double percent; - Evas_List *entries_list; - Evas_Coord container_height; - float hidden_items; - - if (!eclair || !eclair->playlist_container || (eclair->playlist_entry_height <= 0)) - return; - - entries_list = esmart_container_elements_get(eclair->playlist_container); - if (!entries_list) - return; - - evas_object_geometry_get(eclair->playlist_container, NULL, NULL, NULL, &container_height); - hidden_items = entries_list->count - ((float)container_height / eclair->playlist_entry_height); - percent = esmart_container_scroll_percent_get(eclair->playlist_container); - if (hidden_items > 0) - percent += num_entries / hidden_items; - if (percent > 1.0) - percent = 1.0; - else if (percent < 0.0) - percent = 0.0; - eclair_playlist_container_scroll_percent_set(eclair, percent); -} - -//Thread for file selection -//Open a file selection dialog and add the files selected -void *eclair_file_chooser_thread(void *param) -{ - Eclair *eclair = (Eclair *)param; - GSList *filenames, *l; - - if (!eclair) - return NULL; - - eclair->file_chooser_widget = 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(eclair->file_chooser_widget), GTK_RESPONSE_ACCEPT); - gtk_file_chooser_set_select_multiple(GTK_FILE_CHOOSER(eclair->file_chooser_widget), 1); - gtk_file_chooser_set_local_only(GTK_FILE_CHOOSER(eclair->file_chooser_widget), 0); - - gtk_widget_show(eclair->file_chooser_widget); - - if (gtk_dialog_run(GTK_DIALOG(eclair->file_chooser_widget)) == GTK_RESPONSE_ACCEPT) - { - filenames = gtk_file_chooser_get_filenames(GTK_FILE_CHOOSER(eclair->file_chooser_widget)); - 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); - } - - gtk_widget_destroy(eclair->file_chooser_widget); - - while (gtk_events_pending()) - gtk_main_iteration(); - - eclair->file_chooser_widget = NULL; - eclair->file_chooser_th_created = 0; - - return NULL; -} - //Play a new file void eclair_play_file(Eclair *eclair, const char *path) { @@ -510,6 +449,7 @@ { Evas *evas; Evas_Coord gui_width, gui_height; + int gui_x, gui_y; Evas_Coord cover_width, cover_height; if (!eclair) @@ -542,6 +482,11 @@ evas_object_resize(eclair->gui_object, (int)gui_width, (int)gui_height); evas_object_show(eclair->gui_object); ecore_evas_resize(eclair->gui_window, (int)gui_width, (int)gui_height); + if (eclair_config_get_prop_int(&eclair->config, "gui_window", "x", &gui_x) && + eclair_config_get_prop_int(&eclair->config, "gui_window", "y", &gui_y)) + ecore_evas_move(eclair->gui_window, gui_x, gui_y); + else + ecore_evas_move(eclair->gui_window, 0, 0); eclair->gui_draggies = esmart_draggies_new(eclair->gui_window); esmart_draggies_button_set(eclair->gui_draggies, 1); @@ -552,13 +497,11 @@ if (edje_object_part_exists(eclair->gui_object, "playlist_container")) { - eclair->playlist_container = esmart_container_new(evas); - esmart_container_direction_set(eclair->playlist_container, CONTAINER_DIRECTION_VERTICAL); - esmart_container_fill_policy_set(eclair->playlist_container, CONTAINER_FILL_POLICY_FILL_X); - esmart_container_spacing_set(eclair->playlist_container, 0); - esmart_container_padding_set(eclair->playlist_container, 0, 0, 0, 0); + eclair->playlist_container = eclair_playlist_container_object_add(evas, eclair); + eclair_playlist_container_set_entry_theme_path(eclair->playlist_container, eclair->gui_theme_file); edje_object_part_swallow(eclair->gui_object, "playlist_container", eclair->playlist_container); evas_object_event_callback_add(eclair->playlist_container, EVAS_CALLBACK_MOUSE_WHEEL, eclair_gui_playlist_container_wheel_cb, eclair); + evas_object_smart_callback_add(eclair->playlist_container, "eclair_playlist_container_scroll_percent_changed", eclair_gui_playlist_container_scroll_percent_changed, eclair); evas_object_show(eclair->playlist_container); } if (edje_object_part_exists(eclair->gui_object, "cover")) @@ -595,9 +538,6 @@ edje_object_signal_callback_add(eclair->gui_object, "playlist_scroll_down_stop", "", eclair_gui_playlist_scroll_cb, eclair); edje_object_signal_callback_add(eclair->gui_object, "playlist_scroll_up_start", "", eclair_gui_playlist_scroll_cb, eclair); edje_object_signal_callback_add(eclair->gui_object, "playlist_scroll_up_stop", "", eclair_gui_playlist_scroll_cb, eclair); - 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); - ecore_event_handler_add(ECORE_X_EVENT_SELECTION_NOTIFY, eclair_gui_dnd_selection_cb, eclair); edje_object_message_handler_set(eclair->gui_object, eclair_gui_message_cb, eclair); } @@ -699,7 +639,7 @@ _eclair_sig_pregest(); - if (!eclair_init(&eclair, &argc, argv)) + if (!eclair_init(&eclair, &argc, &argv)) return 1; ecore_main_loop_begin(); =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/eclair/src/eclair.h,v retrieving revision 1.7 retrieving revision 1.8 diff -u -3 -r1.7 -r1.8 --- eclair.h 8 May 2005 12:29:06 -0000 1.7 +++ eclair.h 18 May 2005 15:36:25 -0000 1.8 @@ -4,13 +4,10 @@ #include "eclair_private.h" //core functions -Evas_Bool eclair_init(Eclair *eclair, int *argc, char *argv[]); +Evas_Bool eclair_init(Eclair *eclair, int *argc, char ***argv); void eclair_shutdown(Eclair *eclair); void eclair_update(Eclair *eclair); -void *eclair_file_chooser_thread(void *param); void eclair_update_current_file_info(Eclair *eclair, Evas_Bool force_cover_update); -void eclair_playlist_container_scroll(Eclair *eclair, int num_entries); -void eclair_playlist_container_scroll_percent_set(Eclair *eclair, double percent); void eclair_gui_cover_set(Eclair *eclair, const char *cover_path, Evas_Bool force_cover_update); //navigation functions =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/eclair/src/eclair_args.c,v retrieving revision 1.4 retrieving revision 1.5 diff -u -3 -r1.4 -r1.5 --- eclair_args.c 7 May 2005 20:58:58 -0000 1.4 +++ eclair_args.c 18 May 2005 15:36:25 -0000 1.5 @@ -4,9 +4,11 @@ static void _eclair_args_print_usage(); //Parse the arguments of the application and stock the filenames to load in the list -Evas_Bool eclair_args_parse(Eclair *eclair, int argc, char *argv[], Evas_List **filenames) +Evas_Bool eclair_args_parse(Eclair *eclair, Evas_List **filenames) { int c, i; + int argc; + char **argv; static struct option long_options[] = { @@ -17,7 +19,7 @@ { NULL, 0, NULL, 0 } }; - if (!eclair) + if (!eclair || (argc = *eclair->argc) <= 0 || !(argv = *eclair->argv)) return 0; while ((c = getopt_long(argc, argv, "ht:g:v:", long_options, NULL)) != -1) =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/eclair/src/eclair_args.h,v retrieving revision 1.1 retrieving revision 1.2 diff -u -3 -r1.1 -r1.2 --- eclair_args.h 17 Apr 2005 08:30:58 -0000 1.1 +++ eclair_args.h 18 May 2005 15:36:25 -0000 1.2 @@ -3,6 +3,6 @@ #include "eclair_private.h" -Evas_Bool eclair_args_parse(Eclair *eclair, int argc, char *argv[], Evas_List **filenames); +Evas_Bool eclair_args_parse(Eclair *eclair, Evas_List **filenames); #endif =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/eclair/src/eclair_callbacks.c,v retrieving revision 1.10 retrieving revision 1.11 diff -u -3 -r1.10 -r1.11 --- eclair_callbacks.c 7 May 2005 20:58:58 -0000 1.10 +++ eclair_callbacks.c 18 May 2005 15:36:25 -0000 1.11 @@ -9,7 +9,9 @@ #include <pthread.h> #include "eclair.h" #include "eclair_playlist.h" +#include "eclair_playlist_container.h" #include "eclair_cover.h" +#include "eclair_dialogs.h" //Called when eclair is closed int eclair_exit_cb(void *data, int type, void *event) @@ -46,11 +48,10 @@ //Resize the video object and the black background object void eclair_video_window_resize_cb(Ecore_Evas *window) { - Eclair *eclair; + Eclair *eclair = (Eclair *)ecore_evas_data_get(window, "eclair"); Evas_Coord window_width, window_height, video_width, video_height, X, Y; double ratio; - eclair = (Eclair *)ecore_evas_data_get(window, "eclair"); if (!eclair) return; @@ -59,7 +60,7 @@ if (eclair->video_object) { ratio = emotion_object_ratio_get(eclair->video_object); - //FIXME: emotion: ratio is sometimes 0?! + //TODO: emotion bug? ratio is sometimes 0?! if (ratio <= -0.01 || ratio >= 0.01) { if (window_width / ratio > window_height) @@ -92,7 +93,6 @@ } } - //Called when a key is pressed void eclair_key_press_cb(void *data, Evas *evas, Evas_Object *obj, void *event_info) { @@ -163,6 +163,10 @@ volume = 1.0; eclair_audio_level_set(eclair, volume); } + else if (strcmp(ev->key, "Delete") == 0) + { + eclair_playlist_remove_selected_media_files(&eclair->playlist); + } } //Called when the video window is closed @@ -176,19 +180,10 @@ { Eclair *eclair = (Eclair *)data; - if (eclair->file_chooser_th_created) - { - if (eclair->file_chooser_widget) - { - //TODO: make sure that it also raises the file dialog on other WMs than e17 - gtk_window_deiconify(GTK_WINDOW(eclair->file_chooser_widget)); - } - } - else - { - eclair->file_chooser_th_created = 1; - pthread_create(&eclair->file_chooser_thread, NULL, eclair_file_chooser_thread, eclair); - } + if (!eclair) + return; + + eclair_dialogs_open_file_dialog(&eclair->dialogs_manager); } //Called when the user clicks on play button @@ -238,17 +233,23 @@ ecore_evas_iconified_set(eclair->gui_window, 1); } -//Called when the user activates an entry in the playlist -void eclair_gui_play_entry_cb(void *data, Evas_Object *edje_object, const char *emission, const char *source) +//Called when the user clicks on an entry in the playlist +void eclair_gui_entry_down_cb(void *data, Evas *evas, Evas_Object *entry, void *event_info) { Eclair *eclair = (Eclair *)data; - Eclair_Media_File *media_file = evas_object_data_get(edje_object, "media_file"); + Eclair_Media_File *media_file = evas_object_data_get(entry, "media_file"); + Evas_Event_Mouse_Down *event = (Evas_Event_Mouse_Down *)event_info; - if (!eclair) + if (!eclair || !media_file || event->button != 1) return; - eclair_playlist_current_set(&eclair->playlist, media_file); - eclair_play_current(eclair); + if (event->flags == EVAS_BUTTON_NONE) + eclair_playlist_container_select_file(eclair->playlist_container, media_file, event->modifiers); + else if (event->flags == EVAS_BUTTON_DOUBLE_CLICK) + { + eclair_playlist_current_set(&eclair->playlist, media_file); + eclair_play_current(eclair); + } } //Called when the user drag the progress bar button @@ -293,7 +294,18 @@ return; edje_object_part_drag_value_get(eclair->gui_object, "playlist_scrollbar_button", NULL, &y); - eclair_playlist_container_scroll_percent_set(eclair, y); + eclair_playlist_container_scroll_percent_set(eclair->playlist_container, y); +} + +//Called when the scroll percent of the playlist container is changed +void eclair_gui_playlist_container_scroll_percent_changed(void *data, Evas_Object *obj, void *event_info) +{ + Eclair *eclair = (Eclair *)data; + + if (!eclair || !eclair->gui_object) + return; + + edje_object_part_drag_value_set(eclair->gui_object, "playlist_scrollbar_button", 0, eclair_playlist_container_scroll_percent_get(obj)); } //Called when the user wants to scroll the playlist @@ -305,11 +317,11 @@ return; if (strcmp(emission, "playlist_scroll_down_start") == 0) - esmart_container_scroll_start(eclair->playlist_container, -1.0); + eclair_playlist_container_scroll_start(eclair->playlist_container, 2.0); else if (strcmp(emission, "playlist_scroll_up_start") == 0) - esmart_container_scroll_start(eclair->playlist_container, 1.0); + eclair_playlist_container_scroll_start(eclair->playlist_container, -2.0); else - esmart_container_scroll_stop(eclair->playlist_container); + eclair_playlist_container_scroll_stop(eclair->playlist_container); } //Called when user uses wheel mouse over playlist container @@ -318,7 +330,7 @@ Eclair *eclair = (Eclair *)data; Evas_Event_Mouse_Wheel *event = (Evas_Event_Mouse_Wheel *)event_info; - eclair_playlist_container_scroll(eclair, event->z); + eclair_playlist_container_scroll(eclair->playlist_container, event->z); } //Called when an object is dragged over the gui @@ -401,7 +413,8 @@ if (eclair->gui_drop_object == ECLAIR_DROP_PLAYLIST) { for (i = 0; i < files->num_files; i++) - eclair_playlist_add_uri(&eclair->playlist, files->files[i]); + eclair_playlist_add_uri(&eclair->playlist, files->files[i], 0); + eclair_playlist_container_update(eclair->playlist_container); } else if (eclair->gui_drop_object == ECLAIR_DROP_COVER) eclair_cover_current_set(&eclair->cover_manager, files->files[0]); @@ -411,6 +424,22 @@ return 1; } +//Called when the user clicks on on of the ecore windows +int eclair_mouse_up_cb(void *data, int type, void *event) +{ + Eclair *eclair = (Eclair *)data; + Ecore_X_Event_Mouse_Button_Up *mouse_event = (Ecore_X_Event_Mouse_Button_Up *)event; + + if (!eclair || !mouse_event) + return 1; + + //TODO:Ecore event bug? mouse_event win and video x window doesn't match but they should have + if (mouse_event->button == 3/* && (mouse_event->event_win == eclair->gui_x_window || mouse_event->win == eclair->video_x_window)*/) + eclair_popup_menu(&eclair->dialogs_manager); + + return 1; +} + //Called when the gui send a message void eclair_gui_message_cb(void *data, Evas_Object *obj, Edje_Message_Type type, int id, void *msg) { =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/eclair/src/eclair_callbacks.h,v retrieving revision 1.6 retrieving revision 1.7 diff -u -3 -r1.6 -r1.7 --- eclair_callbacks.h 7 May 2005 20:58:59 -0000 1.6 +++ eclair_callbacks.h 18 May 2005 15:36:25 -0000 1.7 @@ -1,7 +1,7 @@ #ifndef _ECLAIR_CALLBACKS_H_ #define _ECLAIR_CALLBACKS_H_ -#include <eclair_private.h> +#include "eclair_private.h" int eclair_exit_cb(void *data, int type, void *event); void eclair_key_press_cb(void *data, Evas *evas, Evas_Object *obj, void *event_info); @@ -20,15 +20,17 @@ void eclair_gui_stop_cb(void *data, Evas_Object *edje_object, const char *emission, const char *source); void eclair_gui_prev_cb(void *data, Evas_Object *edje_object, const char *emission, const char *source); void eclair_gui_next_cb(void *data, Evas_Object *edje_object, const char *emission, const char *source); -void eclair_gui_play_entry_cb(void *data, Evas_Object *edje_object, const char *emission, const char *source); +void eclair_gui_entry_down_cb(void *data, Evas *evas, Evas_Object *entry, void *event_info); void eclair_gui_progress_bar_drag_cb(void *data, Evas_Object *edje_object, const char *emission, const char *source); void eclair_gui_volume_bar_cb(void *data, Evas_Object *edje_object, const char *emission, const char *source); void eclair_gui_playlist_scrollbar_button_drag_cb(void *data, Evas_Object *edje_object, const char *emission, const char *source); void eclair_gui_playlist_container_wheel_cb(void *data, Evas *evas, Evas_Object *playlist_container, void *event_info); +void eclair_gui_playlist_container_scroll_percent_changed(void *data, Evas_Object *obj, void *event_info); void eclair_gui_playlist_scroll_cb(void *data, Evas_Object *edje_object, const char *emission, const char *source); int eclair_gui_dnd_position_cb(void *data, int type, void *event); int eclair_gui_dnd_drop_cb(void *data, int type, void *event); int eclair_gui_dnd_selection_cb(void *data, int type, void *event); +int eclair_mouse_up_cb(void *data, int type, void *event); void eclair_gui_message_cb(void *data, Evas_Object *obj, Edje_Message_Type type, int id, void *msg); #endif =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/eclair/src/eclair_config.c,v retrieving revision 1.5 retrieving revision 1.6 diff -u -3 -r1.5 -r1.6 --- eclair_config.c 8 May 2005 12:29:06 -0000 1.5 +++ eclair_config.c 18 May 2005 15:36:25 -0000 1.6 @@ -1,7 +1,11 @@ #include "eclair_config.h" #include <Ecore_File.h> -#include <stdio.h> +#include <libxml/parser.h> +#include <libxml/tree.h> +static xmlNodePtr _eclair_config_search_node(xmlNodePtr root_node, const char *node_name); + +//Init the config manager Evas_Bool eclair_config_init(Eclair_Config *config) { char *home; @@ -9,30 +13,172 @@ if (!config) return 0; - config->config_file = NULL; + config->config_doc = NULL; + config->config_dir_path[0] = 0; + config->covers_dir_path[0] = 0; + config->config_file_path[0] = 0; if (!(home = getenv("HOME"))) return 0; sprintf(config->config_dir_path, "%s/.eclair/", home); ecore_file_mkdir(config->config_dir_path); - 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); - config->config_file = fopen(config->config_file_path, "a+t"); - if (!config->config_file) + + eclair_config_load(config); + + return 1; +} + +//Load the config values from the config file +void eclair_config_load(Eclair_Config *config) +{ + if (!config) + return; + + if (!(config->config_doc = xmlParseFile(config->config_file_path))) + config->config_doc = xmlNewDoc("1.0"); + if (!(config->root_node = xmlDocGetRootElement(config->config_doc)) || xmlStrcmp(config->root_node->name, "eclair") != 0) + { + config->root_node = xmlNewNode(NULL, "eclair"); + xmlDocSetRootElement(config->config_doc, config->root_node); + eclair_config_set_default(config); + eclair_config_save(config); + return; + } +} + +//Save the config values to the config file +void eclair_config_save(Eclair_Config *config) +{ + if (!config) + return; + + if (xmlSaveFormatFile(config->config_file_path, config->config_doc, 1) < 0) + fprintf(stderr, "Config: unable to save config in %s\n", config->config_file_path); +} + +//Set the config default values +void eclair_config_set_default(Eclair_Config *config) +{ + if (!config || !config->config_doc || !config->root_node) + return; + + eclair_config_set_prop_int(config, "gui_window", "x", 0); + eclair_config_set_prop_int(config, "gui_window", "y", 0); +} + +//Return the node called node_name +//NULL if failed +static xmlNodePtr _eclair_config_search_node(xmlNodePtr root_node, const char *node_name) +{ + xmlNodePtr n; + + if (!root_node) + return NULL; + + for (n = root_node->xmlChildrenNode; n; n = n->next) + { + if (xmlStrcmp(n->name, node_name) == 0) + return n; + } + return NULL; +} + +//Set prop_name in node_name to the string prop_value +void eclair_config_set_prop_string(Eclair_Config *config, const char *node_name, const char *prop_name, const char *prop_value) +{ + xmlNodePtr node; + + if (!config || !config->config_doc || !config->root_node || !node_name || !prop_name || !prop_value) + return; + + if (!(node = _eclair_config_search_node(config->root_node, node_name))) + node = xmlNewChild(config->root_node, NULL, node_name, NULL); + + xmlSetProp(node, prop_name, prop_value); +} + +//Set prop_name in node_name to the integer prop_value +void eclair_config_set_prop_int(Eclair_Config *config, const char *node_name, const char *prop_name, int prop_value) +{ + char string[40]; + if (snprintf(string, 40, "%d", prop_value) > 0) + eclair_config_set_prop_string(config, node_name, prop_name, string); +} + +//Set prop_name in node_name to the float prop_value +void eclair_config_set_prop_float(Eclair_Config *config, const char *node_name, const char *prop_name, float prop_value) +{ + char string[40]; + if (snprintf(string, 40, "%f", prop_value) > 0) + eclair_config_set_prop_string(config, node_name, prop_name, string); +} + +//Get the string prop_name in node_name +//Return 0 if failed +//The string will have to be freed if success +int eclair_config_get_prop_string(Eclair_Config *config, const char *node_name, const char *prop_name, char **prop_value) +{ + xmlNodePtr node; + xmlChar *value; + + if (!config || !config->config_doc || !config->root_node || !node_name || !prop_name) + return 0; + + if (!(node = _eclair_config_search_node(config->root_node, node_name))) + return 0; + if (!(value = xmlGetProp(node, prop_name))) + return 0; + *prop_value = strdup((char *)value); + xmlFree(value); + return 1; +} + +//Get the integer prop_name in node_name +//Return 0 if failed +int eclair_config_get_prop_int(Eclair_Config *config, const char *node_name, const char *prop_name, int *prop_value) +{ + char *value_string; + + if (!eclair_config_get_prop_string(config, node_name, prop_name, &value_string)) + return 0; + + if (sscanf(value_string, "%d", prop_value) != 1) + { + free(value_string); + return 0; + } + free(value_string); + return 1; +} + +//Get the float prop_name in node_name +//Return 0 if failed +int eclair_config_get_prop_float(Eclair_Config *config, const char *node_name, const char *prop_name, float *prop_value) +{ + char *value_string; + + if (!eclair_config_get_prop_string(config, node_name, prop_name, &value_string)) return 0; + if (sscanf(value_string, "%f", prop_value) != 1) + { + free(value_string); + return 0; + } + free(value_string); return 1; } +//Shutdown the config manager void eclair_config_shutdown(Eclair_Config *config) { if (!config) return; - if (config->config_file) - fclose(config->config_file); + eclair_config_save(config); + xmlFreeDoc(config->config_doc); } =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/eclair/src/eclair_config.h,v retrieving revision 1.1 retrieving revision 1.2 diff -u -3 -r1.1 -r1.2 --- eclair_config.h 27 Apr 2005 20:32:41 -0000 1.1 +++ eclair_config.h 18 May 2005 15:36:25 -0000 1.2 @@ -5,5 +5,14 @@ Evas_Bool eclair_config_init(Eclair_Config *config); void eclair_config_shutdown(Eclair_Config *config); +void eclair_config_load(Eclair_Config *config); +void eclair_config_save(Eclair_Config *config); +void eclair_config_set_default(Eclair_Config *config); +void eclair_config_set_prop_string(Eclair_Config *config, const char *node_name, const char *prop_name, const char *prop_value); +void eclair_config_set_prop_int(Eclair_Config *config, const char *node_name, const char *prop_name, int prop_value); +void eclair_config_set_prop_float(Eclair_Config *config, const char *node_name, const char *prop_name, float prop_value); +int eclair_config_get_prop_string(Eclair_Config *config, const char *node_name, const char *prop_name, char **prop_value); +int eclair_config_get_prop_int(Eclair_Config *config, const char *node_name, const char *prop_name, int *prop_value); +int eclair_config_get_prop_float(Eclair_Config *config, const char *node_name, const char *prop_name, float *prop_value); #endif =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/eclair/src/eclair_media_file.c,v retrieving revision 1.6 retrieving revision 1.7 diff -u -3 -r1.6 -r1.7 --- eclair_media_file.c 8 May 2005 12:29:06 -0000 1.6 +++ eclair_media_file.c 18 May 2005 15:36:25 -0000 1.7 @@ -34,35 +34,70 @@ char length[10] = ""; char *artist_title_string; const char *filename; + Eclair_Playlist_Container *playlist_container; + Eclair_Playlist_Container_Object *container_object; + Eclair_Color *color; - if (!media_file) + if (!eclair) return; - //Update playlist entry - if (media_file->playlist_entry) - { - if ((artist_title_string = eclair_utils_mediafile_to_artist_title_string(media_file))) - { - edje_object_part_text_set(media_file->playlist_entry, "playlist_entry_name", artist_title_string); - free(artist_title_string); - } - else if ((filename = ecore_file_get_file(media_file->path))) - edje_object_part_text_set(media_file->playlist_entry, "playlist_entry_name", filename); - else - edje_object_part_text_set(media_file->playlist_entry, "playlist_entry_name", "Media"); - - if (media_file->length >= 0) - { - eclair_utils_second_to_string(media_file->length, media_file->length, length); - edje_object_part_text_set(media_file->playlist_entry, "playlist_entry_length", length); + if (media_file) + { + //Update playlist entry + if ((container_object = media_file->container_object) && eclair->playlist_container && + (playlist_container = (Eclair_Playlist_Container *)evas_object_smart_data_get(eclair->playlist_container))) + { + if ((artist_title_string = eclair_utils_mediafile_to_artist_title_string(media_file))) + { + edje_object_part_text_set(container_object->text, "playlist_entry_name", artist_title_string); + free(artist_title_string); + } + else if (media_file->path && strstr(media_file->path, "://")) + edje_object_part_text_set(container_object->text, "playlist_entry_name", media_file->path); + else if (media_file->path && (filename = ecore_file_get_file(media_file->path))) + edje_object_part_text_set(container_object->text, "playlist_entry_name", filename); + else + edje_object_part_text_set(container_object->text, "playlist_entry_name", "Media"); + + if (media_file->length > 0) + { + eclair_utils_second_to_string(media_file->length, media_file->length, length); + edje_object_part_text_set(container_object->text, "playlist_entry_length", length); + } + else + edje_object_part_text_set(container_object->text, "playlist_entry_length", ""); + + //Set the color of the playlist entry + if (media_file->selected) + { + color = &playlist_container->selected_entry_bg_color; + evas_object_color_set(container_object->rect, color->r, color->g, color->b, color->a); + if (media_file == eclair_playlist_current_media_file(&eclair->playlist)) + { + color = &playlist_container->current_entry_fg_color; + evas_object_color_set(container_object->text, color->r, color->g, color->b, color->a); + } + else + { + color = &playlist_container->selected_entry_fg_color; + evas_object_color_set(container_object->text, color->r, color->g, color->b, color->a); + } + } + else if (media_file == eclair_playlist_current_media_file(&eclair->playlist)) + { + color = &playlist_container->current_entry_bg_color; + evas_object_color_set(container_object->rect, color->r, color->g, color->b, color->a); + color = &playlist_container->current_entry_fg_color; + evas_object_color_set(container_object->text, color->r, color->g, color->b, color->a); + } + else + { + evas_object_color_set(container_object->rect, 255, 255, 255, 0); + evas_object_color_set(container_object->text, 255, 255, 255, 255); + } } - else - edje_object_part_text_set(media_file->playlist_entry, "playlist_entry_length", ""); } - if (!eclair) - return; - //If the media file is the current, we also update gui infos if (media_file == eclair_playlist_current_media_file(&eclair->playlist)) eclair_update_current_file_info(eclair, 0); =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/eclair/src/eclair_meta_tag.c,v retrieving revision 1.8 retrieving revision 1.9 diff -u -3 -r1.8 -r1.9 --- eclair_meta_tag.c 8 May 2005 12:29:06 -0000 1.8 +++ eclair_meta_tag.c 18 May 2005 15:36:25 -0000 1.9 @@ -8,6 +8,7 @@ #include "eclair_media_file.h" static void *_eclair_meta_tag_thread(void *param); +static void _eclair_meta_tag_set_field_string(char **field, const char *value); //Initialize meta tag manager void eclair_meta_tag_init(Eclair_Meta_Tag_Manager *meta_tag_manager, Eclair *eclair) @@ -70,11 +71,11 @@ if ((tag = taglib_file_tag(tag_file))) { - media_file->artist = strdup(taglib_tag_artist(tag)); - media_file->title = strdup(taglib_tag_title(tag)); - media_file->album = strdup(taglib_tag_album(tag)); - media_file->genre = strdup(taglib_tag_genre(tag)); - media_file->comment = strdup(taglib_tag_comment(tag)); + _eclair_meta_tag_set_field_string(&media_file->artist, taglib_tag_artist(tag)); + _eclair_meta_tag_set_field_string(&media_file->title, taglib_tag_title(tag)); + _eclair_meta_tag_set_field_string(&media_file->album, taglib_tag_album(tag)); + _eclair_meta_tag_set_field_string(&media_file->genre, taglib_tag_genre(tag)); + _eclair_meta_tag_set_field_string(&media_file->comment, taglib_tag_comment(tag)); media_file->year = taglib_tag_year(tag); media_file->track = taglib_tag_track(tag); } @@ -143,3 +144,25 @@ } return NULL; } + +//Set the value of a meta tag field string +static void _eclair_meta_tag_set_field_string(char **field, const char *value) +{ + const char *c1; + char *c2; + + if (!field) + return; + + free(*field); + if (!value) + *field = NULL; + else + { + //We remove the blanks before and after the meta tag value + for (c1 = value; *c1 != 0 && *c1 <= 32; c1++); + *field = strdup(c1); + for (c2 = *field + strlen(*field); c2 >= *field && *c2 <= 32; c2--) + *c2 = 0; + } +} =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/eclair/src/eclair_playlist.c,v retrieving revision 1.8 retrieving revision 1.9 diff -u -3 -r1.8 -r1.9 --- eclair_playlist.c 8 May 2005 13:23:33 -0000 1.8 +++ eclair_playlist.c 18 May 2005 15:36:25 -0000 1.9 @@ -2,11 +2,11 @@ #include "../config.h" #include <string.h> #include <stdio.h> -#include <Esmart/Esmart_Container.h> #include <Evas.h> #include <Ecore_File.h> #include <Edje.h> #include "eclair.h" +#include "eclair_playlist_container.h" #include "eclair_cover.h" #include "eclair_media_file.h" #include "eclair_meta_tag.h" @@ -28,20 +28,10 @@ playlist->eclair = eclair; } -//Empty the playlist and destroy all the media_file -void eclair_playlist_empty(Eclair_Playlist *playlist) +//Shutdown the playlist +void eclair_playlist_shutdown(Eclair_Playlist *playlist) { - Evas_List *l; - - if (!playlist) - return; - - for (l = playlist->playlist; l; ) - l = eclair_playlist_remove_media_file_list(playlist, l); - - evas_list_free(playlist->playlist); - playlist->playlist = NULL; - playlist->current = NULL; + eclair_playlist_empty(playlist); } //Return the active media file @@ -72,7 +62,7 @@ } //Add recursively a directory -Evas_Bool eclair_playlist_add_dir(Eclair_Playlist *playlist, char *dir) +Evas_Bool eclair_playlist_add_dir(Eclair_Playlist *playlist, char *dir, Evas_Bool update_container) { Ecore_List *files; Ecore_List_Node *l; @@ -89,7 +79,7 @@ continue; filepath = (char *)malloc(strlen(dir) + strlen(filename) + 2); sprintf(filepath, "%s/%s", dir, filename); - eclair_playlist_add_uri(playlist, filepath); + eclair_playlist_add_uri(playlist, filepath, update_container); free(filepath); } ecore_list_destroy(files); @@ -98,7 +88,7 @@ } //Add files stored in the m3u file -Evas_Bool eclair_playlist_add_m3u(Eclair_Playlist *playlist, char *m3u_path) +Evas_Bool eclair_playlist_add_m3u(Eclair_Playlist *playlist, char *m3u_path, Evas_Bool update_container) { FILE *m3u_file; char line[MAX_PATH_LEN], *path, *c, *m3u_dir; @@ -117,12 +107,12 @@ *c = 0; if (line[0] == '/') - eclair_playlist_add_uri(playlist, line); + eclair_playlist_add_uri(playlist, line, update_container); 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); + eclair_playlist_add_uri(playlist, path, update_container); free(path); } } @@ -133,12 +123,11 @@ } //Add the media file located at the uri -Evas_Bool eclair_playlist_add_uri(Eclair_Playlist *playlist, char *uri) +Evas_Bool eclair_playlist_add_uri(Eclair_Playlist *playlist, char *uri, Evas_Bool update_container) { Eclair_Media_File *new_media_file; - Evas_Coord min_height; Eclair *eclair; - char *clean_uri, *new_path; + char *clean_uri, *new_path, *ext; if (!playlist || !uri) return 0; @@ -161,14 +150,14 @@ if (!strstr(new_path, "://")) { - if (eclair_playlist_add_dir(playlist, new_path)) + if (eclair_playlist_add_dir(playlist, new_path, update_container)) { free(new_path); return 1; } - if (strcmp(eclair_utils_file_get_extension(new_path), "m3u") == 0) + if ((ext = eclair_utils_file_get_extension(new_path)) && strcmp(ext, "m3u") == 0) { - eclair_playlist_add_m3u(playlist, new_path); + eclair_playlist_add_m3u(playlist, new_path, update_container); free(new_path); return 1; } @@ -176,111 +165,141 @@ new_media_file = eclair_media_file_new(); new_media_file->path = new_path; + playlist->playlist = evas_list_append(playlist->playlist, new_media_file); + if (!playlist->current) + eclair_playlist_current_set_list(playlist, playlist->playlist); if ((eclair = playlist->eclair)) { - if (eclair->playlist_container) - { - new_media_file->playlist_entry = edje_object_add(evas_object_evas_get(eclair->playlist_container)); - edje_object_file_set(new_media_file->playlist_entry, eclair->gui_theme_file, "eclair_playlist_entry"); - evas_object_data_set(new_media_file->playlist_entry, "media_file", new_media_file); - if (eclair->playlist_entry_height <= 0) - { - edje_object_size_min_get(new_media_file->playlist_entry, NULL, &min_height); - eclair->playlist_entry_height = (int)min_height; - } - evas_object_resize(new_media_file->playlist_entry, 1, eclair->playlist_entry_height); - edje_object_part_text_set(new_media_file->playlist_entry, "playlist_entry_name", ecore_file_get_file(new_media_file->path)); - edje_object_part_text_set(new_media_file->playlist_entry, "playlist_entry_length", ""); - edje_object_signal_callback_add(new_media_file->playlist_entry, "eclair_play_entry", "*", eclair_gui_play_entry_cb, eclair); - esmart_container_element_append(eclair->playlist_container, new_media_file->playlist_entry); - evas_object_show(new_media_file->playlist_entry); - } - + if (update_container) + eclair_playlist_container_update(eclair->playlist_container); if (!strstr(new_media_file->path, "://")) eclair_meta_tag_add_file_to_scan(&eclair->meta_tag_manager, new_media_file); } - - playlist->playlist = evas_list_append(playlist->playlist, new_media_file); - if (!playlist->current) - eclair_playlist_current_set_list(playlist, playlist->playlist); - return 1; } //Remove the media file from the playlist -void eclair_playlist_remove_media_file(Eclair_Playlist *playlist, Eclair_Media_File *media_file) +void eclair_playlist_remove_media_file(Eclair_Playlist *playlist, Eclair_Media_File *media_file, Evas_Bool update_container) { if (!playlist || !media_file) return; - eclair_playlist_remove_media_file_list(playlist, evas_list_find_list(playlist->playlist, media_file)); + eclair_playlist_remove_media_file_list(playlist, evas_list_find_list(playlist->playlist, media_file), update_container); } //Remove the media file pointed by the list from the playlist //Return the next media file -Evas_List *eclair_playlist_remove_media_file_list(Eclair_Playlist *playlist, Evas_List *list) +Evas_List *eclair_playlist_remove_media_file_list(Eclair_Playlist *playlist, Evas_List *list, Evas_Bool update_container) { Eclair_Media_File *remove_media_file; Evas_List *next; if (!playlist || !list) return NULL; -/* + if (playlist->current == list) - { - if (playlist->current->next) - eclair_playlist_next_as_current(playlist); - else - eclair_playlist_prev_as_current(playlist); - }*/ + eclair_playlist_current_set_list(playlist, NULL); if ((remove_media_file = evas_list_data(list))) - { - if (remove_media_file->playlist_entry && playlist->eclair) - esmart_container_element_destroy(playlist->eclair->playlist_container, remove_media_file->playlist_entry); eclair_media_file_free(remove_media_file); - } next = list->next; playlist->playlist = evas_list_remove_list(playlist->playlist, list); + if (update_container && playlist->eclair && playlist->eclair->playlist_container) + eclair_playlist_container_update(playlist->eclair->playlist_container); + return next; } +//Remove the selected media files +void eclair_playlist_remove_selected_media_files(Eclair_Playlist *playlist) +{ + Evas_List *l; + Eclair_Media_File *media_file; + + if (!playlist) + return; + + for (l = playlist->playlist; l; ) + { + if ((media_file = l->data) && media_file->selected) + l = eclair_playlist_remove_media_file_list(playlist, l, 0); + else + l = l->next; + } + + if (playlist->eclair && playlist->eclair->playlist_container) + eclair_playlist_container_update(playlist->eclair->playlist_container); +} + +//Remove the unselected media files +void eclair_playlist_remove_unselected_media_files(Eclair_Playlist *playlist) +{ + Evas_List *l; + Eclair_Media_File *media_file; + + if (!playlist) + return; + + for (l = playlist->playlist; l; ) + { + if ((media_file = l->data) && !media_file->selected) + l = eclair_playlist_remove_media_file_list(playlist, l, 0); + else + l = l->next; + } + + if (playlist->eclair && playlist->eclair->playlist_container) + eclair_playlist_container_update(playlist->eclair->playlist_container); +} + +//Empty the playlist and destroy all the media_file +void eclair_playlist_empty(Eclair_Playlist *playlist) +{ + 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); +} + //Set the media file as the active media file void eclair_playlist_current_set(Eclair_Playlist *playlist, Eclair_Media_File *media_file) { if (!playlist) return; - eclair_playlist_current_set_list(playlist, evas_list_find_list(playlist->playlist, media_file)); + if (media_file) + eclair_playlist_current_set_list(playlist, evas_list_find_list(playlist->playlist, media_file)); + else + eclair_playlist_current_set_list(playlist, evas_list_find_list(playlist->playlist, NULL)); } //Set the media file stored in the list as the active media file void eclair_playlist_current_set_list(Eclair_Playlist *playlist, Evas_List *list) { - Eclair_Media_File *media_file; + Eclair_Media_File *previous_media_file; if (!playlist) return; - if ((media_file = eclair_playlist_current_media_file(playlist)) && media_file->playlist_entry) - edje_object_signal_emit(media_file->playlist_entry, "signal_unset_current", "eclair_bin"); - - if ((media_file = evas_list_data(list)) && media_file->playlist_entry) - { - edje_object_signal_emit(media_file->playlist_entry, "signal_set_current", "eclair_bin"); - if (playlist->eclair) - { - //TODO: doesn't work? - if (playlist->eclair->playlist_container) - esmart_container_scroll_to(playlist->eclair->playlist_container, media_file->playlist_entry); - } - } - + previous_media_file = evas_list_data(playlist->current); playlist->current = list; - eclair_update_current_file_info(playlist->eclair, 0); + eclair_media_file_update(playlist->eclair, previous_media_file); + eclair_media_file_update(playlist->eclair, evas_list_data(playlist->current)); + + //TODO: eclair_playlist_container scroll_to } //Set the media file which is just before the active media file as the active media file =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/eclair/src/eclair_playlist.h,v retrieving revision 1.6 retrieving revision 1.7 diff -u -3 -r1.6 -r1.7 --- eclair_playlist.h 8 May 2005 13:23:33 -0000 1.6 +++ eclair_playlist.h 18 May 2005 15:36:25 -0000 1.7 @@ -4,17 +4,21 @@ #include "eclair_private.h" void eclair_playlist_init(Eclair_Playlist *playlist, Eclair *eclair); -void eclair_playlist_empty(Eclair_Playlist *playlist); +void eclair_playlist_shutdown(Eclair_Playlist *playlist); Eclair_Media_File *eclair_playlist_current_media_file(Eclair_Playlist *playlist); Eclair_Media_File *eclair_playlist_prev_media_file(Eclair_Playlist *playlist); Eclair_Media_File *eclair_playlist_next_media_file(Eclair_Playlist *playlist); -Evas_Bool eclair_playlist_add_dir(Eclair_Playlist *playlist, char *dir); -Evas_Bool eclair_playlist_add_m3u(Eclair_Playlist *playlist, char *m3u_path); -Evas_Bool eclair_playlist_add_uri(Eclair_Playlist *playlist, char *uri); -void eclair_playlist_remove_media_file(Eclair_Playlist *playlist, Eclair_Media_File *media_file); -Evas_List *eclair_playlist_remove_media_file_list(Eclair_Playlist *playlist, Evas_List *list); +Evas_Bool eclair_playlist_add_dir(Eclair_Playlist *playlist, char *dir, Evas_Bool update_container); +Evas_Bool eclair_playlist_add_m3u(Eclair_Playlist *playlist, char *m3u_path, Evas_Bool update_container); +Evas_Bool eclair_playlist_add_uri(Eclair_Playlist *playlist, char *uri, Evas_Bool update_container); + +void eclair_playlist_remove_media_file(Eclair_Playlist *playlist, Eclair_Media_File *media_file, Evas_Bool update_container); +Evas_List *eclair_playlist_remove_media_file_list(Eclair_Playlist *playlist, Evas_List *list, Evas_Bool update_container); +void eclair_playlist_remove_selected_media_files(Eclair_Playlist *playlist); +void eclair_playlist_remove_unselected_media_files(Eclair_Playlist *playlist); +void eclair_playlist_empty(Eclair_Playlist *playlist); void eclair_playlist_current_set(Eclair_Playlist *playlist, Eclair_Media_File *media_file); void eclair_playlist_current_set_list(Eclair_Playlist *playlist, Evas_List *list); =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/eclair/src/eclair_private.h,v retrieving revision 1.11 retrieving revision 1.12 diff -u -3 -r1.11 -r1.12 --- eclair_private.h 7 May 2005 20:58:59 -0000 1.11 +++ eclair_private.h 18 May 2005 15:36:25 -0000 1.12 @@ -1,13 +1,14 @@ #ifndef _ECLAIR_PRIVATE_H_ #define _ECLAIR_PRIVATE_H_ +#include <Evas.h> #include <Ecore.h> #include <Ecore_X.h> #include <Ecore_Evas.h> #include <Edje.h> #include <gtk/gtk.h> #include <pthread.h> -#include <netdb.h> +#include <libxml/tree.h> typedef struct _Eclair Eclair; typedef enum _Eclair_State Eclair_State; @@ -20,14 +21,51 @@ typedef struct _Eclair_Meta_Tag_Manager Eclair_Meta_Tag_Manager; typedef struct _Eclair_Cover_Manager Eclair_Cover_Manager; typedef struct _Eclair_Config Eclair_Config; +typedef enum _Eclair_Config_Type Eclair_Config_Type; typedef enum _Eclair_Drop_Object Eclair_Drop_Object; +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; +typedef struct _Eclair_Color Eclair_Color; + +struct _Eclair_Color +{ + int r, g, b, a; +}; + +struct _Eclair_Playlist_Container_Object +{ + Evas_Object *rect; + Evas_Object *text; +}; + +struct _Eclair_Playlist_Container +{ + Evas_Object *clip; + Evas_Object *grabber; + Evas_List *entry_objects; + Evas_List **entries; + Eclair_Media_File *last_selected; + int entry_height; + double scroll_percent; + Ecore_Timer *scroll_timer; + double scroll_speed; + double scroll_start_time; + char *entry_theme_path; + Eclair_Color selected_entry_bg_color; + Eclair_Color selected_entry_fg_color; + Eclair_Color current_entry_bg_color; + Eclair_Color current_entry_fg_color; + Eclair *eclair; +}; struct _Eclair_Config { char config_dir_path[256]; char covers_dir_path[256]; char config_file_path[256]; - FILE *config_file; + xmlDocPtr config_doc; + xmlNodePtr root_node; }; enum _Eclair_Add_File_State @@ -37,6 +75,16 @@ ECLAIR_ADDING_FILE_TO_TREAT }; +struct _Eclair_Dialogs_Manager +{ + GtkWidget *file_chooser_dialog; + GtkWidget *menu_widget; + gboolean should_popup_menu; + gboolean should_open_file_chooser; + pthread_t dialogs_thread; + Eclair *eclair; +}; + struct _Eclair_Cover_Manager { Eclair_Add_File_State cover_add_state; @@ -72,7 +120,8 @@ char *comment; int length, track; short year; - Evas_Object *playlist_entry; + Eclair_Playlist_Container_Object *container_object; + Evas_Bool selected; }; struct _Eclair_Playlist @@ -141,18 +190,18 @@ char *gui_theme_file; Eclair_Drop_Object gui_drop_object; - //File chooser related vars - GtkWidget *file_chooser_widget; - Evas_Bool file_chooser_th_created; - pthread_t file_chooser_thread; - //Core vars Eclair_State state; Eclair_Playlist playlist; Eclair_Subtitles subtitles; + Eclair_Dialogs_Manager dialogs_manager; Eclair_Meta_Tag_Manager meta_tag_manager; Eclair_Cover_Manager cover_manager; Eclair_Config config; + + //Arguments + int *argc; + char ***argv; }; #endif ------------------------------------------------------- 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