1
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
3
* Copyright (C) 2005 Jonathan Matthew <jonathan@kaolin.hn.org>
5
* This program is free software; you can redistribute it and/or modify
6
* it under the terms of the GNU General Public License as published by
7
* the Free Software Foundation; either version 2 of the License, or
8
* (at your option) any later version.
10
* This program is distributed in the hope that it will be useful,
11
* but WITHOUT ANY WARRANTY; without even the implied warranty of
12
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
* GNU General Public License for more details.
15
* You should have received a copy of the GNU General Public License
16
* along with this program; if not, write to the Free Software
17
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
23
#include <libgnome/gnome-i18n.h>
24
#include <libgnomevfs/gnome-vfs-uri.h>
25
#include <libxml/tree.h>
27
#include "rb-play-queue-source.h"
28
#include "rb-song-info.h"
32
static GObject *rb_play_queue_source_constructor (GType type, guint n_construct_properties,
33
GObjectConstructParam *construct_properties);
34
static void rb_play_queue_source_get_property (GObject *object,
38
static void rb_play_queue_source_track_info_cell_data_func (GtkTreeViewColumn *column,
39
GtkCellRenderer *renderer,
40
GtkTreeModel *tree_model,
42
RBPlaylistSource *source);
43
static void rb_play_queue_sync_playing_state (GObject *entry_view,
45
RBPlayQueueSource *source);
46
static void rb_play_queue_source_row_inserted_cb (GtkTreeModel *model,
49
RBPlayQueueSource *source);
50
static void rb_play_queue_source_row_deleted_cb (GtkTreeModel *model,
52
RBPlayQueueSource *source);
53
static void rb_play_queue_source_update_count (RBPlayQueueSource *source,
56
static void impl_show_entry_view_popup (RBPlaylistSource *source,
59
#define PLAY_QUEUE_SOURCE_SONGS_POPUP_PATH "/QueuePlaylistViewPopup"
60
#define PLAY_QUEUE_SOURCE_SIDEBAR_POPUP_PATH "/QueueSidebarViewPopup"
62
typedef struct _RBPlayQueueSourcePrivate RBPlayQueueSourcePrivate;
64
struct _RBPlayQueueSourcePrivate
75
G_DEFINE_TYPE (RBPlayQueueSource, rb_play_queue_source, RB_TYPE_STATIC_PLAYLIST_SOURCE)
76
#define RB_PLAY_QUEUE_SOURCE_GET_PRIVATE(object) (G_TYPE_INSTANCE_GET_PRIVATE ((object), RB_TYPE_PLAY_QUEUE_SOURCE, RBPlayQueueSourcePrivate))
79
rb_play_queue_source_class_init (RBPlayQueueSourceClass *klass)
81
GObjectClass *object_class = G_OBJECT_CLASS (klass);
82
RBSourceClass *source_class = RB_SOURCE_CLASS (klass);
83
RBPlaylistSourceClass *playlist_class = RB_PLAYLIST_SOURCE_CLASS (klass);
85
object_class->constructor = rb_play_queue_source_constructor;
86
object_class->get_property = rb_play_queue_source_get_property;
88
source_class->impl_can_add_to_queue = (RBSourceFeatureFunc) rb_false_function;
89
source_class->impl_can_rename = (RBSourceFeatureFunc) rb_false_function;
91
playlist_class->impl_show_entry_view_popup = impl_show_entry_view_popup;
93
g_object_class_install_property (object_class,
95
g_param_spec_object ("sidebar",
97
"queue sidebar entry view",
101
g_type_class_add_private (klass, sizeof (RBPlayQueueSourcePrivate));
105
rb_play_queue_source_init (RBPlayQueueSource *source)
110
rb_play_queue_source_constructor (GType type, guint n_construct_properties,
111
GObjectConstructParam *construct_properties)
113
GObjectClass *parent_class = G_OBJECT_CLASS (rb_play_queue_source_parent_class);
114
RBPlayQueueSource *source = RB_PLAY_QUEUE_SOURCE (
115
parent_class->constructor (type, n_construct_properties, construct_properties));
116
RBPlayQueueSourcePrivate *priv = RB_PLAY_QUEUE_SOURCE_GET_PRIVATE (source);
117
GObject *shell_player;
119
RhythmDB *db = rb_playlist_source_get_db (RB_PLAYLIST_SOURCE (source));
120
GtkTreeViewColumn *column;
121
GtkCellRenderer *renderer;
122
RhythmDBQueryModel *model;
124
g_object_get (G_OBJECT (source), "shell", &shell, NULL);
125
shell_player = rb_shell_get_player (shell);
126
g_object_unref (G_OBJECT (shell));
128
priv->sidebar = rb_entry_view_new (db, shell_player, NULL, TRUE, TRUE);
130
g_object_set (G_OBJECT (priv->sidebar), "vscrollbar-policy", GTK_POLICY_AUTOMATIC, NULL);
132
column = gtk_tree_view_column_new ();
133
renderer = gtk_cell_renderer_text_new ();
134
gtk_tree_view_column_pack_start (column, renderer, TRUE);
135
gtk_tree_view_column_set_sizing (column, GTK_TREE_VIEW_COLUMN_FIXED);
136
gtk_tree_view_column_set_expand (column, TRUE);
137
gtk_tree_view_column_set_clickable (column, TRUE);
138
gtk_tree_view_column_set_cell_data_func (column, renderer,
139
(GtkTreeCellDataFunc)
140
rb_play_queue_source_track_info_cell_data_func,
142
rb_entry_view_append_column_custom (priv->sidebar, column,
143
_("Queued songs"), "Title", NULL, NULL);
144
rb_entry_view_set_columns_clickable (priv->sidebar, FALSE);
145
rb_playlist_source_setup_entry_view (RB_PLAYLIST_SOURCE (source), priv->sidebar);
147
model = rb_playlist_source_get_query_model (RB_PLAYLIST_SOURCE (source));
148
rb_entry_view_set_model (priv->sidebar, model);
150
/* sync the state of the main entry view and the sidebar */
151
g_signal_connect_object (G_OBJECT (rb_source_get_entry_view (RB_SOURCE (source))),
152
"notify::playing-state",
153
G_CALLBACK (rb_play_queue_sync_playing_state),
156
/* update the queued song count when the query model changes */
157
g_signal_connect_object (G_OBJECT (model), "row-inserted",
158
G_CALLBACK (rb_play_queue_source_row_inserted_cb),
160
g_signal_connect_object (G_OBJECT (model), "row-deleted",
161
G_CALLBACK (rb_play_queue_source_row_deleted_cb),
164
rb_play_queue_source_update_count (source, GTK_TREE_MODEL (model), 0);
166
return G_OBJECT (source);
170
rb_play_queue_source_get_property (GObject *object,
175
RBPlayQueueSourcePrivate *priv = RB_PLAY_QUEUE_SOURCE_GET_PRIVATE (object);
180
g_value_set_object (value, priv->sidebar);
183
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
189
rb_play_queue_source_new (RBShell *shell)
191
return RB_SOURCE (g_object_new (RB_TYPE_PLAY_QUEUE_SOURCE,
192
"name", _("Queued songs"),
199
rb_play_queue_source_sidebar_song_info (RBPlayQueueSource *source)
201
RBPlayQueueSourcePrivate *priv = RB_PLAY_QUEUE_SOURCE_GET_PRIVATE (source);
202
GtkWidget *song_info = NULL;
204
g_return_if_fail (priv->sidebar != NULL);
206
song_info = rb_song_info_new (RB_SOURCE (source), priv->sidebar);
208
gtk_widget_show_all (song_info);
210
rb_debug ("failed to create dialog, or no selection!");
214
rb_play_queue_source_sidebar_delete (RBPlayQueueSource *source)
216
RBPlayQueueSourcePrivate *priv = RB_PLAY_QUEUE_SOURCE_GET_PRIVATE (source);
217
RBEntryView *sidebar = priv->sidebar;
220
sel = rb_entry_view_get_selected_entries (sidebar);
221
for (tem = sel; tem != NULL; tem = tem->next)
222
rb_static_playlist_source_remove_entry (RB_STATIC_PLAYLIST_SOURCE (source),
223
(RhythmDBEntry *) tem->data);
228
impl_show_entry_view_popup (RBPlaylistSource *source, RBEntryView *view)
230
RBPlayQueueSourcePrivate *priv = RB_PLAY_QUEUE_SOURCE_GET_PRIVATE (source);
231
const char *popup = PLAY_QUEUE_SOURCE_SONGS_POPUP_PATH;
232
if (view == priv->sidebar)
233
popup = PLAY_QUEUE_SOURCE_SIDEBAR_POPUP_PATH;
234
_rb_source_show_popup (RB_SOURCE (source), popup);
238
rb_play_queue_source_track_info_cell_data_func (GtkTreeViewColumn *column,
239
GtkCellRenderer *renderer,
240
GtkTreeModel *tree_model,
242
RBPlaylistSource *source)
244
RhythmDBEntry *entry;
245
gtk_tree_model_get (tree_model, iter, 0, &entry, -1);
251
title = rhythmdb_entry_get_string (entry, RHYTHMDB_PROP_TITLE);
252
artist = rhythmdb_entry_get_string (entry, RHYTHMDB_PROP_ARTIST);
253
album = rhythmdb_entry_get_string (entry, RHYTHMDB_PROP_ALBUM);
255
/* Translators: format is "<title> from <album> by <artist>" */
256
markup = g_markup_printf_escaped("%s\n<span size=\"smaller\">%s <u>%s</u>\n%s <u>%s</u></span>",
257
title, _("from"), album, _("by"), artist);
259
g_object_set (G_OBJECT (renderer), "markup", markup, NULL);
264
rb_play_queue_sync_playing_state (GObject *entry_view,
266
RBPlayQueueSource *source)
269
RBPlayQueueSourcePrivate *priv = RB_PLAY_QUEUE_SOURCE_GET_PRIVATE (source);
270
g_object_get (entry_view, "playing-state", &state, NULL);
271
rb_entry_view_set_state (priv->sidebar, state);
275
rb_play_queue_source_row_inserted_cb (GtkTreeModel *model,
278
RBPlayQueueSource *source)
280
rb_play_queue_source_update_count (source, model, 0);
284
rb_play_queue_source_row_deleted_cb (GtkTreeModel *model,
286
RBPlayQueueSource *source)
288
rb_play_queue_source_update_count (source, model, -1);
292
rb_play_queue_source_update_count (RBPlayQueueSource *source,
296
gint count = gtk_tree_model_iter_n_children (model, NULL) + offset;
297
char *name = _("Queued songs");
300
name = g_strdup_printf ("%s (%d)", name, count);
302
g_object_set (G_OBJECT (source), "name", name, NULL);