ui_toolbar.ts 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231
  1. ///if (is_paint || is_sculpt)
  2. let ui_toolbar_default_w: i32 = 36;
  3. let ui_toolbar_handle: zui_handle_t = zui_handle_create();
  4. let ui_toolbar_w: i32 = ui_toolbar_default_w;
  5. let ui_toolbar_last_tool: i32 = 0;
  6. let ui_toolbar_tool_names: string[] = [
  7. _tr("Brush"),
  8. _tr("Eraser"),
  9. _tr("Fill"),
  10. _tr("Decal"),
  11. _tr("Text"),
  12. _tr("Clone"),
  13. _tr("Blur"),
  14. _tr("Smudge"),
  15. _tr("Particle"),
  16. _tr("ColorID"),
  17. _tr("Picker"),
  18. _tr("Bake"),
  19. _tr("Gizmo"),
  20. _tr("Material"),
  21. ];
  22. function ui_toolbar_init() {
  23. }
  24. let _ui_toolbar_i: i32;
  25. function ui_toolbar_draw_tool(i: i32, ui: zui_t, img: image_t, icon_accent: i32, keys: string[]) {
  26. ui._x += 2;
  27. if (context_raw.tool == i) {
  28. ui_toolbar_draw_highlight();
  29. }
  30. let tile_y: i32 = math_floor(i / 12);
  31. let tile_x: i32 = tile_y % 2 == 0 ? i % 12 : (11 - (i % 12));
  32. let rect: rect_t = resource_tile50(img, tile_x, tile_y);
  33. let _y: i32 = ui._y;
  34. let image_state: zui_state_t = zui_image(img, icon_accent, -1.0, rect.x, rect.y, rect.w, rect.h);
  35. if (image_state == zui_state_t.STARTED) {
  36. _ui_toolbar_i = i;
  37. app_notify_on_next_frame(function() {
  38. context_select_tool(_ui_toolbar_i);
  39. });
  40. }
  41. else if (image_state == zui_state_t.RELEASED && config_raw.layout[layout_size_t.HEADER] == 0) {
  42. if (ui_toolbar_last_tool == i) {
  43. ui_toolbar_tool_properties_menu();
  44. }
  45. ui_toolbar_last_tool = i;
  46. }
  47. ///if is_paint
  48. if (i == workspace_tool_t.COLORID && context_raw.colorid_picked) {
  49. g2_draw_scaled_sub_image(map_get(render_path_render_targets, "texpaint_colorid")._image, 0, 0, 1, 1, 0, _y + 1.5 * zui_SCALE(ui), 5 * zui_SCALE(ui), 34 * zui_SCALE(ui));
  50. }
  51. ///end
  52. if (ui.is_hovered) {
  53. zui_tooltip(tr(ui_toolbar_tool_names[i]) + " " + keys[i]);
  54. }
  55. ui._x -= 2;
  56. ui._y += 2;
  57. }
  58. function ui_toolbar_render_ui() {
  59. let ui: zui_t = ui_base_ui;
  60. if (config_raw.touch_ui) {
  61. ui_toolbar_w = ui_toolbar_default_w + 6;
  62. }
  63. else {
  64. ui_toolbar_w = ui_toolbar_default_w;
  65. }
  66. ui_toolbar_w = math_floor(ui_toolbar_w * zui_SCALE(ui));
  67. if (zui_window(ui_toolbar_handle, 0, ui_header_h, ui_toolbar_w, sys_height() - ui_header_h)) {
  68. ui._y -= 4 * zui_SCALE(ui);
  69. ui.image_scroll_align = false;
  70. let img: image_t = resource_get("icons.k");
  71. let col: i32 = ui.ops.theme.WINDOW_BG_COL;
  72. if (col < 0) {
  73. col += 4294967296;
  74. }
  75. let light: bool = col > (0xff666666 + 4294967296);
  76. let icon_accent: i32 = light ? 0xff666666 : -1;
  77. // Properties icon
  78. if (config_raw.layout[layout_size_t.HEADER] == 1) {
  79. let rect: rect_t = resource_tile50(img, 7, 1);
  80. if (zui_image(img, light ? 0xff666666 : ui.ops.theme.BUTTON_COL, -1.0, rect.x, rect.y, rect.w, rect.h) == zui_state_t.RELEASED) {
  81. config_raw.layout[layout_size_t.HEADER] = 0;
  82. }
  83. }
  84. // Draw ">>" button if header is hidden
  85. else {
  86. let _ELEMENT_H: i32 = ui.ops.theme.ELEMENT_H;
  87. let _BUTTON_H: i32 = ui.ops.theme.BUTTON_H;
  88. let _BUTTON_COL: i32 = ui.ops.theme.BUTTON_COL;
  89. let _fontOffsetY: i32 = ui.font_offset_y;
  90. ui.ops.theme.ELEMENT_H = math_floor(ui.ops.theme.ELEMENT_H * 1.5);
  91. ui.ops.theme.BUTTON_H = ui.ops.theme.ELEMENT_H;
  92. ui.ops.theme.BUTTON_COL = ui.ops.theme.WINDOW_BG_COL;
  93. let font_height: i32 = g2_font_height(ui.ops.font, ui.font_size);
  94. ui.font_offset_y = (zui_ELEMENT_H(ui) - font_height) / 2;
  95. let _w: i32 = ui._w;
  96. ui._w = ui_toolbar_w;
  97. if (zui_button(">>")) {
  98. ui_toolbar_tool_properties_menu();
  99. }
  100. ui._w = _w;
  101. ui.ops.theme.ELEMENT_H = _ELEMENT_H;
  102. ui.ops.theme.BUTTON_H = _BUTTON_H;
  103. ui.ops.theme.BUTTON_COL = _BUTTON_COL;
  104. ui.font_offset_y = _fontOffsetY;
  105. }
  106. if (ui.is_hovered) {
  107. zui_tooltip(tr("Toggle header"));
  108. }
  109. ui._y -= 4 * zui_SCALE(ui);
  110. let vars_brush: map_t<string, string> = map_create();
  111. map_set(vars_brush, "key", map_get(config_keymap, "brush_ruler"));
  112. map_set(vars_brush, "action_paint", map_get(config_keymap, "action_paint"));
  113. let vars_decal: map_t<string, string> = map_create();
  114. map_set(vars_decal, "key", map_get(config_keymap, "decal_mask"));
  115. let vars_clone: map_t<string, string> = map_create();
  116. map_set(vars_clone, "key", map_get(config_keymap, "set_clone_source"));
  117. let keys: string[] = [
  118. "(" + map_get(config_keymap, "tool_brush") + ") - " + tr("Hold {action_paint} to paint\nHold {key} and press {action_paint} to paint a straight line (ruler mode)", vars_brush),
  119. "(" + map_get(config_keymap, "tool_eraser") + ") - " + tr("Hold {action_paint} to erase\nHold {key} and press {action_paint} to erase a straight line (ruler mode)", vars_brush),
  120. "(" + map_get(config_keymap, "tool_fill") + ")",
  121. "(" + map_get(config_keymap, "tool_decal") + ") - " + tr("Hold {key} to paint on a decal mask", vars_decal),
  122. "(" + map_get(config_keymap, "tool_text") + ") - " + tr("Hold {key} to use the text as a mask", vars_decal),
  123. "(" + map_get(config_keymap, "tool_clone") + ") - " + tr("Hold {key} to set source", vars_clone),
  124. "(" + map_get(config_keymap, "tool_blur") + ")",
  125. "(" + map_get(config_keymap, "tool_smudge") + ")",
  126. "(" + map_get(config_keymap, "tool_particle") + ")",
  127. "(" + map_get(config_keymap, "tool_colorid") + ")",
  128. "(" + map_get(config_keymap, "tool_picker") + ")",
  129. "(" + map_get(config_keymap, "tool_bake") + ")",
  130. "(" + map_get(config_keymap, "tool_gizmo") + ")",
  131. "(" + map_get(config_keymap, "tool_material") + ")",
  132. ];
  133. ui_toolbar_draw_tool(workspace_tool_t.BRUSH, ui, img, icon_accent, keys);
  134. ///if is_paint
  135. ui_toolbar_draw_tool(workspace_tool_t.ERASER, ui, img, icon_accent, keys);
  136. ui_toolbar_draw_tool(workspace_tool_t.FILL, ui, img, icon_accent, keys);
  137. ui_toolbar_draw_tool(workspace_tool_t.DECAL, ui, img, icon_accent, keys);
  138. ui_toolbar_draw_tool(workspace_tool_t.TEXT, ui, img, icon_accent, keys);
  139. ui_toolbar_draw_tool(workspace_tool_t.CLONE, ui, img, icon_accent, keys);
  140. ui_toolbar_draw_tool(workspace_tool_t.BLUR, ui, img, icon_accent, keys);
  141. ui_toolbar_draw_tool(workspace_tool_t.SMUDGE, ui, img, icon_accent, keys);
  142. ui_toolbar_draw_tool(workspace_tool_t.PARTICLE, ui, img, icon_accent, keys);
  143. ui_toolbar_draw_tool(workspace_tool_t.COLORID, ui, img, icon_accent, keys);
  144. ui_toolbar_draw_tool(workspace_tool_t.PICKER, ui, img, icon_accent, keys);
  145. ui_toolbar_draw_tool(workspace_tool_t.BAKE, ui, img, icon_accent, keys);
  146. ui_toolbar_draw_tool(workspace_tool_t.MATERIAL, ui, img, icon_accent, keys);
  147. ///end
  148. ///if is_forge
  149. ui_toolbar_draw_tool(workspace_tool_t.GIZMO, ui, img, icon_accent, keys);
  150. ///end
  151. ui.image_scroll_align = true;
  152. }
  153. if (config_raw.touch_ui) {
  154. // Hide scrollbar
  155. let _SCROLL_W: i32 = ui.ops.theme.SCROLL_W;
  156. ui.ops.theme.SCROLL_W = 0;
  157. zui_end_window();
  158. ui.ops.theme.SCROLL_W = _SCROLL_W;
  159. }
  160. }
  161. let _ui_toolbar_tool_properties_menu_x: i32;
  162. let _ui_toolbar_tool_properties_menu_y: i32;
  163. let _ui_toolbar_tool_properties_menu_w: i32;
  164. function ui_toolbar_tool_properties_menu() {
  165. let ui: zui_t = ui_base_ui;
  166. _ui_toolbar_tool_properties_menu_x = ui._x;
  167. _ui_toolbar_tool_properties_menu_y = ui._y;
  168. _ui_toolbar_tool_properties_menu_w = ui._w;
  169. ui_menu_draw(function (ui: zui_t) {
  170. let start_y: i32 = ui._y;
  171. ui.changed = false;
  172. ui_header_draw_tool_properties(ui);
  173. if (ui.changed) {
  174. ui_menu_keep_open = true;
  175. }
  176. if (zui_button(tr("Pin to Header"), zui_align_t.LEFT)) {
  177. config_raw.layout[layout_size_t.HEADER] = 1;
  178. }
  179. let h: i32 = ui._y - start_y;
  180. ui_menu_elements = math_floor(h / zui_ELEMENT_H(ui));
  181. ui_menu_x = math_floor(_ui_toolbar_tool_properties_menu_x + _ui_toolbar_tool_properties_menu_w + 2);
  182. ui_menu_y = math_floor(_ui_toolbar_tool_properties_menu_y - 6 * zui_SCALE(ui));
  183. ui_menu_fit_to_screen();
  184. }, 0);
  185. // First draw out of screen, then align the menu based on menu height
  186. ui_menu_x = -sys_width();
  187. ui_menu_y = -sys_height();
  188. }
  189. function ui_toolbar_draw_highlight() {
  190. let ui: zui_t = ui_base_ui;
  191. let size: i32 = ui_toolbar_w - 4;
  192. g2_set_color(ui.ops.theme.HIGHLIGHT_COL);
  193. zui_draw_rect(true, ui._x + -1, ui._y + 2, size + 2, size + 2);
  194. }
  195. ///end