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, &current_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

Reply via email to