From: Enlightenment S. <no-...@en...> - 2010-08-16 12:56:11
|
Log: Evas textblock: Added comment about styles in the docs. Author: tasn Date: 2010-08-16 05:56:01 -0700 (Mon, 16 Aug 2010) New Revision: 51209 Modified: trunk/evas/src/lib/canvas/evas_object_textblock.c Modified: trunk/evas/src/lib/canvas/evas_object_textblock.c =================================================================== --- trunk/evas/src/lib/canvas/evas_object_textblock.c 2010-08-16 12:51:30 UTC (rev 51208) +++ trunk/evas/src/lib/canvas/evas_object_textblock.c 2010-08-16 12:56:01 UTC (rev 51209) @@ -58,6 +58,8 @@ * to the format nodes to make it do more. * For more information, take a look at all the evas_textblock_node_format_* * functions. + * The translation of "<tag>" tags to actual format is done according to the + * tags defined in the style, see @ref evas_textblock_style_set * * @subsection textblock_special_formats Special Formats * @todo Write @textblock_special_formats |
From: Enlightenment S. <no-...@en...> - 2010-08-17 17:55:55
|
Log: Evas textblock: render should be allowed to be passed an object with no paragraphs, but should just return and do nothing. Author: tasn Date: 2010-08-17 10:55:48 -0700 (Tue, 17 Aug 2010) New Revision: 51263 Modified: trunk/evas/src/lib/canvas/evas_object_textblock.c Modified: trunk/evas/src/lib/canvas/evas_object_textblock.c =================================================================== --- trunk/evas/src/lib/canvas/evas_object_textblock.c 2010-08-17 17:00:55 UTC (rev 51262) +++ trunk/evas/src/lib/canvas/evas_object_textblock.c 2010-08-17 17:55:48 UTC (rev 51263) @@ -6788,6 +6788,10 @@ obj->layer->evas->engine.func->context_multiplier_unset(output, context); clip = ENFN->context_clip_get(output, context, &cx, &cy, &cw, &ch); + /* If there are no paragraphs and thus there are no lines, + * there's nothing left to do. */ + if (!o->paragraphs) return; + #define ITEM_WALK() \ EINA_INLIST_FOREACH(o->paragraphs->lines, ln) \ { \ @@ -6818,7 +6822,7 @@ if ((obj->cur.geometry.x + x + ln->x + it->x - it->inset) > (cx + cw + 20)) \ break; \ } - + #define ITEM_WALK_END() \ } \ } |
From: Enlightenment S. <no-...@en...> - 2010-08-18 12:29:27
|
Log: Evas textblock: Fixed range_delete. Author: tasn Date: 2010-08-18 05:29:20 -0700 (Wed, 18 Aug 2010) New Revision: 51275 Modified: trunk/evas/src/lib/canvas/evas_object_textblock.c Modified: trunk/evas/src/lib/canvas/evas_object_textblock.c =================================================================== --- trunk/evas/src/lib/canvas/evas_object_textblock.c 2010-08-18 11:38:31 UTC (rev 51274) +++ trunk/evas/src/lib/canvas/evas_object_textblock.c 2010-08-18 12:29:20 UTC (rev 51275) @@ -448,7 +448,7 @@ static Evas_Object_Textblock_Node_Format *_evas_textblock_cursor_node_format_before_or_at_pos_get(const Evas_Textblock_Cursor *cur); static size_t _evas_textblock_node_format_pos_get(const Evas_Object_Textblock_Node_Format *fmt); 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); +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_text_free(Evas_Object_Textblock_Node_Text *n); static void _evas_textblock_changed(Evas_Object_Textblock *o, Evas_Object *obj); @@ -4950,9 +4950,8 @@ * @param n the fromat node to remove */ static void -_evas_textblock_node_format_remove(Evas_Object_Textblock *o, Evas_Object_Textblock_Node_Format *n) +_evas_textblock_node_format_remove(Evas_Object_Textblock *o, Evas_Object_Textblock_Node_Format *n, int visible_adjustment) { - int visible_adjustment; /* Update the text nodes about the change */ { Evas_Object_Textblock_Node_Format *nnode; @@ -4979,8 +4978,6 @@ } } } - /* If it's a visible format, reduce one */ - visible_adjustment = (n->visible) ? 1 : 0; _evas_textblock_node_format_adjust_offset(o, n->text_node, n, n->offset - visible_adjustment); @@ -5011,7 +5008,7 @@ curnode = nnode; nnode = _NODE_FORMAT(EINA_INLIST_GET(nnode)->next); - _evas_textblock_node_format_remove(o, curnode); + _evas_textblock_node_format_remove(o, curnode, curnode->visible); } while (nnode && (nnode->text_node == tnode) && (nnode->offset == 0)); } @@ -5033,27 +5030,33 @@ { Evas_Object_Textblock_Node_Format *itr; int use_end = 1; - int offset = 0; + int offset = end - start; itr = n->format_node; - if (end < 0) end = 0; + + start -= itr->offset; + if (offset < 0) offset = 0; while (itr && (itr->text_node == n)) { - if ((end <= 0) && use_end) + Evas_Object_Textblock_Node_Format *nnode; + int tmp_offset; + /* start is negative when this gets relevant */ + if ((offset + start <= 0) && use_end) { - itr->offset += offset; break; } - if (start <= 0) + nnode = _NODE_FORMAT(EINA_INLIST_GET(itr)->next); + if (nnode) { - offset += itr->offset; - _evas_textblock_node_format_remove(o, itr); + tmp_offset = nnode->offset; } - else + if (start <= 0) { - start -= itr->offset; + /* Don't do visible adjustments because we are removing the visual + * chars anyway and taking those into account */ + _evas_textblock_node_format_remove(o, itr, 0); } - end -= itr->offset; - itr = _NODE_FORMAT(EINA_INLIST_GET(itr)->next); + start -= tmp_offset; + itr = nnode; } } @@ -5869,9 +5872,10 @@ /* Find the first format node after cur2 */ fnode = _evas_textblock_cursor_node_format_before_pos_get(cur2); { - Evas_Object_Textblock_Node_Text *tnode; if (fnode) { + fnode = _evas_textblock_node_format_last_at_off(fnode); + Evas_Object_Textblock_Node_Text *tnode; tnode = fnode->text_node; fnode = _NODE_FORMAT(EINA_INLIST_GET(fnode)->next); if (fnode && (tnode != fnode->text_node)) @@ -5881,7 +5885,11 @@ } else { - fnode = o->format_nodes; + fnode = cur2->node->format_node; + if (fnode && (cur2->node != fnode->text_node)) + { + fnode = NULL; + } } } if (n1 == n2) |
From: Enlightenment S. <no-...@en...> - 2010-08-18 13:56:41
|
Log: Evas textblock: Fixed range_delete with multiple paragraphs + cursor position after deletion. Switched int -> size_t in a couple of places I forgot. Fixed all of gcc's warnings when compiling with -Wextra. Author: tasn Date: 2010-08-18 06:56:34 -0700 (Wed, 18 Aug 2010) New Revision: 51278 Modified: trunk/evas/src/lib/canvas/evas_object_textblock.c Modified: trunk/evas/src/lib/canvas/evas_object_textblock.c =================================================================== --- trunk/evas/src/lib/canvas/evas_object_textblock.c 2010-08-18 13:38:56 UTC (rev 51277) +++ trunk/evas/src/lib/canvas/evas_object_textblock.c 2010-08-18 13:56:34 UTC (rev 51278) @@ -281,7 +281,7 @@ Evas_Object_Textblock_Node_Text *source_node; int x, w, h; int inset, baseline; - int source_pos; + size_t source_pos; unsigned char type; Evas_BiDi_Props bidi_props; }; @@ -347,7 +347,7 @@ struct _Evas_Textblock_Cursor { Evas_Object *obj; - int pos; + size_t pos; Evas_Object_Textblock_Node_Text *node; }; @@ -452,7 +452,7 @@ 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_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, int 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); /* styles */ @@ -5033,7 +5033,8 @@ int offset = end - start; itr = n->format_node; - start -= itr->offset; + if (itr) + start -= itr->offset; if (offset < 0) offset = 0; while (itr && (itr->text_node == n)) { @@ -5071,7 +5072,7 @@ * @param end the end of the section to delete, if end == -1 it means the end of the string. */ static Evas_Object_Textblock_Node_Format * -_evas_textblock_node_text_get_first_format_between(Evas_Object_Textblock *o, +_evas_textblock_node_text_get_first_format_between( Evas_Object_Textblock_Node_Text *n, int start, int end) { Evas_Object_Textblock_Node_Format *itr; @@ -5104,6 +5105,24 @@ static void _evas_textblock_node_text_remove(Evas_Object_Textblock *o, Evas_Object_Textblock_Node_Text *n) { + Evas_Object_Textblock_Node_Format *fnode; + Evas_Object_Textblock_Node_Text *tnode; + fnode = n->format_node; + /* We want to get the last format node that will exist so if + * it's a node to be deleted get the previous one */ + if (fnode && (fnode->text_node == n)) + { + fnode = _NODE_FORMAT(EINA_INLIST_GET(fnode)->prev); + } + /* Update all the text node -> format node links + * go through all the text nodes starting from ours and update + * all the ones pointing to a format node that belongs to n */ + tnode = _NODE_TEXT(EINA_INLIST_GET(n)->next); + while (tnode && tnode->format_node && (tnode->format_node->text_node = n)) + { + tnode->format_node = fnode; + tnode = _NODE_TEXT(EINA_INLIST_GET(tnode)->next); + } _evas_textblock_node_text_remove_formats_between(o, n, 0, -1); o->text_nodes = _NODE_TEXT(eina_inlist_remove( EINA_INLIST_GET(o->text_nodes), EINA_INLIST_GET(n))); @@ -5159,15 +5178,26 @@ * @param pos the pos to set. */ EAPI void -evas_textblock_cursor_pos_set(Evas_Textblock_Cursor *cur, int pos) +evas_textblock_cursor_pos_set(Evas_Textblock_Cursor *cur, int _pos) { - unsigned int len; + size_t len, pos; if (!cur) return; if (!cur->node) return; len = eina_ustrbuf_length_get(cur->node->unicode); - if (pos < 0) pos = 0; - else if (pos > len) pos = len; + if (_pos < 0) + { + pos = 0; + } + else + { + pos = (size_t) _pos; + } + + if (pos > len) + { + pos = len; + } cur->pos = pos; } @@ -5426,7 +5456,7 @@ static void _evas_textblock_cursors_update_offset(const Evas_Textblock_Cursor *cur, const Evas_Object_Textblock_Node_Text *n, - int start, int offset) + size_t start, int offset) { Eina_List *l; Evas_Textblock_Cursor *data; @@ -5438,8 +5468,14 @@ if ((n == o->cursor->node) && (o->cursor->pos > start)) { - o->cursor->pos += offset; - if (o->cursor->pos < 0) o->cursor->pos = 0; + if ((offset < 0) && (o->cursor->pos <= (size_t) (-1 * offset))) + { + o->cursor->pos = 0; + } + else + { + o->cursor->pos += offset; + } } } EINA_LIST_FOREACH(o->cursors, l, data) @@ -5449,8 +5485,14 @@ if ((n == data->node) && (data->pos > start)) { - data->pos += offset; - if (data->pos < 0) data->pos = 0; + if ((offset < 0) && (data->pos <= (size_t) (-1 * offset))) + { + data->pos = 0; + } + else + { + data->pos += offset; + } } } } @@ -5910,8 +5952,11 @@ /* Remove all the text nodes between */ while (n && (n != n2)) { + Evas_Object_Textblock_Node_Text *nnode; + + nnode = _NODE_TEXT(EINA_INLIST_GET(n)->next); _evas_textblock_node_text_remove(o, n); - n = _NODE_TEXT(EINA_INLIST_GET(n)->next); + n = nnode; } /* Remove the formats and the strings in the first and last nodes */ @@ -5931,6 +5976,7 @@ _evas_textblock_cursors_update_offset(cur2, cur2->node, 0, - cur2->pos); } evas_textblock_cursor_copy(cur1, cur2); + evas_textblock_cursor_copy(cur1, o->cursor); _evas_textblock_changed(o, cur1->obj); } @@ -5990,12 +6036,12 @@ eina_unicode_strdup(eina_ustrbuf_string_get(tnode->unicode)); if (tnode == cur2->node) { - fnode = _evas_textblock_node_text_get_first_format_between(o, n1, + fnode = _evas_textblock_node_text_get_first_format_between(n1, cur1->pos, cur2->pos); } else { - fnode = _evas_textblock_node_text_get_first_format_between(o, n1, + fnode = _evas_textblock_node_text_get_first_format_between(n1, cur1->pos, -1); } /* Init the offset so the first one will count starting from cur1->pos @@ -6013,7 +6059,7 @@ { Eina_Unicode tmp_ch; off += fnode->offset; - if ((tnode == cur2->node) && (text - text_base + off >= cur2->pos)) + if ((tnode == cur2->node) && ((size_t) (text - text_base + off) >= cur2->pos)) { break; } @@ -7351,7 +7397,7 @@ } static int -evas_object_textblock_is_opaque(Evas_Object *obj) +evas_object_textblock_is_opaque(Evas_Object *obj __UNUSED__) { /* this returns 1 if the internal object data implies that the object is */ /* currently fulyl opque over the entire gradient it occupies */ @@ -7359,7 +7405,7 @@ } static int -evas_object_textblock_was_opaque(Evas_Object *obj) +evas_object_textblock_was_opaque(Evas_Object *obj __UNUSED__) { /* this returns 1 if the internal object data implies that the object was */ /* currently fulyl opque over the entire gradient it occupies */ |
From: Enlightenment S. <no-...@en...> - 2010-08-19 07:46:38
|
Log: Evas textblock: Improved the docs of the size get functions. It should now be clear exactly what they are about. Author: tasn Date: 2010-08-19 00:46:32 -0700 (Thu, 19 Aug 2010) New Revision: 51385 Modified: trunk/evas/src/lib/canvas/evas_object_textblock.c Modified: trunk/evas/src/lib/canvas/evas_object_textblock.c =================================================================== --- trunk/evas/src/lib/canvas/evas_object_textblock.c 2010-08-19 07:32:44 UTC (rev 51384) +++ trunk/evas/src/lib/canvas/evas_object_textblock.c 2010-08-19 07:46:32 UTC (rev 51385) @@ -6690,12 +6690,25 @@ } /** - * Get the formatted width. + * Get the formatted width. This calculates the actual size after restricting + * the textblock to the current size of the object. + * The main difference between this and @ref evas_object_textblock_size_native_get + * is that the "native" function does not wrapping into account + * it just calculates the real wdith of the objcet if it was placed on an + * infinite canvas, while this function gives the size after wrapping + * according to the size restrictions of the object. * + * For example for a textblock containing the text: "You shall not pass!" + * with no margins or padding and assuming a monospace font and a size of + * 7x10 char widths (for simplicity) has a native size of 19x1 + * and a formatted size of 5x4. + * + * * @param obj the evas object. - * @param w the w of the object. - * @param h the h of the object. + * @param w[out] the w of the object. + * @param h[out] the h of the object * @return Returns no value. + * @see evas_object_textblock_size_native_get */ EAPI void evas_object_textblock_size_formatted_get(const Evas_Object *obj, Evas_Coord *w, Evas_Coord *h) @@ -6707,10 +6720,22 @@ } /** - * to be documented. - * @param obj to be documented. - * @param w to be documented. - * @param h to be documented. + * Get the native idth. This calculates the actual size without taking account + * the current size of the object. + * The main difference between this and @ref evas_object_textblock_size_formatted_get + * is that the "native" function does not take wrapping into account + * it just calculates the real wdith of the objcet if it was placed on an + * infinite canvas, while the "formatted" function gives the size after + * wrapping text according to the size restrictions of the object. + * + * For example for a textblock containing the text: "You shall not pass!" + * with no margins or padding and assuming a monospace font and a size of + * 7x10 char widths (for simplicity) has a native size of 19x1 + * and a formatted size of 5x4. + * + * @param obj the evas object of the textblock + * @param w[out] the width returned + * @param h[out] the height returned * @return Returns no value. */ EAPI void |
From: Enlightenment S. <no-...@en...> - 2010-08-19 14:07:56
|
Log: Evas textblock: Fixed range_text_get, no works when selecting text from multiple paragraphs. Author: tasn Date: 2010-08-19 07:07:45 -0700 (Thu, 19 Aug 2010) New Revision: 51392 Modified: trunk/evas/src/lib/canvas/evas_object_textblock.c Modified: trunk/evas/src/lib/canvas/evas_object_textblock.c =================================================================== --- trunk/evas/src/lib/canvas/evas_object_textblock.c 2010-08-19 13:52:36 UTC (rev 51391) +++ trunk/evas/src/lib/canvas/evas_object_textblock.c 2010-08-19 14:07:45 UTC (rev 51392) @@ -6037,25 +6037,30 @@ eina_unicode_strdup(eina_ustrbuf_string_get(tnode->unicode)); if (tnode == cur2->node) { - fnode = _evas_textblock_node_text_get_first_format_between(n1, + fnode = _evas_textblock_node_text_get_first_format_between(tnode, cur1->pos, cur2->pos); } - else + else if (tnode == cur1->node) { - fnode = _evas_textblock_node_text_get_first_format_between(n1, + fnode = _evas_textblock_node_text_get_first_format_between(tnode, cur1->pos, -1); } + else + { + fnode = _evas_textblock_node_text_get_first_format_between(tnode, + 0, -1); + } /* Init the offset so the first one will count starting from cur1->pos * and not the previous format node */ if ((tnode == cur1->node) && fnode) { off = _evas_textblock_node_format_pos_get(fnode) - cur1->pos - fnode->offset; + text += cur1->pos; } else { off = 0; } - text += cur1->pos; while (fnode && (fnode->text_node == tnode)) { Eina_Unicode tmp_ch; |
From: Enlightenment S. <no-...@en...> - 2010-08-22 11:00:52
|
Log: Evas textblock: fixed most of the cases on which a cursor was not drawn correctly. Author: tasn Date: 2010-08-22 04:00:45 -0700 (Sun, 22 Aug 2010) New Revision: 51515 Modified: trunk/evas/src/lib/canvas/evas_object_textblock.c Modified: trunk/evas/src/lib/canvas/evas_object_textblock.c =================================================================== --- trunk/evas/src/lib/canvas/evas_object_textblock.c 2010-08-22 07:19:29 UTC (rev 51514) +++ trunk/evas/src/lib/canvas/evas_object_textblock.c 2010-08-22 11:00:45 UTC (rev 51515) @@ -5641,7 +5641,7 @@ * @param format the text to create the format node from. * @return Returns the new format node */ - static Evas_Object_Textblock_Node_Format * +static Evas_Object_Textblock_Node_Format * _evas_textblock_node_format_new(const char *format) { Evas_Object_Textblock_Node_Format *n; @@ -5655,6 +5655,26 @@ } /** + * Check if the current cursor position points to the terminating null of the + * last paragraph. (shouldn't be allowed to point to the terminating null of + * any previous paragraph anyway. + * + * @param cur the cursor to look at. + * @return #EINA_TRUE if the cursor points to the terminating null, #EINA_FALSE otherwise. + */ +static Eina_Bool +_evas_textblock_cursor_is_at_the_end(const Evas_Textblock_Cursor *cur) +{ + const Eina_Unicode *text; + + if (!cur) return EINA_FALSE; + if (!cur->node) return EINA_FALSE; + text = eina_ustrbuf_string_get(cur->node->unicode); + return ((text[cur->pos] == 0) && (!EINA_INLIST_GET(cur->node)->next)) ? + EINA_TRUE : EINA_FALSE; +} + +/** * Adds format to the current cursor position. If the format being added is a * visible format, add it *before* the cursor position, otherwise, add it after. * This behavior is because visible formats are like characters and invisible @@ -6233,8 +6253,10 @@ Evas_Object_Textblock_Line *ln = NULL; Evas_Object_Textblock_Item *it = NULL; Evas_Object_Textblock_Format_Item *fi = NULL; + Evas_Textblock_Cursor cur2; int x = 0, y = 0, w = 0, h = 0; int pos, ret; + int previous_format = 0; if (!cur) return -1; o = (Evas_Object_Textblock *)(cur->obj->object_data); @@ -6255,6 +6277,15 @@ return -1; } if (!o->formatted.valid) _relayout(cur->obj); + + /* Cur 2 is pointing to the previous char */ + cur2.obj = cur->obj; + evas_textblock_cursor_copy(cur, &cur2); + if (cur2.pos > 0) + { + cur2.pos--; + } + if (evas_textblock_cursor_format_is_visible_get(cur)) { _find_layout_format_item_line_match(cur->obj, @@ -6262,16 +6293,21 @@ _evas_textblock_cursor_node_format_at_pos_get(cur)), &ln, &fi); } + else if (_evas_textblock_cursor_is_at_the_end(cur) && + evas_textblock_cursor_format_is_visible_get(&cur2)) + { + _find_layout_format_item_line_match(cur->obj, + _evas_textblock_node_visible_at_pos_get( + _evas_textblock_cursor_node_format_at_pos_get(&cur2)), + &ln, &fi); + previous_format = 1; + } else { _find_layout_item_line_match(cur->obj, cur->node, cur->pos, &ln, &it); } - if (!ln) + if (ln && it) { - return -1; - } - if (it) - { pos = cur->pos - it->source_pos; ret = -1; @@ -6301,12 +6337,31 @@ y = ln->y; h = ln->h; } - else if (fi) + else if (ln && fi) { - x = ln->x + fi->x; - y = ln->y; - w = fi->w; - h = ln->h; + if (previous_format) + { + if (_IS_LINE_SEPARATOR( + eina_strbuf_string_get(fi->source_node->format))) + { + x = 0; + y = ln->y + ln->h; + } + else + { + x = ln->x + fi->x + fi->w; + y = ln->y; + } + w = 0; + h = ln->h; + } + else + { + x = ln->x + fi->x; + y = ln->y; + w = fi->w; + h = ln->h; + } } else { |
From: Enlightenment S. <no-...@en...> - 2010-08-22 12:26:47
|
Log: Evas textblock: simplified descent calculation. Author: tasn Date: 2010-08-22 05:26:40 -0700 (Sun, 22 Aug 2010) New Revision: 51516 Modified: trunk/evas/src/lib/canvas/evas_object_textblock.c Modified: trunk/evas/src/lib/canvas/evas_object_textblock.c =================================================================== --- trunk/evas/src/lib/canvas/evas_object_textblock.c 2010-08-22 11:00:45 UTC (rev 51515) +++ trunk/evas/src/lib/canvas/evas_object_textblock.c 2010-08-22 12:26:40 UTC (rev 51516) @@ -1720,7 +1720,7 @@ } else if (fmt->linerelsize > 0.0) { - descent = ((ascent + descent) * fmt->linerelsize) - (ascent * fmt->linerelsize); + descent = descent * fmt->linerelsize; ascent = ascent * fmt->linerelsize; } c->maxdescent += fmt->linegap; |
From: Enlightenment S. <no-...@en...> - 2010-08-25 14:38:03
|
Log: Evas textblock: Paired formats (e.g <b> and </b>) are now only deleted if they point to the same place. This makes everything nice and clean. Author: tasn Date: 2010-08-25 07:37:52 -0700 (Wed, 25 Aug 2010) New Revision: 51646 Modified: trunk/evas/src/lib/canvas/evas_object_textblock.c Modified: trunk/evas/src/lib/canvas/evas_object_textblock.c =================================================================== --- trunk/evas/src/lib/canvas/evas_object_textblock.c 2010-08-25 14:23:00 UTC (rev 51645) +++ trunk/evas/src/lib/canvas/evas_object_textblock.c 2010-08-25 14:37:52 UTC (rev 51646) @@ -445,6 +445,8 @@ +static void _evas_textblock_node_text_remove(Evas_Object_Textblock *o, Evas_Object_Textblock_Node_Text *n); +static void _evas_textblock_node_text_remove_formats_between(Evas_Object_Textblock *o, Evas_Object_Textblock_Node_Text *n, int start, int end); static Evas_Object_Textblock_Node_Format *_evas_textblock_cursor_node_format_before_or_at_pos_get(const Evas_Textblock_Cursor *cur); static size_t _evas_textblock_node_format_pos_get(const Evas_Object_Textblock_Node_Format *fmt); static Eina_Bool _evas_textblock_format_is_visible(const char *s); @@ -552,8 +554,7 @@ Evas_Object_Textblock_Node_Text *n; n = o->text_nodes; - o->text_nodes = _NODE_TEXT(eina_inlist_remove(EINA_INLIST_GET(o->text_nodes), EINA_INLIST_GET(n))); - _evas_textblock_node_text_free(n); + _evas_textblock_node_text_remove(o, n); } while (o->format_nodes) { @@ -4044,18 +4045,18 @@ * * @param o the text block object. * @param to merge into to. - * @param from merge from from. */ static void -_evas_textblock_nodes_merge(Evas_Object_Textblock *o, Evas_Object_Textblock_Node_Text *to, - Evas_Object_Textblock_Node_Text *from) +_evas_textblock_nodes_merge(Evas_Object_Textblock *o, Evas_Object_Textblock_Node_Text *to) { Evas_Object_Textblock_Node_Format *itr; Evas_Object_Textblock_Node_Format *pnode; + Evas_Object_Textblock_Node_Text *from; const Eina_Unicode *text; int to_len, len; - if (!to || !from) return; + if (!to) return; + from = _NODE_TEXT(EINA_INLIST_GET(to)->next); to_len = eina_ustrbuf_length_get(to->unicode); text = eina_ustrbuf_string_get(from->unicode); @@ -4069,7 +4070,6 @@ if (pnode && (pnode->text_node == to)) { itr->offset += to_len - _evas_textblock_node_format_pos_get(pnode); - itr->offset -= (pnode->visible) ? 1 : 0; } else { @@ -4088,9 +4088,7 @@ } _evas_textblock_cursors_set_node(o, from, to); - o->text_nodes = _NODE_TEXT(eina_inlist_remove( - EINA_INLIST_GET(o->text_nodes), EINA_INLIST_GET(from))); - _evas_textblock_node_text_free(from); + _evas_textblock_node_text_remove(o, from); } /** @@ -4112,8 +4110,9 @@ if (!cur) return; o = (Evas_Object_Textblock *)(cur->obj->object_data); nnode = _NODE_TEXT(EINA_INLIST_GET(cur->node)->next); - _evas_textblock_nodes_merge(o, cur->node, nnode); - _evas_textblock_cursors_update_offset(o->cursor, nnode, 0, len); + _evas_textblock_nodes_merge(o, cur->node); + _evas_textblock_cursors_update_offset(cur, nnode, 0, len); + _evas_textblock_cursors_set_node(o, nnode, cur->node); if (nnode == o->cursor->node) { o->cursor->node = cur->node; @@ -4911,8 +4910,65 @@ cur->pos = position; } + + /** * @internal + * Remove pairs of + and - formats and also remove formats without + or - + * i.e formats that pair to themselves + * + * @param o the textblock object. + * @param fmt the current format. + */ +static void +_evas_textblock_node_format_remove_matching(Evas_Object_Textblock *o, + Evas_Object_Textblock_Node_Format *fmt) +{ + Evas_Object_Textblock_Node_Text *tnode; + Eina_List *formats = NULL; + size_t offset; + + if (!fmt) return; + + tnode = fmt->text_node; + + do + { + Evas_Object_Textblock_Node_Format *nnode; + const char *fstr = eina_strbuf_string_get(fmt->format); + + nnode = _NODE_FORMAT(EINA_INLIST_GET(fmt)->next); + if (nnode) + { + offset = nnode->offset; + } + + + if (fstr && (*fstr == '+')) + { + formats = eina_list_prepend(formats, fmt); + } + else if (fstr && (*fstr == '-')) + { + Evas_Object_Textblock_Node_Format *fnode; + fnode = eina_list_data_get(formats); + if (fnode) + { + formats = eina_list_remove(formats, fnode); + _evas_textblock_node_format_remove(o, fnode, 0); + _evas_textblock_node_format_remove(o, fmt, 0); + } + } + else + { + _evas_textblock_node_format_remove(o, fmt, 0); + } + fmt = nnode; + } + while (fmt && (offset == 0) && (fmt->text_node == tnode)); +} +/** + * @internal * Add the offset (may be negative) to the first node after fmt which is * pointing to the text node tnode or to o->format_nodes if fmt is null * and it points to tnode. @@ -4971,6 +5027,12 @@ /* If there's no next one update the text nodes */ nnode = _NODE_FORMAT(EINA_INLIST_GET(n)->prev); tnode = n->text_node; + /* Even if it's not the current text_node's main node + * it can still be the next's. */ + if (tnode && (tnode->format_node != n)) + { + tnode = _NODE_TEXT(EINA_INLIST_GET(tnode)->next); + } while (tnode && (tnode->format_node == n)) { tnode->format_node = nnode; @@ -4987,30 +5049,115 @@ /** * @internal - * Removes all the format nodes at a location strating from n. - * This function updates the offset of the next format node and the - * text nodes pointing to it. + * Sets all the offsets of the format nodes between start and end in the text + * node n to 0. + * If end == -1 end means the end of the string. * - * @param o the textblock object. - * @param n the fromat node to remove from. + * @param n the text node the positinos refer to. + * @param start the start of where to delete from. + * @param end the end of the section to delete, if end == -1 it means the end of the string. + * @returns #EINA_TRUE if removed a PS, false otherwise. */ -static void -_evas_textblock_node_format_remove_all_at_pos(Evas_Object_Textblock *o, Evas_Object_Textblock_Node_Format *n) +static Eina_Bool +_evas_textblock_node_text_adjust_offsets_to_start(Evas_Object_Textblock *o, + Evas_Object_Textblock_Node_Text *n, size_t start, int end) { - Evas_Object_Textblock_Node_Format *nnode; - Evas_Object_Textblock_Node_Text *tnode; + Evas_Object_Textblock_Node_Format *last_node, *itr; + Evas_Object_Textblock_Node_Text *new_node; + int use_end = 1; + int delta = 0; + int first = 1; + int update_format_node; + size_t pos = 0; - nnode = n; - tnode = n->text_node; - do + itr = n->format_node; + if (!itr || (itr->text_node != n)) return EINA_FALSE; + + if ((end < 0) || ((size_t) end == eina_ustrbuf_length_get(n->unicode))) { - Evas_Object_Textblock_Node_Format *curnode; - curnode = nnode; - nnode = _NODE_FORMAT(EINA_INLIST_GET(nnode)->next); + use_end = 0; + } - _evas_textblock_node_format_remove(o, curnode, curnode->visible); + /* If we are not removing the text node, all should stay in this text + * node, otherwise, everything should move to the previous node */ + if ((start == 0) && !use_end) + { + new_node = _NODE_TEXT(EINA_INLIST_GET(n)->prev); + if (!new_node) + { + new_node = _NODE_TEXT(EINA_INLIST_GET(n)->next); + } } - while (nnode && (nnode->text_node == tnode) && (nnode->offset == 0)); + else + { + new_node = n; + } + + /* Find the first node after start */ + while (itr && (itr->text_node == n)) + { + pos += itr->offset; + if (pos >= start) + { + break; + } + itr = _NODE_FORMAT(EINA_INLIST_GET(itr)->next); + } + + if (!itr || (itr->text_node != n)) + { + return EINA_FALSE; + } + + update_format_node = ((itr == n->format_node) && (new_node != n)); + delta = end - pos; + itr->offset -= pos - start; + + while (itr && (itr->text_node == n)) + { + last_node = itr; + itr = _NODE_FORMAT(EINA_INLIST_GET(itr)->next); + + if (!first) + { + pos += last_node->offset; + } + + /* start is negative when this gets relevant */ + if (use_end && (pos > (size_t) end)) + { + last_node->offset -= delta; + break; + } + + delta = end - pos; + if (!first) + { + last_node->offset = 0; + } + else + { + first = 0; + } + if (!itr || (itr && (itr->text_node != n))) + { + /* Remove the PS, and return since it's the end of the node */ + if (_IS_PARAGRAPH_SEPARATOR( + eina_strbuf_string_get(last_node->format))) + { + _evas_textblock_node_format_remove(o, last_node, 0); + return EINA_TRUE; + } + + } + last_node->text_node = new_node; + if (update_format_node) + { + n->format_node = last_node; + } + } + + return EINA_FALSE; } /** @@ -5106,27 +5253,11 @@ static void _evas_textblock_node_text_remove(Evas_Object_Textblock *o, Evas_Object_Textblock_Node_Text *n) { - Evas_Object_Textblock_Node_Format *fnode; - Evas_Object_Textblock_Node_Text *tnode; - fnode = n->format_node; - /* We want to get the last format node that will exist so if - * it's a node to be deleted get the previous one */ - if (fnode && (fnode->text_node == n)) - { - fnode = _NODE_FORMAT(EINA_INLIST_GET(fnode)->prev); - } - /* Update all the text node -> format node links - * go through all the text nodes starting from ours and update - * all the ones pointing to a format node that belongs to n */ - tnode = _NODE_TEXT(EINA_INLIST_GET(n)->next); - while (tnode && tnode->format_node && (tnode->format_node->text_node = n)) - { - tnode->format_node = fnode; - tnode = _NODE_TEXT(EINA_INLIST_GET(tnode)->next); - } - _evas_textblock_node_text_remove_formats_between(o, n, 0, -1); + _evas_textblock_node_text_adjust_offsets_to_start(o, n, 0, -1); + o->text_nodes = _NODE_TEXT(eina_inlist_remove( EINA_INLIST_GET(o->text_nodes), EINA_INLIST_GET(n))); + _evas_textblock_node_text_free(n); } /** @@ -5309,9 +5440,11 @@ /* text controls */ /** * @internal - * Free a text node. + * Free a text node. Shouldn't be used usually, it's better to use + * @ref _evas_textblock_node_text_remove for most cases . * * @param n the text node to free + * @see _evas_textblock_node_text_remove */ static void _evas_textblock_node_text_free(Evas_Object_Textblock_Node_Text *n) @@ -5850,35 +5983,27 @@ /* Remove a format node if needed, and remove the char only if the * fmt node is not visible */ { - Evas_Object_Textblock_Node_Format *fmt; + Evas_Object_Textblock_Node_Format *fmt, *fmt2; fmt = _evas_textblock_cursor_node_format_at_pos_get(cur); if (fmt) { const char *format = NULL; Evas_Object_Textblock_Node_Format *itr; - itr = fmt; - do + /* If there's a PS it must be the last become it delimits paragraphs */ + itr = _evas_textblock_node_format_last_at_off(fmt); + format = eina_strbuf_string_get(fmt->format); + if (format && _IS_PARAGRAPH_SEPARATOR(format)) { - format = eina_strbuf_string_get(fmt->format); - if (format && _IS_PARAGRAPH_SEPARATOR(format)) - { - merge_nodes = 1; - } - itr = _NODE_FORMAT(EINA_INLIST_GET(itr)->next); + merge_nodes = 1; } - while (itr && (itr->text_node == fmt->text_node) && - (itr->offset == 0)); - _evas_textblock_node_format_remove_all_at_pos(o, fmt); } - /* If the format node is not visible (because visible nodes adjust - * automatically when removing them) adjust */ - if (!evas_textblock_cursor_format_is_visible_get(cur)) - { - fmt = _evas_textblock_cursor_node_format_before_or_at_pos_get(cur); - fmt = _evas_textblock_node_format_last_at_off(fmt); - _evas_textblock_node_format_adjust_offset(o, cur->node, fmt, - -(index - cur->pos)); - } + + fmt2 = _evas_textblock_cursor_node_format_before_or_at_pos_get(cur); + fmt2 = _evas_textblock_node_format_last_at_off(fmt2); + _evas_textblock_node_format_adjust_offset(o, cur->node, fmt2, + -(index - cur->pos)); + + _evas_textblock_node_format_remove_matching(o, fmt); } eina_ustrbuf_remove(n->unicode, cur->pos, index); /* If it was a paragraph separator, we should merge the current with the @@ -5914,7 +6039,7 @@ { Evas_Object_Textblock *o; Evas_Object_Textblock_Node_Text *n1, *n2, *n; - Evas_Object_Textblock_Node_Format *fnode = NULL; + Eina_Bool should_merge = EINA_FALSE; if (!cur1 || !cur1->node) return; if (!cur2 || !cur2->node) return; @@ -5932,43 +6057,23 @@ n2 = cur2->node; cur2->pos++; /* Also remove the marked char */ - /* Find the first format node after cur2 */ - fnode = _evas_textblock_cursor_node_format_before_pos_get(cur2); + if (n1 == n2) { - if (fnode) + eina_ustrbuf_remove(n1->unicode, cur1->pos, cur2->pos); + if ((cur1->pos == 0) && (cur2->pos == eina_ustrbuf_length_get(n1->unicode))) { - fnode = _evas_textblock_node_format_last_at_off(fnode); - Evas_Object_Textblock_Node_Text *tnode; - tnode = fnode->text_node; - fnode = _NODE_FORMAT(EINA_INLIST_GET(fnode)->next); - if (fnode && (tnode != fnode->text_node)) - { - fnode = NULL; - } + _evas_textblock_node_text_remove_formats_between(o, n1, 0, -1); } else { - fnode = cur2->node->format_node; - if (fnode && (cur2->node != fnode->text_node)) - { - fnode = NULL; - } + should_merge = _evas_textblock_node_text_adjust_offsets_to_start(o, n1, cur1->pos, cur2->pos); } - } - if (n1 == n2) - { - _evas_textblock_node_text_remove_formats_between(o, n1, cur1->pos, - cur2->pos); - eina_ustrbuf_remove(n1->unicode, cur1->pos, cur2->pos); - if (fnode && (fnode->text_node == n1)) - { - fnode->offset -= cur2->pos - cur1->pos; - } _evas_textblock_cursors_update_offset(cur1, cur1->node, cur1->pos, - (cur2->pos - cur1->pos)); } else { int len; + _evas_textblock_node_text_adjust_offsets_to_start(o, n1, cur1->pos, -1); n = _NODE_TEXT(EINA_INLIST_GET(n1)->next); /* Remove all the text nodes between */ while (n && (n != n2)) @@ -5976,26 +6081,28 @@ Evas_Object_Textblock_Node_Text *nnode; nnode = _NODE_TEXT(EINA_INLIST_GET(n)->next); + _evas_textblock_cursors_set_node(o, n, n1); _evas_textblock_node_text_remove(o, n); n = nnode; } + should_merge = _evas_textblock_node_text_adjust_offsets_to_start(o, n2, 0, cur2->pos); /* Remove the formats and the strings in the first and last nodes */ len = eina_ustrbuf_length_get(n1->unicode); - _evas_textblock_node_text_remove_formats_between(o, n1, cur1->pos, - len); - _evas_textblock_node_text_remove_formats_between(o, n2, 0, cur2->pos); eina_ustrbuf_remove(n1->unicode, cur1->pos, len); eina_ustrbuf_remove(n2->unicode, 0, cur2->pos); - if (fnode && (fnode->text_node == n2)) - { - fnode->offset -= cur2->pos; - } /* Merge the nodes because we removed the PS */ - _evas_textblock_nodes_merge(o, n1, n2); _evas_textblock_cursors_update_offset(cur1, cur1->node, cur1->pos, - cur1->pos); _evas_textblock_cursors_update_offset(cur2, cur2->node, 0, - cur2->pos); + _evas_textblock_nodes_merge(o, n1); } + _evas_textblock_node_format_remove_matching(o, + _evas_textblock_cursor_node_format_at_pos_get(cur1)); + + if (should_merge) + { + _evas_textblock_nodes_merge(o, n1); + } evas_textblock_cursor_copy(cur1, cur2); evas_textblock_cursor_copy(cur1, o->cursor); _evas_textblock_changed(o, cur1->obj); @@ -7552,3 +7659,25 @@ * @} */ + +#if 0 +/* Good for debugging */ +void +pfnode(Evas_Object_Textblock_Node_Format *n) +{ + printf("Format Node: %p\n", n); + printf("next = %p, prev = %p, last = %p\n", EINA_INLIST_GET(n)->next, EINA_INLIST_GET(n)->prev, EINA_INLIST_GET(n)->last); + printf("text_node = %p, offset = %u, visible = %d\n", n->text_node, n->offset, n->visible); + printf("%s\n", eina_strbuf_string_get(n->format)); +} + +void +ptnode(Evas_Object_Textblock_Node_Text *n) +{ + printf("Text Node: %p\n", n); + printf("next = %p, prev = %p, last = %p\n", EINA_INLIST_GET(n)->next, EINA_INLIST_GET(n)->prev, EINA_INLIST_GET(n)->last); + printf("format_node = %p\n", n->format_node); + printf("%ls\n", eina_ustrbuf_string_get(n->unicode)); +} +#endif + |
From: Enlightenment S. <no-...@en...> - 2010-08-26 09:22:38
|
Log: Evas textblock: Fixed a bit of formatting. Author: tasn Date: 2010-08-26 02:22:31 -0700 (Thu, 26 Aug 2010) New Revision: 51653 Modified: trunk/evas/src/lib/canvas/evas_object_textblock.c Modified: trunk/evas/src/lib/canvas/evas_object_textblock.c =================================================================== --- trunk/evas/src/lib/canvas/evas_object_textblock.c 2010-08-26 04:37:43 UTC (rev 51652) +++ trunk/evas/src/lib/canvas/evas_object_textblock.c 2010-08-26 09:22:31 UTC (rev 51653) @@ -4796,7 +4796,7 @@ if (!cur->node) return; o = (Evas_Object_Textblock *)(cur->obj->object_data); if (!o->formatted.valid) _relayout(cur->obj); -// kills "click below text" and up/downm arrow. disable +// kills "click below text" and up/downm arrow. disable if (evas_textblock_cursor_format_is_visible_get(cur)) { @@ -5896,11 +5896,13 @@ /* Adjust differently if we insert a format char */ if (is_visible) { - _evas_textblock_node_format_adjust_offset(o, cur->node, n, -(n->offset - 1)); + _evas_textblock_node_format_adjust_offset(o, cur->node, n, + -(n->offset - 1)); } else { - _evas_textblock_node_format_adjust_offset(o, cur->node, n, -n->offset); + _evas_textblock_node_format_adjust_offset(o, cur->node, n, + -n->offset); } if (!fmt || (fmt->text_node != cur->node)) @@ -6060,13 +6062,15 @@ if (n1 == n2) { eina_ustrbuf_remove(n1->unicode, cur1->pos, cur2->pos); - if ((cur1->pos == 0) && (cur2->pos == eina_ustrbuf_length_get(n1->unicode))) + if ((cur1->pos == 0) && + (cur2->pos == eina_ustrbuf_length_get(n1->unicode))) { _evas_textblock_node_text_remove_formats_between(o, n1, 0, -1); } else { - should_merge = _evas_textblock_node_text_adjust_offsets_to_start(o, n1, cur1->pos, cur2->pos); + should_merge = _evas_textblock_node_text_adjust_offsets_to_start(o, + n1, cur1->pos, cur2->pos); } _evas_textblock_cursors_update_offset(cur1, cur1->node, cur1->pos, - (cur2->pos - cur1->pos)); } @@ -6085,14 +6089,16 @@ _evas_textblock_node_text_remove(o, n); n = nnode; } - should_merge = _evas_textblock_node_text_adjust_offsets_to_start(o, n2, 0, cur2->pos); + should_merge = _evas_textblock_node_text_adjust_offsets_to_start(o, n2, + 0, cur2->pos); /* Remove the formats and the strings in the first and last nodes */ len = eina_ustrbuf_length_get(n1->unicode); eina_ustrbuf_remove(n1->unicode, cur1->pos, len); eina_ustrbuf_remove(n2->unicode, 0, cur2->pos); /* Merge the nodes because we removed the PS */ - _evas_textblock_cursors_update_offset(cur1, cur1->node, cur1->pos, - cur1->pos); + _evas_textblock_cursors_update_offset(cur1, cur1->node, cur1->pos, + - cur1->pos); _evas_textblock_cursors_update_offset(cur2, cur2->node, 0, - cur2->pos); _evas_textblock_nodes_merge(o, n1); } @@ -6181,7 +6187,8 @@ * and not the previous format node */ if ((tnode == cur1->node) && fnode) { - off = _evas_textblock_node_format_pos_get(fnode) - cur1->pos - fnode->offset; + off = _evas_textblock_node_format_pos_get(fnode) - + cur1->pos - fnode->offset; text += cur1->pos; } else @@ -6192,7 +6199,8 @@ { Eina_Unicode tmp_ch; off += fnode->offset; - if ((tnode == cur2->node) && ((size_t) (text - text_base + off) >= cur2->pos)) + if ((tnode == cur2->node) && + ((size_t) (text - text_base + off) >= cur2->pos)) { break; } @@ -7042,62 +7050,62 @@ #define ITEM_WALK() \ EINA_INLIST_FOREACH(o->paragraphs->lines, ln) \ { \ - Evas_Object_Textblock_Item *it; \ - \ + Evas_Object_Textblock_Item *it; \ + \ pback = 0; \ pline = 0; \ pline2 = 0; \ - pstrike = 0; \ + pstrike = 0; \ if (clip) \ { \ if ((obj->cur.geometry.y + y + ln->y + ln->h) < (cy - 20)) \ - continue; \ + continue; \ if ((obj->cur.geometry.y + y + ln->y) > (cy + ch + 20)) \ - break; \ + break; \ } \ - EINA_INLIST_FOREACH(ln->items, it) \ - { \ - int yoff; \ - \ - yoff = ln->baseline; \ - if (it->format->valign != -1.0) \ - yoff = (it->format->valign * (double)(ln->h - it->h)) + it->baseline; \ + EINA_INLIST_FOREACH(ln->items, it) \ + { \ + int yoff; \ + \ + yoff = ln->baseline; \ + if (it->format->valign != -1.0) \ + yoff = (it->format->valign * (double)(ln->h - it->h)) + it->baseline; \ if (clip) \ { \ if ((obj->cur.geometry.x + x + ln->x + it->x - it->inset + it->w) < (cx - 20)) \ - continue; \ + continue; \ if ((obj->cur.geometry.x + x + ln->x + it->x - it->inset) > (cx + cw + 20)) \ - break; \ + break; \ } #define ITEM_WALK_END() \ - } \ + } \ } #define COLOR_SET(col) \ - ENFN->context_color_set(output, context, \ - (obj->cur.cache.clip.r * it->format->color.col.r) / 255, \ - (obj->cur.cache.clip.g * it->format->color.col.g) / 255, \ - (obj->cur.cache.clip.b * it->format->color.col.b) / 255, \ - (obj->cur.cache.clip.a * it->format->color.col.a) / 255); + ENFN->context_color_set(output, context, \ + (obj->cur.cache.clip.r * it->format->color.col.r) / 255, \ + (obj->cur.cache.clip.g * it->format->color.col.g) / 255, \ + (obj->cur.cache.clip.b * it->format->color.col.b) / 255, \ + (obj->cur.cache.clip.a * it->format->color.col.a) / 255); #define COLOR_SET_AMUL(col, amul) \ - ENFN->context_color_set(output, context, \ - (obj->cur.cache.clip.r * it->format->color.col.r * (amul)) / 65025, \ - (obj->cur.cache.clip.g * it->format->color.col.g * (amul)) / 65025, \ - (obj->cur.cache.clip.b * it->format->color.col.b * (amul)) / 65025, \ - (obj->cur.cache.clip.a * it->format->color.col.a * (amul)) / 65025); + ENFN->context_color_set(output, context, \ + (obj->cur.cache.clip.r * it->format->color.col.r * (amul)) / 65025, \ + (obj->cur.cache.clip.g * it->format->color.col.g * (amul)) / 65025, \ + (obj->cur.cache.clip.b * it->format->color.col.b * (amul)) / 65025, \ + (obj->cur.cache.clip.a * it->format->color.col.a * (amul)) / 65025); # define DRAW_TEXT(ox, oy) \ if (it->format->font.font) ENFN->font_draw(output, context, surface, it->format->font.font, \ - obj->cur.geometry.x + ln->x + it->x - it->inset + x + (ox), \ - obj->cur.geometry.y + ln->y + yoff + y + (oy), \ - it->w, it->h, it->w, it->h, it->text, &it->bidi_props); + obj->cur.geometry.x + ln->x + it->x - it->inset + x + (ox), \ + obj->cur.geometry.y + ln->y + yoff + y + (oy), \ + it->w, it->h, it->w, it->h, it->text, &it->bidi_props); # if 0 #define DRAW_TEXT(ox, oy) \ if (it->format->font.font) ENFN->font_draw(output, context, surface, it->format->font.font, \ - obj->cur.geometry.x + ln->x + it->x - it->inset + x + (ox), \ - obj->cur.geometry.y + ln->y + yoff + y + (oy), \ - obj->cur.cache.geometry.x + ln->x + it->x - it->inset + x + (ox), \ - obj->cur.cache.geometry.y + ln->y + yoff + y + (oy), \ - it->w, it->h, it->w, it->h, it->text, &it->bidi_props); + obj->cur.geometry.x + ln->x + it->x - it->inset + x + (ox), \ + obj->cur.geometry.y + ln->y + yoff + y + (oy), \ + obj->cur.cache.geometry.x + ln->x + it->x - it->inset + x + (ox), \ + obj->cur.cache.geometry.y + ln->y + yoff + y + (oy), \ + it->w, it->h, it->w, it->h, it->text, &it->bidi_props); #endif #define ITEM_WALK_LINE_SKIP_DROP() \ if ((ln->y + ln->h) <= 0) continue; \ |
From: Enlightenment S. <no-...@en...> - 2010-08-26 11:14:11
|
Log: Evas textblock: Fixed tab causing weird spacing and unwanted linewraps. Author: tasn Date: 2010-08-26 04:14:03 -0700 (Thu, 26 Aug 2010) New Revision: 51655 Modified: trunk/evas/src/lib/canvas/evas_object_textblock.c Modified: trunk/evas/src/lib/canvas/evas_object_textblock.c =================================================================== --- trunk/evas/src/lib/canvas/evas_object_textblock.c 2010-08-26 09:40:48 UTC (rev 51654) +++ trunk/evas/src/lib/canvas/evas_object_textblock.c 2010-08-26 11:14:03 UTC (rev 51655) @@ -2902,14 +2902,15 @@ Evas_Object_Textblock_Format_Item *fi; int x2; - x2 = (fmt->tabstops * ((c->x + fmt->tabstops) / fmt->tabstops)); - if (x2 > + x2 = c->x + fmt->tabstops; + /* Wrap lines if there's a size */ + if ((c->w > 0) && (x2 > (c->w - c->o->style_pad.l - c->o->style_pad.r - - c->marginl - c->marginr)) + c->marginl - c->marginr))) { _layout_line_advance(c, fmt); - x2 = (fmt->tabstops * ((c->x + fmt->tabstops) / fmt->tabstops)); + x2 = c->x + fmt->tabstops; } if (c->ln->items) { |
From: Enlightenment S. <no-...@en...> - 2010-08-26 13:04:22
|
Log: Evas textblock: Fixed ignoring of unicode object replacement char. Author: tasn Date: 2010-08-26 06:04:13 -0700 (Thu, 26 Aug 2010) New Revision: 51658 Modified: trunk/evas/src/lib/canvas/evas_object_textblock.c Modified: trunk/evas/src/lib/canvas/evas_object_textblock.c =================================================================== --- trunk/evas/src/lib/canvas/evas_object_textblock.c 2010-08-26 12:14:38 UTC (rev 51657) +++ trunk/evas/src/lib/canvas/evas_object_textblock.c 2010-08-26 13:04:13 UTC (rev 51658) @@ -3891,8 +3891,9 @@ * fancier in the future, atm it breaks if this char * is inside <> */ _prepend_text_run(o, s, p); - p += 2; /* it's also advanced later in this loop */ - s = NULL; + p += 2; /* it's also advanced later in this loop need +3 + * in total*/ + s = p + 1; /* One after the end of the replacement char */ } p++; } |
From: Enlightenment S. <no-...@en...> - 2010-08-29 08:27:21
|
Log: Evas textblock: Fixed segfault when clearing a textblock and then trying to delete while it's empty. And fixed cursor position in cases when there's a visible format after a \n Author: tasn Date: 2010-08-29 01:27:13 -0700 (Sun, 29 Aug 2010) New Revision: 51709 Modified: trunk/evas/src/lib/canvas/evas_object_textblock.c Modified: trunk/evas/src/lib/canvas/evas_object_textblock.c =================================================================== --- trunk/evas/src/lib/canvas/evas_object_textblock.c 2010-08-29 02:25:57 UTC (rev 51708) +++ trunk/evas/src/lib/canvas/evas_object_textblock.c 2010-08-29 08:27:13 UTC (rev 51709) @@ -3057,7 +3057,7 @@ _layout_text_append(c, fmt, n, start, -1, o->repch); } /* Advance the line so it'll calculate the size */ - if ((c->ln) && (c->ln->items) && (fmt)) + if ((c->ln) && (c->ln->items || c->ln->format_items) && (fmt)) _layout_line_advance(c, fmt); /* Clean the rest of the format stack */ @@ -5975,7 +5975,7 @@ const Eina_Unicode *text; int chr, index, ppos; - if (!cur) return; + if (!cur || !cur->node) return; o = (Evas_Object_Textblock *)(cur->obj->object_data); n = cur->node; |
From: Enlightenment S. <no-...@en...> - 2010-08-29 09:13:55
|
Log: Evas textblock: Fixed 'Home' and 'End' in the last line when it ends with a visible format. Author: tasn Date: 2010-08-29 02:13:48 -0700 (Sun, 29 Aug 2010) New Revision: 51716 Modified: trunk/evas/src/lib/canvas/evas_object_textblock.c Modified: trunk/evas/src/lib/canvas/evas_object_textblock.c =================================================================== --- trunk/evas/src/lib/canvas/evas_object_textblock.c 2010-08-29 08:51:43 UTC (rev 51715) +++ trunk/evas/src/lib/canvas/evas_object_textblock.c 2010-08-29 09:13:48 UTC (rev 51716) @@ -445,6 +445,7 @@ +static Eina_Bool _evas_textblock_cursor_is_at_the_end(const Evas_Textblock_Cursor *cur); static void _evas_textblock_node_text_remove(Evas_Object_Textblock *o, Evas_Object_Textblock_Node_Text *n); static void _evas_textblock_node_text_remove_formats_between(Evas_Object_Textblock *o, Evas_Object_Textblock_Node_Text *n, int start, int end); static Evas_Object_Textblock_Node_Format *_evas_textblock_cursor_node_format_before_or_at_pos_get(const Evas_Textblock_Cursor *cur); @@ -4742,11 +4743,21 @@ Evas_Object_Textblock_Line *ln = NULL; Evas_Object_Textblock_Item *it = NULL; Evas_Object_Textblock_Format_Item *fi = NULL; + Evas_Textblock_Cursor cur2; if (!cur) return; if (!cur->node) return; o = (Evas_Object_Textblock *)(cur->obj->object_data); if (!o->formatted.valid) _relayout(cur->obj); + + /* Cur 2 is pointing to the previous char */ + cur2.obj = cur->obj; + evas_textblock_cursor_copy(cur, &cur2); + if (cur2.pos > 0) + { + cur2.pos--; + } + if (evas_textblock_cursor_format_is_visible_get(cur)) { _find_layout_format_item_line_match(cur->obj, @@ -4754,6 +4765,14 @@ _evas_textblock_cursor_node_format_at_pos_get(cur)), &ln, &fi); } + else if (_evas_textblock_cursor_is_at_the_end(cur) && + evas_textblock_cursor_format_is_visible_get(&cur2)) + { + _find_layout_format_item_line_match(cur->obj, + _evas_textblock_node_visible_at_pos_get( + _evas_textblock_cursor_node_format_at_pos_get(&cur2)), + &ln, &fi); + } else { _find_layout_item_line_match(cur->obj, cur->node, cur->pos, &ln, &it); @@ -4793,6 +4812,7 @@ Evas_Object_Textblock_Line *ln = NULL; Evas_Object_Textblock_Item *it = NULL; Evas_Object_Textblock_Format_Item *fi = NULL; + Evas_Textblock_Cursor cur2; if (!cur) return; if (!cur->node) return; @@ -4800,6 +4820,14 @@ if (!o->formatted.valid) _relayout(cur->obj); // kills "click below text" and up/downm arrow. disable + /* Cur 2 is pointing to the previous char */ + cur2.obj = cur->obj; + evas_textblock_cursor_copy(cur, &cur2); + if (cur2.pos > 0) + { + cur2.pos--; + } + if (evas_textblock_cursor_format_is_visible_get(cur)) { _find_layout_format_item_line_match(cur->obj, @@ -4807,6 +4835,14 @@ _evas_textblock_cursor_node_format_at_pos_get(cur)), &ln, &fi); } + else if (_evas_textblock_cursor_is_at_the_end(cur) && + evas_textblock_cursor_format_is_visible_get(&cur2)) + { + _find_layout_format_item_line_match(cur->obj, + _evas_textblock_node_visible_at_pos_get( + _evas_textblock_cursor_node_format_at_pos_get(&cur2)), + &ln, &fi); + } else { _find_layout_item_line_match(cur->obj, cur->node, cur->pos, &ln, &it); @@ -4817,6 +4853,7 @@ it = (Evas_Object_Textblock_Item *)((EINA_INLIST_GET(ln->items))->last); else it = NULL; + if (ln->format_items) fi = (Evas_Object_Textblock_Format_Item *)((EINA_INLIST_GET(ln->format_items))->last); else @@ -4835,12 +4872,17 @@ index = eina_unicode_strlen(it->text) - 1; if (index < 0) index = 0; if (index >= 0) GET_NEXT(it->text, index); - if (index >= 0) cur->pos += index; + cur->pos += index; } else if (fi) { cur->node = fi->source_node->text_node; cur->pos = _evas_textblock_node_format_pos_get(fi->source_node); + /* If it's the last line, advance to the null */ + if (!EINA_INLIST_GET(ln)->next) + { + cur->pos++; + } } } |
From: Enlightenment S. <no-...@en...> - 2010-08-29 09:19:11
|
Log: Evas textblock: Fixed 'up' and 'down' when pointing to the end of the last line when it ends with a visible format. Author: tasn Date: 2010-08-29 02:19:04 -0700 (Sun, 29 Aug 2010) New Revision: 51717 Modified: trunk/evas/src/lib/canvas/evas_object_textblock.c Modified: trunk/evas/src/lib/canvas/evas_object_textblock.c =================================================================== --- trunk/evas/src/lib/canvas/evas_object_textblock.c 2010-08-29 09:13:48 UTC (rev 51716) +++ trunk/evas/src/lib/canvas/evas_object_textblock.c 2010-08-29 09:19:04 UTC (rev 51717) @@ -6550,6 +6550,7 @@ Evas_Object_Textblock_Line *ln = NULL; Evas_Object_Textblock_Item *it = NULL; Evas_Object_Textblock_Format_Item *fi = NULL; + Evas_Textblock_Cursor cur2; int x, y, w, h; if (!cur) return -1; @@ -6561,6 +6562,14 @@ } else { + /* Cur 2 is pointing to the previous char */ + cur2.obj = cur->obj; + evas_textblock_cursor_copy(cur, &cur2); + if (cur2.pos > 0) + { + cur2.pos--; + } + if (evas_textblock_cursor_format_is_visible_get(cur)) { _find_layout_format_item_line_match(cur->obj, @@ -6568,6 +6577,14 @@ _evas_textblock_cursor_node_format_at_pos_get(cur)), &ln, &fi); } + else if (_evas_textblock_cursor_is_at_the_end(cur) && + evas_textblock_cursor_format_is_visible_get(&cur2)) + { + _find_layout_format_item_line_match(cur->obj, + _evas_textblock_node_visible_at_pos_get( + _evas_textblock_cursor_node_format_at_pos_get(&cur2)), + &ln, &fi); + } else { _find_layout_item_line_match(cur->obj, cur->node, cur->pos, &ln, &it); |
From: Enlightenment S. <no-...@en...> - 2010-08-29 12:16:40
|
Log: Evas textblock: fixed breakages of paragraph direction when merging/splitting text nodes. Author: tasn Date: 2010-08-29 05:16:32 -0700 (Sun, 29 Aug 2010) New Revision: 51723 Modified: trunk/evas/src/lib/canvas/evas_object_textblock.c Modified: trunk/evas/src/lib/canvas/evas_object_textblock.c =================================================================== --- trunk/evas/src/lib/canvas/evas_object_textblock.c 2010-08-29 10:59:26 UTC (rev 51722) +++ trunk/evas/src/lib/canvas/evas_object_textblock.c 2010-08-29 12:16:32 UTC (rev 51723) @@ -4065,6 +4065,12 @@ text = eina_ustrbuf_string_get(from->unicode); len = eina_ustrbuf_length_get(from->unicode); eina_ustrbuf_append_length(to->unicode, text, len); +#ifdef BIDI_SUPPORT + /* Reset paragraph direction */ + to->bidi_props.direction = EVAS_BIDI_PARAGRAPH_NATURAL; + evas_bidi_update_props(eina_ustrbuf_string_get(to->unicode), + &to->bidi_props); +#endif itr = from->format_node; if (itr && (itr->text_node == from)) @@ -5578,6 +5584,15 @@ len = eina_ustrbuf_length_get(cur->node->unicode) - start; eina_ustrbuf_append_length(n->unicode, text + start, len); eina_ustrbuf_remove(cur->node->unicode, start, start + len); +#ifdef BIDI_SUPPORT + /* Reset paragraph direction */ + n->bidi_props.direction = EVAS_BIDI_PARAGRAPH_NATURAL; + evas_bidi_update_props(eina_ustrbuf_string_get(n->unicode), + &n->bidi_props); + cur->node->bidi_props.direction = EVAS_BIDI_PARAGRAPH_NATURAL; + evas_bidi_update_props(eina_ustrbuf_string_get(cur->node->unicode), + &cur->node->bidi_props); +#endif } else { |
From: Enlightenment S. <no-...@en...> - 2010-08-30 11:27:46
|
Log: Evas textblock: Fixed @intrenal -> @internal in some docs. Author: tasn Date: 2010-08-30 04:27:39 -0700 (Mon, 30 Aug 2010) New Revision: 51746 Modified: trunk/evas/src/lib/canvas/evas_object_textblock.c Modified: trunk/evas/src/lib/canvas/evas_object_textblock.c =================================================================== --- trunk/evas/src/lib/canvas/evas_object_textblock.c 2010-08-30 10:57:45 UTC (rev 51745) +++ trunk/evas/src/lib/canvas/evas_object_textblock.c 2010-08-30 11:27:39 UTC (rev 51746) @@ -143,19 +143,19 @@ /* private struct for textblock object internal data */ /** - * @intrenal + * @internal * @typedef Evas_Object_Textblock * The actual textblock object. */ typedef struct _Evas_Object_Textblock Evas_Object_Textblock; /** - * @intrenal + * @internal * @typedef Evas_Object_Style_Tag * The structure used for finding style tags. */ typedef struct _Evas_Object_Style_Tag Evas_Object_Style_Tag; /** - * @intrenal + * @internal * @typedef Evas_Object_Textblock_Node_Text * A text node. */ @@ -166,31 +166,31 @@ */ /** - * @intrenal + * @internal * @typedef Evas_Object_Textblock_Paragraph * A layouting paragraph. */ typedef struct _Evas_Object_Textblock_Paragraph Evas_Object_Textblock_Paragraph; /** - * @intrenal + * @internal * @typedef Evas_Object_Textblock_Line * A layouting line. */ typedef struct _Evas_Object_Textblock_Line Evas_Object_Textblock_Line; /** - * @intrenal + * @internal * @typedef Evas_Object_Textblock_Item * A layouting item. */ typedef struct _Evas_Object_Textblock_Item Evas_Object_Textblock_Item; /** - * @intrenal + * @internal * @typedef Evas_Object_Textblock_Format_Item * A layouting format item. */ typedef struct _Evas_Object_Textblock_Format_Item Evas_Object_Textblock_Format_Item; /** - * @intrenal + * @internal * @typedef Evas_Object_Textblock_Format * A textblock format. */ @@ -198,7 +198,7 @@ /* the current state of the formatting */ /** - * @intrenal + * @internal * @def GET_PREV(text, ind) * Gets the index of the previous char in the text text, this simply returns * the current char pointed to and decrements ind but ensures it stays in @@ -206,7 +206,7 @@ */ #define GET_PREV(text, ind) (((ind) > 0) ? (text[(ind)--]) : (text[ind])) /** - * @intrenal + * @internal * @def GET_NEXT(text, ind) * Gets the index of the next in the text text, this simply returns * the current char pointed to and increments indd but ensures it stays in @@ -243,13 +243,13 @@ }; /** - * @intrenal + * @internal * @def _NODE_TEXT(x) * A convinience macro for casting to a text node. */ #define _NODE_TEXT(x) ((Evas_Object_Textblock_Node_Text *) (x)) /** - * @intrenal + * @internal * @def _NODE_FORMAT(x) * A convinience macro for casting to a format node. */ |
From: Enlightenment S. <no-...@en...> - 2010-09-01 08:25:25
|
Log: Evas textblock: Fixed updating BiDi properties when we delete. Author: tasn Date: 2010-09-01 01:25:19 -0700 (Wed, 01 Sep 2010) New Revision: 51801 Modified: trunk/evas/src/lib/canvas/evas_object_textblock.c Modified: trunk/evas/src/lib/canvas/evas_object_textblock.c =================================================================== --- trunk/evas/src/lib/canvas/evas_object_textblock.c 2010-09-01 08:23:15 UTC (rev 51800) +++ trunk/evas/src/lib/canvas/evas_object_textblock.c 2010-09-01 08:25:19 UTC (rev 51801) @@ -4065,12 +4065,6 @@ text = eina_ustrbuf_string_get(from->unicode); len = eina_ustrbuf_length_get(from->unicode); eina_ustrbuf_append_length(to->unicode, text, len); -#ifdef BIDI_SUPPORT - /* Reset paragraph direction */ - to->bidi_props.direction = EVAS_BIDI_PARAGRAPH_NATURAL; - evas_bidi_update_props(eina_ustrbuf_string_get(to->unicode), - &to->bidi_props); -#endif itr = from->format_node; if (itr && (itr->text_node == from)) @@ -6073,6 +6067,12 @@ { _evas_textblock_cursor_nodes_merge(cur); } +#ifdef BIDI_SUPPORT + /* Reset paragraph direction */ + n->bidi_props.direction = EVAS_BIDI_PARAGRAPH_NATURAL; + evas_bidi_update_props(eina_ustrbuf_string_get(n->unicode), + &n->bidi_props); +#endif if (cur->pos == eina_ustrbuf_length_get(n->unicode)) { @@ -6166,8 +6166,18 @@ if (should_merge) { + /* We call this function instead of the cursor one because we already + * updated the cursors */ _evas_textblock_nodes_merge(o, n1); } + +#ifdef BIDI_SUPPORT + /* Reset paragraph direction */ + n1->bidi_props.direction = EVAS_BIDI_PARAGRAPH_NATURAL; + evas_bidi_update_props(eina_ustrbuf_string_get(n1->unicode), + &n1->bidi_props); +#endif + evas_textblock_cursor_copy(cur1, cur2); evas_textblock_cursor_copy(cur1, o->cursor); _evas_textblock_changed(o, cur1->obj); |
From: Enlightenment S. <no-...@en...> - 2010-09-01 14:08:36
|
Log: Evas textblock: Fixed compilation without fribidi. Author: tasn Date: 2010-09-01 07:08:23 -0700 (Wed, 01 Sep 2010) New Revision: 51808 Modified: trunk/evas/src/lib/canvas/evas_object_textblock.c Modified: trunk/evas/src/lib/canvas/evas_object_textblock.c =================================================================== --- trunk/evas/src/lib/canvas/evas_object_textblock.c 2010-09-01 14:01:36 UTC (rev 51807) +++ trunk/evas/src/lib/canvas/evas_object_textblock.c 2010-09-01 14:08:23 UTC (rev 51808) @@ -5516,8 +5516,8 @@ n = calloc(1, sizeof(Evas_Object_Textblock_Node_Text)); n->unicode = eina_ustrbuf_new(); +#ifdef BIDI_SUPPORT n->bidi_props = evas_bidi_paragraph_props_new(); -#ifdef BIDI_SUPPORT n->bidi_props->direction = EVAS_BIDI_PARAGRAPH_NATURAL; #endif |
From: Enlightenment S. <no-...@en...> - 2010-09-01 14:27:03
|
Log: Evas textblock: Fixed compilation without fribidi. <-- For real now. :P Author: tasn Date: 2010-09-01 07:26:55 -0700 (Wed, 01 Sep 2010) New Revision: 51809 Modified: trunk/evas/src/lib/canvas/evas_object_text.c trunk/evas/src/lib/canvas/evas_object_textblock.c Modified: trunk/evas/src/lib/canvas/evas_object_text.c =================================================================== --- trunk/evas/src/lib/canvas/evas_object_text.c 2010-09-01 14:08:23 UTC (rev 51808) +++ trunk/evas/src/lib/canvas/evas_object_text.c 2010-09-01 14:26:55 UTC (rev 51809) @@ -1457,7 +1457,9 @@ o = calloc(1, sizeof(Evas_Object_Text)); o->magic = MAGIC_OBJ_TEXT; o->prev = o->cur; +#ifdef BIDI_SUPPORT o->cur.intl_props.props = evas_bidi_paragraph_props_new(); +#endif return o; } @@ -1477,7 +1479,9 @@ if (o->cur.font) eina_stringshare_del(o->cur.font); if (o->cur.source) eina_stringshare_del(o->cur.source); if (o->engine_data) evas_font_free(obj->layer->evas, o->engine_data); +#ifdef BIDI_SUPPORT evas_bidi_props_clean(&o->cur.intl_props); +#endif o->magic = 0; free(o); } Modified: trunk/evas/src/lib/canvas/evas_object_textblock.c =================================================================== --- trunk/evas/src/lib/canvas/evas_object_textblock.c 2010-09-01 14:08:23 UTC (rev 51808) +++ trunk/evas/src/lib/canvas/evas_object_textblock.c 2010-09-01 14:26:55 UTC (rev 51809) @@ -5498,8 +5498,10 @@ eina_ustrbuf_free(n->unicode); if (n->utf8) free(n->utf8); +#ifdef BIDI_SUPPORT if (&n->bidi_props) evas_bidi_paragraph_props_unref(n->bidi_props); +#endif free(n); } |
From: Enlightenment S. <no-...@en...> - 2010-09-02 12:01:30
|
Log: Evas textblock: width should remain the same no matter what's the position, removed that unwanted adjustment. Author: tasn Date: 2010-09-02 05:01:23 -0700 (Thu, 02 Sep 2010) New Revision: 51838 Modified: trunk/evas/src/lib/canvas/evas_object_textblock.c Modified: trunk/evas/src/lib/canvas/evas_object_textblock.c =================================================================== --- trunk/evas/src/lib/canvas/evas_object_textblock.c 2010-09-02 11:57:52 UTC (rev 51837) +++ trunk/evas/src/lib/canvas/evas_object_textblock.c 2010-09-02 12:01:23 UTC (rev 51838) @@ -6570,7 +6570,6 @@ x += ln->x + it->x - it->inset; if (x < ln->x) { - w -= (ln->x - x); x = ln->x; } y = ln->y; |
From: Enlightenment S. <no-...@en...> - 2010-09-02 13:53:22
|
Log: Evas textblock: Fixed char coord set to work better. Author: tasn Date: 2010-09-02 06:53:14 -0700 (Thu, 02 Sep 2010) New Revision: 51842 Modified: trunk/evas/src/lib/canvas/evas_object_textblock.c Modified: trunk/evas/src/lib/canvas/evas_object_textblock.c =================================================================== --- trunk/evas/src/lib/canvas/evas_object_textblock.c 2010-09-02 13:52:14 UTC (rev 51841) +++ trunk/evas/src/lib/canvas/evas_object_textblock.c 2010-09-02 13:53:14 UTC (rev 51842) @@ -6748,9 +6748,17 @@ if (it_break) { it = it_break; + cur->node = it->source_node; cur->pos = it->source_pos; - cur->node = it->source_node; + /*FIXME: needs smarter handling, ATM just check, if it's + * the first item, then go to the end of the line, helps + * with rtl langs, doesn't affect ltr langs that much. */ + if (!EINA_INLIST_GET(it)->prev) + { + evas_textblock_cursor_line_char_last(cur); + } + return EINA_TRUE; } } |
From: Enlightenment S. <no-...@en...> - 2010-09-05 07:05:12
|
Log: Evas textblock: Fixed documentation typos. Patch by Jihoon Kim. Author: tasn Date: 2010-09-05 00:04:59 -0700 (Sun, 05 Sep 2010) New Revision: 51896 Modified: trunk/evas/src/lib/canvas/evas_object_textblock.c Modified: trunk/evas/src/lib/canvas/evas_object_textblock.c =================================================================== --- trunk/evas/src/lib/canvas/evas_object_textblock.c 2010-09-05 06:11:50 UTC (rev 51895) +++ trunk/evas/src/lib/canvas/evas_object_textblock.c 2010-09-05 07:04:59 UTC (rev 51896) @@ -4507,7 +4507,7 @@ } /** - * Advances to the the end of the next text node + * Advances to the the end of the previous text node * * @param cur the cursor to update * @return #EINA_TRUE if it managed to advance a paragraph, #EINA_FALSE otherwise. @@ -7017,7 +7017,7 @@ * the textblock to the current size of the object. * The main difference between this and @ref evas_object_textblock_size_native_get * is that the "native" function does not wrapping into account - * it just calculates the real wdith of the objcet if it was placed on an + * it just calculates the real width of the object if it was placed on an * infinite canvas, while this function gives the size after wrapping * according to the size restrictions of the object. * @@ -7047,7 +7047,7 @@ * the current size of the object. * The main difference between this and @ref evas_object_textblock_size_formatted_get * is that the "native" function does not take wrapping into account - * it just calculates the real wdith of the objcet if it was placed on an + * it just calculates the real width of the object if it was placed on an * infinite canvas, while the "formatted" function gives the size after * wrapping text according to the size restrictions of the object. * |
From: Enlightenment S. <no-...@en...> - 2010-09-06 12:19:23
|
Log: Evas textblock: Update bidi props also when merging nodes and when deleting formats. Author: tasn Date: 2010-09-06 05:19:17 -0700 (Mon, 06 Sep 2010) New Revision: 51922 Modified: trunk/evas/src/lib/canvas/evas_object_textblock.c Modified: trunk/evas/src/lib/canvas/evas_object_textblock.c =================================================================== --- trunk/evas/src/lib/canvas/evas_object_textblock.c 2010-09-06 10:54:52 UTC (rev 51921) +++ trunk/evas/src/lib/canvas/evas_object_textblock.c 2010-09-06 12:19:17 UTC (rev 51922) @@ -4090,6 +4090,11 @@ { to->format_node = from->format_node; } +#ifdef BIDI_SUPPORT + evas_bidi_paragraph_props_unref(to->bidi_props); + to->bidi_props = evas_bidi_paragraph_props_get( + eina_ustrbuf_string_get(to->unicode)); +#endif _evas_textblock_cursors_set_node(o, from, to); _evas_textblock_node_text_remove(o, from); @@ -5975,11 +5980,20 @@ /* Advance all the cursors after our cursor */ _evas_textblock_cursors_update_offset(cur, cur->node, cur->pos, 1); - } - if (_IS_PARAGRAPH_SEPARATOR(format)) - { - _evas_textblock_cursor_break_paragraph(cur, n); + if (_IS_PARAGRAPH_SEPARATOR(format)) + { + _evas_textblock_cursor_break_paragraph(cur, n); + } + else + { +#ifdef BIDI_SUPPORT + evas_bidi_paragraph_props_unref(cur->node->bidi_props); + cur->node->bidi_props = evas_bidi_paragraph_props_get( + eina_ustrbuf_string_get(cur->node->unicode)); +#endif + } + } _evas_textblock_changed(o, cur->obj); |
From: Enlightenment S. <no-...@en...> - 2010-09-08 07:54:07
|
Log: Evas textblock: Fixed a typo. Author: tasn Date: 2010-09-08 00:54:00 -0700 (Wed, 08 Sep 2010) New Revision: 51981 Modified: trunk/evas/src/lib/canvas/evas_object_textblock.c Modified: trunk/evas/src/lib/canvas/evas_object_textblock.c =================================================================== --- trunk/evas/src/lib/canvas/evas_object_textblock.c 2010-09-08 07:29:00 UTC (rev 51980) +++ trunk/evas/src/lib/canvas/evas_object_textblock.c 2010-09-08 07:54:00 UTC (rev 51981) @@ -2357,7 +2357,7 @@ /* append new_it */ tw = th = 0; if (new_it->format->font.font) - c->ENFN->font_string_size_get(c->ENDT, new_it->format->font.font, new_it->text, &it->bidi_props, &tw, &th); + c->ENFN->font_string_size_get(c->ENDT, new_it->format->font.font, new_it->text, &new_it->bidi_props, &tw, &th); new_it->w = tw; new_it->h = th; inset = 0; |