74
71
GParamSpec *pspec);
75
static void rb_library_source_cmd_choose_genre (BonoboUIComponent *component,
77
const char *verbname);
78
static void rb_library_source_cmd_choose_artist (BonoboUIComponent *component,
80
const char *verbname);
81
static void rb_library_source_cmd_choose_album (BonoboUIComponent *component,
83
const char *verbname);
72
static void rb_library_source_cmd_choose_genre (GtkAction *action,
74
static void rb_library_source_cmd_choose_artist (GtkAction *action,
76
static void rb_library_source_cmd_choose_album (GtkAction *action,
84
78
static void rb_library_source_handle_genre_selection (RBLibrarySource *libsource, GList *genres);
85
79
static void rb_library_source_handle_artist_selection (RBLibrarySource *libsource, GList *artists);
86
80
static void rb_library_source_handle_album_selection (RBLibrarySource *libsource, GList *albums);
126
119
static void impl_reset_filters (RBSource *source);
127
120
static GtkWidget *impl_get_config_widget (RBSource *source);
128
121
static void impl_song_properties (RBSource *source);
129
static const char * impl_get_artist (RBSource *player);
130
static const char * impl_get_album (RBSource *player);
131
122
static gboolean impl_receive_drag (RBSource *source, GtkSelectionData *data);
132
123
static gboolean impl_show_popup (RBSource *source);
124
static const char * impl_get_paned_key (RBLibrarySource *source);
133
125
static void rb_library_source_do_query (RBLibrarySource *source, RBLibraryQueryType qtype);
135
127
void rb_library_source_browser_views_activated_cb (GtkWidget *widget,
136
128
RBLibrarySource *source);
137
129
static GPtrArray * construct_query_from_selection (RBLibrarySource *source);
140
#define LIBRARY_SOURCE_SONGS_POPUP_PATH "/popups/LibrarySongsList"
141
#define LIBRARY_SOURCE_POPUP_PATH "/popups/LibrarySourceList"
130
static void songs_view_drag_data_received_cb (GtkWidget *widget,
133
GtkSelectionData *data,
134
guint info, guint time,
135
RBLibrarySource *source);
143
138
#define CONF_UI_LIBRARY_DIR CONF_PREFIX "/ui/library"
144
139
#define CONF_UI_LIBRARY_BROWSER_VIEWS CONF_PREFIX "/ui/library/browser_views"
187
182
gboolean loading_prefs;
184
GtkActionGroup *action_group;
189
185
GtkWidget *config_widget;
190
186
GSList *browser_views_group;
192
188
RhythmDBEntryType entry_type;
191
guint ui_dir_notify_id;
192
guint state_paned_notify_id;
193
guint state_browser_notify_id;
194
guint state_sorting_notify_id;
195
guint browser_view_notify_id;
195
static BonoboUIVerb rb_library_source_verbs[] =
198
static GtkActionEntry rb_library_source_actions [] =
197
BONOBO_UI_VERB ("SLChooseGenre",(BonoboUIVerbFn) rb_library_source_cmd_choose_genre),
198
BONOBO_UI_VERB ("SLChooseArtist",(BonoboUIVerbFn) rb_library_source_cmd_choose_artist),
199
BONOBO_UI_VERB ("SLChooseAlbum", (BonoboUIVerbFn) rb_library_source_cmd_choose_album),
200
{ "LibrarySrcChooseGenre", NULL, N_("Browse This _Genre"), NULL,
201
N_("Set the browser to view only this genre"),
202
G_CALLBACK (rb_library_source_cmd_choose_genre) },
203
{ "LibrarySrcChooseArtist", NULL , N_("Browse This _Artist"), NULL,
204
N_("Set the browser to view only this artist"),
205
G_CALLBACK (rb_library_source_cmd_choose_artist) },
206
{ "LibrarySrcChooseAlbum", NULL, N_("Browse This A_lbum"), NULL,
207
N_("Set the browser to view only this album"),
208
G_CALLBACK (rb_library_source_cmd_choose_album) }
211
static const GtkTargetEntry songs_view_drag_types[] = {{ "text/uri-list", 0, 0 }};
211
221
static GObjectClass *parent_class = NULL;
269
279
source_class->impl_can_copy = (RBSourceFeatureFunc) rb_true_function;
270
280
source_class->impl_can_delete = (RBSourceFeatureFunc) rb_true_function;
271
281
source_class->impl_delete = impl_delete;
272
source_class->impl_have_artist_album = (RBSourceFeatureFunc) rb_true_function;
273
source_class->impl_get_artist = impl_get_artist;
274
source_class->impl_get_album = impl_get_album;
275
282
source_class->impl_have_url = (RBSourceFeatureFunc) rb_false_function;
276
283
source_class->impl_receive_drag = impl_receive_drag;
277
284
source_class->impl_show_popup = impl_show_popup;
279
g_object_class_install_property (object_class,
281
g_param_spec_object ("db",
285
G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
286
klass->impl_get_paned_key = impl_get_paned_key;
287
klass->impl_has_first_added_column = (RBLibrarySourceFeatureFunc) rb_true_function;
288
klass->impl_has_drop_support = (RBLibrarySourceFeatureFunc) rb_true_function;
286
290
g_object_class_install_property (object_class,
288
292
g_param_spec_object ("icon",
309
321
GtkWidget *genres = GTK_WIDGET (source->priv->genres);
310
322
GtkWidget *artists = GTK_WIDGET (source->priv->artists);
311
323
GtkWidget *albums = GTK_WIDGET (source->priv->albums);
312
BonoboUIComponent *component;
314
326
views = eel_gconf_get_integer (CONF_UI_LIBRARY_BROWSER_VIEWS);
316
g_object_get (G_OBJECT (source), "component", &component, NULL);
328
gtk_widget_show (genres);
329
action = gtk_action_group_get_action (source->priv->action_group,
330
"LibrarySrcChooseGenre");
332
g_object_set (G_OBJECT (action), "sensitive", TRUE, NULL);
336
gtk_widget_show (artists);
337
action = gtk_action_group_get_action (source->priv->action_group,
338
"LibrarySrcChooseArtist");
340
g_object_set (G_OBJECT (action), "sensitive", TRUE, NULL);
343
gtk_widget_show (albums);
344
action = gtk_action_group_get_action (source->priv->action_group,
345
"LibrarySrcChooseAlbum");
347
g_object_set (G_OBJECT (action), "sensitive", TRUE, NULL);
321
gtk_widget_hide (genres);
322
rb_library_source_handle_genre_selection (source, NULL);
323
rb_bonobo_set_sensitive (component,
324
"/commands" "/SLChooseGenre",
326
gtk_widget_show (artists);
327
rb_bonobo_set_sensitive (component,
328
"/commands" "/SLChooseArtist",
330
gtk_widget_show (albums);
331
rb_bonobo_set_sensitive (component,
332
"/commands" "/SLChooseAlbum",
334
/* Since this is hidden now, reset the query */
337
gtk_widget_show (genres);
338
rb_bonobo_set_sensitive (component,
339
"/commands" "/SLChooseGenre",
341
gtk_widget_show (artists);
342
rb_bonobo_set_sensitive (component,
343
"/commands" "/SLChooseArtist",
345
gtk_widget_hide (albums);
346
rb_library_source_handle_artist_selection (source, NULL);
347
rb_bonobo_set_sensitive (component,
348
"/commands" "/SLChooseAlbum",
352
gtk_widget_show (genres);
353
rb_bonobo_set_sensitive (component,
354
"/commands" "/SLChooseGenre",
356
gtk_widget_show (artists);
357
rb_bonobo_set_sensitive (component,
358
"/commands" "/SLChooseArtist",
360
gtk_widget_show (albums);
361
rb_bonobo_set_sensitive (component,
362
"/commands" "/SLChooseAlbum",
353
action = gtk_action_group_get_action (source->priv->action_group,
354
"LibrarySrcChooseGenre");
356
g_object_set (G_OBJECT (action),
360
gtk_widget_hide (genres);
361
rb_library_source_handle_genre_selection (source, NULL);
362
/* Since this is hidden now, reset the query */
365
action = gtk_action_group_get_action (source->priv->action_group,
366
"LibrarySrcChooseAlbum");
368
g_object_set (G_OBJECT (action),
372
gtk_widget_hide (albums);
373
rb_library_source_handle_album_selection (source, NULL);
434
468
rb_library_source_songs_show_popup_cb (RBEntryView *view,
435
RBLibrarySource *library_source)
440
window = gtk_widget_get_ancestor (GTK_WIDGET (view),
443
menu = gtk_menu_new ();
445
bonobo_window_add_popup (BONOBO_WINDOW (window), GTK_MENU (menu),
446
LIBRARY_SOURCE_SONGS_POPUP_PATH);
448
gtk_menu_popup (GTK_MENU (menu), NULL, NULL, NULL, NULL,
449
3, gtk_get_current_event_time ());
451
gtk_object_sink (GTK_OBJECT (menu));
454
/* This function may seem a bit weird. Since we have 2 instances of objects
455
* inheriting from RBLibrarySource, we can't install those ui verbs when
456
* creating a new instance of such an object. Attaching those verbs in the
457
* shell would also be weird imo since this would add more code
458
* dependant on the source type to the shell */
460
rb_library_source_class_add_verbs (RBShell *shell,
461
BonoboUIComponent *component)
463
bonobo_ui_component_add_verb_list_with_data (component,
464
rb_library_source_verbs,
469
RBLibrarySource *source)
471
_rb_source_show_popup (RB_SOURCE (source), "/LibraryViewPopup");
475
register_action_group (RBLibrarySource *source)
477
GtkUIManager *uimanager;
482
g_object_get (G_OBJECT (source), "ui-manager", &uimanager, NULL);
483
actiongroups = gtk_ui_manager_get_action_groups (uimanager);
485
/* Don't create the action group if it's already registered */
486
for (group = actiongroups; group != NULL; group = group->next) {
489
name = gtk_action_group_get_name (GTK_ACTION_GROUP (group->data));
490
if (strcmp (name, "LibraryActions") == 0) {
491
g_object_unref (G_OBJECT (uimanager));
492
source->priv->action_group = GTK_ACTION_GROUP (group->data);
497
g_object_get (G_OBJECT (source), "shell", &shell, NULL);
498
source->priv->action_group = gtk_action_group_new ("LibraryActions");
499
gtk_action_group_set_translation_domain (source->priv->action_group,
501
gtk_action_group_add_actions (source->priv->action_group,
502
rb_library_source_actions,
503
G_N_ELEMENTS (rb_library_source_actions),
505
gtk_ui_manager_insert_action_group (uimanager,
506
source->priv->action_group, 0);
507
g_object_unref (G_OBJECT (uimanager));
508
g_object_unref (G_OBJECT (shell));
470
513
rb_library_source_constructor (GType type, guint n_construct_properties,
473
516
RBLibrarySource *source;
474
517
RBLibrarySourceClass *klass;
475
518
GObjectClass *parent_class;
476
BonoboUIComponent *component;
478
521
klass = RB_LIBRARY_SOURCE_CLASS (g_type_class_peek (RB_TYPE_LIBRARY_SOURCE));
480
522
parent_class = G_OBJECT_CLASS (g_type_class_peek_parent (klass));
481
524
source = RB_LIBRARY_SOURCE (parent_class->constructor (type, n_construct_properties,
482
525
construct_properties));
484
g_object_get (G_OBJECT (source), "component", &component, NULL);
527
register_action_group (source);
529
g_object_get (G_OBJECT (source), "shell", &shell, NULL);
530
g_object_get (G_OBJECT (shell), "db", &source->priv->db, NULL);
531
g_object_unref (G_OBJECT (shell));
486
533
source->priv->paned = gtk_vpaned_new ();
488
535
source->priv->browser = gtk_hbox_new (TRUE, 5);
490
537
/* set up songs tree view */
491
source->priv->songs = rb_entry_view_new (source->priv->db, CONF_STATE_LIBRARY_SORTING,
538
source->priv->songs = rb_entry_view_new (source->priv->db, source->priv->sorting_key,
493
540
rb_entry_view_append_column (source->priv->songs, RB_ENTRY_VIEW_COL_TRACK_NUMBER);
494
541
rb_entry_view_append_column (source->priv->songs, RB_ENTRY_VIEW_COL_TITLE);
495
542
rb_entry_view_append_column (source->priv->songs, RB_ENTRY_VIEW_COL_GENRE);
496
543
rb_entry_view_append_column (source->priv->songs, RB_ENTRY_VIEW_COL_ARTIST);
497
544
rb_entry_view_append_column (source->priv->songs, RB_ENTRY_VIEW_COL_ALBUM);
545
rb_entry_view_append_column (source->priv->songs, RB_ENTRY_VIEW_COL_YEAR);
498
546
rb_entry_view_append_column (source->priv->songs, RB_ENTRY_VIEW_COL_DURATION);
499
547
/* rb_entry_view_append_column (source->priv->songs, RB_ENTRY_VIEW_COL_QUALITY); */
500
548
rb_entry_view_append_column (source->priv->songs, RB_ENTRY_VIEW_COL_RATING);
501
549
rb_entry_view_append_column (source->priv->songs, RB_ENTRY_VIEW_COL_PLAY_COUNT);
502
550
rb_entry_view_append_column (source->priv->songs, RB_ENTRY_VIEW_COL_LAST_PLAYED);
551
if (rb_library_source_has_first_added_column (source))
552
rb_entry_view_append_column (source->priv->songs, RB_ENTRY_VIEW_COL_FIRST_SEEN);
504
554
g_signal_connect_object (G_OBJECT (source->priv->songs), "show_popup",
505
555
G_CALLBACK (rb_library_source_songs_show_popup_cb), source, 0);
508
558
G_CALLBACK (songs_view_sort_order_changed_cb),
561
/* set up drag and drop for the song tree view.
562
* we don't use RBEntryView's DnD support because it does too much.
563
* we just want to be able to drop songs in to add them to the
566
g_signal_connect_object (G_OBJECT (source->priv->songs),
567
"drag_data_received",
568
G_CALLBACK (songs_view_drag_data_received_cb),
571
/* only add drop support for the Library, subclasses can add it themselves */
572
if (rb_library_source_has_drop_support (source)) {
573
gtk_drag_dest_set (GTK_WIDGET (source->priv->songs),
574
GTK_DEST_DEFAULT_ALL,
575
songs_view_drag_types, 1,
576
GDK_ACTION_COPY | GDK_ACTION_MOVE); /* really accept move actions? */
511
579
/* set up genres treeview */
512
580
source->priv->genres = rb_property_view_new (source->priv->db, RHYTHMDB_PROP_GENRE,
566
634
rb_library_source_state_prefs_sync (source);
567
635
rb_library_source_ui_prefs_sync (source);
568
636
update_browser_views_visibility (source);
569
eel_gconf_notification_add (CONF_STATE_LIBRARY_DIR,
570
(GConfClientNotifyFunc) rb_library_source_state_pref_changed,
572
eel_gconf_notification_add (CONF_UI_LIBRARY_DIR,
638
if (source->priv->sorting_key) {
639
source->priv->state_sorting_notify_id =
640
eel_gconf_notification_add (source->priv->sorting_key,
641
(GConfClientNotifyFunc) rb_library_source_state_pref_changed,
644
if (rb_library_source_get_paned_key (source)) {
645
source->priv->state_paned_notify_id =
646
eel_gconf_notification_add (rb_library_source_get_paned_key (source),
647
(GConfClientNotifyFunc) rb_library_source_state_pref_changed,
650
if (rb_source_get_browser_key (RB_SOURCE (source))) {
651
source->priv->state_browser_notify_id =
652
eel_gconf_notification_add (rb_source_get_browser_key (RB_SOURCE (source)),
653
(GConfClientNotifyFunc) rb_library_source_state_pref_changed,
657
source->priv->ui_dir_notify_id =
658
eel_gconf_notification_add (CONF_UI_LIBRARY_DIR,
573
659
(GConfClientNotifyFunc) rb_library_source_ui_pref_changed, source);
574
eel_gconf_notification_add (CONF_UI_LIBRARY_BROWSER_VIEWS,
660
source->priv->browser_view_notify_id =
661
eel_gconf_notification_add (CONF_UI_LIBRARY_BROWSER_VIEWS,
575
662
(GConfClientNotifyFunc) rb_library_source_browser_views_changed, source);
576
664
rb_library_source_do_query (source, RB_LIBRARY_QUERY_TYPE_ALL);
577
665
return G_OBJECT (source);
592
source->priv->db = g_value_get_object (value);
595
680
if (source->priv->pixbuf) {
596
681
g_object_unref (G_OBJECT (source->priv->pixbuf));
598
683
source->priv->pixbuf = g_value_get_object (value);
599
g_object_ref (source->priv->pixbuf);
685
if (source->priv->pixbuf)
686
g_object_ref (source->priv->pixbuf);
601
688
case PROP_ENTRY_TYPE:
602
689
source->priv->entry_type = g_value_get_uint (value);
691
case PROP_SORTING_KEY:
692
g_free (source->priv->sorting_key);
693
source->priv->sorting_key = g_strdup (g_value_get_string (value));
605
696
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
636
rb_library_source_new (RBShell *shell, RhythmDB *db,
637
BonoboUIComponent *component)
727
rb_library_source_new (RBShell *shell)
639
729
RBSource *source;
640
GtkWidget *dummy = gtk_tree_view_new ();
643
icon = gtk_widget_render_icon (dummy, RB_STOCK_LIBRARY,
644
GTK_ICON_SIZE_LARGE_TOOLBAR,
646
gtk_widget_destroy (dummy);
733
gtk_icon_size_lookup (GTK_ICON_SIZE_LARGE_TOOLBAR, &size, NULL);
734
icon = gtk_icon_theme_load_icon (gtk_icon_theme_get_default (),
735
"stock_music-library",
648
739
source = RB_SOURCE (g_object_new (RB_TYPE_LIBRARY_SOURCE,
649
740
"name", _("Library"),
650
"internal-name", "<library>",
651
741
"entry-type", RHYTHMDB_ENTRY_TYPE_SONG,
653
"component", component,
656
745
rb_shell_register_entry_type_for_source (shell, source,
673
761
for (sorted_a_keys = NULL; a; a = a->next) {
674
sorted_a_keys = g_list_append (sorted_a_keys,
762
sorted_a_keys = g_list_prepend (sorted_a_keys,
675
763
g_utf8_collate_key (a->data, -1));
677
765
for (sorted_b_keys = NULL; b; b = b->next) {
678
sorted_b_keys = g_list_append (sorted_b_keys,
766
sorted_b_keys = g_list_prepend (sorted_b_keys,
679
767
g_utf8_collate_key (b->data, -1));
681
769
sorted_a_keys = g_list_sort (sorted_a_keys, (GCompareFunc) strcmp);
711
805
GList *selected, *tem;
712
806
GHashTable *selected_set;
714
rhythmdb_read_lock (source->priv->db);
715
808
selected_set = g_hash_table_new (g_str_hash, g_str_equal);
716
809
selected = rb_entry_view_get_selected_entries (source->priv->songs);
717
810
for (tem = selected; tem; tem = tem->next) {
718
char *val = g_strdup (rhythmdb_entry_get_string (source->priv->db,
811
RhythmDBEntry *entry = tem->data;
812
char *val = g_strdup (rhythmdb_entry_get_string (entry, prop));
720
813
g_hash_table_insert (selected_set, val, NULL);
723
rhythmdb_read_unlock (source->priv->db);
725
817
g_list_free (selected);
776
869
g_object_get (G_OBJECT (shell), "selected-source", &source, NULL);
777
870
props = rb_library_source_gather_properties (source, RHYTHMDB_PROP_ALBUM);
778
871
rb_property_view_set_selection (source->priv->albums, props);
872
g_list_foreach (props, (GFunc) rb_library_source_free_list_data, NULL);
779
873
g_list_free (props);
783
rb_library_source_sync_query (RBLibrarySource *source)
785
GPtrArray *query = construct_query_from_selection (source);
786
g_object_set (G_OBJECT (source->priv->model), "query", query, NULL);
787
rhythmdb_query_free (query);
874
g_object_unref (source);
889
976
rb_library_source_do_query (source, RB_LIBRARY_QUERY_TYPE_SEARCH);
893
980
impl_get_status (RBSource *asource)
895
982
RBLibrarySource *source = RB_LIBRARY_SOURCE (asource);
896
g_free (source->priv->status);
897
source->priv->status = rhythmdb_compute_status_normal (rb_entry_view_get_num_entries (source->priv->songs),
898
rb_entry_view_get_duration (source->priv->songs),
899
rb_entry_view_get_total_size (source->priv->songs));
900
return source->priv->status;
985
status = rhythmdb_compute_status_normal (rb_entry_view_get_num_entries (source->priv->songs),
986
rb_entry_view_get_duration (source->priv->songs),
987
rb_entry_view_get_total_size (source->priv->songs));
903
991
static const char *
1036
1124
return source->priv->config_widget;
1040
impl_get_artist (RBSource *asource)
1042
RBLibrarySource *source = RB_LIBRARY_SOURCE (asource);
1043
RhythmDBEntry *entry;
1045
g_free (source->priv->artist);
1047
entry = rb_entry_view_get_playing_entry (source->priv->songs);
1049
if (entry != NULL) {
1050
rhythmdb_read_lock (source->priv->db);
1052
source->priv->artist =
1053
g_strdup (rhythmdb_entry_get_string (source->priv->db, entry, RHYTHMDB_PROP_ARTIST));
1055
rhythmdb_read_unlock (source->priv->db);
1057
source->priv->artist = NULL;
1060
return source->priv->artist;
1064
impl_get_album (RBSource *asource)
1066
RBLibrarySource *source = RB_LIBRARY_SOURCE (asource);
1067
RhythmDBEntry *entry;
1069
g_free (source->priv->artist);
1071
entry = rb_entry_view_get_playing_entry (source->priv->songs);
1073
if (entry != NULL) {
1074
rhythmdb_read_lock (source->priv->db);
1076
source->priv->album =
1077
g_strdup (rhythmdb_entry_get_string (source->priv->db, entry, RHYTHMDB_PROP_ALBUM));
1079
rhythmdb_read_unlock (source->priv->db);
1081
source->priv->album = NULL;
1083
return source->priv->album;
1088
1128
rb_library_source_preferences_sync (RBLibrarySource *source)
1146
1185
GtkAllocation *allocation,
1147
1186
RBLibrarySource *source)
1188
const char *key = rb_library_source_get_paned_key (source);;
1149
1190
/* save state */
1150
1191
rb_debug ("paned size allocate");
1151
eel_gconf_set_integer (CONF_STATE_PANED_POSITION,
1152
gtk_paned_get_position (GTK_PANED (source->priv->paned)));
1193
eel_gconf_set_integer (key, gtk_paned_get_position (GTK_PANED (source->priv->paned)));
1156
1197
rb_library_source_state_prefs_sync (RBLibrarySource *source)
1158
1201
rb_debug ("syncing state");
1159
gtk_paned_set_position (GTK_PANED (source->priv->paned),
1160
eel_gconf_get_integer (CONF_STATE_PANED_POSITION));
1162
if (eel_gconf_get_boolean (CONF_STATE_SHOW_BROWSER))
1163
gtk_widget_show (source->priv->browser);
1165
gtk_widget_hide (source->priv->browser);
1202
key = rb_library_source_get_paned_key (source);
1204
gtk_paned_set_position (GTK_PANED (source->priv->paned),
1205
eel_gconf_get_integer (key));
1207
key = rb_source_get_browser_key (RB_SOURCE (source));
1208
if (key && eel_gconf_get_boolean (key))
1209
gtk_widget_show (source->priv->browser);
1211
gtk_widget_hide (source->priv->browser);
1289
1335
static gboolean
1290
1336
impl_show_popup (RBSource *source)
1292
rb_bonobo_show_popup (GTK_WIDGET (source), LIBRARY_SOURCE_POPUP_PATH);
1338
_rb_source_show_popup (RB_SOURCE (source), "/LibrarySourcePopup");
1343
rb_library_source_get_paned_key (RBLibrarySource *source)
1345
RBLibrarySourceClass *klass = RB_LIBRARY_SOURCE_GET_CLASS (source);
1347
if (klass->impl_get_paned_key)
1348
return klass->impl_get_paned_key (source);
1354
rb_library_source_has_first_added_column (RBLibrarySource *source)
1356
RBLibrarySourceClass *klass = RB_LIBRARY_SOURCE_GET_CLASS (source);
1358
return klass->impl_has_first_added_column (source);
1362
rb_library_source_has_drop_support (RBLibrarySource *source)
1364
RBLibrarySourceClass *klass = RB_LIBRARY_SOURCE_GET_CLASS (source);
1366
return klass->impl_has_drop_support (source);
1297
1371
push_multi_equals_query (RhythmDB *db, GPtrArray *query, guint propid, GList *items)
1343
1417
if (source->priv->search_text) {
1344
1418
GPtrArray *subquery = rhythmdb_query_parse (source->priv->db,
1345
1419
RHYTHMDB_QUERY_PROP_LIKE,
1346
RHYTHMDB_PROP_GENRE_FOLDED,
1347
source->priv->search_text,
1348
RHYTHMDB_QUERY_DISJUNCTION,
1349
RHYTHMDB_QUERY_PROP_LIKE,
1350
RHYTHMDB_PROP_ARTIST_FOLDED,
1351
source->priv->search_text,
1352
RHYTHMDB_QUERY_DISJUNCTION,
1353
RHYTHMDB_QUERY_PROP_LIKE,
1354
RHYTHMDB_PROP_ALBUM_FOLDED,
1355
source->priv->search_text,
1356
RHYTHMDB_QUERY_DISJUNCTION,
1357
RHYTHMDB_QUERY_PROP_LIKE,
1358
RHYTHMDB_PROP_TITLE_FOLDED,
1420
RHYTHMDB_PROP_SEARCH_MATCH,
1359
1421
source->priv->search_text,
1360
1422
RHYTHMDB_QUERY_END);
1361
1423
rhythmdb_query_append (source->priv->db,