Enlightenment CVS committal Author : raster Project : e17 Module : libs/evas
Dir : e17/libs/evas/src/lib/canvas Modified Files: evas_object_textblock.c Log Message: tabs work... added align to position todo. then margins... then anchors... damn... and thats like... usable and shit... =================================================================== RCS file: /cvsroot/enlightenment/e17/libs/evas/src/lib/canvas/evas_object_textblock.c,v retrieving revision 1.40 retrieving revision 1.41 diff -u -3 -r1.40 -r1.41 --- evas_object_textblock.c 18 Feb 2005 06:37:24 -0000 1.40 +++ evas_object_textblock.c 18 Feb 2005 09:44:27 -0000 1.41 @@ -10,7 +10,7 @@ * * things to add: * - * * tabs (indents) + * * jump/align to spot (N spaces, N pixels, N% (set or adjust by +/-)) * * left and right margins * * anchors (for inline objects other than text - images etc.) - variable size ones too * * if a word (or char) doesnt fit at all do something sensible @@ -120,6 +120,7 @@ int line; unsigned char line_start : 1; unsigned char line_end : 1; + unsigned char spacer : 1; }; struct _Evas_Object_Textblock @@ -775,10 +776,13 @@ /* first handle newline, tab etc. etc */ if (node->format[0] == '\n') { + newline: + if (layout_nodes) + lnode = (Layout_Node *)((Evas_Object_List *)layout_nodes)->last; if (lnode) lnode->line_end = 1; layout.line.x = pad_l; - if ((layout.line.y + layout.line.mascent + layout.line.mdescent) > h) + if ((layout.line.y + layout.line.mascent + layout.line.mdescent) > hh) { /* FIXME: this node would overflow to the next textblock */ } @@ -790,6 +794,50 @@ last_mdescent = 3; line_start = NULL; } + else if (node->format[0] == '\t') + { + int hadvance = 0, ascent = 0, descent = 0, inset = 0; + void *font; + + lnode = calloc(1, sizeof(Layout_Node)); + lnode->source_node = node; + lnode->line = line; + lnode->text_pos = text_pos; + last_line = line; + evas_object_textblock_layout_copy(&layout, &(lnode->layout)); + if (lnode->layout.font.name) + font = evas_font_load(obj->layer->evas, lnode->layout.font.name, lnode->layout.font.source, lnode->layout.font.size); + /* if this is at the start of the line... */ + if ((layout.line.x == pad_l) || (!line_start)) + { + if (font) inset = ENFN->font_inset_get(ENDT, font, " "); + layout.line.inset = inset; + layout.line.x = pad_l - inset + (layout.line.x - pad_l); + layout.line.mascent = 0; + layout.line.mdescent = 0; + line_start = lnode; + lnode->line_start = 1; + } + lnode->layout.font.font = font; + if (font) ascent = ENFN->font_max_ascent_get(ENDT, font); + if (font) descent = ENFN->font_max_descent_get(ENDT, font); + if (font) hadvance = ENFN->font_h_advance_get(ENDT, font, " "); + lnode->layout.line.ascent = ascent; + lnode->layout.line.descent = descent; + layout.line.ascent = ascent; + layout.line.descent = descent; + if (layout.line.mascent < ascent) layout.line.mascent = ascent; + if (layout.line.mdescent < descent) layout.line.mdescent = descent; + lnode->w = hadvance; + lnode->h = ascent + descent; + lnode->spacer = 1; + layout_nodes = evas_object_list_append(layout_nodes, lnode); + if ((layout.line.x + hadvance) > fw) + fw = layout.line.x + hadvance; + layout.line.x += hadvance; + lnode->layout.line.advance = hadvance; + if (layout.line.x >= ww) goto newline; + } else { evas_object_textblock_layout_format_modify(&layout, node->format); @@ -827,11 +875,11 @@ if (lnode->layout.font.name) font = evas_font_load(obj->layer->evas, lnode->layout.font.name, lnode->layout.font.source, lnode->layout.font.size); /* if this is at the start of the line... */ - if (layout.line.x == pad_l) + if ((layout.line.x == pad_l) || (!line_start)) { if (font) inset = ENFN->font_inset_get(ENDT, font, text); layout.line.inset = inset; - layout.line.x = pad_l - inset; + layout.line.x = pad_l - inset + (layout.line.x - pad_l); layout.line.mascent = 0; layout.line.mdescent = 0; line_start = lnode; @@ -869,8 +917,8 @@ layout_nodes = evas_object_list_append(layout_nodes, lnode); /* and advance */ /* fix up max ascent/descent for the line */ - adj = (double)(w - (lnode->layout.line.x -pad_l + tw + layout.line.inset)) * layout.align; - adj -= line_start->layout.line.x; + adj = (double)(ww - (lnode->layout.line.x - pad_l + tw + layout.line.inset)) * layout.align; +// adj -= line_start->layout.line.x; if ((layout.line.x + hadvance) > fw) fw = layout.line.x + hadvance; layout.line.x += hadvance; @@ -982,7 +1030,7 @@ lnode = (Layout_Node *)((Evas_Object_List *)layout_nodes)->last; if (lnode) { - adj = (double)(w - (layout.line.x - pad_l + tw + layout.line.inset)) * layout.align; + adj = (double)(ww - (layout.line.x - pad_l + tw + layout.line.inset)) * layout.align; adj -= line_start->layout.line.x; for (ll = (Evas_Object_List *)lnode; ll; ll = ll->prev) { @@ -1033,7 +1081,7 @@ lnode->layout.line.advance = hadvance; layout_nodes = evas_object_list_append(layout_nodes, lnode); adj = (double)(ww - (lnode->layout.line.x - pad_l + tw + layout.line.inset)) * layout.align; - adj -= line_start->layout.line.x; +// adj -= line_start->layout.line.x; for (ll = (Evas_Object_List *)lnode; ll; ll = ll->prev) { Layout_Node *lnode2; @@ -1469,11 +1517,11 @@ int ps; MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); - return -1; + return EVAS_TEXT_INVALID; MAGIC_CHECK_END(); o = (Evas_Object_Textblock *)(obj->object_data); MAGIC_CHECK(o, Evas_Object_Textblock, MAGIC_OBJ_TEXTBLOCK); - return -1; + return EVAS_TEXT_INVALID; MAGIC_CHECK_END(); if (o->format.dirty) evas_object_textblock_format_calc(obj); @@ -1489,7 +1537,7 @@ return lnode->text_pos; } } - return -1; + return EVAS_TEXT_INVALID; } int @@ -1500,11 +1548,11 @@ int ps; MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); - return 1; + return EVAS_TEXT_INVALID; MAGIC_CHECK_END(); o = (Evas_Object_Textblock *)(obj->object_data); MAGIC_CHECK(o, Evas_Object_Textblock, MAGIC_OBJ_TEXTBLOCK); - return -1; + return EVAS_TEXT_INVALID; MAGIC_CHECK_END(); if (o->format.dirty) evas_object_textblock_format_calc(obj); @@ -1525,7 +1573,7 @@ } } } - return -1; + return EVAS_TEXT_INVALID; } Evas_Bool @@ -1623,11 +1671,11 @@ Evas_Object_List *l; MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); - return -1; + return EVAS_TEXT_INVALID; MAGIC_CHECK_END(); o = (Evas_Object_Textblock *)(obj->object_data); MAGIC_CHECK(o, Evas_Object_Textblock, MAGIC_OBJ_TEXTBLOCK); - return -1; + return EVAS_TEXT_INVALID; MAGIC_CHECK_END(); if (o->format.dirty) evas_object_textblock_format_calc(obj); @@ -1635,15 +1683,26 @@ { lnode = (Layout_Node *)l; - if ((lnode->text) && - (x >= lnode->layout.line.x) && + if ((x >= lnode->layout.line.x) && (x < (lnode->layout.line.x + lnode->layout.line.advance)) && (y >= lnode->layout.line.y) && (y < (lnode->layout.line.y + lnode->layout.line.mascent + lnode->layout.line.mdescent))) { int ret, rx = 0, ry = 0, rw = 0, rh = 0; - if (lnode->layout.font.font) + if (lnode->spacer) + { + ry = lnode->layout.line.y; + rx += lnode->layout.line.x; + rh = lnode->layout.line.mascent + lnode->layout.line.mdescent; + rw = lnode->w; + if (cx) *cx = rx; + if (cy) *cy = ry; + if (cw) *cw = rw; + if (ch) *ch = rh; + return EVAS_TEXT_SPECIAL; + } + else if ((lnode->layout.font.font) && (lnode->text)) { ret = ENFN->font_char_at_coords_get(ENDT, lnode->layout.font.font, lnode->text, @@ -1682,10 +1741,10 @@ if (ch) *ch = rh; return ret + lnode->text_pos; } - return -1; + return EVAS_TEXT_INVALID; } } - return -1; + return EVAS_TEXT_INVALID; } void @@ -2095,11 +2154,11 @@ int ps, pos; MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); - return -1; + return EVAS_TEXT_INVALID; MAGIC_CHECK_END(); o = (Evas_Object_Textblock *)(obj->object_data); MAGIC_CHECK(o, Evas_Object_Textblock, MAGIC_OBJ_TEXTBLOCK); - return -1; + return EVAS_TEXT_INVALID; MAGIC_CHECK_END(); node = evas_object_textblock_node_pos_get(obj, o->pos, &ps); pos = ps; @@ -2114,7 +2173,7 @@ } return pos; } - return -1; + return EVAS_TEXT_INVALID; } int @@ -2219,19 +2278,6 @@ } } - - - - - - - - - - - - - int evas_object_textblock_format_prev_pos_get(Evas_Object *obj) { @@ -2240,11 +2286,11 @@ int ps, pos; MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); - return -1; + return EVAS_TEXT_INVALID; MAGIC_CHECK_END(); o = (Evas_Object_Textblock *)(obj->object_data); MAGIC_CHECK(o, Evas_Object_Textblock, MAGIC_OBJ_TEXTBLOCK); - return -1; + return EVAS_TEXT_INVALID; MAGIC_CHECK_END(); node = evas_object_textblock_node_pos_get(obj, o->pos, &ps); pos = ps; @@ -2258,7 +2304,7 @@ } return pos; } - return -1; + return EVAS_TEXT_INVALID; } int @@ -2363,14 +2409,6 @@ } } - - - - - - - - char * evas_object_textblock_current_format_get(Evas_Object *obj) { ------------------------------------------------------- SF email is sponsored by - The IT Product Guide Read honest & candid reviews on hundreds of IT Products from real users. Discover which products truly live up to the hype. Start reading now. http://ads.osdn.com/?ad_id=6595&alloc_id=14396&op=click _______________________________________________ enlightenment-cvs mailing list enlightenment-cvs@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs