move ilist widget filling to a idler... defers a chunk of work to idle time

over a period of time keeping e interactive and usable.



SVN revision: 38836
This commit is contained in:
Carsten Haitzler 2009-01-29 06:29:36 +00:00
parent 5e4929a1cf
commit 7576e5a311
5 changed files with 279 additions and 1 deletions

View File

@ -18407,6 +18407,7 @@ group { name: "e/toolbar/default/base";
mouse_events: 0;
description {
state: "default" 0.0;
fixed: 1 1;
// aspect: 6.4 6.4;
// aspect_preference: HORIZONTAL;
align: 0.0 0.0;

View File

@ -9,10 +9,12 @@ typedef struct _E_Ilist_Item E_Ilist_Item;
struct _E_Ilist_Item
{
void *sd;
const char *label;
Evas_Object *o_base;
Evas_Object *o_icon;
unsigned char header : 1;
unsigned char selected : 1;
unsigned char queued : 1;
void (*func) (void *data, void *data2);
void (*func_hilight) (void *data, void *data2);

View File

@ -3,6 +3,8 @@
*/
#include "e.h"
typedef struct _E_Widget_Queue_Item E_Widget_Queue_Item;
typedef struct _E_Widget_Data E_Widget_Data;
typedef struct _E_Widget_Callback E_Widget_Callback;
struct _E_Widget_Data
@ -10,6 +12,14 @@ struct _E_Widget_Data
Evas_Object *o_widget, *o_scrollframe, *o_ilist;
Eina_List *callbacks;
char **value;
struct {
Eina_List *queue;
Ecore_Timer *timer;
int count;
int show_nth;
int select_nth;
} queue;
};
struct _E_Widget_Callback
{
@ -18,6 +28,20 @@ struct _E_Widget_Callback
char *value;
};
struct _E_Widget_Queue_Item
{
int command;
Evas_Object *icon;
const char *label;
int header;
void (*func) (void *data);
void *data;
const char *val;
int relative;
int use_relative;
int item;
};
static void _e_wid_del_hook(Evas_Object *obj);
static void _e_wid_focus_hook(Evas_Object *obj);
static void _e_wid_cb_scrollframe_resize(void *data, Evas *e, Evas_Object *obj, void *event_info);
@ -26,6 +50,209 @@ static void _e_wid_cb_item_hilight(void *data, void *data2);
static void _e_wid_cb_selected(void *data, Evas_Object *obj, void *event_info);
static void _e_wid_focus_steal(void *data, Evas *e, Evas_Object *obj, void *event_info);
static int _queue_timer(void *data);
static void _queue_queue(Evas_Object *obj);
static void _queue_append(Evas_Object *obj, int command, Evas_Object *icon, const char *label, int header, void (*func) (void *data), void *data, const char *val, int relative, int use_relative, int item);
static void _queue_remove(Evas_Object *obj, E_Widget_Queue_Item *qi, int del);
static int
_queue_timer(void *data)
{
Evas_Object *obj;
E_Widget_Data *wd;
int num;
obj = data;
wd = e_widget_data_get(obj);
wd->queue.timer = NULL;
e_widget_ilist_freeze(obj);
num = 0;
while (wd->queue.queue)
{
E_Widget_Queue_Item *qi;
qi = wd->queue.queue->data;
if (qi->command == 0)
{
E_Widget_Callback *wcb, *rcb;
wcb = E_NEW(E_Widget_Callback, 1);
if (!wcb) break;
wcb->func = qi->func;
wcb->data = qi->data;
if (qi->val) wcb->value = strdup(qi->val);
wd->callbacks = eina_list_append(wd->callbacks, wcb);
if (qi->use_relative == 0) // append
e_ilist_append(wd->o_ilist, qi->icon, qi->label, qi->header,
_e_wid_cb_item_sel, _e_wid_cb_item_hilight, wd, wcb);
else if (qi->use_relative == 2) // prepend
e_ilist_prepend(wd->o_ilist, qi->icon, qi->label, qi->header,
_e_wid_cb_item_sel, _e_wid_cb_item_hilight, wd, wcb);
else if (qi->use_relative == 1) // append relative
{
rcb = eina_list_nth(wd->callbacks, qi->relative);
if (rcb)
{
wd->callbacks = eina_list_append_relative(wd->callbacks, wcb, rcb);
e_ilist_append_relative(wd->o_ilist, qi->icon, qi->label, qi->header,
_e_wid_cb_item_sel, _e_wid_cb_item_hilight, wd, wcb, qi->relative);
}
else
{
wd->callbacks = eina_list_append(wd->callbacks, wcb);
e_ilist_append(wd->o_ilist, qi->icon, qi->label, qi->header,
_e_wid_cb_item_sel, _e_wid_cb_item_hilight, wd, wcb);
}
}
else if (qi->use_relative == 3) // prepend relative
{
rcb = eina_list_nth(wd->callbacks, qi->relative);
if (rcb)
{
wd->callbacks = eina_list_prepend_relative(wd->callbacks, wcb, rcb);
e_ilist_prepend_relative(wd->o_ilist, qi->icon, qi->label, qi->header,
_e_wid_cb_item_sel, _e_wid_cb_item_hilight, wd, wcb, qi->relative);
}
else
{
wd->callbacks = eina_list_prepend(wd->callbacks, wcb);
e_ilist_prepend(wd->o_ilist, qi->icon, qi->label, qi->header,
_e_wid_cb_item_sel, _e_wid_cb_item_hilight, wd, wcb);
}
}
if (qi->icon) evas_object_show(qi->icon);
}
else if (qi->command == 1)
{
e_ilist_nth_label_set(wd->o_ilist, qi->item, qi->label);
}
else if (qi->command == 2)
{
e_ilist_nth_icon_set(wd->o_ilist, qi->item, qi->icon);
}
else if (qi->command == 3)
{
Evas_Coord x, y, w, h;
e_ilist_nth_geometry_get(wd->o_ilist, qi->item, &x, &y, &w, &h);
if (qi->use_relative)
e_scrollframe_child_pos_set(wd->o_scrollframe, x, y);
else
e_scrollframe_child_region_show(wd->o_scrollframe, x, y, w, h);
}
else if (qi->command == 4)
{
e_ilist_selected_set(wd->o_ilist, qi->item);
}
else if (qi->command == 5)
{
if ((wd->value) && *(wd->value))
{
free(*(wd->value));
*(wd->value) = NULL;
}
e_ilist_unselect(wd->o_ilist);
}
else if (qi->command == 6)
{
E_Widget_Callback *wcb;
e_ilist_remove_num(wd->o_ilist, qi->item);
if ((wcb = eina_list_nth(wd->callbacks, qi->item)))
{
if (wcb->value) free(wcb->value);
free(wcb);
wd->callbacks = eina_list_remove(wd->callbacks, wcb);
}
}
else if (qi->command == 7)
{
e_ilist_multi_select(wd->o_ilist, qi->item);
}
else if (qi->command == 8)
{
e_ilist_range_select(wd->o_ilist, qi->item);
}
_queue_remove(obj, qi, 0);
num++;
if (num >= 10) break;
}
e_widget_ilist_thaw(obj);
e_widget_ilist_go(obj);
_queue_queue(obj);
return 0;
}
static void
_queue_queue(Evas_Object *obj)
{
E_Widget_Data *wd;
wd = e_widget_data_get(obj);
if (!wd->queue.queue) return;
if (wd->queue.timer) return;
wd->queue.timer = ecore_timer_add(0.05, _queue_timer, obj);
}
static void
_queue_append(Evas_Object *obj,
int command,
Evas_Object *icon,
const char *label,
int header,
void (*func) (void *data),
void *data,
const char *val,
int relative,
int use_relative,
int item)
{
E_Widget_Data *wd;
E_Widget_Queue_Item *qi;
wd = e_widget_data_get(obj);
qi = E_NEW(E_Widget_Queue_Item, 1);
if (!qi) return;
qi->command = command;
qi->icon = icon;
qi->label = eina_stringshare_add(label);
qi->header = header;
qi->func = func;
qi->data = data;
qi->val = eina_stringshare_add(val);
qi->relative = relative;
qi->use_relative = use_relative;
qi->item = item;
wd->queue.queue = eina_list_append(wd->queue.queue, qi);
_queue_queue(obj);
}
static void
_queue_remove(Evas_Object *obj, E_Widget_Queue_Item *qi, int del)
{
E_Widget_Data *wd;
wd = e_widget_data_get(obj);
wd->queue.queue = eina_list_remove(wd->queue.queue, qi);
if (del)
{
if (qi->icon) evas_object_del(qi->icon);
}
eina_stringshare_del(qi->label);
eina_stringshare_del(qi->val);
free(qi);
}
static void
_queue_clear(Evas_Object *obj)
{
E_Widget_Data *wd;
wd = e_widget_data_get(obj);
while (wd->queue.queue)
_queue_remove(obj, wd->queue.queue->data, 1);
if (wd->queue.timer) ecore_timer_del(wd->queue.timer);
wd->queue.timer = NULL;
}
/* externally accessible functions */
EAPI Evas_Object *
e_widget_ilist_add(Evas *evas, int icon_w, int icon_h, char **value)
@ -86,6 +313,8 @@ e_widget_ilist_thaw(Evas_Object *obj)
EAPI void
e_widget_ilist_append(Evas_Object *obj, Evas_Object *icon, const char *label, void (*func) (void *data), void *data, const char *val)
{
_queue_append(obj, 0, icon, label, 0, func, data, val, 0, 0, 0);
/*
E_Widget_Data *wd;
E_Widget_Callback *wcb;
@ -99,11 +328,14 @@ e_widget_ilist_append(Evas_Object *obj, Evas_Object *icon, const char *label, vo
wd->callbacks = eina_list_append(wd->callbacks, wcb);
e_ilist_append(wd->o_ilist, icon, label, 0, _e_wid_cb_item_sel, _e_wid_cb_item_hilight, wd, wcb);
if (icon) evas_object_show(icon);
*/
}
EAPI void
e_widget_ilist_append_relative(Evas_Object *obj, Evas_Object *icon, const char *label, void (*func) (void *data), void *data, const char *val, int relative)
{
_queue_append(obj, 0, icon, label, 0, func, data, val, 1, relative, 0);
/*
E_Widget_Data *wd;
E_Widget_Callback *wcb, *rcb;
@ -128,11 +360,14 @@ e_widget_ilist_append_relative(Evas_Object *obj, Evas_Object *icon, const char *
}
if (icon) evas_object_show(icon);
*/
}
EAPI void
e_widget_ilist_prepend(Evas_Object *obj, Evas_Object *icon, const char *label, void (*func) (void *data), void *data, const char *val)
{
_queue_append(obj, 0, icon, label, 0, func, data, val, 2, 0, 0);
/*
E_Widget_Data *wd;
E_Widget_Callback *wcb;
@ -146,11 +381,14 @@ e_widget_ilist_prepend(Evas_Object *obj, Evas_Object *icon, const char *label, v
wd->callbacks = eina_list_prepend(wd->callbacks, wcb);
e_ilist_prepend(wd->o_ilist, icon, label, 0, _e_wid_cb_item_sel, _e_wid_cb_item_hilight, wd, wcb);
if (icon) evas_object_show(icon);
*/
}
EAPI void
e_widget_ilist_prepend_relative(Evas_Object *obj, Evas_Object *icon, const char *label, void (*func) (void *data), void *data, const char *val, int relative)
{
_queue_append(obj, 0, icon, label, 0, func, data, val, 3, relative, 0);
/*
E_Widget_Data *wd;
E_Widget_Callback *wcb, *rcb;
@ -175,11 +413,14 @@ e_widget_ilist_prepend_relative(Evas_Object *obj, Evas_Object *icon, const char
}
if (icon) evas_object_show(icon);
*/
}
EAPI void
e_widget_ilist_header_append(Evas_Object *obj, Evas_Object *icon, const char *label)
{
_queue_append(obj, 0, icon, label, 1, NULL, NULL, NULL, 0, 0, 0);
/*
E_Widget_Data *wd;
E_Widget_Callback *wcb;
@ -190,6 +431,7 @@ e_widget_ilist_header_append(Evas_Object *obj, Evas_Object *icon, const char *la
wd->callbacks = eina_list_append(wd->callbacks, wcb);
e_ilist_append(wd->o_ilist, icon, label, 1, NULL, NULL, NULL, NULL);
if (icon) evas_object_show(icon);
*/
}
EAPI void
@ -230,6 +472,7 @@ e_widget_ilist_clear(Evas_Object *obj)
E_Widget_Data *wd;
wd = e_widget_data_get(obj);
_queue_clear(obj);
e_ilist_clear(wd->o_ilist);
e_scrollframe_child_pos_set(wd->o_scrollframe, 0, 0);
while (wd->callbacks)
@ -273,10 +516,13 @@ e_widget_ilist_nth_is_header(Evas_Object *obj, int n)
EAPI void
e_widget_ilist_nth_label_set(Evas_Object *obj, int n, const char *label)
{
_queue_append(obj, 1, NULL, label, 0, NULL, NULL, NULL, 0, 0, n);
/*
E_Widget_Data *wd;
wd = e_widget_data_get(obj);
e_ilist_nth_label_set(wd->o_ilist, n, label);
*/
}
EAPI const char *
@ -291,10 +537,13 @@ e_widget_ilist_nth_label_get(Evas_Object *obj, int n)
EAPI void
e_widget_ilist_nth_icon_set(Evas_Object *obj, int n, Evas_Object *icon)
{
_queue_append(obj, 2, icon, NULL, 0, NULL, NULL, NULL, 0, 0, n);
/*
E_Widget_Data *wd;
wd = e_widget_data_get(obj);
e_ilist_nth_icon_set(wd->o_ilist, n, icon);
*/
}
EAPI Evas_Object *
@ -331,6 +580,8 @@ e_widget_ilist_nth_data_get(Evas_Object *obj, int n)
EAPI void
e_widget_ilist_nth_show(Evas_Object *obj, int n, int top)
{
_queue_append(obj, 3, NULL, NULL, 0, NULL, NULL, NULL, 0, top, n);
/*
E_Widget_Data *wd;
Evas_Coord x, y, w, h;
@ -340,15 +591,19 @@ e_widget_ilist_nth_show(Evas_Object *obj, int n, int top)
e_scrollframe_child_pos_set(wd->o_scrollframe, x, y);
else
e_scrollframe_child_region_show(wd->o_scrollframe, x, y, w, h);
*/
}
EAPI void
e_widget_ilist_selected_set(Evas_Object *obj, int n)
{
_queue_append(obj, 4, NULL, NULL, 0, NULL, NULL, NULL, 0, 0, n);
/*
E_Widget_Data *wd;
wd = e_widget_data_get(obj);
e_ilist_selected_set(wd->o_ilist, n);
*/
}
EAPI int
@ -390,6 +645,8 @@ e_widget_ilist_selected_count_get(Evas_Object *obj)
EAPI void
e_widget_ilist_unselect(Evas_Object *obj)
{
_queue_append(obj, 5, NULL, NULL, 0, NULL, NULL, NULL, 0, 0, 0);
/*
E_Widget_Data *wd;
wd = e_widget_data_get(obj);
@ -399,11 +656,14 @@ e_widget_ilist_unselect(Evas_Object *obj)
*(wd->value) = NULL;
}
e_ilist_unselect(wd->o_ilist);
*/
}
EAPI void
e_widget_ilist_remove_num(Evas_Object *obj, int n)
{
_queue_append(obj, 6, NULL, NULL, 0, NULL, NULL, NULL, 0, 0, n);
/*
E_Widget_Data *wd;
E_Widget_Callback *wcb;
@ -413,6 +673,7 @@ e_widget_ilist_remove_num(Evas_Object *obj, int n)
if (wcb->value) free(wcb->value);
free(wcb);
wd->callbacks = eina_list_remove(wd->callbacks, wcb);
*/
}
EAPI void
@ -436,19 +697,25 @@ e_widget_ilist_multi_select_get(Evas_Object *obj)
EAPI void
e_widget_ilist_multi_select(Evas_Object *obj, int n)
{
_queue_append(obj, 7, NULL, NULL, 0, NULL, NULL, NULL, 0, 0, n);
/*
E_Widget_Data *wd;
wd = e_widget_data_get(obj);
e_ilist_multi_select(wd->o_ilist, n);
*/
}
EAPI void
e_widget_ilist_range_select(Evas_Object *obj, int n)
{
_queue_append(obj, 8, NULL, NULL, 0, NULL, NULL, NULL, 0, 0, n);
/*
E_Widget_Data *wd;
wd = e_widget_data_get(obj);
e_ilist_range_select(wd->o_ilist, n);
*/
}
EAPI void
@ -473,6 +740,7 @@ _e_wid_del_hook(Evas_Object *obj)
E_Widget_Data *wd;
wd = e_widget_data_get(obj);
_queue_clear(obj);
while (wd->callbacks)
{
E_Widget_Callback *wcb;

View File

@ -308,10 +308,17 @@ _basic_check_changed(E_Config_Dialog *cfd __UNUSED__, E_Config_Dialog_Data *cfda
Ecore_X_Screen_Refresh_Rate *rt;
r = e_widget_ilist_selected_get(cfdata->res_list);
if (r < 0) return;
printf("r = %i\n", res, r);
res = evas_list_nth(cfdata->resolutions, r);
if (!res) return;
r = e_widget_ilist_selected_get(cfdata->rate_list);
if (r < 0) return;
rt = evas_list_nth(res->rates, r);
if (!rt) return;
printf("res = %i, r = %i, rt = %i\n", res, r, rt);
return (e_config->display_res_restore != cfdata->restore) ||
(res->size.width != cfdata->orig_size.width) ||
(res->size.height != cfdata->orig_size.height) ||

View File

@ -1408,7 +1408,7 @@ _e_kbd_int_dictlist_up(E_Kbd_Int *ki)
o = e_widget_ilist_add(ki->dictlist.popup->evas, 32 * e_scale, 32 * e_scale, NULL);
e_widget_ilist_selector_set(o, 1);
e_ilist_freeze(o);
e_widget_ilist_freeze(o);
ki->dictlist.ilist_obj = o;
homedir = e_user_homedir_get();