Adds an Add menubar item to the World Editor menubar that populates SceneObject classes for spawnablility based on the categories assigned to the class itself

This commit is contained in:
Areloch 2023-10-24 17:36:58 -05:00
parent 083e367be1
commit 4bf7b0d5c0
2 changed files with 96 additions and 35 deletions

View file

@ -158,46 +158,25 @@ function MenuBuilder::newMenu(%title, %className)
function MenuBuilder::newItem(%this, %itemLabel, %command, %accelerator, %pos, %icon)
{
if(%pos < 0)
{
error("MenuBuilder::addItem() - position must be greater than 0!");
return;
}
if(%pos $= "")
{
%pos = %this.numItems;
}
else
{
//ok, we need to nudge all indexed items up from the insert position and up
for(%i = %this.numItems; %i > %pos; %i--)
{
%this.item[%i+1] = %this.item[%i];
}
}
if(isObject(%command))
%this.item[%pos] = %itemLabel TAB %command;
%item = %itemLabel TAB %command;
else
%this.item[%pos] = %itemLabel TAB %accelerator TAB %command TAB %icon;
%this.numItems++;
%this.reloadItems();
%item = %itemLabel TAB %accelerator TAB %command TAB %icon;
%this.setItemPosition(%item, %pos);
}
function MenuBuilder::newSubmenu(%this, %title, %className, %pos)
{
if(%title $= "")
{
error("MenuBuilder::addSubmenu() - menu requires title!");
error("MenuBuilder::newSubmenu() - menu requires title!");
return 0;
}
if(%pos < 0)
{
error("MenuBuilder::addSubmenu() - position must be greater than 0!");
error("MenuBuilder::newSubmenu() - position must be greater than 0!");
return;
}
@ -213,17 +192,30 @@ function MenuBuilder::newSubmenu(%this, %title, %className, %pos)
isSubmenu = true;
};
%this.newItem(%pos, %title TAB %newMenu);
if(%pos $= "")
%pos = %this.numItems;
return %newMenu;
if(%this.setItemPosition(%title TAB %newMenu, %pos))
{
return %newMenu;
}
return 0;
}
function MenuBuilder::newSeparator(%this, %pos)
{
%item = "-";
%this.setItemPosition(%item, %pos);
}
function MenuBuilder::setItemPosition(%this, %item, %pos)
{
if(%pos < 0)
{
error("MenuBuilder::addItem() - position must be greater than 0!");
return;
error("MenuBuilder::setItemPosition() - position must be greater than 0!");
return false;
}
if(%pos $= "")
@ -239,29 +231,44 @@ function MenuBuilder::newSeparator(%this, %pos)
}
}
%this.item[%pos] = "-";
%this.numItems++;
%this.item[%pos] = %item;
%this.numItems++;
%this.reloadItems();
return true;
}
// Static function
function MenuBuilder::findMenu(%title)
function MenuBuilder::findMenu(%title, %recurse)
{
if(%recurse $= "")
%recurse = false;
for(%i=0; %i < MenuBuilderMenuList.count(); %i++)
{
%menu = MenuBuilderMenuList.getObject(%i);
if(%menu.barTitle $= %title)
{
return %menu;
}
else if(%recurse)
{
%subMenu = %menu.findMenu(%title, %recurse);
if(isObject(%submenu))
return %subMenu;
}
}
return 0;
}
function MenuBuilder::findMenu(%this, %title)
function MenuBuilder::findMenu(%this, %title, %recurse)
{
if(%recurse $= "")
%recurse = false;
for(%i=0; %i < %this.numItems; %i++)
{
%item = %this.item[%i];
@ -269,7 +276,15 @@ function MenuBuilder::findMenu(%this, %title)
if(isObject(%menu))
{
if(%menu.barTitle $= %title)
{
return %menu;
}
else if(%recurse)
{
%subMenu = %menu.findMenu(%title, %recurse);
if(isObject(%submenu))
return %subMenu;
}
}
}

View file

@ -465,6 +465,52 @@ function EditorGui::buildMenus(%this)
Item[24] = "Unmount Selected Object" TAB "" TAB "EditorUnmount();";
};
}
%addMenu = MenuBuilder::newMenu("Add");
%enumeratedClasses = enumerateConsoleClasses("SceneObject");
for(%c=0; %c < getFieldCount(%enumeratedClasses); %c++)
{
%class = getField(%enumeratedClasses, %c);
%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( !ObjectBuilderGui.isMethod( %method ) )
%method = "build" @ %class;
if( !ObjectBuilderGui.isMethod( %method ) )
%cmd = "return new " @ %class @ "();";
else
%cmd = "ObjectBuilderGui." @ %method @ "();";
%createCmd = "ObjectBuilderGui.newObjectCallback = \"ObjectCreator.onFinishCreateObject\"; ObjectCreator.createObject( \"" @ %cmd @ "\" );";
%targetSubmenu.newItem(%class, %createCmd, "");
}
MenuBuilder::addMenuToMenubar(%this.menubar, %addMenu, 4);
}
//////////////////////////////////////////////////////////////////////////