Changeset 2623
- Timestamp:
- 08/03/07 16:17:18 (6 years ago)
- Location:
- trunk/src/target/OM-2007.2/applications/openmoko-feedreader2
- Files:
-
- 3 added
- 7 edited
-
ChangeLog (modified) (1 diff)
-
src (modified) (1 prop)
-
src/Makefile.am (modified) (1 diff)
-
src/application-data.h (modified) (1 diff)
-
src/feed-configuration.c (added)
-
src/feed-configuration.h (modified) (3 diffs)
-
src/feed-data.c (added)
-
src/feed-data.h (modified) (2 diffs)
-
src/feed-selection-view.h (added)
-
src/main.c (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/target/OM-2007.2/applications/openmoko-feedreader2/ChangeLog
r2593 r2623 1 2007-08-03 Holger Hans Peter Freyther <zecke@selfish.org> 2 3 Start creating the feedreader2, as with every second version 4 there might be some over-engineering but as I'm aware of this 5 phenomena I try to avoid the bad things. 6 7 Start with creating a Configuration model and the actual FeedData 8 model. The implementation will be copied and pasted from main.c 9 and callback.c 10 11 Make main.c start to follow the new styleguide and use GtkNotebook 12 as well. For icons I would like to use but are not available in 13 GtkStock (like configuration) I'm going to use MISSING_IMAGE as well. 14 15 16 17 * src/Makefile.am: 18 * src/application-data.h: 19 * src/feed-configuration.c: Added. 20 (feed_configuration_class_init): 21 (feed_configuration_init): 22 (feed_configuration_get_configuration): 23 * src/feed-configuration.h: 24 * src/feed-data.c: Added. 25 (feed_data_init): 26 (feed_data_class_init): 27 (feed_filter_init): 28 (feed_filter_class_init): 29 (feed_sort_init): 30 (feed_sort_class_init): 31 (feed_data_get_instance): 32 (feed_data_update_all): 33 (feed_data_set_cache): 34 (feed_data_load_from_cache): 35 (feed_filter_new): 36 (feed_filter_reset): 37 (feed_filter_filter_category): 38 (feed_filter_filter_text): 39 (feed_sort_new): 40 * src/feed-data.h: 41 * src/feed-selection-view.h: Added. 42 * src/main.c: 43 (window_delete_event): 44 (config_new_clicked_closure): 45 (config_delete_clicked_closure): 46 (create_configuration_ui): 47 (create_ui): 48 (main): 49 1 50 2007-08-01 Holger Hans Peter Freyther <zecke@selfish.org> 2 51 -
trunk/src/target/OM-2007.2/applications/openmoko-feedreader2/src
- Property svn:ignore
-
old new 5 5 .libs 6 6 .deps 7 openmoko- rssreader7 openmoko-feedreader22
-
- Property svn:ignore
-
trunk/src/target/OM-2007.2/applications/openmoko-feedreader2/src/Makefile.am
r2574 r2623 8 8 bin_PROGRAMS = openmoko-feedreader2 9 9 10 EXTRA_DIST = application-data.h callbacks.h rfcdate.h moko_cache.h10 EXTRA_DIST = rfcdate.h moko_cache.h feed-configuration.h feed-data.h feed-item-view.h feed-selection-view.h application-data.h 11 11 12 openmoko_feedreader2_SOURCES = main.c callbacks.c rfcdate.c moko_cache.c12 openmoko_feedreader2_SOURCES = feed-configuration.c feed-data.c rfcdate.c moko_cache.c main.c 13 13 openmoko_feedreader2_LDADD = @OPENMOKO_LIBS@ @MRSS_LIBS@ @GTHREAD_LIBS@ @WEBKITGTK_LIBS@ 14 14 -
trunk/src/target/OM-2007.2/applications/openmoko-feedreader2/src/application-data.h
r2386 r2623 28 28 #define APPLICATION_DATA_H 29 29 30 31 #include <libmokoui/moko-application.h>32 #include <libmokoui/moko-paned-window.h>33 #include <libmokoui/moko-tree-view.h>34 #include <libmokoui/moko-tool-box.h>35 36 #include <webkitgtkpage.h>37 38 30 #include "moko_cache.h" 39 40 31 #include <gtk/gtk.h> 41 32 42 struct RSSReaderData {43 MokoApplication *app;33 struct ApplicationData { 34 GtkWindow *window; 44 35 MokoCache *cache; 45 GtkMenu *menu; 46 GtkMenu *filter; 47 MokoPanedWindow *window; 48 MokoToolBox *box; 49 MokoMenuBox *menubox; 50 51 52 MokoTreeView *treeView; 53 GtkListStore *feed_data; 54 GtkTreeModelFilter *filter_model; 55 GtkTreeModelSort *sort_model; 56 57 WebKitGtkPage *textPage; 58 59 gchar *current_filter; 60 int is_all_filter; 61 gchar *current_search_text; 36 GtkNotebook *notebook; 62 37 }; 63 38 -
trunk/src/target/OM-2007.2/applications/openmoko-feedreader2/src/feed-configuration.h
r2593 r2623 37 37 G_BEGIN_DECLS 38 38 39 #define RSS_TYPE_FEED feed_get_type()40 39 #define RSS_TYPE_FEED_CONFIGURATION feed_configuration_get_type() 41 40 #define RSS_FEED_CONFIGURATION(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), RSS_TYPE_FEED_CONFIGURATION, FeedConfiguration)) … … 45 44 #define RSS_FEED_CONFIGURATION_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), RSS_TYPE_FEED_CONFIGURATION, FeedConfigurationClass)) 46 45 47 typedef struct _Feed Feed;48 49 46 typedef struct _FeedConfiguration FeedConfiguration; 50 47 typedef struct _FeedConfigurationClass FeedConfigurationClass; 51 48 52 struct _Feed { 53 gchar* name; 54 gchar* url; 55 gchar* user_name; 56 gchar* password; 57 gint number_of_items_to_cache; 49 enum { 50 FEED_NAME, 51 FEED_URL, 52 FEED_USER_NAME, 53 FEED_PASSWORD, 54 FEED_NUMBER_OF_ITEMS_TO_CACHE, 55 FEED_NUMBER_OF_COLUMNS 58 56 }; 59 60 57 61 58 struct _FeedConfiguration { … … 68 65 69 66 70 GType feed_get_type (void); 71 Feed* feed_copy (const Feed*); 72 void feed_free (Feed*); 73 74 75 GType feed_configuration_get_type (void); 67 GType feed_configuration_get_type (void); 76 68 77 69 /* 78 70 * singleton 79 71 */ 80 GObject* feed_configuration_get_configuration (void),72 GObject* feed_configuration_get_configuration (void); 81 73 82 74 G_END_DECLS -
trunk/src/target/OM-2007.2/applications/openmoko-feedreader2/src/feed-data.h
r2593 r2623 34 34 #define RSS_READER_FEED_DATA_H 35 35 36 #include "feed-configuration.h" 36 #include <gtk/gtk.h> 37 #include "moko_cache.h" 37 38 38 39 G_BEGIN_DECLS 39 40 40 #define RSS_TYPE_FEED_DATA feed_data_get_type()41 #define RSS_FEED_DATA(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), RSS_TYPE_FEED_DATA, FeedData))42 #define RSS_FEED_DATA_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), RSS_TYPE_FEED_DATA, FeedDataClass))43 #define RSS_IS_FEED_DATA(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), RSS_TYPE_FEED_DATA))44 #define RSS_IS_FEED_DATA_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), RSS_TYPE_FEED_DATA))45 #define RSS_FEED_DATA_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), RSS_TYPE_FEED_DATA, FeedDataClass))41 #define RSS_TYPE_FEED_DATA feed_data_get_type() 42 #define RSS_FEED_DATA(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), RSS_TYPE_FEED_DATA, FeedData)) 43 #define RSS_FEED_DATA_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), RSS_TYPE_FEED_DATA, FeedDataClass)) 44 #define RSS_IS_FEED_DATA(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), RSS_TYPE_FEED_DATA)) 45 #define RSS_IS_FEED_DATA_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), RSS_TYPE_FEED_DATA)) 46 #define RSS_FEED_DATA_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), RSS_TYPE_FEED_DATA, FeedDataClass)) 46 47 47 #define RSS_TYPE_FEED_FILTER feed_filter_get_type() 48 #define RSS_TYPE_FEED_SORTER feed_sorter_get_type() 48 #define RSS_TYPE_FEED_FILTER feed_filter_get_type() 49 #define RSS_FEED_FILTER(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), RSS_TYPE_FEED_FILTER, FeedFilter)) 50 #define RSS_FEED_FILTER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), RSS_TYPE_FEED_FILTER, FeedFilterClass)) 51 #define RSS_IS_FEED_FILTER(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), RSS_TYPE_FEED_FILTER)) 52 #define RSS_IS_FEED_FILTER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), RSS_TYPE_FEED_FILTER)) 53 #define RSS_FEED_FILTER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), RSS_TYPE_FEED_FILTER, FeedFilterClass)) 54 55 56 57 #define RSS_TYPE_FEED_SORT feed_sort_get_type() 58 #define RSS_FEED_SORT(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), RSS_TYPE_FEED_SORT, FeedSort)) 59 #define RSS_FEED_SORT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), RSS_TYPE_FEED_SORT, FeedSortClass)) 60 #define RSS_IS_FEED_SORT(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), RSS_TYPE_FEED_SORT)) 61 #define RSS_IS_FEED_SORT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), RSS_TYPE_FEED_SORT)) 62 #define RSS_FEED_SORT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), RSS_TYPE_FEED_SORT, FeedSortClass)) 49 63 50 64 typedef struct _FeedData FeedData; 51 65 typedef struct _FeedDataClass FeedDataClass; 66 typedef struct _FeedFilter FeedFilter; 67 typedef struct _FeedFilterClass FeedFilterClass; 68 typedef struct _FeedSort FeedSort; 69 typedef struct _FeedSortClass FeedSortClass; 52 70 53 71 struct _FeedData { 54 72 GtkListStore parent; 73 MokoCache *cache; 55 74 }; 56 75 57 76 struct _FeedDataClass { 58 77 GtkListStoreClass parent; 78 }; 79 80 struct _FeedFilter { 81 GtkTreeModelFilter parent; 82 83 /* 84 * Do we have a filter set at all? 85 */ 86 gboolean all_filter; 87 88 /* 89 * The category to filter. Coming from the feed-configuration 90 */ 91 gchar *category; 92 93 /* 94 * The filter string. 95 */ 96 gchar *filter_string; 97 }; 98 99 struct _FeedFilterClass { 100 GtkTreeModelFilterClass parent; 101 }; 102 103 struct _FeedSort { 104 GtkTreeModelSort parent; 105 }; 106 107 struct _FeedSortClass { 108 GtkTreeModelSortClass parent; 59 109 }; 60 110 … … 64 114 65 115 void feed_data_update_all (FeedData*); 66 void feed_data_update (FeedData*, Feed*); 116 void feed_data_set_cache (FeedData*, MokoCache*); 117 void feed_data_load_from_cache (FeedData*); 67 118 68 119 69 120 GType feed_filter_get_type (void); 70 GObject* feed_filter_new (const FeedFilter*); 71 void feed_filter_reset (const FeedFilter*); 72 void feed_filter_filter (const FeedFilter*, const Feed*); 121 GObject* feed_filter_new (const FeedData*); 122 void feed_filter_reset (FeedFilter*); 123 void feed_filter_filter_category (FeedFilter*, GtkTreeIter*); 124 void feed_filter_filter_text (FeedFilter*, const gchar*); 73 125 74 GType feed_sort er_get_type (void);75 GObject* feed_sort er_new (const FeedFilter*);126 GType feed_sort_get_type (void); 127 GObject* feed_sort_new (const FeedFilter*); 76 128 77 129 G_END_DECLS -
trunk/src/target/OM-2007.2/applications/openmoko-feedreader2/src/main.c
r2574 r2623 24 24 * Current Version: $Rev$ ($Date$) [$Author$] 25 25 */ 26 #define _GNU_SOURCE 27 #include "config.h"26 27 #include <gtk/gtk.h> 28 28 #include <glib/gi18n.h> 29 29 30 #include "application-data.h"31 #include "callbacks.h"32 #include "rfcdate.h"33 34 #include <libmokoui/moko-scrolled-pane.h>35 36 #include <webkitgtkpage.h>37 30 #include <webkitgtkglobal.h> 38 31 39 #include <string.h> 40 #include <assert.h> 32 #include <moko-finger-scroll.h> 41 33 42 #define ASSERT_X(x, error) assert(x) 34 #include "application-data.h" 35 #include "feed-data.h" 36 #include "feed-configuration.h" 37 #include "config.h" 38 39 static void 40 window_delete_event (GtkWidget* widget, GdkEvent* event, struct ApplicationData* data) 41 { 42 gtk_main_quit (); 43 } 44 43 45 44 46 /* 45 * filter categories and such terms47 * Config related functions 46 48 */ 47 static gboolean 48 rss_filter_entries (GtkTreeModel *model, GtkTreeIter *iter, struct RSSReaderData *data) 49 static void 50 config_new_clicked_closure(GtkWidget* button, struct ApplicationData* data) 51 { 52 } 53 54 static void 55 config_delete_clicked_closure(GtkWidget* button, struct ApplicationData* data) 56 { 57 } 58 59 static void 60 create_configuration_ui (struct ApplicationData* data, GtkCellRenderer* text_renderer) 49 61 { 50 62 /* 51 * filter the category63 * toolbar 52 64 */ 53 if ( !data->is_all_filter ) {54 gchar *category;55 gtk_tree_model_get (model, iter, RSS_READER_COLUMN_CATEGORY, &category, -1);65 GtkWidget* box = gtk_vbox_new (FALSE, 0); 66 gtk_notebook_append_page (data->notebook, box, gtk_image_new_from_stock (GTK_STOCK_MISSING_IMAGE, GTK_ICON_SIZE_LARGE_TOOLBAR)); 67 gtk_container_child_set (GTK_CONTAINER(data->notebook), box, "tab-expand", TRUE, "tab-fill", TRUE, NULL); 56 68 57 /* 58 * how does this happen? 59 */ 60 if ( !category ) 61 return FALSE; 69 GtkWidget* toolbar = gtk_toolbar_new (); 70 gtk_box_pack_start (GTK_BOX(box), toolbar, FALSE, FALSE, 0); 62 71 63 if ( strcmp(category, data->current_filter) != 0 ) 64 return FALSE; 72 GtkToolItem* toolitem = gtk_tool_button_new_from_stock (GTK_STOCK_NEW); 73 gtk_tool_item_set_expand (GTK_TOOL_ITEM(toolitem), TRUE); 74 gtk_toolbar_insert (GTK_TOOLBAR(toolbar), toolitem, 0); 75 g_signal_connect (toolitem, "clicked", G_CALLBACK(config_new_clicked_closure), data); 65 76 66 g_free (category); 67 } 77 gtk_toolbar_insert (GTK_TOOLBAR(toolbar), gtk_separator_tool_item_new (), 1); 68 78 79 toolitem = gtk_tool_button_new_from_stock (GTK_STOCK_DELETE); 80 gtk_tool_item_set_expand (GTK_TOOL_ITEM(toolitem), TRUE); 81 gtk_toolbar_insert (GTK_TOOLBAR(toolbar), toolitem, 2); 82 g_signal_connect (toolitem, "clicked", G_CALLBACK(config_delete_clicked_closure), data); 83 84 /* main view */ 85 GtkWidget* scrolled = moko_finger_scroll_new (); 86 gtk_box_pack_start (GTK_BOX(box), scrolled, TRUE, TRUE, 0); 87 GtkWidget* treeview = gtk_tree_view_new_with_model (GTK_TREE_MODEL(feed_configuration_get_configuration ())); 88 GtkTreeViewColumn* column = GTK_TREE_VIEW_COLUMN(gtk_tree_view_column_new_with_attributes( _("Name"), 89 text_renderer, 90 "text", FEED_NAME, NULL)); 91 gtk_tree_view_column_set_expand (column, TRUE); 92 gtk_tree_view_column_set_sizing (column, GTK_TREE_VIEW_COLUMN_FIXED); 93 gtk_tree_view_column_set_sort_column_id (column, FEED_NAME); 94 gtk_tree_view_append_column (GTK_TREE_VIEW(treeview), column); 69 95 70 /* 71 * filter the text according to the search now 72 */ 73 if ( data->current_search_text ) { 74 gchar *text; 96 column = GTK_TREE_VIEW_COLUMN(gtk_tree_view_column_new_with_attributes( _("Url"), 97 text_renderer, 98 "text", FEED_URL, NULL)); 99 gtk_tree_view_column_set_expand (column, TRUE); 100 gtk_tree_view_column_set_sizing (column, GTK_TREE_VIEW_COLUMN_FIXED); 101 gtk_tree_view_column_set_sort_column_id (column, FEED_URL); 102 gtk_tree_view_append_column (GTK_TREE_VIEW(treeview), column); 75 103 76 #define FILTER_SEARCH(column) \ 77 gtk_tree_model_get (model, iter, column, &text, -1); \ 78 if ( text && strcasestr (text, data->current_search_text) != NULL ) { \ 79 g_free (text); \ 80 return TRUE; \ 81 } 82 83 FILTER_SEARCH(RSS_READER_COLUMN_AUTHOR) 84 FILTER_SEARCH(RSS_READER_COLUMN_SUBJECT) 85 FILTER_SEARCH(RSS_READER_COLUMN_SOURCE) 86 FILTER_SEARCH(RSS_READER_COLUMN_LINK) 87 FILTER_SEARCH(RSS_READER_COLUMN_TEXT) 88 89 #undef FILTER_SEARCH 90 return FALSE; 91 } 92 93 return TRUE; 104 105 gtk_container_add (GTK_CONTAINER (scrolled), treeview); 94 106 } 95 107 96 108 /* 97 * sort the dates according to zsort. Ideally they should sort ascending 109 * ToolBar with add and remove 110 * And a view with available feeds. No filtering for them 111 * 112 * TODO: 113 * How to do the actual configuration? 114 * Name, URL are easy and fit on screen 115 * What about username, password, number of items to cache? 98 116 */ 99 static gint100 rss_sort_dates (GtkTreeModel *model, GtkTreeIter *_left, GtkTreeIter *_right, gpointer that)117 static void 118 create_ui (struct ApplicationData* data) 101 119 { 102 RSSRFCDate *left, *right; 103 gtk_tree_model_get (model, _left, RSS_READER_COLUMN_DATE, &left, -1); 104 gtk_tree_model_get (model, _right, RSS_READER_COLUMN_DATE, &right, -1); 120 data->window = GTK_WINDOW(gtk_window_new (GTK_WINDOW_TOPLEVEL)); 121 g_signal_connect(data->window, "delete-event", G_CALLBACK(window_delete_event), data); 105 122 106 int result; 107 if ( left == NULL ) 108 result = -1; 109 else if ( right == NULL ) 110 result = 1; 111 else 112 result = rss_rfc_date_compare (left, right); 123 data->notebook = GTK_NOTEBOOK(gtk_notebook_new ()); 124 gtk_notebook_set_tab_pos (GTK_NOTEBOOK (data->notebook), GTK_POS_BOTTOM); 125 gtk_container_add (GTK_CONTAINER(data->window), GTK_WIDGET(data->notebook)); 113 126 114 if ( left ) 115 g_object_unref (left); 116 if ( right ) 117 g_object_unref (right); 127 /* 128 * Create the pages of interest 129 * 130 * 1.) Feed Overview Subject/Date 131 * 2.) Text View 132 * 3.) Configuration 133 */ 134 GtkCellRenderer *text_renderer = GTK_CELL_RENDERER(gtk_cell_renderer_text_new ()); 118 135 119 return result; 136 /* 137 * 3. Configuration 138 */ 139 create_configuration_ui (data, text_renderer); 140 141 142 gtk_widget_show_all (GTK_WIDGET(data->window)); 120 143 } 121 144 122 static void 123 rss_cell_data_func (GtkTreeViewColumn *tree_column, GtkCellRenderer *renderer, GtkTreeModel *tree_model, GtkTreeIter *iter, gpointer data)145 146 int main (int argc, char** argv) 124 147 { 125 RSSRFCDate *date;126 gtk_tree_model_get (tree_model, iter, RSS_READER_COLUMN_DATE, &date, -1);127 128 g_assert (date);129 g_object_set ( G_OBJECT(renderer), "text", rss_rfc_date_as_string(date), NULL);130 g_object_unref (G_OBJECT(date));131 }132 133 /*134 * setup the toolbar135 */136 static void setup_toolbar( struct RSSReaderData *data ) {137 GtkButton *a;138 GtkWidget *anImage;139 data->box = MOKO_TOOL_BOX(moko_tool_box_new_with_search());140 gtk_widget_grab_focus( GTK_WIDGET(data->box) );141 g_signal_connect( G_OBJECT(data->box), "searchbox_visible", G_CALLBACK(cb_searchbox_visible), data );142 g_signal_connect( G_OBJECT(data->box), "searchbox_invisible", G_CALLBACK(cb_searchbox_invisible), data );143 144 145 a = GTK_BUTTON(moko_tool_box_add_action_button( MOKO_TOOL_BOX(data->box) ));146 anImage = gtk_image_new_from_file( PKGDATADIR "/feedreader2_refresh_all.png" );147 moko_pixmap_button_set_center_image( MOKO_PIXMAP_BUTTON(a), anImage );148 g_signal_connect( G_OBJECT(a), "clicked", G_CALLBACK(cb_refresh_all_button_clicked), data );149 150 a = GTK_BUTTON(moko_tool_box_add_action_button( MOKO_TOOL_BOX(data->box) ));151 anImage = gtk_image_new_from_file( PKGDATADIR "/feedreader2_subscribe.png" );152 moko_pixmap_button_set_center_image( MOKO_PIXMAP_BUTTON(a), anImage );153 g_signal_connect( G_OBJECT(a), "clicked", G_CALLBACK(cb_subscribe_button_clicked), data );154 155 a = GTK_BUTTON(moko_tool_box_add_action_button( MOKO_TOOL_BOX(data->box)) );156 gtk_button_set_label( GTK_BUTTON(a), _("Up for rent") );157 a = GTK_BUTTON(moko_tool_box_add_action_button( MOKO_TOOL_BOX(data->box)) );158 gtk_button_set_label( GTK_BUTTON(a), _("Buy more Mate") );159 160 moko_paned_window_add_toolbox( MOKO_PANED_WINDOW(data->window), MOKO_TOOL_BOX(data->box) );161 }162 163 static void create_navigaton_area( struct RSSReaderData *data ) {164 data->feed_data = gtk_list_store_new( RSS_READER_NUM_COLS,165 G_TYPE_STRING /* Author */,166 G_TYPE_STRING /* Subject */,167 RSS_TYPE_RFC_DATE /* Date */,168 G_TYPE_STRING /* Link */,169 G_TYPE_STRING /* Text */,170 G_TYPE_INT /* Text_Type */,171 G_TYPE_STRING /* Category */,172 G_TYPE_STRING /* Source */ );173 174 /*175 * allow to filter for a search string176 */177 data->filter_model = GTK_TREE_MODEL_FILTER(gtk_tree_model_filter_new(GTK_TREE_MODEL(data->feed_data),NULL));178 gtk_tree_model_filter_set_visible_func (data->filter_model, (GtkTreeModelFilterVisibleFunc)rss_filter_entries, data, NULL);179 180 /*181 * Allow sorting of the base model182 */183 data->sort_model = GTK_TREE_MODEL_SORT(gtk_tree_model_sort_new_with_model( GTK_TREE_MODEL(data->filter_model) ));184 gtk_tree_sortable_set_sort_column_id( GTK_TREE_SORTABLE(data->sort_model), RSS_READER_COLUMN_DATE, GTK_SORT_DESCENDING );185 gtk_tree_sortable_set_sort_func ( GTK_TREE_SORTABLE(data->sort_model), RSS_READER_COLUMN_DATE, rss_sort_dates, NULL, NULL);186 187 data->treeView = MOKO_TREE_VIEW(moko_tree_view_new_with_model(GTK_TREE_MODEL(data->sort_model)));188 moko_paned_window_set_navigation_pane( MOKO_PANED_WINDOW(data->window), GTK_WIDGET(moko_tree_view_put_into_scrolled_window(data->treeView)) );189 190 /*191 * Only show the SUBJECT and DATE header192 */193 GtkCellRenderer *ren;194 GtkTreeViewColumn *column;195 ren = GTK_CELL_RENDERER(gtk_cell_renderer_text_new());196 column = GTK_TREE_VIEW_COLUMN(gtk_tree_view_column_new_with_attributes( _("Subject"), ren, "text", RSS_READER_COLUMN_SUBJECT, NULL));197 gtk_tree_view_column_set_expand( column, TRUE );198 gtk_tree_view_column_set_sizing( column, GTK_TREE_VIEW_COLUMN_FIXED );199 gtk_tree_view_column_set_sort_column_id( column, RSS_READER_COLUMN_SUBJECT );200 moko_tree_view_append_column( MOKO_TREE_VIEW(data->treeView), column );201 202 ren = GTK_CELL_RENDERER(gtk_cell_renderer_text_new());203 column = GTK_TREE_VIEW_COLUMN(gtk_tree_view_column_new_with_attributes( _("Date"), ren, NULL));204 205 gtk_tree_view_column_set_cell_data_func (column, ren, rss_cell_data_func, NULL, NULL);206 gtk_tree_view_column_set_expand( column, TRUE );207 gtk_tree_view_column_set_sizing( column, GTK_TREE_VIEW_COLUMN_FIXED );208 gtk_tree_view_column_set_sort_column_id( column, RSS_READER_COLUMN_DATE );209 moko_tree_view_append_column( MOKO_TREE_VIEW(data->treeView), column );210 211 /*212 * auto completion and selection updates213 */214 GtkTreeSelection *selection = GTK_TREE_SELECTION(gtk_tree_view_get_selection( GTK_TREE_VIEW(data->treeView) ));215 g_signal_connect( G_OBJECT(selection), "changed", G_CALLBACK(cb_treeview_selection_changed), data );216 217 GtkWidget *search_entry = GTK_WIDGET(moko_tool_box_get_entry(MOKO_TOOL_BOX(data->box)));218 g_signal_connect( G_OBJECT(data->treeView), "key_press_event", G_CALLBACK(cb_treeview_keypress_event), data );219 g_signal_connect( G_OBJECT(search_entry), "changed", G_CALLBACK(cb_search_entry_changed), data );220 }221 222 static void create_details_area( struct RSSReaderData* data ) {223 data->textPage = WEBKIT_GTK_PAGE(webkit_gtk_page_new ());224 225 GtkWidget *scrollWindow = GTK_WIDGET(moko_scrolled_pane_new());226 moko_scrolled_pane_pack (MOKO_SCROLLED_PANE(scrollWindow), GTK_WIDGET (data->textPage));227 moko_paned_window_set_details_pane( MOKO_PANED_WINDOW(data->window), scrollWindow ) ;228 }229 230 /*231 * create the mainwindow232 */233 static void setup_ui( struct RSSReaderData* data ) {234 data->window = MOKO_PANED_WINDOW(moko_paned_window_new());235 g_signal_connect( G_OBJECT(data->window), "delete_event", G_CALLBACK( gtk_main_quit ), NULL );236 237 /*238 * menu239 */240 data->menu = GTK_MENU(gtk_menu_new());241 GtkMenuItem *closeitem = GTK_MENU_ITEM(gtk_menu_item_new_with_label( _("Close")));242 g_signal_connect( G_OBJECT(closeitem), "activate", G_CALLBACK(gtk_main_quit), NULL );243 gtk_menu_shell_append( GTK_MENU_SHELL(data->menu), GTK_WIDGET(closeitem) );244 moko_paned_window_set_application_menu( MOKO_PANED_WINDOW(data->window), GTK_MENU(data->menu) );245 246 /*247 * filter248 */249 data->filter = GTK_MENU(gtk_menu_new());250 moko_paned_window_set_filter_menu( MOKO_PANED_WINDOW(data->window), GTK_MENU(data->filter) );251 data->menubox = MOKO_MENU_BOX(moko_paned_window_get_menubox( MOKO_PANED_WINDOW(data->window) ) );252 g_signal_connect( G_OBJECT(data->menubox), "filter_changed", G_CALLBACK(cb_filter_changed), data );253 254 255 /*256 * tool bar257 */258 setup_toolbar( data );259 create_navigaton_area( data );260 create_details_area( data );261 }262 263 int main( int argc, char** argv )264 {265 /*266 * boiler plate code267 */268 148 g_debug( "openmoko-feedreader2 starting up" ); 269 149 270 150 /* i18n boiler plate */ 271 bindtextdomain ( GETTEXT_PACKAGE, RSSREADER_LOCALE_DIR);272 bind_textdomain_codeset ( GETTEXT_PACKAGE, "UTF-8");273 textdomain ( GETTEXT_PACKAGE);151 bindtextdomain (GETTEXT_PACKAGE, RSSREADER_LOCALE_DIR); 152 bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); 153 textdomain (GETTEXT_PACKAGE); 274 154 275 155 … … 277 157 * initialize threads for fetching the RSS in the background 278 158 */ 279 g_thread_init ( NULL);280 gdk_threads_init ();281 gdk_threads_enter ();282 gtk_init ( &argc, &argv);159 g_thread_init (NULL); 160 gdk_threads_init (); 161 gdk_threads_enter (); 162 gtk_init (&argc, &argv); 283 163 webkit_gtk_init (); 164 g_set_application_name( _("FeedReader") ); 284 165 285 struct RSSReaderData *data = g_new0( struct RSSReaderData, 1 ); 166 struct ApplicationData* data = g_new (struct ApplicationData, 1); 167 data->cache = MOKO_CACHE(moko_cache_new ("feed-reader")); 168 feed_data_set_cache (RSS_FEED_DATA(feed_data_get_instance ()), data->cache); 286 169 170 create_ui (data); 171 feed_data_load_from_cache (RSS_FEED_DATA(feed_data_get_instance ())); 287 172 288 data->app = MOKO_APPLICATION( moko_application_get_instance() );289 g_set_application_name( _("FeedReader") );290 data->cache = MOKO_CACHE(moko_cache_new ("feed-reader"));291 292 setup_ui( data );293 294 /*295 * load data296 */297 data->is_all_filter = TRUE;298 refresh_categories( data );299 load_data_from_cache (data);300 moko_menu_box_set_active_filter( data->menubox, _("All") );301 302 gtk_widget_show_all( GTK_WIDGET(data->window) );303 gtk_widget_grab_focus (GTK_WIDGET(data->treeView));304 173 gtk_main(); 305 174 gdk_threads_leave(); 306 175 176 g_object_unref (data->cache); 177 g_free (data); 178 307 179 return 0; 308 180 } 309 310
Note: See TracChangeset
for help on using the changeset viewer.
