diff --git a/Templates/BaseGame/game/tools/assetBrowser/scripts/assetBrowser.tscript b/Templates/BaseGame/game/tools/assetBrowser/scripts/assetBrowser.tscript index 1216eaab6..7ad8e380b 100644 --- a/Templates/BaseGame/game/tools/assetBrowser/scripts/assetBrowser.tscript +++ b/Templates/BaseGame/game/tools/assetBrowser/scripts/assetBrowser.tscript @@ -2582,12 +2582,24 @@ function GuiEditor::onControlDropped(%this, %payload, %position) //dealing with an actual asset, so build the assetName %assetId = %payload.moduleName @ ":" @ %payload.assetName; %assetType = AssetDatabase.getAssetType(%assetId); - - if(%assetType $= "ImageAsset") + + if(AssetBrowser.isMethod("on" @ %assetType @ "GUIEditorDropped")) { - %cmd = "return new guiBitmapCtrl();"; - %ctrl = eval( %cmd ); - %ctrl.bitmap = %assetId; + %module = %payload.moduleName; + %asset = %payload.assetName; + %assetDef = AssetDatabase.acquireAsset(%module @ ":" @ %asset); + %buildCommand = AssetBrowser @ ".on" @ %assetType @ "GUIEditorDropped(" @ %assetDef @ ",\"" @ %pos @ "\");"; + eval(%buildCommand); + } + else + { + //fallback example + if(%assetType $= "ImageAsset") + { + %cmd = "return new guiBitmapCtrl();"; + %ctrl = eval( %cmd ); + %ctrl.bitmap = %assetId; + } } } else diff --git a/Templates/BaseGame/game/tools/assetBrowser/scripts/assetTypes/sound.tscript b/Templates/BaseGame/game/tools/assetBrowser/scripts/assetTypes/sound.tscript index 8064c070f..f5a072d5b 100644 --- a/Templates/BaseGame/game/tools/assetBrowser/scripts/assetTypes/sound.tscript +++ b/Templates/BaseGame/game/tools/assetBrowser/scripts/assetTypes/sound.tscript @@ -91,6 +91,17 @@ function AssetBrowser::onSoundAssetEditorDropped(%this, %assetDef, %position) } +function AssetBrowser::onSoundAssetGUIEditorDropped(%this, %assetDef, %position) +{ + %assetId = %assetDef.getAssetId(); + %cmd = "new GuiAudioCtrl(){"; + %cmd = %cmd @ "SoundAsset =\""@ %assetId @"\";"; + %cmd = %cmd @ "position =\""@ %position @"\";"; + %cmd = %cmd @ "};"; + %ctrl = GuiEditCanvas.createObject(%cmd); + echo(%ctrl SPC "created"); +} + function GuiInspectorTypeSoundAssetPtr::onControlDropped( %this, %payload, %position ) { Canvas.popDialog(EditorDragAndDropLayer); diff --git a/Templates/BaseGame/game/tools/guiEditor/scripts/guiEditorCanvas.ed.tscript b/Templates/BaseGame/game/tools/guiEditor/scripts/guiEditorCanvas.ed.tscript index 0c50b1c59..41ce1989f 100644 --- a/Templates/BaseGame/game/tools/guiEditor/scripts/guiEditorCanvas.ed.tscript +++ b/Templates/BaseGame/game/tools/guiEditor/scripts/guiEditorCanvas.ed.tscript @@ -211,6 +211,8 @@ function GuiEditCanvas::onCreateMenu(%this) }; }; + %this.buildAddMenu(); + // Workaround (for some reason it doesn't size to the width of the canvas) // TODO: After a canvas resize it still messes up the width %position = %this.menubar.position.x SPC %this.menubar.position.y; @@ -220,6 +222,88 @@ function GuiEditCanvas::onCreateMenu(%this) %this.menuBar.attachToCanvas( Canvas, 0 ); } +function GuiEditCanvas::buildAddMenu(%this) +{ + %addMenu = MenuBuilder::newMenu("Add"); + + %enumeratedClasses = enumerateConsoleClasses("GuiControl"); + for(%c=0; %c < getFieldCount(%enumeratedClasses); %c++) + { + %class = getField(%enumeratedClasses, %c); + + if( GuiEditor.isFilteredClass( %class ) + || !isMemberOfClass( %class, "GuiControl" ) ) + continue; + + %category = getCategoryOfClass(%class); + + if(%category $= "") + { + error("Attempted to fetch category of class " @ %class @ " but none were found."); + continue; + } + + %parentMenu = %addMenu; //start at the top + for(%cat=0; %cat < getFieldCount(%category); %cat++) + { + %subCat = getField(%category, %cat); + %targetSubmenu = %parentMenu.findMenu(%subCat); + if(!isObject(%targetSubmenu)) + { + %targetSubmenu = %parentMenu.newSubmenu(%subCat); + } + + %parentMenu = %targetSubmenu; + } + + %buildfunc = ""; + %class = %class; + %method = "build" @ %buildfunc; + if( !GuiEditCanvas.isMethod( %method ) ) + %method = "build" @ %class; + + if( !GuiEditCanvas.isMethod( %method ) ) + %cmd = "return new " @ %class @ "();"; + else + %cmd = "GuiEditCanvas." @ %method @ "();"; + + %createCmd = "GuiEditCanvas.newObjectCallback = \"GuiEditCanvas.onFinishCreateObject\"; GuiEditCanvas.createObject( \"" @ %cmd @ "\" );"; + + %targetSubmenu.newItem(%class, %createCmd, ""); + } + + MenuBuilder::addMenuToMenubar(%this.menubar, %addMenu, 4); +} + +function GuiEditCanvas::createObject( %this, %cmd ) +{ + if(startsWith(%cmd, "return ")) + %objId = eval(%cmd); + else + %objId = eval("return " @ %cmd); + + if( isObject( %objId ) ) + %this.onFinishCreateObject( %objId ); + + return %objId; +} + +function GuiEditCanvas::onFinishCreateObject( %this, %objId ) +{ + GuiEditor.getCurrentAddSet().add( %objId ); + %this.onObjectCreated( %objId ); +} + +function GuiEditCanvas::onObjectCreated( %this, %objId ) +{ + // Can we submit an undo action? + if ( isObject( %objId ) ) + GuiEditor.onAddNewCtrl( %objId ); + + GuiEditorTreeView.clearSelection(); + GuiEditor.select(%objId); +} + $GUI_EDITOR_MENU_EDGESNAP_INDEX = 0; $GUI_EDITOR_MENU_CENTERSNAP_INDEX = 1; $GUI_EDITOR_MENU_GUIDESNAP_INDEX = 3; diff --git a/Templates/BaseGame/game/tools/guiEditor/scripts/guiEditorUndo.ed.tscript b/Templates/BaseGame/game/tools/guiEditor/scripts/guiEditorUndo.ed.tscript index e94c4d91d..23c51ebdc 100644 --- a/Templates/BaseGame/game/tools/guiEditor/scripts/guiEditorUndo.ed.tscript +++ b/Templates/BaseGame/game/tools/guiEditor/scripts/guiEditorUndo.ed.tscript @@ -128,6 +128,8 @@ function UndoActionAddDelete::trashObjects(%this) if( isObject( %this.tree ) ) %this.tree.update(); + + GuiEditor.clearSelection(); } function UndoActionAddDelete::restoreObjects(%this)