fix warning
[belltower] / belltower.c
index 8c66db2..42e65d7 100644 (file)
@@ -48,6 +48,7 @@ char *towersort_settings[] = {
   "Name of town",
   "Distance from you",
   "Days until practice night",
+  "Number of bells",
   "Weight of tenor",
   NULL
 };
@@ -73,6 +74,7 @@ typedef enum {
   TOWERSORT_TOWN,
   TOWERSORT_DISTANCE,
   TOWERSORT_PRACTICE,
+  TOWERSORT_BELLS,
   TOWERSORT_WEIGHT
 } TowersortSetting;
 
@@ -279,6 +281,43 @@ distance_to_tower_str (tower *details)
     }
 }
 
+/**
+ * Returns the number of days from today until
+ * the tower's practice night.  If the tower's
+ * practice night is unknown, returns 9: this
+ * means that such towers always sort to the end.
+ */
+static gint
+days_until_practice_night (tower *details)
+{
+  /* let's not use the date parsing routines, because
+   * we might get confused by locales, and the day names
+   * used in Dove are constant
+   */
+  time_t now = time (NULL);
+  struct tm *calendar = localtime (&now);
+  const char* dove_days = "SunMonTueWedThuFriSat";
+  char *found;
+  gint practice_night;
+
+  if (strcmp (details->fields[FieldPracticeNight], "")==0)
+    {
+      /* we don't know */
+      return 9;
+    }
+
+  found = strstr (dove_days, details->fields[FieldPracticeNight]);
+
+  if (!found)
+    {
+      return 9;
+    }
+
+  practice_night = (found-dove_days)/3;
+
+  return ((practice_night+7)-calendar->tm_wday)%7;
+}
+
 static void
 call_dbus (DBusBusType type,
           char *name,
@@ -791,14 +830,24 @@ found_tower_new (tower *basis)
   switch (settings_value[SETTINGS_TOWERSORT])
     {
     case TOWERSORT_DISTANCE:
-      /* ... */
+      result->sortkey = g_strdup_printf ("%5d %s",
+                                        distance_to_tower (basis),
+                                        basis->fields[FieldPlace]);
+      break;
     case TOWERSORT_PRACTICE:
-      /* ... */
+      result->sortkey = g_strdup_printf ("%d %s",
+                                        days_until_practice_night (basis),
+                                        basis->fields[FieldPlace]);
+      break;
+    case TOWERSORT_BELLS:
+      result->sortkey = g_strdup_printf ("%10s", basis->fields[FieldBells]);
+      break;
     case TOWERSORT_WEIGHT:
-      /* ... */
+      result->sortkey = g_strdup_printf ("%10s", basis->fields[FieldWt]);
+      break;
     case TOWERSORT_TOWN:
     default:
-      result->sortkey = g_strdup (basis->fields[FieldPrimaryKey]);
+      result->sortkey = g_strdup (basis->fields[FieldPlace]);
     }
 
   result->primarykey = g_strdup (basis->fields[FieldPrimaryKey]);
@@ -836,6 +885,21 @@ found_tower_free (FoundTower *tower)
 }
 
 /**
+ * Comparison function for FoundTower objects.
+ *
+ * \param a   a FoundTower
+ * \param b   another FoundTower
+ */
+gint found_tower_compare (gconstpointer a,
+                         gconstpointer b)
+{
+  FoundTower *fta = (FoundTower *)a;
+  FoundTower *ftb = (FoundTower *)b;
+
+  return strcmp (fta->sortkey, ftb->sortkey);
+}
+
+/**
  * Calls a given function once for each tower in the world.
  * (The first call, however, is a header row.)
  *
@@ -907,8 +971,9 @@ parse_dove (ParseDoveCallback callback,
          return;
 
        case FILTER_ACCEPT:
-         filter_results = g_slist_append (filter_results,
-                                          found_tower_new (&result));
+         filter_results = g_slist_insert_sorted (filter_results,
+                                                 found_tower_new (&result),
+                                                 found_tower_compare);
        }
 
       result.serial++;
@@ -1388,8 +1453,7 @@ show_credits (GtkButton *source,
 }
 
 static void
-settings_dialogue (GtkButton *source,
-                  gpointer dummy)
+settings_dialogue (void)
 {
   GtkWidget *dialog, *button;
   GtkWidget *selector[G_N_ELEMENTS (settings)];
@@ -1423,7 +1487,7 @@ settings_dialogue (GtkButton *source,
                          TRUE, TRUE, 0);
     }
 
-  gtk_widget_show_all (GTK_WIDGET (dialog));  
+  gtk_widget_show_all (GTK_WIDGET (GTK_DIALOG(dialog)->vbox));  
   gtk_dialog_run (GTK_DIALOG (dialog));
 
   for (i=0; i<G_N_ELEMENTS (settings); i++)
@@ -1470,7 +1534,11 @@ main(int argc, char **argv)
   add_button ("Bookmarks", show_bookmarks);
   add_button ("By area", towers_by_area);
   add_button ("Search", tower_search);
-  add_button ("(temp) settings", settings_dialogue);
+  /* This won't be a button on the main screen
+   * for always, but we'll put it there for now
+   * to work around a hildon bug.
+   */
+  add_button ("Settings", settings_dialogue);
 
   /* extra buttons for the app menu */
   button = gtk_button_new_with_label ("Credits");