Fixes issue where Regenerate Bounds button for SceneGroup/SubScenes wasn't displaying by moving it to Editing inspector group

Added mode toggle for if changing the transform influences the child objects of a SubScene or not
Added onSelected/onUnselected callbacks for SimObjects to allow contextual behavior in the editor
Added functionality of programmatic/dynamic Tool Button Palettes
Added logic so when selecting SubScenes the world editor palette has new buttons for letting the move/rotate actions influence the child objects
This commit is contained in:
JeffR 2024-11-05 20:14:36 -06:00
parent 10d1aeca1f
commit e2d0cc1981
11 changed files with 318 additions and 25 deletions

View file

@ -42,7 +42,7 @@ $guiContent = new GuiControl() {
minSize = "50 50";
EdgeSnap = false;
text = "";
class = "EWToolsPaletteWindowClass";
class = "ButtonPalette";
new GuiDynamicCtrlArrayControl(ToolsPaletteArray) {
canSaveDynamicFields = "0";

View file

@ -69,6 +69,7 @@ function initializeWorldEditor()
exec("./scripts/probeBake.ed." @ $TorqueScriptFileExtension);
exec("./scripts/visibility/visibilityLayer.ed." @ $TorqueScriptFileExtension);
exec("./scripts/visibility/probeViz." @ $TorqueScriptFileExtension);
exec("./scripts/buttonPalette." @ $TorqueScriptFileExtension);
exec("tools/gui/postFxEditor." @ $TorqueScriptFileExtension );
exec("tools/gui/renderTargetVisualizer.ed." @ $TorqueScriptFileExtension);
@ -77,6 +78,8 @@ function initializeWorldEditor()
loadDirectory(expandFilename("./scripts/editors"));
loadDirectory(expandFilename("./scripts/interfaces"));
exec("./scripts/interfaces/subSceneEditing.tscript");
// Create the default editor plugins before calling buildMenus.
new ScriptObject( WorldEditorPlugin )

View file

@ -1069,11 +1069,13 @@ function WorldEditorInspectorPlugin::onWorldEditorStartup( %this )
//connect editor windows
GuiWindowCtrl::attach( EWInspectorWindow, EWTreeWindow);
%map = new ActionMap();
%map = new ActionMap();
/*
%map.bindCmd( keyboard, "1", "EWorldEditorNoneModeBtn.performClick();", "" ); // Select
%map.bindCmd( keyboard, "2", "EWorldEditorMoveModeBtn.performClick();", "" ); // Move
%map.bindCmd( keyboard, "3", "EWorldEditorRotateModeBtn.performClick();", "" ); // Rotate
%map.bindCmd( keyboard, "4", "EWorldEditorScaleModeBtn.performClick();", "" ); // Scale
%map.bindCmd( keyboard, "4", "EWorldEditorScaleModeBtn.performClick();", "" ); // Scale*/
%map.bindCmd( keyboard, "f", "FitToSelectionBtn.performClick();", "" );// Fit Camera to Selection
%map.bindCmd( keyboard, "z", "EditorGuiStatusBar.setCamera(\"Standard Camera\");", "" );// Free camera
%map.bindCmd( keyboard, "n", "ToggleNodeBar->renderHandleBtn.performClick();", "" );// Render Node
@ -1093,21 +1095,38 @@ function WorldEditorInspectorPlugin::onWorldEditorStartup( %this )
function WorldEditorInspectorPlugin::onActivated( %this )
{
Parent::onActivated( %this );
//Clears the button pallete stack
EWToolsPaletteWindow.setStackCtrl(ToolsPaletteArray); //legacy ctrl adhereance
EWToolsPaletteWindow.clearButtons();
EWToolsPaletteWindow.setActionMap(WorldEditorInspectorPlugin.map);
//Adds a button to the pallete stack
//Name Icon Click Command Tooltip text Keybind
EWToolsPaletteWindow.addButton("Select", "ToolsModule:arrow_n_image", "EWorldEditorNoneModeBtn::onClick();", "", "Select Arrow", "1");
EWToolsPaletteWindow.addButton("Move", "ToolsModule:translate_n_image", "EWorldEditorMoveModeBtn::onClick();", "", "Move Selection", "2");
EWToolsPaletteWindow.addButton("Rotate", "ToolsModule:rotate_n_image", "EWorldEditorRotateModeBtn::onClick();", "", "Rotate Selection", "3");
EWToolsPaletteWindow.addButton("Scale", "ToolsModule:Scale_n_image", "EWorldEditorScaleModeBtn::onClick();", "", "Scale Selection", "4");
EWToolsPaletteWindow.refresh();
EditorGui-->InspectorWindow.setVisible( true );
EditorGui-->TreeWindow.setVisible( true );
EditorGui-->WorldEditorToolbar.setVisible( true );
%this.map.push();
//%this.map.push();
}
function WorldEditorInspectorPlugin::onDeactivated( %this )
{
Parent::onDeactivated( %this );
EWToolsPaletteWindow.popActionMap();
EditorGui-->InspectorWindow.setVisible( false );
EditorGui-->TreeWindow.setVisible( false );
EditorGui-->WorldEditorToolbar.setVisible( false );
%this.map.pop();
//%this.map.pop();
}
function WorldEditorInspectorPlugin::onEditMenuSelect( %this, %editMenu )

View file

@ -0,0 +1,160 @@
function ButtonPalette::setStackCtrl(%this, %ctrl)
{
%this.stackCtrl = %ctrl;
}
function ButtonPalette::getStackCtrl(%this)
{
if(isObject(%this.stackCtrl))
return %this.stackCtrl;
else
return %this;
}
function ButtonPalette::setActionMap(%this, %actionMap)
{
%this.actionMap = %actionMap;
%this.actionMap.push();
}
function ButtonPalette::getActionMap(%this)
{
return %this.actionMap;
}
function ButtonPalette::popActionMap(%this, %actionMap)
{
%this.actionMap.pop();
}
function ButtonPalette::clearButtons(%this)
{
%stackCtrl = %this.getStackCtrl();
%stackCtrl.clear();
for(%i=0; %i < %this.numButtons; %i++)
{
if(isObject(%this.actionMap))
{
%this.actionMap.unbind("keyboard", getField(%this.buttons[%i], 5));
}
%this.buttons[%i] = "";
}
%this.numButtons = 0;
}
//Name, Icon, Click Command, Variable, Tooltip text, Keybind
function ButtonPalette::addButton(%this, %name, %iconAsset, %command, %syncVariable, %toolTip, %keybind)
{
if(%this.numButtons $= "")
%this.numButtons = 0;
for(%i=0; %i < %this.numButtons; %i++)
{
%buttonInfo = %this.buttons[%i];
//echo("Testing button info: " @ getField(%buttonInfo, 0) @ " against new button name: " @ %name);
if(getField(%buttonInfo, 0) $= %name) //no duplicates
return;
}
%this.buttons[%this.numButtons] = %name TAB %iconAsset TAB %command TAB %syncVariable TAB %toolTip TAB %keybind;
%this.numButtons++;
}
function ButtonPalette::removeButton(%this, %name)
{
%found = false;
for(%i=0; %i < %this.numButtons; %i++)
{
if(getField(%this.buttons[%i], 0) $= %name)
{
%found = true;
if(isObject(%this.actionMap))
{
%this.actionMap.unbind("keyboard", getField(%this.buttons[%i], 5));
}
}
if(%found)
{
%this.buttons[%i] = %this.buttons[%i+1];
}
}
if(%found)
%this.numButtons--;
return %found;
}
function ButtonPalette::findButton(%this, %name)
{
%stackCtrl = %this.getStackCtrl();
for(%i=0; %i < %stackCtrl.getCount(); %i++)
{
%btnObj = %stackCtrl.getObject(%i);
if(%btnObj.buttonName $= %name)
return %btnObj;
}
return 0;
}
function ButtonPalette::refresh(%this)
{
%stackCtrl = %this.getStackCtrl();
%stackCtrl.clear();
%this.visible = true;
%extents = "25 25";
if(%this.numButtons == 0)
{
%this.visible = false;
return;
}
for(%i=0; %i < %this.numButtons; %i++)
{
%buttonInfo = %this.buttons[%i];
%paletteButton = new GuiBitmapButtonCtrl() {
canSaveDynamicFields = "0";
internalName = getField(%buttonInfo, 0) @ "_paletteButton";
Enabled = "1";
isContainer = "0";
Profile = "ToolsGuiButtonProfile";
HorizSizing = "right";
VertSizing = "bottom";
Position = "0 0";
Extent = "25 19";
MinExtent = "8 2";
canSave = "1";
Visible = "1";
tooltipprofile = "ToolsGuiToolTipProfile";
ToolTip = getField(%buttonInfo, 4) SPC "(" @ getField(%buttonInfo, 5) @ ")";
hovertime = "1000";
bitmapAsset = getField(%buttonInfo, 1);
buttonType = "RadioButton";
useMouseEvents = "0";
buttonName = getField(%buttonInfo, 0);
command = getField(%buttonInfo, 2);
variable = getField(%buttonInfo, 3);
};
%extents.y += 23;
if(isObject(%this.actionMap))
%this.actionMap.bindCmd( keyboard, getField(%buttonInfo, 5), %paletteButton @ ".performClick();", "" );
%stackCtrl.add(%paletteButton);
}
%this.extent.y = %extents.y;
}

View file

@ -0,0 +1,59 @@
function SubScene::onSelected(%this)
{
echo("SELECTED SUBSCENE");
%moveButton = EWToolsPaletteWindow.findButton("Move");
%rotateButton = EWToolsPaletteWindow.findButton("Rotate");
%moveButton.originalCommand = %moveButton.command;
%moveButton.command = "SubSceneMoveModeBtn::onClick();";
%rotateButton.originalCommand = %rotateButton.command;
%rotateButton.command = "SubSceneRotateModeBtn::onClick();";
EWToolsPaletteWindow.addButton("SubSceneMove", "ToolsModule:translate_n_image", "SubSceneChildMoveModeBtn::onClick();", "", "Move SubScene + Children", "1");
EWToolsPaletteWindow.addButton("SubSceneRotate", "ToolsModule:rotate_n_image", "SubSceneChildRotateModeBtn::onClick();", "", "Rotate SubScene + Children", "2");
EWToolsPaletteWindow.refresh();
}
function SubScene::onUnselected(%this)
{
echo("UN-SELECTED SUBSCENE");
EWToolsPaletteWindow.removeButton("SubSceneMove");
EWToolsPaletteWindow.removeButton("SubSceneRotate");
%moveButton = EWToolsPaletteWindow.findButton("Move");
%rotateButton = EWToolsPaletteWindow.findButton("Rotate");
%moveButton.command = %moveButton.originalCommand;
%rotateButton.command = %rotateButton.originalCommand;
$SubScene::transformChildren = false;
EWToolsPaletteWindow.refresh();
}
function SubSceneMoveModeBtn::onClick(%this)
{
EWorldEditorMoveModeBtn::onClick();
$SubScene::transformChildren = false;
}
function SubSceneRotateModeBtn::onClick(%this)
{
EWorldEditorRotateModeBtn::onClick();
$SubScene::transformChildren = false;
}
function SubSceneChildMoveModeBtn::onClick()
{
EWorldEditorMoveModeBtn::onClick();
$SubScene::transformChildren = true;
}
function SubSceneChildRotateModeBtn::onClick()
{
EWorldEditorRotateModeBtn::onClick();
$SubScene::transformChildren = true;
}