aboutsummaryrefslogtreecommitdiffstats
path: root/roms/u-boot-sam460ex/board/ACube/menu/string_edit.c
diff options
context:
space:
mode:
authorAngelos Mouzakitis <a.mouzakitis@virtualopensystems.com>2023-10-10 14:33:42 +0000
committerAngelos Mouzakitis <a.mouzakitis@virtualopensystems.com>2023-10-10 14:33:42 +0000
commitaf1a266670d040d2f4083ff309d732d648afba2a (patch)
tree2fc46203448ddcc6f81546d379abfaeb323575e9 /roms/u-boot-sam460ex/board/ACube/menu/string_edit.c
parente02cda008591317b1625707ff8e115a4841aa889 (diff)
Add submodule dependency filesHEADmaster
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.c177
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;
+}