46
47
GParamSpec *pspec);
48
static const char * default_get_browser_key (RBSource *status);
49
static const char * default_get_browser_key (RBSource *source);
49
50
static GList *default_get_extra_views (RBSource *source);
50
51
static gboolean default_can_rename (RBSource *source);
51
52
static gboolean default_can_search (RBSource *source);
52
static gboolean default_can_cut (RBSource *source);
53
53
static GdkPixbuf *default_get_pixbuf (RBSource *source);
54
54
static GList *default_copy (RBSource *source);
55
55
static void default_reset_filters (RBSource *source);
56
56
static void default_song_properties (RBSource *source);
57
static GtkWidget * default_get_config_widget (RBSource *source);
58
57
static gboolean default_try_playlist (RBSource *source);
59
58
static RBSourceEOFType default_handle_eos (RBSource *source);
60
59
static gboolean default_show_popup (RBSource *source);
62
61
static void default_activate (RBSource *source);
63
62
static void default_deactivate (RBSource *source);
64
63
static gboolean default_disconnect (RBSource *source);
64
static void default_add_to_queue (RBSource *source, RBSource *queue);
65
static char *default_get_status (RBSource *source);
67
static void rb_source_row_deleted_cb (GtkTreeModel *model,
70
static void rb_source_row_inserted_cb (GtkTreeModel *model,
66
74
G_DEFINE_ABSTRACT_TYPE (RBSource, rb_source, GTK_TYPE_HBOX)
67
75
#define RB_SOURCE_GET_PRIVATE(object)(G_TYPE_INSTANCE_GET_PRIVATE ((object), RB_TYPE_SOURCE, RBSourcePrivate))
103
114
object_class->set_property = rb_source_set_property;
104
115
object_class->get_property = rb_source_get_property;
117
klass->impl_can_browse = (RBSourceFeatureFunc) rb_false_function;
106
118
klass->impl_get_browser_key = default_get_browser_key;
107
119
klass->impl_get_extra_views = default_get_extra_views;
108
120
klass->impl_can_rename = default_can_rename;
109
121
klass->impl_can_search = default_can_search;
110
klass->impl_can_cut = default_can_cut;
111
klass->impl_can_delete = default_can_cut;
112
klass->impl_can_copy = default_can_cut;
122
klass->impl_can_cut = (RBSourceFeatureFunc) rb_false_function;
123
klass->impl_can_delete = (RBSourceFeatureFunc) rb_false_function;
124
klass->impl_can_copy = (RBSourceFeatureFunc) rb_false_function;
125
klass->impl_can_add_to_queue = (RBSourceFeatureFunc) rb_false_function;
126
klass->impl_can_move_to_trash = (RBSourceFeatureFunc) rb_false_function;
113
127
klass->impl_get_pixbuf = default_get_pixbuf;
114
128
klass->impl_copy = default_copy;
115
129
klass->impl_reset_filters = default_reset_filters;
116
130
klass->impl_song_properties = default_song_properties;
117
131
klass->impl_handle_eos = default_handle_eos;
118
klass->impl_get_config_widget = default_get_config_widget;
132
klass->impl_get_config_widget = NULL;
119
133
klass->impl_receive_drag = NULL;
120
134
klass->impl_show_popup = default_show_popup;
121
135
klass->impl_delete_thyself = default_delete_thyself;
123
137
klass->impl_deactivate = default_deactivate;
124
138
klass->impl_disconnect = default_disconnect;
125
139
klass->impl_try_playlist = default_try_playlist;
140
klass->impl_add_to_queue = default_add_to_queue;
141
klass->impl_get_status = default_get_status;
127
143
g_object_class_install_property (object_class,
162
178
"Whether the source should be displayed in the source list",
164
G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
182
g_object_class_install_property (object_class,
184
g_param_spec_object ("query-model",
185
"RhythmDBQueryModel",
186
"RhythmDBQueryModel object",
187
RHYTHMDB_TYPE_QUERY_MODEL,
166
190
rb_source_signals[DELETED] =
167
191
g_signal_new ("deleted",
223
247
rb_debug ("Finalizing view %p", source);
249
if (priv->idle_status_changed_id)
250
g_source_remove (priv->idle_status_changed_id);
252
g_object_unref (G_OBJECT (priv->query_model));
225
254
g_free (priv->name);
227
256
G_OBJECT_CLASS (rb_source_parent_class)->finalize (object);
284
case PROP_QUERY_MODEL:
285
model = g_value_get_object (value);
286
if (priv->query_model == model)
289
if (priv->query_model) {
290
g_object_unref (G_OBJECT (priv->query_model));
292
g_signal_handlers_disconnect_by_func (G_OBJECT (model),
293
G_CALLBACK (rb_source_row_deleted_cb),
295
g_signal_handlers_disconnect_by_func (G_OBJECT (model),
296
G_CALLBACK (rb_source_row_inserted_cb),
300
priv->query_model = model;
301
if (priv->query_model) {
302
g_object_ref (G_OBJECT (model));
304
g_signal_connect_object (G_OBJECT (model), "row_deleted",
305
G_CALLBACK (rb_source_row_deleted_cb),
307
g_signal_connect_object (G_OBJECT (model), "row_inserted",
308
G_CALLBACK (rb_source_row_inserted_cb),
312
/* g_object_notify (G_OBJECT (source), "query-model"); */
313
rb_source_notify_status_changed (source);
254
316
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
285
347
g_object_unref (G_OBJECT(manager));
350
case PROP_QUERY_MODEL:
351
g_value_set_object (value, priv->query_model);
289
354
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
360
default_get_status (RBSource *source)
362
RBSourcePrivate *priv = RB_SOURCE_GET_PRIVATE (source);
363
if (priv->query_model)
364
return rhythmdb_query_model_compute_status_normal (priv->query_model);
366
return g_strdup ("");
295
370
* rb_source_get_status:
296
371
* @status: a #RBSource
301
376
* Returns: The status string
304
rb_source_get_status (RBSource *status)
379
rb_source_get_status (RBSource *source)
306
RBSourceClass *klass = RB_SOURCE_GET_CLASS (status);
381
RBSourceClass *klass = RB_SOURCE_GET_CLASS (source);
308
return klass->impl_get_status (status);
383
return klass->impl_get_status (source);
311
386
static const char *
312
default_get_browser_key (RBSource *status)
387
default_get_browser_key (RBSource *source)
318
rb_source_get_browser_key (RBSource *status)
320
RBSourceClass *klass = RB_SOURCE_GET_CLASS (status);
322
return klass->impl_get_browser_key (status);
326
rb_source_notify_status_changed (RBSource *status)
328
g_signal_emit (G_OBJECT (status), rb_source_signals[STATUS_CHANGED], 0);
332
rb_source_notify_filter_changed (RBSource *status)
334
g_signal_emit (G_OBJECT (status), rb_source_signals[FILTER_CHANGED], 0);
393
rb_source_get_browser_key (RBSource *source)
395
RBSourceClass *klass = RB_SOURCE_GET_CLASS (source);
397
return klass->impl_get_browser_key (source);
401
rb_source_can_browse (RBSource *source)
403
RBSourceClass *klass = RB_SOURCE_GET_CLASS (source);
405
return klass->impl_can_browse (source);
409
rb_source_notify_status_changed (RBSource *source)
411
g_signal_emit (G_OBJECT (source), rb_source_signals[STATUS_CHANGED], 0);
415
rb_source_notify_filter_changed (RBSource *source)
417
g_signal_emit (G_OBJECT (source), rb_source_signals[FILTER_CHANGED], 0);
436
519
klass->impl_search (source, text);
440
default_get_config_widget (RBSource *source)
446
rb_source_get_config_widget (RBSource *source)
523
rb_source_get_config_widget (RBSource *source, RBShellPreferences *prefs)
448
525
RBSourceClass *klass = RB_SOURCE_GET_CLASS (source);
450
527
if (klass->impl_get_config_widget) {
451
return klass->impl_get_config_widget (source);
528
return klass->impl_get_config_widget (source, prefs);
458
default_can_cut (RBSource *source)
464
535
rb_source_can_cut (RBSource *source)
551
rb_source_can_move_to_trash (RBSource *source)
553
RBSourceClass *klass = RB_SOURCE_GET_CLASS (source);
555
return klass->impl_can_move_to_trash (source);
480
559
rb_source_can_copy (RBSource *source)
482
561
RBSourceClass *klass = RB_SOURCE_GET_CLASS (source);
514
593
klass->impl_paste (source, nodes);
597
rb_source_can_add_to_queue (RBSource *source)
599
RBSourceClass *klass = RB_SOURCE_GET_CLASS (source);
600
return klass->impl_can_add_to_queue (source);
604
default_add_to_queue (RBSource *source, RBSource *queue)
606
RBEntryView *songs = rb_source_get_entry_view (source);
607
GList *selection = rb_entry_view_get_selected_entries (songs);
610
if (selection == NULL)
613
for (iter = selection; iter; iter = iter->next) {
614
rb_static_playlist_source_add_entry (RB_STATIC_PLAYLIST_SOURCE (queue),
615
(RhythmDBEntry *)iter->data, -1);
618
g_list_free (selection);
622
rb_source_add_to_queue (RBSource *source, RBSource *queue)
624
RBSourceClass *klass = RB_SOURCE_GET_CLASS (source);
625
klass->impl_add_to_queue (source, queue);
518
629
rb_source_delete (RBSource *source)
522
633
klass->impl_delete (source);
637
rb_source_move_to_trash (RBSource *source)
639
RBSourceClass *klass = RB_SOURCE_GET_CLASS (source);
641
klass->impl_move_to_trash (source);
526
645
default_reset_filters (RBSource *source)
686
805
return klass->impl_disconnect (source);
809
rb_source_row_inserted_cb (GtkTreeModel *model,
814
rb_source_notify_status_changed (source);
818
idle_emit_status_changed (RBSource *source)
820
RBSourcePrivate *priv = RB_SOURCE_GET_PRIVATE (source);
821
rb_source_notify_status_changed (source);
822
priv->idle_status_changed_id = 0;
827
rb_source_row_deleted_cb (GtkTreeModel *model,
831
/* Emit the signal after the deletion has actually been processed,
832
* since if we update the status now it'll show the old state.
834
RBSourcePrivate *priv = RB_SOURCE_GET_PRIVATE (source);
835
if (priv->idle_status_changed_id == 0) {
836
priv->idle_status_changed_id =
837
g_idle_add ((GSourceFunc) idle_emit_status_changed, source);