ui_toolbar.ts 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226
  1. let ui_toolbar_default_w: i32 = 36;
  2. let ui_toolbar_handle: ui_handle_t = ui_handle_create();
  3. let ui_toolbar_last_tool: i32 = 0;
  4. let ui_toolbar_tool_names: string[] = [
  5. _tr("Brush"),
  6. _tr("Eraser"),
  7. _tr("Fill"),
  8. _tr("Decal"),
  9. _tr("Text"),
  10. _tr("Clone"),
  11. _tr("Blur"),
  12. _tr("Smudge"),
  13. _tr("Particle"),
  14. _tr("ColorID"),
  15. _tr("Picker"),
  16. _tr("Bake"),
  17. _tr("Material"),
  18. _tr("Gizmo"),
  19. ];
  20. let ui_toolbar_tooltip_extras: string[] = [
  21. _tr("Hold {action_paint} to paint\nHold {brush_ruler} and press {action_paint} to paint a straight line (ruler mode)"),
  22. _tr("Hold {action_paint} to erase\nHold {brush_ruler} and press {action_paint} to erase a straight line (ruler mode)"),
  23. "",
  24. _tr("Hold {decal_mask} to paint on a decal mask"),
  25. _tr("Hold {decal_mask} to use the text as a mask"),
  26. _tr("Hold {set_clone_source} to set source"),
  27. "",
  28. "",
  29. "",
  30. "",
  31. "",
  32. "",
  33. "",
  34. "",
  35. ];
  36. let _ui_toolbar_i: i32;
  37. function ui_toolbar_init() {}
  38. function ui_toolbar_draw_tool(tool: i32, img: gpu_texture_t, icon_accent: i32) {
  39. ui._x += 2;
  40. if (context_raw.tool == tool) {
  41. ui_toolbar_draw_highlight();
  42. }
  43. let tile_y: i32 = math_floor(tool / 12);
  44. let tile_x: i32 = tile_y % 2 == 0 ? tool % 12 : (11 - (tool % 12));
  45. let tile_i: i32 = tile_y * 12 + tile_x;
  46. let rect: rect_t = resource_tile50(img, tile_i);
  47. let _y: i32 = ui._y;
  48. let visible: bool = true;
  49. if (context_is_floating_toolbar()) {
  50. let statush: i32 = config_raw.layout[layout_size_t.STATUS_H];
  51. let statusy: i32 = iron_window_height() - statush;
  52. visible = ui._y + ui._w * 2 < statusy;
  53. }
  54. let image_state: ui_state_t = ui_sub_image(img, icon_accent, -1.0, rect.x, rect.y, rect.w, rect.h);
  55. if (image_state == ui_state_t.STARTED && visible) {
  56. _ui_toolbar_i = tool;
  57. sys_notify_on_next_frame(function() {
  58. context_select_tool(_ui_toolbar_i);
  59. });
  60. }
  61. else if (image_state == ui_state_t.RELEASED && context_is_floating_toolbar() && visible) {
  62. if (ui_toolbar_last_tool == tool) {
  63. ui_toolbar_tool_properties_menu();
  64. }
  65. ui_toolbar_last_tool = tool;
  66. }
  67. if (tool == tool_type_t.COLORID && context_raw.colorid_picked) {
  68. let rt: render_target_t = map_get(render_path_render_targets, "texpaint_colorid");
  69. draw_scaled_sub_image(rt._image, 0, 0, 1, 1, 0, _y + 1.5 * UI_SCALE(), 5 * UI_SCALE(), 34 * UI_SCALE());
  70. }
  71. if (ui.is_hovered) {
  72. let tooltip: string = tr(ui_toolbar_tool_names[tool]);
  73. let key: string = map_get(config_keymap, "tool_" + to_lower_case(ui_toolbar_tool_names[tool]));
  74. if (key != "") {
  75. tooltip += " (" + key + ")";
  76. }
  77. let extra: string = ui_toolbar_tooltip_extras[tool];
  78. if (extra != "") {
  79. tooltip += " - " + tr(extra, config_keymap);
  80. }
  81. ui_tooltip(tooltip);
  82. }
  83. ui._x -= 2;
  84. ui._y += 2;
  85. }
  86. function ui_toolbar_w(screen_size_request: bool = false): i32 {
  87. if (screen_size_request && context_is_floating_toolbar()) {
  88. return 0;
  89. }
  90. if (!base_view3d_show && !ui_view2d_show) {
  91. return 0;
  92. }
  93. let w: i32 = ui_toolbar_default_w;
  94. if (config_raw.touch_ui) {
  95. w = ui_toolbar_default_w + 6;
  96. }
  97. w = math_floor(w * config_raw.window_scale);
  98. return w;
  99. }
  100. function ui_toolbar_x(): i32 {
  101. return 5 * UI_SCALE();
  102. }
  103. function ui_toolbar_render_ui() {
  104. let x: i32 = 0;
  105. let y: i32 = ui_header_h;
  106. let h: i32 = iron_window_height() - ui_header_h - config_raw.layout[layout_size_t.STATUS_H];
  107. let _WINDOW_BG_COL: i32 = ui.ops.theme.WINDOW_BG_COL;
  108. if (!base_view3d_show && !ui_view2d_show) {
  109. return;
  110. }
  111. if (!base_view3d_show && ui_view2d_show && ui_view2d_type != view_2d_type_t.LAYER) {
  112. return;
  113. }
  114. if (context_is_floating_toolbar()) {
  115. x += ui_toolbar_x();
  116. y += ui_toolbar_x() + 3 * UI_SCALE();
  117. h = (ui_toolbar_tool_names.length + 1) * (ui_toolbar_w() + 2);
  118. ui.ops.theme.WINDOW_BG_COL = ui.ops.theme.SEPARATOR_COL;
  119. if (!base_view3d_show && ui_view2d_show) {
  120. y += ui_toolbar_w();
  121. }
  122. }
  123. if (ui_window(ui_toolbar_handle, x, y, ui_toolbar_w(), h)) {
  124. ui._y -= 4 * UI_SCALE();
  125. ui.image_scroll_align = false;
  126. let img: gpu_texture_t = resource_get("icons.k");
  127. let col: u32 = ui.ops.theme.WINDOW_BG_COL;
  128. let light: bool = col > 0xff666666;
  129. let icon_accent: i32 = light ? 0xff666666 : -1;
  130. // Properties icon
  131. if (!context_is_floating_toolbar()) {
  132. let rect: rect_t = resource_tile50(img, icon_t.PROPERTIES);
  133. if (ui_sub_image(img, light ? 0xff666666 : ui.ops.theme.BUTTON_COL, -1.0, rect.x, rect.y, rect.w, rect.h) == ui_state_t.RELEASED) {
  134. config_raw.layout[layout_size_t.HEADER] = 0;
  135. }
  136. }
  137. // Draw ">" button if header is hidden
  138. else {
  139. let _ELEMENT_H: i32 = ui.ops.theme.ELEMENT_H;
  140. let _BUTTON_H: i32 = ui.ops.theme.BUTTON_H;
  141. let _BUTTON_COL: i32 = ui.ops.theme.BUTTON_COL;
  142. let _fontOffsetY: i32 = ui.font_offset_y;
  143. ui.ops.theme.ELEMENT_H = math_floor(ui.ops.theme.ELEMENT_H * 1.5);
  144. ui.ops.theme.BUTTON_H = ui.ops.theme.ELEMENT_H;
  145. ui.ops.theme.BUTTON_COL = ui.ops.theme.WINDOW_BG_COL;
  146. let font_height: i32 = draw_font_height(ui.ops.font, ui.font_size);
  147. ui.font_offset_y = (UI_ELEMENT_H() - font_height) / 2;
  148. let _w: i32 = ui._w;
  149. ui._w = ui_toolbar_w();
  150. if (ui_button(">")) {
  151. ui_toolbar_tool_properties_menu();
  152. }
  153. ui._w = _w;
  154. ui.ops.theme.ELEMENT_H = _ELEMENT_H;
  155. ui.ops.theme.BUTTON_H = _BUTTON_H;
  156. ui.ops.theme.BUTTON_COL = _BUTTON_COL;
  157. ui.font_offset_y = _fontOffsetY;
  158. }
  159. if (ui.is_hovered) {
  160. ui_tooltip(tr("Toggle header"));
  161. }
  162. ui._y -= 4 * UI_SCALE();
  163. for (let i: i32 = 0; i < ui_toolbar_tool_names.length; ++i) {
  164. ui_toolbar_draw_tool(i, img, icon_accent);
  165. }
  166. ui.image_scroll_align = true;
  167. }
  168. if (context_is_floating_toolbar()) {
  169. ui.ops.theme.WINDOW_BG_COL = _WINDOW_BG_COL;
  170. }
  171. if (config_raw.touch_ui) {
  172. // Hide scrollbar
  173. let _SCROLL_W: i32 = ui.ops.theme.SCROLL_W;
  174. ui.ops.theme.SCROLL_W = 0;
  175. ui_end_window();
  176. ui.ops.theme.SCROLL_W = _SCROLL_W;
  177. }
  178. }
  179. function ui_toolbar_tool_properties_menu() {
  180. let y: i32 = ui._y - 2 * UI_SCALE();
  181. if (!base_view3d_show) {
  182. y += ui_toolbar_w();
  183. }
  184. ui_menu_draw(function() {
  185. ui.changed = false;
  186. ui_header_draw_tool_properties();
  187. if (ui.changed || ui.is_typing) {
  188. ui_menu_keep_open = true;
  189. }
  190. if (base_view3d_show && ui_button(tr("Pin to Header"), ui_align_t.LEFT)) {
  191. config_raw.layout[layout_size_t.HEADER] = 1;
  192. }
  193. }, ui._x + ui._w + 6 * UI_SCALE(), y);
  194. }
  195. function ui_toolbar_draw_highlight() {
  196. let size: i32 = ui_toolbar_w() - 4;
  197. draw_set_color(ui.ops.theme.HIGHLIGHT_COL);
  198. ui_draw_rect(true, ui._x + -1, ui._y + 2, size + 2, size + 2);
  199. }