forked from enlightenment/efl
edje: use Evas to compute Ellipsis.
Patch with help from Tom Hacohen. SVN revision: 80764
This commit is contained in:
parent
a16f6e2330
commit
5e76bb821f
|
@ -696,3 +696,7 @@
|
||||||
|
|
||||||
* Fix inheriting gorups with programs that have after programs where
|
* Fix inheriting gorups with programs that have after programs where
|
||||||
after programs are duplicated in the list.
|
after programs are duplicated in the list.
|
||||||
|
|
||||||
|
2012-12-12 Cedric Bail
|
||||||
|
|
||||||
|
* Use Evas to compute Ellipsis.
|
||||||
|
|
|
@ -22,6 +22,7 @@ Improvements:
|
||||||
* Less memory used per callbacks.
|
* Less memory used per callbacks.
|
||||||
* Don't generate an annotate file if edje_cc failed.
|
* Don't generate an annotate file if edje_cc failed.
|
||||||
* Lua 5.2 support added, still works fine with 5.1.
|
* Lua 5.2 support added, still works fine with 5.1.
|
||||||
|
* Evas now does compute Ellipsis.
|
||||||
|
|
||||||
Fixes:
|
Fixes:
|
||||||
* fix scale_set with edje containing boxes and/or tables
|
* fix scale_set with edje containing boxes and/or tables
|
||||||
|
|
|
@ -77,52 +77,12 @@ _edje_text_part_on_del(Edje *ed, Edje_Part *pt)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
|
||||||
_edje_text_fit_set(char *buf, const char *text, int c1, int c2)
|
|
||||||
{
|
|
||||||
/* helper function called from _edje_text_fit_x().
|
|
||||||
* note that we can use strcpy()/strcat() safely, the buffer lengths
|
|
||||||
* are checked in the caller.
|
|
||||||
*/
|
|
||||||
|
|
||||||
if (c1 >= 0)
|
|
||||||
{
|
|
||||||
strcpy(buf, _ELLIP_STR);
|
|
||||||
|
|
||||||
if (c2 >= 0)
|
|
||||||
{
|
|
||||||
strncat(buf, text + c1, c2 - c1);
|
|
||||||
strcat(buf, _ELLIP_STR);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
strcat(buf, text + c1);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (c2 >= 0)
|
|
||||||
{
|
|
||||||
strncpy(buf, text, c2);
|
|
||||||
buf[c2] = 0;
|
|
||||||
strcat(buf, _ELLIP_STR);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
strcpy(buf, text);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static const char *
|
static const char *
|
||||||
_edje_text_fit_x(Edje *ed, Edje_Real_Part *ep,
|
_edje_text_fit_x(Edje *ed, Edje_Real_Part *ep,
|
||||||
Edje_Calc_Params *params,
|
Edje_Calc_Params *params,
|
||||||
const char *text, const char *font, int size,
|
const char *text, const char *font, int size,
|
||||||
Evas_Coord sw, int *free_text)
|
Evas_Coord sw, Evas_Coord sh, int *free_text)
|
||||||
{
|
{
|
||||||
Evas_Coord tw = 0, th = 0, p;
|
|
||||||
int l, r;
|
|
||||||
int i;
|
|
||||||
char *buf;
|
|
||||||
int uc1 = -1, uc2 = -1, c1 = -1, c2 = -1;
|
|
||||||
int loop = 0, extra;
|
|
||||||
size_t orig_len;
|
|
||||||
FLOAT_T sc;
|
FLOAT_T sc;
|
||||||
|
|
||||||
sc = ed->scale;
|
sc = ed->scale;
|
||||||
|
@ -134,148 +94,12 @@ _edje_text_fit_x(Edje *ed, Edje_Real_Part *ep,
|
||||||
if (ep->part->scale) evas_object_scale_set(ep->object, TO_DOUBLE(sc));
|
if (ep->part->scale) evas_object_scale_set(ep->object, TO_DOUBLE(sc));
|
||||||
|
|
||||||
eo_do(ep->object,
|
eo_do(ep->object,
|
||||||
evas_obj_text_font_set(font, size),
|
evas_obj_text_ellipsis_set(params->type.text.elipsis),
|
||||||
|
evas_obj_text_font_set(font, size),
|
||||||
evas_obj_text_text_set(text),
|
evas_obj_text_text_set(text),
|
||||||
evas_obj_text_style_pad_get(&l, &r, NULL, NULL));
|
evas_obj_size_set(sw, sh));
|
||||||
part_get_geometry(ep, &tw, &th);
|
|
||||||
|
|
||||||
p = ((sw - tw) * params->type.text.elipsis);
|
return text;
|
||||||
|
|
||||||
/* chop chop */
|
|
||||||
if (tw > sw)
|
|
||||||
{
|
|
||||||
if (params->type.text.elipsis != 0.0)
|
|
||||||
/* should be the last in text! not the rightmost */
|
|
||||||
uc1 = evas_object_text_last_up_to_pos(ep->object,
|
|
||||||
-p + l, th / 2);
|
|
||||||
if (params->type.text.elipsis != 1.0)
|
|
||||||
{
|
|
||||||
/* should be the last in text! not the rightmost */
|
|
||||||
if ((-p + sw -r) < 0)
|
|
||||||
uc2 = evas_object_text_last_up_to_pos(ep->object, 0, th / 2);
|
|
||||||
else
|
|
||||||
uc2 = evas_object_text_last_up_to_pos(ep->object,
|
|
||||||
-p + sw - r, th / 2);
|
|
||||||
}
|
|
||||||
if ((uc1 < 0) && (uc2 < 0))
|
|
||||||
{
|
|
||||||
uc1 = 0;
|
|
||||||
uc2 = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!(((uc1 >= 0) || (uc2 >= 0)) && (tw > sw)))
|
|
||||||
return text;
|
|
||||||
|
|
||||||
if ((uc1 == 0) && (uc2 == 0))
|
|
||||||
return text;
|
|
||||||
|
|
||||||
orig_len = strlen(text);
|
|
||||||
|
|
||||||
/* don't overflow orig_len by adding extra
|
|
||||||
* FIXME: we might want to set a max string length somewhere...
|
|
||||||
*/
|
|
||||||
extra = 1 + 3 + 3; /* terminator, leading and trailing ellipsis */
|
|
||||||
orig_len = MIN(orig_len, ((size_t) 8192 - extra));
|
|
||||||
|
|
||||||
if (!(buf = malloc(orig_len + extra)))
|
|
||||||
return text;
|
|
||||||
|
|
||||||
/* Convert uc1, uc2 -> c1, c2 */
|
|
||||||
i = 0;
|
|
||||||
if (uc1 >= 0)
|
|
||||||
{
|
|
||||||
c1 = 0;
|
|
||||||
for ( ; i < uc1 ; i++)
|
|
||||||
{
|
|
||||||
c1 = evas_string_char_next_get(text, c1, NULL);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (uc2 >= 0)
|
|
||||||
{
|
|
||||||
if (c1 >= 0)
|
|
||||||
{
|
|
||||||
c2 = c1;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
c2 = 0;
|
|
||||||
}
|
|
||||||
for ( ; i < uc2 ; i++)
|
|
||||||
{
|
|
||||||
c2 = evas_string_char_next_get(text, c2, NULL);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
buf[0] = '\0';
|
|
||||||
|
|
||||||
while (((c1 >= 0) || (c2 >= 0)) && (tw > sw))
|
|
||||||
{
|
|
||||||
loop++;
|
|
||||||
if (sw <= 0.0)
|
|
||||||
{
|
|
||||||
buf[0] = 0;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if ((c1 >= 0) && (c2 >= 0))
|
|
||||||
{
|
|
||||||
if ((loop & 0x1))
|
|
||||||
{
|
|
||||||
if (c1 >= 0)
|
|
||||||
c1 = evas_string_char_next_get(text, c1, NULL);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (c2 >= 0)
|
|
||||||
{
|
|
||||||
c2 = evas_string_char_prev_get(text, c2, NULL);
|
|
||||||
if (c2 < 0)
|
|
||||||
{
|
|
||||||
buf[0] = 0;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (c1 >= 0)
|
|
||||||
c1 = evas_string_char_next_get(text, c1, NULL);
|
|
||||||
else if (c2 >= 0)
|
|
||||||
{
|
|
||||||
c2 = evas_string_char_prev_get(text, c2, NULL);
|
|
||||||
if (c2 < 0)
|
|
||||||
{
|
|
||||||
buf[0] = 0;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if ((c1 >= 0) && (c2 >= 0))
|
|
||||||
{
|
|
||||||
if (c1 >= c2)
|
|
||||||
{
|
|
||||||
buf[0] = 0;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if ((c1 > 0 && (size_t) c1 >= orig_len) || c2 == 0)
|
|
||||||
{
|
|
||||||
buf[0] = 0;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
buf[0] = 0;
|
|
||||||
|
|
||||||
_edje_text_fit_set(buf, text, c1, c2);
|
|
||||||
|
|
||||||
evas_object_text_text_set(ep->object, buf);
|
|
||||||
part_get_geometry(ep, &tw, &th);
|
|
||||||
}
|
|
||||||
|
|
||||||
*free_text = 1;
|
|
||||||
|
|
||||||
return buf;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static const char *
|
static const char *
|
||||||
|
@ -569,7 +393,9 @@ _edje_text_recalc_apply(Edje *ed, Edje_Real_Part *ep,
|
||||||
if (inlined_font) evas_object_text_font_source_set(ep->object, ed->path);
|
if (inlined_font) evas_object_text_font_source_set(ep->object, ed->path);
|
||||||
else evas_object_text_font_source_set(ep->object, NULL);
|
else evas_object_text_font_source_set(ep->object, NULL);
|
||||||
|
|
||||||
text = _edje_text_fit_x(ed, ep, params, text, font, size, sw, &free_text);
|
text = _edje_text_fit_x(ed, ep, params,
|
||||||
|
text, font, size,
|
||||||
|
sw, sh, &free_text);
|
||||||
}
|
}
|
||||||
|
|
||||||
eina_stringshare_replace(&ep->typedata.text->cache.out_str, text);
|
eina_stringshare_replace(&ep->typedata.text->cache.out_str, text);
|
||||||
|
|
Loading…
Reference in New Issue