Updating branch refs/heads/0.2.2 to eec27106e6c351699a363e8c5a33a5927aa5a67e (commit) from b9db96357d7f4abedac003eb7fdcff24ae866ce9 (commit)
commit eec27106e6c351699a363e8c5a33a5927aa5a67e Author: Ali Abdallah <al...@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 ) ) { _______________________________________________ Xfce4-commits mailing list Xfce4-commits@xfce.org http://foo-projects.org/mailman/listinfo/xfce4-commits