Files
armorpaint/base/sources/ts/ui_menu.ts
T

147 lines
3.8 KiB
TypeScript
Raw Normal View History

2024-03-11 15:10:18 +01:00
let ui_menu_show: bool = false;
2025-08-08 14:08:39 +02:00
let ui_menu_nested: bool = false;
2024-03-11 15:10:18 +01:00
let ui_menu_x: i32 = 0;
let ui_menu_y: i32 = 0;
2024-09-11 16:32:12 +02:00
let ui_menu_h: i32 = 0;
2024-03-11 15:10:18 +01:00
let ui_menu_keep_open: bool = false;
2024-09-03 15:52:05 +02:00
let ui_menu_commands: (ui: ui_t)=>void = null;
2024-03-11 15:10:18 +01:00
let ui_menu_show_first: bool = true;
let ui_menu_hide_flag: bool = false;
2024-04-07 09:52:45 +02:00
let _ui_menu_render_msg: string;
2024-03-11 15:10:18 +01:00
function ui_menu_render() {
2024-09-03 15:52:05 +02:00
let ui: ui_t = base_ui_menu;
2024-09-11 16:32:12 +02:00
let menu_w: i32 = ui_menu_commands != null ?
math_floor(base_default_element_w * ui_SCALE(base_ui_menu) * 2.3) :
math_floor(ui_ELEMENT_W(ui) * 2.3);
let _FILL_BUTTON_BG: i32 = ui.ops.theme.FILL_BUTTON_BG;
ui.ops.theme.FILL_BUTTON_BG = false;
2024-04-10 19:39:17 +02:00
let _ELEMENT_OFFSET: i32 = ui.ops.theme.ELEMENT_OFFSET;
ui.ops.theme.ELEMENT_OFFSET = 0;
let _ELEMENT_H: i32 = ui.ops.theme.ELEMENT_H;
ui.ops.theme.ELEMENT_H = config_raw.touch_ui ? (28 + 2) : 28;
2024-03-11 15:10:18 +01:00
2025-08-08 14:08:39 +02:00
if (ui_menu_nested) {
ui_menu_show_first = true;
ui_menu_nested = false;
}
2024-09-11 16:32:12 +02:00
// First draw out of screen, then align the menu based on menu height
if (ui_menu_show_first) {
2025-03-09 17:02:12 +01:00
ui_menu_x -= iron_window_width() * 2;
ui_menu_y -= iron_window_height() * 2;
2024-09-11 16:32:12 +02:00
}
2025-06-21 16:49:53 +02:00
draw_begin();
2024-09-03 15:52:05 +02:00
ui_begin_region(ui, ui_menu_x, ui_menu_y, menu_w);
2024-09-11 16:32:12 +02:00
ui_menu_start(ui);
2024-03-11 15:10:18 +01:00
if (ui_menu_commands != null) {
ui_menu_commands(ui);
}
2024-05-03 21:29:39 +02:00
ui_menu_hide_flag = ui.combo_selected_handle == null && !ui_menu_keep_open && !ui_menu_show_first && (ui.changed || ui.input_released || ui.input_released_r || ui.is_escape_down);
2024-03-11 15:10:18 +01:00
ui_menu_keep_open = false;
2024-09-11 16:32:12 +02:00
ui.ops.theme.FILL_BUTTON_BG = _FILL_BUTTON_BG;
2024-04-10 19:39:17 +02:00
ui.ops.theme.ELEMENT_OFFSET = _ELEMENT_OFFSET;
ui.ops.theme.ELEMENT_H = _ELEMENT_H;
2024-09-11 16:32:12 +02:00
ui_menu_end(ui);
2024-09-03 15:52:05 +02:00
ui_end_region();
2025-06-21 16:49:53 +02:00
draw_end();
2024-03-11 15:10:18 +01:00
2024-09-11 16:32:12 +02:00
if (ui_menu_show_first) {
ui_menu_show_first = false;
ui_menu_h = ui._y - ui_menu_y;
2025-03-09 17:02:12 +01:00
ui_menu_x += iron_window_width() * 2;
ui_menu_y += iron_window_height() * 2;
2024-09-11 16:32:12 +02:00
ui_menu_fit_to_screen();
ui_menu_render(); // Render at correct position now
}
2024-03-11 15:10:18 +01:00
if (ui_menu_hide_flag) {
ui_menu_hide();
ui_menu_show_first = true;
ui_menu_commands = null;
}
}
function ui_menu_hide() {
ui_menu_show = false;
base_redraw_ui();
}
2024-09-11 16:32:12 +02:00
function ui_menu_draw(commands: (ui: ui_t)=>void = null, x: i32 = -1, y: i32 = -1) {
2024-09-03 15:52:05 +02:00
ui_end_input();
2025-08-08 14:08:39 +02:00
if (ui_menu_show) {
ui_menu_nested = true;
ui_menu_keep_open = true;
}
2024-03-11 15:10:18 +01:00
ui_menu_show = true;
ui_menu_commands = commands;
ui_menu_x = x > -1 ? x : math_floor(mouse_x + 1);
ui_menu_y = y > -1 ? y : math_floor(mouse_y + 1);
2024-09-11 16:32:12 +02:00
ui_menu_h = 0;
2024-03-11 15:10:18 +01:00
}
function ui_menu_fit_to_screen() {
// Prevent the menu going out of screen
2024-09-03 15:52:05 +02:00
let menu_w: f32 = base_default_element_w * ui_SCALE(base_ui_menu) * 2.3;
2025-03-09 17:02:12 +01:00
if (ui_menu_x + menu_w > iron_window_width()) {
2024-03-11 15:10:18 +01:00
if (ui_menu_x - menu_w > 0) {
ui_menu_x = math_floor(ui_menu_x - menu_w);
}
else {
2025-03-09 17:02:12 +01:00
ui_menu_x = math_floor(iron_window_width() - menu_w);
2024-03-11 15:10:18 +01:00
}
}
2025-03-09 17:02:12 +01:00
if (ui_menu_y + ui_menu_h > iron_window_height()) {
2024-09-11 16:32:12 +02:00
if (ui_menu_y - ui_menu_h > 0) {
ui_menu_y = math_floor(ui_menu_y - ui_menu_h);
2024-03-11 15:10:18 +01:00
}
else {
2025-03-09 17:02:12 +01:00
ui_menu_y = iron_window_height() - ui_menu_h;
2024-03-11 15:10:18 +01:00
}
ui_menu_x += 1; // Move out of mouse focus
}
}
2024-09-03 15:52:05 +02:00
function ui_menu_separator(ui: ui_t) {
2024-03-11 15:10:18 +01:00
ui._y++;
if (config_raw.touch_ui) {
2024-09-12 21:24:34 +02:00
ui_fill(0, 0, ui._w / ui_SCALE(ui), 1, ui.ops.theme.BUTTON_COL);
2024-03-11 15:10:18 +01:00
}
else {
2024-09-12 21:24:34 +02:00
ui_fill(26, 0, ui._w / ui_SCALE(ui) - 26, 1, ui.ops.theme.BUTTON_COL);
2024-03-11 15:10:18 +01:00
}
}
2025-02-26 08:47:09 +01:00
function ui_menu_button(text: string, label: string = ""): bool {
2024-03-11 15:10:18 +01:00
if (config_raw.touch_ui) {
label = "";
}
2024-09-03 15:52:05 +02:00
return ui_button(config_button_spacing + text, config_button_align, label);
2024-03-11 15:10:18 +01:00
}
2024-09-03 15:52:05 +02:00
function ui_menu_align(ui: ui_t) {
2024-03-11 15:10:18 +01:00
if (!config_raw.touch_ui) {
2024-04-25 22:04:43 +02:00
let row: f32[] = [12 / 100, 88 / 100];
2024-09-03 15:52:05 +02:00
ui_row(row);
_ui_end_element();
2024-03-11 15:10:18 +01:00
}
}
2024-09-03 15:52:05 +02:00
function ui_menu_start(ui: ui_t) {
2024-09-17 19:36:54 +02:00
ui_draw_shadow(ui._x, ui._y, ui._w, ui_menu_h);
2025-03-02 21:07:17 +01:00
draw_set_color(ui.ops.theme.SEPARATOR_COL);
2024-09-17 19:36:54 +02:00
ui_draw_rect(true, ui._x, ui._y, ui._w, ui_menu_h);
2025-03-02 21:07:17 +01:00
draw_set_color(0xffffffff);
2024-09-11 16:32:12 +02:00
}
function ui_menu_end(ui: ui_t) {
2024-03-11 15:10:18 +01:00
}