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