mirror of
https://github.com/lvgl/lvgl.git
synced 2026-05-31 16:27:03 +08:00
bidi: txt_sel fixes
This commit is contained in:
+15
-18
@@ -113,23 +113,6 @@ void lv_draw_label(const lv_area_t * coords, const lv_area_t * mask, const lv_st
|
|||||||
pos.y += hint->y;
|
pos.y += hint->y;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(sel_start != 0xFFFF) {
|
|
||||||
sel_start = lv_bidi_get_visual_pos(txt, NULL, strlen(txt), bidi_dir, sel_start, NULL);
|
|
||||||
sel_start = lv_txt_encoded_get_byte_id(txt, sel_start);
|
|
||||||
}
|
|
||||||
|
|
||||||
if(sel_end != 0xFFFF) {
|
|
||||||
sel_end = lv_bidi_get_visual_pos(txt, NULL, strlen(txt), bidi_dir, sel_end, NULL);
|
|
||||||
sel_end = lv_txt_encoded_get_byte_id(txt, sel_end);
|
|
||||||
}
|
|
||||||
|
|
||||||
if(sel_start > sel_end) {
|
|
||||||
uint16_t tmp = sel_start;
|
|
||||||
sel_start = sel_end;
|
|
||||||
sel_end = tmp;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
uint32_t line_end = line_start + lv_txt_get_next_line(&txt[line_start], font, style->text.letter_space, w, flag);
|
uint32_t line_end = line_start + lv_txt_get_next_line(&txt[line_start], font, style->text.letter_space, w, flag);
|
||||||
|
|
||||||
@@ -165,6 +148,12 @@ void lv_draw_label(const lv_area_t * coords, const lv_area_t * mask, const lv_st
|
|||||||
|
|
||||||
lv_opa_t opa = opa_scale == LV_OPA_COVER ? style->text.opa : (uint16_t)((uint16_t)style->text.opa * opa_scale) >> 8;
|
lv_opa_t opa = opa_scale == LV_OPA_COVER ? style->text.opa : (uint16_t)((uint16_t)style->text.opa * opa_scale) >> 8;
|
||||||
|
|
||||||
|
if(sel_start > sel_end) {
|
||||||
|
uint16_t tmp = sel_start;
|
||||||
|
sel_start = sel_end;
|
||||||
|
sel_end = tmp;
|
||||||
|
}
|
||||||
|
|
||||||
cmd_state_t cmd_state = CMD_STATE_WAIT;
|
cmd_state_t cmd_state = CMD_STATE_WAIT;
|
||||||
uint32_t i;
|
uint32_t i;
|
||||||
uint16_t par_start = 0;
|
uint16_t par_start = 0;
|
||||||
@@ -190,11 +179,19 @@ void lv_draw_label(const lv_area_t * coords, const lv_area_t * mask, const lv_st
|
|||||||
#else
|
#else
|
||||||
const char *bidi_txt = txt + line_start;
|
const char *bidi_txt = txt + line_start;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
while(i < line_end - line_start) {
|
while(i < line_end - line_start) {
|
||||||
|
uint16_t logical_char_pos = 0;
|
||||||
|
if(sel_start != 0xFFFF && sel_end != 0xFFFF) {
|
||||||
|
logical_char_pos = lv_txt_encoded_get_char_id(txt, line_start);
|
||||||
|
uint16_t t = lv_txt_encoded_get_char_id(bidi_txt, i);
|
||||||
|
logical_char_pos += lv_bidi_get_logical_pos(bidi_txt, NULL, line_end - line_start, bidi_dir, t, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
letter = lv_txt_encoded_next(bidi_txt, &i);
|
letter = lv_txt_encoded_next(bidi_txt, &i);
|
||||||
letter_next = lv_txt_encoded_next(&bidi_txt[i], NULL);
|
letter_next = lv_txt_encoded_next(&bidi_txt[i], NULL);
|
||||||
|
|
||||||
|
|
||||||
/*Handle the re-color command*/
|
/*Handle the re-color command*/
|
||||||
if((flag & LV_TXT_FLAG_RECOLOR) != 0) {
|
if((flag & LV_TXT_FLAG_RECOLOR) != 0) {
|
||||||
if(letter == (uint32_t)LV_TXT_COLOR_CMD[0]) {
|
if(letter == (uint32_t)LV_TXT_COLOR_CMD[0]) {
|
||||||
@@ -240,7 +237,7 @@ void lv_draw_label(const lv_area_t * coords, const lv_area_t * mask, const lv_st
|
|||||||
|
|
||||||
if(sel_start != 0xFFFF && sel_end != 0xFFFF) {
|
if(sel_start != 0xFFFF && sel_end != 0xFFFF) {
|
||||||
/*Do not draw the rectangle on the character at `sel_start`.*/
|
/*Do not draw the rectangle on the character at `sel_start`.*/
|
||||||
if(i + line_start > sel_start && i + line_start <= sel_end) {
|
if(logical_char_pos > sel_start && logical_char_pos <= sel_end) {
|
||||||
lv_area_t sel_coords;
|
lv_area_t sel_coords;
|
||||||
sel_coords.x1 = pos.x;
|
sel_coords.x1 = pos.x;
|
||||||
sel_coords.y1 = pos.y;
|
sel_coords.y1 = pos.y;
|
||||||
|
|||||||
Reference in New Issue
Block a user