Updating branch refs/heads/master to 02fab972c3397e51fd9289313eec0d9d2d605809 (commit) from cdd5b9e9206c97a5324f9dc6518efa33ac14ae58 (commit)
commit 02fab972c3397e51fd9289313eec0d9d2d605809 Author: Sean Davis <smd.seanda...@gmail.com> Date: Sat Jul 14 11:43:41 2012 -0400 Rearranged playlist buttons, added shuffle and repeat. Shuffle and Repeat playlist buttons now toggle menu items as well... but not the other way around yet. data/interfaces/playlist.ui | 55 +++++++++--------- src/parole-medialist.c | 129 ++++++++++++++++++------------------------- src/parole-medialist.h | 6 ++ src/parole-player.c | 65 ++++++++++++++++++++++ src/parole-player.h | 7 ++ 5 files changed, 159 insertions(+), 103 deletions(-) diff --git a/data/interfaces/playlist.ui b/data/interfaces/playlist.ui index 8b09d5f..d9bb444 100644 --- a/data/interfaces/playlist.ui +++ b/data/interfaces/playlist.ui @@ -2,30 +2,32 @@ <interface> <requires lib="gtk+" version="2.24"/> <!-- interface-naming-policy project-wide --> - <object class="GtkImage" id="image1"> + <object class="GtkImage" id="image_add"> <property name="visible">True</property> <property name="can_focus">False</property> <property name="stock">gtk-add</property> </object> - <object class="GtkImage" id="image2"> + <object class="GtkImage" id="image_clear"> <property name="visible">True</property> <property name="can_focus">False</property> - <property name="stock">gtk-remove</property> + <property name="stock">gtk-clear</property> </object> - <object class="GtkImage" id="image3"> + <object class="GtkImage" id="image_remove"> <property name="visible">True</property> <property name="can_focus">False</property> - <property name="stock">gtk-go-up</property> + <property name="stock">gtk-remove</property> </object> - <object class="GtkImage" id="image4"> + <object class="GtkImage" id="image_repeat"> <property name="visible">True</property> <property name="can_focus">False</property> - <property name="stock">gtk-go-down</property> + <property name="pixel_size">20</property> + <property name="icon_name">media-playlist-repeat</property> </object> - <object class="GtkImage" id="image5"> + <object class="GtkImage" id="image_shuffle"> <property name="visible">True</property> <property name="can_focus">False</property> - <property name="stock">gtk-save-as</property> + <property name="pixel_size">20</property> + <property name="icon_name">media-playlist-shuffle</property> </object> <object class="GtkVBox" id="playlist-box"> <property name="visible">True</property> @@ -80,7 +82,7 @@ <property name="can_focus">True</property> <property name="receives_default">True</property> <property name="use_action_appearance">False</property> - <property name="image">image1</property> + <property name="image">image_add</property> <signal name="clicked" handler="parole_media_list_add_clicked_cb" swapped="no"/> </object> <packing> @@ -90,14 +92,14 @@ </packing> </child> <child> - <object class="GtkButton" id="save-playlist"> + <object class="GtkButton" id="remove-media"> <property name="visible">True</property> <property name="sensitive">False</property> <property name="can_focus">True</property> <property name="receives_default">True</property> <property name="use_action_appearance">False</property> - <property name="image">image5</property> - <signal name="clicked" handler="parole_media_list_save_cb" swapped="no"/> + <property name="image">image_remove</property> + <signal name="clicked" handler="parole_media_list_remove_clicked_cb" swapped="no"/> </object> <packing> <property name="expand">False</property> @@ -106,49 +108,46 @@ </packing> </child> <child> - <object class="GtkButton" id="remove-media"> + <object class="GtkButton" id="clear-media"> <property name="visible">True</property> - <property name="sensitive">False</property> <property name="can_focus">True</property> <property name="receives_default">True</property> <property name="use_action_appearance">False</property> - <property name="image">image2</property> - <signal name="clicked" handler="parole_media_list_remove_clicked_cb" swapped="no"/> + <property name="image">image_clear</property> + <signal name="clicked" handler="parole_media_list_clear_clicked_cb" swapped="no"/> </object> <packing> - <property name="expand">False</property> + <property name="expand">True</property> <property name="fill">True</property> <property name="position">2</property> </packing> </child> <child> - <object class="GtkButton" id="media-up"> + <object class="GtkToggleButton" id="repeat-media"> <property name="visible">True</property> - <property name="sensitive">False</property> <property name="can_focus">True</property> <property name="receives_default">True</property> <property name="use_action_appearance">False</property> - <property name="image">image3</property> - <signal name="clicked" handler="parole_media_list_media_up_clicked_cb" swapped="no"/> + <property name="image">image_repeat</property> + <signal name="toggled" handler="parole_media_list_repeat_toggled_cb" swapped="no"/> </object> <packing> - <property name="expand">False</property> + <property name="expand">True</property> <property name="fill">True</property> <property name="position">3</property> </packing> </child> <child> - <object class="GtkButton" id="media-down"> + <object class="GtkToggleButton" id="shuffle-media"> <property name="visible">True</property> - <property name="sensitive">False</property> <property name="can_focus">True</property> <property name="receives_default">True</property> <property name="use_action_appearance">False</property> - <property name="image">image4</property> - <signal name="clicked" handler="parole_media_list_media_down_clicked_cb" swapped="no"/> + <property name="image">image_shuffle</property> + <signal name="toggled" handler="parole_media_list_shuffle_toggled_cb" swapped="no"/> </object> <packing> - <property name="expand">False</property> + <property name="expand">True</property> <property name="fill">True</property> <property name="position">4</property> </packing> diff --git a/src/parole-medialist.c b/src/parole-medialist.c index 850bdeb..41ace6b 100644 --- a/src/parole-medialist.c +++ b/src/parole-medialist.c @@ -99,19 +99,19 @@ static void parole_media_list_clear_list (ParoleMediaList *list); /* * Callbacks for GtkBuilder */ -void parole_media_list_media_up_clicked_cb (GtkButton *button, +void parole_media_list_add_clicked_cb (GtkButton *button, ParoleMediaList *list); -void parole_media_list_media_down_clicked_cb (GtkButton *button, +void parole_media_list_remove_clicked_cb (GtkButton *button, ParoleMediaList *list); -void parole_media_list_save_cb (GtkButton *button, - ParoleMediaList *list); - -void parole_media_list_add_clicked_cb (GtkButton *button, +void parole_media_list_clear_clicked_cb (GtkButton *button, ParoleMediaList *list); - -void parole_media_list_remove_clicked_cb (GtkButton *button, + +void parole_media_list_repeat_toggled_cb (GtkToggleButton *button, + ParoleMediaList *list); + +void parole_media_list_shuffle_toggled_cb (GtkToggleButton *button, ParoleMediaList *list); void parole_media_list_row_activated_cb (GtkTreeView *view, @@ -179,6 +179,8 @@ enum MEDIA_ACTIVATED, MEDIA_CURSOR_CHANGED, URI_OPENED, + SHUFFLE_TOGGLED, + REPEAT_TOGGLED, LAST_SIGNAL }; @@ -435,6 +437,32 @@ parole_media_list_add_clicked_cb (GtkButton *button, ParoleMediaList *list) parole_media_list_open_internal (list); } +void +parole_media_list_clear_clicked_cb (GtkButton *button, ParoleMediaList *list) +{ + parole_media_list_clear_list (list); +} + +void +parole_media_list_repeat_toggled_cb (GtkToggleButton *button, ParoleMediaList *list) +{ + gboolean toggled; + + toggled = gtk_toggle_button_get_active (button); + + g_signal_emit (G_OBJECT (list), signals [REPEAT_TOGGLED], 0, toggled); +} + +void +parole_media_list_shuffle_toggled_cb (GtkToggleButton *button, ParoleMediaList *list) +{ + gboolean toggled; + + toggled = gtk_toggle_button_get_active (button); + + g_signal_emit (G_OBJECT (list), signals [SHUFFLE_TOGGLED], 0, toggled); +} + void parole_media_list_close_save_dialog_cb (GtkButton *button, ParolePlaylistSave *data) { gtk_widget_destroy (GTK_WIDGET (data->chooser)); @@ -920,40 +948,6 @@ parole_media_list_move_many_down (GList *path_list, GtkTreeModel *model) } /** - * parole_media_list_media_down_clicked_cb: - * - * - **/ -void -parole_media_list_media_down_clicked_cb (GtkButton *button, ParoleMediaList *list) -{ - GtkTreeIter iter; - GList *path_list = NULL; - GtkTreeModel *model; - guint len; - - path_list = gtk_tree_selection_get_selected_rows (list->priv->sel, &model); - - len = g_list_length (path_list); - - if ( len == 1 ) - { - GtkTreePath *path; - path = g_list_nth_data (path_list, 0); - if ( G_LIKELY (gtk_tree_model_get_iter (model, &iter, path)) ) - parole_media_list_move_one_down (list->priv->store, &iter); - } - else - { - parole_media_list_move_many_down (path_list, model); - } - - g_list_foreach (path_list, (GFunc) gtk_tree_path_free, NULL); - g_list_free (path_list); -} - - -/** * parole_media_list_move_on_up: * * @store: a #GtkListStore @@ -1032,39 +1026,6 @@ parole_media_list_move_many_up (GList *path_list, GtkTreeModel *model) } /** - * parole_media_list_media_up_clicked_cb: - * - * - **/ -void -parole_media_list_media_up_clicked_cb (GtkButton *button, ParoleMediaList *list) -{ - GtkTreeIter iter; - GList *path_list = NULL; - GtkTreeModel *model; - guint len; - - path_list = gtk_tree_selection_get_selected_rows (list->priv->sel, &model); - - len = g_list_length (path_list); - - if ( len == 1 ) - { - GtkTreePath *path; - path = g_list_nth_data (path_list, 0); - if ( G_LIKELY (gtk_tree_model_get_iter (model, &iter, path)) ) - parole_media_list_move_one_up (list->priv->store, &iter); - } - else - { - parole_media_list_move_many_up (path_list, model); - } - - g_list_foreach (path_list, (GFunc) gtk_tree_path_free, NULL); - g_list_free (path_list); -} - -/** * parole_media_list_row_activated_cb: * * @@ -1448,6 +1409,24 @@ parole_media_list_class_init (ParoleMediaListClass *klass) NULL, NULL, g_cclosure_marshal_VOID__STRING, G_TYPE_NONE, 1, G_TYPE_STRING); + + signals[SHUFFLE_TOGGLED] = + g_signal_new ("shuffle-toggled", + PAROLE_TYPE_MEDIA_LIST, + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (ParoleMediaListClass, shuffle_toggled), + NULL, NULL, + g_cclosure_marshal_VOID__BOOLEAN, + G_TYPE_NONE, 1, G_TYPE_BOOLEAN); + + signals[REPEAT_TOGGLED] = + g_signal_new ("repeat-toggled", + PAROLE_TYPE_MEDIA_LIST, + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (ParoleMediaListClass, repeat_toggled), + NULL, NULL, + g_cclosure_marshal_VOID__BOOLEAN, + G_TYPE_NONE, 1, G_TYPE_BOOLEAN); g_type_class_add_private (klass, sizeof (ParoleMediaListPrivate)); diff --git a/src/parole-medialist.h b/src/parole-medialist.h index 36b08a3..321a23e 100644 --- a/src/parole-medialist.h +++ b/src/parole-medialist.h @@ -60,6 +60,12 @@ typedef struct void (*uri_opened) (ParoleMediaList *list, const gchar *uri); + + void (*shuffle_toggled) (ParoleMediaList *list, + gboolean shuffle_toggled); + + void (*repeat_toggled) (ParoleMediaList *list, + gboolean repeat_toggled); } ParoleMediaListClass; diff --git a/src/parole-player.c b/src/parole-player.c index 7644055..4eadb4f 100644 --- a/src/parole-player.c +++ b/src/parole-player.c @@ -257,6 +257,8 @@ struct ParolePlayerPrivate GtkWidget *playlist_nt; GtkWidget *main_nt; /*Main notebook*/ GtkWidget *show_hide_playlist; + GtkWidget *shuffle_menu_item; + GtkWidget *repeat_menu_item; GtkWidget *play_pause; GtkWidget *seekf; GtkWidget *seekb; @@ -293,6 +295,15 @@ struct ParolePlayerPrivate }; +enum +{ + SHUFFLE_TOGGLED, + REPEAT_TOGGLED, + LAST_SIGNAL +}; + +static guint signals [LAST_SIGNAL] = { 0 }; + G_DEFINE_TYPE (ParolePlayer, parole_player, G_TYPE_OBJECT) void parole_show_about (GtkWidget *widget) @@ -539,6 +550,32 @@ parole_player_media_cursor_changed_cb (ParoleMediaList *list, gboolean media_sel } static void +parole_player_media_list_shuffle_toggled_cb (ParoleMediaList *list, gboolean shuffle_toggled, ParolePlayer *player) +{ + gboolean toggled; + + toggled = gtk_check_menu_item_get_active (GTK_CHECK_MENU_ITEM(player->priv->shuffle_menu_item)); + + if (toggled != shuffle_toggled) + { + gtk_check_menu_item_set_active ( GTK_CHECK_MENU_ITEM(player->priv->shuffle_menu_item), shuffle_toggled); + } +} + +static void +parole_player_media_list_repeat_toggled_cb (ParoleMediaList *list, gboolean repeat_toggled, ParolePlayer *player) +{ + gboolean toggled; + + toggled = gtk_check_menu_item_get_active (GTK_CHECK_MENU_ITEM(player->priv->repeat_menu_item)); + + if (toggled != repeat_toggled) + { + gtk_check_menu_item_set_active ( GTK_CHECK_MENU_ITEM(player->priv->repeat_menu_item), repeat_toggled); + } +} + +static void parole_player_media_progressed_cb (ParoleGst *gst, const ParoleStream *stream, gint64 value, ParolePlayer *player) { #ifdef DEBUG @@ -1975,6 +2012,10 @@ parole_player_init (ParolePlayer *player) player->priv->play_box = GTK_WIDGET (gtk_builder_get_object (builder, "play-box")); player->priv->playlist_nt = GTK_WIDGET (gtk_builder_get_object (builder, "notebook-playlist")); player->priv->show_hide_playlist = GTK_WIDGET (gtk_builder_get_object (builder, "show-hide-list")); + + player->priv->shuffle_menu_item = GTK_WIDGET (gtk_builder_get_object (builder, "shuffle")); + player->priv->repeat_menu_item = GTK_WIDGET (gtk_builder_get_object (builder, "repeat")); + player->priv->control = GTK_WIDGET (gtk_builder_get_object (builder, "control")); player->priv->go_fs = GTK_WIDGET (gtk_builder_get_object (builder, "go_fs")); player->priv->leave_fs = GTK_WIDGET (gtk_builder_get_object (builder, "leave_fs")); @@ -2021,6 +2062,12 @@ parole_player_init (ParolePlayer *player) g_signal_connect (player->priv->list, "uri-opened", G_CALLBACK (parole_player_uri_opened_cb), player); + + g_signal_connect (player->priv->list, "repeat-toggled", + G_CALLBACK (parole_player_media_list_repeat_toggled_cb), player); + + g_signal_connect (player->priv->list, "shuffle-toggled", + G_CALLBACK (parole_player_media_list_shuffle_toggled_cb), player); /* * Load auto saved media list. @@ -2147,6 +2194,24 @@ parole_player_dbus_class_init (ParolePlayerClass *klass) dbus_g_object_type_install_info (G_TYPE_FROM_CLASS (klass), &dbus_glib_parole_player_object_info); + signals[SHUFFLE_TOGGLED] = + g_signal_new ("shuffle-toggled", + PAROLE_TYPE_PLAYER, + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (ParolePlayerClass, shuffle_toggled), + NULL, NULL, + g_cclosure_marshal_VOID__BOOLEAN, + G_TYPE_NONE, 1, G_TYPE_BOOLEAN); + + signals[REPEAT_TOGGLED] = + g_signal_new ("repeat-toggled", + PAROLE_TYPE_PLAYER, + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (ParolePlayerClass, repeat_toggled), + NULL, NULL, + g_cclosure_marshal_VOID__BOOLEAN, + G_TYPE_NONE, 1, G_TYPE_BOOLEAN); + } static void diff --git a/src/parole-player.h b/src/parole-player.h index 8817852..64ba339 100644 --- a/src/parole-player.h +++ b/src/parole-player.h @@ -43,6 +43,13 @@ typedef struct { GObjectClass parent_class; + void (*shuffle_toggled) (ParolePlayer *list, + gboolean shuffle_toggled); + + void (*repeat_toggled) (ParolePlayer *list, + gboolean repeat_toggled); + + } ParolePlayerClass; GType parole_player_get_type (void) G_GNUC_CONST; _______________________________________________ Xfce4-commits mailing list Xfce4-commits@xfce.org https://mail.xfce.org/mailman/listinfo/xfce4-commits