ui_toolbar.ts 7.9 KB

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