Evas textblock: Clean the code a bit (remove node-invalidation func).

No need for that, just specifically mark where needed that a node has
changed. This is cleaner and nicer.

SVN revision: 58417
This commit is contained in:
Tom Hacohen 2011-04-07 11:24:11 +00:00
parent 4d3ab4d8b4
commit 8ea0800b21
1 changed files with 40 additions and 32 deletions

View File

@ -244,6 +244,7 @@ struct _Evas_Object_Textblock_Node_Text
Evas_Object_Textblock_Node_Format *format_node; Evas_Object_Textblock_Node_Format *format_node;
Evas_BiDi_Paragraph_Props *bidi_props; Evas_BiDi_Paragraph_Props *bidi_props;
Eina_Bool dirty : 1; Eina_Bool dirty : 1;
Eina_Bool new : 1;
}; };
struct _Evas_Object_Textblock_Node_Format struct _Evas_Object_Textblock_Node_Format
@ -517,7 +518,7 @@ static Eina_Bool _evas_textblock_format_is_visible(const char *s);
static void _evas_textblock_node_format_remove(Evas_Object_Textblock *o, Evas_Object_Textblock_Node_Format *n, int visual_adjustment); static void _evas_textblock_node_format_remove(Evas_Object_Textblock *o, Evas_Object_Textblock_Node_Format *n, int visual_adjustment);
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_text_node_changed(Evas_Object_Textblock *o, Evas_Object *obj, Evas_Object_Textblock_Node_Text *n); static void _evas_textblock_changed(Evas_Object_Textblock *o, Evas_Object *obj);
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);
@ -3449,6 +3450,7 @@ _layout(const Evas_Object *obj, int calc_only, int w, int h, int *w_ret, int *h_
if (o->content_changed) if (o->content_changed)
{ {
/* FIXME-tom: Add some logic to redo only the dirty nodes */
_paragraphs_free(obj, o->paragraphs); _paragraphs_free(obj, o->paragraphs);
/* Go through all the text nodes to create the logical layout */ /* Go through all the text nodes to create the logical layout */
EINA_INLIST_FOREACH(c->o->text_nodes, n) EINA_INLIST_FOREACH(c->o->text_nodes, n)
@ -3457,9 +3459,12 @@ _layout(const Evas_Object *obj, int calc_only, int w, int h, int *w_ret, int *h_
size_t start; size_t start;
int off; int off;
n->dirty = 0; /* Mark as if we cleaned the paragraph, although /* Mark as if we cleaned the paragraph, although
we should really use it to fine tune the we should really use it to fine tune the
changes here, and not just blindly mark */ changes here, and not just blindly mark */
n->new = EINA_FALSE;
n->dirty = EINA_FALSE;
_layout_paragraph_new(c, n); /* Each node is a paragraph */ _layout_paragraph_new(c, n); /* Each node is a paragraph */
/* For each text node to thorugh all of it's format nodes /* For each text node to thorugh all of it's format nodes
@ -3882,7 +3887,8 @@ evas_textblock_style_set(Evas_Textblock_Style *ts, const char *text)
Evas_Object_Textblock *o; Evas_Object_Textblock *o;
o = (Evas_Object_Textblock *)(obj->object_data); o = (Evas_Object_Textblock *)(obj->object_data);
_evas_textblock_text_node_changed(o, obj, NULL); _evas_textblock_changed(o, obj);
/* FIXME-tom: Update the affected nodes. */
} }
_style_replace(ts, text); _style_replace(ts, text);
@ -4019,7 +4025,8 @@ evas_object_textblock_style_set(Evas_Object *obj, Evas_Textblock_Style *ts)
} }
o->style = ts; o->style = ts;
_evas_textblock_text_node_changed(o, obj, NULL); _evas_textblock_changed(o, obj);
/* FIXME-tom: Update the affected nodes */
} }
/** /**
@ -4047,7 +4054,8 @@ 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_text_node_changed(o, obj, NULL); _evas_textblock_changed(o, obj);
/* FIXME-tom: Invalidate all the nodes */
} }
/** /**
@ -4105,7 +4113,7 @@ evas_object_textblock_valign_set(Evas_Object *obj, double align)
else if (align > 1.0) align = 1.0; else if (align > 1.0) align = 1.0;
if (o->valign == align) return; if (o->valign == align) return;
o->valign = align; o->valign = align;
_evas_textblock_text_node_changed(o, obj, NULL); _evas_textblock_changed(o, obj);
} }
/** /**
@ -4508,7 +4516,11 @@ evas_object_textblock_text_markup_prepend(Evas_Textblock_Cursor *cur, const char
p++; p++;
} }
} }
_evas_textblock_text_node_changed(o, obj, o->cursor->node); _evas_textblock_changed(o, obj);
/* If the node is NULL it means we just created paragraphs,
* and not edited, so no need to mark anything */
if (o->cursor->node)
o->cursor->node->dirty = EINA_TRUE;
} }
@ -5099,7 +5111,8 @@ evas_textblock_node_format_remove_pair(Evas_Object *obj,
/* pnode can never be visible! (it's the closing format) */ /* pnode can never be visible! (it's the closing format) */
_evas_textblock_node_format_remove(o, pnode, 0); _evas_textblock_node_format_remove(o, pnode, 0);
} }
_evas_textblock_text_node_changed(o, obj, tnode); _evas_textblock_changed(o, obj);
/* FIXME-tom: Add invalidation point? make the node? can't tell */
} }
/** /**
@ -6166,6 +6179,7 @@ _evas_textblock_node_text_new(void)
n->unicode = eina_ustrbuf_new(); n->unicode = eina_ustrbuf_new();
/* We want to layout each paragraph at least once. */ /* We want to layout each paragraph at least once. */
n->dirty = EINA_TRUE; n->dirty = EINA_TRUE;
n->new = EINA_TRUE;
#ifdef BIDI_SUPPORT #ifdef BIDI_SUPPORT
n->bidi_props = evas_bidi_paragraph_props_new(); n->bidi_props = evas_bidi_paragraph_props_new();
n->bidi_props->direction = EVAS_BIDI_PARAGRAPH_NATURAL; n->bidi_props->direction = EVAS_BIDI_PARAGRAPH_NATURAL;
@ -6341,28 +6355,14 @@ _evas_textblock_cursors_update_offset(const Evas_Textblock_Cursor *cur,
/** /**
* @internal * @internal
* Mark and notifiy that the textblock, and specifically a node has changed. * Mark that the textblock has changed.
* *
* @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 - NULL means all.
*/ */
static void static void
_evas_textblock_text_node_changed(Evas_Object_Textblock *o, Evas_Object *obj, _evas_textblock_changed(Evas_Object_Textblock *o, Evas_Object *obj)
Evas_Object_Textblock_Node_Text *n)
{ {
if (!n)
{
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->formatted.valid = 0;
o->native.valid = 0; o->native.valid = 0;
o->content_changed = 1; o->content_changed = 1;
@ -6445,7 +6445,8 @@ 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_text_node_changed(o, cur->obj, n); _evas_textblock_changed(o, cur->obj);
n->dirty = EINA_TRUE;
free(text); free(text);
return len; return len;
} }
@ -6634,6 +6635,9 @@ evas_textblock_cursor_format_append(Evas_Textblock_Cursor *cur, const char *form
eina_ustrbuf_insert_char(cur->node->unicode, eina_ustrbuf_insert_char(cur->node->unicode,
EVAS_TEXTBLOCK_REPLACEMENT_CHAR, cur->pos); EVAS_TEXTBLOCK_REPLACEMENT_CHAR, cur->pos);
/* Mark as dirty */
cur->node->dirty = EINA_TRUE;
/* Advance all the cursors after our cursor */ /* Advance all the cursors after our cursor */
_evas_textblock_cursors_update_offset(cur, cur->node, cur->pos, 1); _evas_textblock_cursors_update_offset(cur, cur->node, cur->pos, 1);
if (_IS_PARAGRAPH_SEPARATOR(o, format)) if (_IS_PARAGRAPH_SEPARATOR(o, format))
@ -6650,7 +6654,8 @@ evas_textblock_cursor_format_append(Evas_Textblock_Cursor *cur, const char *form
} }
} }
_evas_textblock_text_node_changed(o, cur->obj, cur->node); _evas_textblock_changed(o, cur->obj);
/* FIXME-tom: Add invalidation point */
return is_visible; return is_visible;
} }
@ -6764,7 +6769,8 @@ 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_text_node_changed(o, cur->obj, cur->node); _evas_textblock_changed(o, cur->obj);
cur->node->dirty = EINA_TRUE;
} }
/** /**
@ -6865,7 +6871,8 @@ 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_text_node_changed(o, cur1->obj, cur1->node); _evas_textblock_changed(o, cur1->obj);
/* FIXME-tom: Should mark here as dirty! */
} }
@ -8102,7 +8109,7 @@ evas_object_textblock_clear(Evas_Object *obj)
_paragraphs_free(obj, o->paragraphs); _paragraphs_free(obj, o->paragraphs);
o->paragraphs = NULL; o->paragraphs = NULL;
} }
_evas_textblock_text_node_changed(o, obj, NULL); _evas_textblock_changed(o, obj);
} }
/** /**
@ -8776,7 +8783,8 @@ _evas_object_textblock_rehint(Evas_Object *obj)
} }
} }
} }
_evas_textblock_text_node_changed(o, obj, NULL); _evas_textblock_changed(o, obj);
/* FIXME-tom: invalidate all the text nodes */
} }
/** /**