ui_menubar.ts 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212
  1. let ui_menubar_default_w: i32 = 330;
  2. let ui_menubar_workspace_handle: zui_handle_t = zui_handle_create();
  3. let ui_menubar_menu_handle: zui_handle_t = zui_handle_create();
  4. let ui_menubar_w: i32 = ui_menubar_default_w;
  5. ///if is_lab
  6. let _ui_menubar_saved_camera: mat4_t = null;
  7. let _ui_menubar_plane: mesh_object_t = null;
  8. ///end
  9. function ui_menubar_init() {
  10. ui_menubar_workspace_handle.layout = zui_layout_t.HORIZONTAL;
  11. ui_menubar_menu_handle.layout = zui_layout_t.HORIZONTAL;
  12. }
  13. function ui_menubar_render_ui() {
  14. let ui: zui_t = ui_base_ui;
  15. ///if (is_paint || is_sculpt)
  16. let panelx: i32 = app_x() - ui_toolbar_w;
  17. ///end
  18. ///if is_lab
  19. let panelx: i32 = app_x();
  20. ///end
  21. if (zui_window(ui_menubar_menu_handle, panelx, 0, ui_menubar_w, ui_header_h)) {
  22. ui._x += 1; // Prevent "File" button highlight on startup
  23. zui_begin_menu();
  24. if (config_raw.touch_ui) {
  25. ///if (is_paint || is_sculpt)
  26. ui._w = ui_toolbar_w;
  27. ///end
  28. ///if is_lab
  29. ui._w = 36;
  30. ///end
  31. if (ui_menubar_icon_button(ui, 0, 2)) box_preferences_show();
  32. if (ui_menubar_icon_button(ui, 0, 3)) {
  33. ///if (krom_android || krom_ios)
  34. console_toast(tr("Saving project"));
  35. project_save();
  36. ///end
  37. app_notify_on_next_frame(function () {
  38. box_projects_show();
  39. });
  40. }
  41. if (ui_menubar_icon_button(ui, 4, 2)) {
  42. project_import_asset();
  43. }
  44. ///if (is_paint || is_lab)
  45. if (ui_menubar_icon_button(ui, 5, 2)) {
  46. box_export_show_textures();
  47. }
  48. ///end
  49. let size: i32 = math_floor(ui._w / zui_SCALE(ui));
  50. if (ui_menu_show && ui_menu_category == menu_category_t.VIEWPORT) {
  51. zui_fill(0, -6, size, size - 4, ui.ops.theme.HIGHLIGHT_COL);
  52. }
  53. if (ui_menubar_icon_button(ui, 8, 2)) {
  54. ui_menubar_show_menu(ui, menu_category_t.VIEWPORT);
  55. }
  56. if (ui_menu_show && ui_menu_category == menu_category_t.MODE) {
  57. zui_fill(0, -6, size, size - 4, ui.ops.theme.HIGHLIGHT_COL);
  58. }
  59. if (ui_menubar_icon_button(ui, 9, 2)) {
  60. ui_menubar_show_menu(ui, menu_category_t.MODE);
  61. }
  62. if (ui_menu_show && ui_menu_category == menu_category_t.CAMERA) {
  63. zui_fill(0, -6, size, size - 4, ui.ops.theme.HIGHLIGHT_COL);
  64. }
  65. if (ui_menubar_icon_button(ui, 10, 2)) {
  66. ui_menubar_show_menu(ui, menu_category_t.CAMERA);
  67. }
  68. if (ui_menu_show && ui_menu_category == menu_category_t.HELP) {
  69. zui_fill(0, -6, size, size - 4, ui.ops.theme.HIGHLIGHT_COL);
  70. }
  71. if (ui_menubar_icon_button(ui, 11, 2)) {
  72. ui_menubar_show_menu(ui, menu_category_t.HELP);
  73. }
  74. ui.enabled = history_undos > 0;
  75. if (ui_menubar_icon_button(ui, 6, 2)) {
  76. history_undo();
  77. }
  78. ui.enabled = history_redos > 0;
  79. if (ui_menubar_icon_button(ui, 7, 2)) {
  80. history_redo();
  81. }
  82. ui.enabled = true;
  83. }
  84. else {
  85. let categories: string[] = [tr("File"), tr("Edit"), tr("Viewport"), tr("Mode"), tr("Camera"), tr("Help")];
  86. for (let i: i32 = 0; i < categories.length; ++i) {
  87. if (zui_menu_button(categories[i]) || (ui_menu_show && ui_menu_commands == null && ui.is_hovered)) {
  88. ui_menubar_show_menu(ui, i);
  89. }
  90. }
  91. }
  92. if (ui_menubar_w < ui._x + 10) {
  93. ui_menubar_w = math_floor(ui._x + 10);
  94. ///if (is_paint || is_sculpt)
  95. ui_toolbar_handle.redraws = 2;
  96. ///end
  97. }
  98. zui_end_menu();
  99. }
  100. let nodesw: i32 = (ui_nodes_show || ui_view2d_show) ? config_raw.layout[layout_size_t.NODES_W] : 0;
  101. ///if (is_paint || is_sculpt)
  102. let ww: i32 = sys_width() - config_raw.layout[layout_size_t.SIDEBAR_W] - ui_menubar_w - nodesw;
  103. panelx = (app_x() - ui_toolbar_w) + ui_menubar_w;
  104. ///else
  105. let ww: i32 = sys_width() - ui_menubar_w - nodesw;
  106. panelx = (app_x()) + ui_menubar_w;
  107. ///end
  108. if (zui_window(ui_menubar_workspace_handle, panelx, 0, ww, ui_header_h)) {
  109. if (!config_raw.touch_ui) {
  110. zui_tab(ui_header_worktab, tr("3D View"));
  111. }
  112. else {
  113. zui_fill(0, 0, ui._window_w, ui._window_h + 4, ui.ops.theme.SEPARATOR_COL);
  114. }
  115. ///if is_lab
  116. zui_tab(ui_header_worktab, tr("2D View"));
  117. if (ui_header_worktab.changed) {
  118. context_raw.ddirty = 2;
  119. context_raw.brush_blend_dirty = true;
  120. ui_header_handle.redraws = 2;
  121. context_main_object().skip_context = null;
  122. if (ui_header_worktab.position == space_type_t.SPACE3D) {
  123. if (_ui_menubar_saved_camera != null) {
  124. transform_set_matrix(scene_camera.base.transform, _ui_menubar_saved_camera);
  125. _ui_menubar_saved_camera = null;
  126. }
  127. scene_meshes = [context_main_object()];
  128. }
  129. else { // Space2D
  130. if (_ui_menubar_plane == null) {
  131. let mesh: any = geom_make_plane(1, 1, 2, 2);
  132. let raw: any = {
  133. name: "2DView",
  134. vertex_arrays: [
  135. { values: mesh.posa, attrib: "pos", data: "short4norm" },
  136. { values: mesh.nora, attrib: "nor", data: "short2norm" },
  137. { values: mesh.texa, attrib: "tex", data: "short2norm" }
  138. ],
  139. index_arrays: [
  140. { values: mesh.inda, material: 0 }
  141. ],
  142. scale_pos: mesh.scale_pos,
  143. scale_tex: mesh.scale_tex
  144. };
  145. let md: mesh_data_t = mesh_data_create(raw);
  146. let dot_plane: mesh_object_t = scene_get_child(".Plane").ext;
  147. _ui_menubar_plane = mesh_object_create(md, dot_plane.materials);
  148. array_remove(scene_meshes, _ui_menubar_plane);
  149. }
  150. if (_ui_menubar_saved_camera == null) {
  151. _ui_menubar_saved_camera = mat4_clone(scene_camera.base.transform.local);
  152. }
  153. scene_meshes = [_ui_menubar_plane];
  154. let m: mat4_t = mat4_identity();
  155. mat4_translate(m, 0, 0, 1.6);
  156. transform_set_matrix(scene_camera.base.transform, m);
  157. }
  158. ///if (krom_direct3d12 || krom_vulkan || krom_metal)
  159. render_path_raytrace_ready = false;
  160. ///end
  161. }
  162. ///end
  163. }
  164. }
  165. function ui_menubar_show_menu(ui: zui_t, category: i32) {
  166. ui_menu_show = true;
  167. ui_menu_commands = null;
  168. ui_menu_category = category;
  169. ui_menu_category_w = ui._w;
  170. ui_menu_category_h = math_floor(zui_MENUBAR_H(ui));
  171. ui_menu_x = math_floor(ui._x - ui._w);
  172. ui_menu_y = math_floor(zui_MENUBAR_H(ui));
  173. if (config_raw.touch_ui) {
  174. let menuW: i32 = math_floor(base_default_element_w * zui_SCALE(base_ui_menu) * 2.0);
  175. ui_menu_x -= math_floor((menuW - ui._w) / 2) + math_floor(ui_header_h / 2);
  176. ui_menu_x += math_floor(2 * zui_SCALE(base_ui_menu));
  177. ui_menu_y -= math_floor(2 * zui_SCALE(base_ui_menu));
  178. ui_menu_keep_open = true;
  179. }
  180. }
  181. function ui_menubar_icon_button(ui: zui_t, i: i32, j: i32): bool {
  182. let col: i32 = ui.ops.theme.WINDOW_BG_COL;
  183. if (col < 0) {
  184. col += 4294967296;
  185. }
  186. let light: bool = col > (0xff666666 + 4294967296);
  187. let icon_accent: i32 = light ? 0xff666666 : 0xffaaaaaa;
  188. let img: image_t = resource_get("icons.k");
  189. let rect: rect_t = resource_tile50(img, i, j);
  190. return zui_image(img, icon_accent, -1.0, rect.x, rect.y, rect.w, rect.h) == zui_state_t.RELEASED;
  191. }