ui_menu.ts 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. let ui_menu_show: bool = false;
  2. let ui_menu_nested: bool = false;
  3. let ui_menu_x: i32 = 0;
  4. let ui_menu_y: i32 = 0;
  5. let ui_menu_h: i32 = 0;
  6. let ui_menu_keep_open: bool = false;
  7. let ui_menu_commands: ()=>void = null;
  8. let ui_menu_show_first: bool = true;
  9. let ui_menu_hide_flag: bool = false;
  10. let _ui_menu_render_msg: string;
  11. function ui_menu_render() {
  12. let menu_w: i32 = ui_menu_commands != null ?
  13. math_floor(base_default_element_w * UI_SCALE() * 2.3) :
  14. math_floor(UI_ELEMENT_W() * 2.3);
  15. let _FILL_BUTTON_BG: i32 = ui.ops.theme.FILL_BUTTON_BG;
  16. ui.ops.theme.FILL_BUTTON_BG = false;
  17. let _ELEMENT_OFFSET: i32 = ui.ops.theme.ELEMENT_OFFSET;
  18. ui.ops.theme.ELEMENT_OFFSET = 0;
  19. let _ELEMENT_H: i32 = ui.ops.theme.ELEMENT_H;
  20. ui.ops.theme.ELEMENT_H = config_raw.touch_ui ? (28 + 2) : 28;
  21. if (ui_menu_nested) {
  22. ui_menu_show_first = true;
  23. ui_menu_nested = false;
  24. }
  25. // First draw out of screen, then align the menu based on menu height
  26. if (ui_menu_show_first) {
  27. ui_menu_x -= iron_window_width() * 2;
  28. ui_menu_y -= iron_window_height() * 2;
  29. }
  30. draw_begin();
  31. ui_begin_region(ui, ui_menu_x, ui_menu_y, menu_w);
  32. ui.input_enabled = ui.combo_selected_handle == null;
  33. ui_menu_start();
  34. if (ui_menu_commands != null) {
  35. ui_menu_commands();
  36. }
  37. 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);
  38. ui_menu_keep_open = false;
  39. ui.ops.theme.FILL_BUTTON_BG = _FILL_BUTTON_BG;
  40. ui.ops.theme.ELEMENT_OFFSET = _ELEMENT_OFFSET;
  41. ui.ops.theme.ELEMENT_H = _ELEMENT_H;
  42. ui_menu_end();
  43. ui_end_region();
  44. ui.input_enabled = true;
  45. draw_end();
  46. if (ui_menu_show_first) {
  47. ui_menu_show_first = false;
  48. ui_menu_keep_open = true;
  49. ui_menu_h = ui._y - ui_menu_y;
  50. ui_menu_x += iron_window_width() * 2;
  51. ui_menu_y += iron_window_height() * 2;
  52. ui_menu_fit_to_screen();
  53. ui_menu_render(); // Render at correct position now
  54. }
  55. if (ui_menu_hide_flag) {
  56. ui_menu_hide();
  57. ui_menu_show_first = true;
  58. ui_menu_commands = null;
  59. }
  60. }
  61. function ui_menu_hide() {
  62. ui_menu_show = false;
  63. base_redraw_ui();
  64. }
  65. function ui_menu_draw(commands: ()=>void = null, x: i32 = -1, y: i32 = -1) {
  66. ui_end_input();
  67. if (ui_menu_show) {
  68. ui_menu_nested = true;
  69. ui_menu_keep_open = true;
  70. }
  71. ui_menu_show = true;
  72. ui_menu_commands = commands;
  73. ui_menu_x = x > -1 ? x : math_floor(mouse_x + 1);
  74. ui_menu_y = y > -1 ? y : math_floor(mouse_y + 1);
  75. ui_menu_h = 0;
  76. }
  77. function ui_menu_fit_to_screen() {
  78. // Prevent the menu going out of screen
  79. let menu_w: f32 = base_default_element_w * UI_SCALE() * 2.3;
  80. if (ui_menu_x + menu_w > iron_window_width()) {
  81. if (ui_menu_x - menu_w > 0) {
  82. ui_menu_x = math_floor(ui_menu_x - menu_w);
  83. }
  84. else {
  85. ui_menu_x = math_floor(iron_window_width() - menu_w);
  86. }
  87. }
  88. if (ui_menu_y + ui_menu_h > iron_window_height()) {
  89. if (ui_menu_y - ui_menu_h > 0) {
  90. ui_menu_y = math_floor(ui_menu_y - ui_menu_h);
  91. }
  92. else {
  93. ui_menu_y = iron_window_height() - ui_menu_h;
  94. }
  95. ui_menu_x += 1; // Move out of mouse focus
  96. }
  97. }
  98. function ui_menu_separator() {
  99. ui._y++;
  100. if (config_raw.touch_ui) {
  101. ui_fill(0, 0, ui._w / UI_SCALE(), 1, ui.ops.theme.BUTTON_COL);
  102. }
  103. else {
  104. ui_fill(26, 0, ui._w / UI_SCALE() - 26, 1, ui.ops.theme.BUTTON_COL);
  105. }
  106. }
  107. function ui_menu_button(text: string, label: string = ""): bool {
  108. if (config_raw.touch_ui) {
  109. label = "";
  110. }
  111. return ui_button(config_button_spacing + text, config_button_align, label);
  112. }
  113. function ui_menu_align() {
  114. if (!config_raw.touch_ui) {
  115. let row: f32[] = [12 / 100, 88 / 100];
  116. ui_row(row);
  117. ui_end_element();
  118. }
  119. }
  120. function ui_menu_start() {
  121. ui_draw_shadow(ui._x, ui._y, ui._w, ui_menu_h);
  122. draw_set_color(ui.ops.theme.SEPARATOR_COL);
  123. ui_draw_rect(true, ui._x, ui._y, ui._w, ui_menu_h);
  124. draw_set_color(0xffffffff);
  125. }
  126. function ui_menu_end() {
  127. }