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

chris at sita.openmoko.org chris at sita.openmoko.org
Wed Nov 21 16:18:01 CET 2007


Author: chris
Date: 2007-11-21 16:17:58 +0100 (Wed, 21 Nov 2007)
New Revision: 3464

Modified:
   trunk/src/target/OM-2007.2/applications/openmoko-messages2/
   trunk/src/target/OM-2007.2/applications/openmoko-messages2/ChangeLog
   trunk/src/target/OM-2007.2/applications/openmoko-messages2/Makefile.am
   trunk/src/target/OM-2007.2/applications/openmoko-messages2/configure.ac
   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-notes.c
   trunk/src/target/OM-2007.2/applications/openmoko-messages2/src/sms.h
Log:
        * configure.ac:
        * Makefile.am:
        Remove libhito

        * src/sms.h:
        * src/sms-contacts.[ch]:
        Replace libhito code with ebook code, implement showing of contact
        avatars.

        * src/sms-notes.c:
        Update due to new ebook code



Property changes on: trunk/src/target/OM-2007.2/applications/openmoko-messages2
___________________________________________________________________
Name: svn:externals
   - libhito http://svn.o-hand.com/repos/contacts/branches/hito/libhito


Modified: trunk/src/target/OM-2007.2/applications/openmoko-messages2/ChangeLog
===================================================================
--- trunk/src/target/OM-2007.2/applications/openmoko-messages2/ChangeLog	2007-11-21 13:18:47 UTC (rev 3463)
+++ trunk/src/target/OM-2007.2/applications/openmoko-messages2/ChangeLog	2007-11-21 15:17:58 UTC (rev 3464)
@@ -1,3 +1,17 @@
+2007-11-21  Chris Lord  <chris at openedhand.com>
+
+	* configure.ac:
+	* Makefile.am:
+	Remove libhito
+
+	* src/sms.h:
+	* src/sms-contacts.[ch]:
+	Replace libhito code with ebook code, implement showing of contact
+	avatars.
+
+	* src/sms-notes.c:
+	Update due to new ebook code
+
 2007-11-20  Chris Lord  <chris at openedhand.com>
 
 	* configure.ac:

Modified: trunk/src/target/OM-2007.2/applications/openmoko-messages2/Makefile.am
===================================================================
--- trunk/src/target/OM-2007.2/applications/openmoko-messages2/Makefile.am	2007-11-21 13:18:47 UTC (rev 3463)
+++ trunk/src/target/OM-2007.2/applications/openmoko-messages2/Makefile.am	2007-11-21 15:17:58 UTC (rev 3464)
@@ -1 +1 @@
-SUBDIRS=libhito src
+SUBDIRS=src

Modified: trunk/src/target/OM-2007.2/applications/openmoko-messages2/configure.ac
===================================================================
--- trunk/src/target/OM-2007.2/applications/openmoko-messages2/configure.ac	2007-11-21 13:18:47 UTC (rev 3463)
+++ trunk/src/target/OM-2007.2/applications/openmoko-messages2/configure.ac	2007-11-21 15:17:58 UTC (rev 3464)
@@ -10,10 +10,14 @@
 AC_STDC_HEADERS
 AC_PROG_LIBTOOL
 
-PKG_CHECK_MODULES(CONTACTS, glib-2.0 glib-2.0 gtk+-2.0 libebook-1.2)
+PKG_CHECK_MODULES(EBOOK, libebook-1.2)
+PKG_CHECK_MODULES(GTK, gtk+-2.0 >= 2.6.0)
+PKG_CHECK_MODULES(MOKOUI, libmokoui2 >= 0.3)
+PKG_CHECK_MODULES(JANA, libjana libjana-ecal libjana-gtk)
+PKG_CHECK_MODULES(DBUS, dbus-glib-1)
 
 old_cflags=$CFLAGS
-CFLAGS=$CONTACTS_CFLAGS
+CFLAGS=$EBOOK_CFLAGS
 AC_CHECK_TYPE(EContactPhotoType, [], [], [#include <libebook/e-book.h>])
 CFLAGS=$old_cflags
 
@@ -21,15 +25,8 @@
         AC_DEFINE(HAVE_PHOTO_TYPE, 1, [Defined if EContactPhotoType exists])
 fi
 
-PKG_CHECK_MODULES(EBOOK, libebook-1.2)
-PKG_CHECK_MODULES(GTK, gtk+-2.0 >= 2.6.0)
-PKG_CHECK_MODULES(MOKOUI, libmokoui2 >= 0.3)
-PKG_CHECK_MODULES(JANA, libjana libjana-ecal libjana-gtk)
-PKG_CHECK_MODULES(DBUS, dbus-glib-1)
-
 AC_OUTPUT([
 Makefile
-libhito/Makefile
 src/Makefile
 ])
 

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-11-21 13:18:47 UTC (rev 3463)
+++ trunk/src/target/OM-2007.2/applications/openmoko-messages2/src/sms-contacts.c	2007-11-21 15:17:58 UTC (rev 3464)
@@ -20,46 +20,145 @@
 #include "sms-contacts.h"
 #include <libmokoui2/moko-finger-scroll.h>
 #include <libmokoui2/moko-search-bar.h>
-#include <libhito/hito-contact-store.h>
-#include <libhito/hito-group-store.h>
-#include <libhito/hito-all-group.h>
-#include <libhito/hito-group-combo.h>
-#include <libebook/e-book.h>
+#include <config.h>
 
-static void sms_contacts_data_func (GtkTreeViewColumn *tree_column,
-				    GtkCellRenderer *cell,
-				    GtkTreeModel *model,
-				    GtkTreeIter *iter,
-				    SmsData *data)
+/* Following two functions taken from pimlico Contacts */
+static void
+contact_photo_size (GdkPixbufLoader * loader, gint width, gint height,
+		    gpointer user_data)
 {
-	EContact *contact = NULL;
+	/* Max height of GTK_ICON_SIZE_DIALOG */
+	gint iconwidth, iconheight;
+	gtk_icon_size_lookup (GTK_ICON_SIZE_DIALOG, &iconwidth, &iconheight);
 	
-	gtk_tree_model_get (model, iter, COLUMN_CONTACT, &contact, -1);
-	if (!contact) return;
+	gdk_pixbuf_loader_set_size (loader,
+				    width / ((gdouble) height /
+					     iconheight), iconheight);
+}
+
+GdkPixbuf *
+contacts_load_photo (EContact *contact)
+{
+	EContactPhoto *photo;
+	GdkPixbuf *pixbuf = NULL;
 	
-	g_object_set (cell,
-		"author", e_contact_get_const (contact, E_CONTACT_FULL_NAME),
-		"body", "0 sent, 0 received", NULL);
+	/* Retrieve contact picture and resize */
+	photo = e_contact_get (contact, E_CONTACT_PHOTO);
+	if (photo) {
+		GdkPixbufLoader *loader = gdk_pixbuf_loader_new ();
+		if (loader) {
+			g_signal_connect (G_OBJECT (loader),
+					  "size-prepared",
+					  G_CALLBACK (contact_photo_size),
+					  NULL);
+#if HAVE_PHOTO_TYPE
+			switch (photo->type) {
+			case E_CONTACT_PHOTO_TYPE_INLINED :
+				gdk_pixbuf_loader_write (loader,
+					photo->data.inlined.data,
+					photo->data.inlined.length, NULL);
+				break;
+			case E_CONTACT_PHOTO_TYPE_URI :
+			default :
+				g_warning ("Cannot handle URI photos yet");
+				g_object_unref (loader);
+				loader = NULL;
+				break;
+			}
+#else
+			gdk_pixbuf_loader_write (loader, (const guchar *)
+				photo->data, photo->length, NULL);
+#endif
+			if (loader) {
+				gdk_pixbuf_loader_close (loader, NULL);
+				pixbuf = gdk_pixbuf_loader_get_pixbuf (loader);
+				if (pixbuf) g_object_ref (pixbuf);
+				g_object_unref (loader);
+			}
+		}
+		e_contact_photo_free (photo);
+	}
 	
-	g_object_unref (contact);
+	return pixbuf;
 }
 
+static void
+contacts_store (SmsData *data, GtkTreeIter *iter, EContact *contact)
+{
+	GdkPixbuf *photo = contacts_load_photo (contact);
+	gtk_list_store_set ((GtkListStore *)data->contacts_store, iter,
+		COL_UID, e_contact_get_const (contact, E_CONTACT_UID),
+		COL_NAME, e_contact_get_const (contact, E_CONTACT_FULL_NAME),
+		COL_ICON, photo, -1);
+	if (photo) g_object_unref (photo);
+}
+
+static void
+contacts_added_cb (EBookView *ebookview, GList *contacts, SmsData *data)
+{
+	for (; contacts; contacts = contacts->next) {
+		GtkTreeIter *iter;
+		EContact *contact = (EContact *)contacts->data;
+		
+		if (!contact) continue;
+		
+		iter = g_slice_new (GtkTreeIter);
+		gtk_list_store_append ((GtkListStore *)data->contacts_store,
+			iter);
+		contacts_store (data, iter, contact);
+		g_hash_table_insert (data->contacts,
+			e_contact_get (contact, E_CONTACT_UID), iter);
+	}
+}
+
+static void
+contacts_changed_cb (EBookView *ebookview, GList *contacts, SmsData *data)
+{
+	for (; contacts; contacts = contacts->next) {
+		GtkTreeIter *iter;
+		const gchar *uid;
+		
+		EContact *contact = (EContact *)contacts->data;
+		
+		if (!contact) continue;
+		
+		uid = e_contact_get_const (contact, E_CONTACT_UID);
+		iter = g_hash_table_lookup (data->contacts, uid);
+		if (iter) contacts_store (data, iter, contact);
+	}
+}
+
+static void
+contacts_removed_cb (EBookView *ebookview, GList *uids, SmsData *data)
+{
+	for (; uids; uids = uids->next) {
+		GtkTreeIter *iter = g_hash_table_lookup (
+			data->contacts, uids->data);
+
+		if (!iter) continue;
+		
+		gtk_list_store_remove ((GtkListStore *)
+			data->contacts_store, iter);
+		g_hash_table_remove (data->contacts, uids->data);
+	}
+}
+
+static void
+free_iter_slice (GtkTreeIter *iter)
+{
+	g_slice_free (GtkTreeIter, iter);
+}
+
 GtkWidget *
 sms_contacts_page_new (SmsData *data)
 {
 	EBookQuery *qrys[(E_CONTACT_LAST_PHONE_ID-E_CONTACT_FIRST_PHONE_ID)+1];
 	GtkWidget *searchbar, *scroll, *vbox;
 	GtkCellRenderer *renderer;
-	GtkTreeModel *group_store;
 	EBookQuery *tel_query;
 	EBookView *view;
-	EBook *book;
 	gint i;
 
-	/* Temporary, just for testing */
-	GdkPixbuf *pixbuf = gtk_icon_theme_load_icon (
-		gtk_icon_theme_get_default (), "stock_person", 48, 0, NULL);
-
 	GError *error = NULL;
 	
 	/* Create query for all contacts with telephone numbers */
@@ -77,14 +176,14 @@
 	
 	/* Create/retrieve and open system address book */
 	/* TODO: async opening? */
-	if (!(book = e_book_new_system_addressbook (&error))) {
+	if (!(data->ebook = e_book_new_system_addressbook (&error))) {
 		g_warning ("Error retrieving system addressbook: %s",
 			error->message);
 		g_error_free (error);
 		return gtk_label_new ("Error, see console output");
 	}
 	
-	if (!e_book_open (book, FALSE, &error)) {
+	if (!e_book_open (data->ebook, FALSE, &error)) {
 		g_warning ("Error opening system addressbook: %s",
 			error->message);
 		g_error_free (error);
@@ -92,47 +191,57 @@
 	}
 	
 	/* Get view on telephone number query */
-	if (!(e_book_get_book_view (book, tel_query, NULL, 0, &view, &error))) {
+	if (!(e_book_get_book_view (data->ebook, tel_query,
+	      NULL, 0, &view, &error))) {
 		g_warning ("Error retrieving addressbook view: %s",
 			error->message);
 		g_error_free (error);
 		return gtk_label_new ("Error, see console output");
 	}
 	
+	/* Get icon to use when no contact photo exists */
+	data->no_photo = gtk_icon_theme_load_icon (
+		gtk_icon_theme_get_default (), "stock_person", 48, 0, NULL);
+
 	/* Create contacts model */
-	data->contacts_store = hito_contact_store_new (view);
+	data->contacts_store = gtk_list_store_new (COL_LAST,
+		G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, GDK_TYPE_PIXBUF);
+	data->contacts = g_hash_table_new_full (g_str_hash, g_str_equal,
+		(GDestroyNotify)g_free, (GDestroyNotify)free_iter_slice);
 	
 	/* Create filter */
-	data->contacts_filter = hito_contact_model_filter_new (
-		HITO_CONTACT_STORE (data->contacts_store));
+	data->contacts_filter = gtk_tree_model_filter_new (
+		data->contacts_store, NULL);
 	
 	/* Create groups model */
-	group_store = hito_group_store_new ();
-	hito_group_store_add_group (HITO_GROUP_STORE (group_store),
-		hito_all_group_new ());
-	hito_group_store_set_view (HITO_GROUP_STORE (group_store), view);
+	data->contacts_combo = gtk_combo_box_new_text ();
 	
 	/* Create search box */
-	searchbar = moko_search_bar_new_with_combo (GTK_COMBO_BOX (
-		hito_group_combo_new (HITO_GROUP_STORE (group_store))));
+	searchbar = moko_search_bar_new_with_combo (
+		GTK_COMBO_BOX (data->contacts_combo));
 	
-	/* Create cell renderer and tree view */
+	/* Create tree view */
 	data->contacts_treeview = gtk_tree_view_new_with_model (
 		data->contacts_filter);
 	gtk_tree_view_set_rules_hint (GTK_TREE_VIEW (
 		data->contacts_treeview), TRUE);
 	gtk_tree_view_set_headers_visible (
 		GTK_TREE_VIEW (data->contacts_treeview), FALSE);
+	
+	/* Create renderer and column */
+	/* Slight abuse of the note cell renderer I suppose... */
 	renderer = jana_gtk_cell_renderer_note_new ();
-	g_signal_connect (data->contacts_treeview, "size-allocate",
-		G_CALLBACK (jana_gtk_utils_treeview_resize), renderer);
 	g_object_set (G_OBJECT (renderer), "show_created", FALSE,
-		"show_recipient", FALSE, "icon", pixbuf, NULL);
-	gtk_tree_view_insert_column_with_data_func (
+		"show_recipient", FALSE, NULL);
+	
+	gtk_tree_view_insert_column_with_attributes (
 		GTK_TREE_VIEW (data->contacts_treeview),
-		0, NULL, renderer, (GtkTreeCellDataFunc)sms_contacts_data_func,
-		data, NULL);
+		0, NULL, renderer, "author", COL_NAME,
+		"body", COL_DETAIL, "icon", COL_ICON, NULL);
 	
+	g_signal_connect (data->contacts_treeview, "size-allocate",
+		G_CALLBACK (jana_gtk_utils_treeview_resize), renderer);
+
 	/* Pack treeview into a finger-scroll */
 	scroll = moko_finger_scroll_new ();
 	gtk_container_add (GTK_CONTAINER (scroll), data->contacts_treeview);
@@ -144,6 +253,12 @@
 	gtk_widget_show_all (vbox);
 	
 	/* Start book view */
+	g_signal_connect (view, "contacts-added",
+		G_CALLBACK (contacts_added_cb), data);
+	g_signal_connect (view, "contacts-changed",
+		G_CALLBACK (contacts_changed_cb), data);
+	g_signal_connect (view, "contacts-removed",
+		G_CALLBACK (contacts_removed_cb), data);
 	e_book_view_start (view);
 	
 	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-11-21 13:18:47 UTC (rev 3463)
+++ trunk/src/target/OM-2007.2/applications/openmoko-messages2/src/sms-contacts.h	2007-11-21 15:17:58 UTC (rev 3464)
@@ -22,6 +22,14 @@
 
 #include "sms.h"
 
+enum {
+	COL_UID,
+	COL_NAME,
+	COL_DETAIL,
+	COL_ICON,
+	COL_LAST
+};
+
 GtkWidget *sms_contacts_page_new (SmsData *data);
 
 #endif

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-11-21 13:18:47 UTC (rev 3463)
+++ trunk/src/target/OM-2007.2/applications/openmoko-messages2/src/sms-notes.c	2007-11-21 15:17:58 UTC (rev 3464)
@@ -18,10 +18,10 @@
  */
 
 #include "sms-notes.h"
+#include "sms-contacts.h"
 #include <libjana-ecal/jana-ecal.h>
 #include <libmokoui2/moko-finger-scroll.h>
 #include <libmokoui2/moko-search-bar.h>
-#include <libhito/hito-contact-store.h>
 #include <libebook/e-book.h>
 
 static GdkColor alt_color;
@@ -33,16 +33,27 @@
 {
 	GtkTreeSelection *selection;
 	GtkTreeModel *model;
+	EContact *contact;
 	GtkTreeIter iter;
-	EContact *contact = NULL;
+	gchar *uid;
 	
+	GError *error = NULL;
+	
 	selection = gtk_tree_view_get_selection (
 		GTK_TREE_VIEW (data->contacts_treeview));
 	
 	if (!gtk_tree_selection_get_selected (selection, &model, &iter))
 		return NULL;
-	gtk_tree_model_get (model, &iter, COLUMN_CONTACT, &contact, -1);
+	gtk_tree_model_get (model, &iter, COL_UID, &uid, -1);
 	
+	if (!e_book_get_contact (data->ebook, uid, &contact, &error)) {
+		g_warning ("Error retrieving contact: %s", error->message);
+		g_error_free (error);
+		contact = NULL;
+	}
+	
+	g_free (uid);
+	
 	return contact;
 }
 

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-11-21 13:18:47 UTC (rev 3463)
+++ trunk/src/target/OM-2007.2/applications/openmoko-messages2/src/sms.h	2007-11-21 15:17:58 UTC (rev 3464)
@@ -25,24 +25,32 @@
 #include <libjana-gtk/jana-gtk.h>
 #include <dbus/dbus-glib.h>
 #include <dbus/dbus-glib-bindings.h>
+#include <libebook/e-book.h>
 
 typedef struct {
 	JanaStore *notes;
 	JanaStoreView *notes_view;
+	GtkTreeModel *note_store;
+	GtkTreeModel *note_filter;
+
+	EBook *ebook;
 	GtkTreeModel *contacts_store;
 	GtkTreeModel *contacts_filter;
-	GtkTreeModel *note_store;
-	GtkTreeModel *note_filter;
+	GHashTable *contacts;
 	
 	GtkWidget *window;
 	GtkWidget *notebook;
 	GtkToolItem *new_button;
 	GtkToolItem *delete_all_button;
 	GtkToolItem *delete_button;
-	GtkWidget *contacts_treeview;
+
 	GtkWidget *notes_combo;
 	GtkWidget *sms_hbox;
 	GtkWidget *sms_textview;
+
+	GtkWidget *contacts_treeview;
+	GtkWidget *contacts_combo;
+	GdkPixbuf *no_photo;
 	
 	gulong delete_all_handler;
 	gulong delete_handler;





More information about the commitlog mailing list