r3650 - in trunk/src/target/OM-2007.2/applications/openmoko-messages2: . src

chris at sita.openmoko.org chris at sita.openmoko.org
Fri Dec 14 12:59:49 CET 2007


Author: chris
Date: 2007-12-14 12:59:47 +0100 (Fri, 14 Dec 2007)
New Revision: 3650

Modified:
   trunk/src/target/OM-2007.2/applications/openmoko-messages2/ChangeLog
   trunk/src/target/OM-2007.2/applications/openmoko-messages2/src/sms-compose.c
   trunk/src/target/OM-2007.2/applications/openmoko-messages2/src/sms-contacts.c
   trunk/src/target/OM-2007.2/applications/openmoko-messages2/src/sms-contacts.h
   trunk/src/target/OM-2007.2/applications/openmoko-messages2/src/sms-main.c
   trunk/src/target/OM-2007.2/applications/openmoko-messages2/src/sms-notes.c
   trunk/src/target/OM-2007.2/applications/openmoko-messages2/src/sms-utils.c
   trunk/src/target/OM-2007.2/applications/openmoko-messages2/src/sms.h
Log:
        * src/sms-compose.c: (page_shown), (page_hidden):
        Connect to delete/delete-all button clicks (doesn't do anything yet)

        * src/sms-contacts.h:
        * src/sms-contacts.c: (page_shown), (page_hidden),
        (notify_visible_cb), (visibility_notify_event_cb), (unmap_cb),
        (nophoto_filter_func), (delete_clicked_cb),
        (delete_all_clicked_cb), (sms_contacts_page_new):
        Connect to delete/delete-all button clicks (doesn't do anything yet),
        add extra column to identify meta-contacts

        * src/sms-main.c: (main):
        Use MOKO_STOCK_FOLDER_DELETE for delete-all button

        * src/sms.h:
        * src/sms-notes.c: (mark_messages_read_idle), (scroll_changed_cb),
        (page_shown), (page_hidden), (global_note_added_cb),
        (global_note_modified_cb), (delete_clicked_cb),
        (delete_all_clicked_cb), (sms_notes_page_new):
        Mark messages as read when they get displayed

        * src/sms-utils.c: (sms_contacts_note_count_update):
        Disable sorting while iterating over the contacts to fix breakage when
        contact priority causes re-ordering during iteration


Modified: trunk/src/target/OM-2007.2/applications/openmoko-messages2/ChangeLog
===================================================================
--- trunk/src/target/OM-2007.2/applications/openmoko-messages2/ChangeLog	2007-12-14 11:17:24 UTC (rev 3649)
+++ trunk/src/target/OM-2007.2/applications/openmoko-messages2/ChangeLog	2007-12-14 11:59:47 UTC (rev 3650)
@@ -1,3 +1,30 @@
+2007-12-14  Chris Lord  <chris at openedhand.com>
+
+	* src/sms-compose.c: (page_shown), (page_hidden):
+	Connect to delete/delete-all button clicks (doesn't do anything yet)
+
+	* src/sms-contacts.h:
+	* src/sms-contacts.c: (page_shown), (page_hidden),
+	(notify_visible_cb), (visibility_notify_event_cb), (unmap_cb),
+	(nophoto_filter_func), (delete_clicked_cb),
+	(delete_all_clicked_cb), (sms_contacts_page_new):
+	Connect to delete/delete-all button clicks (doesn't do anything yet),
+	add extra column to identify meta-contacts
+
+	* src/sms-main.c: (main):
+	Use MOKO_STOCK_FOLDER_DELETE for delete-all button
+
+	* src/sms.h:
+	* src/sms-notes.c: (mark_messages_read_idle), (scroll_changed_cb),
+	(page_shown), (page_hidden), (global_note_added_cb),
+	(global_note_modified_cb), (delete_clicked_cb),
+	(delete_all_clicked_cb), (sms_notes_page_new):
+	Mark messages as read when they get displayed
+
+	* src/sms-utils.c: (sms_contacts_note_count_update):
+	Disable sorting while iterating over the contacts to fix breakage when 
+	contact priority causes re-ordering during iteration
+
 2007-12-10  Chris Lord  <chris at openedhand.com>
 
 	* src/sms-contacts.c: (contacts_iter_compare_func),

Modified: trunk/src/target/OM-2007.2/applications/openmoko-messages2/src/sms-compose.c
===================================================================
--- trunk/src/target/OM-2007.2/applications/openmoko-messages2/src/sms-compose.c	2007-12-14 11:17:24 UTC (rev 3649)
+++ trunk/src/target/OM-2007.2/applications/openmoko-messages2/src/sms-compose.c	2007-12-14 11:59:47 UTC (rev 3650)
@@ -34,6 +34,11 @@
 	
 	gboolean set = FALSE;
 	
+	/* Make delete(-all) buttons insensitive */
+	/* TODO: Replace these with more useful buttons? */
+	gtk_widget_set_sensitive (GTK_WIDGET (data->delete_button), FALSE);
+	gtk_widget_set_sensitive (GTK_WIDGET (data->delete_all_button), FALSE);
+	
 	if (!data->sms_proxy)
 		gtk_widget_set_sensitive (GTK_WIDGET (data->new_button), FALSE);
 	gtk_tool_button_set_stock_id (GTK_TOOL_BUTTON (data->new_button),
@@ -103,6 +108,8 @@
 	gtk_widget_set_sensitive (GTK_WIDGET (data->new_button), TRUE);
 	gtk_tool_button_set_stock_id (GTK_TOOL_BUTTON (data->new_button),
 		MOKO_STOCK_SMS_NEW);
+	gtk_widget_set_sensitive (GTK_WIDGET (data->delete_button), TRUE);
+	gtk_widget_set_sensitive (GTK_WIDGET (data->delete_all_button), TRUE);
 }
 
 static void

Modified: trunk/src/target/OM-2007.2/applications/openmoko-messages2/src/sms-contacts.c
===================================================================
--- trunk/src/target/OM-2007.2/applications/openmoko-messages2/src/sms-contacts.c	2007-12-14 11:17:24 UTC (rev 3649)
+++ trunk/src/target/OM-2007.2/applications/openmoko-messages2/src/sms-contacts.c	2007-12-14 11:59:47 UTC (rev 3650)
@@ -28,7 +28,50 @@
 
 static const gchar *clear_numbers_uid;
 
+static gboolean hidden = FALSE;
+
 static void
+page_shown (SmsData *data)
+{
+}
+
+static void
+page_hidden (SmsData *data)
+{
+}
+
+static void
+notify_visible_cb (GObject *gobject, GParamSpec *arg1, SmsData *data)
+{
+	if ((!hidden) && (!GTK_WIDGET_VISIBLE (gobject))) {
+		hidden = TRUE;
+		page_hidden (data);
+	}
+}
+
+static gboolean
+visibility_notify_event_cb (GtkWidget *widget, GdkEventVisibility *event,
+			    SmsData *data)
+{
+	if (((event->state == GDK_VISIBILITY_PARTIAL) ||
+	     (event->state == GDK_VISIBILITY_UNOBSCURED)) && (hidden)) {
+		hidden = FALSE;
+		page_shown (data);
+	}
+	
+	return FALSE;
+}
+
+static void
+unmap_cb (GtkWidget *widget, SmsData *data)
+{
+	if (!hidden) {
+		hidden = TRUE;
+		page_hidden (data);
+	}
+}
+
+static void
 clear_numbers_cb (gchar *number, gchar *uid, GList **list)
 {
 	if (strcmp (uid, clear_numbers_uid) == 0)
@@ -165,6 +208,9 @@
 		else
 			g_value_set_object (value, data->no_photo);
 		break;
+	    case COL_UNKNOWN :
+		g_value_set_boolean (value, (gboolean)pointer);
+		break;
 	}
 }
 
@@ -198,6 +244,18 @@
 	return result;
 }
 
+static void
+delete_clicked_cb (GtkToolButton *button, SmsData *data)
+{
+	if (hidden) return;
+}
+
+static void
+delete_all_clicked_cb (GtkToolButton *button, SmsData *data)
+{
+	if (hidden) return;
+}
+
 GtkWidget *
 sms_contacts_page_new (SmsData *data)
 {
@@ -256,7 +314,7 @@
 	/* Create contacts model */
 	data->contacts_store = (GtkTreeModel *)gtk_list_store_new (COL_LAST,
 		G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, GDK_TYPE_PIXBUF,
-		G_TYPE_INT);
+		G_TYPE_INT, G_TYPE_BOOLEAN);
 	gtk_tree_sortable_set_sort_func (GTK_TREE_SORTABLE (
 		data->contacts_store), COL_NAME,
 		(GtkTreeIterCompareFunc)contacts_iter_compare_func,
@@ -271,15 +329,16 @@
 	/* Insert contact for 'unknown' messages */
 	gtk_list_store_insert_with_values (
 		GTK_LIST_STORE (data->contacts_store), NULL, 0,
-		COL_UID, NULL, COL_NAME, "Unknown sender", COL_PRIORITY, 5, -1);
+		COL_UID, NULL, COL_NAME, "Unknown sender", COL_PRIORITY, 5,
+		COL_UNKNOWN, TRUE, -1);
 	
 	/* Create filter */
 	data->contacts_filter = gtk_tree_model_filter_new (
 		data->contacts_store, NULL);
 	gtk_tree_model_filter_set_modify_func ((GtkTreeModelFilter *)
 		data->contacts_filter, COL_LAST,
-		(GType []){G_TYPE_STRING, G_TYPE_STRING,
-			G_TYPE_STRING, GDK_TYPE_PIXBUF, G_TYPE_INT},
+		(GType []){G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING,
+			GDK_TYPE_PIXBUF, G_TYPE_INT, G_TYPE_BOOLEAN },
 		(GtkTreeModelFilterModifyFunc)nophoto_filter_func, data, NULL);
 	
 	/* Create groups model */
@@ -330,6 +389,22 @@
 		G_CALLBACK (contacts_removed_cb), data);
 	e_book_view_start (view);
 	
+	/* Connect to toolbar delete buttons */
+	g_signal_connect (data->delete_button, "clicked",
+		G_CALLBACK (delete_clicked_cb), data);
+	g_signal_connect (data->delete_all_button, "clicked",
+		G_CALLBACK (delete_all_clicked_cb), data);
+
+	/* Add events for detecting whether the page has been hidden/shown */
+	gtk_widget_add_events (data->contacts_treeview,
+		GDK_VISIBILITY_NOTIFY_MASK);
+	g_signal_connect (data->contacts_treeview, "visibility-notify-event",
+		G_CALLBACK (visibility_notify_event_cb), data);
+	g_signal_connect (data->contacts_treeview, "notify::visible",
+		G_CALLBACK (notify_visible_cb), data);
+	g_signal_connect (vbox, "unmap",
+		G_CALLBACK (unmap_cb), data);
+	
 	return vbox;
 }
 

Modified: trunk/src/target/OM-2007.2/applications/openmoko-messages2/src/sms-contacts.h
===================================================================
--- trunk/src/target/OM-2007.2/applications/openmoko-messages2/src/sms-contacts.h	2007-12-14 11:17:24 UTC (rev 3649)
+++ trunk/src/target/OM-2007.2/applications/openmoko-messages2/src/sms-contacts.h	2007-12-14 11:59:47 UTC (rev 3650)
@@ -28,6 +28,7 @@
 	COL_DETAIL,
 	COL_ICON,
 	COL_PRIORITY,
+	COL_UNKNOWN,
 	COL_LAST
 };
 

Modified: trunk/src/target/OM-2007.2/applications/openmoko-messages2/src/sms-main.c
===================================================================
--- trunk/src/target/OM-2007.2/applications/openmoko-messages2/src/sms-main.c	2007-12-14 11:17:24 UTC (rev 3649)
+++ trunk/src/target/OM-2007.2/applications/openmoko-messages2/src/sms-main.c	2007-12-14 11:59:47 UTC (rev 3650)
@@ -89,7 +89,7 @@
 	
 	/* Delete all button */
 	data.delete_all_button = gtk_tool_button_new_from_stock (
-		GTK_STOCK_MISSING_IMAGE);
+		MOKO_STOCK_FOLDER_DELETE);
 	gtk_tool_item_set_expand (data.delete_all_button, TRUE);
 	gtk_toolbar_insert (GTK_TOOLBAR (toolbar), data.delete_all_button, 1);
 	/*gtk_toolbar_insert (GTK_TOOLBAR (toolbar),

Modified: trunk/src/target/OM-2007.2/applications/openmoko-messages2/src/sms-notes.c
===================================================================
--- trunk/src/target/OM-2007.2/applications/openmoko-messages2/src/sms-notes.c	2007-12-14 11:17:24 UTC (rev 3649)
+++ trunk/src/target/OM-2007.2/applications/openmoko-messages2/src/sms-notes.c	2007-12-14 11:59:47 UTC (rev 3650)
@@ -77,10 +77,56 @@
 			store_view, note_changed_cb, data);
 }
 
+static gboolean
+mark_messages_read_idle (SmsData *data)
+{
+	GtkTreePath *start_path, *end_path;
+	
+	if (gtk_tree_view_get_visible_range (
+	    GTK_TREE_VIEW (data->notes_treeview), &start_path, &end_path)) {
+		
+		do {
+			JanaComponent *comp;
+			GtkTreeIter iter;
+			gchar *uid;
+
+			gtk_tree_model_get_iter (data->note_filter,
+				&iter, start_path);
+			gtk_tree_model_get (data->note_filter, &iter,
+				JANA_GTK_NOTE_STORE_COL_UID, &uid, -1);
+			
+			comp = jana_store_get_component (data->notes, uid);
+			if (comp && (!jana_utils_component_has_category (comp,
+			    "Read"))) {
+				jana_utils_component_insert_category (comp,
+					"Read", 0);
+				jana_store_modify_component (data->notes, comp);
+			}
+			
+			g_free (uid);
+			
+			gtk_tree_path_next (start_path);
+		} while (gtk_tree_path_compare (start_path, end_path) <= 0);
+		
+		gtk_tree_path_free (start_path);
+		gtk_tree_path_free (end_path);
+	}
+	return FALSE;
+}
+
 static void
+scroll_changed_cb (GtkAdjustment *adjust, SmsData *data)
+{
+	if (data->notes_scroll_idle) g_source_remove (data->notes_scroll_idle);
+	data->notes_scroll_idle = g_timeout_add (500,
+		(GSourceFunc)mark_messages_read_idle, data);
+}
+
+static void
 page_shown (SmsData *data)
 {
 	JanaStoreView *store_view;
+	GtkAdjustment *hadjust, *vadjust;
 	gint i;
 
 	gboolean found_match = FALSE;
@@ -88,6 +134,18 @@
 	
 	if (!open) return;
 	
+	/* Attach to scrolling signals so we can mark messages as read */
+	g_object_get (G_OBJECT (data->notes_treeview),
+		"hadjustment", &hadjust, "vadjustment", &vadjust, NULL);
+	g_signal_connect (hadjust, "changed",
+		G_CALLBACK (scroll_changed_cb), data);
+	g_signal_connect (hadjust, "value-changed",
+		G_CALLBACK (scroll_changed_cb), data);
+	g_signal_connect (vadjust, "changed",
+		G_CALLBACK (scroll_changed_cb), data);
+	g_signal_connect (vadjust, "value-changed",
+		G_CALLBACK (scroll_changed_cb), data);
+	
 	if (!(contact = sms_get_selected_contact (data))) {
 		GList *u, *components = NULL;
 		
@@ -154,6 +212,14 @@
 static void
 page_hidden (SmsData *data)
 {
+	GtkAdjustment *hadjust, *vadjust;
+
+	if (data->notes_scroll_idle) g_source_remove (data->notes_scroll_idle);
+	g_object_get (G_OBJECT (data->notes_treeview),
+		"hadjustment", &hadjust, "vadjustment", &vadjust, NULL);
+	g_signal_handlers_disconnect_by_func (hadjust, scroll_changed_cb, data);
+	g_signal_handlers_disconnect_by_func (vadjust, scroll_changed_cb, data);
+	
 	jana_gtk_note_store_set_view (JANA_GTK_NOTE_STORE (
 		data->note_store), NULL);
 	if (data->author_uid) {
@@ -275,6 +341,8 @@
 				ncdata = g_slice_new0 (SmsNoteCountData);
 				g_hash_table_insert (
 					data->note_count, key, ncdata);
+			} else {
+				g_free (key);
 			}
 			
 			uid = jana_component_get_uid (
@@ -307,12 +375,15 @@
 		if (!JANA_IS_NOTE (components->data)) continue;
 		
 		note = JANA_NOTE (components->data);
+		uid = jana_component_get_uid (JANA_COMPONENT (note));
 		
-		uid = jana_component_get_uid (JANA_COMPONENT (note));
 		for (i = 0; i < 2; i++) {
 			GList *u, *r;
 			gchar *key = i ? jana_note_get_author (note) :
 				jana_note_get_recipient (note);
+			
+			if (!key) continue;
+			
 			ncdata = g_hash_table_lookup (data->note_count, key);
 			g_free (key);
 			
@@ -417,10 +488,22 @@
 	g_slice_free (SmsNoteCountData, data);
 }
 
+static void
+delete_clicked_cb (GtkToolButton *button, SmsData *data)
+{
+	if (hidden) return;
+}
+
+static void
+delete_all_clicked_cb (GtkToolButton *button, SmsData *data)
+{
+	if (hidden) return;
+}
+
 GtkWidget *
 sms_notes_page_new (SmsData *data)
 {
-	GtkWidget *treeview, *scroll, *vbox, *searchbar;
+	GtkWidget *scroll, *vbox, *searchbar;
 	GtkCellRenderer *renderer;
 	GHashTable *colours_hash;
 	
@@ -432,6 +515,7 @@
 		(GDestroyNotify)g_free, (GDestroyNotify)free_count_data);
 	data->note_count_idle = 0;
 	data->unassigned_notes = NULL;
+	data->notes_scroll_idle = 0;
 	
 	/* Create note store */
 	data->notes = jana_ecal_store_new (JANA_COMPONENT_NOTE);
@@ -448,13 +532,14 @@
 	g_hash_table_insert (colours_hash, "Sending", &alt_color);
 	
 	/* Create treeview and cell renderer */
-	treeview = gtk_tree_view_new_with_model (data->note_filter);
-	gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (treeview), FALSE);
+	data->notes_treeview = gtk_tree_view_new_with_model (data->note_filter);
+	gtk_tree_view_set_headers_visible (
+		GTK_TREE_VIEW (data->notes_treeview), FALSE);
 	renderer = jana_gtk_cell_renderer_note_new ();
 	g_object_set (renderer, "draw_box", TRUE, "show_recipient", TRUE, NULL);
-	gtk_tree_view_insert_column_with_data_func (GTK_TREE_VIEW (treeview), 0,
-		"Messages", renderer, (GtkTreeCellDataFunc)sms_notes_data_func,
-		data, NULL);
+	gtk_tree_view_insert_column_with_data_func (
+		GTK_TREE_VIEW (data->notes_treeview), 0, "Messages", renderer,
+		(GtkTreeCellDataFunc)sms_notes_data_func, data, NULL);
 	
 	/* Create search bar */
 	data->notes_combo = gtk_combo_box_new_text ();
@@ -463,7 +548,7 @@
 	
 	/* Pack widgets */
 	scroll = moko_finger_scroll_new ();
-	gtk_container_add (GTK_CONTAINER (scroll), treeview);
+	gtk_container_add (GTK_CONTAINER (scroll), data->notes_treeview);
 	
 	vbox = gtk_vbox_new (FALSE, 0);
 	gtk_box_pack_start (GTK_BOX (vbox), searchbar, FALSE, TRUE, 0);
@@ -471,15 +556,21 @@
 	gtk_widget_show_all (vbox);
 	
 	/* Add events for detecting whether the page has been hidden/shown */
-	gtk_widget_add_events (treeview, GDK_VISIBILITY_NOTIFY_MASK);
-	g_signal_connect (treeview, "visibility-notify-event",
+	gtk_widget_add_events (data->notes_treeview, GDK_VISIBILITY_NOTIFY_MASK);
+	g_signal_connect (data->notes_treeview, "visibility-notify-event",
 		G_CALLBACK (visibility_notify_event_cb), data);
-	g_signal_connect (treeview, "notify::visible",
+	g_signal_connect (data->notes_treeview, "notify::visible",
 		G_CALLBACK (notify_visible_cb), data);
 	g_signal_connect (vbox, "unmap",
 		G_CALLBACK (unmap_cb), data);
 	
 	jana_store_open (data->notes);
 
+	/* Connect to toolbar delete buttons */
+	g_signal_connect (data->delete_button, "clicked",
+		G_CALLBACK (delete_clicked_cb), data);
+	g_signal_connect (data->delete_all_button, "clicked",
+		G_CALLBACK (delete_all_clicked_cb), data);
+	
 	return vbox;
 }

Modified: trunk/src/target/OM-2007.2/applications/openmoko-messages2/src/sms-utils.c
===================================================================
--- trunk/src/target/OM-2007.2/applications/openmoko-messages2/src/sms-utils.c	2007-12-14 11:17:24 UTC (rev 3649)
+++ trunk/src/target/OM-2007.2/applications/openmoko-messages2/src/sms-utils.c	2007-12-14 11:59:47 UTC (rev 3650)
@@ -135,24 +135,36 @@
 
 	GtkTreeIter iter, unknown_iter;
 	
-	if (!gtk_tree_model_get_iter_first (data->contacts_store, &iter)) {
-		data->note_count_idle = 0;
+	data->note_count_idle = 0;
+
+	/* Change sort column so changing priorities doesn't break iterating 
+	 * through the model.
+	 */
+	gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (
+		data->contacts_store), COL_UID, GTK_SORT_ASCENDING);
+
+	if (!gtk_tree_model_get_iter_first (data->contacts_store, &iter))
 		return FALSE;
-	}
 	
 	do {
 		gint i;
 		EContact *contact;
 		gchar *uid;
+		gboolean unknown;
 		
+		GError *error = NULL;
+		
 		gtk_tree_model_get (data->contacts_store, &iter, COL_UID,
-			&uid, -1);
+			&uid, COL_UNKNOWN, &unknown, -1);
 		if (!uid) {
-			unknown_iter = iter;
+			if (unknown) unknown_iter = iter;
 			continue;
 		}
 		
-		if (!e_book_get_contact (data->ebook, uid, &contact, NULL)) {
+		if (!e_book_get_contact (data->ebook, uid, &contact, &error)) {
+			g_warning ("Error retrieving contact: %s",
+				error->message);
+			g_error_free (error);
 			g_free (uid);
 			continue;
 		}
@@ -224,5 +236,8 @@
 	 */
 	assignment += 2;
 	
+	gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (
+		data->contacts_store), COL_NAME, GTK_SORT_ASCENDING);
+
 	return FALSE;
 }

Modified: trunk/src/target/OM-2007.2/applications/openmoko-messages2/src/sms.h
===================================================================
--- trunk/src/target/OM-2007.2/applications/openmoko-messages2/src/sms.h	2007-12-14 11:17:24 UTC (rev 3649)
+++ trunk/src/target/OM-2007.2/applications/openmoko-messages2/src/sms.h	2007-12-14 11:59:47 UTC (rev 3650)
@@ -59,6 +59,8 @@
 	GdkPixbuf *recipient_icon;
 	gchar *recipient_number;
 	gchar *author_uid;
+	GtkWidget *notes_treeview;
+	guint notes_scroll_idle;
 
 	GtkWidget *contacts_treeview;
 	GtkWidget *contacts_combo;
@@ -70,9 +72,6 @@
 	GtkWidget *contact_label;
 	GtkWidget *number_combo;
 
-	gulong delete_all_handler;
-	gulong delete_handler;
-	
 	DBusGProxy *sms_proxy;
 } SmsData;
 





More information about the commitlog mailing list