[mednaffe] 06/99: Sort using qsort() instead gtk default
Stephen Kitt
skitt at moszumanska.debian.org
Tue Aug 2 20:59:59 UTC 2016
This is an automated email from the git hooks/post-receive script.
skitt pushed a commit to branch master
in repository mednaffe.
commit 34c545b83c2adfff07db1a89d1b6956939ffe10d
Author: amatcoder <amatcoder at 44025b82-9115-564b-7d03-7f3fc60b4744>
Date: Sat Sep 7 20:23:22 2013 +0000
Sort using qsort() instead gtk default
---
src/common.h | 2 +
src/list.c | 168 +++++++++++++++++++++++++++++++++++++++------------
src/mednaffe.c | 6 ++
src/mednaffe_glade.h | 29 ++++-----
4 files changed, 154 insertions(+), 51 deletions(-)
diff --git a/src/common.h b/src/common.h
index bf75915..fb74d5c 100644
--- a/src/common.h
+++ b/src/common.h
@@ -40,6 +40,8 @@ typedef struct
GtkTreeViewColumn *column;
GtkListStore *store;
gboolean recursive;
+ gchar **list;
+ gint n_items;
gchar *binpath;
gchar *fullpath;
gchar *rompath;
diff --git a/src/list.c b/src/list.c
index 57367a0..14c4c01 100644
--- a/src/list.c
+++ b/src/list.c
@@ -21,26 +21,20 @@
*/
#include "common.h"
+#include <stdlib.h>
void change_list (guidata *gui)
{
GtkAdjustment *adjustament;
gchar *buff, *total;
- gint n_roms = 0;
- n_roms =
- gtk_tree_model_iter_n_children(GTK_TREE_MODEL(gui->store), NULL);
-
- buff=g_strdup_printf("%i", n_roms);
+ buff=g_strdup_printf("%i", gui->n_items);
total = g_strconcat(" Games in list: ", buff, NULL);
gtk_statusbar_pop(GTK_STATUSBAR(gui->sbnumber), 1);
gtk_statusbar_push(GTK_STATUSBAR(gui->sbnumber), 1, total);
g_free(total);
g_free(buff);
- gtk_tree_view_set_model(GTK_TREE_VIEW(gui->gamelist),
- GTK_TREE_MODEL(gui->store));
-
adjustament =
gtk_scrolled_window_get_vadjustment(
GTK_SCROLLED_WINDOW(gui->scrollwindow));
@@ -141,12 +135,26 @@ void open_folder(GtkWidget *sender, guidata *gui)
gtk_widget_destroy(folder);
}
-void scan_dir(gchar *romdir, guidata *gui)
+int descend_sort(const void * a, const void * b)
+{
+ const char *c = *(const char **) a;
+ const char *d = *(const char **) b;
+
+ return g_strcmp0(d, c);
+}
+
+int ascend_sort(const void * a, const void * b)
+{
+ const char *c = *(const char **) a;
+ const char *d = *(const char **) b;
+
+ return g_strcmp0(c, d);
+}
+
+gint count_items(gchar *romdir, gint n_items, gboolean recursive)
{
- GtkTreeIter iter;
- gboolean filterzip, filtercue;
GDir *dir = NULL;
-
+
dir = g_dir_open(romdir, 0, NULL);
if (dir != NULL)
@@ -156,36 +164,123 @@ void scan_dir(gchar *romdir, guidata *gui)
while ((file=g_dir_read_name(dir)) != NULL)
{
gchar *testdir = NULL;
+
+ testdir = g_strconcat(romdir, G_DIR_SEPARATOR_S, file, NULL);
+
+ if (!g_file_test (testdir, G_FILE_TEST_IS_DIR))
+ n_items++;
+ else
+ if (recursive)
+ n_items = count_items(testdir, n_items, TRUE);
+
+ g_free(testdir);
+ }
+ g_dir_close(dir);
+ }
+
+ return n_items;
+}
+
+gint scan_files(gchar *romdir, gchar **list, gint i, gboolean recursive)
+{
+ GDir *dir = NULL;
+
+ dir = g_dir_open(romdir, 0, NULL);
+
+ if (dir != NULL)
+ {
+ const gchar *file = NULL;
+
+ while ((file=g_dir_read_name(dir)) != NULL)
+ {
+ gchar *testdir = NULL;
testdir = g_strconcat(romdir, G_DIR_SEPARATOR_S, file, NULL);
if (!g_file_test (testdir, G_FILE_TEST_IS_DIR))
- {
- filterzip = (g_str_has_suffix(file, ".zip") ||
- g_str_has_suffix(file, ".ZIP"));
-
- filtercue = (g_str_has_suffix(file, ".cue") ||
- g_str_has_suffix(file, ".toc") ||
- g_str_has_suffix(file, ".m3u") ||
- g_str_has_suffix(file, ".CUE") ||
- g_str_has_suffix(file, ".TOC") ||
- g_str_has_suffix(file, ".M3U"));
-
- gtk_list_store_insert_with_values(gui->store, &iter, -1,
- 0, file,
- 1, filterzip,
- 2, filtercue,
- 3, testdir, -1);
+ {
+ list[i] = g_strconcat(file,G_DIR_SEPARATOR_S,testdir, NULL);
+ i++;
}
else
{
- if (gui->recursive)
- scan_dir(testdir,gui);
+ if (recursive)
+ i = scan_files(testdir, list, i, TRUE);
}
g_free(testdir);
}
g_dir_close(dir);
}
+ return i;
+}
+
+void populate_list(guidata *gui)
+{
+ GtkTreeIter iter;
+ gboolean filterzip, filtercue;
+ gint i = 0;
+
+ if (gtk_tree_view_column_get_sort_order(gui->column) == GTK_SORT_ASCENDING)
+ qsort (gui->list, gui->n_items, sizeof(char*), ascend_sort);
+ else
+ qsort (gui->list, gui->n_items, sizeof(char*), descend_sort);
+
+ while (gui->list[i])
+ {
+ gchar **str;
+
+ str = g_strsplit (gui->list[i], G_DIR_SEPARATOR_S, 2);
+
+ filterzip = (g_str_has_suffix(str[0], ".zip") ||
+ g_str_has_suffix(str[0], ".ZIP"));
+ if (filterzip)
+ filtercue = FALSE;
+ else
+ filtercue = (g_str_has_suffix(str[0], ".cue") ||
+ g_str_has_suffix(str[0], ".toc") ||
+ g_str_has_suffix(str[0], ".m3u") ||
+ g_str_has_suffix(str[0], ".CUE") ||
+ g_str_has_suffix(str[0], ".TOC") ||
+ g_str_has_suffix(str[0], ".M3U"));
+
+ gtk_list_store_insert_with_values(gui->store, &iter, -1,
+ 0, str[0], 1, filterzip,
+ 2, filtercue, 3,str[1], -1);
+ i++;
+ g_strfreev(str);
+ }
+}
+
+void scan_dir(gchar *romdir, guidata *gui)
+{
+ gint i;
+
+ gui->n_items = count_items(romdir, 0, gui->recursive);
+ if (gui->list != NULL) g_strfreev(gui->list);
+ gui->list = g_new(gchar*, gui->n_items+1);
+ i = scan_files(romdir, gui->list, 0, gui->recursive);
+ gui->list [i]= NULL;
+ populate_list(gui);
+}
+
+#ifdef G_OS_WIN32
+G_MODULE_EXPORT
+#endif
+void header_clicked(GtkTreeViewColumn *treeviewcolumn, guidata *gui)
+{
+ if (gtk_tree_view_column_get_sort_order(gui->column) == GTK_SORT_ASCENDING)
+ gtk_tree_view_column_set_sort_order(gui->column, GTK_SORT_DESCENDING);
+ else
+ gtk_tree_view_column_set_sort_order(gui->column, GTK_SORT_ASCENDING);
+
+ gtk_tree_view_set_model(GTK_TREE_VIEW(gui->gamelist), NULL);
+ gtk_list_store_clear(gui->store);
+ populate_list(gui);
+ gtk_tree_view_set_model(GTK_TREE_VIEW(gui->gamelist),
+ GTK_TREE_MODEL(gui->store));
+
+ change_list(gui);
+ gtk_tree_view_column_set_sort_indicator(gui->column, TRUE);
}
#ifdef G_OS_WIN32
@@ -201,9 +296,6 @@ void fill_list(GtkComboBox *combobox, guidata *gui)
model=gtk_combo_box_get_model(GTK_COMBO_BOX(gui->cbpath));
gtk_tree_view_set_model(GTK_TREE_VIEW(gui->gamelist), NULL);
- gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(gui->store),
- GTK_TREE_SORTABLE_UNSORTED_SORT_COLUMN_ID, GTK_SORT_ASCENDING);
-
gtk_list_store_clear(gui->store);
if (gtk_combo_box_get_active_iter(GTK_COMBO_BOX(gui->cbpath), &iter))
@@ -211,11 +303,11 @@ void fill_list(GtkComboBox *combobox, guidata *gui)
g_free(gui->rompath);
gtk_tree_model_get(model, &iter, 0 ,&gui->rompath, -1);
-
if (gui->rompath!=NULL)
scan_dir(gui->rompath, gui);
-
- gtk_tree_view_column_set_sort_column_id(gui->column, 0);
+
+ gtk_tree_view_set_model(GTK_TREE_VIEW(gui->gamelist),
+ GTK_TREE_MODEL(gui->store));
change_list(gui);
if (gtk_tree_model_get_iter_first(gtk_tree_view_get_model(
@@ -224,7 +316,9 @@ void fill_list(GtkComboBox *combobox, guidata *gui)
gtk_tree_selection_select_iter(gtk_tree_view_get_selection(
GTK_TREE_VIEW(gui->gamelist)), &iter);
}
- }
+ }
+ gtk_tree_view_column_set_sort_indicator(gui->column, TRUE);
+
end = clock();
printf( "CPU time taken to populate list: %f\n",
diff --git a/src/mednaffe.c b/src/mednaffe.c
index 8b9efc5..045c7d9 100644
--- a/src/mednaffe.c
+++ b/src/mednaffe.c
@@ -239,6 +239,7 @@ void quit(GObject *object, guidata *gui)
g_free(gui->rompath);
g_free(gui->rom);
g_free(gui->system);
+ g_strfreev(gui->list);
gtk_main_quit();
}
@@ -519,9 +520,14 @@ int main(int argc, char **argv)
GTK_TREE_VIEW(gui.gamelist), GTK_TREE_MODEL(gui.store));
gui.column = gtk_tree_view_get_column(GTK_TREE_VIEW(gui.gamelist), 0);
+ gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(gui.store),
+ GTK_TREE_SORTABLE_UNSORTED_SORT_COLUMN_ID, GTK_SORT_ASCENDING);
+
/* Set initial values */
gui.recursive = FALSE;
+ gui.list = NULL;
+ gui.n_items = 0;
gui.state = 0;
gui.executing = FALSE;
gui.fullpath = NULL;
diff --git a/src/mednaffe_glade.h b/src/mednaffe_glade.h
index b621bd0..d3a7b5b 100644
--- a/src/mednaffe_glade.h
+++ b/src/mednaffe_glade.h
@@ -28,20 +28,6 @@ static const char *mednaffe_glade =
"<interface>\n"
"<requires lib=\"gtk+\" version=\"2.18\"/>\n"
"<!-- interface-naming-policy toplevel-contextual -->\n"
-"<object class=\"GtkAdjustment\" id=\"adjyscale\">\n"
-"<property name=\"lower\">0.01</property>\n"
-"<property name=\"upper\">256</property>\n"
-"<property name=\"value\">0.0099999997764825821</property>\n"
-"<property name=\"step_increment\">0.01</property>\n"
-"<property name=\"page_increment\">1</property>\n"
-"</object>\n"
-"<object class=\"GtkAdjustment\" id=\"adjyscalefs\">\n"
-"<property name=\"lower\">0.01</property>\n"
-"<property name=\"upper\">256</property>\n"
-"<property name=\"value\">1</property>\n"
-"<property name=\"step_increment\">0.01</property>\n"
-"<property name=\"page_increment\">1</property>\n"
-"</object>\n"
"<object class=\"GtkImage\" id=\"add_image\">\n"
"<property name=\"visible\">True</property>\n"
"<property name=\"can_focus\">False</property>\n"
@@ -225,6 +211,20 @@ static const char *mednaffe_glade =
"<property name=\"step_increment\">0.01</property>\n"
"<property name=\"page_increment\">1</property>\n"
"</object>\n"
+"<object class=\"GtkAdjustment\" id=\"adjyscale\">\n"
+"<property name=\"lower\">0.01</property>\n"
+"<property name=\"upper\">256</property>\n"
+"<property name=\"value\">0.0099999997764825821</property>\n"
+"<property name=\"step_increment\">0.01</property>\n"
+"<property name=\"page_increment\">1</property>\n"
+"</object>\n"
+"<object class=\"GtkAdjustment\" id=\"adjyscalefs\">\n"
+"<property name=\"lower\">0.01</property>\n"
+"<property name=\"upper\">256</property>\n"
+"<property name=\"value\">1</property>\n"
+"<property name=\"step_increment\">0.01</property>\n"
+"<property name=\"page_increment\">1</property>\n"
+"</object>\n"
"<object class=\"GtkAdjustment\" id=\"adyres\">\n"
"<property name=\"upper\">65536</property>\n"
"<property name=\"step_increment\">1</property>\n"
@@ -906,6 +906,7 @@ static const char *mednaffe_glade =
"<child>\n"
"<object class=\"GtkTreeViewColumn\" id=\"treeviewcolumn1\">\n"
"<property name=\"clickable\">True</property>\n"
+"<signal name=\"clicked\" handler=\"header_clicked\" swapped=\"no\"/>\n"
"<child>\n"
"<object class=\"GtkCellRendererText\" id=\"cellrenderertext12\"/>\n"
"<attributes>\n"
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-games/mednaffe.git
More information about the Pkg-games-commits
mailing list