static void choose_populate(GtkTreeRowReference *parent_ref,
int nvec, char **vec,
int isfile) {
+ const char *type = isfile ? "track" : "dir";
/* Compute parent_* */
GtkTreeIter pit[1], *parent_it;
GtkTreePath *parent_path;
pit, parent_path);
assert(pitv);
/*fprintf(stderr, "choose_populate %s: parent path is [%s]\n",
- choose_type_map[type],
+ type,
gtk_tree_path_to_string(parent_path));*/
} else {
parent_path = 0;
parent_it = 0;
/*fprintf(stderr, "choose_populate %s: populating the root\n",
- choose_type_map[type]);*/
+ type);*/
}
/* Remove unwanted nodes and find out which we must add */
- //fprintf(stderr, " trimming unwanted %s nodes\n", choose_type_map[type]);
- char *found = xmalloc(nvec);
+ //fprintf(stderr, " trimming unwanted %s nodes\n", type);
+ struct tracksort_data *td = tracksort_init(nvec, vec, type);
GtkTreeIter it[1];
gboolean itv = gtk_tree_model_iter_children(GTK_TREE_MODEL(choose_store),
it,
keep = 0;
} else if(choose_is_file(it) == isfile) {
/* This is the type we care about */
- //fprintf(stderr, " %s is a %s\n", track, isfile ? "file" : "dir");
+ //fprintf(stderr, " %s is a %s\n", track, type);
int n;
- for(n = 0; n < nvec && strcmp(vec[n], track); ++n)
+ for(n = 0; n < nvec && strcmp(td[n].track, track); ++n)
;
if(n < nvec) {
//fprintf(stderr, " ... and survives\n");
- found[n] = 1;
+ td[n].extra = td;
keep = 1;
} else {
//fprintf(stderr, " ... and is to be removed\n");
}
/* Add nodes we don't have */
int inserted = 0;
- //fprintf(stderr, " inserting new %s nodes\n", isfile ? "track" : "dir");
- const char *typename = isfile ? "track" : "dir";
+ //fprintf(stderr, " inserting new %s nodes\n", type);
for(int n = 0; n < nvec; ++n) {
- if(!found[n]) {
- //fprintf(stderr, " %s was not found\n", vec[n]);
+ if(!td[n].extra) {
+ //fprintf(stderr, " %s was not found\n", td[n].track);
gtk_tree_store_append(choose_store, it, parent_it);
gtk_tree_store_set(choose_store, it,
- NAME_COLUMN, trackname_transform(typename,
- vec[n],
- "display"),
+ NAME_COLUMN, td[n].display,
ISFILE_COLUMN, isfile,
- TRACK_COLUMN, vec[n],
- SORT_COLUMN, trackname_transform(typename,
- vec[n],
- "sort"),
+ TRACK_COLUMN, td[n].track,
+ SORT_COLUMN, td[n].sort,
-1);
/* Update length and state; we expect this to kick off length lookups
* rather than necessarily get the right value the first time round. */
--- /dev/null
+/*
+ * This file is part of DisOrder
+ * Copyright (C) 2008 Richard Kettlewell
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ * USA
+ */
+#include "common.h"
+
+#include "trackname.h"
+#include "mem.h"
+
+/** @brief Compare two @ref entry objects */
+static int tracksort_compare(const void *a, const void *b) {
+ const struct tracksort_data *ea = a, *eb = b;
+
+ return compare_tracks(ea->sort, eb->sort,
+ ea->display, eb->display,
+ ea->track, eb->track);
+}
+
+struct tracksort_data *tracksort_init(int ntracks,
+ char **tracks,
+ const char *type) {
+ struct tracksort_data *td = xcalloc(ntracks, sizeof *td);
+ for(int n = 0; n < ntracks; ++n) {
+ td[n].track = tracks[n];
+ td[n].sort = trackname_transform(type, tracks[n], "sort");
+ td[n].display = trackname_transform(type, tracks[n], "display");
+ }
+ qsort(td, ntracks, sizeof *td, tracksort_compare);
+ return td;
+}
+
+/*
+Local Variables:
+c-basic-offset:2
+comment-column:40
+fill-column:79
+indent-tabs-mode:nil
+End:
+*/