|
地板

楼主 |
发表于 2017-9-29 21:22:26
|
只看该作者
tintegrate在编辑状态时,要强制去掉“\r”,为什么?\r会占一个字符,会使得处理编辑框变得复杂。举个例子,backspace,1)光标在是下一行头处,在删除上一行的\n同时应该删除\r。2)光标在本行尾处,除了要删除前面那字符,还须要删除紧跟的\r。3)在Windows,SDL会保证复制到剪贴板内容都含有\r。
tintegrate内部会把src解析到items_(std::list<titem>),以下是产生items_的逻辑。
一、不断枚举字符,一直到超过了max_width或遇到标签,之前遍历的内容形成一个titem。
二、继续步骤一,直到枚举到完所有字符。
三、最后个字符是“\n”,会出一个额外的titem,该item的src_size是0,pos是src_长度,text是空。
如何区分一个titem是本身有换行符产生的,还是由自动换行产生的?last_row_指示该行已经解析出的titem,当遇到“\n”,此时它是empty意味着该“\n”是该行第一个titem。
get_first_word:返回字符串的第一个单词。对英文:单词间已空隔分开,对中文测是一个汉字。
makeup_pos、pos、text、src_size
text。字符串缓存。不管是max_width导致的换行还是内容有换行符导致的换行,text末尾都不包括那个换行符。为不什么不包括?——省空间。
markup_pos。此个item在源字符串中的偏移。
pos。此个item的text部分在源字符串中的偏移。
src_size。只有编辑状态时才会生成。1)是text类型的titem时,此个item在源字符串中对应的字符数(包括后面的“\n”)。
markup_pos src_size
0, 43
43, 52
95, 47
142, 3
145, 38
183, 52
235, 37
272, 3
275, 2
277, 44
item[n+1].markup_pos = item[n].markup_pos + item[n].src_size
假设M是最后项,那item[M].markup_pos + item[M].src_size = src.size()
对src_size,重点注意它对应的是源字符串,不会增、减源字符串。所以可得出这么些结论,1)因为超过max_width导致的换行,src_size不会计入那个换行符,原因是这换行符原字符串是没有的。2)当内容中有转义符时,src_size要累加转义符“\”,原因是源字符串中有“\”。
quote_require_escape:指示内容区出现“"”时是否要加转义符。
1、quote_require_escape=true的src_中,内容中的“"”前面要加转义符。内容不包括前后两个“"”。
2、操作编辑框,向quote_require_escape=true的titem插入字符时,补转义符的操作是tintegrate::insert_str执行,不是ttext_box层(目的是让ttext_box透明,ttext_box不知道此刻的titem中quote_require_escape是true还是false)。
3、app调用set_label时,字符串参数是需要转义符过的。
4、ttext_box调用insert_str时,要用tintegrate::insert_str的返回值,而不是根据原字符串+插入字符串自动计算。
5、密码框不允许出现markup。因而密码框不存在转义问题。
在titem内部,quote_require_escape和指示该titem是否是text类的markup是等价的。
|
|