~ubuntu-branches/ubuntu/precise/rhythmbox/precise-201203091205

« back to all changes in this revision

Viewing changes to sources/rb-source.c

Tags: upstream-0.9.2cvs20060102
ImportĀ upstreamĀ versionĀ 0.9.2cvs20060102

Show diffs side-by-side

added added

removed removed

Lines of Context:
32
32
#include "rb-shell.h"
33
33
#include "rb-source.h"
34
34
#include "rb-util.h"
 
35
#include "rb-static-playlist-source.h"
35
36
 
36
37
static void rb_source_class_init (RBSourceClass *klass);
37
38
static void rb_source_init (RBSource *source);
45
46
                                        GValue *value,
46
47
                                        GParamSpec *pspec);
47
48
 
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);
65
66
 
 
67
static void rb_source_row_deleted_cb (GtkTreeModel *model,
 
68
                                      GtkTreePath *path,
 
69
                                      RBSource *source);
 
70
static void rb_source_row_inserted_cb (GtkTreeModel *model,
 
71
                                       GtkTreePath *path,
 
72
                                       GtkTreeIter *iter,
 
73
                                       RBSource *source);
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))
68
76
 
72
80
        
73
81
        RBShell *shell;
74
82
        gboolean visible;
 
83
        RhythmDBQueryModel *query_model;
 
84
        guint idle_status_changed_id;
75
85
};
76
86
 
77
87
enum
80
90
        PROP_NAME,
81
91
        PROP_SHELL,
82
92
        PROP_UI_MANAGER,
83
 
        PROP_VISIBLE
 
93
        PROP_VISIBLE,
 
94
        PROP_QUERY_MODEL
84
95
};
85
96
 
86
97
enum
103
114
        object_class->set_property = rb_source_set_property;
104
115
        object_class->get_property = rb_source_get_property;
105
116
 
 
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;
126
142
 
127
143
        g_object_class_install_property (object_class,
128
144
                                         PROP_NAME,
161
177
                                                               "visibility",
162
178
                                                               "Whether the source should be displayed in the source list",
163
179
                                                               TRUE,
164
 
                                                               G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
 
180
                                                               G_PARAM_READWRITE));
 
181
 
 
182
        g_object_class_install_property (object_class,
 
183
                                         PROP_QUERY_MODEL,
 
184
                                         g_param_spec_object ("query-model",
 
185
                                                              "RhythmDBQueryModel",
 
186
                                                              "RhythmDBQueryModel object",
 
187
                                                              RHYTHMDB_TYPE_QUERY_MODEL,
 
188
                                                              G_PARAM_READWRITE));
165
189
 
166
190
        rb_source_signals[DELETED] =
167
191
                g_signal_new ("deleted",
222
246
 
223
247
        rb_debug ("Finalizing view %p", source);
224
248
 
 
249
        if (priv->idle_status_changed_id)
 
250
                g_source_remove (priv->idle_status_changed_id);
 
251
        
 
252
        g_object_unref (G_OBJECT (priv->query_model));
 
253
        
225
254
        g_free (priv->name);
226
255
 
227
256
        G_OBJECT_CLASS (rb_source_parent_class)->finalize (object);
234
263
                      GParamSpec *pspec)
235
264
{
236
265
        RBSourcePrivate *priv = RB_SOURCE_GET_PRIVATE (object);
 
266
        RhythmDBQueryModel *model;
 
267
        RBSource *source = RB_SOURCE (object);
237
268
 
238
269
        switch (prop_id)
239
270
        {
250
281
                          priv->name, 
251
282
                          priv->visible);
252
283
                break;
 
284
        case PROP_QUERY_MODEL:
 
285
                model = g_value_get_object (value); 
 
286
                if (priv->query_model == model)
 
287
                        return;
 
288
 
 
289
                if (priv->query_model) {
 
290
                        g_object_unref (G_OBJECT (priv->query_model));
 
291
 
 
292
                        g_signal_handlers_disconnect_by_func (G_OBJECT (model),
 
293
                                                              G_CALLBACK (rb_source_row_deleted_cb),
 
294
                                                              source);
 
295
                        g_signal_handlers_disconnect_by_func (G_OBJECT (model),
 
296
                                                              G_CALLBACK (rb_source_row_inserted_cb),
 
297
                                                              source);
 
298
                }
 
299
                
 
300
                priv->query_model = model;
 
301
                if (priv->query_model) {
 
302
                        g_object_ref (G_OBJECT (model));
 
303
 
 
304
                        g_signal_connect_object (G_OBJECT (model), "row_deleted",
 
305
                                                 G_CALLBACK (rb_source_row_deleted_cb),
 
306
                                                 source, 0);
 
307
                        g_signal_connect_object (G_OBJECT (model), "row_inserted",
 
308
                                                 G_CALLBACK (rb_source_row_inserted_cb),
 
309
                                                 source, 0);
 
310
                }
 
311
 
 
312
                /* g_object_notify (G_OBJECT (source), "query-model"); */
 
313
                rb_source_notify_status_changed (source);
 
314
                break;
253
315
        default:
254
316
                G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
255
317
                break;
285
347
                g_object_unref (G_OBJECT(manager));
286
348
                break;
287
349
        }
 
350
        case PROP_QUERY_MODEL:
 
351
                g_value_set_object (value, priv->query_model);
 
352
                break;
288
353
        default:
289
354
                G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
290
355
                break;
291
356
        }
292
357
}
293
358
 
 
359
static char *
 
360
default_get_status (RBSource *source)
 
361
{
 
362
        RBSourcePrivate *priv = RB_SOURCE_GET_PRIVATE (source);
 
363
        if (priv->query_model)
 
364
                return rhythmdb_query_model_compute_status_normal (priv->query_model);
 
365
 
 
366
        return g_strdup ("");
 
367
}
 
368
 
294
369
/**
295
370
 * rb_source_get_status:
296
371
 * @status: a #RBSource
301
376
 * Returns: The status string
302
377
 **/
303
378
char *
304
 
rb_source_get_status (RBSource *status)
 
379
rb_source_get_status (RBSource *source)
305
380
{
306
 
        RBSourceClass *klass = RB_SOURCE_GET_CLASS (status);
 
381
        RBSourceClass *klass = RB_SOURCE_GET_CLASS (source);
307
382
 
308
 
        return klass->impl_get_status (status);
 
383
        return klass->impl_get_status (source);
309
384
}
310
385
 
311
386
static const char *
312
 
default_get_browser_key (RBSource *status)
 
387
default_get_browser_key (RBSource *source)
313
388
{
314
389
        return NULL;
315
390
}
316
391
 
317
392
const char *
318
 
rb_source_get_browser_key (RBSource *status)
319
 
{
320
 
        RBSourceClass *klass = RB_SOURCE_GET_CLASS (status);
321
 
 
322
 
        return klass->impl_get_browser_key (status);
323
 
}
324
 
 
325
 
void
326
 
rb_source_notify_status_changed (RBSource *status)
327
 
{
328
 
        g_signal_emit (G_OBJECT (status), rb_source_signals[STATUS_CHANGED], 0);
329
 
}
330
 
 
331
 
void
332
 
rb_source_notify_filter_changed (RBSource *status)
333
 
{
334
 
        g_signal_emit (G_OBJECT (status), rb_source_signals[FILTER_CHANGED], 0);
 
393
rb_source_get_browser_key (RBSource *source)
 
394
{
 
395
        RBSourceClass *klass = RB_SOURCE_GET_CLASS (source);
 
396
 
 
397
        return klass->impl_get_browser_key (source);
 
398
}
 
399
 
 
400
gboolean
 
401
rb_source_can_browse (RBSource *source)
 
402
{
 
403
        RBSourceClass *klass = RB_SOURCE_GET_CLASS (source);
 
404
 
 
405
        return klass->impl_can_browse (source);
 
406
}
 
407
 
 
408
void
 
409
rb_source_notify_status_changed (RBSource *source)
 
410
{
 
411
        g_signal_emit (G_OBJECT (source), rb_source_signals[STATUS_CHANGED], 0);
 
412
}
 
413
 
 
414
void
 
415
rb_source_notify_filter_changed (RBSource *source)
 
416
{
 
417
        g_signal_emit (G_OBJECT (source), rb_source_signals[FILTER_CHANGED], 0);
335
418
}
336
419
 
337
420
void
436
519
                klass->impl_search (source, text);
437
520
}
438
521
 
439
 
static GtkWidget *
440
 
default_get_config_widget (RBSource *source)
441
 
{
442
 
        return NULL;
443
 
}
444
 
 
445
522
GtkWidget *
446
 
rb_source_get_config_widget (RBSource *source)
 
523
rb_source_get_config_widget (RBSource *source, RBShellPreferences *prefs)
447
524
{
448
525
        RBSourceClass *klass = RB_SOURCE_GET_CLASS (source);
449
526
 
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);
452
529
        } else {
453
530
                return NULL;
454
531
        }
455
532
}
456
533
 
457
 
static gboolean
458
 
default_can_cut (RBSource *source)
459
 
{
460
 
        return FALSE;
461
 
}
462
 
 
463
534
gboolean
464
535
rb_source_can_cut (RBSource *source)
465
536
{
477
548
}
478
549
 
479
550
gboolean
 
551
rb_source_can_move_to_trash (RBSource *source)
 
552
{
 
553
        RBSourceClass *klass = RB_SOURCE_GET_CLASS (source);
 
554
 
 
555
        return klass->impl_can_move_to_trash (source);
 
556
}
 
557
 
 
558
gboolean
480
559
rb_source_can_copy (RBSource *source)
481
560
{
482
561
        RBSourceClass *klass = RB_SOURCE_GET_CLASS (source);
514
593
        klass->impl_paste (source, nodes);
515
594
}
516
595
 
 
596
gboolean
 
597
rb_source_can_add_to_queue (RBSource *source)
 
598
{
 
599
        RBSourceClass *klass = RB_SOURCE_GET_CLASS (source);
 
600
        return klass->impl_can_add_to_queue (source);
 
601
}
 
602
 
 
603
static void
 
604
default_add_to_queue (RBSource *source, RBSource *queue)
 
605
{
 
606
        RBEntryView *songs = rb_source_get_entry_view (source);
 
607
        GList *selection = rb_entry_view_get_selected_entries (songs);
 
608
        GList *iter;
 
609
 
 
610
        if (selection == NULL) 
 
611
                return;
 
612
 
 
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);
 
616
        }
 
617
 
 
618
        g_list_free (selection);
 
619
}
 
620
 
 
621
void
 
622
rb_source_add_to_queue (RBSource *source, RBSource *queue)
 
623
{
 
624
        RBSourceClass *klass = RB_SOURCE_GET_CLASS (source);
 
625
        klass->impl_add_to_queue (source, queue);
 
626
}
 
627
 
517
628
void
518
629
rb_source_delete (RBSource *source)
519
630
{
522
633
        klass->impl_delete (source);
523
634
}
524
635
 
 
636
void
 
637
rb_source_move_to_trash (RBSource *source)
 
638
{
 
639
        RBSourceClass *klass = RB_SOURCE_GET_CLASS (source);
 
640
 
 
641
        klass->impl_move_to_trash (source);
 
642
}
 
643
 
525
644
static void
526
645
default_reset_filters (RBSource *source)
527
646
{
686
805
        return klass->impl_disconnect (source);
687
806
}
688
807
 
 
808
static void
 
809
rb_source_row_inserted_cb (GtkTreeModel *model,
 
810
                           GtkTreePath *path,
 
811
                           GtkTreeIter *iter,
 
812
                           RBSource *source)
 
813
{
 
814
        rb_source_notify_status_changed (source);
 
815
}
 
816
 
 
817
static gboolean
 
818
idle_emit_status_changed (RBSource *source)
 
819
{
 
820
        RBSourcePrivate *priv = RB_SOURCE_GET_PRIVATE (source);
 
821
        rb_source_notify_status_changed (source);
 
822
        priv->idle_status_changed_id = 0;
 
823
        return FALSE;
 
824
}
 
825
 
 
826
static void
 
827
rb_source_row_deleted_cb (GtkTreeModel *model,
 
828
                          GtkTreePath *path,
 
829
                          RBSource *source)
 
830
{
 
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.
 
833
         */
 
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);
 
838
        }
 
839
}
 
840
 
 
841