[Xfce4-commits] <parole:0.2.2> Re-work the media chooser+other minor enhancements.

Ali Abdallah noreply at xfce.org
Wed Jan 20 15:10:06 CET 2010


Updating branch refs/heads/0.2.2
         to eec27106e6c351699a363e8c5a33a5927aa5a67e (commit)
       from b9db96357d7f4abedac003eb7fdcff24ae866ce9 (commit)

commit eec27106e6c351699a363e8c5a33a5927aa5a67e
Author: Ali Abdallah <aliov at xfce.org>
Date:   Tue Jan 19 14:25:25 2010 +0100

    Re-work the media chooser+other minor enhancements.

 data/interfaces/mediachooser.ui |  217 +++++++++++++++++++++++---------------
 parole/parole-file.c            |    4 +-
 src/parole-mediachooser.c       |  150 ++++++++++++++++++---------
 src/parole-mediachooser.h       |   22 +----
 src/parole-medialist.c          |  198 ++++++++++++++++++++++++++++++++++--
 src/parole-player.c             |    1 +
 src/parole-utils.c              |    2 +
 7 files changed, 428 insertions(+), 166 deletions(-)

diff --git a/data/interfaces/mediachooser.ui b/data/interfaces/mediachooser.ui
index e546f3d..ac62ab2 100644
--- a/data/interfaces/mediachooser.ui
+++ b/data/interfaces/mediachooser.ui
@@ -1,109 +1,154 @@
 <?xml version="1.0"?>
 <interface>
   <requires lib="gtk+" version="2.16"/>
+  <!-- interface-requires libxfce4ui 4.5 -->
   <!-- interface-naming-policy project-wide -->
-  <object class="GtkVBox" id="vbox">
-    <property name="visible">True</property>
-    <property name="orientation">vertical</property>
-    <property name="spacing">4</property>
-    <child>
-      <object class="GtkFileChooserWidget" id="filechooserwidget">
+  <object class="XfceTitledDialog" id="chooser">
+    <property name="title" translatable="yes">Parole Media Chooser</property>
+    <property name="default_width">680</property>
+    <property name="default_height">480</property>
+    <property name="icon_name">audio-x-generic</property>
+    <property name="type_hint">normal</property>
+    <property name="has_separator">False</property>
+    <property name="subtitle" translatable="yes">Open media files</property>
+    <signal name="destroy" handler="parole_media_chooser_destroy_cb"/>
+    <child internal-child="vbox">
+      <object class="GtkVBox" id="dialog-vbox">
         <property name="visible">True</property>
-        <property name="border_width">5</property>
         <property name="orientation">vertical</property>
-        <property name="spacing">1</property>
-        <signal name="file_activated" handler="media_chooser_file_activate_cb"/>
-        <signal name="current_folder_changed" handler="media_chooser_folder_changed_cb"/>
-      </object>
-      <packing>
-        <property name="position">0</property>
-      </packing>
-    </child>
-    <child>
-      <object class="GtkCheckButton" id="recursive">
-        <property name="label" translatable="yes">Scan folders recursively</property>
-        <property name="visible">True</property>
-        <property name="can_focus">True</property>
-        <property name="receives_default">False</property>
-        <property name="draw_indicator">True</property>
-        <signal name="toggled" handler="parole_media_chooser_recursive_toggled_cb"/>
-      </object>
-      <packing>
-        <property name="expand">False</property>
-        <property name="fill">False</property>
-        <property name="position">1</property>
-      </packing>
-    </child>
-    <child>
-      <object class="GtkCheckButton" id="replace">
-        <property name="label" translatable="yes">Replace playlist with opened files</property>
-        <property name="visible">True</property>
-        <property name="can_focus">True</property>
-        <property name="receives_default">False</property>
-        <property name="draw_indicator">True</property>
-        <signal name="toggled" handler="parole_media_chooser_replace_toggled_cb"/>
-      </object>
-      <packing>
-        <property name="expand">False</property>
-        <property name="fill">False</property>
-        <property name="position">2</property>
-      </packing>
-    </child>
-    <child>
-      <object class="GtkCheckButton" id="play-added-files">
-        <property name="label" translatable="yes">Start playing opened files</property>
-        <property name="visible">True</property>
-        <property name="can_focus">True</property>
-        <property name="receives_default">False</property>
-        <property name="draw_indicator">True</property>
-        <signal name="toggled" handler="start_playing_toggled_cb"/>
-      </object>
-      <packing>
-        <property name="expand">False</property>
-        <property name="fill">False</property>
-        <property name="position">3</property>
-      </packing>
-    </child>
-    <child>
-      <object class="GtkHButtonBox" id="hbuttonbox1">
-        <property name="visible">True</property>
-        <property name="border_width">5</property>
-        <property name="spacing">5</property>
-        <property name="layout_style">end</property>
+        <property name="spacing">2</property>
         <child>
-          <object class="GtkButton" id="close">
-            <property name="label">gtk-close</property>
+          <object class="GtkVBox" id="vbox">
             <property name="visible">True</property>
-            <property name="can_focus">True</property>
-            <property name="receives_default">True</property>
-            <property name="use_stock">True</property>
-            <signal name="clicked" handler="parole_media_chooser_close"/>
+            <property name="orientation">vertical</property>
+            <child>
+              <object class="GtkFileChooserWidget" id="filechooserwidget">
+                <property name="visible">True</property>
+                <property name="border_width">5</property>
+                <property name="orientation">vertical</property>
+                <property name="spacing">1</property>
+                <signal name="file_activated" handler="media_chooser_file_activate_cb"/>
+                <signal name="current_folder_changed" handler="media_chooser_folder_changed_cb"/>
+              </object>
+              <packing>
+                <property name="position">0</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkCheckButton" id="recursive">
+                <property name="label" translatable="yes">Scan folders recursively</property>
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="receives_default">False</property>
+                <property name="draw_indicator">True</property>
+                <signal name="toggled" handler="parole_media_chooser_recursive_toggled_cb"/>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">False</property>
+                <property name="position">1</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkCheckButton" id="replace">
+                <property name="label" translatable="yes">Replace playlist with opened files</property>
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="receives_default">False</property>
+                <property name="draw_indicator">True</property>
+                <signal name="toggled" handler="parole_media_chooser_replace_toggled_cb"/>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">False</property>
+                <property name="position">2</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkCheckButton" id="play-added-files">
+                <property name="label" translatable="yes">Start playing opened files</property>
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="receives_default">False</property>
+                <property name="draw_indicator">True</property>
+                <signal name="toggled" handler="start_playing_toggled_cb"/>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">False</property>
+                <property name="position">3</property>
+              </packing>
+            </child>
           </object>
           <packing>
-            <property name="expand">False</property>
-            <property name="fill">False</property>
-            <property name="position">0</property>
+            <property name="position">1</property>
           </packing>
         </child>
-        <child>
-          <object class="GtkButton" id="open">
+        <child internal-child="action_area">
+          <object class="GtkHButtonBox" id="dialog-action_area1">
             <property name="visible">True</property>
-            <property name="can_focus">True</property>
-            <property name="receives_default">True</property>
-            <property name="use_stock">True</property>
-            <signal name="clicked" handler="parole_media_chooser_open"/>
+            <property name="layout_style">edge</property>
+            <child>
+              <object class="GtkHBox" id="info">
+                <property name="visible">True</property>
+                <child>
+                  <placeholder/>
+                </child>
+              </object>
+              <packing>
+                <property name="position">0</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkHBox" id="hbox1">
+                <property name="visible">True</property>
+                <property name="spacing">5</property>
+                <property name="homogeneous">True</property>
+                <child>
+                  <object class="GtkButton" id="close">
+                    <property name="label">gtk-close</property>
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="receives_default">True</property>
+                    <property name="use_stock">True</property>
+                    <signal name="clicked" handler="parole_media_chooser_close_clicked"/>
+                  </object>
+                  <packing>
+                    <property name="position">0</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkButton" id="open">
+                    <property name="label" translatable="yes">Add</property>
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="receives_default">True</property>
+                    <property name="image">image1</property>
+                    <signal name="clicked" handler="parole_media_chooser_add_clicked"/>
+                  </object>
+                  <packing>
+                    <property name="position">1</property>
+                  </packing>
+                </child>
+              </object>
+              <packing>
+                <property name="pack_type">end</property>
+                <property name="position">1</property>
+              </packing>
+            </child>
           </object>
           <packing>
             <property name="expand">False</property>
             <property name="fill">False</property>
-            <property name="position">1</property>
+            <property name="pack_type">end</property>
+            <property name="position">0</property>
           </packing>
         </child>
       </object>
-      <packing>
-        <property name="expand">False</property>
-        <property name="position">4</property>
-      </packing>
     </child>
   </object>
+  <object class="GtkImage" id="image1">
+    <property name="visible">True</property>
+    <property name="stock">gtk-add</property>
+  </object>
 </interface>
diff --git a/parole/parole-file.c b/parole/parole-file.c
index 472a01a..ab6b666 100644
--- a/parole/parole-file.c
+++ b/parole/parole-file.c
@@ -33,6 +33,8 @@
 #include <taglib/tag_c.h>
 #endif
 
+#include <libxfce4util/libxfce4util.h>
+
 #include "parole-file.h"
 
 #define PAROLE_FILE_GET_PRIVATE(o) \
@@ -69,7 +71,7 @@ parole_file_finalize (GObject *object)
     file = PAROLE_FILE (object);
     priv = PAROLE_FILE_GET_PRIVATE (file);
     
-    g_debug ("File object finalized %s", priv->display_name);
+    TRACE ("File object finalized %s", priv->display_name);
     
     if ( priv->filename )
 	g_free (priv->filename);
diff --git a/src/parole-mediachooser.c b/src/parole-mediachooser.c
index 5138f3f..098ec71 100644
--- a/src/parole-mediachooser.c
+++ b/src/parole-mediachooser.c
@@ -46,10 +46,13 @@
 /*
  * GtkBuilder Callbacks
  */
-void	parole_media_chooser_open 	(GtkWidget *widget, 
-				         ParoleMediaChooser *chooser);
+void    parole_media_chooser_add_clicked (GtkWidget *widget,
+					  ParoleMediaChooser *chooser);
 
-void	parole_media_chooser_close	(GtkWidget *widget,
+void    parole_media_chooser_close_clicked (GtkWidget *widget,
+					    ParoleMediaChooser *chooser);
+
+void	parole_media_chooser_destroy_cb (GtkWidget *widget,
 					 ParoleMediaChooser *chooser);
 					 
 void	media_chooser_folder_changed_cb (GtkWidget *widget, 
@@ -67,6 +70,24 @@ void    parole_media_chooser_replace_toggled_cb (GtkToggleButton *button,
 void    start_playing_toggled_cb (GtkToggleButton *button,
 				  gpointer data);
 
+struct ParoleMediaChooser
+{
+    GObject         		 parent;
+    
+    ParoleConf                  *conf;
+    GtkWidget			*window;
+    GtkWidget 			*info;
+    
+};
+
+struct ParoleMediaChooserClass
+{
+    GObjectClass 		 parent_class;
+    
+    void			 (*media_files_opened)		    (ParoleMediaChooser *chooser,
+								     GSList *list);
+};
+
 enum
 {
     MEDIA_FILES_OPENED,
@@ -75,13 +96,7 @@ enum
 
 static guint signals [LAST_SIGNAL] = { 0 };
 
-G_DEFINE_TYPE (ParoleMediaChooser, parole_media_chooser, GTK_TYPE_DIALOG)
-
-void parole_media_chooser_close	(GtkWidget *widget, ParoleMediaChooser *chooser)
-{
-    g_object_unref (chooser->conf);
-    gtk_widget_destroy (GTK_WIDGET (chooser));
-}
+G_DEFINE_TYPE (ParoleMediaChooser, parole_media_chooser, G_TYPE_OBJECT)
 
 void
 media_chooser_folder_changed_cb (GtkWidget *widget, gpointer data)
@@ -133,25 +148,64 @@ parole_media_chooser_add (ParoleMediaChooser *chooser, GtkWidget *file_chooser)
     g_slist_free (files);
 }
 
-void
-parole_media_chooser_open (GtkWidget *widget, ParoleMediaChooser *chooser)
+static gboolean
+parole_media_chooser_add_idle (gpointer data)
 {
+    ParoleMediaChooser *chooser;
     GtkWidget *file_chooser;
-
+    
+    chooser = PAROLE_MEDIA_CHOOSER (data);
+    
     file_chooser = GTK_WIDGET (g_object_get_data (G_OBJECT (chooser), "file-chooser"));
     
-    parole_window_busy_cursor (GTK_WIDGET (chooser)->window);
     parole_media_chooser_add (chooser, file_chooser);
-    gtk_widget_destroy (GTK_WIDGET (chooser));
+    
+    gtk_widget_destroy (chooser->window);
+    
+    return FALSE;
+}
+
+static void
+parole_media_chooser_open (ParoleMediaChooser *chooser)
+{
+    GtkWidget *img;
+    gchar *path;
+
+    parole_window_busy_cursor (chooser->window->window);
+    
+    path = g_build_filename (PIXMAPS_DIR, "loader.gif", NULL);
+    
+    img = gtk_image_new_from_file (path);
+    g_free (path);
+    
+    gtk_box_pack_start (GTK_BOX (chooser->info), img, FALSE, FALSE, 0);
+    gtk_widget_show_all (chooser->info);
+    
+    g_idle_add ((GSourceFunc) parole_media_chooser_add_idle, chooser);
+}
+
+void parole_media_chooser_add_clicked (GtkWidget *widget, ParoleMediaChooser *chooser)
+{
+    parole_media_chooser_open (chooser);
+}
+
+void parole_media_chooser_close_clicked (GtkWidget *widget, ParoleMediaChooser *chooser)
+{
+    gtk_widget_destroy (chooser->window);
+}
+
+void parole_media_chooser_destroy_cb (GtkWidget *widget, ParoleMediaChooser *chooser)
+{
+    g_object_unref (chooser);
 }
 
 void media_chooser_file_activate_cb (GtkFileChooser *filechooser, ParoleMediaChooser *chooser)
 {
-    parole_media_chooser_open (NULL, chooser);
+    parole_media_chooser_open (chooser);
 }
 
-void	parole_media_chooser_recursive_toggled_cb (GtkToggleButton *recursive,
-						   gpointer data)
+void parole_media_chooser_recursive_toggled_cb (GtkToggleButton *recursive,
+						gpointer data)
 {
     ParoleMediaChooser *chooser;
 
@@ -187,14 +241,10 @@ void start_playing_toggled_cb (GtkToggleButton *button,
 }
 
 static void
-parole_media_chooser_open_internal (GtkWidget *chooser)
+parole_media_chooser_open_internal (ParoleMediaChooser *media_chooser)
 {
-    ParoleMediaChooser *media_chooser;
-    GtkWidget   *vbox;
     GtkWidget   *file_chooser;
     GtkBuilder  *builder;
-    GtkWidget   *open;
-    GtkWidget   *img;
     GtkWidget   *recursive;
     GtkWidget   *replace;
     GtkWidget   *play_opened;
@@ -203,17 +253,13 @@ parole_media_chooser_open_internal (GtkWidget *chooser)
     gboolean     play;
     const gchar *folder;
 
-    media_chooser = PAROLE_MEDIA_CHOOSER (chooser);
-    
     builder = parole_builder_new_from_string (mediachooser_ui, mediachooser_ui_length);
     
-    file_chooser = GTK_WIDGET (gtk_builder_get_object (builder, "filechooserwidget"));
+    media_chooser->window = GTK_WIDGET (gtk_builder_get_object (builder, "chooser"));
+    media_chooser->info = GTK_WIDGET (gtk_builder_get_object (builder, "info"));
     
-    vbox = GTK_WIDGET (gtk_builder_get_object (builder, "vbox"));
-    open = GTK_WIDGET (gtk_builder_get_object (builder, "open"));
+    file_chooser = GTK_WIDGET (gtk_builder_get_object (builder, "filechooserwidget"));
     
-    gtk_window_set_title (GTK_WINDOW (chooser), _("Add media files"));
-
     gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (file_chooser), parole_get_supported_files_filter ());
     gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (file_chooser), parole_get_supported_media_filter ());
     gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (file_chooser), parole_get_supported_audio_filter ());
@@ -241,27 +287,26 @@ parole_media_chooser_open_internal (GtkWidget *chooser)
     gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (replace), replace_playlist);
     gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (play_opened), play);
     
-    img = gtk_image_new_from_stock (GTK_STOCK_ADD, GTK_ICON_SIZE_BUTTON);
-    
-    g_object_set (G_OBJECT (open),
-		  "image", img,
-		  "label", _("Add"),
-		  NULL);
+    g_object_set_data (G_OBJECT (media_chooser), "file-chooser", file_chooser);
+    g_object_set_data (G_OBJECT (media_chooser), "recursive", recursive);
     
-    g_object_set_data (G_OBJECT (chooser), "file-chooser", file_chooser);
-    g_object_set_data (G_OBJECT (chooser), "recursive", recursive);
+    gtk_builder_connect_signals (builder, media_chooser);
     
-    gtk_container_add (GTK_CONTAINER (GTK_DIALOG (media_chooser)->vbox), vbox);
-    gtk_builder_connect_signals (builder, chooser);
-    g_signal_connect (chooser, "destroy",
-		      G_CALLBACK (gtk_widget_destroy), chooser);
-		      
     g_object_unref (builder);
 }
 
 static void
 parole_media_chooser_finalize (GObject *object)
 {
+    ParoleMediaChooser *chooser;
+    
+    chooser = PAROLE_MEDIA_CHOOSER (object);
+    
+    g_object_unref (chooser->conf);
+    
+    if ( chooser->window )
+	gtk_widget_destroy (chooser->window);
+    
     G_OBJECT_CLASS (parole_media_chooser_parent_class)->finalize (object);
 }
 
@@ -286,24 +331,25 @@ parole_media_chooser_class_init (ParoleMediaChooserClass *klass)
 static void
 parole_media_chooser_init (ParoleMediaChooser *chooser)
 {
-    gtk_window_set_modal (GTK_WINDOW (chooser), TRUE);
-    
     chooser->conf = parole_conf_new ();
 }
 
-GtkWidget *parole_media_chooser_open_local (GtkWidget *parent)
+ParoleMediaChooser *parole_media_chooser_open_local (GtkWidget *parent)
 {
     ParoleMediaChooser *chooser;
         
     chooser = g_object_new (PAROLE_TYPE_MEDIA_CHOOSER, NULL);
     
+    parole_media_chooser_open_internal (chooser);
+
+    gtk_window_set_modal (GTK_WINDOW (chooser->window), TRUE);
+    
     if ( parent )
-	gtk_window_set_transient_for (GTK_WINDOW (chooser), GTK_WINDOW (parent));
+	gtk_window_set_transient_for (GTK_WINDOW (chooser->window), GTK_WINDOW (parent));
 	
-    gtk_window_set_position (GTK_WINDOW (chooser), GTK_WIN_POS_CENTER_ON_PARENT);
-    parole_media_chooser_open_internal (GTK_WIDGET (chooser));
-    
-    gtk_window_set_default_size (GTK_WINDOW (chooser), 680, 480);
+    gtk_window_set_position (GTK_WINDOW (chooser->window), GTK_WIN_POS_CENTER_ON_PARENT);
+
+    gtk_widget_show_all (chooser->window);
 
-    return GTK_WIDGET (chooser);
+    return chooser;
 }
diff --git a/src/parole-mediachooser.h b/src/parole-mediachooser.h
index 60abb1a..36e61d4 100644
--- a/src/parole-mediachooser.h
+++ b/src/parole-mediachooser.h
@@ -32,28 +32,12 @@ G_BEGIN_DECLS
 #define PAROLE_MEDIA_CHOOSER(o)          (G_TYPE_CHECK_INSTANCE_CAST ((o), PAROLE_TYPE_MEDIA_CHOOSER, ParoleMediaChooser))
 #define PAROLE_IS_MEDIA_CHOOSER(o)       (G_TYPE_CHECK_INSTANCE_TYPE ((o), PAROLE_TYPE_MEDIA_CHOOSER))
 
-typedef struct ParoleMediaChooserPrivate ParoleMediaChooserPrivate;
-
-typedef struct
-{
-    GtkDialog         		 parent;
-    
-    ParoleConf                  *conf;
-    
-} ParoleMediaChooser;
-
-typedef struct
-{
-    GtkDialogClass 		 parent_class;
-    
-    void			 (*media_files_opened)		    (ParoleMediaChooser *chooser,
-								     GSList *list);
-								     
-} ParoleMediaChooserClass;
+typedef struct ParoleMediaChooser ParoleMediaChooser;
+typedef struct ParoleMediaChooserClass ParoleMediaChooserClass;
 
 GType        			 parole_media_chooser_get_type      (void) G_GNUC_CONST;
 
-GtkWidget			*parole_media_chooser_open_local    (GtkWidget *parent);
+ParoleMediaChooser		*parole_media_chooser_open_local    (GtkWidget *parent);
 								     
 G_END_DECLS
 
diff --git a/src/parole-medialist.c b/src/parole-medialist.c
index 3704d31..79d42fb 100644
--- a/src/parole-medialist.c
+++ b/src/parole-medialist.c
@@ -187,6 +187,17 @@ parole_media_list_set_widget_sensitive (ParoleMediaList *list, gboolean sensitiv
     gtk_widget_set_sensitive (GTK_WIDGET (list->priv->save), sensitive);
 }
 
+/**
+ * parole_media_list_add:
+ * @ParoleMediaList: a #ParoleMediaList
+ * @file: a #ParoleFile
+ * @emit: TRUE to emit a play signal.
+ * @select_row: TRUE to select the added row
+ * 
+ * All the media items added to the media list view are added by
+ * this function, setting emit to TRUE will cause the player to
+ * start playing the added file.
+ **/
 static void
 parole_media_list_add (ParoleMediaList *list, ParoleFile *file, gboolean emit, gboolean select_row)
 {
@@ -238,6 +249,13 @@ parole_media_list_add (ParoleMediaList *list, ParoleFile *file, gboolean emit, g
 	
 }
 
+/**
+ * parole_media_list_files_open:
+ * @ParoleMediaList: a #ParoleMediaList
+ * @files: a #GSList contains a list of #ParoleFile
+ * @emit: TRUE to emit a play signal.
+ * 
+ **/
 static void
 parole_media_list_files_open (ParoleMediaList *list, GSList *files, gboolean emit)
 {
@@ -301,14 +319,14 @@ parole_media_list_location_opened_cb (ParoleOpenLocation *obj, const gchar *loca
 static void
 parole_media_list_open_internal (ParoleMediaList *list)
 {
-    GtkWidget *chooser;
+    ParoleMediaChooser *chooser;
+    
+    TRACE ("start");
     
     chooser = parole_media_chooser_open_local (gtk_widget_get_toplevel (GTK_WIDGET (list)));
 					       
     g_signal_connect (G_OBJECT (chooser), "media_files_opened",
 		      G_CALLBACK (parole_media_list_files_opened_cb), list);
-    
-    gtk_widget_show_all (GTK_WIDGET (chooser));
 }
 
 static void
@@ -324,6 +342,16 @@ parole_media_list_open_location_internal (ParoleMediaList *list)
     gtk_widget_show_all (GTK_WIDGET (location));
 }
 
+/**
+ * parole_media_list_get_files:
+ * @list: a #ParoleMediaList
+ * 
+ * Get a #GSList of all #ParoleFile media files currently displayed in the
+ * media list view
+ * 
+ * Returns: a #GSList contains a list of #ParoleFile
+ * 
+ **/
 static GSList *
 parole_media_list_get_files (ParoleMediaList *list)
 {
@@ -405,6 +433,16 @@ void parole_media_list_close_save_dialog_cb (GtkButton *button, ParolePlaylistSa
     g_free (data);
 }
 
+/**
+ * parole_media_list_get_first_selected_row:
+ * @list: a #ParoleMediaList
+ * 
+ * Gets the first selected row in the media list view.
+ * 
+ * Returns: a #GtkTreeRowReference for the selected row, or NULL if no one is 
+ * 	    currently selected.
+ * 
+ **/
 static GtkTreeRowReference *
 parole_media_list_get_first_selected_row (ParoleMediaList *list)
 {
@@ -582,8 +620,42 @@ void parole_media_list_save_cb (GtkButton *button, ParoleMediaList *list)
     g_object_unref (builder);
 }
 
+/**
+ * parole_media_list_get_first_path:
+ * @model: a #GtkTreeModel
+ * 
+ * Get the first path in the model, or NULL if the model is empty
+ * 
+ * Returns: a #GtkTreePath
+ **/
+static GtkTreePath *
+parole_media_list_get_first_path (GtkTreeModel *model) 
+{
+    GtkTreePath *path = NULL;
+    GtkTreeIter iter;
+    
+    if (gtk_tree_model_get_iter_first (model, &iter) )
+    {
+	path = gtk_tree_model_get_path (GTK_TREE_MODEL (model), &iter);
+    }
+    
+    return path;
+}
+
+/**
+ * 
+ * parole_media_list_paths_to_row_list:
+ * @path_list: a #GList contains a list of #GtkTreePath
+ * @GtkTreeModel: a #GtkTreeModel that contains the paths
+ * 
+ * Converts a list of #GtkTreePath to a list of #GtkTreeRowReference
+ * 
+ * Returns: a #GList contains a list of #GtkTreeRowReference.
+ * 
+ * 
+ **/
 static GList *
-parole_media_list_path_to_row_list (GList *path_list, GtkTreeModel *model)
+parole_media_list_paths_to_row_list (GList *path_list, GtkTreeModel *model)
 {
     GList *row_list = NULL;
     guint len, i;
@@ -605,6 +677,11 @@ parole_media_list_path_to_row_list (GList *path_list, GtkTreeModel *model)
     return row_list;
 }
 
+/**
+ * parole_media_list_remove_clicked_cb:
+ * 
+ * 
+ **/
 void
 parole_media_list_remove_clicked_cb (GtkButton *button, ParoleMediaList *list)
 {
@@ -612,12 +689,40 @@ parole_media_list_remove_clicked_cb (GtkButton *button, ParoleMediaList *list)
     GList *path_list = NULL;
     GList *row_list = NULL;
     GtkTreeIter iter;
+    gboolean row_selected = FALSE;
     gint nch;
     guint len, i;
-    
+
+    /* Get the GtkTreePath GList of all selected rows */
     path_list = gtk_tree_selection_get_selected_rows (list->priv->sel, &model);
 	
-    row_list = parole_media_list_path_to_row_list (path_list, model);
+    /**
+     * Convert them to row references so when we remove one the others always points
+     * to the correct node.
+     **/
+    row_list = parole_media_list_paths_to_row_list (path_list, model);
+
+    /**
+     * Select first path before the first path
+     * that we going to remove.
+     **/
+    if (g_list_length (path_list) != 0)
+    {
+	GtkTreePath *path, *prev;
+	
+	/* Get first item */
+	path = g_list_nth_data (path_list, 0);
+	
+	/* copy it as we don't mess with the list*/
+	prev = gtk_tree_path_copy (path);
+	
+	if ( gtk_tree_path_prev (prev) )
+	{
+	    parole_media_list_select_path (list, prev);
+	    row_selected = TRUE;
+	}
+	gtk_tree_path_free (prev);
+    }
     
     g_list_foreach (path_list, (GFunc) gtk_tree_path_free, NULL);
     g_list_free (path_list);
@@ -641,6 +746,15 @@ parole_media_list_remove_clicked_cb (GtkButton *button, ParoleMediaList *list)
     g_list_foreach (row_list, (GFunc) gtk_tree_row_reference_free, NULL);
     g_list_free (row_list);
     
+    /* No row was selected, then select the first one*/
+    if (!row_selected)
+    {
+	GtkTreePath *path;
+	path = parole_media_list_get_first_path (model);
+	parole_media_list_select_path (list, path);
+	gtk_tree_path_free (path);
+    }
+    
     /*
      * Returns the number of children that iter has. 
      * As a special case, if iter is NULL, 
@@ -664,6 +778,16 @@ parole_media_list_remove_clicked_cb (GtkButton *button, ParoleMediaList *list)
     }
 }
 
+/**
+ * parole_media_list_move_on_down:
+ * 
+ * @store: a #GtkListStore
+ * @iter: a #GtkTreeIter
+ * 
+ * Move the node pointed to by @iter one step down, if the node is the last
+ * one then move it to the first position in the @store.
+ * 
+ **/
 static void
 parole_media_list_move_one_down (GtkListStore *store, GtkTreeIter *iter)
 {
@@ -689,6 +813,15 @@ parole_media_list_move_one_down (GtkListStore *store, GtkTreeIter *iter)
     gtk_tree_iter_free (pos_iter);
 }
 
+/**
+ * parole_media_list_move_many_down:
+ * @path_list: a #GList contains list of #GtkTreePath
+ * @model: a #GtkTreeModel
+ * 
+ * Moves down many nodes pointed to by the paths that are in
+ * the list.
+ * 
+ **/
 static void
 parole_media_list_move_many_down (GList *path_list, GtkTreeModel *model)
 {
@@ -697,7 +830,7 @@ parole_media_list_move_many_down (GList *path_list, GtkTreeModel *model)
     guint len;
     guint i;
     
-    row_list = parole_media_list_path_to_row_list (path_list, model);
+    row_list = parole_media_list_paths_to_row_list (path_list, model);
     
     len = g_list_length (row_list);
     
@@ -720,6 +853,11 @@ parole_media_list_move_many_down (GList *path_list, GtkTreeModel *model)
     g_list_free (row_list);
 }
 
+/**
+ * parole_media_list_media_down_clicked_cb:
+ * 
+ * 
+ **/
 void
 parole_media_list_media_down_clicked_cb (GtkButton *button, ParoleMediaList *list)
 {
@@ -748,6 +886,17 @@ parole_media_list_media_down_clicked_cb (GtkButton *button, ParoleMediaList *lis
     g_list_free (path_list);
 }
 
+
+/**
+ * parole_media_list_move_on_up:
+ * 
+ * @store: a #GtkListStore
+ * @iter: a #GtkTreeIter
+ * 
+ * Move the node pointed to by @iter one step up, if the node is the first
+ * one then move it to the last position in the @store.
+ * 
+ **/
 static void
 parole_media_list_move_one_up (GtkListStore *store, GtkTreeIter *iter)
 {
@@ -776,6 +925,15 @@ parole_media_list_move_one_up (GtkListStore *store, GtkTreeIter *iter)
     gtk_tree_iter_free (pos_iter);
 }
 
+/**
+ * parole_media_list_move_many_up:
+ * @path_list: a #GList contains list of #GtkTreePath
+ * @model: a #GtkTreeModel
+ * 
+ * Moves up many nodes pointed to by the paths that are in
+ * the list.
+ * 
+ **/
 static void
 parole_media_list_move_many_up (GList *path_list, GtkTreeModel *model)
 {
@@ -784,7 +942,7 @@ parole_media_list_move_many_up (GList *path_list, GtkTreeModel *model)
     guint len;
     guint i;
     
-    row_list = parole_media_list_path_to_row_list (path_list, model);
+    row_list = parole_media_list_paths_to_row_list (path_list, model);
     
     len = g_list_length (row_list);
     
@@ -807,6 +965,11 @@ parole_media_list_move_many_up (GList *path_list, GtkTreeModel *model)
     g_list_free (row_list);
 }
 
+/**
+ * parole_media_list_media_up_clicked_cb:
+ * 
+ * 
+ **/
 void
 parole_media_list_media_up_clicked_cb (GtkButton *button, ParoleMediaList *list)
 {
@@ -835,6 +998,11 @@ parole_media_list_media_up_clicked_cb (GtkButton *button, ParoleMediaList *list)
     g_list_free (path_list);
 }
 
+/**
+ * parole_media_list_row_activated_cb:
+ * 
+ * 
+ **/
 void
 parole_media_list_row_activated_cb (GtkTreeView *view, GtkTreePath *path, 
 				    GtkTreeViewColumn *col, ParoleMediaList *list)
@@ -1376,6 +1544,13 @@ gboolean parole_media_list_is_empty (ParoleMediaList *list)
     return !gtk_tree_model_get_iter_first (GTK_TREE_MODEL (list->priv->store), &iter);
 }
 
+/**
+ * parole_media_list_get_first_row:
+ * @list: a #ParoleMediaList
+ * 
+ * 
+ * Returns: a #GtkTreeRowReference of the first row in the media list.
+ **/
 GtkTreeRowReference *parole_media_list_get_first_row (ParoleMediaList *list)
 {
     GtkTreeRowReference *row = NULL;
@@ -1389,6 +1564,13 @@ GtkTreeRowReference *parole_media_list_get_first_row (ParoleMediaList *list)
     return row;
 }
 
+/**
+ * parole_media_list_get_selected_row:
+ * @list: a #ParoleMediaList
+ * 
+ * 
+ * Returns: a #GtkTreeRowReference of the selected row.
+ **/
 GtkTreeRowReference *parole_media_list_get_selected_row (ParoleMediaList *list)
 {
     return parole_media_list_get_first_selected_row (list);
diff --git a/src/parole-player.c b/src/parole-player.c
index ac32c1f..00561c0 100644
--- a/src/parole-player.c
+++ b/src/parole-player.c
@@ -1715,6 +1715,7 @@ parole_player_handle_key_press (GdkEventKey *ev, ParolePlayer *player)
 	case GDK_Up:
 	case GDK_Down:
 	case GDK_Return:
+	case GDK_Delete:
 	    parole_media_list_grab_focus (player->priv->list);
 	    break;
 	default:
diff --git a/src/parole-utils.c b/src/parole-utils.c
index b0cb8c8..86da573 100644
--- a/src/parole-utils.c
+++ b/src/parole-utils.c
@@ -360,6 +360,8 @@ void parole_get_media_files (GtkFileFilter *filter, const gchar *path,
 
     playlist_filter = parole_get_supported_playlist_filter ();
     g_object_ref_sink (playlist_filter);
+    
+    gtk_main_iteration_do (FALSE);
 
     if ( g_file_test (path, G_FILE_TEST_IS_REGULAR ) )
     {



More information about the Xfce4-commits mailing list