r1710 - trunk/src/target/OM-2007/applications/openmoko-rssreader/src

zecke at sita.openmoko.org zecke at sita.openmoko.org
Sun Apr 8 02:26:43 CEST 2007


Author: zecke
Date: 2007-04-08 02:26:43 +0200 (Sun, 08 Apr 2007)
New Revision: 1710

Modified:
   trunk/src/target/OM-2007/applications/openmoko-rssreader/src/application-data.h
   trunk/src/target/OM-2007/applications/openmoko-rssreader/src/callbacks.c
   trunk/src/target/OM-2007/applications/openmoko-rssreader/src/main.c
Log:
openmoko-rssreader: Replace the string representation of the date with RSSRFCDate
    Using a GObject for the date allows us to decouple representation to
    the user (locale aware, shortened to Today) and sorting.
    Use the sort_model for the TreeView and set a dedicated data_func and
    sort func for the date column.
    dates are sorted by zsort, and even z doesn't understand the logic
    behind this sorting.


Modified: trunk/src/target/OM-2007/applications/openmoko-rssreader/src/application-data.h
===================================================================
--- trunk/src/target/OM-2007/applications/openmoko-rssreader/src/application-data.h	2007-04-08 00:23:57 UTC (rev 1709)
+++ trunk/src/target/OM-2007/applications/openmoko-rssreader/src/application-data.h	2007-04-08 00:26:43 UTC (rev 1710)
@@ -68,7 +68,6 @@
     RSS_READER_COLUMN_AUTHOR,
     RSS_READER_COLUMN_SUBJECT,
     RSS_READER_COLUMN_DATE,
-    RSS_READER_COLUMN_DATE_GDATE,/* The date as GDate representation used for sorting     */
     RSS_READER_COLUMN_LINK,     /* Is this something like spiegel.de and only has a link */
     RSS_READER_COLUMN_TEXT,     /* Either link is NULL, or this contains the article     */
     RSS_READER_COLUMN_TEXT_TYPE,/* The Text Type of Atom feeds HTML, plain...            */

Modified: trunk/src/target/OM-2007/applications/openmoko-rssreader/src/callbacks.c
===================================================================
--- trunk/src/target/OM-2007/applications/openmoko-rssreader/src/callbacks.c	2007-04-08 00:23:57 UTC (rev 1709)
+++ trunk/src/target/OM-2007/applications/openmoko-rssreader/src/callbacks.c	2007-04-08 00:26:43 UTC (rev 1710)
@@ -28,6 +28,7 @@
 #include <glib/gi18n.h>
 
 #include "callbacks.h"
+#include "rfcdate.h"
 
 #include <mrss.h>
 #include <string.h>
@@ -139,12 +140,14 @@
             /*
              * update the model here
              */
+            RSSRFCDate *date = RSS_RFC_DATE(rss_rfc_date_new ());
+            rss_rfc_date_set (date, item->pubDate);
             gdk_threads_enter();
             gtk_list_store_append( data->feed_data, &iter );
             gtk_list_store_set   ( data->feed_data, &iter,
                                    RSS_READER_COLUMN_AUTHOR, g_strdup( item->author  ),
                                    RSS_READER_COLUMN_SUBJECT,g_strdup( item->title   ),
-                                   RSS_READER_COLUMN_DATE,   g_strdup( item->pubDate ),
+                                   RSS_READER_COLUMN_DATE,   date,
                                    RSS_READER_COLUMN_LINK,   g_strdup( item->link    ),
                                    RSS_READER_COLUMN_TEXT,   g_strdup( description   ),
                                    RSS_READER_COLUMN_TEXT_TYPE, content_type          ,

Modified: trunk/src/target/OM-2007/applications/openmoko-rssreader/src/main.c
===================================================================
--- trunk/src/target/OM-2007/applications/openmoko-rssreader/src/main.c	2007-04-08 00:23:57 UTC (rev 1709)
+++ trunk/src/target/OM-2007/applications/openmoko-rssreader/src/main.c	2007-04-08 00:26:43 UTC (rev 1710)
@@ -28,6 +28,7 @@
 
 #include "application-data.h"
 #include "callbacks.h"
+#include "rfcdate.h"
 
 #include <libmokoui/moko-details-window.h>
 
@@ -36,6 +37,34 @@
 #define ASSERT_X(x, error) assert(x)
 
 /*
+ * sort the dates according to zsort. Ideally they should sort ascending
+ */
+static gint
+rss_sort_dates (GtkTreeModel *model, GtkTreeIter *_left, GtkTreeIter *_right, gpointer that)
+{
+    RSSRFCDate *left, *right;
+    gtk_tree_model_get (model, _left,  RSS_READER_COLUMN_DATE, &left,  -1);
+    gtk_tree_model_get (model, _right, RSS_READER_COLUMN_DATE, &right, -1);
+
+    if ( left == NULL )
+        return -1;
+    else if ( right == NULL )
+        return 1;
+    else
+        return rss_rfc_date_compare (left, right);
+}
+
+static void
+rss_cell_data_func (GtkTreeViewColumn *tree_column, GtkCellRenderer *renderer, GtkTreeModel *tree_model, GtkTreeIter *iter, gpointer data)
+{
+    RSSRFCDate *date;
+    gtk_tree_model_get (tree_model, iter, RSS_READER_COLUMN_DATE, &date, -1);
+
+    g_assert (date);
+    g_object_set ( G_OBJECT(renderer), "text", rss_rfc_date_as_string(date), NULL);
+}
+
+/*
  * setup the toolbar
  */
 static void setup_toolbar( struct RSSReaderData *data ) {
@@ -69,8 +98,7 @@
     data->feed_data = gtk_list_store_new( RSS_READER_NUM_COLS,
                                           G_TYPE_STRING /* Author    */,
                                           G_TYPE_STRING /* Subject   */,
-                                          G_TYPE_STRING /* The actual string */,
-                                          G_TYPE_DATE   /* Date GDate*/,
+                                          RSS_TYPE_RFC_DATE /* Date  */,
                                           G_TYPE_STRING /* Link      */,
                                           G_TYPE_STRING /* Text      */,
                                           G_TYPE_INT    /* Text_Type */,
@@ -86,10 +114,10 @@
      * Allow sorting of the base model
      */
     data->sort_model = GTK_TREE_MODEL_SORT(gtk_tree_model_sort_new_with_model( GTK_TREE_MODEL(data->filter_model) ));
-    gtk_tree_sortable_set_sort_column_id( GTK_TREE_SORTABLE(data->sort_model), RSS_READER_COLUMN_SUBJECT, GTK_SORT_ASCENDING );
     gtk_tree_sortable_set_sort_column_id( GTK_TREE_SORTABLE(data->sort_model), RSS_READER_COLUMN_DATE,    GTK_SORT_ASCENDING );
+    gtk_tree_sortable_set_sort_func ( GTK_TREE_SORTABLE(data->sort_model), RSS_READER_COLUMN_DATE, rss_sort_dates, NULL, NULL);
 
-    data->treeView = MOKO_TREE_VIEW(moko_tree_view_new_with_model(GTK_TREE_MODEL(data->feed_data)));
+    data->treeView = MOKO_TREE_VIEW(moko_tree_view_new_with_model(GTK_TREE_MODEL(data->sort_model)));
     moko_paned_window_set_upper_pane( MOKO_PANED_WINDOW(data->window), GTK_WIDGET(moko_tree_view_put_into_scrolled_window(data->treeView)) );
 
     /*
@@ -105,7 +133,9 @@
     moko_tree_view_append_column( MOKO_TREE_VIEW(data->treeView), column );
 
     ren = GTK_CELL_RENDERER(gtk_cell_renderer_text_new());
-    column = GTK_TREE_VIEW_COLUMN(gtk_tree_view_column_new_with_attributes( _("Date"), ren, "text", RSS_READER_COLUMN_DATE, NULL));
+    column = GTK_TREE_VIEW_COLUMN(gtk_tree_view_column_new_with_attributes( _("Date"), ren, NULL));
+
+    gtk_tree_view_column_set_cell_data_func (column, ren, rss_cell_data_func, NULL, NULL);
     gtk_tree_view_column_set_expand( column, TRUE );
     gtk_tree_view_column_set_sizing( column, GTK_TREE_VIEW_COLUMN_FIXED );
     gtk_tree_view_column_set_sort_column_id( column, RSS_READER_COLUMN_DATE );
@@ -120,7 +150,6 @@
     GtkWidget *search_entry = GTK_WIDGET(moko_tool_box_get_entry(MOKO_TOOL_BOX(data->box)));
     g_signal_connect( G_OBJECT(data->treeView), "key_press_event", G_CALLBACK(cb_treeview_keypress_event), data );
     g_signal_connect( G_OBJECT(search_entry),   "changed", G_CALLBACK(cb_search_entry_changed), data );
-
 }
 
 static void create_details_area( struct RSSReaderData* data ) {





More information about the commitlog mailing list