From e56259e8766ea097e4f2b841584e2f6b20534464 Mon Sep 17 00:00:00 2001 From: TheJackiMonster Date: Sat, 21 May 2022 15:34:22 +0200 Subject: Implemented text input for own messages Signed-off-by: TheJackiMonster --- src/ui/account_create_dialog.c | 2 +- src/ui/chat_open_dialog.c | 2 +- src/ui/messages.c | 79 ++++++++++++++++++++++++++++++++++++++++-- src/ui/messages.h | 6 ++++ 4 files changed, 85 insertions(+), 4 deletions(-) diff --git a/src/ui/account_create_dialog.c b/src/ui/account_create_dialog.c index 70e3fe3..b283092 100644 --- a/src/ui/account_create_dialog.c +++ b/src/ui/account_create_dialog.c @@ -83,7 +83,7 @@ account_create_dialog_event(UI_ACCOUNT_CREATE_DIALOG_Handle *create_dialog, } default: { - if (!isalnum(key)) + if (!isprint(key)) break; for (int i = create_dialog->name_len - 1; i >= create_dialog->name_pos; i--) diff --git a/src/ui/chat_open_dialog.c b/src/ui/chat_open_dialog.c index 4ebe8be..180d7be 100644 --- a/src/ui/chat_open_dialog.c +++ b/src/ui/chat_open_dialog.c @@ -83,7 +83,7 @@ chat_open_dialog_event(UI_CHAT_OPEN_DIALOG_Handle *open_dialog, } default: { - if (!isalnum(key)) + if (!isprint(key)) break; for (int i = open_dialog->topic_len - 1; i >= open_dialog->topic_pos; i--) diff --git a/src/ui/messages.c b/src/ui/messages.c index 79a7cab..4b7520a 100644 --- a/src/ui/messages.c +++ b/src/ui/messages.c @@ -47,7 +47,7 @@ messages_event(UI_MESSAGES_Handle *messages, messages->line_index = 0; messages->selected = NULL; - int count = 0; + int count = 1; UI_MESSAGES_List *element = messages->head; while (element) @@ -66,6 +66,16 @@ messages_event(UI_MESSAGES_Handle *messages, app->chat.context = NULL; break; } + case KEY_LEFT: + { + messages->text_pos--; + break; + } + case KEY_RIGHT: + { + messages->text_pos++; + break; + } case KEY_UP: { messages->line_selected--; @@ -78,19 +88,63 @@ messages_event(UI_MESSAGES_Handle *messages, } case '\n': case KEY_ENTER: + { + if ((!(messages->selected)) && (messages->text_len > 0)) + { + GNUNET_CHAT_context_send_text(app->chat.context, messages->text); + messages->text_len = 0; + } + break; + } + case KEY_BACKSPACE: { if (messages->selected) + { GNUNET_CHAT_message_delete( messages->selected, GNUNET_TIME_relative_get_zero_() ); + break; + } + + if ((messages->text_pos < messages->text_len) && + (messages->text_pos > 0)) + for (int i = messages->text_pos; i < messages->text_len; i++) + messages->text[i - 1] = messages->text[i]; + + if ((messages->text_pos > 0) && (messages->text_len > 0)) + { + messages->text_pos--; + messages->text_len--; + } break; } default: + { + if ((messages->selected) || (!isprint(key))) + break; + + for (int i = messages->text_len - 1; i >= messages->text_pos; i--) + messages->text[i + 1] = messages->text[i]; + + messages->text[messages->text_pos++] = (char) key; + messages->text_len++; break; + } } + if (messages->text_len >= TEXT_LEN_MAX) + messages->text_len = TEXT_LEN_MAX - 1; + + messages->text[messages->text_len] = '\0'; + + if (messages->text_pos < 0) + messages->text_pos = 0; + + if (messages->text_pos > messages->text_len) + messages->text_pos = messages->text_len; + if (messages->line_selected < 0) messages->line_selected = 0; else if (messages->line_selected >= count) @@ -125,7 +179,7 @@ _messages_iterate_print(UI_MESSAGES_Handle *messages, if (y < 0) return; - const int height = getmaxy(messages->window) - getbegy(messages->window); + const int height = getmaxy(messages->window) - getbegy(messages->window) - 2; if (y >= height) return; @@ -166,12 +220,33 @@ messages_print(UI_MESSAGES_Handle *messages) messages->line_index = 0; werase(messages->window); + int count = 0; + UI_MESSAGES_List *element = messages->head; while (element) { _messages_iterate_print(messages, element->message); element = element->next; + + count++; } + + const bool selected = (count == messages->line_selected); + + const int width = getmaxx(messages->window) - getbegx(messages->window); + const int height = getmaxy(messages->window) - getbegy(messages->window); + + wmove(messages->window, height - 2, 0); + whline(messages->window, '-', width); + + const int attrs_select = A_BOLD; + + if (selected) wattron(messages->window, attrs_select); + + wmove(messages->window, height - 1, 0); + wprintw(messages->window, "%s", messages->text); + + if (selected) wattroff(messages->window, attrs_select); } void diff --git a/src/ui/messages.h b/src/ui/messages.h index b42bb1b..06de97f 100644 --- a/src/ui/messages.h +++ b/src/ui/messages.h @@ -42,6 +42,8 @@ typedef struct UI_MESSAGES_List struct UI_MESSAGES_List *next; } UI_MESSAGES_List; +#define TEXT_LEN_MAX 1024 + typedef struct UI_MESSAGES_Handle { WINDOW *window; @@ -54,6 +56,10 @@ typedef struct UI_MESSAGES_Handle int line_selected; const struct GNUNET_CHAT_Message *selected; + + char text [1024]; + int text_len; + int text_pos; } UI_MESSAGES_Handle; void -- cgit v1.2.3