Evas textblock: Split between content changes and other changes.

SVN revision: 56493
This commit is contained in:
Tom Hacohen 2011-01-30 10:40:36 +00:00
parent d632d526c0
commit c56c293e96
1 changed files with 39 additions and 19 deletions

View File

@ -428,6 +428,7 @@ struct _Evas_Object_Textblock
} formatted, native; } formatted, native;
unsigned char redraw : 1; unsigned char redraw : 1;
unsigned char changed : 1; unsigned char changed : 1;
unsigned char content_changed : 1;
}; };
/* private methods for textblock objects */ /* private methods for textblock objects */
@ -509,6 +510,7 @@ static void _evas_textblock_node_format_remove(Evas_Object_Textblock *o, Evas_Ob
static void _evas_textblock_node_format_free(Evas_Object_Textblock_Node_Format *n); static void _evas_textblock_node_format_free(Evas_Object_Textblock_Node_Format *n);
static void _evas_textblock_node_text_free(Evas_Object_Textblock_Node_Text *n); static void _evas_textblock_node_text_free(Evas_Object_Textblock_Node_Text *n);
static void _evas_textblock_changed(Evas_Object_Textblock *o, Evas_Object *obj); static void _evas_textblock_changed(Evas_Object_Textblock *o, Evas_Object *obj);
static void _evas_textblock_text_node_changed(Evas_Object_Textblock *o, Evas_Object *obj, Evas_Object_Textblock_Node_Text *n);
static void _evas_textblock_cursors_update_offset(const Evas_Textblock_Cursor *cur, const Evas_Object_Textblock_Node_Text *n, size_t start, int offset); static void _evas_textblock_cursors_update_offset(const Evas_Textblock_Cursor *cur, const Evas_Object_Textblock_Node_Text *n, size_t start, int offset);
static void _evas_textblock_cursors_set_node(Evas_Object_Textblock *o, const Evas_Object_Textblock_Node_Text *n, Evas_Object_Textblock_Node_Text *new_node); static void _evas_textblock_cursors_set_node(Evas_Object_Textblock *o, const Evas_Object_Textblock_Node_Text *n, Evas_Object_Textblock_Node_Text *new_node);
@ -3354,6 +3356,7 @@ _relayout(const Evas_Object *obj)
if (paragraphs) _paragraphs_clear(obj, paragraphs); if (paragraphs) _paragraphs_clear(obj, paragraphs);
o->last_w = obj->cur.geometry.w; o->last_w = obj->cur.geometry.w;
o->changed = 0; o->changed = 0;
o->content_changed = 0;
o->redraw = 1; o->redraw = 1;
} }
@ -3699,7 +3702,7 @@ evas_object_textblock_style_set(Evas_Object *obj, Evas_Textblock_Style *ts)
o->style = NULL; o->style = NULL;
} }
_evas_textblock_changed(o, obj); _evas_textblock_text_node_changed(o, obj, NULL);
} }
/** /**
@ -3727,7 +3730,7 @@ evas_object_textblock_replace_char_set(Evas_Object *obj, const char *ch)
if (o->repch) eina_stringshare_del(o->repch); if (o->repch) eina_stringshare_del(o->repch);
if (ch) o->repch = eina_stringshare_add(ch); if (ch) o->repch = eina_stringshare_add(ch);
else o->repch = NULL; else o->repch = NULL;
_evas_textblock_changed(o, obj); _evas_textblock_text_node_changed(o, obj, NULL);
} }
/** /**
@ -4116,7 +4119,7 @@ evas_object_textblock_text_markup_prepend(Evas_Textblock_Cursor *cur, const char
p++; p++;
} }
} }
_evas_textblock_changed(o, obj); _evas_textblock_text_node_changed(o, obj, o->cursor->node);
} }
@ -6004,11 +6007,6 @@ _evas_textblock_changed(Evas_Object_Textblock *o, Evas_Object *obj)
o->formatted.valid = 0; o->formatted.valid = 0;
o->native.valid = 0; o->native.valid = 0;
o->changed = 1; o->changed = 1;
if (o->markup_text)
{
free(o->markup_text);
o->markup_text = NULL;
}
evas_object_change(obj); evas_object_change(obj);
} }
@ -6019,14 +6017,34 @@ _evas_textblock_changed(Evas_Object_Textblock *o, Evas_Object *obj)
* *
* @param o the textblock object. * @param o the textblock object.
* @param obj the evas object. * @param obj the evas object.
* @param n the paragraph that changed. * @param n the paragraph that changed - NULL means all.
*/ */
static void static void
_evas_textblock_content_changed(Evas_Object_Textblock *o, Evas_Object *obj, _evas_textblock_text_node_changed(Evas_Object_Textblock *o, Evas_Object *obj,
Evas_Object_Textblock_Node_Text *n) Evas_Object_Textblock_Node_Text *n)
{ {
n->dirty = EINA_TRUE; if (!n)
_evas_textblock_changed(o, obj); {
Evas_Object_Textblock_Node_Text *itr;
EINA_INLIST_FOREACH(EINA_INLIST_GET(o->text_nodes), itr)
{
itr->dirty = EINA_TRUE;
}
}
else
{
n->dirty = EINA_TRUE;
}
o->formatted.valid = 0;
o->native.valid = 0;
o->content_changed = 1;
if (o->markup_text)
{
free(o->markup_text);
o->markup_text = NULL;
}
evas_object_change(obj);
} }
/** /**
@ -6099,7 +6117,7 @@ evas_textblock_cursor_text_append(Evas_Textblock_Cursor *cur, const char *_text)
evas_bidi_paragraph_props_unref(n->bidi_props); evas_bidi_paragraph_props_unref(n->bidi_props);
n->bidi_props = evas_bidi_paragraph_props_get(eina_ustrbuf_string_get(n->unicode)); n->bidi_props = evas_bidi_paragraph_props_get(eina_ustrbuf_string_get(n->unicode));
#endif #endif
_evas_textblock_changed(o, cur->obj); _evas_textblock_text_node_changed(o, cur->obj, n);
free(text); free(text);
return len; return len;
} }
@ -6301,7 +6319,7 @@ evas_textblock_cursor_format_append(Evas_Textblock_Cursor *cur, const char *form
} }
} }
_evas_textblock_changed(o, cur->obj); _evas_textblock_text_node_changed(o, cur->obj, cur->node);
return is_visible; return is_visible;
} }
@ -6412,7 +6430,7 @@ evas_textblock_cursor_char_delete(Evas_Textblock_Cursor *cur)
} }
_evas_textblock_cursors_update_offset(cur, n, ppos, -(index - ppos)); _evas_textblock_cursors_update_offset(cur, n, ppos, -(index - ppos));
_evas_textblock_changed(o, cur->obj); _evas_textblock_text_node_changed(o, cur->obj, cur->node);
} }
/** /**
@ -6513,7 +6531,7 @@ evas_textblock_cursor_range_delete(Evas_Textblock_Cursor *cur1, Evas_Textblock_C
if (reset_cursor) if (reset_cursor)
evas_textblock_cursor_copy(cur1, o->cursor); evas_textblock_cursor_copy(cur1, o->cursor);
_evas_textblock_changed(o, cur1->obj); _evas_textblock_text_node_changed(o, cur1->obj, cur1->node);
} }
@ -7714,7 +7732,7 @@ evas_object_textblock_clear(Evas_Object *obj)
_paragraphs_clear(obj, o->paragraphs); _paragraphs_clear(obj, o->paragraphs);
o->paragraphs = NULL; o->paragraphs = NULL;
} }
_evas_textblock_changed(o, obj); _evas_textblock_text_node_changed(o, cur->obj, cur->node);
} }
/** /**
@ -8182,7 +8200,7 @@ evas_object_textblock_render_pre(Evas_Object *obj)
/* then when this is done the object needs to figure if it changed and */ /* then when this is done the object needs to figure if it changed and */
/* if so what and where and add the appropriate redraw textblocks */ /* if so what and where and add the appropriate redraw textblocks */
o = (Evas_Object_Textblock *)(obj->object_data); o = (Evas_Object_Textblock *)(obj->object_data);
if ((o->changed) || if ((o->changed) || (o->content_changed) ||
(o->last_w != obj->cur.geometry.w)) (o->last_w != obj->cur.geometry.w))
{ {
Evas_Object_Textblock_Paragraph *paragraphs; Evas_Object_Textblock_Paragraph *paragraphs;
@ -8204,6 +8222,7 @@ evas_object_textblock_render_pre(Evas_Object *obj)
o->redraw = 0; o->redraw = 0;
evas_object_render_pre_prev_cur_add(&obj->layer->evas->clip_changes, obj); evas_object_render_pre_prev_cur_add(&obj->layer->evas->clip_changes, obj);
o->changed = 0; o->changed = 0;
o->content_changed = 0;
is_v = evas_object_is_visible(obj); is_v = evas_object_is_visible(obj);
was_v = evas_object_was_visible(obj); was_v = evas_object_was_visible(obj);
goto done; goto done;
@ -8269,10 +8288,11 @@ evas_object_textblock_render_pre(Evas_Object *obj)
evas_object_render_pre_prev_cur_add(&obj->layer->evas->clip_changes, obj); evas_object_render_pre_prev_cur_add(&obj->layer->evas->clip_changes, obj);
goto done; goto done;
} }
if (o->changed) if (o->changed || o->content_changed)
{ {
evas_object_render_pre_prev_cur_add(&obj->layer->evas->clip_changes, obj); evas_object_render_pre_prev_cur_add(&obj->layer->evas->clip_changes, obj);
o->changed = 0; o->changed = 0;
o->content_changed = 0;
} }
done: done:
evas_object_render_pre_effect_updates(&obj->layer->evas->clip_changes, obj, is_v, was_v); evas_object_render_pre_effect_updates(&obj->layer->evas->clip_changes, obj, is_v, was_v);