Skip to content

Commit

Permalink
fix(textarea) various cursor darwing fixes
Browse files Browse the repository at this point in the history
  • Loading branch information
kisvegabor committed Oct 12, 2021
1 parent d58cae5 commit 273a0eb
Show file tree
Hide file tree
Showing 3 changed files with 25 additions and 27 deletions.
9 changes: 1 addition & 8 deletions src/core/lv_obj_style.c
Expand Up @@ -365,7 +365,6 @@ _lv_style_state_cmp_t _lv_obj_style_state_compare(lv_obj_t * obj, lv_state_t sta
if(obj->styles[i].is_trans) continue;

lv_state_t state_act = lv_obj_style_get_selector_state(obj->styles[i].selector);
lv_part_t part_act = lv_obj_style_get_selector_part(obj->styles[i].selector);
/*The style is valid for a stat but not the other*/
bool valid1 = state_act & (~state1) ? false : true;
bool valid2 = state_act & (~state2) ? false : true;
Expand Down Expand Up @@ -394,13 +393,7 @@ _lv_style_state_cmp_t _lv_obj_style_state_compare(lv_obj_t * obj, lv_state_t sta
else if(lv_style_get_prop(style, LV_STYLE_TRANSFORM_ZOOM, &v)) layout_diff = true;

if(layout_diff) {
if(part_act == LV_PART_MAIN) {
return _LV_STYLE_STATE_CMP_DIFF_LAYOUT;
}
else {
res = _LV_STYLE_STATE_CMP_DIFF_DRAW_PAD;
continue;
}
return _LV_STYLE_STATE_CMP_DIFF_LAYOUT;
}

/*Check for draw pad changes*/
Expand Down
2 changes: 1 addition & 1 deletion src/extra/themes/default/lv_theme_default.c
Expand Up @@ -479,7 +479,7 @@ static void style_init(void)
style_init_reset(&styles->ta_cursor);
lv_style_set_border_color(&styles->ta_cursor, color_text);
lv_style_set_border_width(&styles->ta_cursor, lv_disp_dpx(theme.disp, 2));
lv_style_set_pad_left(&styles->ta_cursor, lv_disp_dpx(theme.disp, 1));
lv_style_set_pad_left(&styles->ta_cursor, - lv_disp_dpx(theme.disp, 1));
lv_style_set_border_side(&styles->ta_cursor, LV_BORDER_SIDE_LEFT);
lv_style_set_anim_time(&styles->ta_cursor, 400);

Expand Down
41 changes: 23 additions & 18 deletions src/widgets/lv_textarea.c
Expand Up @@ -398,16 +398,13 @@ void lv_textarea_set_cursor_pos(lv_obj_t * obj, int32_t pos)
ta->cursor.pos = pos;

/*Position the label to make the cursor visible*/
lv_obj_update_layout(obj);

lv_point_t cur_pos;
const lv_font_t * font = lv_obj_get_style_text_font(obj, LV_PART_MAIN);
lv_area_t label_cords;
lv_area_t ta_cords;
lv_label_get_letter_pos(ta->label, pos, &cur_pos);
lv_obj_get_coords(obj, &ta_cords);
lv_obj_get_coords(ta->label, &label_cords);

/*The text area needs to have it's final size to see if the cursor is out of the area or not*/
lv_obj_update_layout(obj);

/*Check the top*/
lv_coord_t font_h = lv_font_get_line_height(font);
Expand Down Expand Up @@ -811,8 +808,8 @@ static void lv_textarea_constructor(const lv_obj_class_t * class_p, lv_obj_t * o
ta->accepted_chars = NULL;
ta->max_length = 0;
ta->cursor.show = 1;
ta->cursor.pos =
1; /*It will be set to zero later (with zero value lv_textarea_set_cursor_pos(obj, 0); woldn't do anything as there is no difference)*/
/*It will be set to zero later (with zero value lv_textarea_set_cursor_pos(obj, 0); woldn't do anything as there is no difference)*/
ta->cursor.pos = 1;
ta->cursor.click_pos = 1;
ta->cursor.valid_x = 0;
ta->one_line = 0;
Expand Down Expand Up @@ -1006,7 +1003,7 @@ static bool char_is_accepted(lv_obj_t * obj, uint32_t c)
lv_textarea_t * ta = (lv_textarea_t *)obj;

/*If no restriction accept it*/
if(ta->accepted_chars == NULL && ta->max_length == 0) return true;
if((ta->accepted_chars == NULL || ta->accepted_chars[0] == '\0') && ta->max_length == 0) return true;

/*Too many characters?*/
if(ta->max_length > 0 && _lv_txt_get_encoded_length(lv_textarea_get_text(obj)) >= ta->max_length) {
Expand Down Expand Up @@ -1106,10 +1103,11 @@ static void refr_cursor_area(lv_obj_t * obj)
ta->cursor.txt_byte_pos = byte_pos;

/*Calculate the cursor according to its type*/
lv_coord_t top = lv_obj_get_style_pad_top(obj, LV_PART_CURSOR);
lv_coord_t bottom = lv_obj_get_style_pad_bottom(obj, LV_PART_CURSOR);
lv_coord_t left = lv_obj_get_style_pad_left(obj, LV_PART_CURSOR);
lv_coord_t right = lv_obj_get_style_pad_right(obj, LV_PART_CURSOR);
lv_coord_t border_width = lv_obj_get_style_border_width(obj, LV_PART_CURSOR);
lv_coord_t top = lv_obj_get_style_pad_top(obj, LV_PART_CURSOR) + border_width;
lv_coord_t bottom = lv_obj_get_style_pad_bottom(obj, LV_PART_CURSOR) + border_width;
lv_coord_t left = lv_obj_get_style_pad_left(obj, LV_PART_CURSOR) + border_width;
lv_coord_t right = lv_obj_get_style_pad_right(obj, LV_PART_CURSOR) + border_width;

lv_area_t cur_area;
cur_area.x1 = letter_pos.x - left;
Expand Down Expand Up @@ -1311,26 +1309,33 @@ static void draw_cursor(lv_event_t * e)
lv_area_t cur_area;
lv_area_copy(&cur_area, &ta->cursor.area);


cur_area.x1 += ta->label->coords.x1;
cur_area.y1 += ta->label->coords.y1;
cur_area.x2 += ta->label->coords.x1;
cur_area.y2 += ta->label->coords.y1;

lv_draw_rect(&cur_area, clip_area, &cur_dsc);

lv_coord_t border_width = lv_obj_get_style_border_width(obj, LV_PART_CURSOR);
lv_coord_t left = lv_obj_get_style_pad_left(obj, LV_PART_CURSOR) + border_width;
lv_coord_t top = lv_obj_get_style_pad_top(obj, LV_PART_CURSOR) + border_width;
char letter_buf[8] = {0};
lv_memcpy(letter_buf, &txt[ta->cursor.txt_byte_pos], _lv_txt_encoded_size(&txt[ta->cursor.txt_byte_pos]));

lv_coord_t left = lv_obj_get_style_pad_left(obj, LV_PART_CURSOR);
lv_coord_t top = lv_obj_get_style_pad_top(obj, LV_PART_CURSOR);
lv_coord_t border_width = lv_obj_get_style_border_width(obj, LV_PART_CURSOR);
cur_area.x1 += left + border_width;
cur_area.y1 += top + border_width;
cur_area.x1 += left;
cur_area.y1 += top;

/*Draw the letter over the cursor only if
*the cursor has background or the letter has different color than the original.
*Else the original letter is drawn twice which makes it look bolder*/
lv_color_t label_color = lv_obj_get_style_text_color(ta->label, 0);
lv_draw_label_dsc_t cur_label_dsc;
lv_draw_label_dsc_init(&cur_label_dsc);
lv_obj_init_draw_label_dsc(obj, LV_PART_CURSOR, &cur_label_dsc);
lv_draw_label(&cur_area, clip_area, &cur_label_dsc, letter_buf, NULL);
if(cur_dsc.bg_opa > LV_OPA_MIN || cur_label_dsc.color.full != label_color.full) {
lv_draw_label(&cur_area, clip_area, &cur_label_dsc, letter_buf, NULL);
}
}

#endif

0 comments on commit 273a0eb

Please sign in to comment.