forked from enlightenment/efl
Evas textblock: Moved format text_node invalidation to it's own function.
SVN revision: 59273
This commit is contained in:
parent
47a59417d2
commit
8214888f83
|
@ -3552,6 +3552,76 @@ end:
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @internal
|
||||||
|
* Invalidate text nodes according to format changes
|
||||||
|
* This goes through all the new format changes and marks the text nodes
|
||||||
|
* that should be invalidated because of format changes.
|
||||||
|
*
|
||||||
|
* @param c the working context.
|
||||||
|
*/
|
||||||
|
static inline void
|
||||||
|
_format_changes_invalidate_text_nodes(Ctxt *c)
|
||||||
|
{
|
||||||
|
Evas_Object_Textblock_Node_Format *fnode = c->o->format_nodes;
|
||||||
|
Evas_Object_Textblock_Node_Text *start_n = NULL;
|
||||||
|
int balance = 0;
|
||||||
|
while (fnode)
|
||||||
|
{
|
||||||
|
if (fnode->new)
|
||||||
|
{
|
||||||
|
const char *fstr = eina_strbuf_string_get(fnode->format);
|
||||||
|
/* balance < 0 means we gave up and everything should be
|
||||||
|
* invalidated */
|
||||||
|
if (*fstr == '+')
|
||||||
|
{
|
||||||
|
balance++;
|
||||||
|
if (balance == 1)
|
||||||
|
start_n = fnode->text_node;
|
||||||
|
}
|
||||||
|
else if (*fstr == '-')
|
||||||
|
{
|
||||||
|
balance--;
|
||||||
|
if (balance == 0)
|
||||||
|
{
|
||||||
|
Evas_Object_Textblock_Node_Text *f_tnode =
|
||||||
|
fnode->text_node;
|
||||||
|
while (start_n)
|
||||||
|
{
|
||||||
|
start_n->dirty = EINA_TRUE;
|
||||||
|
if (start_n == f_tnode)
|
||||||
|
break;
|
||||||
|
start_n =
|
||||||
|
_NODE_TEXT(EINA_INLIST_GET(start_n)->next);
|
||||||
|
}
|
||||||
|
start_n = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (!fnode->visible)
|
||||||
|
balance = -1;
|
||||||
|
|
||||||
|
if (balance < 0)
|
||||||
|
{
|
||||||
|
/* if we don't already have a starting point, use the
|
||||||
|
* current paragraph. */
|
||||||
|
if (!start_n)
|
||||||
|
start_n = fnode->text_node;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fnode = _NODE_FORMAT(EINA_INLIST_GET(fnode)->next);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (balance != 0)
|
||||||
|
{
|
||||||
|
while (start_n)
|
||||||
|
{
|
||||||
|
start_n->dirty = EINA_TRUE;
|
||||||
|
start_n = _NODE_TEXT(EINA_INLIST_GET(start_n)->next);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @internal
|
* @internal
|
||||||
* Create the layout from the nodes.
|
* Create the layout from the nodes.
|
||||||
|
@ -3598,67 +3668,10 @@ _layout(const Evas_Object *obj, int calc_only, int w, int h, int *w_ret, int *h_
|
||||||
/* Mark text nodes as dirty if format have changed. */
|
/* Mark text nodes as dirty if format have changed. */
|
||||||
if (c->o->format_changed)
|
if (c->o->format_changed)
|
||||||
{
|
{
|
||||||
Evas_Object_Textblock_Node_Format *fnode = c->o->format_nodes;
|
_format_changes_invalidate_text_nodes(c);
|
||||||
Evas_Object_Textblock_Node_Text *start_n = NULL;
|
|
||||||
int balance = 0;
|
|
||||||
while (fnode)
|
|
||||||
{
|
|
||||||
if (fnode->new)
|
|
||||||
{
|
|
||||||
const char *fstr = eina_strbuf_string_get(fnode->format);
|
|
||||||
/* balance < 0 means we gave up and everything should be
|
|
||||||
* invalidated */
|
|
||||||
if (*fstr == '+')
|
|
||||||
{
|
|
||||||
balance++;
|
|
||||||
if (balance == 1)
|
|
||||||
start_n = fnode->text_node;
|
|
||||||
}
|
|
||||||
else if (*fstr == '-')
|
|
||||||
{
|
|
||||||
balance--;
|
|
||||||
if (balance == 0)
|
|
||||||
{
|
|
||||||
Evas_Object_Textblock_Node_Text *f_tnode =
|
|
||||||
fnode->text_node;
|
|
||||||
while (start_n)
|
|
||||||
{
|
|
||||||
start_n->dirty = EINA_TRUE;
|
|
||||||
if (start_n == f_tnode)
|
|
||||||
break;
|
|
||||||
start_n =
|
|
||||||
_NODE_TEXT(EINA_INLIST_GET(start_n)->next);
|
|
||||||
}
|
|
||||||
start_n = NULL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (!fnode->visible)
|
|
||||||
balance = -1;
|
|
||||||
|
|
||||||
if (balance < 0)
|
|
||||||
{
|
|
||||||
/* if we don't already have a starting point, use the
|
|
||||||
* current paragraph. */
|
|
||||||
if (!start_n)
|
|
||||||
start_n = fnode->text_node;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
fnode = _NODE_FORMAT(EINA_INLIST_GET(fnode)->next);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (balance != 0)
|
|
||||||
{
|
|
||||||
while (start_n)
|
|
||||||
{
|
|
||||||
start_n->dirty = EINA_TRUE;
|
|
||||||
start_n = _NODE_TEXT(EINA_INLIST_GET(start_n)->next);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Start of logical layout creation */
|
/* Start of logical layout creation */
|
||||||
|
|
||||||
/* setup default base style */
|
/* setup default base style */
|
||||||
if ((c->o->style) && (c->o->style->default_tag))
|
if ((c->o->style) && (c->o->style->default_tag))
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue