mirror of
https://github.com/ratspeak/ratdeck.git
synced 2026-05-14 19:35:05 +00:00
07025bfa23
- Migrate all screens to LVGL v8.4 widget system - Non-blocking radio TX (async endPacket via LoRaInterface) - Live TCP server switching with transient node cleanup - Fix UI freeze during radio transmit - Trackball long-press delete, deferred click with debounce - Pin microReticulum to 392363c, fix list_directory API - Fix CI build: portable include path, remove hardcoded local path
80 lines
2.9 KiB
C++
80 lines
2.9 KiB
C++
#include "LvNameInputScreen.h"
|
|
#include "ui/Theme.h"
|
|
#include "ui/LvTheme.h"
|
|
#include "config/Config.h"
|
|
|
|
void LvNameInputScreen::createUI(lv_obj_t* parent) {
|
|
_screen = parent;
|
|
lv_obj_clear_flag(parent, LV_OBJ_FLAG_SCROLLABLE);
|
|
lv_obj_set_style_bg_color(parent, lv_color_hex(Theme::BG), 0);
|
|
|
|
// Title: "RATSPEAK"
|
|
lv_obj_t* title = lv_label_create(parent);
|
|
lv_obj_set_style_text_font(title, &lv_font_montserrat_16, 0);
|
|
lv_obj_set_style_text_color(title, lv_color_hex(Theme::PRIMARY), 0);
|
|
lv_label_set_text(title, "RATSPEAK");
|
|
lv_obj_align(title, LV_ALIGN_TOP_MID, 0, 20);
|
|
|
|
// Subtitle
|
|
lv_obj_t* sub = lv_label_create(parent);
|
|
lv_obj_set_style_text_font(sub, &lv_font_montserrat_12, 0);
|
|
lv_obj_set_style_text_color(sub, lv_color_hex(Theme::ACCENT), 0);
|
|
lv_label_set_text(sub, "ratspeak.org");
|
|
lv_obj_align(sub, LV_ALIGN_TOP_MID, 0, 42);
|
|
|
|
// Prompt
|
|
lv_obj_t* prompt = lv_label_create(parent);
|
|
lv_obj_set_style_text_font(prompt, &lv_font_montserrat_12, 0);
|
|
lv_obj_set_style_text_color(prompt, lv_color_hex(Theme::SECONDARY), 0);
|
|
lv_label_set_text(prompt, "Enter your display name:");
|
|
lv_obj_align(prompt, LV_ALIGN_TOP_MID, 0, 70);
|
|
|
|
// Text area
|
|
_textarea = lv_textarea_create(parent);
|
|
lv_obj_set_size(_textarea, 220, 36);
|
|
lv_obj_align(_textarea, LV_ALIGN_TOP_MID, 0, 95);
|
|
lv_textarea_set_max_length(_textarea, MAX_NAME_LEN);
|
|
lv_textarea_set_one_line(_textarea, true);
|
|
lv_textarea_set_placeholder_text(_textarea, "Name");
|
|
lv_obj_add_style(_textarea, LvTheme::styleTextarea(), 0);
|
|
lv_obj_set_style_text_font(_textarea, &lv_font_montserrat_14, 0);
|
|
|
|
// Hint
|
|
lv_obj_t* hint = lv_label_create(parent);
|
|
lv_obj_set_style_text_font(hint, &lv_font_montserrat_12, 0);
|
|
lv_obj_set_style_text_color(hint, lv_color_hex(Theme::ACCENT), 0);
|
|
lv_label_set_text(hint, "[Enter] OK");
|
|
lv_obj_align(hint, LV_ALIGN_TOP_MID, 0, 140);
|
|
|
|
// Version
|
|
lv_obj_t* ver = lv_label_create(parent);
|
|
lv_obj_set_style_text_font(ver, &lv_font_montserrat_10, 0);
|
|
lv_obj_set_style_text_color(ver, lv_color_hex(Theme::MUTED), 0);
|
|
char verBuf[32];
|
|
snprintf(verBuf, sizeof(verBuf), "v%s", RATDECK_VERSION_STRING);
|
|
lv_label_set_text(ver, verBuf);
|
|
lv_obj_align(ver, LV_ALIGN_BOTTOM_MID, 0, -10);
|
|
}
|
|
|
|
bool LvNameInputScreen::handleKey(const KeyEvent& event) {
|
|
if (!_textarea) return false;
|
|
|
|
if (event.enter || event.character == '\n' || event.character == '\r') {
|
|
const char* text = lv_textarea_get_text(_textarea);
|
|
if (text && strlen(text) > 0 && _doneCb) {
|
|
_doneCb(String(text));
|
|
}
|
|
return true;
|
|
}
|
|
if (event.del || event.character == 8) {
|
|
lv_textarea_del_char(_textarea);
|
|
return true;
|
|
}
|
|
if (event.character >= 0x20 && event.character <= 0x7E) {
|
|
char buf[2] = {event.character, 0};
|
|
lv_textarea_add_text(_textarea, buf);
|
|
return true;
|
|
}
|
|
return true; // Consume all keys
|
|
}
|