Files
armorpaint/base/Sources/UIMenu.ts
T
luboslenco a87a79141b Refactor
2024-02-19 17:07:09 +01:00

626 lines
24 KiB
TypeScript

class UIMenu {
static show = false;
static menuCategory = 0;
static menuCategoryW = 0;
static menuCategoryH = 0;
static menuX = 0;
static menuY = 0;
static menuElements = 0;
static keepOpen = false;
static menuCommands: (ui: zui_t)=>void = null;
static showMenuFirst = true;
static hideMenu = false;
static render = () => {
let ui = Base.uiMenu;
let menuW = UIMenu.menuCommands != null ? Math.floor(Base.defaultElementW * zui_SCALE(Base.uiMenu) * 2.3) : Math.floor(zui_ELEMENT_W(ui) * 2.3);
let _BUTTON_COL = ui.t.BUTTON_COL;
ui.t.BUTTON_COL = ui.t.SEPARATOR_COL;
let _ELEMENT_OFFSET = ui.t.ELEMENT_OFFSET;
ui.t.ELEMENT_OFFSET = 0;
let _ELEMENT_H = ui.t.ELEMENT_H;
ui.t.ELEMENT_H = Config.raw.touch_ui ? (28 + 2) : 28;
zui_begin_region(ui, UIMenu.menuX, UIMenu.menuY, menuW);
if (UIMenu.menuCommands != null) {
g2_set_color(ui.t.ACCENT_SELECT_COL);
zui_draw_rect(true, ui._x + -1, ui._y + -1, ui._w + 2, zui_ELEMENT_H(ui) * UIMenu.menuElements + 2);
g2_set_color(ui.t.SEPARATOR_COL);
zui_draw_rect(true, ui._x + 0, ui._y + 0, ui._w, zui_ELEMENT_H(ui) * UIMenu.menuElements);
g2_set_color(0xffffffff);
UIMenu.menuCommands(ui);
}
else {
UIMenu.menuStart(ui);
if (UIMenu.menuCategory == MenuCategory.MenuFile) {
if (UIMenu.menuButton(ui, tr("New Project..."), Config.keymap.file_new)) Project.projectNewBox();
if (UIMenu.menuButton(ui, tr("Open..."), Config.keymap.file_open)) Project.projectOpen();
if (UIMenu.menuButton(ui, tr("Open Recent..."), Config.keymap.file_open_recent)) BoxProjects.show();
if (UIMenu.menuButton(ui, tr("Save"), Config.keymap.file_save)) Project.projectSave();
if (UIMenu.menuButton(ui, tr("Save As..."), Config.keymap.file_save_as)) Project.projectSaveAs();
UIMenu.menuSeparator(ui);
if (UIMenu.menuButton(ui, tr("Import Texture..."), Config.keymap.file_import_assets)) Project.importAsset(Path.textureFormats.join(","), false);
if (UIMenu.menuButton(ui, tr("Import Envmap..."))) {
UIFiles.show("hdr", false, false, (path: string) => {
if (!path.endsWith(".hdr")) {
Console.error(tr("Error: .hdr file expected"));
return;
}
ImportAsset.run(path);
});
}
///if (is_paint || is_sculpt)
if (UIMenu.menuButton(ui, tr("Import Font..."))) Project.importAsset("ttf,ttc,otf");
if (UIMenu.menuButton(ui, tr("Import Material..."))) Project.importMaterial();
if (UIMenu.menuButton(ui, tr("Import Brush..."))) Project.importBrush();
///end
///if (is_paint || is_lab)
if (UIMenu.menuButton(ui, tr("Import Swatches..."))) Project.importSwatches();
///end
if (UIMenu.menuButton(ui, tr("Import Mesh..."))) Project.importMesh();
if (UIMenu.menuButton(ui, tr("Reimport Mesh"), Config.keymap.file_reimport_mesh)) Project.reimportMesh();
if (UIMenu.menuButton(ui, tr("Reimport Textures"), Config.keymap.file_reimport_textures)) Project.reimportTextures();
UIMenu.menuSeparator(ui);
///if (is_paint || is_lab)
if (UIMenu.menuButton(ui, tr("Export Textures..."), Config.keymap.file_export_textures_as)) {
///if is_paint
Context.raw.layersExport = ExportMode.ExportVisible;
///end
BoxExport.showTextures();
}
if (UIMenu.menuButton(ui, tr("Export Swatches..."))) Project.exportSwatches();
///end
if (UIMenu.menuButton(ui, tr("Export Mesh..."))) {
Context.raw.exportMeshIndex = 0; // All
BoxExport.showMesh();
}
///if is_paint
if (UIMenu.menuButton(ui, tr("Bake Material..."))) BoxExport.showBakeMaterial();
///end
UIMenu.menuSeparator(ui);
if (UIMenu.menuButton(ui, tr("Exit"))) sys_stop();
}
else if (UIMenu.menuCategory == MenuCategory.MenuEdit) {
let stepUndo = "";
let stepRedo = "";
if (History.undos > 0) {
stepUndo = History.steps[History.steps.length - 1 - History.redos].name;
}
if (History.redos > 0) {
stepRedo = History.steps[History.steps.length - History.redos].name;
}
ui.enabled = History.undos > 0;
if (UIMenu.menuButton(ui, tr("Undo {step}", new Map([["step", stepUndo]])), Config.keymap.edit_undo)) History.undo();
ui.enabled = History.redos > 0;
if (UIMenu.menuButton(ui, tr("Redo {step}", new Map([["step", stepRedo]])), Config.keymap.edit_redo)) History.redo();
ui.enabled = true;
UIMenu.menuSeparator(ui);
if (UIMenu.menuButton(ui, tr("Preferences..."), Config.keymap.edit_prefs)) BoxPreferences.show();
}
else if (UIMenu.menuCategory == MenuCategory.MenuViewport) {
if (UIMenu.menuButton(ui, tr("Distract Free"), Config.keymap.view_distract_free)) {
UIBase.toggleDistractFree();
UIBase.ui.is_hovered = false;
}
///if !(krom_android || krom_ios)
if (UIMenu.menuButton(ui, tr("Toggle Fullscreen"), "alt+enter")) {
Base.toggleFullscreen();
}
///end
ui.changed = false;
UIMenu.menuFill(ui);
let p = scene_world;
let envHandle = zui_handle("uimenu_0");
envHandle.value = p.strength;
UIMenu.menuAlign(ui);
p.strength = zui_slider(envHandle, tr("Environment"), 0.0, 8.0, true);
if (envHandle.changed) Context.raw.ddirty = 2;
UIMenu.menuFill(ui);
let envaHandle = zui_handle("uimenu_1");
envaHandle.value = Context.raw.envmapAngle / Math.PI * 180.0;
if (envaHandle.value < 0) {
envaHandle.value += (Math.floor(-envaHandle.value / 360) + 1) * 360;
}
else if (envaHandle.value > 360) {
envaHandle.value -= Math.floor(envaHandle.value / 360) * 360;
}
UIMenu.menuAlign(ui);
Context.raw.envmapAngle = zui_slider(envaHandle, tr("Environment Angle"), 0.0, 360.0, true, 1) / 180.0 * Math.PI;
if (ui.is_hovered) zui_tooltip(tr("{shortcut} and move mouse", new Map([["shortcut", Config.keymap.rotate_envmap]])));
if (envaHandle.changed) Context.raw.ddirty = 2;
if (scene_lights.length > 0) {
let light = scene_lights[0];
UIMenu.menuFill(ui);
let lhandle = zui_handle("uimenu_2");
let scale = 1333;
lhandle.value = light.data.strength / scale;
lhandle.value = Math.floor(lhandle.value * 100) / 100;
UIMenu.menuAlign(ui);
light.data.strength = zui_slider(lhandle, tr("Light"), 0.0, 4.0, true) * scale;
if (lhandle.changed) Context.raw.ddirty = 2;
UIMenu.menuFill(ui);
light = scene_lights[0];
let lahandle = zui_handle("uimenu_3");
lahandle.value = Context.raw.lightAngle / Math.PI * 180;
UIMenu.menuAlign(ui);
let newAngle = zui_slider(lahandle, tr("Light Angle"), 0.0, 360.0, true, 1) / 180 * Math.PI;
if (ui.is_hovered) zui_tooltip(tr("{shortcut} and move mouse", new Map([["shortcut", Config.keymap.rotate_light]])));
let ldiff = newAngle - Context.raw.lightAngle;
if (Math.abs(ldiff) > 0.005) {
if (newAngle < 0) newAngle += (Math.floor(-newAngle / (2 * Math.PI)) + 1) * 2 * Math.PI;
else if (newAngle > 2 * Math.PI) newAngle -= Math.floor(newAngle / (2 * Math.PI)) * 2 * Math.PI;
Context.raw.lightAngle = newAngle;
let m = mat4_rot_z(ldiff);
mat4_mult_mat(light.base.transform.local, m);
transform_decompose(light.base.transform);
Context.raw.ddirty = 2;
}
UIMenu.menuFill(ui);
let sxhandle = zui_handle("uimenu_4");
sxhandle.value = light.data.size;
UIMenu.menuAlign(ui);
light.data.size = zui_slider(sxhandle, tr("Light Size"), 0.0, 4.0, true);
if (sxhandle.changed) Context.raw.ddirty = 2;
}
///if (is_paint || is_sculpt)
UIMenu.menuFill(ui);
let splitViewHandle = zui_handle("uimenu_5", { selected: Context.raw.splitView });
Context.raw.splitView = zui_check(splitViewHandle, " " + tr("Split View"));
if (splitViewHandle.changed) {
Base.resize();
}
///end
///if is_lab
UIMenu.menuFill(ui);
let brushScaleHandle = zui_handle("uimenu_6", { value: Context.raw.brushScale });
UIMenu.menuAlign(ui);
Context.raw.brushScale = zui_slider(brushScaleHandle, tr("UV Scale"), 0.01, 5.0, true);
if (brushScaleHandle.changed) {
MakeMaterial.parseMeshMaterial();
///if (krom_direct3d12 || krom_vulkan || krom_metal)
RenderPathRaytrace.uvScale = Context.raw.brushScale;
RenderPathRaytrace.ready = false;
///end
}
///end
UIMenu.menuFill(ui);
let cullHandle = zui_handle("uimenu_7", { selected: Context.raw.cullBackfaces });
Context.raw.cullBackfaces = zui_check(cullHandle, " " + tr("Cull Backfaces"));
if (cullHandle.changed) {
MakeMaterial.parseMeshMaterial();
}
UIMenu.menuFill(ui);
let filterHandle = zui_handle("uimenu_8", { selected: Context.raw.textureFilter });
Context.raw.textureFilter = zui_check(filterHandle, " " + tr("Filter Textures"));
if (filterHandle.changed) {
MakeMaterial.parsePaintMaterial();
MakeMaterial.parseMeshMaterial();
}
///if (is_paint || is_sculpt)
UIMenu.menuFill(ui);
Context.raw.drawWireframe = zui_check(Context.raw.wireframeHandle, " " + tr("Wireframe"));
if (Context.raw.wireframeHandle.changed) {
let current = _g2_current;
g2_end();
UtilUV.cacheUVMap();
g2_begin(current, false);
MakeMaterial.parseMeshMaterial();
}
///end
///if is_paint
UIMenu.menuFill(ui);
Context.raw.drawTexels = zui_check(Context.raw.texelsHandle, " " + tr("Texels"));
if (Context.raw.texelsHandle.changed) {
MakeMaterial.parseMeshMaterial();
}
///end
UIMenu.menuFill(ui);
let compassHandle = zui_handle("uimenu_9", { selected: Context.raw.showCompass });
Context.raw.showCompass = zui_check(compassHandle, " " + tr("Compass"));
if (compassHandle.changed) Context.raw.ddirty = 2;
UIMenu.menuFill(ui);
Context.raw.showEnvmap = zui_check(Context.raw.showEnvmapHandle, " " + tr("Envmap"));
if (Context.raw.showEnvmapHandle.changed) {
Context.loadEnvmap();
Context.raw.ddirty = 2;
}
UIMenu.menuFill(ui);
Context.raw.showEnvmapBlur = zui_check(Context.raw.showEnvmapBlurHandle, " " + tr("Blur Envmap"));
if (Context.raw.showEnvmapBlurHandle.changed) Context.raw.ddirty = 2;
Context.updateEnvmap();
if (ui.changed) UIMenu.keepOpen = true;
}
else if (UIMenu.menuCategory == MenuCategory.MenuMode) {
let modeHandle = zui_handle("uimenu_10");
modeHandle.position = Context.raw.viewportMode;
let modes = [
tr("Lit"),
tr("Base Color"),
///if (is_paint || is_lab)
tr("Normal"),
tr("Occlusion"),
tr("Roughness"),
tr("Metallic"),
tr("Opacity"),
tr("Height"),
///end
///if (is_paint)
tr("Emission"),
tr("Subsurface"),
///end
///if (is_paint || is_sculpt)
tr("TexCoord"),
tr("Object Normal"),
tr("Material ID"),
tr("Object ID"),
tr("Mask")
///end
];
let shortcuts = ["l", "b", "n", "o", "r", "m", "a", "h", "e", "s", "t", "1", "2", "3", "4"];
///if (krom_direct3d12 || krom_vulkan || krom_metal)
if (krom_raytrace_supported()) {
modes.push(tr("Path Traced"));
shortcuts.push("p");
}
///end
for (let i = 0; i < modes.length; ++i) {
UIMenu.menuFill(ui);
let shortcut = Config.raw.touch_ui ? "" : Config.keymap.viewport_mode + ", " + shortcuts[i];
zui_radio(modeHandle, i, modes[i], shortcut);
}
if (modeHandle.changed) {
Context.setViewportMode(modeHandle.position);
// TODO: rotate mode is not supported for path tracing yet
if (modeHandle.position == ViewportMode.ViewPathTrace && Context.raw.cameraControls == CameraControls.ControlsRotate) {
Context.raw.cameraControls = CameraControls.ControlsOrbit;
Viewport.reset();
}
}
}
else if (UIMenu.menuCategory == MenuCategory.MenuCamera) {
if (UIMenu.menuButton(ui, tr("Reset"), Config.keymap.view_reset)) {
Viewport.reset();
Viewport.scaleToBounds();
}
UIMenu.menuSeparator(ui);
if (UIMenu.menuButton(ui, tr("Front"), Config.keymap.view_front)) {
Viewport.setView(0, -1, 0, Math.PI / 2, 0, 0);
}
if (UIMenu.menuButton(ui, tr("Back"), Config.keymap.view_back)) {
Viewport.setView(0, 1, 0, Math.PI / 2, 0, Math.PI);
}
if (UIMenu.menuButton(ui, tr("Right"), Config.keymap.view_right)) {
Viewport.setView(1, 0, 0, Math.PI / 2, 0, Math.PI / 2);
}
if (UIMenu.menuButton(ui, tr("Left"), Config.keymap.view_left)) {
Viewport.setView(-1, 0, 0, Math.PI / 2, 0, -Math.PI / 2);
}
if (UIMenu.menuButton(ui, tr("Top"), Config.keymap.view_top)) {
Viewport.setView(0, 0, 1, 0, 0, 0);
}
if (UIMenu.menuButton(ui, tr("Bottom"), Config.keymap.view_bottom)) {
Viewport.setView(0, 0, -1, Math.PI, 0, Math.PI);
}
UIMenu.menuSeparator(ui);
ui.changed = false;
if (UIMenu.menuButton(ui, tr("Orbit Left"), Config.keymap.view_orbit_left)) {
Viewport.orbit(-Math.PI / 12, 0);
}
if (UIMenu.menuButton(ui, tr("Orbit Right"), Config.keymap.view_orbit_right)) {
Viewport.orbit(Math.PI / 12, 0);
}
if (UIMenu.menuButton(ui, tr("Orbit Up"), Config.keymap.view_orbit_up)) {
Viewport.orbit(0, -Math.PI / 12);
}
if (UIMenu.menuButton(ui, tr("Orbit Down"), Config.keymap.view_orbit_down)) {
Viewport.orbit(0, Math.PI / 12);
}
if (UIMenu.menuButton(ui, tr("Orbit Opposite"), Config.keymap.view_orbit_opposite)) {
Viewport.orbitOpposite();
}
if (UIMenu.menuButton(ui, tr("Zoom In"), Config.keymap.view_zoom_in)) {
Viewport.zoom(0.2);
}
if (UIMenu.menuButton(ui, tr("Zoom Out"), Config.keymap.view_zoom_out)) {
Viewport.zoom(-0.2);
}
// menuSeparator(ui);
UIMenu.menuFill(ui);
let cam = scene_camera;
Context.raw.fovHandle = zui_handle("uimenu_11", { value: Math.floor(cam.data.fov * 100) / 100 });
UIMenu.menuAlign(ui);
cam.data.fov = zui_slider(Context.raw.fovHandle, tr("FoV"), 0.3, 1.4, true);
if (Context.raw.fovHandle.changed) {
Viewport.updateCameraType(Context.raw.cameraType);
}
UIMenu.menuFill(ui);
UIMenu.menuAlign(ui);
let cameraControlsHandle = zui_handle("uimenu_12");
cameraControlsHandle.position = Context.raw.cameraControls;
Context.raw.cameraControls = zui_inline_radio(cameraControlsHandle, [tr("Orbit"), tr("Rotate"), tr("Fly")], Align.Left);
let orbitAndRotateTooltip = tr("Orbit and Rotate mode:\n{rotate_shortcut} or move right mouse button to rotate.\n{zoom_shortcut} or scroll to zoom.\n{pan_shortcut} or move middle mouse to pan.",
new Map([
["rotate_shortcut", Config.keymap.action_rotate],
["zoom_shortcut", Config.keymap.action_zoom],
["pan_shortcut", Config.keymap.action_pan]
])
);
let flyTooltip = tr("Fly mode:\nHold the right mouse button and one of the following commands:\nmove mouse to rotate.\nw, up or scroll up to move forward.\ns, down or scroll down to move backward.\na or left to move left.\nd or right to move right.\ne to move up.\nq to move down.\nHold shift to move faster or alt to move slower.");
if (ui.is_hovered) zui_tooltip(orbitAndRotateTooltip + "\n\n" + flyTooltip);
UIMenu.menuFill(ui);
UIMenu.menuAlign(ui);
Context.raw.cameraType = zui_inline_radio(Context.raw.camHandle, [tr("Perspective"), tr("Orthographic")], Align.Left);
if (ui.is_hovered) zui_tooltip(tr("Camera Type") + ` (${Config.keymap.view_camera_type})`);
if (Context.raw.camHandle.changed) {
Viewport.updateCameraType(Context.raw.cameraType);
}
if (ui.changed) UIMenu.keepOpen = true;
}
else if (UIMenu.menuCategory == MenuCategory.MenuHelp) {
if (UIMenu.menuButton(ui, tr("Manual"))) {
File.loadUrl(manifest_url + "/manual");
}
if (UIMenu.menuButton(ui, tr("How To"))) {
File.loadUrl(manifest_url + "/howto");
}
if (UIMenu.menuButton(ui, tr("What's New"))) {
File.loadUrl(manifest_url + "/notes");
}
if (UIMenu.menuButton(ui, tr("Issue Tracker"))) {
File.loadUrl("https://github.com/armory3d/armortools/issues");
}
if (UIMenu.menuButton(ui, tr("Report Bug"))) {
///if (krom_darwin || krom_ios) // Limited url length
File.loadUrl("https://github.com/armory3d/armortools/issues/new?labels=bug&template=bug_report.md&body=*" + manifest_title + "%20" + manifest_version + "-" + Config.getSha() + ",%20" + sys_system_id());
///else
File.loadUrl("https://github.com/armory3d/armortools/issues/new?labels=bug&template=bug_report.md&body=*" + manifest_title + "%20" + manifest_version + "-" + Config.getSha() + ",%20" + sys_system_id() + "*%0A%0A**Issue description:**%0A%0A**Steps to reproduce:**%0A%0A");
///end
}
if (UIMenu.menuButton(ui, tr("Request Feature"))) {
///if (krom_darwin || krom_ios) // Limited url length
File.loadUrl("https://github.com/armory3d/armortools/issues/new?labels=feature%20request&template=feature_request.md&body=*" + manifest_title + "%20" + manifest_version + "-" + Config.getSha() + ",%20" + sys_system_id());
///else
File.loadUrl("https://github.com/armory3d/armortools/issues/new?labels=feature%20request&template=feature_request.md&body=*" + manifest_title + "%20" + manifest_version + "-" + Config.getSha() + ",%20" + sys_system_id() + "*%0A%0A**Feature description:**%0A%0A");
///end
}
UIMenu.menuSeparator(ui);
if (UIMenu.menuButton(ui, tr("Check for Updates..."))) {
///if krom_android
File.loadUrl(manifest_url_android);
///elseif krom_ios
File.loadUrl(manifest_url_ios);
///else
// Retrieve latest version number
File.downloadBytes("https://server.armorpaint.org/" + manifest_title.toLowerCase() + ".html", (buffer: ArrayBuffer) => {
if (buffer != null) {
// Compare versions
let update = JSON.parse(sys_buffer_to_string(buffer));
let updateVersion = Math.floor(update.version);
if (updateVersion > 0) {
let date = Config.getDate().substr(2); // 2019 -> 19
let dateInt = parseInt(date.replaceAll("-", ""));
if (updateVersion > dateInt) {
UIBox.showMessage(tr("Update"), tr("Update is available!\nPlease visit {url}.", new Map([["url", manifest_url]])));
}
else {
UIBox.showMessage(tr("Update"), tr("You are up to date!"));
}
}
}
else {
UIBox.showMessage(tr("Update"), tr("Unable to check for updates.\nPlease visit {url}.", new Map([["url", manifest_url]])));
}
});
///end
}
if (UIMenu.menuButton(ui, tr("About..."))) {
let msg = manifest_title + ".org - v" + manifest_version + " (" + Config.getDate() + ") - " + Config.getSha() + "\n";
msg += sys_system_id() + " - " + Strings.graphics_api;
///if krom_windows
let save = (Path.isProtected() ? krom_save_path() : Path.data()) + Path.sep + "tmp.txt";
krom_sys_command('wmic path win32_VideoController get name > "' + save + '"');
let blob = krom_load_blob(save);
let u8 = new Uint8Array(blob);
let gpuRaw = "";
for (let i = 0; i < Math.floor(u8.length / 2); ++i) {
let c = String.fromCharCode(u8[i * 2]);
gpuRaw += c;
}
let gpus = gpuRaw.split("\n");
gpus = gpus.splice(1, gpus.length - 2);
let gpu = "";
for (let g of gpus) {
gpu += trim_end(g) + ", ";
}
gpu = gpu.substr(0, gpu.length - 2);
msg += `\n${gpu}`;
///else
// { lshw -C display }
///end
UIBox.showCustom((ui: zui_t) => {
let tabVertical = Config.raw.touch_ui;
if (zui_tab(zui_handle("uimenu_13"), tr("About"), tabVertical)) {
let img: image_t = data_get_image("badge.k");
zui_image(img);
zui_end_element();
zui_text_area(zui_handle("uimenu_14", { text: msg }), Align.Left, false);
zui_row([1 / 3, 1 / 3, 1 / 3]);
///if (krom_windows || krom_linux || krom_darwin)
if (zui_button(tr("Copy"))) {
krom_copy_to_clipboard(msg);
}
///else
zui_end_element();
///end
if (zui_button(tr("Contributors"))) {
File.loadUrl("https://github.com/armory3d/armortools/graphs/contributors");
}
if (zui_button(tr("OK"))) {
UIBox.hide();
}
}
}, 400, 320);
}
}
}
UIMenu.hideMenu = ui.combo_selected_handle_ptr == null && !UIMenu.keepOpen && !UIMenu.showMenuFirst && (ui.changed || ui.input_released || ui.input_released_r || ui.is_escape_down);
UIMenu.showMenuFirst = false;
UIMenu.keepOpen = false;
ui.t.BUTTON_COL = _BUTTON_COL;
ui.t.ELEMENT_OFFSET = _ELEMENT_OFFSET;
ui.t.ELEMENT_H = _ELEMENT_H;
zui_end_region();
if (UIMenu.hideMenu) {
UIMenu.hide();
UIMenu.showMenuFirst = true;
UIMenu.menuCommands = null;
}
}
static hide = () => {
UIMenu.show = false;
Base.redrawUI();
}
static draw = (commands: (ui: zui_t)=>void = null, elements: i32, x = -1, y = -1) => {
zui_end_input();
UIMenu.show = true;
UIMenu.menuCommands = commands;
UIMenu.menuElements = elements;
UIMenu.menuX = x > -1 ? x : Math.floor(mouse_x + 1);
UIMenu.menuY = y > -1 ? y : Math.floor(mouse_y + 1);
UIMenu.fitToScreen();
}
static fitToScreen = () => {
// Prevent the menu going out of screen
let menuW = Base.defaultElementW * zui_SCALE(Base.uiMenu) * 2.3;
if (UIMenu.menuX + menuW > sys_width()) {
if (UIMenu.menuX - menuW > 0) {
UIMenu.menuX = Math.floor(UIMenu.menuX - menuW);
}
else {
UIMenu.menuX = Math.floor(sys_width() - menuW);
}
}
let menuH = Math.floor(UIMenu.menuElements * 30 * zui_SCALE(Base.uiMenu)); // ui.t.ELEMENT_H
if (UIMenu.menuY + menuH > sys_height()) {
if (UIMenu.menuY - menuH > 0) {
UIMenu.menuY = Math.floor(UIMenu.menuY - menuH);
}
else {
UIMenu.menuY = sys_height() - menuH;
}
UIMenu.menuX += 1; // Move out of mouse focus
}
}
static menuFill = (ui: zui_t) => {
g2_set_color(ui.t.ACCENT_SELECT_COL);
g2_fill_rect(ui._x - 1, ui._y, ui._w + 2, zui_ELEMENT_H(ui) + 1 + 1);
g2_set_color(ui.t.SEPARATOR_COL);
g2_fill_rect(ui._x, ui._y, ui._w, zui_ELEMENT_H(ui) + 1);
g2_set_color(0xffffffff);
}
static menuSeparator = (ui: zui_t) => {
ui._y++;
if (Config.raw.touch_ui) {
zui_fill(0, 0, ui._w / zui_SCALE(ui), 1, ui.t.ACCENT_SELECT_COL);
}
else {
zui_fill(26, 0, ui._w / zui_SCALE(ui) - 26, 1, ui.t.ACCENT_SELECT_COL);
}
}
static menuButton = (ui: zui_t, text: string, label = ""/*, icon = -1*/): bool => {
UIMenu.menuFill(ui);
if (Config.raw.touch_ui) {
label = "";
}
// let icons = icon > -1 ? Res.get("icons.k") : null;
// let r = Res.tile25(icons, icon, 8);
// return Zui.button(Config.buttonSpacing + text, Config.buttonAlign, label, icons, r.x, r.y, r.w, r.h);
return zui_button(Config.buttonSpacing + text, Config.buttonAlign, label);
}
static menuAlign = (ui: zui_t) => {
if (!Config.raw.touch_ui) {
zui_row([12 / 100, 88 / 100]);
zui_end_element();
}
}
static menuStart = (ui: zui_t) => {
// Draw top border
g2_set_color(ui.t.ACCENT_SELECT_COL);
if (Config.raw.touch_ui) {
g2_fill_rect(ui._x + ui._w / 2 + UIMenu.menuCategoryW / 2, ui._y - 1, ui._w / 2 - UIMenu.menuCategoryW / 2 + 1, 1);
g2_fill_rect(ui._x - 1, ui._y - 1, ui._w / 2 - UIMenu.menuCategoryW / 2 + 1, 1);
g2_fill_rect(ui._x + ui._w / 2 - UIMenu.menuCategoryW / 2, ui._y - UIMenu.menuCategoryH, UIMenu.menuCategoryW, 1);
g2_fill_rect(ui._x + ui._w / 2 - UIMenu.menuCategoryW / 2, ui._y - UIMenu.menuCategoryH, 1, UIMenu.menuCategoryH);
g2_fill_rect(ui._x + ui._w / 2 + UIMenu.menuCategoryW / 2, ui._y - UIMenu.menuCategoryH, 1, UIMenu.menuCategoryH);
}
else {
g2_fill_rect(ui._x - 1 + UIMenu.menuCategoryW, ui._y - 1, ui._w + 2 - UIMenu.menuCategoryW, 1);
g2_fill_rect(ui._x - 1, ui._y - UIMenu.menuCategoryH, UIMenu.menuCategoryW, 1);
g2_fill_rect(ui._x - 1, ui._y - UIMenu.menuCategoryH, 1, UIMenu.menuCategoryH);
g2_fill_rect(ui._x - 1 + UIMenu.menuCategoryW, ui._y - UIMenu.menuCategoryH, 1, UIMenu.menuCategoryH);
}
g2_set_color(0xffffffff);
}
}