the textblock actually works.

so far the following works:

   o = evas_object_textblock_add(evas);
   evas_object_move(o, 10, 40);
   evas_object_resize(o, win_w - 20, win_h - 50);
   evas_object_textblock_format_insert(o, "color=#000000ff");
   evas_object_textblock_format_insert(o, "font=/usr/local/share/expedite/data/Vera.ttf size=10");
   evas_object_textblock_text_insert(o, "This is 1 line. ");
   evas_object_textblock_text_insert(o, "And some more text. ");
   evas_object_textblock_format_insert(o, "size=20");
   evas_object_textblock_format_insert(o, "color=#f80");
   evas_object_textblock_text_insert(o, "Bigger orange text.");
   evas_object_textblock_format_insert(o, "size=8");
   evas_object_textblock_format_insert(o, "color=#0000ff88");
   evas_object_textblock_format_insert(o, "\n");
   evas_object_textblock_text_insert(o, "A second line of transparent blue.");
   evas_object_show(o);

i need to implement alignment handling next...


SVN revision: 13135
This commit is contained in:
Carsten Haitzler 2005-01-30 10:22:47 +00:00
parent 0a6be14a06
commit 010a29867e
3 changed files with 290 additions and 118 deletions

View File

@ -436,7 +436,7 @@ extern "C" {
EAPI void evas_font_cache_set (Evas *e, int size); EAPI void evas_font_cache_set (Evas *e, int size);
EAPI int evas_font_cache_get (Evas *e); EAPI int evas_font_cache_get (Evas *e);
EAPI Evas_Object *evas_object_textblock_add (Evas *e); EAPI Evas_Object *evas_object_textblock_add (Evas *e);
EAPI void evas_object_textblock_clear (Evas_Object *obj); EAPI void evas_object_textblock_clear (Evas_Object *obj);
EAPI void evas_object_textblock_cursor_pos_set (Evas_Object *obj, int pos); EAPI void evas_object_textblock_cursor_pos_set (Evas_Object *obj, int pos);
EAPI int evas_object_textblock_cursor_pos_get (Evas_Object *obj); EAPI int evas_object_textblock_cursor_pos_get (Evas_Object *obj);

View File

@ -532,6 +532,7 @@ evas_object_resize(Evas_Object *obj, Evas_Coord w, Evas_Coord h)
obj->cur.cache.geometry.validity = 0; obj->cur.cache.geometry.validity = 0;
evas_object_change(obj); evas_object_change(obj);
evas_object_recalc_clippees(obj); evas_object_recalc_clippees(obj);
// if (obj->func->coords_recalc) obj->func->coords_recalc(obj);
if (!evas_event_passes_through(obj)) if (!evas_event_passes_through(obj))
{ {
if (!obj->smart.smart) if (!obj->smart.smart)

View File

@ -126,14 +126,172 @@ evas_object_textblock_format_merge(char *ofmt, char *fmt)
/* snprintf to a buffer, return strdup buffer */ /* snprintf to a buffer, return strdup buffer */
} }
static int
evas_object_textblock_hex_string_get(char ch)
{
if ((ch >= '0') && (ch <= '9')) return (ch - '0');
else if ((ch >= 'A') && (ch <= 'F')) return (ch - 'A' + 10);
else if ((ch >= 'a') && (ch <= 'f')) return (ch - 'a' + 10);
return 0;
}
static void
evas_object_textblock_layout_format_apply(Layout *layout, char *key, char *data)
{
if (!strcmp(key, "font"))
{
if (layout->font.name) free(layout->font.name);
layout->font.name = strdup(data);
}
if (!strcmp(key, "size"))
{
layout->font.size = atoi(data);
}
if (!strcmp(key, "color"))
{
/* #RRGGBB[AA] or #RGB[A] */
if (data[0] == '#')
{
int r, g, b, a;
if (strlen(data) == 7) /* #RRGGBB */
{
r = (evas_object_textblock_hex_string_get(data[1]) << 4) |
(evas_object_textblock_hex_string_get(data[2]));
g = (evas_object_textblock_hex_string_get(data[3]) << 4) |
(evas_object_textblock_hex_string_get(data[4]));
b = (evas_object_textblock_hex_string_get(data[5]) << 4) |
(evas_object_textblock_hex_string_get(data[6]));
a = 0xff;
}
else if (strlen(data) == 9) /* #RRGGBBAA */
{
r = (evas_object_textblock_hex_string_get(data[1]) << 4) |
(evas_object_textblock_hex_string_get(data[2]));
g = (evas_object_textblock_hex_string_get(data[3]) << 4) |
(evas_object_textblock_hex_string_get(data[4]));
b = (evas_object_textblock_hex_string_get(data[5]) << 4) |
(evas_object_textblock_hex_string_get(data[6]));
a = (evas_object_textblock_hex_string_get(data[7]) << 4) |
(evas_object_textblock_hex_string_get(data[8]));
}
else if (strlen(data) == 4) /* #RGB */
{
r = evas_object_textblock_hex_string_get(data[1]);
r = (r << 4) | r;
g = evas_object_textblock_hex_string_get(data[2]);
g = (g << 4) | g;
b = evas_object_textblock_hex_string_get(data[3]);
b = (b << 4) | b;
}
else if (strlen(data) == 5) /* #RGBA */
{
r = evas_object_textblock_hex_string_get(data[1]);
r = (r << 4) | r;
g = evas_object_textblock_hex_string_get(data[2]);
g = (g << 4) | g;
b = evas_object_textblock_hex_string_get(data[3]);
b = (b << 4) | b;
a = evas_object_textblock_hex_string_get(data[4]);
a = (a << 4) | a;
}
layout->color.r = r;
layout->color.g = g;
layout->color.b = b;
layout->color.a = a;
}
}
}
static void static void
evas_object_textblock_layout_format_modify(Layout *layout, const char *format) evas_object_textblock_layout_format_modify(Layout *layout, const char *format)
{ {
/* FIXME: parse format string and make mods to layout struct */ const char *p, *k1 = NULL, *k2 = NULL, *d1 = NULL, *d2 = NULL;
/* prop=value ... ... int inquote = 0, inescape = 0;
* prop='value' (escape ' with \\' (\ needs escpae for c)
* prop="value" (escape " with \\\" (\ and " need escape in c) if (!format) return;
*/ p = format - 1;
do
{
p++;
/* we dont have the start of a key yet */
if (!k1)
{
if (isalnum(*p)) k1 = p;
}
else if (!k2)
{
if (*p == '=') k2 = p;
}
else if (!d1)
{
if (*p == '\'') inquote = 1;
else d1 = p;
}
else if (!d2)
{
if (inquote)
{
if (!inescape)
{
if (*p == '\\') inescape = 1;
else if (*p == '\'') d2 = p;
}
else
inescape = 0;
}
else
{
if ((isblank(*p)) || (*p == 0)) d2 = p;
}
if (d2)
{
char *key, *data;
key = malloc(k2 - k1 + 1);
data = malloc(d2 - d1 + 1);
strncpy(key, k1, k2 - k1);
key[k2 - k1] = 0;
if (inquote)
{
const char *p2;
char *dst;
inescape = 0;
p2 = d1;
dst = data;
while (p2 != d2)
{
if (!inescape)
{
if (*p == '\\') inescape = 1;
}
else
{
*dst = *p;
dst++;
inescape = 0;
}
p2++;
}
*dst = 0;
}
else
{
strncpy(data, d1, d2 - d1);
data[d2 - d1] = 0;
}
k1 = k2 = d1 = d2 = NULL;
inquote = 0;
inescape = 0;
evas_object_textblock_layout_format_apply(layout, key, data);
free(key);
free(data);
}
}
}
while (*p);
} }
static void static void
@ -202,52 +360,70 @@ evas_object_textblock_layout(Evas_Object *obj)
evas_object_textblock_layout_init(&layout); evas_object_textblock_layout_init(&layout);
w = obj->cur.geometry.w; w = obj->cur.geometry.w;
h = obj->cur.geometry.h; h = obj->cur.geometry.h;
o->last_w = w;
o->last_h = h;
// printf("RE-LAYOUT %ix%i!\n", w, h);
for (l = (Evas_Object_List *)o->nodes; l; l = l->next) for (l = (Evas_Object_List *)o->nodes; l; l = l->next)
{ {
Layout_Node *lnode; Layout_Node *lnode;
Node *node; Node *node;
int newline;
node = (Node *)l; node = (Node *)l;
// printf("NODE: FMT:\"%s\" TXT:\"%s\"\n", node->format, node->text);
newline = 0;
if (node->format) if (node->format)
evas_object_textblock_layout_format_modify(&layout, node->format); {
/* first handle newline, tab etc. etc */
if (!strcmp(node->format, "\n"))
{
layout.line.x = 0;
layout.line.y += lnode->layout.line.mascent + lnode->layout.line.mdescent;
layout.line.mascent = 0;
layout.line.mdescent = 0;
}
else
evas_object_textblock_layout_format_modify(&layout, node->format);
}
if (node->text) if (node->text)
{ {
int inset, hadvance, vadvance, ascent, descent, tw, th; int inset = 0, hadvance = 0, vadvance = 0;
int chrpos, x, y, cx, cy, cw, ch; int ascent = 0, descent = 0, tw = 0, th = 0;
void *font; int chrpos = -1, x, y, cx, cy, cw, ch;
void *font = NULL;
char *text; char *text;
text = strdup(node->text); text = strdup(node->text);
new_node: new_node:
lnode = calloc(1, sizeof(Layout_Node)); lnode = calloc(1, sizeof(Layout_Node));
evas_object_textblock_layout_copy(&layout, &(lnode->layout)); evas_object_textblock_layout_copy(&layout, &(lnode->layout));
font = ENFN->font_load(ENDT, lnode->layout.font.name, lnode->layout.font.size); if (lnode->layout.font.name)
font = ENFN->font_load(ENDT, lnode->layout.font.name, lnode->layout.font.size);
lnode->layout.font.font = font; lnode->layout.font.font = font;
ascent = ENFN->font_ascent_get(ENDT, font); if (font) ascent = ENFN->font_max_ascent_get(ENDT, font);
descent = ENFN->font_descent_get(ENDT, font); if (font) descent = ENFN->font_max_descent_get(ENDT, font);
layout.line.ascent = ascent; layout.line.ascent = ascent;
layout.line.descent = descent; layout.line.descent = descent;
if (layout.line.mascent < ascent) layout.line.mascent = descent; if (layout.line.mascent < ascent) layout.line.mascent = ascent;
if (layout.line.mdescent < descent) layout.line.mdescent = descent; if (layout.line.mdescent < descent) layout.line.mdescent = descent;
#if 0
/* if this is at the start of the line... */ /* if this is at the start of the line... */
if (layout.line.x == 0) if (layout.line.x == 0)
{ {
inset = ENFN->font_inset_get(ENDT, font, node->text); if (font) inset = ENFN->font_inset_get(ENDT, font, node->text);
layout.line.x = -inset; layout.line.x = -inset;
line_start = lnode; line_start = lnode;
} }
chrpos = ENFN->font_char_at_coords_get(ENDT, font, text, if (font) chrpos = ENFN->font_char_at_coords_get(ENDT, font, text,
w - layout.line.x, 0, w - layout.line.x, 0,
&cx, &cy, &cw, &ch); &cx, &cy, &cw, &ch);
/* if the text fits... just add */ /* if the text fits... just add */
if (chrpos < 0) if (chrpos < 0)
{ {
ENFN->font_string_size_get(ENDT, font, text, &tw, &th); if (font) ENFN->font_string_size_get(ENDT, font, text, &tw, &th);
lnode->w = tw; lnode->w = tw;
lnode->h = th; lnode->h = th;
lnode->text = text; lnode->text = text;
hadvance = ENFN->font_h_advance_get(ENDT, font, text); if (font) hadvance = ENFN->font_h_advance_get(ENDT, font, text);
o->layout_nodes = evas_object_list_append(o->layout_nodes, lnode); o->layout_nodes = evas_object_list_append(o->layout_nodes, lnode);
/* and advance */ /* and advance */
layout.line.x += hadvance; layout.line.x += hadvance;
@ -258,9 +434,9 @@ evas_object_textblock_layout(Evas_Object *obj)
Layout_Node *lnode2; Layout_Node *lnode2;
lnode2 = (Layout_Node *)ll; lnode2 = (Layout_Node *)ll;
lnode2->layout.line.mascent = lnode->layout.line.mascent; lnode2->layout.line.mascent = layout.line.mascent;
lnode2->layout.line.mdescent = lnode->layout.line.mdescent; lnode2->layout.line.mdescent = layout.line.mdescent;
if (ll == line_start) break; if (ll == (Evas_Object_List *)line_start) break;
} }
} }
/* text doesnt fit */ /* text doesnt fit */
@ -285,7 +461,7 @@ evas_object_textblock_layout(Evas_Object *obj)
lnode->text = text1; lnode->text = text1;
free(text); free(text);
text = text1; text = text1;
ENFN->font_string_size_get(ENDT, font, text, &tw, &th); if (font) ENFN->font_string_size_get(ENDT, font, text, &tw, &th);
lnode->w = tw; lnode->w = tw;
lnode->h = th; lnode->h = th;
o->layout_nodes = evas_object_list_append(o->layout_nodes, lnode); o->layout_nodes = evas_object_list_append(o->layout_nodes, lnode);
@ -296,12 +472,14 @@ evas_object_textblock_layout(Evas_Object *obj)
Layout_Node *lnode2; Layout_Node *lnode2;
lnode2 = (Layout_Node *)ll; lnode2 = (Layout_Node *)ll;
lnode2->layout.line.mascent = lnode->layout.line.mascent; lnode2->layout.line.mascent = layout.line.mascent;
lnode2->layout.line.mdescent = lnode->layout.line.mdescent; lnode2->layout.line.mdescent = layout.line.mdescent;
if (ll == line_start) break; if (ll == (Evas_Object_List *)line_start) break;
} }
layout.line.x = 0; layout.line.x = 0;
layout.line.y += lnode->layout.line.mascent + lnode->layout.line.mdescent; layout.line.y += lnode->layout.line.mascent + lnode->layout.line.mdescent;
layout.line.mascent = 0;
layout.line.mdescent = 0;
text = text2; text = text2;
/* still more text to go */ /* still more text to go */
goto new_node; goto new_node;
@ -315,7 +493,6 @@ evas_object_textblock_layout(Evas_Object *obj)
descent = ENFN->font_descent_get(ENDT, font); descent = ENFN->font_descent_get(ENDT, font);
ENFN->font_string_size_get(ENDT, font, text, &tw, &th); ENFN->font_string_size_get(ENDT, font, text, &tw, &th);
*/ */
#endif
} }
} }
} }
@ -369,6 +546,8 @@ static void evas_object_textblock_render_post(Evas_Object *obj);
static int evas_object_textblock_is_opaque(Evas_Object *obj); static int evas_object_textblock_is_opaque(Evas_Object *obj);
static int evas_object_textblock_was_opaque(Evas_Object *obj); static int evas_object_textblock_was_opaque(Evas_Object *obj);
static void evas_object_textblock_coords_recalc(Evas_Object *obj);
static Evas_Object_Func object_func = static Evas_Object_Func object_func =
{ {
/* methods (compulsory) */ /* methods (compulsory) */
@ -385,7 +564,7 @@ static Evas_Object_Func object_func =
evas_object_textblock_was_opaque, evas_object_textblock_was_opaque,
NULL, NULL,
NULL, NULL,
NULL evas_object_textblock_coords_recalc
}; };
/* the actual api call to add a textblock */ /* the actual api call to add a textblock */
@ -419,7 +598,7 @@ evas_object_textblock_clear(Evas_Object *obj)
return; return;
MAGIC_CHECK_END(); MAGIC_CHECK_END();
o = (Evas_Object_Textblock *)(obj->object_data); o = (Evas_Object_Textblock *)(obj->object_data);
MAGIC_CHECK(o, Evas_Object_Textblock, MAGIC_OBJ_TEXT); MAGIC_CHECK(o, Evas_Object_Textblock, MAGIC_OBJ_TEXTBLOCK);
return; return;
MAGIC_CHECK_END(); MAGIC_CHECK_END();
evas_object_textblock_contents_clean(obj); evas_object_textblock_contents_clean(obj);
@ -427,6 +606,7 @@ evas_object_textblock_clear(Evas_Object *obj)
o->len = 0; o->len = 0;
o->pos = 0; o->pos = 0;
o->changed = 1; o->changed = 1;
evas_object_change(obj);
} }
void void
@ -438,7 +618,7 @@ evas_object_textblock_cursor_pos_set(Evas_Object *obj, int pos)
return; return;
MAGIC_CHECK_END(); MAGIC_CHECK_END();
o = (Evas_Object_Textblock *)(obj->object_data); o = (Evas_Object_Textblock *)(obj->object_data);
MAGIC_CHECK(o, Evas_Object_Textblock, MAGIC_OBJ_TEXT); MAGIC_CHECK(o, Evas_Object_Textblock, MAGIC_OBJ_TEXTBLOCK);
return; return;
MAGIC_CHECK_END(); MAGIC_CHECK_END();
if (pos < 0) pos = 0; if (pos < 0) pos = 0;
@ -455,7 +635,7 @@ evas_object_textblock_cursor_pos_get(Evas_Object *obj)
return 0; return 0;
MAGIC_CHECK_END(); MAGIC_CHECK_END();
o = (Evas_Object_Textblock *)(obj->object_data); o = (Evas_Object_Textblock *)(obj->object_data);
MAGIC_CHECK(o, Evas_Object_Textblock, MAGIC_OBJ_TEXT); MAGIC_CHECK(o, Evas_Object_Textblock, MAGIC_OBJ_TEXTBLOCK);
return 0; return 0;
MAGIC_CHECK_END(); MAGIC_CHECK_END();
return o->pos; return o->pos;
@ -470,7 +650,7 @@ evas_object_textblock_length_get(Evas_Object *obj)
return 0; return 0;
MAGIC_CHECK_END(); MAGIC_CHECK_END();
o = (Evas_Object_Textblock *)(obj->object_data); o = (Evas_Object_Textblock *)(obj->object_data);
MAGIC_CHECK(o, Evas_Object_Textblock, MAGIC_OBJ_TEXT); MAGIC_CHECK(o, Evas_Object_Textblock, MAGIC_OBJ_TEXTBLOCK);
return 0; return 0;
MAGIC_CHECK_END(); MAGIC_CHECK_END();
return o->len; return o->len;
@ -487,12 +667,10 @@ evas_object_textblock_text_insert(Evas_Object *obj, const char *text)
return; return;
MAGIC_CHECK_END(); MAGIC_CHECK_END();
o = (Evas_Object_Textblock *)(obj->object_data); o = (Evas_Object_Textblock *)(obj->object_data);
MAGIC_CHECK(o, Evas_Object_Textblock, MAGIC_OBJ_TEXT); MAGIC_CHECK(o, Evas_Object_Textblock, MAGIC_OBJ_TEXTBLOCK);
return; return;
MAGIC_CHECK_END(); MAGIC_CHECK_END();
if (!text) return; if (!text) return;
o->native.dirty = 1;
o->changed = 1;
node = evas_object_textblock_node_pos_get(obj, o->pos, &ps); node = evas_object_textblock_node_pos_get(obj, o->pos, &ps);
/* at the end - just append */ /* at the end - just append */
if (!node) if (!node)
@ -538,6 +716,9 @@ evas_object_textblock_text_insert(Evas_Object *obj, const char *text)
o->pos += len; o->pos += len;
o->len += len; o->len += len;
} }
o->native.dirty = 1;
o->changed = 1;
evas_object_change(obj);
} }
char * char *
@ -549,7 +730,7 @@ evas_object_textblock_text_get(Evas_Object *obj, int len)
return NULL; return NULL;
MAGIC_CHECK_END(); MAGIC_CHECK_END();
o = (Evas_Object_Textblock *)(obj->object_data); o = (Evas_Object_Textblock *)(obj->object_data);
MAGIC_CHECK(o, Evas_Object_Textblock, MAGIC_OBJ_TEXT); MAGIC_CHECK(o, Evas_Object_Textblock, MAGIC_OBJ_TEXTBLOCK);
return NULL; return NULL;
MAGIC_CHECK_END(); MAGIC_CHECK_END();
/* FIXME: get from pos up to len bytes of string - malloc it */ /* FIXME: get from pos up to len bytes of string - malloc it */
@ -565,11 +746,12 @@ evas_object_textblock_text_del(Evas_Object *obj, int len)
return; return;
MAGIC_CHECK_END(); MAGIC_CHECK_END();
o = (Evas_Object_Textblock *)(obj->object_data); o = (Evas_Object_Textblock *)(obj->object_data);
MAGIC_CHECK(o, Evas_Object_Textblock, MAGIC_OBJ_TEXT); MAGIC_CHECK(o, Evas_Object_Textblock, MAGIC_OBJ_TEXTBLOCK);
return; return;
MAGIC_CHECK_END(); MAGIC_CHECK_END();
o->native.dirty = 1; o->native.dirty = 1;
o->changed = 1; o->changed = 1;
evas_object_change(obj);
/* FIXME: delete len bytes of string starting at pos */ /* FIXME: delete len bytes of string starting at pos */
} }
@ -585,72 +767,44 @@ evas_object_textblock_format_insert(Evas_Object *obj, const char *format)
return; return;
MAGIC_CHECK_END(); MAGIC_CHECK_END();
o = (Evas_Object_Textblock *)(obj->object_data); o = (Evas_Object_Textblock *)(obj->object_data);
MAGIC_CHECK(o, Evas_Object_Textblock, MAGIC_OBJ_TEXT); MAGIC_CHECK(o, Evas_Object_Textblock, MAGIC_OBJ_TEXTBLOCK);
return; return;
MAGIC_CHECK_END(); MAGIC_CHECK_END();
o->native.dirty = 1;
o->changed = 1;
node = evas_object_textblock_node_pos_get(obj, o->pos, &ps); node = evas_object_textblock_node_pos_get(obj, o->pos, &ps);
/* at the end - just append */ /* at the end - just append */
if (!node) if (!node)
{ {
if (!o->nodes) nformat = evas_object_textblock_format_merge(NULL, (char *)format);
if (nformat)
{ {
nformat = evas_object_textblock_format_merge(NULL, (char *)format);
if (nformat)
{
node = calloc(1, sizeof(Node));
node->format = nformat;
o->nodes = node;
}
}
else
{
int len;
char *ntext;
node = (Node *)(((Evas_Object_List *)(o->nodes))->last);
if (node->text)
{
node = calloc(1, sizeof(Node));
nformat = evas_object_textblock_format_merge(NULL, (char *)format);
node->format = nformat;
o->nodes = evas_object_list_append(o->nodes, node);
}
else
{
nformat = evas_object_textblock_format_merge(node->format, (char *)format);
if (node->format) free(node->format);
node->format = nformat;
}
}
}
else
{
if (!node->text)
{
nformat = evas_object_textblock_format_merge(node->format, (char *)format);
if (node->format) free(node->format);
node->format = nformat;
}
else
{
char *ntext1, *ntext2;
ntext1 = malloc(o->pos - ps + 1);
ntext2 = malloc(node->text_len - (o->pos - ps) + 1);
strncpy(ntext1, node->text, o->pos - ps);
ntext1[o->pos - ps] = 0;
strcpy(ntext2, node->text + o->pos - ps);
free(node->text);
node->text = ntext1;
node->text_len = o->pos - ps;
node = calloc(1, sizeof(Node)); node = calloc(1, sizeof(Node));
nformat = evas_object_textblock_format_merge(NULL, (char *)format);
node->format = nformat; node->format = nformat;
o->nodes = evas_object_list_append(o->nodes, node); o->nodes = evas_object_list_append(o->nodes, node);
} }
} }
else
{
char *ntext1, *ntext2;
ntext1 = malloc(o->pos - ps + 1);
ntext2 = malloc(node->text_len - (o->pos - ps) + 1);
strncpy(ntext1, node->text, o->pos - ps);
ntext1[o->pos - ps] = 0;
strcpy(ntext2, node->text + o->pos - ps);
free(node->text);
node->text = ntext1;
node->text_len = o->pos - ps;
nformat = evas_object_textblock_format_merge(NULL, (char *)format);
if (nformat)
{
node = calloc(1, sizeof(Node));
node->format = nformat;
o->nodes = evas_object_list_append(o->nodes, node);
}
}
o->native.dirty = 1;
o->changed = 1;
evas_object_change(obj);
} }
int int
@ -662,7 +816,7 @@ evas_object_textblock_format_next_pos_get(Evas_Object *obj)
return -1; return -1;
MAGIC_CHECK_END(); MAGIC_CHECK_END();
o = (Evas_Object_Textblock *)(obj->object_data); o = (Evas_Object_Textblock *)(obj->object_data);
MAGIC_CHECK(o, Evas_Object_Textblock, MAGIC_OBJ_TEXT); MAGIC_CHECK(o, Evas_Object_Textblock, MAGIC_OBJ_TEXTBLOCK);
return -1; return -1;
MAGIC_CHECK_END(); MAGIC_CHECK_END();
return -1; return -1;
@ -677,7 +831,7 @@ evas_object_textblock_format_prev_pos_get(Evas_Object *obj)
return -1; return -1;
MAGIC_CHECK_END(); MAGIC_CHECK_END();
o = (Evas_Object_Textblock *)(obj->object_data); o = (Evas_Object_Textblock *)(obj->object_data);
MAGIC_CHECK(o, Evas_Object_Textblock, MAGIC_OBJ_TEXT); MAGIC_CHECK(o, Evas_Object_Textblock, MAGIC_OBJ_TEXTBLOCK);
return -1; return -1;
MAGIC_CHECK_END(); MAGIC_CHECK_END();
return -1; return -1;
@ -692,7 +846,7 @@ evas_object_textblock_format_get(Evas_Object *obj)
return NULL; return NULL;
MAGIC_CHECK_END(); MAGIC_CHECK_END();
o = (Evas_Object_Textblock *)(obj->object_data); o = (Evas_Object_Textblock *)(obj->object_data);
MAGIC_CHECK(o, Evas_Object_Textblock, MAGIC_OBJ_TEXT); MAGIC_CHECK(o, Evas_Object_Textblock, MAGIC_OBJ_TEXTBLOCK);
return NULL; return NULL;
MAGIC_CHECK_END(); MAGIC_CHECK_END();
return NULL; return NULL;
@ -707,11 +861,12 @@ evas_object_textblock_format_del(Evas_Object *obj)
return; return;
MAGIC_CHECK_END(); MAGIC_CHECK_END();
o = (Evas_Object_Textblock *)(obj->object_data); o = (Evas_Object_Textblock *)(obj->object_data);
MAGIC_CHECK(o, Evas_Object_Textblock, MAGIC_OBJ_TEXT); MAGIC_CHECK(o, Evas_Object_Textblock, MAGIC_OBJ_TEXTBLOCK);
return; return;
MAGIC_CHECK_END(); MAGIC_CHECK_END();
o->native.dirty = 1; o->native.dirty = 1;
o->changed = 1; o->changed = 1;
evas_object_change(obj);
} }
void void
@ -723,12 +878,13 @@ evas_object_textblock_format_direction_set(Evas_Object *obj, Evas_Format_Directi
return; return;
MAGIC_CHECK_END(); MAGIC_CHECK_END();
o = (Evas_Object_Textblock *)(obj->object_data); o = (Evas_Object_Textblock *)(obj->object_data);
MAGIC_CHECK(o, Evas_Object_Textblock, MAGIC_OBJ_TEXT); MAGIC_CHECK(o, Evas_Object_Textblock, MAGIC_OBJ_TEXTBLOCK);
return; return;
MAGIC_CHECK_END(); MAGIC_CHECK_END();
if (o->format_dir == dir) return; if (o->format_dir == dir) return;
o->native.dirty = 1; o->native.dirty = 1;
o->changed = 1; o->changed = 1;
evas_object_change(obj);
} }
Evas_Format_Direction Evas_Format_Direction
@ -740,7 +896,7 @@ evas_object_textblock_format_direction_get(Evas_Object *obj)
return EVAS_FORMAT_DIRECTION_VERTICAL; return EVAS_FORMAT_DIRECTION_VERTICAL;
MAGIC_CHECK_END(); MAGIC_CHECK_END();
o = (Evas_Object_Textblock *)(obj->object_data); o = (Evas_Object_Textblock *)(obj->object_data);
MAGIC_CHECK(o, Evas_Object_Textblock, MAGIC_OBJ_TEXT); MAGIC_CHECK(o, Evas_Object_Textblock, MAGIC_OBJ_TEXTBLOCK);
return EVAS_FORMAT_DIRECTION_VERTICAL; return EVAS_FORMAT_DIRECTION_VERTICAL;
MAGIC_CHECK_END(); MAGIC_CHECK_END();
return o->format_dir; return o->format_dir;
@ -757,7 +913,7 @@ evas_object_textblock_native_size_get(Evas_Object *obj, Evas_Coord *w, Evas_Coor
return; return;
MAGIC_CHECK_END(); MAGIC_CHECK_END();
o = (Evas_Object_Textblock *)(obj->object_data); o = (Evas_Object_Textblock *)(obj->object_data);
MAGIC_CHECK(o, Evas_Object_Textblock, MAGIC_OBJ_TEXT); MAGIC_CHECK(o, Evas_Object_Textblock, MAGIC_OBJ_TEXTBLOCK);
if (w) *w = 0; if (w) *w = 0;
if (h) *h = 0; if (h) *h = 0;
return; return;
@ -765,8 +921,6 @@ evas_object_textblock_native_size_get(Evas_Object *obj, Evas_Coord *w, Evas_Coor
if (o->native.dirty) if (o->native.dirty)
{ {
evas_object_textblock_native_calc(obj); evas_object_textblock_native_calc(obj);
o->last_w = obj->cur.geometry.w;
o->last_h = obj->cur.geometry.h;
o->native.dirty = 0; o->native.dirty = 0;
} }
if (w) *w = o->native.w; if (w) *w = o->native.w;
@ -848,6 +1002,12 @@ evas_object_textblock_render(Evas_Object *obj, void *output, void *context, void
o = (Evas_Object_Textblock *)(obj->object_data); o = (Evas_Object_Textblock *)(obj->object_data);
obj->layer->evas->engine.func->context_multiplier_unset(output, obj->layer->evas->engine.func->context_multiplier_unset(output,
context); context);
if (o->changed)
{
evas_object_textblock_layout_clean(obj);
evas_object_textblock_layout(obj);
o->changed = 0;
}
for (l = (Evas_Object_List *)o->layout_nodes; l; l = l->next) for (l = (Evas_Object_List *)o->layout_nodes; l; l = l->next)
{ {
Layout_Node *lnode; Layout_Node *lnode;
@ -859,22 +1019,25 @@ evas_object_textblock_render(Evas_Object *obj, void *output, void *context, void
(obj->cur.cache.clip.g * lnode->layout.color.g) / 255, (obj->cur.cache.clip.g * lnode->layout.color.g) / 255,
(obj->cur.cache.clip.b * lnode->layout.color.b) / 255, (obj->cur.cache.clip.b * lnode->layout.color.b) / 255,
(obj->cur.cache.clip.a * lnode->layout.color.a) / 255); (obj->cur.cache.clip.a * lnode->layout.color.a) / 255);
ENFN->font_draw(output, if ((lnode->layout.font.font) && (lnode->text))
context, ENFN->font_draw(output,
surface, context,
lnode->layout.font.font, surface,
obj->cur.cache.geometry.x + lnode->layout.line.x, lnode->layout.font.font,
obj->cur.cache.geometry.y + lnode->layout.line.y + lnode->layout.line.mascent, obj->cur.cache.geometry.x + lnode->layout.line.x + x,
lnode->w, obj->cur.cache.geometry.y + lnode->layout.line.y + y + lnode->layout.line.mascent,
lnode->h, lnode->w,
lnode->w, lnode->h,
lnode->h, lnode->w,
lnode->text); lnode->h,
lnode->text);
} }
// if (o->engine_data) /*
// { if (o->engine_data)
// {
// }
}
*/
} }
static void static void
@ -929,9 +1092,17 @@ evas_object_textblock_render_pre(Evas_Object *obj)
} }
if (o->changed) if (o->changed)
{ {
/* FIXME: calc sub-area changes */ Evas_Rectangle *r;
r = malloc(sizeof(Evas_Rectangle));
r->x = 0; r->y = 0;
r->w = obj->cur.geometry.w;
r->h = obj->cur.geometry.h;
updates = evas_object_render_pre_prev_cur_add(updates, obj);
updates = evas_list_append(updates, r);
evas_object_textblock_layout_clean(obj); evas_object_textblock_layout_clean(obj);
evas_object_textblock_layout(obj); evas_object_textblock_layout(obj);
o->changed = 0;
} }
done: done:
evas_object_render_pre_effect_updates(updates, obj, is_v, was_v); evas_object_render_pre_effect_updates(updates, obj, is_v, was_v);