[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