[Xfce4-commits] <parole:master> 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.

Sean Davis noreply at xfce.org
Mon Jul 23 01:24:41 CEST 2012


Updating branch refs/heads/master
         to 02fab972c3397e51fd9289313eec0d9d2d605809 (commit)
       from cdd5b9e9206c97a5324f9dc6518efa33ac14ae58 (commit)

commit 02fab972c3397e51fd9289313eec0d9d2d605809
Author: Sean Davis <smd.seandavis at 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;


More information about the Xfce4-commits mailing list