Pixel-Composer/scripts/nodeValue_drawer/nodeValue_drawer.gml

356 lines
12 KiB
Plaintext
Raw Normal View History

2024-03-24 04:58:08 +01:00
enum INSP_VIEW_MODE {
compact,
spacious
}
2023-03-19 09:17:39 +01:00
function drawWidgetInit() {
anim_toggling = false;
anim_hold = noone;
visi_hold = noone;
min_w = ui(160);
2024-03-24 04:58:08 +01:00
viewMode = PREFERENCES.inspector_view_default;
2024-03-02 10:08:44 +01:00
tooltip_loop_type = new tooltipSelector(__txtx("panel_animation_looping_mode", "Looping mode"), global.junctionEndName);
2023-03-19 09:17:39 +01:00
}
2023-05-16 21:28:16 +02:00
function drawWidget(xx, yy, ww, _m, jun, global_var = true, _hover = false, _focus = false, _scrollPane = noone, rx = 0, ry = 0) {
var con_w = ww - ui(4);
var xc = xx + ww / 2;
2024-03-24 04:58:08 +01:00
var _font = viewMode == INSP_VIEW_MODE.spacious? f_p0 : f_p2;
2024-03-26 04:03:45 +01:00
var breakLine = viewMode == INSP_VIEW_MODE.spacious || jun.expUse;
var lb_h = line_get_height(_font) + ui(6);
2023-03-19 09:17:39 +01:00
var lb_y = yy + lb_h / 2;
2023-09-07 20:59:14 +02:00
var _name = jun.getName();
var wid = jun.editWidget;
switch(instanceof(wid)) { #region
case "textArea" :
case "controlPointBox" :
case "transformBox" :
breakLine = true;
} #endregion
2023-03-19 09:17:39 +01:00
var butx = xx;
if(jun.connect_type == JUNCTION_CONNECT.input && jun.isAnimable() && !jun.expUse) { #region animation
2023-10-18 14:58:55 +02:00
var index = jun.hasJunctionFrom()? 2 : jun.is_anim;
2023-11-24 10:41:53 +01:00
var cc = c_white;
if(jun.is_anim) cc = COLORS._main_value_positive;
if(index == 2) cc = COLORS._main_accent;
draw_sprite_ui_uniform(THEME.animate_clock, index, butx, lb_y, 1, cc, 0.8);
2023-03-19 09:17:39 +01:00
if(_hover && point_in_circle(_m[0], _m[1], butx, lb_y, ui(10))) {
if(anim_hold != noone)
2023-03-21 03:01:53 +01:00
jun.setAnim(anim_hold);
2023-03-19 09:17:39 +01:00
2023-04-08 20:06:27 +02:00
draw_sprite_ui_uniform(THEME.animate_clock, index, butx, lb_y, 1, index == 2? COLORS._main_accent : c_white, 1);
2023-10-18 14:58:55 +02:00
TOOLTIP = jun.hasJunctionFrom()? __txtx("panel_inspector_remove_link", "Remove link") : __txtx("panel_inspector_toggle_anim", "Toggle animation");
2023-03-19 09:17:39 +01:00
if(mouse_press(mb_left, _focus)) {
if(jun.value_from != noone)
jun.removeFrom();
else {
recordAction(ACTION_TYPE.var_modify, jun.animator, [ jun.is_anim, "is_anim", _name + " animation" ]);
2023-03-21 03:01:53 +01:00
jun.setAnim(!jun.is_anim);
anim_hold = jun.is_anim;
2023-03-19 09:17:39 +01:00
}
}
}
} #endregion
2023-03-19 09:17:39 +01:00
if(anim_hold != noone && mouse_release(mb_left))
anim_hold = noone;
butx += ui(20);
if(!global_var) { #region visibility
2023-06-17 14:30:49 +02:00
index = jun.visible;
draw_sprite_ui_uniform(THEME.junc_visible, index, butx, lb_y, 1,, 0.8);
if(_hover && point_in_circle(_m[0], _m[1], butx, lb_y, ui(10))) {
2023-11-08 08:38:04 +01:00
if(visi_hold != noone && jun.visible != visi_hold) {
2023-06-17 14:30:49 +02:00
jun.visible = visi_hold;
2024-03-31 11:10:14 +02:00
jun.node.refreshNodeDisplay();
2023-11-08 08:38:04 +01:00
}
2023-03-19 09:17:39 +01:00
2023-06-17 14:30:49 +02:00
draw_sprite_ui_uniform(THEME.junc_visible, index, butx, lb_y, 1,, 1);
TOOLTIP = __txt("Visibility");
2023-03-19 09:17:39 +01:00
2023-06-17 14:30:49 +02:00
if(mouse_press(mb_left, _focus)) {
jun.visible = !jun.visible;
visi_hold = jun.visible;
2024-03-31 11:10:14 +02:00
jun.node.refreshNodeDisplay();
2023-03-19 09:17:39 +01:00
}
}
#endregion
2023-03-19 09:17:39 +01:00
} else
2023-04-15 14:48:29 +02:00
draw_sprite_ui_uniform(THEME.node_use_expression, 0, butx, lb_y, 1,, 0.8);
2023-03-19 09:17:39 +01:00
if(visi_hold != noone && mouse_release(mb_left))
visi_hold = noone;
var cc = COLORS._main_text;
2023-04-15 14:48:29 +02:00
if(jun.expUse) {
var expValid = jun.expTree != noone && jun.expTree.validate();
cc = expValid? COLORS._main_value_positive : COLORS._main_value_negative;
}
2023-11-24 10:41:53 +01:00
if(global_var) {
if(string_pos(" ", _name)) cc = COLORS._main_value_negative;
} else {
if(jun.is_anim) cc = COLORS._main_value_positive;
2023-11-24 14:48:19 +01:00
if(jun.hasJunctionFrom()) cc = COLORS._main_accent;
2023-11-24 10:41:53 +01:00
}
2023-04-21 19:08:10 +02:00
draw_set_text(_font, fa_left, fa_center, cc);
var lb_w = string_width(_name) + ui(48);
2023-10-15 15:04:42 +02:00
var lb_x = xx + ui(40);
if(jun.color != -1) { #region
draw_sprite_ext(THEME.timeline_color, 1, lb_x + ui(8), lb_y, 1, 1, 0, jun.color, 1);
lb_x += ui(24);
lb_w += ui(24);
} #endregion
2023-12-22 14:46:54 +01:00
if(!jun.active) { #region
2023-12-07 15:08:09 +01:00
draw_set_text(_font, fa_left, fa_center, COLORS._main_text_sub_inner);
draw_text_add(lb_x, lb_y - ui(2), _name);
if(jun.active_tooltip != "") {
var tx = xx + ui(40) + string_width(_name) + ui(16);
var ty = lb_y - ui(1);
if(point_in_circle(_m[0], _m[1], tx, ty, ui(10))) {
TOOLTIP = jun.active_tooltip;
draw_sprite_ui(THEME.info, 0, tx, ty,,,, COLORS._main_icon_light, 1);
} else
draw_sprite_ui(THEME.info, 0, tx, ty,,,, COLORS._main_icon_light, 0.75);
}
return [ 0, true ];
2023-12-22 14:46:54 +01:00
} #endregion
2023-12-07 15:08:09 +01:00
2024-03-24 04:58:08 +01:00
draw_text_over(lb_x, lb_y, _name);
2023-03-19 09:17:39 +01:00
#region tooltip
if(jun.tooltip != "") {
var tx = xx + ui(40) + string_width(_name) + ui(16);
2023-03-19 09:17:39 +01:00
var ty = lb_y - ui(1);
if(point_in_circle(_m[0], _m[1], tx, ty, ui(10))) {
if(is_string(jun.tooltip))
TOOLTIP = jun.tooltip;
else if(mouse_click(mb_left, _focus))
dialogCall(jun.tooltip);
draw_sprite_ui(THEME.info, 0, tx, ty,,,, COLORS._main_icon_light, 1);
} else
draw_sprite_ui(THEME.info, 0, tx, ty,,,, COLORS._main_icon_light, 0.75);
2023-07-30 19:56:53 +02:00
lb_w += ui(56);
2023-03-19 09:17:39 +01:00
}
#endregion
#region anim
2023-09-07 20:59:14 +02:00
if(jun.connect_type == JUNCTION_CONNECT.input && breakLine && jun.is_anim) {
2023-03-19 09:17:39 +01:00
var bx = xx + ww - ui(12);
var by = lb_y;
if(buttonInstant(THEME.button_hide, bx - ui(12), by - ui(12), ui(24), ui(24), _m, _focus, _hover, "", THEME.prop_keyframe, 2) == 2) {
for(var j = 0; j < ds_list_size(jun.animator.values); j++) {
var _key = jun.animator.values[| j];
2023-10-09 16:07:33 +02:00
if(_key.time > CURRENT_FRAME) {
2023-07-06 19:49:16 +02:00
PROJECT.animator.setFrame(_key.time);
2023-03-19 09:17:39 +01:00
break;
}
}
}
bx -= ui(26);
var cc = COLORS.panel_animation_keyframe_unselected;
var kfFocus = false;
for(var j = 0; j < ds_list_size(jun.animator.values); j++) {
2023-10-09 16:07:33 +02:00
if(jun.animator.values[| j].time == CURRENT_FRAME) {
2023-03-19 09:17:39 +01:00
cc = COLORS.panel_animation_keyframe_selected;
kfFocus = true;
break;
}
}
2023-06-04 18:28:29 +02:00
if(buttonInstant(THEME.button_hide, bx - ui(12), by - ui(12), ui(24), ui(24), _m, _focus, _hover, kfFocus? __txtx("panel_inspector_remove_key", "Remove keyframe") :
__txtx("panel_inspector_add_key", "Add keyframe"), THEME.prop_keyframe, 1, cc) == 2) {
2023-03-19 09:17:39 +01:00
var _add = false;
for(var j = 0; j < ds_list_size(jun.animator.values); j++) {
var _key = jun.animator.values[| j];
2023-10-09 16:07:33 +02:00
if(_key.time == CURRENT_FRAME) {
2023-03-19 09:17:39 +01:00
if(ds_list_size(jun.animator.values) > 1)
ds_list_delete(jun.animator.values, j);
_add = true;
break;
2023-10-09 16:07:33 +02:00
} else if(_key.time > CURRENT_FRAME) {
ds_list_insert(jun.animator.values, j, new valueKey(CURRENT_FRAME, jun.showValue(), jun.animator));
2023-03-19 09:17:39 +01:00
_add = true;
break;
}
}
2023-10-09 16:07:33 +02:00
if(!_add) ds_list_add(jun.animator.values, new valueKey(CURRENT_FRAME, jun.showValue(), jun.animator));
2023-03-19 09:17:39 +01:00
}
bx -= ui(26);
if(buttonInstant(THEME.button_hide, bx - ui(12), by - ui(12), ui(24), ui(24), _m, _focus, _hover, "", THEME.prop_keyframe, 0) == 2) {
var _t = -1;
for(var j = 0; j < ds_list_size(jun.animator.values); j++) {
var _key = jun.animator.values[| j];
2023-10-09 16:07:33 +02:00
if(_key.time < CURRENT_FRAME)
2023-03-19 09:17:39 +01:00
_t = _key.time;
}
2023-07-06 19:49:16 +02:00
if(_t > -1) PROJECT.animator.setFrame(_t);
2023-03-19 09:17:39 +01:00
}
var lhf = lb_h / 2 - 4;
draw_set_color(COLORS.panel_inspector_key_separator);
draw_line(bx - ui(20), by - lhf, bx - ui(20), by + lhf);
draw_set_color(COLORS.panel_inspector_key_separator);
draw_line(bx - ui(20), by - lhf, bx - ui(20), by + lhf);
bx -= ui(26 + 12);
2024-03-02 10:08:44 +01:00
tooltip_loop_type.index = jun.on_end;
if(buttonInstant(THEME.button_hide, bx - ui(12), by - ui(12), ui(24), ui(24), _m, _focus, _hover, tooltip_loop_type, THEME.prop_on_end, jun.on_end) == 2)
2023-03-19 09:17:39 +01:00
jun.on_end = safe_mod(jun.on_end + 1, sprite_get_number(THEME.prop_on_end));
}
#endregion
2023-11-14 14:29:11 +01:00
#region expression, pop up editor
2023-09-07 20:59:14 +02:00
if(jun.connect_type == JUNCTION_CONNECT.input && breakLine && !jun.is_anim && !global_var) {
2023-11-24 10:41:53 +01:00
var bx = xx + ww + ui(16);
2023-03-19 09:17:39 +01:00
var by = lb_y;
2023-11-24 10:41:53 +01:00
bx -= ui(28);
2023-11-24 14:48:19 +01:00
if(jun.is_modified) {
2023-12-29 14:30:54 +01:00
if(buttonInstant(THEME.button_hide, bx - ui(12), by - ui(12), ui(24), ui(24), _m, _focus, _hover, __txtx("panel_inspector_reset", "Reset value"), THEME.refresh_16, 0, COLORS._main_icon) == 2)
2023-11-24 14:48:19 +01:00
jun.resetValue();
} else
2023-12-29 14:30:54 +01:00
draw_sprite_ui(THEME.refresh_16, 0, bx, by,,,, COLORS._main_icon, 0.5);
2023-11-24 10:41:53 +01:00
bx -= ui(28);
2023-04-15 14:48:29 +02:00
var ic_b = jun.expUse? c_white : COLORS._main_icon;
2023-11-14 14:29:11 +01:00
if(buttonInstant(THEME.button_hide, bx - ui(12), by - ui(12), ui(24), ui(24), _m, _focus, _hover, __txtx("panel_inspector_use_expression", "Use expression"), THEME.node_use_expression, jun.expUse, ic_b) == 2) {
2024-03-14 14:35:19 +01:00
jun.setUseExpression(!jun.expUse);
2023-11-14 14:29:11 +01:00
if(!jun.expUse) WIDGET_CURRENT = noone;
}
2023-06-17 14:30:49 +02:00
if(jun.expUse) {
bx -= ui(28);
var cc = NODE_DROPPER_TARGET == jun? COLORS._main_value_positive : COLORS._main_icon;
2023-09-07 20:59:14 +02:00
if(buttonInstant(THEME.button_hide, bx - ui(12), by - ui(12), ui(24), ui(24), _m, _focus, _hover, __txtx("panel_inspector_dropper", "Node Dropper"), THEME.node_dropper, 0, cc) == 2)
2023-06-17 14:30:49 +02:00
NODE_DROPPER_TARGET = NODE_DROPPER_TARGET == jun? noone : jun;
}
2023-09-07 20:59:14 +02:00
if(jun.expUse || jun.type == VALUE_TYPE.text) {
bx -= ui(28);
var cc = jun.popup_dialog == noone? COLORS._main_icon : COLORS._main_value_positive;
if(buttonInstant(THEME.button_hide, bx - ui(12), by - ui(12), ui(24), ui(24), _m, _focus, _hover, __txtx("panel_inspector_pop_text", "Pop up Editor"), THEME.text_popup, 0, cc) == 2) {
if(jun.expUse) jun.popup_dialog = dialogPanelCall(new Panel_Text_Editor(jun.express_edit, function() { return context.expression; }, jun));
else jun.popup_dialog = dialogPanelCall(new Panel_Text_Editor(jun.editWidget, function() { return context.showValue(); }, jun));
jun.popup_dialog.content.title = $"{jun.node.name} - {_name}";
2023-09-07 20:59:14 +02:00
}
}
2023-03-19 09:17:39 +01:00
}
#endregion
2023-05-16 21:28:16 +02:00
2023-03-19 09:17:39 +01:00
var _hsy = yy + lb_h;
var padd = ui(8);
2023-09-07 20:59:14 +02:00
2023-03-19 09:17:39 +01:00
var labelWidth = max(lb_w, min(ui(80) + ww * 0.2, ui(200)));
2023-09-07 20:59:14 +02:00
var editBoxX = xx + !breakLine * labelWidth;
var editBoxY = breakLine? _hsy : yy;
2023-03-19 09:17:39 +01:00
var editBoxW = (xx + ww) - editBoxX;
2023-09-07 20:59:14 +02:00
var editBoxH = breakLine? TEXTBOX_HEIGHT : lb_h;
2023-03-19 09:17:39 +01:00
2023-09-07 20:59:14 +02:00
var widH = breakLine? editBoxH : 0;
var mbRight = true;
if(jun.expUse) { #region expression editor
2023-04-15 14:48:29 +02:00
var expValid = jun.expTree != noone && jun.expTree.validate();
2023-04-16 11:53:46 +02:00
jun.express_edit.boxColor = expValid? COLORS._main_value_positive : COLORS._main_value_negative;
2023-07-12 16:28:32 +02:00
jun.express_edit.rx = rx;
jun.express_edit.ry = ry;
2023-04-15 14:48:29 +02:00
2023-06-21 20:36:53 +02:00
jun.express_edit.setFocusHover(_focus, _hover);
2023-04-16 11:53:46 +02:00
if(_focus) jun.express_edit.register(_scrollPane);
2023-03-19 09:17:39 +01:00
2023-04-16 11:53:46 +02:00
var wd_h = jun.express_edit.draw(editBoxX, editBoxY, editBoxW, editBoxH, jun.expression, _m);
2023-09-07 20:59:14 +02:00
widH = wd_h - (TEXTBOX_HEIGHT * !breakLine);
#endregion
} else if(wid && jun.display_type != VALUE_DISPLAY.none) { #region edit widget
wid.setFocusHover(_focus, _hover);
2023-12-22 14:46:54 +01:00
2023-03-19 09:17:39 +01:00
if(jun.connect_type == JUNCTION_CONNECT.input) {
wid.setInteract(!jun.hasJunctionFrom());
if(_focus) wid.register(_scrollPane);
if(jun.value_tag == "dimension") {
var _proj = jun.node.attributes.use_project_dimension;
wid.side_button.icon_index = _proj;
wid.side_button.icon_blend = _proj? c_white : COLORS._main_icon;
}
2023-03-19 09:17:39 +01:00
} else {
wid.setInteract(false);
2023-03-19 09:17:39 +01:00
}
2023-05-16 21:28:16 +02:00
2023-09-09 13:52:16 +02:00
var _show = jun.showValue();
var param = new widgetParam(editBoxX, editBoxY, editBoxW, editBoxH, _show, jun.display_data, _m, rx, ry);
2024-03-26 04:03:45 +01:00
param.font = viewMode == INSP_VIEW_MODE.spacious? f_p0 : f_p2;
2023-06-21 20:36:53 +02:00
2023-07-30 19:56:53 +02:00
switch(jun.type) {
2024-03-26 04:03:45 +01:00
case VALUE_TYPE.float :
case VALUE_TYPE.integer :
2023-07-30 19:56:53 +02:00
switch(jun.display_type) {
2024-03-26 04:03:45 +01:00
case VALUE_DISPLAY.puppet_control :
case VALUE_DISPLAY.transform :
param.h = viewMode == INSP_VIEW_MODE.spacious? param.h : lb_h;
break;
2023-03-19 09:17:39 +01:00
}
2023-07-30 19:56:53 +02:00
break;
2024-03-26 04:03:45 +01:00
2023-08-24 19:44:12 +02:00
case VALUE_TYPE.boolean :
if(is_instanceof(wid, checkBoxActive)) break;
2024-03-27 14:18:39 +01:00
2023-09-07 20:59:14 +02:00
param.halign = breakLine? fa_left : fa_center;
2024-03-27 14:18:39 +01:00
param.s = editBoxH;
if(!breakLine) {
2024-03-27 14:18:39 +01:00
param.w = ww - min(ui(80) + ww * 0.2, ui(200));
param.x = editBoxX + editBoxW - param.w;
}
2023-08-24 19:44:12 +02:00
break;
case VALUE_TYPE.d3Material :
case VALUE_TYPE.surface :
param.h = breakLine? ui(96) : ui(48);
2023-08-24 19:44:12 +02:00
break;
case VALUE_TYPE.curve :
param.h = breakLine? ui(160) : ui(100);
if(point_in_rectangle(_m[0], _m[1], ui(32), _hsy, ui(32) + ww - ui(16), _hsy + param.h))
2023-07-30 19:56:53 +02:00
mbRight = false;
break;
2023-03-19 09:17:39 +01:00
}
2023-07-30 19:56:53 +02:00
var _widH = wid.drawParam(param) ?? 0;
2023-09-07 20:59:14 +02:00
widH = _widH - (TEXTBOX_HEIGHT * !breakLine);
#endregion
} else if(jun.display_type == VALUE_DISPLAY.label) { #region label
2023-03-19 09:17:39 +01:00
draw_set_text(f_p1, fa_left, fa_top, COLORS._main_text_sub);
draw_text_add(xx + ui(16), _hsy, jun.display_data.data);
2023-03-19 09:17:39 +01:00
widH = string_height(jun.display_data.data);
#endregion
2023-03-19 09:17:39 +01:00
} else
widH = 0;
return [ widH, mbRight ];
}