2024-03-11 15:10:18 +01:00
2024-11-07 18:15:01 +01:00
///if is_lab
let ui_toolbar_default_w : i32 = 0 ;
///else
2024-03-11 15:10:18 +01:00
let ui_toolbar_default_w : i32 = 36 ;
2024-11-07 18:15:01 +01:00
///end
2024-03-11 15:10:18 +01:00
2024-09-03 15:52:05 +02:00
let ui_toolbar_handle : ui_handle_t = ui_handle_create ();
2024-03-11 15:10:18 +01:00
let ui_toolbar_last_tool : i32 = 0 ;
let ui_toolbar_tool_names : string [] = [
_tr ( "Brush" ),
_tr ( "Eraser" ),
_tr ( "Fill" ),
_tr ( "Decal" ),
_tr ( "Text" ),
_tr ( "Clone" ),
_tr ( "Blur" ),
_tr ( "Smudge" ),
_tr ( "Particle" ),
_tr ( "ColorID" ),
_tr ( "Picker" ),
_tr ( "Bake" ),
_tr ( "Gizmo" ),
_tr ( "Material" ),
];
2024-11-08 23:46:39 +01:00
let _ui_toolbar_i : i32 ;
2024-03-11 15:10:18 +01:00
function ui_toolbar_init() {
}
2025-06-19 19:55:16 +02:00
function ui_toolbar_draw_tool ( i : i32 , ui : ui_t , img : gpu_texture_t , icon_accent : i32 , keys : string []) {
2024-04-07 09:52:45 +02:00
ui . _x += 2 ;
if ( context_raw . tool == i ) {
ui_toolbar_draw_highlight ();
}
let tile_y : i32 = math_floor ( i / 12 );
let tile_x : i32 = tile_y % 2 == 0 ? i % 12 : ( 11 - ( i % 12 ));
let rect : rect_t = resource_tile50 ( img , tile_x , tile_y );
let _y : i32 = ui . _y ;
2025-08-04 19:34:53 +02:00
let image_state : ui_state_t = ui_sub_image ( img , icon_accent , - 1.0 , rect . x , rect . y , rect . w , rect . h );
2024-09-03 15:52:05 +02:00
if ( image_state == ui_state_t . STARTED ) {
2024-04-07 09:52:45 +02:00
_ui_toolbar_i = i ;
2025-03-11 19:49:42 +01:00
sys_notify_on_next_frame ( function () {
2024-04-07 09:52:45 +02:00
context_select_tool ( _ui_toolbar_i );
});
}
2024-09-03 15:52:05 +02:00
else if ( image_state == ui_state_t . RELEASED && config_raw . layout [ layout_size_t . HEADER ] == 0 ) {
2024-04-07 09:52:45 +02:00
if ( ui_toolbar_last_tool == i ) {
ui_toolbar_tool_properties_menu ();
}
ui_toolbar_last_tool = i ;
}
///if is_paint
2025-08-07 19:43:11 +02:00
if ( i == tool_type_t . COLORID && context_raw . colorid_picked ) {
2024-05-03 21:29:39 +02:00
let rt : render_target_t = map_get ( render_path_render_targets , "texpaint_colorid" );
2025-03-02 19:44:26 +01:00
draw_scaled_sub_image ( rt . _image , 0 , 0 , 1 , 1 , 0 , _y + 1.5 * ui_SCALE ( ui ), 5 * ui_SCALE ( ui ), 34 * ui_SCALE ( ui ));
2024-04-07 09:52:45 +02:00
}
///end
if ( ui . is_hovered ) {
2024-09-03 15:52:05 +02:00
ui_tooltip ( tr ( ui_toolbar_tool_names [ i ]) + " " + keys [ i ]);
2024-04-07 09:52:45 +02:00
}
ui . _x -= 2 ;
ui . _y += 2 ;
}
2025-07-18 23:37:51 +02:00
function ui_toolbar_w ( screen_size_request : bool = false ) : i32 {
if ( screen_size_request && context_is_floating_toolbar ()) {
return 0 ;
}
2024-03-11 15:10:18 +01:00
2025-01-09 15:47:57 +01:00
let w : i32 = 0 ;
2024-03-11 15:10:18 +01:00
if ( config_raw . touch_ui ) {
2025-01-09 15:47:57 +01:00
w = ui_toolbar_default_w + 6 ;
2024-03-11 15:10:18 +01:00
}
else {
2025-01-09 15:47:57 +01:00
w = ui_toolbar_default_w ;
2024-03-11 15:10:18 +01:00
}
2025-07-18 23:37:51 +02:00
w = math_floor ( w * config_raw . window_scale );
2025-01-09 15:47:57 +01:00
return w ;
}
2025-07-18 23:37:51 +02:00
function ui_toolbar_x () : i32 {
2025-01-12 15:44:22 +01:00
let ui : ui_t = ui_base_ui ;
return 5 * ui_SCALE ( ui );
}
2025-01-09 15:47:57 +01:00
function ui_toolbar_render_ui() {
let ui : ui_t = ui_base_ui ;
let x : i32 = 0 ;
let y : i32 = ui_header_h ;
2025-03-09 17:02:12 +01:00
let h : i32 = iron_window_height () - ui_header_h ;
2025-01-09 15:47:57 +01:00
let _WINDOW_BG_COL : i32 = ui . ops . theme . WINDOW_BG_COL ;
2025-01-12 15:44:22 +01:00
if ( context_is_floating_toolbar ()) {
2025-07-18 23:37:51 +02:00
x += ui_toolbar_x ();
y += ui_toolbar_x ();
2025-08-08 14:09:48 +02:00
h = ( ui_toolbar_tool_names . length + 1 ) * ( ui_toolbar_w () + 2 );
2025-01-09 15:47:57 +01:00
ui . ops . theme . WINDOW_BG_COL = ui . ops . theme . SEPARATOR_COL ;
}
2025-07-18 23:37:51 +02:00
if ( ui_window ( ui_toolbar_handle , x , y , ui_toolbar_w (), h )) {
2024-09-03 15:52:05 +02:00
ui . _y -= 4 * ui_SCALE ( ui );
2024-03-11 15:10:18 +01:00
ui . image_scroll_align = false ;
2025-06-19 19:55:16 +02:00
let img : gpu_texture_t = resource_get ( "icons.k" );
2024-03-11 15:10:18 +01:00
2024-05-08 21:17:02 +02:00
let col : u32 = ui . ops . theme . WINDOW_BG_COL ;
let light : bool = col > 0xff666666 ;
2024-03-11 15:10:18 +01:00
let icon_accent : i32 = light ? 0xff666666 : - 1 ;
// Properties icon
if ( config_raw . layout [ layout_size_t . HEADER ] == 1 ) {
let rect : rect_t = resource_tile50 ( img , 7 , 1 );
2025-08-04 19:34:53 +02:00
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 ) {
2024-03-11 15:10:18 +01:00
config_raw . layout [ layout_size_t . HEADER ] = 0 ;
}
}
// Draw ">>" button if header is hidden
else {
2024-04-10 19:39:17 +02:00
let _ELEMENT_H : i32 = ui . ops . theme . ELEMENT_H ;
let _BUTTON_H : i32 = ui . ops . theme . BUTTON_H ;
let _BUTTON_COL : i32 = ui . ops . theme . BUTTON_COL ;
2024-03-11 15:10:18 +01:00
let _fontOffsetY : i32 = ui . font_offset_y ;
2024-04-10 19:39:17 +02:00
ui . ops . theme . ELEMENT_H = math_floor ( ui . ops . theme . ELEMENT_H * 1.5 );
ui . ops . theme . BUTTON_H = ui . ops . theme . ELEMENT_H ;
ui . ops . theme . BUTTON_COL = ui . ops . theme . WINDOW_BG_COL ;
2025-03-10 20:26:45 +01:00
let font_height : i32 = draw_font_height ( ui . ops . font , ui . font_size );
2024-09-03 15:52:05 +02:00
ui . font_offset_y = ( ui_ELEMENT_H ( ui ) - font_height ) / 2 ;
2024-03-11 15:10:18 +01:00
let _w : i32 = ui . _w ;
2025-07-18 23:37:51 +02:00
ui . _w = ui_toolbar_w ();
2024-03-11 15:10:18 +01:00
2024-09-03 15:52:05 +02:00
if ( ui_button ( ">>" )) {
2024-03-11 15:10:18 +01:00
ui_toolbar_tool_properties_menu ();
}
ui . _w = _w ;
2024-04-10 19:39:17 +02:00
ui . ops . theme . ELEMENT_H = _ELEMENT_H ;
ui . ops . theme . BUTTON_H = _BUTTON_H ;
ui . ops . theme . BUTTON_COL = _BUTTON_COL ;
2024-03-11 15:10:18 +01:00
ui . font_offset_y = _fontOffsetY ;
}
2024-03-20 16:13:54 +01:00
if ( ui . is_hovered ) {
2024-09-03 15:52:05 +02:00
ui_tooltip ( tr ( "Toggle header" ));
2024-03-20 16:13:54 +01:00
}
2024-09-03 15:52:05 +02:00
ui . _y -= 4 * ui_SCALE ( ui );
2024-03-11 15:10:18 +01:00
2024-03-21 21:06:41 +01:00
let vars_brush : map_t < string , string > = map_create ();
2024-04-08 17:40:32 +02:00
map_set ( vars_brush , "key" , map_get ( config_keymap , "brush_ruler" ));
map_set ( vars_brush , "action_paint" , map_get ( config_keymap , "action_paint" ));
2024-03-21 21:06:41 +01:00
let vars_decal : map_t < string , string > = map_create ();
2024-04-08 17:40:32 +02:00
map_set ( vars_decal , "key" , map_get ( config_keymap , "decal_mask" ));
2024-03-21 21:06:41 +01:00
let vars_clone : map_t < string , string > = map_create ();
2024-04-08 17:40:32 +02:00
map_set ( vars_clone , "key" , map_get ( config_keymap , "set_clone_source" ));
2024-03-21 21:06:41 +01:00
2024-05-03 21:29:39 +02:00
let key_tool_brush : string = map_get ( config_keymap , "tool_brush" );
let key_tool_eraser : string = map_get ( config_keymap , "tool_eraser" );
let key_tool_fill : string = map_get ( config_keymap , "tool_fill" );
let key_tool_decal : string = map_get ( config_keymap , "tool_decal" );
let key_tool_text : string = map_get ( config_keymap , "tool_text" );
let key_tool_clone : string = map_get ( config_keymap , "tool_clone" );
let key_tool_blur : string = map_get ( config_keymap , "tool_blur" );
let key_tool_smudge : string = map_get ( config_keymap , "tool_smudge" );
let key_tool_particle : string = map_get ( config_keymap , "tool_particle" );
let key_tool_colorid : string = map_get ( config_keymap , "tool_colorid" );
let key_tool_picker : string = map_get ( config_keymap , "tool_picker" );
let key_tool_bake : string = map_get ( config_keymap , "tool_bake" );
let key_tool_gizmo : string = map_get ( config_keymap , "tool_gizmo" );
let key_tool_material : string = map_get ( config_keymap , "tool_material" );
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 );
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 );
key_tool_fill = "(" + key_tool_fill + ")" ;
key_tool_decal = "(" + key_tool_decal + ") - " + tr ( "Hold {key} to paint on a decal mask" , vars_decal );
key_tool_text = "(" + key_tool_text + ") - " + tr ( "Hold {key} to use the text as a mask" , vars_decal );
key_tool_clone = "(" + key_tool_clone + ") - " + tr ( "Hold {key} to set source" , vars_clone );
key_tool_blur = "(" + key_tool_blur + ")" ;
key_tool_smudge = "(" + key_tool_smudge + ")" ;
key_tool_particle = "(" + key_tool_particle + ")" ;
key_tool_colorid = "(" + key_tool_colorid + ")" ;
key_tool_picker = "(" + key_tool_picker + ")" ;
key_tool_bake = "(" + key_tool_bake + ")" ;
key_tool_gizmo = "(" + key_tool_gizmo + ")" ;
key_tool_material = "(" + key_tool_material + ")" ;
2024-03-11 15:10:18 +01:00
let keys : string [] = [
2024-05-03 21:29:39 +02:00
key_tool_brush ,
key_tool_eraser ,
key_tool_fill ,
key_tool_decal ,
key_tool_text ,
key_tool_clone ,
key_tool_blur ,
key_tool_smudge ,
key_tool_particle ,
key_tool_colorid ,
key_tool_picker ,
key_tool_bake ,
key_tool_gizmo ,
key_tool_material
2024-03-11 15:10:18 +01:00
];
2024-11-30 23:39:57 +01:00
ui_toolbar_ext_draw_tools ( ui , img , icon_accent , keys );
2024-03-11 15:10:18 +01:00
ui . image_scroll_align = true ;
}
2025-01-12 15:44:22 +01:00
if ( context_is_floating_toolbar ()) {
2025-01-09 15:47:57 +01:00
ui . ops . theme . WINDOW_BG_COL = _WINDOW_BG_COL ;
}
2024-03-11 15:10:18 +01:00
if ( config_raw . touch_ui ) {
// Hide scrollbar
2024-04-10 19:39:17 +02:00
let _SCROLL_W : i32 = ui . ops . theme . SCROLL_W ;
ui . ops . theme . SCROLL_W = 0 ;
2024-09-03 15:52:05 +02:00
ui_end_window ();
2024-04-10 19:39:17 +02:00
ui . ops . theme . SCROLL_W = _SCROLL_W ;
2024-03-11 15:10:18 +01:00
}
}
function ui_toolbar_tool_properties_menu() {
2024-09-03 15:52:05 +02:00
let ui : ui_t = ui_base_ui ;
ui_menu_draw ( function ( ui : ui_t ) {
2024-03-11 15:10:18 +01:00
ui . changed = false ;
ui_header_draw_tool_properties ( ui );
if ( ui . changed ) {
ui_menu_keep_open = true ;
}
2024-09-03 15:52:05 +02:00
if ( ui_button ( tr ( "Pin to Header" ), ui_align_t . LEFT )) {
2024-03-11 15:10:18 +01:00
config_raw . layout [ layout_size_t . HEADER ] = 1 ;
}
2024-09-11 16:32:12 +02:00
}, math_floor ( ui . _x + ui . _w + 2 ), math_floor ( ui . _y - 6 * ui_SCALE ( ui )));
2024-03-11 15:10:18 +01:00
}
function ui_toolbar_draw_highlight() {
2024-09-03 15:52:05 +02:00
let ui : ui_t = ui_base_ui ;
2025-07-18 23:37:51 +02:00
let size : i32 = ui_toolbar_w () - 4 ;
2025-03-02 21:07:17 +01:00
draw_set_color ( ui . ops . theme . HIGHLIGHT_COL );
2024-09-03 15:52:05 +02:00
ui_draw_rect ( true , ui . _x + - 1 , ui . _y + 2 , size + 2 , size + 2 );
2024-03-11 15:10:18 +01:00
}