diff options
author | 2023-10-10 14:33:42 +0000 | |
---|---|---|
committer | 2023-10-10 14:33:42 +0000 | |
commit | af1a266670d040d2f4083ff309d732d648afba2a (patch) | |
tree | 2fc46203448ddcc6f81546d379abfaeb323575e9 /roms/u-boot-sam460ex/board/ACube/menu/string_edit.c | |
parent | e02cda008591317b1625707ff8e115a4841aa889 (diff) |
Change-Id: Iaf8d18082d3991dec7c0ebbea540f092188eb4ec
Diffstat (limited to 'roms/u-boot-sam460ex/board/ACube/menu/string_edit.c')
-rw-r--r-- | roms/u-boot-sam460ex/board/ACube/menu/string_edit.c | 177 |
1 files changed, 177 insertions, 0 deletions
diff --git a/roms/u-boot-sam460ex/board/ACube/menu/string_edit.c b/roms/u-boot-sam460ex/board/ACube/menu/string_edit.c new file mode 100644 index 000000000..64d53a019 --- /dev/null +++ b/roms/u-boot-sam460ex/board/ACube/menu/string_edit.c @@ -0,0 +1,177 @@ +#include "menu.h" +#include "string_edit.h" + +//static int num_lines = 0; +static int x_pos=0, y_pos=0; +static int width = 0, height = 0; +static int cursor_pos = 0; +static char *buffer; +static char *prompt; +static int buffer_length; +static char backup[1024]; + +#define STRINGBOX_WIDTH 70 +#define STRINGBOX_HEIGHT 4 +#define STRINGBOX_X 5 +#define STRINGBOX_Y 5 + +static void string_edit_draw(void) +{ + int + i,j, + length = buffer_length, + attr = MENUATTR_NORMAL; + + char + c; + + //int cursor_x = 0, cursor_y = 0; + + for (i=0; i<height; i++) + { + for (j=0; j<width; j++) + { + int + offset = j+i*width; + + if (offset > length) + c = ' '; + else + c = buffer[offset]; + + if (offset == cursor_pos) +#if 1 //def SIM + attr = MENUATTR_HILITE; + else + attr = MENUATTR_NORMAL; +#else + { + cursor_x = x_pos+j; + cursor_y = y_pos+i; + } +#endif + video_draw_text(x_pos + j, y_pos + i, attr, &c, 1); + } + } +#if 0 //ndef SIM + video_set_cursor(cursor_y, cursor_y); +#endif +} + +static void string_clear_frame(void) +{ + video_clear_box(STRINGBOX_X-2, STRINGBOX_Y-2, + STRINGBOX_WIDTH+4, STRINGBOX_HEIGHT+4, + ' ', MENUATTR_NORMAL); +} + +static void string_draw_frame(void) +{ + string_clear_frame(); + video_draw_box(SINGLE_BOX, MENUATTR_NORMAL, prompt, 0, + STRINGBOX_X-2, STRINGBOX_Y-2, + STRINGBOX_WIDTH+4, STRINGBOX_HEIGHT+4); +} + +static void backspace(void) +{ + int + i; + + char + *s; + + if (cursor_pos == 0) return; + if (cursor_pos == buffer_length) + { + buffer_length--; + cursor_pos--; + buffer[buffer_length] = 0; + } + else + { + s = buffer+cursor_pos-1; + for (i = 0; i < buffer_length - cursor_pos + 1; i++) + { + *s = *(s+1); + s++; + } + cursor_pos--; + buffer_length--; + } +} + +static void insert(int key) +{ + int + i; + + char + *s; + + s = buffer + buffer_length; + for (i = 0; i < buffer_length - cursor_pos + 1; i++) + { + *(s+1) = *s; + s--; + } + *(buffer + cursor_pos) = (char)key; + cursor_pos++; + buffer_length++; +} + +bool menu_string_edit(char *_prompt, char *string, int buffersize) +{ + int + key; + + prompt = _prompt; + x_pos = STRINGBOX_X; + y_pos = STRINGBOX_Y; + width = STRINGBOX_WIDTH; + height = STRINGBOX_HEIGHT; + + buffer = string; + strcpy(backup, string); + + buffer_length = cursor_pos = strlen(buffer); + + string_draw_frame(); + do + { + string_edit_draw(); + key = video_get_key(); + switch(key) + { + case KEY_ABORT: + strcpy(string, backup); + string_clear_frame(); + menu_draw_current_form(); + return false; + case KEY_ACTIVATE: + string_clear_frame(); + menu_draw_current_form(); + return true; + case KEY_NEXT_OPTION: + cursor_pos++; + if (cursor_pos > buffer_length) cursor_pos = buffer_length; + break; + case KEY_PREV_OPTION: + cursor_pos--; + if (cursor_pos < 0) cursor_pos = 0; + break; + case KEY_DELETE: + /* Backspace */ + backspace(); + break; + default: + if (key >= 32 && key <= 127) + { + insert(key); + } + break; + } + } while (1); + + return false; +} |