~ubuntu-branches/ubuntu/utopic/rhythmbox/utopic-proposed

« back to all changes in this revision

Viewing changes to widgets/rb-property-view.c

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

Show diffs side-by-side

added added

removed removed

Lines of Context:
37
37
#include "rb-debug.h"
38
38
#include "rhythmdb.h"
39
39
#include "rhythmdb-property-model.h"
40
 
#include "rb-string-helpers.h"
41
40
#include "rb-stock-icons.h"
42
41
#include "eel-gconf-extensions.h"
43
42
 
72
71
 
73
72
        RhythmDBPropType propid;
74
73
 
75
 
        GPtrArray *query;
76
 
        
77
74
        RhythmDBPropertyModel *prop_model;
78
75
 
79
76
        char *title;
81
78
        GtkWidget *treeview;
82
79
        GtkTreeSelection *selection;
83
80
 
 
81
        gboolean draggable;
84
82
        gboolean handling_row_deletion;
85
 
 
86
 
        guint refresh_idle_id;
87
83
};
88
84
 
89
85
enum
102
98
        PROP_PROP,
103
99
        PROP_TITLE,
104
100
        PROP_MODEL,
 
101
        PROP_DRAGGABLE,
105
102
};
106
103
 
107
 
static GObjectClass *parent_class = NULL;
108
 
 
109
104
static guint rb_property_view_signals[LAST_SIGNAL] = { 0 };
110
105
 
111
 
static const GtkTargetEntry target_album  [] = { { "text/x-rhythmbox-album",  0, 0 } };
112
 
static const GtkTargetEntry target_genre  [] = { { "text/x-rhythmbox-genre",  0, 0 } };
113
 
static const GtkTargetEntry target_artist [] = { { "text/x-rhythmbox-artist", 0, 0 } };
114
 
 
115
 
GType
116
 
rb_property_view_get_type (void)
117
 
{
118
 
        static GType rb_property_view_type = 0;
119
 
 
120
 
        if (rb_property_view_type == 0)
121
 
        {
122
 
                static const GTypeInfo our_info =
123
 
                {
124
 
                        sizeof (RBPropertyViewClass),
125
 
                        NULL,
126
 
                        NULL,
127
 
                        (GClassInitFunc) rb_property_view_class_init,
128
 
                        NULL,
129
 
                        NULL,
130
 
                        sizeof (RBPropertyView),
131
 
                        0,
132
 
                        (GInstanceInitFunc) rb_property_view_init
133
 
                };
134
 
                
135
 
                rb_property_view_type = g_type_register_static (GTK_TYPE_SCROLLED_WINDOW,
136
 
                                                                "RBPropertyView",
137
 
                                                                &our_info, 0);
138
 
        }
139
 
 
140
 
        return rb_property_view_type;
141
 
}
 
106
enum {
 
107
        TARGET_ALBUMS,
 
108
        TARGET_GENRE,
 
109
        TARGET_ARTISTS,
 
110
        TARGET_URIS,
 
111
};
 
112
 
 
113
static const GtkTargetEntry targets_album  [] = {
 
114
        { "text/x-rhythmbox-album",  0, TARGET_ALBUMS },
 
115
        { "text/uri-list", 0, TARGET_URIS },
 
116
};
 
117
static const GtkTargetEntry targets_genre  [] = {
 
118
        { "text/x-rhythmbox-genre",  0, TARGET_GENRE },
 
119
        { "text/uri-list", 0, TARGET_URIS },
 
120
};
 
121
static const GtkTargetEntry targets_artist [] = {
 
122
        { "text/x-rhythmbox-artist", 0, TARGET_ARTISTS },
 
123
        { "text/uri-list", 0, TARGET_URIS },
 
124
};
 
125
 
 
126
G_DEFINE_TYPE (RBPropertyView, rb_property_view, GTK_TYPE_SCROLLED_WINDOW)
 
127
 
142
128
 
143
129
static void
144
130
rb_property_view_class_init (RBPropertyViewClass *klass)
145
131
{
146
132
        GObjectClass *object_class = G_OBJECT_CLASS (klass);
147
133
 
148
 
        parent_class = g_type_class_peek_parent (klass);
149
 
 
150
134
        object_class->finalize = rb_property_view_finalize;
151
135
        object_class->constructor = rb_property_view_constructor;
152
136
 
184
168
                                                              "RhythmDBPropertyModel",
185
169
                                                              RHYTHMDB_TYPE_PROPERTY_MODEL,
186
170
                                                              G_PARAM_READWRITE));
 
171
        g_object_class_install_property (object_class,
 
172
                                         PROP_DRAGGABLE,
 
173
                                         g_param_spec_boolean ("draggable",
 
174
                                                               "draggable",
 
175
                                                               "is a drag source",
 
176
                                                               TRUE,
 
177
                                                               G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
187
178
 
188
179
        rb_property_view_signals[PROPERTY_ACTIVATED] =
189
180
                g_signal_new ("property-activated",
227
218
                              g_cclosure_marshal_VOID__VOID,
228
219
                              G_TYPE_NONE,
229
220
                              0); 
 
221
        
230
222
}
231
223
 
232
224
static void
250
242
        g_free (view->priv->title);
251
243
        g_free (view->priv);
252
244
 
253
 
        G_OBJECT_CLASS (parent_class)->finalize (object);
 
245
        G_OBJECT_CLASS (rb_property_view_parent_class)->finalize (object);
254
246
}
255
247
 
256
248
 
284
276
                        g_signal_handlers_disconnect_by_func (G_OBJECT (view->priv->prop_model),
285
277
                                                              G_CALLBACK (rb_property_view_post_row_deleted_cb),
286
278
                                                              view);
 
279
                        g_object_unref (G_OBJECT (view->priv->prop_model));
287
280
                }
288
281
 
289
282
                view->priv->prop_model = g_value_get_object (value);
294
287
                gtk_tree_view_set_model (GTK_TREE_VIEW (view->priv->treeview),
295
288
                                         GTK_TREE_MODEL (view->priv->prop_model));
296
289
 
 
290
                g_object_ref (G_OBJECT (view->priv->prop_model));
297
291
                g_signal_connect_object (G_OBJECT (view->priv->prop_model),
298
292
                                         "pre-row-deletion",
299
293
                                         G_CALLBACK (rb_property_view_pre_row_deleted_cb),
318
312
 
319
313
        }
320
314
                break;
 
315
        case PROP_DRAGGABLE:
 
316
                view->priv->draggable = g_value_get_boolean (value);
 
317
                break;
321
318
        default:
322
319
                G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
323
320
                break;
346
343
        case PROP_MODEL:
347
344
                g_value_set_object (value, view->priv->prop_model);
348
345
                break;
 
346
        case PROP_DRAGGABLE:
 
347
                g_value_set_boolean (value, view->priv->draggable);
 
348
                break;
349
349
        default:
350
350
                G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
351
351
                break;
366
366
                                               "db", db,
367
367
                                               "prop", propid,
368
368
                                               "title", title,
 
369
                                               "draggable", TRUE,
369
370
                                               NULL));
370
371
 
371
372
        g_return_val_if_fail (view->priv != NULL, NULL);
463
464
        g_free (str);
464
465
}
465
466
 
466
 
 
467
 
static void
468
 
rb_property_view_drag_data_get (GtkWidget *widget, GdkDragContext *context,
469
 
                                GtkSelectionData *selection_data, guint info,
470
 
                                guint time, gpointer data)
471
 
{
472
 
        const char *str;
473
 
        RBPropertyView *view;
474
 
        GtkTreeModel *model;
475
 
        GtkTreeIter iter;
476
 
        GList *selected_rows;
477
 
 
478
 
        view = RB_PROPERTY_VIEW (data);
479
 
 
480
 
        selected_rows = gtk_tree_selection_get_selected_rows (view->priv->selection, &model);
481
 
        g_assert (gtk_tree_model_get_iter (model, &iter, selected_rows->data));
482
 
        gtk_tree_model_get(model, &iter, 0, &str, -1);
483
 
        gtk_selection_data_set (selection_data, selection_data->target,
484
 
                                8, str, strlen (str));
485
 
}
486
 
 
487
467
static GObject *
488
468
rb_property_view_constructor (GType type, guint n_construct_properties,
489
469
                              GObjectConstructParam *construct_properties)
493
473
 
494
474
        RBPropertyView *view;
495
475
        RBPropertyViewClass *klass;
496
 
        GObjectClass *parent_class; 
497
 
        const GtkTargetEntry *target;
498
 
 
499
 
 
500
476
 
501
477
        klass = RB_PROPERTY_VIEW_CLASS (g_type_class_peek (RB_TYPE_PROPERTY_VIEW));
502
478
 
503
 
        parent_class = G_OBJECT_CLASS (g_type_class_peek_parent (klass));
504
 
        view = RB_PROPERTY_VIEW (parent_class->constructor (type, n_construct_properties,
505
 
                                                            construct_properties));
 
479
        view = RB_PROPERTY_VIEW (G_OBJECT_CLASS (rb_property_view_parent_class)->
 
480
                        constructor (type, n_construct_properties, construct_properties));
506
481
 
507
482
        view->priv->prop_model = rhythmdb_property_model_new (view->priv->db, view->priv->propid);
508
483
        view->priv->treeview = GTK_WIDGET (gtk_tree_view_new_with_model (GTK_TREE_MODEL (view->priv->prop_model)));
509
 
        gtk_tree_view_set_enable_search (GTK_TREE_VIEW (view->priv->treeview), TRUE);
510
 
 
511
 
        switch (view->priv->propid)
512
 
        {
513
 
        case RHYTHMDB_PROP_GENRE:
514
 
                target = target_genre;
515
 
                break;
516
 
        case RHYTHMDB_PROP_ALBUM:
517
 
                target = target_album;
518
 
                break;
519
 
        case RHYTHMDB_PROP_ARTIST:
520
 
                target = target_artist;
521
 
                break;
522
 
        default:
523
 
                target = NULL;
524
 
                g_assert_not_reached ();
525
 
        }
526
 
 
527
 
        gtk_drag_source_set (GTK_WIDGET(view->priv->treeview),
528
 
                             GDK_BUTTON1_MASK,
529
 
                             target, 1,
530
 
                             GDK_ACTION_COPY);
531
 
 
532
 
        g_signal_connect_object (G_OBJECT (view->priv->treeview), "drag_data_get",
533
 
                                 G_CALLBACK (rb_property_view_drag_data_get), view, 0);
 
484
 
 
485
        if (view->priv->draggable)
 
486
                rhythmdb_property_model_enable_drag (view->priv->prop_model,
 
487
                                                     GTK_TREE_VIEW (view->priv->treeview));
534
488
 
535
489
        g_signal_connect_object (G_OBJECT (view->priv->treeview),
536
490
                                 "row_activated",
537
491
                                 G_CALLBACK (rb_property_view_row_activated_cb),
538
492
                                 view,
539
493
                                 0);
 
494
        
540
495
        view->priv->selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (view->priv->treeview));
541
496
        g_signal_connect_object (G_OBJECT (view->priv->selection),
542
497
                                 "changed",
557
512
                                                 view, NULL);
558
513
        gtk_tree_view_column_set_title (column, view->priv->title);
559
514
        gtk_tree_view_column_set_sizing (column, GTK_TREE_VIEW_COLUMN_FIXED);
560
 
 
561
515
        gtk_tree_view_append_column (GTK_TREE_VIEW (view->priv->treeview),
562
516
                                     column);
563
517
 
596
550
                GtkTreeIter iter;
597
551
                
598
552
                if (rhythmdb_property_model_iter_from_string (view->priv->prop_model, vals->data, &iter)) {
 
553
                        GtkTreePath *path;
 
554
 
599
555
                        gtk_tree_selection_select_iter (view->priv->selection, &iter);
 
556
                        path = gtk_tree_model_get_path (GTK_TREE_MODEL (view->priv->prop_model), &iter);
 
557
                        if (path != NULL) {
 
558
                                gtk_tree_view_scroll_to_cell (GTK_TREE_VIEW (view->priv->treeview),
 
559
                                                              path, NULL, TRUE,
 
560
                                                              0.5, 0.0);
 
561
                                gtk_tree_path_free (path);
 
562
                        }
 
563
 
600
564
                }
601
565
        }
602
566
                
630
594
                                selected_properties = NULL;
631
595
                                break;
632
596
                        }
633
 
                        selected_properties = g_list_append (selected_properties,
 
597
                        selected_properties = g_list_prepend (selected_properties,
634
598
                                                             g_strdup (selected_prop));
635
599
                }
636
600
 
658
622
                }
659
623
        }
660
624
}
 
625
 
 
626
GtkWidget*
 
627
rb_property_view_get_treeview   (RBPropertyView *view)
 
628
{
 
629
        return view->priv->treeview;
 
630
}
 
631