Updating branch refs/heads/master to 8a15515bb7be36c752f1abd6983f376eaf5aa061 (commit) from 8d242dff6526f754b2df90793335002b929319fb (commit)
commit 8a15515bb7be36c752f1abd6983f376eaf5aa061 Author: Sean Davis <smd.seanda...@gmail.com> Date: Fri Jul 27 15:27:45 2012 -0400 Added playlist preferences button, and small fixes and tweaks for playlist. data/interfaces/playlist.ui | 99 +++++++++++++++ src/parole-medialist.c | 281 ++++++++++++++++++++++++++----------------- 2 files changed, 267 insertions(+), 113 deletions(-) diff --git a/data/interfaces/playlist.ui b/data/interfaces/playlist.ui index dbd09ab..8b9c409 100644 --- a/data/interfaces/playlist.ui +++ b/data/interfaces/playlist.ui @@ -23,6 +23,11 @@ <property name="pixel_size">20</property> <property name="icon_name">media-playlist-repeat</property> </object> + <object class="GtkImage" id="image_settings"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="stock">gtk-properties</property> + </object> <object class="GtkImage" id="image_shuffle"> <property name="visible">True</property> <property name="can_focus">False</property> @@ -83,6 +88,7 @@ <property name="receives_default">True</property> <property name="use_action_appearance">False</property> <property name="image">image_add</property> + <property name="focus_on_click">False</property> <signal name="clicked" handler="parole_media_list_add_clicked_cb" swapped="no"/> </object> <packing> @@ -94,10 +100,12 @@ <child> <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">image_remove</property> + <property name="focus_on_click">False</property> <signal name="clicked" handler="parole_media_list_remove_clicked_cb" swapped="no"/> </object> <packing> @@ -109,10 +117,12 @@ <child> <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">image_clear</property> + <property name="focus_on_click">False</property> <signal name="clicked" handler="parole_media_list_clear_clicked_cb" swapped="no"/> </object> <packing> @@ -128,6 +138,7 @@ <property name="receives_default">True</property> <property name="use_action_appearance">False</property> <property name="image">image_repeat</property> + <property name="focus_on_click">False</property> <signal name="toggled" handler="parole_media_list_repeat_toggled_cb" swapped="no"/> </object> <packing> @@ -143,6 +154,7 @@ <property name="receives_default">True</property> <property name="use_action_appearance">False</property> <property name="image">image_shuffle</property> + <property name="focus_on_click">False</property> <signal name="toggled" handler="parole_media_list_shuffle_toggled_cb" swapped="no"/> </object> <packing> @@ -151,6 +163,21 @@ <property name="position">4</property> </packing> </child> + <child> + <object class="GtkToggleButton" id="settings"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="use_action_appearance">False</property> + <property name="image">image_settings</property> + <property name="focus_on_click">False</property> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">5</property> + </packing> + </child> </object> <packing> <property name="expand">False</property> @@ -169,4 +196,76 @@ </packing> </child> </object> + <object class="GtkMenu" id="playlist-menu"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkCheckMenuItem" id="menu-repeat"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="use_action_appearance">False</property> + <property name="label" translatable="yes">Repeat</property> + <property name="use_underline">True</property> + </object> + </child> + <child> + <object class="GtkCheckMenuItem" id="menu-shuffle"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="use_action_appearance">False</property> + <property name="label" translatable="yes">Shuffle</property> + <property name="use_underline">True</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="menuitem1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="use_action_appearance">False</property> + </object> + </child> + <child> + <object class="GtkCheckMenuItem" id="menu-replace"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="use_action_appearance">False</property> + <property name="label" translatable="yes">Replace playlist when opening files</property> + <property name="use_underline">True</property> + </object> + </child> + <child> + <object class="GtkCheckMenuItem" id="menu-play-opened"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="use_action_appearance">False</property> + <property name="label" translatable="yes">Play opened files</property> + <property name="use_underline">True</property> + </object> + </child> + <child> + <object class="GtkCheckMenuItem" id="menu-remember"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="use_action_appearance">False</property> + <property name="label" translatable="yes">Remember playlist</property> + <property name="use_underline">True</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="menuitem2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="use_action_appearance">False</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="menu-clear"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="use_action_appearance">False</property> + <property name="label" translatable="yes">Clear</property> + <property name="use_underline">True</property> + </object> + </child> + </object> </interface> diff --git a/src/parole-medialist.c b/src/parole-medialist.c index f9997f0..95ec2ba 100644 --- a/src/parole-medialist.c +++ b/src/parole-medialist.c @@ -168,11 +168,12 @@ struct ParoleMediaListPrivate GtkWidget *box; GtkListStore *store; GtkTreeSelection *sel; - - GtkWidget *remove; - GtkWidget *clear; - GtkWidget *shuffle; - GtkWidget *repeat; + + GtkWidget *remove_button; + GtkWidget *clear_button; + GtkWidget *repeat_button; + GtkWidget *shuffle_button; + GtkWidget *settings_button; }; enum @@ -192,8 +193,8 @@ G_DEFINE_TYPE (ParoleMediaList, parole_media_list, GTK_TYPE_VBOX) static void parole_media_list_set_widget_sensitive (ParoleMediaList *list, gboolean sensitive) { - gtk_widget_set_sensitive (GTK_WIDGET (list->priv->remove), sensitive); - gtk_widget_set_sensitive (GTK_WIDGET (list->priv->clear), sensitive); + gtk_widget_set_sensitive (GTK_WIDGET (list->priv->remove_button), sensitive); + gtk_widget_set_sensitive (GTK_WIDGET (list->priv->clear_button), sensitive); } /** @@ -250,8 +251,8 @@ parole_media_list_add (ParoleMediaList *list, ParoleFile *file, gboolean emit, g if ( nch == 1 ) { - gtk_widget_set_sensitive (list->priv->remove, TRUE); - gtk_widget_set_sensitive (list->priv->clear, TRUE); + gtk_widget_set_sensitive (list->priv->remove_button, TRUE); + gtk_widget_set_sensitive (list->priv->clear_button, TRUE); } else parole_media_list_set_widget_sensitive (list, TRUE); @@ -1139,16 +1140,15 @@ static void replace_list_activated_cb (GtkWidget *mi, ParoleConf *conf) { g_object_set (G_OBJECT (conf), - "replace-playlist", gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (mi)), + "replace-playlist", gtk_check_menu_item_get_active (GTK_CHECK_MENU_ITEM (mi)), NULL); - } static void play_opened_files_activated_cb (GtkWidget *mi, ParoleConf *conf) { g_object_set (G_OBJECT (conf), - "play-opened-files", gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (mi)), + "play-opened-files", gtk_check_menu_item_get_active (GTK_CHECK_MENU_ITEM (mi)), NULL); } @@ -1162,19 +1162,41 @@ remember_playlist_activated_cb (GtkWidget *mi, ParoleConf *conf) } static void -repeat_activated_cb (GtkWidget *mi, ParoleConf *conf) +repeat_activated_cb (GtkWidget *mi, ParoleMediaList *list) { - g_object_set (G_OBJECT (conf), - "repeat", gtk_check_menu_item_get_active (GTK_CHECK_MENU_ITEM (mi)), - NULL); + gboolean active = gtk_check_menu_item_get_active( GTK_CHECK_MENU_ITEM( mi ) ); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON( list->priv->repeat_button ), active); } static void -shuffle_activated_cb (GtkWidget *mi, ParoleConf *conf) +shuffle_activated_cb (GtkWidget *mi, ParoleMediaList *list) { - g_object_set (G_OBJECT (conf), - "shuffle", gtk_check_menu_item_get_active (GTK_CHECK_MENU_ITEM (mi)), - NULL); + gboolean active = gtk_check_menu_item_get_active( GTK_CHECK_MENU_ITEM( mi ) ); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON( list->priv->shuffle_button ), active); +} + +void +parole_media_list_menu_pos (GtkMenu *menu, gint *px, gint *py, gpointer data) +{ + gint x, y; + GtkAllocation widget_allocation, menu_allocation; + GtkWidget *widget = gtk_menu_get_attach_widget( menu ); + + gtk_widget_get_allocation( widget, &widget_allocation ); + gtk_widget_get_allocation( GTK_WIDGET(menu), &menu_allocation ); + + //g_print("h = %i", requisition.height); + GdkWindow *window = gtk_widget_get_window( widget ); + gdk_window_get_position( window, &x, &y ); + + px += x + widget_allocation.x - menu_allocation.width + widget_allocation.width; + py += y + widget_allocation.y + widget_allocation.height; +} + +static void +parole_media_list_hide_menu (GtkWidget *widget) +{ + gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( widget ), FALSE ); } static void @@ -1193,122 +1215,147 @@ parole_media_list_destroy_menu (GtkWidget *menu) } static void -parole_media_list_show_menu (ParoleMediaList *list, GdkEventButton *ev) +menu_detach( GtkMenu *menu ) { - GtkWidget *menu, *mi; - gboolean val; - guint button = ev->button; - guint activate_time = ev->time; + //gtk_menu_detach (menu); +} - menu = gtk_menu_new (); +static void +parole_media_list_show_button_menu (GtkToggleButton *button, ParoleMediaList *list) +{ + gboolean toggled = gtk_toggle_button_get_active( button ); + if (!toggled) + return; - parole_media_list_add_open_containing_folder (list, menu, (gint)ev->x, (gint)ev->y); + gboolean val; + GtkBuilder *builder; + + builder = parole_builder_new_from_string (playlist_ui, playlist_ui_length); + + GtkMenu *menu = GTK_MENU (gtk_builder_get_object (builder, "playlist-menu")); + GtkCheckMenuItem *repeat_menu = GTK_CHECK_MENU_ITEM (gtk_builder_get_object (builder, "menu-repeat")); + GtkCheckMenuItem *shuffle_menu = GTK_CHECK_MENU_ITEM (gtk_builder_get_object (builder, "menu-shuffle")); + GtkCheckMenuItem *replace = GTK_CHECK_MENU_ITEM (gtk_builder_get_object (builder, "menu-replace")); + GtkCheckMenuItem *play_opened = GTK_CHECK_MENU_ITEM (gtk_builder_get_object (builder, "menu-play-opened")); + GtkCheckMenuItem *remember = GTK_CHECK_MENU_ITEM (gtk_builder_get_object (builder, "menu-remember")); + GtkMenuItem *clear = GTK_MENU_ITEM (gtk_builder_get_object (builder, "menu-clear")); + + gtk_menu_attach_to_widget( GTK_MENU(menu), list->priv->settings_button, (GtkMenuDetachFunc) menu_detach ); - /** - * Repeat playing. - **/ g_object_get (G_OBJECT (list->priv->conf), "repeat", &val, NULL); + gtk_check_menu_item_set_active (repeat_menu, val); + g_signal_connect (repeat_menu, "activate", + G_CALLBACK (repeat_activated_cb), list); - mi = gtk_check_menu_item_new_with_label (_("Repeat")); - gtk_widget_set_sensitive (mi, TRUE); - gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (mi), val); - g_signal_connect (mi, "activate", - G_CALLBACK (repeat_activated_cb), list->priv->conf); - - gtk_menu_shell_append (GTK_MENU_SHELL (menu), mi); - gtk_widget_show (mi); - - /** - * Shuffle playing. - **/ g_object_get (G_OBJECT (list->priv->conf), "shuffle", &val, NULL); - mi = gtk_check_menu_item_new_with_label (_("Shuffle")); - gtk_widget_set_sensitive (mi, TRUE); - gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (mi), val); - g_signal_connect (mi, "activate", - G_CALLBACK (shuffle_activated_cb), list->priv->conf); + gtk_check_menu_item_set_active (shuffle_menu, val); + g_signal_connect (shuffle_menu, "activate", + G_CALLBACK (shuffle_activated_cb), list); - gtk_menu_shell_append (GTK_MENU_SHELL (menu), mi); - gtk_widget_show (mi); - - /** - * Separator - **/ - mi = gtk_separator_menu_item_new (); - gtk_widget_show (mi); - gtk_menu_shell_append (GTK_MENU_SHELL (menu), mi); - - /** - * replace playlist - **/ g_object_get (G_OBJECT (list->priv->conf), "replace-playlist", &val, NULL); - mi = gtk_check_menu_item_new_with_label (_("Replace playlist when opening files")); - gtk_widget_set_sensitive (mi, TRUE); - gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (mi), val); - g_signal_connect (mi, "activate", + gtk_check_menu_item_set_active (replace, val); + g_signal_connect (replace, "activate", G_CALLBACK (replace_list_activated_cb), list->priv->conf); - gtk_menu_shell_append (GTK_MENU_SHELL (menu), mi); - gtk_widget_show (mi); - - /** - * Play when files are open. - **/ - g_object_get (G_OBJECT (list->priv->conf), "play-opened-files", &val, NULL); - mi = gtk_check_menu_item_new_with_label (_("Play opened files")); - gtk_widget_set_sensitive (mi, TRUE); - gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (mi), val); - g_signal_connect (mi, "activate", + gtk_check_menu_item_set_active (play_opened, val); + g_signal_connect (play_opened, "activate", G_CALLBACK (play_opened_files_activated_cb), list->priv->conf); - - gtk_menu_shell_append (GTK_MENU_SHELL (menu), mi); - gtk_widget_show (mi); - - /** - * Remember media list entries - **/ + g_object_get (G_OBJECT (list->priv->conf), "remember-playlist", &val, NULL); - mi = gtk_check_menu_item_new_with_label (_("Remember playlist")); - gtk_widget_set_sensitive (mi, TRUE); - gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (mi), val); - g_signal_connect (mi, "activate", + gtk_check_menu_item_set_active (remember, val); + g_signal_connect (remember, "activate", G_CALLBACK (remember_playlist_activated_cb), list->priv->conf); - - gtk_menu_shell_append (GTK_MENU_SHELL (menu), mi); + + g_signal_connect_swapped (clear, "activate", + G_CALLBACK (parole_media_list_clear_list), list); + + g_signal_connect_swapped (menu, "selection-done", + G_CALLBACK (parole_media_list_destroy_menu), menu); + + g_signal_connect_swapped (menu, "destroy", + G_CALLBACK (parole_media_list_hide_menu), list->priv->settings_button); - gtk_widget_show (mi); + gtk_menu_popup (GTK_MENU (menu), + NULL, NULL, + (GtkMenuPositionFunc) parole_media_list_menu_pos, NULL, + 3, gtk_get_current_event_time ()); +} + +static void +parole_media_list_show_menu (ParoleMediaList *list, GdkEventButton *ev) +{ + gboolean val; + guint button = ev->button; + guint activate_time = ev->time; - /** - * Separator - **/ - mi = gtk_separator_menu_item_new (); - gtk_widget_show (mi); - gtk_menu_shell_append (GTK_MENU_SHELL (menu), mi); + GtkBuilder *builder; + builder = parole_builder_new_from_string (playlist_ui, playlist_ui_length); - /* Clear */ - mi = gtk_image_menu_item_new_from_stock (GTK_STOCK_CLEAR, NULL); - gtk_widget_set_sensitive (mi, TRUE); - gtk_widget_show (mi); - g_signal_connect_swapped (mi, "activate", - G_CALLBACK (parole_media_list_clear_list), list); - - gtk_menu_shell_append (GTK_MENU_SHELL (menu), mi); + GtkMenu *menu = GTK_MENU (gtk_builder_get_object (builder, "playlist-menu")); + GtkCheckMenuItem *repeat_menu = GTK_CHECK_MENU_ITEM (gtk_builder_get_object (builder, "menu-repeat")); + GtkCheckMenuItem *shuffle_menu = GTK_CHECK_MENU_ITEM (gtk_builder_get_object (builder, "menu-shuffle")); + GtkCheckMenuItem *replace = GTK_CHECK_MENU_ITEM (gtk_builder_get_object (builder, "menu-replace")); + GtkCheckMenuItem *play_opened = GTK_CHECK_MENU_ITEM (gtk_builder_get_object (builder, "menu-play-opened")); + GtkCheckMenuItem *remember = GTK_CHECK_MENU_ITEM (gtk_builder_get_object (builder, "menu-remember")); + GtkMenuItem *clear = GTK_MENU_ITEM (gtk_builder_get_object (builder, "menu-clear")); + parole_media_list_add_open_containing_folder (list, GTK_WIDGET(menu), (gint)ev->x, (gint)ev->y); + + g_object_get (G_OBJECT (list->priv->conf), + "repeat", &val, + NULL); + gtk_check_menu_item_set_active (repeat_menu, val); + g_signal_connect (repeat_menu, "activate", + G_CALLBACK (repeat_activated_cb), list); + + g_object_get (G_OBJECT (list->priv->conf), + "shuffle", &val, + NULL); + + gtk_check_menu_item_set_active (shuffle_menu, val); + g_signal_connect (shuffle_menu, "activate", + G_CALLBACK (shuffle_activated_cb), list); + + g_object_get (G_OBJECT (list->priv->conf), + "replace-playlist", &val, + NULL); + + gtk_check_menu_item_set_active (replace, val); + g_signal_connect (replace, "activate", + G_CALLBACK (replace_list_activated_cb), list->priv->conf); + + g_object_get (G_OBJECT (list->priv->conf), + "play-opened-files", &val, + NULL); + gtk_check_menu_item_set_active (play_opened, val); + g_signal_connect (play_opened, "activate", + G_CALLBACK (play_opened_files_activated_cb), list->priv->conf); + + g_object_get (G_OBJECT (list->priv->conf), + "remember-playlist", &val, + NULL); + gtk_check_menu_item_set_active (remember, val); + g_signal_connect (remember, "activate", + G_CALLBACK (remember_playlist_activated_cb), list->priv->conf); + + g_signal_connect_swapped (clear, "activate", + G_CALLBACK (parole_media_list_clear_list), list); + g_signal_connect_swapped (menu, "selection-done", G_CALLBACK (parole_media_list_destroy_menu), menu); @@ -1502,14 +1549,18 @@ parole_media_list_init (ParoleMediaList *list) parole_media_list_setup_view (list); - gtk_builder_connect_signals (builder, list); - gtk_box_pack_start (GTK_BOX (list), box, TRUE, TRUE, 0); + + list->priv->remove_button = GTK_WIDGET (gtk_builder_get_object (builder, "remove-media")); + list->priv->clear_button = GTK_WIDGET (gtk_builder_get_object (builder, "clear-media")); + list->priv->repeat_button = GTK_WIDGET (gtk_builder_get_object (builder, "repeat-media")); + list->priv->shuffle_button = GTK_WIDGET (gtk_builder_get_object (builder, "shuffle-media")); + list->priv->settings_button = GTK_WIDGET (gtk_builder_get_object (builder, "settings")); + + g_signal_connect (GTK_TOGGLE_BUTTON(list->priv->settings_button), "toggled", + G_CALLBACK (parole_media_list_show_button_menu), list); - list->priv->remove = GTK_WIDGET (gtk_builder_get_object (builder, "remove-media")); - list->priv->clear = GTK_WIDGET (gtk_builder_get_object (builder, "clear-media")); - list->priv->repeat = GTK_WIDGET (gtk_builder_get_object (builder, "repeat-media")); - list->priv->shuffle = GTK_WIDGET (gtk_builder_get_object (builder, "shuffle-media")); + gtk_builder_connect_signals (builder, list); g_object_unref (builder); @@ -1910,10 +1961,12 @@ parole_media_list_set_repeat_toggled (ParoleMediaList *list, { gboolean toggled; - toggled = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (list->priv->repeat)); + toggled = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (list->priv->repeat_button)); if (toggled != repeat_toggled) - gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON (list->priv->repeat), repeat_toggled ); + { + gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON (list->priv->repeat_button), repeat_toggled ); + } } void @@ -1922,8 +1975,10 @@ parole_media_list_set_shuffle_toggled (ParoleMediaList *list, { gboolean toggled; - toggled = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (list->priv->shuffle)); + toggled = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (list->priv->shuffle_button)); if (toggled != shuffle_toggled) - gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON (list->priv->shuffle), shuffle_toggled ); + { + gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON (list->priv->shuffle_button), shuffle_toggled ); + } } _______________________________________________ Xfce4-commits mailing list Xfce4-commits@xfce.org https://mail.xfce.org/mailman/listinfo/xfce4-commits