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

zecke at sita.openmoko.org zecke at sita.openmoko.org
Fri Apr 13 01:35:33 CEST 2007


Author: zecke
Date: 2007-04-13 01:35:33 +0200 (Fri, 13 Apr 2007)
New Revision: 1735

Modified:
   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: Implement as-you-type filtering on RSS articles
    Use the search bar to filter items on the fly. Fix the refcounting
    when using _get of the GtkTreeModel.


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-12 21:55:28 UTC (rev 1734)
+++ trunk/src/target/OM-2007/applications/openmoko-rssreader/src/callbacks.c	2007-04-12 23:35:33 UTC (rev 1735)
@@ -208,8 +208,6 @@
     }
 
 }
-void cb_searchbox_visible( MokoToolBox *box, struct RSSReaderData *data ) {}
-void cb_searchbox_invisible( MokoToolBox *box, struct RSSReaderData *data ) {}
 
 /*
  * TODO: Update the text and make it rich text.
@@ -235,6 +233,31 @@
     }
 }
 
-gboolean cb_treeview_keypress_event( GtkWidget *entry, GdkEventKey *key, struct RSSReaderData *data ) { return TRUE; }
-void cb_search_entry_changed      ( GtkWidget *entry, struct RSSReaderData *data ) {}
+/*
+ * search functionality
+ */
+void cb_searchbox_visible( MokoToolBox *box, struct RSSReaderData *data ) {
+    cb_search_entry_changed (moko_tool_box_get_entry (box), data);
+}
 
+void cb_searchbox_invisible( MokoToolBox *box, struct RSSReaderData *data ) {
+    if ( data->current_search_text ) {
+        g_free (data->current_search_text);
+        data->current_search_text = NULL;
+    }
+
+    filter_feeds (data);
+}
+
+gboolean cb_treeview_keypress_event( GtkWidget *entry, GdkEventKey *key, struct RSSReaderData *data ) {
+    return TRUE;
+}
+
+void cb_search_entry_changed      ( GtkWidget *entry, struct RSSReaderData *data ) {
+    if ( data->current_search_text )
+        g_free (data->current_search_text);
+
+    data->current_search_text = g_strdup (gtk_entry_get_text (GTK_ENTRY(entry)));
+    filter_feeds (data);
+}
+

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-12 21:55:28 UTC (rev 1734)
+++ trunk/src/target/OM-2007/applications/openmoko-rssreader/src/main.c	2007-04-12 23:35:33 UTC (rev 1735)
@@ -23,6 +23,7 @@
  *
  *  Current Version: $Rev$ ($Date$) [$Author$]
  */
+#define _GNU_SOURCE
 #include "config.h"
 #include <glib/gi18n.h>
 
@@ -50,16 +51,42 @@
         gchar *category;
         gtk_tree_model_get (model, iter,  RSS_READER_COLUMN_CATEGORY, &category,  -1);
 
+        /*
+         * how does this happen?
+         */
+        if ( !category )
+            return FALSE;
 
         if ( strcmp(category, data->current_filter) != 0 )
             return FALSE;
+
+        g_free (category);
     }
 
 
     /*
      * filter the text according to the search now
      */
+    if ( data->current_search_text ) {
+        gchar *text;
 
+        #define FILTER_SEARCH(column)                                      \
+        gtk_tree_model_get (model, iter, column, &text, -1);               \
+        if ( text && strcasestr (text, data->current_search_text) != NULL ) { \
+            g_free (text);                                                 \
+            return TRUE;                                                   \
+        }
+
+        FILTER_SEARCH(RSS_READER_COLUMN_AUTHOR)
+        FILTER_SEARCH(RSS_READER_COLUMN_SUBJECT)
+        FILTER_SEARCH(RSS_READER_COLUMN_SOURCE)
+        FILTER_SEARCH(RSS_READER_COLUMN_LINK)
+        FILTER_SEARCH(RSS_READER_COLUMN_TEXT)
+
+        #undef FILTER_SEARCH
+        return FALSE;
+    }
+
     return TRUE;
 }
 
@@ -73,12 +100,20 @@
     gtk_tree_model_get (model, _left,  RSS_READER_COLUMN_DATE, &left,  -1);
     gtk_tree_model_get (model, _right, RSS_READER_COLUMN_DATE, &right, -1);
 
+    int result;
     if ( left == NULL )
-        return -1;
+        result = -1;
     else if ( right == NULL )
-        return 1;
+        result = 1;
     else
-        return rss_rfc_date_compare (left, right);
+        result = rss_rfc_date_compare (left, right);
+
+    if ( left )
+        g_object_unref (left);
+    if ( right )
+        g_object_unref (right);
+
+    return result;
 }
 
 static void
@@ -89,6 +124,7 @@
 
     g_assert (date);
     g_object_set ( G_OBJECT(renderer), "text", rss_rfc_date_as_string(date), NULL);
+    g_object_unref (G_OBJECT(date));
 }
 
 /*





More information about the commitlog mailing list