[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