feat: improve MTK input boxes, right-click context menus

This commit is contained in:
2026-05-06 08:03:14 +02:00
parent f19e97966d
commit 8997164203
15 changed files with 1337 additions and 256 deletions
+41 -12
View File
@@ -83,6 +83,7 @@ static constexpr int READER_FONT_FACE_COUNT = (int)ReaderFontFace::COUNT;
static AppPhase g_phase = AppPhase::IDLE;
static char g_query[256] = {};
static mtk::TextInputState g_query_input = {};
static char g_status[256] = {};
static int g_scroll_y = 0;
static int g_line_count = 0;
@@ -959,8 +960,10 @@ static void render(Canvas& canvas) {
// ---- Toolbar ----
canvas.fill_rect(toolbar.x, toolbar.y, toolbar.w, toolbar.h, theme.surface_alt);
mtk::draw_text_field(canvas, lo.search_field, g_query, (int)strlen(g_query),
g_search_focused, false, theme);
mtk::draw_text_field(canvas, lo.search_field, g_query,
g_query_input.cursor,
g_search_focused, false, theme,
g_query_input.selection_anchor);
draw_display_toggle_button(canvas, lo.display_button,
mtk::widget_state(g_display_controls_open,
mouse_in_rect(lo.display_button), true),
@@ -1029,6 +1032,11 @@ static void render(Canvas& canvas) {
theme.radius_sm, thumb_color);
}
}
mtk::draw_text_input_context_menu(
canvas, g_query_input, theme,
mtk::text_input_has_selection(g_query_input,
g_query, (int)sizeof(g_query)));
}
// ============================================================================
@@ -1125,12 +1133,9 @@ extern "C" void _start() {
if (g_search_focused) {
if (ascii == '\n' || ascii == '\r') {
search_pending = true;
} else if (ascii == '\b' || scan == 0x0E) {
int len = (int)strlen(g_query);
if (len > 0) g_query[len - 1] = '\0';
} else if (ascii >= 32 && ascii < 127) {
int len = (int)strlen(g_query);
if (len < 254) { g_query[len] = ascii; g_query[len + 1] = '\0'; }
} else {
mtk::text_input_key(g_query_input, g_query,
(int)sizeof(g_query), ev.key);
}
} else if (g_phase == AppPhase::DONE) {
// Navigation keys
@@ -1151,12 +1156,26 @@ extern "C" void _start() {
g_mouse_y = my;
bool left_down = (ev.mouse.buttons & 1) != 0;
bool just_clicked = (ev.mouse.buttons & 1) && !(ev.mouse.prev_buttons & 1);
bool just_right_clicked = (ev.mouse.buttons & 2) && !(ev.mouse.prev_buttons & 2);
bool just_released = !(ev.mouse.buttons & 1) && (ev.mouse.prev_buttons & 1);
ReaderToolbarLayout lo = toolbar_layout();
Rect scrollbar_track = scrollbar_track_rect();
Rect scrollbar_thumb = scrollbar_thumb_rect();
if (g_query_input.context.open || g_query_input.dragging) {
int result = mtk::text_input_handle_mouse(g_query_input, lo.search_field,
g_query, (int)sizeof(g_query),
mx, my, ev.mouse.buttons,
ev.mouse.prev_buttons,
g_win_w, g_win_h,
g_search_focused);
if (result & mtk::TEXT_INPUT_CONSUMED) {
just_clicked = false;
just_right_clicked = false;
}
}
if (just_released) {
g_scroll_dragging = false;
}
@@ -1165,23 +1184,33 @@ extern "C" void _start() {
set_scroll_from_thumb_top(my - g_scroll_drag_offset);
}
if (just_clicked) {
g_search_focused = lo.search_field.contains(mx, my);
if (scrollbar_thumb.contains(mx, my)) {
if (just_clicked || just_right_clicked) {
if (lo.search_field.contains(mx, my)) {
g_search_focused = true;
mtk::text_input_handle_mouse(g_query_input, lo.search_field,
g_query, (int)sizeof(g_query),
mx, my, ev.mouse.buttons, ev.mouse.prev_buttons,
g_win_w, g_win_h, true);
} else if (scrollbar_thumb.contains(mx, my)) {
g_search_focused = false;
g_scroll_dragging = true;
g_scroll_drag_offset = my - scrollbar_thumb.y;
} else if (scrollbar_track.contains(mx, my)) {
g_search_focused = false;
g_scroll_dragging = true;
g_scroll_drag_offset = scrollbar_thumb.h / 2;
set_scroll_from_thumb_top(my - g_scroll_drag_offset);
} else if (lo.display_button.contains(mx, my)) {
g_search_focused = false;
g_display_controls_open = !g_display_controls_open;
update_toolbar_height();
rebuild_article(true);
clamp_scroll();
} else if (handle_reader_option_click(mx, my)) {
g_search_focused = false;
// Reader controls handled.
} else {
g_search_focused = false;
}
}