feat: improve MTK input boxes, right-click context menus
This commit is contained in:
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user