ui_menu.ts 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204
  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_sub_x: i32 = 0;
  11. let ui_menu_sub_y: i32 = 0;
  12. let ui_menu_sub_handle: ui_handle_t = null;
  13. let _ui_menu_render_msg: string;
  14. function ui_menu_render() {
  15. let menu_w: i32 = ui_menu_commands != null ? math_floor(base_default_element_w * UI_SCALE() * 2.3) : math_floor(UI_ELEMENT_W() * 2.3);
  16. let _FILL_BUTTON_BG: i32 = ui.ops.theme.FILL_BUTTON_BG;
  17. ui.ops.theme.FILL_BUTTON_BG = false;
  18. let _ELEMENT_OFFSET: i32 = ui.ops.theme.ELEMENT_OFFSET;
  19. ui.ops.theme.ELEMENT_OFFSET = 0;
  20. let _ELEMENT_H: i32 = ui.ops.theme.ELEMENT_H;
  21. ui.ops.theme.ELEMENT_H = config_raw.touch_ui ? (28 + 2) : 28;
  22. if (ui_menu_nested) {
  23. ui_menu_show_first = true;
  24. ui_menu_nested = false;
  25. }
  26. // First draw out of screen, then align the menu based on menu height
  27. if (ui_menu_show_first) {
  28. ui_menu_x -= iron_window_width() * 2;
  29. ui_menu_y -= iron_window_height() * 2;
  30. }
  31. draw_begin();
  32. ui_begin_region(ui, ui_menu_x, ui_menu_y, menu_w);
  33. ui.input_enabled = ui.combo_selected_handle == null;
  34. ui_menu_begin();
  35. if (ui_menu_commands != null) {
  36. ui_menu_commands();
  37. }
  38. ui_menu_hide_flag = ui.combo_selected_handle == null && !ui_menu_keep_open && !ui_menu_show_first &&
  39. (ui.changed || ui.input_released || ui.input_released_r || ui.is_escape_down);
  40. ui_menu_keep_open = false;
  41. ui.ops.theme.FILL_BUTTON_BG = _FILL_BUTTON_BG;
  42. ui.ops.theme.ELEMENT_OFFSET = _ELEMENT_OFFSET;
  43. ui.ops.theme.ELEMENT_H = _ELEMENT_H;
  44. ui_menu_end();
  45. ui_end_region();
  46. ui.input_enabled = true;
  47. draw_end();
  48. if (ui_menu_show_first) {
  49. ui_menu_show_first = false;
  50. ui_menu_keep_open = true;
  51. ui_menu_h = ui._y - ui_menu_y;
  52. ui_menu_x += iron_window_width() * 2;
  53. ui_menu_y += iron_window_height() * 2;
  54. ui_menu_fit_to_screen();
  55. ui_menu_render(); // Render at correct position now
  56. }
  57. if (ui_menu_hide_flag) {
  58. ui_menu_hide();
  59. ui_menu_show_first = true;
  60. ui_menu_commands = null;
  61. }
  62. }
  63. function ui_menu_hide() {
  64. ui_menu_show = false;
  65. base_redraw_ui();
  66. }
  67. function ui_menu_draw(commands: () => void = null, x: i32 = -1, y: i32 = -1) {
  68. ui_end_input();
  69. if (ui_menu_show) {
  70. ui_menu_nested = true;
  71. ui_menu_keep_open = true;
  72. }
  73. ui_menu_show = true;
  74. ui_menu_commands = commands;
  75. ui_menu_x = x > -1 ? x : math_floor(mouse_x + 1);
  76. ui_menu_y = y > -1 ? y : math_floor(mouse_y + 1);
  77. ui_menu_h = 0;
  78. }
  79. function ui_menu_fit_to_screen() {
  80. // Prevent the menu going out of screen
  81. let menu_w: f32 = base_default_element_w * UI_SCALE() * 2.3;
  82. if (ui_menu_x + menu_w > iron_window_width()) {
  83. if (ui_menu_x - menu_w > 0) {
  84. ui_menu_x = math_floor(ui_menu_x - menu_w);
  85. }
  86. else {
  87. ui_menu_x = math_floor(iron_window_width() - menu_w);
  88. }
  89. }
  90. if (ui_menu_y + ui_menu_h > iron_window_height()) {
  91. if (ui_menu_y - ui_menu_h > 0) {
  92. ui_menu_y = math_floor(ui_menu_y - ui_menu_h);
  93. }
  94. else {
  95. ui_menu_y = iron_window_height() - ui_menu_h;
  96. }
  97. ui_menu_x += 1; // Move out of mouse focus
  98. }
  99. }
  100. function ui_menu_separator() {
  101. ui._y++;
  102. if (config_raw.touch_ui) {
  103. ui_fill(0, 0, ui._w / UI_SCALE(), 1, ui.ops.theme.BUTTON_COL);
  104. }
  105. else {
  106. ui_fill(26, 0, ui._w / UI_SCALE() - 26, 1, ui.ops.theme.BUTTON_COL);
  107. }
  108. }
  109. function ui_menu_button(text: string, label: string = "", icon: icon_t = icon_t.NONE): bool {
  110. if (config_raw.touch_ui) {
  111. label = "";
  112. }
  113. let _y_top: i32 = ui._y;
  114. let result: bool = ui_button(config_button_spacing + text, config_button_align, label);
  115. if (icon != icon_t.NONE) {
  116. let _y_bottom: i32 = ui._y;
  117. let icons: gpu_texture_t = resource_get("icons05x.k");
  118. let folder: rect_t = resource_tile50(icons, icon);
  119. let icon_h: i32 = 25 * UI_SCALE();
  120. ui._y = _y_top - 1;
  121. ui._x -= 5 * UI_SCALE();
  122. ui_sub_image(icons, ui.ops.theme.LABEL_COL - 0x00222222, icon_h, folder.x / 2, folder.y / 2, folder.w / 2, folder.h / 2);
  123. ui._x += 5 * UI_SCALE();
  124. ui._y = _y_bottom;
  125. }
  126. return result;
  127. }
  128. function ui_menu_sub_button(handle: ui_handle_t, text: string): bool {
  129. ui.is_hovered = false;
  130. ui_menu_button(text, ">");
  131. if (ui.is_hovered) {
  132. ui_menu_sub_handle = handle;
  133. }
  134. else if (math_abs(ui.input_dy) > ui.input_dx && ui.input_x < ui._x + ui._w) {
  135. ui_menu_sub_handle = null;
  136. }
  137. return ui_menu_sub_handle == handle;
  138. }
  139. function ui_menu_label(text: string, shortcut: string = null) {
  140. let _y: i32 = ui._y;
  141. let _TEXT_COL: i32 = ui.ops.theme.TEXT_COL;
  142. ui.ops.theme.TEXT_COL = ui.ops.theme.LABEL_COL;
  143. ui_text(text);
  144. if (shortcut != null) {
  145. ui._y = _y;
  146. ui_text(shortcut, ui_align_t.RIGHT);
  147. }
  148. ui.ops.theme.TEXT_COL = _TEXT_COL;
  149. }
  150. function ui_menu_align() {
  151. if (!config_raw.touch_ui) {
  152. let row: f32[] = [ 12 / 100, 88 / 100 ];
  153. ui_row(row);
  154. ui_end_element();
  155. }
  156. }
  157. function ui_menu_begin() {
  158. ui_draw_shadow(ui._x, ui._y, ui._w, ui_menu_h);
  159. draw_set_color(ui.ops.theme.SEPARATOR_COL);
  160. ui_draw_rect(true, ui._x, ui._y, ui._w, ui_menu_h);
  161. draw_set_color(0xffffffff);
  162. }
  163. function ui_menu_end() {}
  164. function ui_menu_sub_begin(items: i32) {
  165. ui_menu_sub_x = ui._x;
  166. ui_menu_sub_y = ui._y;
  167. ui._x += ui._w + 2;
  168. ui._y -= UI_ELEMENT_H();
  169. ui_draw_shadow(ui._x, ui._y, ui._w, UI_ELEMENT_H() * items);
  170. draw_set_color(ui.ops.theme.SEPARATOR_COL);
  171. ui_draw_rect(true, ui._x, ui._y, ui._w, UI_ELEMENT_H() * items);
  172. draw_set_color(0xffffffff);
  173. }
  174. function ui_menu_sub_end() {
  175. ui._x = ui_menu_sub_x;
  176. ui._y = ui_menu_sub_y;
  177. }