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
_______________________________________________
Shr-devel mailing list
[email protected]
http://lists.shr-project.org/mailman/listinfo/shr-devel