浏览代码

Merge pull request #1168 from Azaezel/alpha41/guiAddGuis

add add dropdown to gui editor
Brian Roberts 1 年之前
父节点
当前提交
ef5f60bf8d

+ 17 - 5
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"))
+      {
+        %module = %payload.moduleName;
+        %asset = %payload.assetName;
+        %assetDef = AssetDatabase.acquireAsset(%module @ ":" @ %asset);
+        %buildCommand = AssetBrowser @ ".on" @ %assetType @ "GUIEditorDropped(" @ %assetDef @ ",\"" @ %pos @ "\");";  
+        eval(%buildCommand);    
+      }
+      else
       {
-         %cmd = "return new guiBitmapCtrl();";
-         %ctrl = eval( %cmd ); 
-         %ctrl.bitmap = %assetId;
+        //fallback example
+        if(%assetType $= "ImageAsset")
+        {
+            %cmd = "return new guiBitmapCtrl();";
+            %ctrl = eval( %cmd ); 
+            %ctrl.bitmap = %assetId;
+        }
       }
    }
    else

+ 11 - 0
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);

+ 84 - 0
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;

+ 2 - 0
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)