[rhythmbox] audioscrobbler: add popup menu item to refresh profile source
- From: Jonathan Matthew <jmatthew src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [rhythmbox] audioscrobbler: add popup menu item to refresh profile source
- Date: Tue, 21 Sep 2010 10:53:52 +0000 (UTC)
commit 6e25b619506aa5570e8cd2aee0921b36e3cb0c0d
Author: Jamie Nicol <jamie thenicols net>
Date: Sat Jul 31 16:46:17 2010 +0100
audioscrobbler: add popup menu item to refresh profile source
.../audioscrobbler/audioscrobbler-profile-ui.xml | 5 +
.../rb-audioscrobbler-profile-source.c | 79 ++++++++++++++++----
.../rb-audioscrobbler-radio-source.c | 17 ++---
3 files changed, 76 insertions(+), 25 deletions(-)
---
diff --git a/plugins/audioscrobbler/audioscrobbler-profile-ui.xml b/plugins/audioscrobbler/audioscrobbler-profile-ui.xml
new file mode 100644
index 0000000..88db524
--- /dev/null
+++ b/plugins/audioscrobbler/audioscrobbler-profile-ui.xml
@@ -0,0 +1,5 @@
+<ui>
+ <popup name="AudioscrobblerProfileSourcePopup">
+ <menuitem name="Refresh" action="AudioscrobblerProfileRefresh"/>
+ </popup>
+</ui>
diff --git a/plugins/audioscrobbler/rb-audioscrobbler-profile-source.c b/plugins/audioscrobbler/rb-audioscrobbler-profile-source.c
index a34216c..0edb749 100644
--- a/plugins/audioscrobbler/rb-audioscrobbler-profile-source.c
+++ b/plugins/audioscrobbler/rb-audioscrobbler-profile-source.c
@@ -46,6 +46,7 @@
#include "rb-util.h"
#define CONF_AUDIOSCROBBLER_ENABLE_SCROBBLING CONF_PLUGINS_PREFIX "/audioscrobbler/%s/scrobbling_enabled"
+#define AUDIOSCROBBLER_PROFILE_SOURCE_POPUP_PATH "/AudioscrobblerProfileSourcePopup"
#define LIST_ITEM_IMAGE_SIZE 34
struct _RBAudioscrobblerProfileSourcePrivate {
@@ -103,7 +104,9 @@ struct _RBAudioscrobblerProfileSourcePrivate {
GHashTable *button_to_popup_menu_map;
GHashTable *popup_menu_to_data_map;
- GtkActionGroup *action_group;
+ guint ui_merge_id;
+ GtkActionGroup *profile_action_group;
+ GtkActionGroup *service_action_group;
char *love_action_name;
char *ban_action_name;
};
@@ -163,6 +166,7 @@ static void playing_song_changed_cb (RBShellPlayer *player,
/* GtkAction callbacks */
static void love_track_action_cb (GtkAction *action, RBAudioscrobblerProfileSource *source);
static void ban_track_action_cb (GtkAction *action, RBAudioscrobblerProfileSource *source);
+static void refresh_profile_action_cb (GtkAction *action, RBAudioscrobblerProfileSource *source);
/* radio station creation/deletion */
void station_creator_button_clicked_cb (GtkButton *button, RBAudioscrobblerProfileSource *source);
@@ -219,6 +223,7 @@ static void list_item_listen_top_fans_activated_cb (GtkMenuItem *menuitem,
/* RBSource implementations */
static GList *impl_get_ui_actions (RBSource *asource);
+static gboolean impl_show_popup (RBSource *asource);
static void impl_delete_thyself (RBSource *asource);
enum {
@@ -226,6 +231,14 @@ enum {
PROP_SERVICE
};
+static GtkActionEntry profile_actions [] =
+{
+ { "AudioscrobblerProfileRefresh", NULL, N_("Refresh Profile"), NULL,
+ N_("Refresh your Profile"),
+ G_CALLBACK (refresh_profile_action_cb) }
+};
+
+
G_DEFINE_TYPE (RBAudioscrobblerProfileSource, rb_audioscrobbler_profile_source, RB_TYPE_SOURCE)
RBSource *
@@ -282,6 +295,7 @@ rb_audioscrobbler_profile_source_class_init (RBAudioscrobblerProfileSourceClass
source_class = RB_SOURCE_CLASS (klass);
source_class->impl_get_ui_actions = impl_get_ui_actions;
+ source_class->impl_show_popup = impl_show_popup;
source_class->impl_delete_thyself = impl_delete_thyself;
g_object_class_install_property (object_class,
@@ -561,33 +575,54 @@ init_profile_ui (RBAudioscrobblerProfileSource *source)
static void
init_actions (RBAudioscrobblerProfileSource *source)
{
+ char *ui_file;
+ RBShell *shell;
+ RBPlugin *plugin;
+ GtkUIManager *ui_manager;
+ char *group_name;
+
+ g_object_get (source, "shell", &shell, "plugin", &plugin, "ui-manager", &ui_manager, NULL);
+ ui_file = rb_plugin_find_file (plugin, "audioscrobbler-profile-ui.xml");
+ source->priv->ui_merge_id = gtk_ui_manager_add_ui_from_file (ui_manager, ui_file, NULL);
+
+ g_object_unref (plugin);
+ g_object_unref (ui_manager);
+
+ source->priv->profile_action_group = _rb_source_register_action_group (RB_SOURCE (source),
+ "AudioscrobblerProfileActions",
+ NULL, 0,
+ source);
+ _rb_action_group_add_source_actions (source->priv->profile_action_group,
+ G_OBJECT (shell),
+ profile_actions,
+ G_N_ELEMENTS (profile_actions));
+
+ g_object_unref (shell);
+
/* Unfortunately we can't use the usual trick of declaring a static array of GtkActionEntry,
* and simply using _rb_source_register_action_group with that array.
* This is because each instance of this source needs its own love and ban actions
* so tracks can be loved/banned differently for different audioscrobbler services.
*/
-
- char *group_name;
-
group_name = g_strdup_printf ("%sActions", rb_audioscrobbler_service_get_name (source->priv->service));
source->priv->love_action_name = g_strdup_printf ("%sLoveTrack", rb_audioscrobbler_service_get_name (source->priv->service));
source->priv->ban_action_name = g_strdup_printf ("%sBanTrack", rb_audioscrobbler_service_get_name (source->priv->service));
- GtkActionEntry actions [] =
+ GtkActionEntry service_actions [] =
{
{ source->priv->love_action_name, "emblem-favorite", N_("Love"), NULL,
N_("Mark this song as loved"),
G_CALLBACK (love_track_action_cb) },
{ source->priv->ban_action_name, GTK_STOCK_CANCEL, N_("Ban"), NULL,
N_("Ban the current track from being played again"),
- G_CALLBACK (ban_track_action_cb) },
+ G_CALLBACK (ban_track_action_cb) }
};
- source->priv->action_group = _rb_source_register_action_group (RB_SOURCE (source),
- group_name,
- actions,
- G_N_ELEMENTS (actions),
- source);
+ source->priv->service_action_group = _rb_source_register_action_group (RB_SOURCE (source),
+ group_name,
+ service_actions,
+ G_N_ELEMENTS (service_actions),
+ source);
g_free (group_name);
}
@@ -820,10 +855,10 @@ playing_song_changed_cb (RBShellPlayer *player,
GtkAction *action;
/* re-enable love/ban */
- action = gtk_action_group_get_action (source->priv->action_group, source->priv->love_action_name);
+ action = gtk_action_group_get_action (source->priv->service_action_group, source->priv->love_action_name);
gtk_action_set_sensitive (action, TRUE);
- action = gtk_action_group_get_action (source->priv->action_group, source->priv->ban_action_name);
+ action = gtk_action_group_get_action (source->priv->service_action_group, source->priv->ban_action_name);
gtk_action_set_sensitive (action, TRUE);
}
@@ -847,7 +882,7 @@ love_track_action_cb (GtkAction *action, RBAudioscrobblerProfileSource *source)
/* disable love/ban */
gtk_action_set_sensitive (action, FALSE);
- ban_action = gtk_action_group_get_action (source->priv->action_group, source->priv->ban_action_name);
+ ban_action = gtk_action_group_get_action (source->priv->service_action_group, source->priv->ban_action_name);
gtk_action_set_sensitive (ban_action, FALSE);
g_object_unref (shell);
@@ -876,6 +911,12 @@ ban_track_action_cb (GtkAction *action, RBAudioscrobblerProfileSource *source)
g_object_unref (shell);
}
+static void
+refresh_profile_action_cb (GtkAction *action, RBAudioscrobblerProfileSource *source)
+{
+ rb_audioscrobbler_user_update (source->priv->user);
+}
+
void
station_creator_button_clicked_cb (GtkButton *button,
RBAudioscrobblerProfileSource *source)
@@ -1629,6 +1670,13 @@ impl_get_ui_actions (RBSource *asource)
return actions;
}
+static gboolean
+impl_show_popup (RBSource *asource)
+{
+ _rb_source_show_popup (asource, AUDIOSCROBBLER_PROFILE_SOURCE_POPUP_PATH);
+ return TRUE;
+}
+
static void
impl_delete_thyself (RBSource *asource)
{
@@ -1645,7 +1693,8 @@ impl_delete_thyself (RBSource *asource)
}
g_object_get (source, "ui-manager", &ui_manager, NULL);
- gtk_ui_manager_remove_action_group (ui_manager, source->priv->action_group);
+ gtk_ui_manager_remove_ui (ui_manager, source->priv->ui_merge_id);
+ gtk_ui_manager_remove_action_group (ui_manager, source->priv->service_action_group);
g_object_unref (ui_manager);
}
diff --git a/plugins/audioscrobbler/rb-audioscrobbler-radio-source.c b/plugins/audioscrobbler/rb-audioscrobbler-radio-source.c
index 815d7a5..7a252c8 100644
--- a/plugins/audioscrobbler/rb-audioscrobbler-radio-source.c
+++ b/plugins/audioscrobbler/rb-audioscrobbler-radio-source.c
@@ -486,7 +486,7 @@ rb_audioscrobbler_radio_source_constructed (GObject *object)
source->priv->action_group = _rb_source_register_action_group (RB_SOURCE (source),
"AudioscrobblerRadioActions",
NULL, 0,
- shell);
+ source);
_rb_action_group_add_source_actions (source->priv->action_group,
G_OBJECT (shell),
rb_audioscrobbler_radio_source_actions,
@@ -527,14 +527,6 @@ rb_audioscrobbler_radio_source_dispose (GObject *object)
source->priv->play_order = NULL;
}
- if (source->priv->ui_merge_id != 0) {
- GtkUIManager *ui_manager;
- g_object_get (source, "ui-manager", &ui_manager, NULL);
- gtk_ui_manager_remove_ui (ui_manager, source->priv->ui_merge_id);
- source->priv->ui_merge_id = 0;
- g_object_unref (ui_manager);
- }
-
G_OBJECT_CLASS (rb_audioscrobbler_radio_source_parent_class)->dispose (object);
}
@@ -1465,6 +1457,7 @@ impl_delete_thyself (RBSource *asource)
{
RBAudioscrobblerRadioSource *source;
RBShell *shell;
+ GtkUIManager *ui_manager;
RhythmDB *db;
GtkTreeIter iter;
gboolean loop;
@@ -1473,9 +1466,12 @@ impl_delete_thyself (RBSource *asource)
source = RB_AUDIOSCROBBLER_RADIO_SOURCE (asource);
- g_object_get (source, "shell", &shell, NULL);
+ g_object_get (source, "shell", &shell, "ui-manager", &ui_manager, NULL);
g_object_get (shell, "db", &db, NULL);
+ /* unmerge ui */
+ gtk_ui_manager_remove_ui (ui_manager, source->priv->ui_merge_id);
+
/* Ensure playing entry isn't deleted twice */
source->priv->playing_entry = NULL;
@@ -1494,5 +1490,6 @@ impl_delete_thyself (RBSource *asource)
rhythmdb_commit (db);
g_object_unref (shell);
+ g_object_unref (ui_manager);
g_object_unref (db);
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]