/* Fix me: This considers empty fields as duplicates. */ void playlist_remove_duplicates_by_scheme (int playlist, int scheme) { int entries = playlist_entry_count (playlist); int count; if (entries < 1) return; playlist_select_all (playlist, FALSE); if (filename_comparisons[scheme] != NULL) { int (* compare) (const char * a, const char * b) = filename_comparisons[scheme]; playlist_sort_by_filename (playlist, compare); char * last = playlist_entry_get_filename (playlist, 0); for (count = 1; count < entries; count ++) { char * current = playlist_entry_get_filename (playlist, count); if (compare (last, current) == 0) playlist_entry_set_selected (playlist, count, TRUE); str_unref (last); last = current; } str_unref (last); } else if (tuple_comparisons[scheme] != NULL) { int (* compare) (const Tuple * a, const Tuple * b) = tuple_comparisons[scheme]; playlist_sort_by_tuple (playlist, compare); Tuple * last = playlist_entry_get_tuple (playlist, 0, FALSE); for (count = 1; count < entries; count ++) { Tuple * current = playlist_entry_get_tuple (playlist, count, FALSE); if (last != NULL && current != NULL && compare (last, current) == 0) playlist_entry_set_selected (playlist, count, TRUE); if (last) tuple_unref (last); last = current; } if (last) tuple_unref (last); } playlist_delete_selected (playlist); }
void playlist_select_by_patterns (int playlist, const Tuple * patterns) { const int fields[] = {FIELD_TITLE, FIELD_ALBUM, FIELD_ARTIST, FIELD_FILE_NAME}; int entries = playlist_entry_count (playlist); int field, entry; playlist_select_all (playlist, TRUE); for (field = 0; field < G_N_ELEMENTS (fields); field ++) { char * pattern = tuple_get_str (patterns, fields[field], NULL); regex_t regex; if (! pattern || ! pattern[0] || regcomp (& regex, pattern, REG_ICASE)) { str_unref (pattern); continue; } for (entry = 0; entry < entries; entry ++) { if (! playlist_entry_get_selected (playlist, entry)) continue; Tuple * tuple = playlist_entry_get_tuple (playlist, entry, FALSE); char * string = tuple ? tuple_get_str (tuple, fields[field], NULL) : NULL; if (! string || regexec (& regex, string, 0, NULL, 0)) playlist_entry_set_selected (playlist, entry, FALSE); str_unref (string); if (tuple) tuple_unref (tuple); } regfree (& regex); str_unref (pattern); } }
void playlist_remove_failed (int playlist) { int entries = playlist_entry_count (playlist); int count; playlist_select_all (playlist, FALSE); for (count = 0; count < entries; count ++) { char * filename = playlist_entry_get_filename (playlist, count); /* vfs_file_test() only works for file:// URIs currently */ if (! strncmp (filename, "file://", 7) && ! vfs_file_test (filename, G_FILE_TEST_EXISTS)) playlist_entry_set_selected (playlist, count, TRUE); str_unref (filename); } playlist_delete_selected (playlist); }
void on_select_all_activate(GtkAction * action, gpointer user_data) { playlist_select_all(get_playlist(app)); }
void playlist_list_button_press_cb(GtkWidget * widget, GdkEventButton * event, PlayList_List * pl) { if (event->button == 1 && pl->pl_fheight && inside_widget(event->x, event->y, &pl->pl_widget)) { int nr, y; y = event->y - pl->pl_widget.y; nr = (y / pl->pl_fheight) + pl->pl_first; if (nr >= get_playlist_length()) nr = get_playlist_length() - 1; if (!(event->state & GDK_CONTROL_MASK)) playlist_select_all(FALSE); if (event->state & GDK_SHIFT_MASK && pl->pl_prev_selected != -1) { playlist_select_range(pl->pl_prev_selected, nr, TRUE); pl->pl_prev_min = pl->pl_prev_selected; pl->pl_prev_max = nr; pl->pl_drag_pos = nr - pl->pl_first; } else { if (playlist_select_invert(nr)) { if (event->state & GDK_CONTROL_MASK) { if (pl->pl_prev_min == -1) { pl->pl_prev_min = pl->pl_prev_selected; pl->pl_prev_max = pl->pl_prev_selected; } if (nr < pl->pl_prev_min) pl->pl_prev_min = nr; else if (nr > pl->pl_prev_max) pl->pl_prev_max = nr; } else pl->pl_prev_min = -1; pl->pl_prev_selected = nr; pl->pl_drag_pos = nr - pl->pl_first; } } if (event->type == GDK_2BUTTON_PRESS) { /* * Ungrab the pointer to prevent us from * hanging on to it during the sometimes slow * playlist_play(). */ gdk_pointer_ungrab(GDK_CURRENT_TIME); gdk_flush(); playlist_set_position(nr); if (!get_input_playing()) playlist_play(); } pl->pl_dragging = TRUE; playlistwin_update_list(); } }