Skip to content

Commit 8057a71

Browse files
committed
GUI: Add selection by keyboard.
1 parent 8e82a10 commit 8057a71

File tree

2 files changed

+99
-1
lines changed

2 files changed

+99
-1
lines changed

plugins/gui/lvgl_static/src/drivers/sdl/lv_sdl_keyboard.c

+29-1
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,7 @@ static void release_indev_cb(lv_event_t * e)
9898
}
9999
}
100100
int lv_sdl_keyboard_ctrl_pressed = 0;
101+
int lv_sdl_keyboard_shift_pressed = 0;
101102

102103
void lv_sdl_keyboard_handler(SDL_Event * event)
103104
{
@@ -106,6 +107,9 @@ void lv_sdl_keyboard_handler(SDL_Event * event)
106107
case SDL_KEYDOWN:
107108
win_id = event->key.windowID;
108109
break;
110+
case SDL_KEYUP:
111+
win_id = event->key.windowID;
112+
break;
109113
case SDL_TEXTINPUT:
110114
win_id = event->text.windowID;
111115
break;
@@ -131,11 +135,21 @@ void lv_sdl_keyboard_handler(SDL_Event * event)
131135
/* We only care about SDL_KEYDOWN and SDL_TEXTINPUT events */
132136
switch(event->type) {
133137
case SDL_KEYUP: {
134-
if ( event->key.keysym.sym == SDLK_LCTRL ) {
138+
if ( event->key.keysym.sym == SDLK_LCTRL ) {
135139
lv_sdl_keyboard_ctrl_pressed = 0;
136140
}
141+
else if ( event->key.keysym.sym == SDLK_LSHIFT ) {
142+
lv_sdl_keyboard_shift_pressed = 0;
143+
return;
144+
}
145+
else {
146+
return;
147+
}
137148
}
138149
case SDL_KEYDOWN: { /*Button press*/
150+
if ( event->key.keysym.sym == SDLK_LSHIFT ) {
151+
lv_sdl_keyboard_shift_pressed = 1;
152+
}
139153
if ( event->key.keysym.sym == SDLK_LCTRL ) {
140154
lv_sdl_keyboard_ctrl_pressed = 1;
141155
}
@@ -183,6 +197,20 @@ static uint32_t keycode_to_ctrl_key(SDL_Keycode sdl_key)
183197
return LV_KEY_SELECT_ALL;
184198
}
185199
}
200+
201+
if (lv_sdl_keyboard_shift_pressed) {
202+
switch(sdl_key) {
203+
case SDLK_RIGHT:
204+
return LV_KEY_SELECT_RIGHT;
205+
case SDLK_LEFT:
206+
return LV_KEY_SELECT_LEFT;
207+
case SDLK_UP:
208+
return LV_KEY_SELECT_UP;
209+
case SDLK_DOWN:
210+
return LV_KEY_SELECT_DOWN;
211+
}
212+
}
213+
186214
/*Remap some key to LV_KEY_... to manage groups*/
187215
switch(sdl_key) {
188216
case SDLK_RIGHT:

plugins/gui/lvgl_static/src/widgets/textarea/lv_textarea.c

+70
Original file line numberDiff line numberDiff line change
@@ -854,6 +854,44 @@ void lv_textarea_selection_all(lv_obj_t * obj) {
854854
#endif
855855
}
856856

857+
void lv_textarea_selection_start(lv_obj_t * obj) {
858+
LV_ASSERT_OBJ(obj, MY_CLASS);
859+
#if LV_LABEL_TEXT_SELECTION
860+
lv_textarea_t * ta = (lv_textarea_t *)obj;
861+
if (!ta->text_sel_in_prog) {
862+
lv_textarea_clear_selection(ta);
863+
lv_label_set_text_selection_start(ta->label, lv_textarea_get_cursor_pos(obj));
864+
ta->text_sel_in_prog = 1;
865+
}
866+
#else
867+
LV_UNUSED(obj); /*Unused*/
868+
#endif
869+
}
870+
871+
void lv_textarea_selection_stop(lv_obj_t * obj) {
872+
LV_ASSERT_OBJ(obj, MY_CLASS);
873+
#if LV_LABEL_TEXT_SELECTION
874+
lv_textarea_t * ta = (lv_textarea_t *)obj;
875+
if (ta->text_sel_in_prog) {
876+
ta->text_sel_in_prog = 0;
877+
}
878+
#else
879+
LV_UNUSED(obj); /*Unused*/
880+
#endif
881+
}
882+
883+
void lv_textarea_selection_continue(lv_obj_t * obj) {
884+
LV_ASSERT_OBJ(obj, MY_CLASS);
885+
#if LV_LABEL_TEXT_SELECTION
886+
lv_textarea_t * ta = (lv_textarea_t *)obj;
887+
if (ta->text_sel_in_prog) {
888+
lv_label_set_text_selection_end(ta->label, lv_textarea_get_cursor_pos(obj));
889+
}
890+
#else
891+
LV_UNUSED(obj); /*Unused*/
892+
#endif
893+
}
894+
857895
void lv_textarea_cursor_right(lv_obj_t * obj)
858896
{
859897
LV_ASSERT_OBJ(obj, MY_CLASS);
@@ -1001,13 +1039,45 @@ static void lv_textarea_event(const lv_obj_class_t * class_p, lv_event_t * e)
10011039
lv_event_code_t code = lv_event_get_code(e);
10021040
lv_obj_t * obj = lv_event_get_current_target(e);
10031041

1042+
if(code == LV_EVENT_KEY) {
1043+
uint32_t c = *((uint32_t *)lv_event_get_param(e)); /*uint32_t because can be UTF-8*/
1044+
if (
1045+
c != LV_KEY_SELECT_RIGHT &&
1046+
c != LV_KEY_SELECT_LEFT &&
1047+
c != LV_KEY_SELECT_UP &&
1048+
c != LV_KEY_SELECT_DOWN
1049+
) {
1050+
lv_textarea_selection_stop(obj);
1051+
}
1052+
}
1053+
10041054
if(code == LV_EVENT_FOCUSED) {
10051055
start_cursor_blink(obj);
10061056
}
10071057
else if(code == LV_EVENT_KEY) {
10081058
uint32_t c = *((uint32_t *)lv_event_get_param(e)); /*uint32_t because can be UTF-8*/
10091059
if (c == LV_KEY_SELECT_ALL)
10101060
lv_textarea_selection_all(obj);
1061+
else if (c == LV_KEY_SELECT_RIGHT) {
1062+
lv_textarea_selection_start(obj);
1063+
lv_textarea_cursor_right(obj);
1064+
lv_textarea_selection_continue(obj);
1065+
}
1066+
else if (c == LV_KEY_SELECT_LEFT) {
1067+
lv_textarea_selection_start(obj);
1068+
lv_textarea_cursor_left(obj);
1069+
lv_textarea_selection_continue(obj);
1070+
}
1071+
else if (c == LV_KEY_SELECT_UP) {
1072+
lv_textarea_selection_start(obj);
1073+
lv_textarea_cursor_up(obj);
1074+
lv_textarea_selection_continue(obj);
1075+
}
1076+
else if (c == LV_KEY_SELECT_DOWN) {
1077+
lv_textarea_selection_start(obj);
1078+
lv_textarea_cursor_down(obj);
1079+
lv_textarea_selection_continue(obj);
1080+
}
10111081
else if(c == LV_KEY_RIGHT)
10121082
lv_textarea_cursor_right(obj);
10131083
else if(c == LV_KEY_LEFT)

0 commit comments

Comments
 (0)