defer recalc for faster init and changes.

SVN revision: 36766
This commit is contained in:
Carsten Haitzler 2008-10-18 03:55:44 +00:00
parent 6ebf40094f
commit 3a2be900c9
2 changed files with 45 additions and 9 deletions

View File

@ -188,6 +188,15 @@ extern "C" {
EAPI void elm_entry_entry_insert(Evas_Object *obj, const char *entry); EAPI void elm_entry_entry_insert(Evas_Object *obj, const char *entry);
EAPI void elm_entry_line_wrap_set(Evas_Object *obj, Evas_Bool wrap); EAPI void elm_entry_line_wrap_set(Evas_Object *obj, Evas_Bool wrap);
/* smart callbacks called: /* smart callbacks called:
* "changed" - the text content changed
* "selection,start" -
* "selection,changed" -
* "selection,cleared" -
* "selection,paste" -
* "selection,copy" -
* "selection,cut" -
* "cursor,changed" -
* "anchor,X,clicked,N" - achor called X was clicked with button N
*/ */
// FIXME: fixes to do // FIXME: fixes to do

View File

@ -6,7 +6,10 @@ typedef struct _Widget_Data Widget_Data;
struct _Widget_Data struct _Widget_Data
{ {
Evas_Object *ent; Evas_Object *ent;
Evas_Coord lastw;
Evas_Bool changed;
Evas_Bool linewrap; Evas_Bool linewrap;
Ecore_Job *deferred_recalc_job;
}; };
static void _del_hook(Evas_Object *obj); static void _del_hook(Evas_Object *obj);
@ -26,9 +29,28 @@ static void
_del_hook(Evas_Object *obj) _del_hook(Evas_Object *obj)
{ {
Widget_Data *wd = elm_widget_data_get(obj); Widget_Data *wd = elm_widget_data_get(obj);
if (wd->deferred_recalc_job) ecore_job_del(wd->deferred_recalc_job);
free(wd); free(wd);
} }
static void
_elm_win_recalc_job(void *data)
{
Widget_Data *wd = elm_widget_data_get(data);
Evas_Coord minw = -1, minh = -1, maxw = -1, maxh = -1;
Evas_Coord resw, resh, minminw;
wd->deferred_recalc_job = NULL;
evas_object_geometry_get(wd->ent, NULL, NULL, &resw, &resh);
resh = 0;
minminw = 0;
edje_object_size_min_restricted_calc(wd->ent, &minw, &minh, 0, 0);
minminw = minw;
edje_object_size_min_restricted_calc(wd->ent, &minw, &minh, resw, 0);
evas_object_size_hint_min_set(data, minminw, minh);
evas_object_size_hint_max_set(data, minminw, maxh);
}
static void static void
_sizing_eval(Evas_Object *obj) _sizing_eval(Evas_Object *obj)
{ {
@ -39,16 +61,15 @@ _sizing_eval(Evas_Object *obj)
if (wd->linewrap) if (wd->linewrap)
{ {
evas_object_geometry_get(wd->ent, NULL, NULL, &resw, &resh); evas_object_geometry_get(wd->ent, NULL, NULL, &resw, &resh);
resh = 0; if ((resw == wd->lastw) && (!wd->changed)) return;
minminw = 0; wd->changed = 0;
edje_object_size_min_restricted_calc(wd->ent, &minw, &minh, 0, 0); wd->lastw = resw;
minminw = minw; if (wd->deferred_recalc_job) ecore_job_del(wd->deferred_recalc_job);
edje_object_size_min_restricted_calc(wd->ent, &minw, &minh, resw, 0); wd->deferred_recalc_job = ecore_job_add(_elm_win_recalc_job, obj);
evas_object_size_hint_min_set(obj, minminw, minh);
evas_object_size_hint_max_set(obj, minminw, maxh);
} }
else else
{ {
evas_object_geometry_get(wd->ent, NULL, NULL, &resw, &resh);
edje_object_size_min_calc(wd->ent, &minw, &minh); edje_object_size_min_calc(wd->ent, &minw, &minh);
evas_object_size_hint_min_set(obj, minw, minh); evas_object_size_hint_min_set(obj, minw, minh);
evas_object_size_hint_max_set(obj, maxw, maxh); evas_object_size_hint_max_set(obj, maxw, maxh);
@ -74,6 +95,7 @@ _signal_entry_changed(void *data, Evas_Object *obj, const char *emission, const
{ {
Widget_Data *wd = elm_widget_data_get(data); Widget_Data *wd = elm_widget_data_get(data);
evas_object_smart_callback_call(data, "changed", NULL); evas_object_smart_callback_call(data, "changed", NULL);
wd->changed = 1;
_sizing_eval(data); _sizing_eval(data);
} }
@ -105,6 +127,7 @@ static void
_signal_entry_paste_request(void *data, Evas_Object *obj, const char *emission, const char *source) _signal_entry_paste_request(void *data, Evas_Object *obj, const char *emission, const char *source)
{ {
Widget_Data *wd = elm_widget_data_get(data); Widget_Data *wd = elm_widget_data_get(data);
evas_object_smart_callback_call(data, "selection,paste", NULL);
// FIXME: x clipboard/copy and paste - request // FIXME: x clipboard/copy and paste - request
} }
@ -112,7 +135,7 @@ static void
_signal_entry_copy_notify(void *data, Evas_Object *obj, const char *emission, const char *source) _signal_entry_copy_notify(void *data, Evas_Object *obj, const char *emission, const char *source)
{ {
Widget_Data *wd = elm_widget_data_get(data); Widget_Data *wd = elm_widget_data_get(data);
evas_object_smart_callback_call(data, "changed", NULL); evas_object_smart_callback_call(data, "selection,copy", NULL);
// FIXME: x clipboard/copy & paste - do // FIXME: x clipboard/copy & paste - do
} }
@ -120,7 +143,9 @@ static void
_signal_entry_cut_notify(void *data, Evas_Object *obj, const char *emission, const char *source) _signal_entry_cut_notify(void *data, Evas_Object *obj, const char *emission, const char *source)
{ {
Widget_Data *wd = elm_widget_data_get(data); Widget_Data *wd = elm_widget_data_get(data);
evas_object_smart_callback_call(data, "changed", NULL); evas_object_smart_callback_call(data, "selection,cut", NULL);
wd->changed = 1;
_sizing_eval(data);
// FIXME: x clipboard/copy & paste - do // FIXME: x clipboard/copy & paste - do
} }
@ -244,6 +269,7 @@ elm_entry_entry_set(Evas_Object *obj, const char *entry)
for (l = an; l; l = l->next) for (l = an; l; l = l->next)
printf("ANCHOR: %s\n", l->data); printf("ANCHOR: %s\n", l->data);
} }
wd->changed = 1;
_sizing_eval(obj); _sizing_eval(obj);
} }
@ -266,6 +292,7 @@ elm_entry_entry_insert(Evas_Object *obj, const char *entry)
{ {
Widget_Data *wd = elm_widget_data_get(obj); Widget_Data *wd = elm_widget_data_get(obj);
edje_object_part_text_insert(wd->ent, "elm.text", entry); edje_object_part_text_insert(wd->ent, "elm.text", entry);
wd->changed = 1;
_sizing_eval(obj); _sizing_eval(obj);
} }