[Shr-Devel] [RFC][PATCH] message-list-view: use the list scroller events for retriving messages

Klaus Kurzmann mok at mnet-online.de
Fri Nov 19 16:42:40 CET 2010


Hello Marco,

Am Mittwoch, 10. November 2010, 18:43:06 schrieb Marco Trevisan (Treviño):
> This patch uses the new "scroll,edge,bottom" and "scroll,edge,top" genlist
> callbacks for populating the message view.
> By default it loads max MSG_PAGE_SIZE messages per page, then when the
> message list is scrolled to bottom it tryies to load more messages in the
> list; when the bottom top edge is reached by scrolling up, the list tries
> to fetch the previous messages (if they exist).
> 
> Visual feedback (progress) to be done.
> ---
>  src/view/message-list-view.c |   73
> ++++++++++++++++++++++++++++++++++++++---- 1 files changed, 66
> insertions(+), 7 deletions(-)
> 
> diff --git a/src/view/message-list-view.c b/src/view/message-list-view.c
> index 1353f2f..1246522 100644
> --- a/src/view/message-list-view.c
> +++ b/src/view/message-list-view.c
> @@ -38,16 +38,26 @@
>  #include "ui-utils.h"
>  #include "message-list-view.h"
> 
> +#define MSG_PER_UPDATE 6
> +#define MSG_PAGE_SIZE MSG_PER_UPDATE*5
> +
>  struct MessageListViewData  {
>  	struct View view;
>  	char *path;
>  	int count;
> +	unsigned int msg_start;
> +	unsigned int msg_end;
>  	Evas_Object *list, *bt1, *bt2, *bt3, *hv, *bx, *button_answer,
>  		*button_delete;
>  };
>  static struct MessageListViewData view;
>  static Elm_Genlist_Item_Class itc;
> 
> +typedef enum _InsertMode {
> +	LIST_INSERT_APPEND,
> +	LIST_INSERT_PREPEND,
> +	LIST_INSERT_SORTED
> +} InsertMode;
> 
>  static void _process_messages(GError *error, GHashTable **messages, int
> count, gpointer data); static void _process_message_get(GError* error,
> GHashTable* message, gpointer data); @@ -64,6 +74,8 @@ static void
> _answer_clicked(void *_data, Evas_Object * obj, void *event_info); static
> void _forward_clicked(void *_data, Evas_Object *obj, void *event_info);
> static void _delete_clicked(void *_data, Evas_Object * obj, void
> *event_info); static void _hover_bt_1(void *_data, Evas_Object * obj, void
> *event_info); +static void _scroll_bottom(void *_data, Evas_Object * obj,
> void *event_info); +static void _scroll_top(void *_data, Evas_Object *
> obj, void *event_info); static char *gl_label_get(void *data, Evas_Object
> * obj, const char *part); static Evas_Object * gl_icon_get(void *data,
> Evas_Object * obj, const char *part); static Eina_Bool gl_state_get(void
> *data, Evas_Object *obj, const char *part); @@ -158,7 +170,12 @@
> message_list_view_init()
>  	//evas_object_size_hint_weight_set(data->list, EVAS_HINT_EXPAND,
> EVAS_HINT_EXPAND); evas_object_show(view.list);
> 
> -	phoneui_utils_messages_get(_process_messages, GINT_TO_POINTER(0)); // do
> _not_ sort in +	evas_object_smart_callback_add(view.list,
> "scroll,edge,bottom", _scroll_bottom, NULL);
> +	evas_object_smart_callback_add(view.list, "scroll,edge,top",
> _scroll_top, NULL); +
> +	view.msg_start = 0;
> +	view.msg_end = 0;
> +	phoneui_utils_messages_get_full("Timestamp", TRUE, 0, MSG_PAGE_SIZE,
> TRUE, NULL, _process_messages, GINT_TO_POINTER(LIST_INSERT_APPEND));
> phoneui_info_register_message_changes(_message_changed_cb, NULL);
> 
>  	return 0;
> @@ -360,6 +377,26 @@ _hover_bt_1(void *_data, Evas_Object * obj, void
> *event_info) evas_object_show(view.hv);
>  }
> 
> +static void _scroll_bottom(void *_data, Evas_Object * obj, void
> *event_info) { +	(void) _data;
> +	(void) obj;
> +	(void) event_info;
> +
> +	phoneui_utils_messages_get_full("Timestamp", TRUE, view.msg_end,
> MSG_PER_UPDATE, TRUE, NULL, _process_messages,
> GINT_TO_POINTER(LIST_INSERT_APPEND)); +}
> +
> +static void _scroll_top(void *_data, Evas_Object * obj, void *event_info)
> { +	(void) _data;
> +	(void) obj;
> +	(void) event_info;
> +	if (view.msg_start == 0)
> +		return;
> +
> +	unsigned int start = view.msg_start > MSG_PER_UPDATE ?
> view.msg_start-MSG_PER_UPDATE : 0; +
> +	phoneui_utils_messages_get_full("Timestamp", TRUE, start, MSG_PER_UPDATE,
> TRUE, NULL, _process_messages, GINT_TO_POINTER(LIST_INSERT_SORTED)); +}
> +
>  static void
>  _contact_lookup(GError *error, GHashTable *contact, gpointer data)
>  {
> @@ -445,7 +482,7 @@ _process_message(gpointer _message, gpointer _data)
>  	long timestamp = 0, other_timestamp = 0;
>  	char datestr[35];
>  	Elm_Genlist_Item *it = NULL;
> -	int insert_sorted;
> +	InsertMode insert_mode;
> 
>  	if (!_message) {
>  		return;
> @@ -458,7 +495,7 @@ _process_message(gpointer _message, gpointer _data)
>  		return;
>  	}
> 
> -	insert_sorted = GPOINTER_TO_INT(_data);
> +	insert_mode = GPOINTER_TO_INT(_data);
> 
>  	rowdata = g_hash_table_new_full(g_str_hash, g_str_equal, NULL,
>  					common_utils_gvalue_free);
> @@ -513,7 +550,7 @@ _process_message(gpointer _message, gpointer _data)
>  				    g_value_get_int(gval_tmp)));
>  	}
> 
> -	if (insert_sorted) {
> +	if (insert_mode == LIST_INSERT_SORTED) {
>  		it = elm_genlist_first_item_get(view.list);
>  		while (it) {
>  			other = (GHashTable *)elm_genlist_item_data_get(it);
> @@ -535,8 +572,13 @@ _process_message(gpointer _message, gpointer _data)
>  	}
> 
>  	if (!it) {
> -		it = elm_genlist_item_append(view.list, &itc, rowdata, NULL,
> -				     ELM_GENLIST_ITEM_NONE, NULL, NULL);
> +		if (insert_mode == LIST_INSERT_PREPEND) {
> +			it = elm_genlist_item_prepend(view.list, &itc, rowdata, NULL,
> +					     ELM_GENLIST_ITEM_NONE, NULL, NULL);
> +		} else {
> +			it = elm_genlist_item_append(view.list, &itc, rowdata, NULL,
> +					     ELM_GENLIST_ITEM_NONE, NULL, NULL);
> +		}
>  	}
> 
>  	gval_tmp = g_hash_table_lookup(message, "@Contacts");
> @@ -548,6 +590,23 @@ _process_message(gpointer _message, gpointer _data)
>  	}
> 
>  	g_hash_table_destroy(message);
> +
> +	view.msg_end++;
> +
> +	if ((view.msg_end - view.msg_start) > MSG_PAGE_SIZE) {
> +		if (insert_mode == LIST_INSERT_APPEND) {
> +			it = elm_genlist_first_item_get(view.list);
> +			view.msg_start++;
> +		} else {
> +			it = elm_genlist_last_item_get(view.list);
> +			view.msg_start = view.msg_start > 1 ? view.msg_start-1 : 0;
> +			view.msg_end = view.msg_end > 2 ? view.msg_end-2 : 0;
> +		}
> +
> +		if (it) {
> +			elm_genlist_item_del(it);
> +		}
> +	}
>  }
> 
>  static char *
> @@ -652,7 +711,7 @@ static void
>  _add_message(const char *path)
>  {
>  	// insert sorted
> -	phoneui_utils_message_get(path, _process_message_get,
> GINT_TO_POINTER(1)); +	phoneui_utils_message_get(path,
> _process_message_get, GINT_TO_POINTER(LIST_INSERT_SORTED)); }
> 
>  static void

I did not try to debug it yet - don't even know which part (libphone-ui-shr or 
e) is at fault, but with very few messages (2 in my case) the list starts to 
endlessly bounce when I let it bounce once with my finger. Dunno how to explain 
it better. It stops bouncing when I manage to select one of the messages and 
press Show. Otherwise it will happily bounce forever :-P

-- 
Klaus 'mrmoku' Kurzmann


More information about the Shr-devel mailing list