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

249 lines
7.8 KiB
TypeScript
Raw Normal View History

2024-03-11 15:10:18 +01:00
2024-11-07 18:15:01 +01:00
///if is_lab
let ui_toolbar_default_w: i32 = 0;
///else
2024-03-11 15:10:18 +01:00
let ui_toolbar_default_w: i32 = 36;
2024-11-07 18:15:01 +01:00
///end
2024-03-11 15:10:18 +01:00
2024-09-03 15:52:05 +02:00
let ui_toolbar_handle: ui_handle_t = ui_handle_create();
2024-03-11 15:10:18 +01:00
let ui_toolbar_last_tool: i32 = 0;
let ui_toolbar_tool_names: string[] = [
_tr("Brush"),
_tr("Eraser"),
_tr("Fill"),
_tr("Decal"),
_tr("Text"),
_tr("Clone"),
_tr("Blur"),
_tr("Smudge"),
_tr("Particle"),
_tr("ColorID"),
_tr("Picker"),
_tr("Bake"),
_tr("Gizmo"),
_tr("Material"),
];
2024-11-08 23:46:39 +01:00
let _ui_toolbar_i: i32;
2024-03-11 15:10:18 +01:00
function ui_toolbar_init() {
}
2025-06-19 19:55:16 +02:00
function ui_toolbar_draw_tool(i: i32, ui: ui_t, img: gpu_texture_t, icon_accent: i32, keys: string[]) {
2024-04-07 09:52:45 +02:00
ui._x += 2;
if (context_raw.tool == i) {
ui_toolbar_draw_highlight();
}
let tile_y: i32 = math_floor(i / 12);
let tile_x: i32 = tile_y % 2 == 0 ? i % 12 : (11 - (i % 12));
let rect: rect_t = resource_tile50(img, tile_x, tile_y);
let _y: i32 = ui._y;
2025-08-04 19:34:53 +02:00
let image_state: ui_state_t = ui_sub_image(img, icon_accent, -1.0, rect.x, rect.y, rect.w, rect.h);
2024-09-03 15:52:05 +02:00
if (image_state == ui_state_t.STARTED) {
2024-04-07 09:52:45 +02:00
_ui_toolbar_i = i;
2025-03-11 19:49:42 +01:00
sys_notify_on_next_frame(function() {
2024-04-07 09:52:45 +02:00
context_select_tool(_ui_toolbar_i);
});
}
2024-09-03 15:52:05 +02:00
else if (image_state == ui_state_t.RELEASED && config_raw.layout[layout_size_t.HEADER] == 0) {
2024-04-07 09:52:45 +02:00
if (ui_toolbar_last_tool == i) {
ui_toolbar_tool_properties_menu();
}
ui_toolbar_last_tool = i;
}
///if is_paint
2025-08-07 19:43:11 +02:00
if (i == tool_type_t.COLORID && context_raw.colorid_picked) {
2024-05-03 21:29:39 +02:00
let rt: render_target_t = map_get(render_path_render_targets, "texpaint_colorid");
2025-03-02 19:44:26 +01:00
draw_scaled_sub_image(rt._image, 0, 0, 1, 1, 0, _y + 1.5 * ui_SCALE(ui), 5 * ui_SCALE(ui), 34 * ui_SCALE(ui));
2024-04-07 09:52:45 +02:00
}
///end
if (ui.is_hovered) {
2024-09-03 15:52:05 +02:00
ui_tooltip(tr(ui_toolbar_tool_names[i]) + " " + keys[i]);
2024-04-07 09:52:45 +02:00
}
ui._x -= 2;
ui._y += 2;
}
2025-07-18 23:37:51 +02:00
function ui_toolbar_w(screen_size_request: bool = false): i32 {
if (screen_size_request && context_is_floating_toolbar()) {
return 0;
}
2024-03-11 15:10:18 +01:00
2025-01-09 15:47:57 +01:00
let w: i32 = 0;
2024-03-11 15:10:18 +01:00
if (config_raw.touch_ui) {
2025-01-09 15:47:57 +01:00
w = ui_toolbar_default_w + 6;
2024-03-11 15:10:18 +01:00
}
else {
2025-01-09 15:47:57 +01:00
w = ui_toolbar_default_w;
2024-03-11 15:10:18 +01:00
}
2025-07-18 23:37:51 +02:00
w = math_floor(w * config_raw.window_scale);
2025-01-09 15:47:57 +01:00
return w;
}
2025-07-18 23:37:51 +02:00
function ui_toolbar_x(): i32 {
2025-01-12 15:44:22 +01:00
let ui: ui_t = ui_base_ui;
return 5 * ui_SCALE(ui);
}
2025-01-09 15:47:57 +01:00
function ui_toolbar_render_ui() {
let ui: ui_t = ui_base_ui;
let x: i32 = 0;
let y: i32 = ui_header_h;
2025-03-09 17:02:12 +01:00
let h: i32 = iron_window_height() - ui_header_h;
2025-01-09 15:47:57 +01:00
let _WINDOW_BG_COL: i32 = ui.ops.theme.WINDOW_BG_COL;
2025-01-12 15:44:22 +01:00
if (context_is_floating_toolbar()) {
2025-07-18 23:37:51 +02:00
x += ui_toolbar_x();
y += ui_toolbar_x();
2025-08-08 14:09:48 +02:00
h = (ui_toolbar_tool_names.length + 1) * (ui_toolbar_w() + 2);
2025-01-09 15:47:57 +01:00
ui.ops.theme.WINDOW_BG_COL = ui.ops.theme.SEPARATOR_COL;
}
2025-07-18 23:37:51 +02:00
if (ui_window(ui_toolbar_handle, x, y, ui_toolbar_w(), h)) {
2024-09-03 15:52:05 +02:00
ui._y -= 4 * ui_SCALE(ui);
2024-03-11 15:10:18 +01:00
ui.image_scroll_align = false;
2025-06-19 19:55:16 +02:00
let img: gpu_texture_t = resource_get("icons.k");
2024-03-11 15:10:18 +01:00
2024-05-08 21:17:02 +02:00
let col: u32 = ui.ops.theme.WINDOW_BG_COL;
let light: bool = col > 0xff666666;
2024-03-11 15:10:18 +01:00
let icon_accent: i32 = light ? 0xff666666 : -1;
// Properties icon
if (config_raw.layout[layout_size_t.HEADER] == 1) {
let rect: rect_t = resource_tile50(img, 7, 1);
2025-08-04 19:34:53 +02:00
if (ui_sub_image(img, light ? 0xff666666 : ui.ops.theme.BUTTON_COL, -1.0, rect.x, rect.y, rect.w, rect.h) == ui_state_t.RELEASED) {
2024-03-11 15:10:18 +01:00
config_raw.layout[layout_size_t.HEADER] = 0;
}
}
// Draw ">>" button if header is hidden
else {
2024-04-10 19:39:17 +02:00
let _ELEMENT_H: i32 = ui.ops.theme.ELEMENT_H;
let _BUTTON_H: i32 = ui.ops.theme.BUTTON_H;
let _BUTTON_COL: i32 = ui.ops.theme.BUTTON_COL;
2024-03-11 15:10:18 +01:00
let _fontOffsetY: i32 = ui.font_offset_y;
2024-04-10 19:39:17 +02:00
ui.ops.theme.ELEMENT_H = math_floor(ui.ops.theme.ELEMENT_H * 1.5);
ui.ops.theme.BUTTON_H = ui.ops.theme.ELEMENT_H;
ui.ops.theme.BUTTON_COL = ui.ops.theme.WINDOW_BG_COL;
2025-03-10 20:26:45 +01:00
let font_height: i32 = draw_font_height(ui.ops.font, ui.font_size);
2024-09-03 15:52:05 +02:00
ui.font_offset_y = (ui_ELEMENT_H(ui) - font_height) / 2;
2024-03-11 15:10:18 +01:00
let _w: i32 = ui._w;
2025-07-18 23:37:51 +02:00
ui._w = ui_toolbar_w();
2024-03-11 15:10:18 +01:00
2024-09-03 15:52:05 +02:00
if (ui_button(">>")) {
2024-03-11 15:10:18 +01:00
ui_toolbar_tool_properties_menu();
}
ui._w = _w;
2024-04-10 19:39:17 +02:00
ui.ops.theme.ELEMENT_H = _ELEMENT_H;
ui.ops.theme.BUTTON_H = _BUTTON_H;
ui.ops.theme.BUTTON_COL = _BUTTON_COL;
2024-03-11 15:10:18 +01:00
ui.font_offset_y = _fontOffsetY;
}
2024-03-20 16:13:54 +01:00
if (ui.is_hovered) {
2024-09-03 15:52:05 +02:00
ui_tooltip(tr("Toggle header"));
2024-03-20 16:13:54 +01:00
}
2024-09-03 15:52:05 +02:00
ui._y -= 4 * ui_SCALE(ui);
2024-03-11 15:10:18 +01:00
2024-03-21 21:06:41 +01:00
let vars_brush: map_t<string, string> = map_create();
2024-04-08 17:40:32 +02:00
map_set(vars_brush, "key", map_get(config_keymap, "brush_ruler"));
map_set(vars_brush, "action_paint", map_get(config_keymap, "action_paint"));
2024-03-21 21:06:41 +01:00
let vars_decal: map_t<string, string> = map_create();
2024-04-08 17:40:32 +02:00
map_set(vars_decal, "key", map_get(config_keymap, "decal_mask"));
2024-03-21 21:06:41 +01:00
let vars_clone: map_t<string, string> = map_create();
2024-04-08 17:40:32 +02:00
map_set(vars_clone, "key", map_get(config_keymap, "set_clone_source"));
2024-03-21 21:06:41 +01:00
2024-05-03 21:29:39 +02:00
let key_tool_brush: string = map_get(config_keymap, "tool_brush");
let key_tool_eraser: string = map_get(config_keymap, "tool_eraser");
let key_tool_fill: string = map_get(config_keymap, "tool_fill");
let key_tool_decal: string = map_get(config_keymap, "tool_decal");
let key_tool_text: string = map_get(config_keymap, "tool_text");
let key_tool_clone: string = map_get(config_keymap, "tool_clone");
let key_tool_blur: string = map_get(config_keymap, "tool_blur");
let key_tool_smudge: string = map_get(config_keymap, "tool_smudge");
let key_tool_particle: string = map_get(config_keymap, "tool_particle");
let key_tool_colorid: string = map_get(config_keymap, "tool_colorid");
let key_tool_picker: string = map_get(config_keymap, "tool_picker");
let key_tool_bake: string = map_get(config_keymap, "tool_bake");
let key_tool_gizmo: string = map_get(config_keymap, "tool_gizmo");
let key_tool_material: string = map_get(config_keymap, "tool_material");
key_tool_brush = "(" + key_tool_brush + ") - " + tr("Hold {action_paint} to paint\nHold {key} and press {action_paint} to paint a straight line (ruler mode)", vars_brush);
key_tool_eraser = "(" + key_tool_eraser + ") - " + tr("Hold {action_paint} to erase\nHold {key} and press {action_paint} to erase a straight line (ruler mode)", vars_brush);
key_tool_fill = "(" + key_tool_fill + ")";
key_tool_decal = "(" + key_tool_decal + ") - " + tr("Hold {key} to paint on a decal mask", vars_decal);
key_tool_text = "(" + key_tool_text + ") - " + tr("Hold {key} to use the text as a mask", vars_decal);
key_tool_clone = "(" + key_tool_clone + ") - " + tr("Hold {key} to set source", vars_clone);
key_tool_blur = "(" + key_tool_blur + ")";
key_tool_smudge = "(" + key_tool_smudge + ")";
key_tool_particle = "(" + key_tool_particle + ")";
key_tool_colorid = "(" + key_tool_colorid + ")";
key_tool_picker = "(" + key_tool_picker + ")";
key_tool_bake = "(" + key_tool_bake + ")";
key_tool_gizmo = "(" + key_tool_gizmo + ")";
key_tool_material = "(" + key_tool_material + ")";
2024-03-11 15:10:18 +01:00
let keys: string[] = [
2024-05-03 21:29:39 +02:00
key_tool_brush,
key_tool_eraser,
key_tool_fill,
key_tool_decal,
key_tool_text,
key_tool_clone,
key_tool_blur,
key_tool_smudge,
key_tool_particle,
key_tool_colorid,
key_tool_picker,
key_tool_bake,
key_tool_gizmo,
key_tool_material
2024-03-11 15:10:18 +01:00
];
2024-11-30 23:39:57 +01:00
ui_toolbar_ext_draw_tools(ui, img, icon_accent, keys);
2024-03-11 15:10:18 +01:00
ui.image_scroll_align = true;
}
2025-01-12 15:44:22 +01:00
if (context_is_floating_toolbar()) {
2025-01-09 15:47:57 +01:00
ui.ops.theme.WINDOW_BG_COL = _WINDOW_BG_COL;
}
2024-03-11 15:10:18 +01:00
if (config_raw.touch_ui) {
// Hide scrollbar
2024-04-10 19:39:17 +02:00
let _SCROLL_W: i32 = ui.ops.theme.SCROLL_W;
ui.ops.theme.SCROLL_W = 0;
2024-09-03 15:52:05 +02:00
ui_end_window();
2024-04-10 19:39:17 +02:00
ui.ops.theme.SCROLL_W = _SCROLL_W;
2024-03-11 15:10:18 +01:00
}
}
function ui_toolbar_tool_properties_menu() {
2024-09-03 15:52:05 +02:00
let ui: ui_t = ui_base_ui;
ui_menu_draw(function (ui: ui_t) {
2024-03-11 15:10:18 +01:00
ui.changed = false;
ui_header_draw_tool_properties(ui);
if (ui.changed) {
ui_menu_keep_open = true;
}
2024-09-03 15:52:05 +02:00
if (ui_button(tr("Pin to Header"), ui_align_t.LEFT)) {
2024-03-11 15:10:18 +01:00
config_raw.layout[layout_size_t.HEADER] = 1;
}
2024-09-11 16:32:12 +02:00
}, math_floor(ui._x + ui._w + 2), math_floor(ui._y - 6 * ui_SCALE(ui)));
2024-03-11 15:10:18 +01:00
}
function ui_toolbar_draw_highlight() {
2024-09-03 15:52:05 +02:00
let ui: ui_t = ui_base_ui;
2025-07-18 23:37:51 +02:00
let size: i32 = ui_toolbar_w() - 4;
2025-03-02 21:07:17 +01:00
draw_set_color(ui.ops.theme.HIGHLIGHT_COL);
2024-09-03 15:52:05 +02:00
ui_draw_rect(true, ui._x + -1, ui._y + 2, size + 2, size + 2);
2024-03-11 15:10:18 +01:00
}