23
23
#include <config.h>
24
#include <bonobo/bonobo-ui-component.h>
25
#include <bonobo/bonobo-ui-util.h>
26
24
#include <libgnome/gnome-i18n.h>
25
#include <gtk/gtkuimanager.h>
29
#include "rb-source.h"
29
#include "rb-cut-and-paste-code.h"
30
30
#include "rb-debug.h"
31
31
#include "rb-dialog.h"
32
#include "rb-cut-and-paste-code.h"
33
#include "rb-bonobo-helpers.h"
33
#include "rb-source.h"
35
36
static void rb_source_class_init (RBSourceClass *klass);
36
37
static void rb_source_init (RBSource *source);
45
46
GParamSpec *pspec);
47
48
static const char * default_get_browser_key (RBSource *status);
48
static const char * default_get_search_key (RBSource *status);
49
49
static GList *default_get_extra_views (RBSource *source);
50
50
static gboolean default_can_rename (RBSource *source);
51
51
static gboolean default_can_search (RBSource *source);
52
52
static gboolean default_can_cut (RBSource *source);
53
static GdkPixbuf *default_get_pixbuf (RBSource *source);
53
54
static GList *default_copy (RBSource *source);
54
55
static void default_reset_filters (RBSource *source);
55
56
static void default_song_properties (RBSource *source);
56
57
static GtkWidget * default_get_config_widget (RBSource *source);
58
static gboolean default_try_playlist (RBSource *source);
57
59
static RBSourceEOFType default_handle_eos (RBSource *source);
58
static void default_buffering_done (RBSource *source);
59
static gboolean default_receive_drag (RBSource *source, GtkSelectionData *data);
60
60
static gboolean default_show_popup (RBSource *source);
61
61
static void default_delete_thyself (RBSource *source);
63
struct RBSourcePrivate
62
static void default_activate (RBSource *source);
63
static void default_deactivate (RBSource *source);
64
static gboolean default_disconnect (RBSource *source);
66
G_DEFINE_ABSTRACT_TYPE (RBSource, rb_source, GTK_TYPE_HBOX)
67
#define RB_SOURCE_GET_PRIVATE(object)(G_TYPE_INSTANCE_GET_PRIVATE ((object), RB_TYPE_SOURCE, RBSourcePrivate))
69
struct _RBSourcePrivate
68
BonoboUIComponent *component;
87
94
static guint rb_source_signals[LAST_SIGNAL] = { 0 };
89
static GObjectClass *parent_class = NULL;
92
rb_source_get_type (void)
94
static GType rb_source_type = 0;
96
if (rb_source_type == 0)
98
static const GTypeInfo our_info =
100
sizeof (RBSourceClass),
103
(GClassInitFunc) rb_source_class_init,
108
(GInstanceInitFunc) rb_source_init
111
rb_source_type = g_type_register_static (GTK_TYPE_HBOX,
113
&our_info, G_TYPE_FLAG_ABSTRACT);
116
return rb_source_type;
120
97
rb_source_class_init (RBSourceClass *klass)
122
99
GObjectClass *object_class = G_OBJECT_CLASS (klass);
124
parent_class = g_type_class_peek_parent (klass);
126
101
object_class->finalize = rb_source_finalize;
128
103
object_class->set_property = rb_source_set_property;
129
104
object_class->get_property = rb_source_get_property;
131
106
klass->impl_get_browser_key = default_get_browser_key;
132
klass->impl_get_search_key = default_get_search_key;
133
107
klass->impl_get_extra_views = default_get_extra_views;
134
108
klass->impl_can_rename = default_can_rename;
135
109
klass->impl_can_search = default_can_search;
136
110
klass->impl_can_cut = default_can_cut;
137
111
klass->impl_can_delete = default_can_cut;
138
112
klass->impl_can_copy = default_can_cut;
113
klass->impl_get_pixbuf = default_get_pixbuf;
139
114
klass->impl_copy = default_copy;
140
115
klass->impl_reset_filters = default_reset_filters;
141
116
klass->impl_song_properties = default_song_properties;
142
117
klass->impl_handle_eos = default_handle_eos;
143
klass->impl_buffering_done = default_buffering_done;
144
118
klass->impl_get_config_widget = default_get_config_widget;
145
klass->impl_receive_drag = default_receive_drag;
119
klass->impl_receive_drag = NULL;
146
120
klass->impl_show_popup = default_show_popup;
147
121
klass->impl_delete_thyself = default_delete_thyself;
122
klass->impl_activate = default_activate;
123
klass->impl_deactivate = default_deactivate;
124
klass->impl_disconnect = default_disconnect;
125
klass->impl_try_playlist = default_try_playlist;
149
127
g_object_class_install_property (object_class,
153
131
"Interface name",
155
133
G_PARAM_READWRITE));
156
g_object_class_install_property (object_class,
158
g_param_spec_string ("internal-name",
164
g_object_class_install_property (object_class,
166
g_param_spec_pointer ("component",
169
G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
135
g_object_class_install_property (object_class,
137
g_param_spec_object ("shell",
141
G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
143
g_object_class_install_property (object_class,
145
g_param_spec_object ("ui-manager",
147
"GtkUIManager object",
152
g_object_class_install_property (object_class,
154
/* FIXME: This property could probably
155
* be named better, there's already
156
* a GtkWidget 'visible' property,
157
* since RBSource derives from
158
* GtkWidget, this can be confusing
160
g_param_spec_boolean ("visibility",
162
"Whether the source should be displayed in the source list",
164
G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
171
166
rb_source_signals[DELETED] =
172
167
g_signal_new ("deleted",
174
169
G_SIGNAL_RUN_LAST,
175
G_STRUCT_OFFSET (RBSourceClass, status_changed),
170
G_STRUCT_OFFSET (RBSourceClass, deleted),
177
172
g_cclosure_marshal_VOID__VOID,
202
197
g_cclosure_marshal_VOID__VOID,
201
g_type_class_add_private (object_class, sizeof (RBSourcePrivate));
208
205
rb_source_init (RBSource *source)
210
source->priv = g_new0 (RBSourcePrivate, 1);
207
RB_SOURCE_GET_PRIVATE (source)->visible = TRUE;
215
211
rb_source_finalize (GObject *object)
217
213
RBSource *source;
214
RBSourcePrivate *priv;
219
216
g_return_if_fail (object != NULL);
220
217
g_return_if_fail (RB_IS_SOURCE (object));
222
219
source = RB_SOURCE (object);
224
g_return_if_fail (source->priv != NULL);
220
priv = RB_SOURCE_GET_PRIVATE (source);
221
g_return_if_fail (priv != NULL);
226
223
rb_debug ("Finalizing view %p", source);
228
g_free (source->priv->name);
230
g_free (source->priv);
232
G_OBJECT_CLASS (parent_class)->finalize (object);
227
G_OBJECT_CLASS (rb_source_parent_class)->finalize (object);
238
233
const GValue *value,
239
234
GParamSpec *pspec)
241
RBSource *source = RB_SOURCE (object);
236
RBSourcePrivate *priv = RB_SOURCE_GET_PRIVATE (object);
246
g_free (source->priv->name);
247
source->priv->name = g_strdup (g_value_get_string (value));
249
case PROP_INTERNAL_NAME:
250
g_free (source->priv->internal_name);
251
source->priv->internal_name = g_strdup (g_value_get_string (value));
254
source->priv->component = g_value_get_pointer (value);
242
priv->name = g_strdup (g_value_get_string (value));
245
priv->shell = g_value_get_object (value);
248
priv->visible = g_value_get_boolean (value);
249
rb_debug ("Setting %s visibility to %u",
257
254
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
266
263
GParamSpec *pspec)
268
RBSource *source = RB_SOURCE (object);
265
RBSourcePrivate *priv = RB_SOURCE_GET_PRIVATE (object);
273
g_value_set_string (value, source->priv->name);
275
case PROP_INTERNAL_NAME:
276
g_value_set_string (value, source->priv->internal_name);
279
g_value_set_pointer (value, source->priv->component);
270
g_value_set_string (value, priv->name);
273
g_value_set_object (value, priv->shell);
276
g_value_set_boolean (value, priv->visible);
278
case PROP_UI_MANAGER:
280
GtkUIManager *manager;
281
g_object_get (G_OBJECT (priv->shell),
282
"ui-manager", &manager,
284
g_value_set_object (value, manager);
285
g_object_unref (G_OBJECT(manager));
282
289
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
295
* rb_source_get_status:
296
* @status: a #RBSource
299
* Some Random comments
301
* Returns: The status string
288
304
rb_source_get_status (RBSource *status)
290
306
RBSourceClass *klass = RB_SOURCE_GET_CLASS (status);
312
322
return klass->impl_get_browser_key (status);
316
rb_source_get_search_key (RBSource *status)
318
RBSourceClass *klass = RB_SOURCE_GET_CLASS (status);
320
return klass->impl_get_search_key (status);
324
326
rb_source_notify_status_changed (RBSource *status)
336
338
rb_source_update_play_statistics (RBSource *source, RhythmDB *db, RhythmDBEntry *entry)
341
gulong current_count;
340
342
GValue value = { 0, };
342
g_value_init (&value, G_TYPE_INT);
344
rhythmdb_read_lock (db);
345
current_count = rhythmdb_entry_get_int (db, entry, RHYTHMDB_PROP_PLAY_COUNT);
346
rhythmdb_read_unlock (db);
348
g_value_set_int (&value, current_count + 1);
344
g_value_init (&value, G_TYPE_ULONG);
346
current_count = entry->play_count;
348
g_value_set_ulong (&value, current_count + 1);
350
350
/* Increment current play count */
351
rhythmdb_entry_queue_set (db, entry, RHYTHMDB_PROP_PLAY_COUNT, &value);
351
rhythmdb_entry_set (db, entry, RHYTHMDB_PROP_PLAY_COUNT, &value);
352
352
g_value_unset (&value);
354
354
/* Reset the last played time */
357
g_value_init (&value, G_TYPE_LONG);
358
g_value_set_long (&value, now);
359
rhythmdb_entry_queue_set (db, entry, RHYTHMDB_PROP_LAST_PLAYED, &value);
357
g_value_init (&value, G_TYPE_ULONG);
358
g_value_set_ulong (&value, now);
359
rhythmdb_entry_set (db, entry, RHYTHMDB_PROP_LAST_PLAYED, &value);
360
360
g_value_unset (&value);
362
rhythmdb_commit (db);
424
432
RBSourceClass *klass = RB_SOURCE_GET_CLASS (source);
426
klass->impl_search (source, text);
434
/* several sources don't have a search ability */
435
if (klass->impl_search != NULL)
436
klass->impl_search (source, text);
429
439
static GtkWidget *
554
rb_source_try_playlist (RBSource *source)
556
RBSourceClass *klass = RB_SOURCE_GET_CLASS (source);
558
return klass->impl_try_playlist (source);
540
562
rb_source_can_pause (RBSource *source)
542
564
RBSourceClass *klass = RB_SOURCE_GET_CLASS (source);
562
rb_source_have_artist_album (RBSource *source)
564
RBSourceClass *klass = RB_SOURCE_GET_CLASS (source);
566
return klass->impl_have_artist_album (source);
570
rb_source_get_artist (RBSource *source)
572
RBSourceClass *klass = RB_SOURCE_GET_CLASS (source);
574
return klass->impl_get_artist (source);
578
rb_source_get_album (RBSource *source)
580
RBSourceClass *klass = RB_SOURCE_GET_CLASS (source);
582
return klass->impl_get_album (source);
586
590
rb_source_have_url (RBSource *source)
588
592
RBSourceClass *klass = RB_SOURCE_GET_CLASS (source);
590
594
return klass->impl_have_url (source);
594
default_buffering_done (RBSource *source)
596
rb_debug ("No implementation of buffering_done for active source");
601
rb_source_buffering_done (RBSource *source)
603
RBSourceClass *klass = RB_SOURCE_GET_CLASS (source);
605
klass->impl_buffering_done (source);
609
default_receive_drag (RBSource *source, GtkSelectionData *data)
611
rb_error_dialog (_("This source does not support drag and drop."));
616
598
rb_source_receive_drag (RBSource *source, GtkSelectionData *data)
618
600
RBSourceClass *klass = RB_SOURCE_GET_CLASS (source);
620
return klass->impl_receive_drag (source, data);
602
if (klass->impl_receive_drag)
603
return klass->impl_receive_drag (source, data);
609
_rb_source_show_popup (RBSource *source, const char *ui_path)
611
GtkUIManager *uimanager;
613
g_object_get (G_OBJECT (RB_SOURCE_GET_PRIVATE (source)->shell),
614
"ui-manager", &uimanager, NULL);
615
rb_gtk_action_popup_menu (uimanager, ui_path);
616
g_object_unref (G_OBJECT (uimanager));
648
645
klass->impl_delete_thyself (source);
649
646
g_signal_emit (G_OBJECT (source), rb_source_signals[DELETED], 0);
649
static void default_activate (RBSource *source)
654
static void default_deactivate (RBSource *source)
659
static gboolean default_disconnect (RBSource *source)
664
void rb_source_activate (RBSource *source)
666
RBSourceClass *klass = RB_SOURCE_GET_CLASS (source);
668
klass->impl_activate (source);
673
void rb_source_deactivate (RBSource *source)
675
RBSourceClass *klass = RB_SOURCE_GET_CLASS (source);
677
klass->impl_deactivate (source);
682
gboolean rb_source_disconnect (RBSource *source)
684
RBSourceClass *klass = RB_SOURCE_GET_CLASS (source);
686
return klass->impl_disconnect (source);