Ver código fonte

Removed GuiFlexibleArrayControl.

Daniel Buckmaster 10 anos atrás
pai
commit
add9f990f7

+ 0 - 184
Engine/source/gui/containers/guiFlexibleArrayCtrl.cpp

@@ -1,184 +0,0 @@
-//-----------------------------------------------------------------------------
-// Copyright (c) 2012 Daniel Buckmaster
-//
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to
-// deal in the Software without restriction, including without limitation the
-// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
-// sell copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in
-// all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
-// IN THE SOFTWARE.
-//-----------------------------------------------------------------------------
-
-#include "console/engineAPI.h"
-#include "platform/platform.h"
-#include "gui/containers/guiFlexibleArrayCtrl.h"
-#include "platform/types.h"
-
-GuiFlexibleArrayControl::GuiFlexibleArrayControl()
-{
-   mRows = 0;
-   mRowSpacing = 0;
-   mColSpacing = 0;
-   mIsContainer = true;
-
-   mResizing = false;
-
-   mFrozen = false;
-
-   mPadding.set(0, 0, 0, 0);
-}
-
-GuiFlexibleArrayControl::~GuiFlexibleArrayControl()
-{
-}
-
-IMPLEMENT_CONOBJECT(GuiFlexibleArrayControl);
-
-ConsoleDocClass( GuiFlexibleArrayControl,
-   "@brief A container that arranges children into a grid.\n\n"
-
-   "This container maintains a 2D grid of GUI controls. If one is added, deleted, "
-   "or resized, then the grid is updated. The insertion order into the grid is "
-   "determined by the internal order of the children (ie. the order of addition).<br>"
-
-   "Children are added to the grid by row or column until they fill the assocated "
-   "GuiFlexibleArrayControl extent (width or height). For example, a "
-   "GuiFlexibleArrayControl with 10 children, and <i>fillRowFirst</i> set to "
-   "true may be arranged as follows:\n\n"
-
-   "<pre>\n"
-   "1  2  ...3...  4\n"
-   "..5..  6  7  .8.\n"
-   "9 ....10....\n"
-   "</pre>\n"
-
-   "@tsexample\n"
-   "new GuiFlexibleArrayControl()\n"
-   "{\n"
-   "   colSpacing = \"2\";\n"
-   "   rowSpacing = \"2\";\n"
-   "   frozen = \"0\";\n"
-   "   padding = \"0 0 0 0\";\n"
-   "   //Properties not specific to this control have been omitted from this example.\n"
-   "};\n"
-   "@endtsexample\n\n"
-
-   "@see GuiDynamicCtrlArrayControl\n"
-   "@ingroup GuiContainers"
-);
-
-// ConsoleObject...
-
-void GuiFlexibleArrayControl::initPersistFields()
-{
-   addField("rowCount", TypeS32, Offset( mRows, GuiFlexibleArrayControl),
-      "Number of rows the child controls have been arranged into. This value "
-      "is calculated automatically when children are added, removed or resized; "
-      "writing it directly has no effect.");
-
-   addField("rowSpacing", TypeS32, Offset(mRowSpacing, GuiFlexibleArrayControl),
-      "Spacing between rows");
-
-   addField("colSpacing", TypeS32, Offset(mColSpacing, GuiFlexibleArrayControl),
-      "Spacing between columns");
-
-   addField("frozen", TypeBool, Offset(mFrozen, GuiFlexibleArrayControl),
-      "When true, the array will not update when new children are added or in "
-      "response to child resize events. This is useful to prevent unnecessary "
-      "resizing when adding, removing or resizing a number of child controls.");
-
-   addField("padding", TypeRectSpacingI, Offset(mPadding, GuiFlexibleArrayControl),
-      "Padding around the top, bottom, left, and right of this control. This "
-      "reduces the area available for child controls.");
-
-   Parent::initPersistFields();
-}
-
-void GuiFlexibleArrayControl::inspectPostApply()
-{
-   resize(getPosition(), getExtent());
-   Parent::inspectPostApply();
-}
-
-void GuiFlexibleArrayControl::addObject(SimObject *obj)
-{
-   Parent::addObject(obj);
-
-   if(!mFrozen)
-      refresh();
-}
-
-bool GuiFlexibleArrayControl::resize(const Point2I &newPosition, const Point2I &newExtent)
-{
-   if(size() == 0)
-      return Parent::resize(newPosition, newExtent);
-
-   if(mResizing) 
-      return false;
-
-   mResizing = true;
-
-   // Place each child.
-   S32 childcount = 0;
-   Point2I pos(mPadding.left, mPadding.top);
-   mRows = 0;
-   S32 rowHeight = 0;
-   for(S32 i = 0; i < size(); i++)
-   {
-      GuiControl *gc = dynamic_cast<GuiControl*>(operator [](i));
-      if(gc && gc->isVisible()) 
-      {
-         if(pos.x + gc->getWidth() > getExtent().x - mPadding.right)
-         {
-            pos.y += rowHeight + mRowSpacing;
-            pos.x = mPadding.left;
-            rowHeight = 0;
-            mRows++;
-         }
-         gc->setPosition(pos);
-
-         rowHeight = getMax(rowHeight, gc->getHeight());
-
-         pos.x += mColSpacing + gc->getWidth();
-         childcount++;
-      }
-   }
-
-   Point2I realExtent(newExtent);
-   realExtent.y = pos.y + rowHeight;
-   realExtent.y += mPadding.bottom;
-
-   mResizing = false;
-
-   return Parent::resize(newPosition, realExtent);
-}
-
-void GuiFlexibleArrayControl::childResized(GuiControl *child)
-{
-   Parent::childResized(child);
-
-   if ( !mFrozen )
-      refresh();
-}
-
-void GuiFlexibleArrayControl::refresh()
-{
-   resize(getPosition(), getExtent());
-}
-
-DefineEngineMethod( GuiFlexibleArrayControl, refresh, void, (),,
-   "Recalculates the position and size of this control and all its children." )
-{
-   object->refresh();
-}

+ 0 - 67
Engine/source/gui/containers/guiFlexibleArrayCtrl.h

@@ -1,67 +0,0 @@
-//-----------------------------------------------------------------------------
-// Copyright (c) 2012 Daniel Buckmaster
-//
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to
-// deal in the Software without restriction, including without limitation the
-// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
-// sell copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in
-// all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
-// IN THE SOFTWARE.
-//-----------------------------------------------------------------------------
-
-#ifndef _GUIFLEXIBLEARRAYCTRL_H_
-#define _GUIFLEXIBLEARRAYCTRL_H_
-
-#include "gui/core/guiControl.h"
-
-class GuiFlexibleArrayControl : public GuiControl
-{
-   typedef GuiControl Parent;
-
-public:
-
-   GuiFlexibleArrayControl();
-   virtual ~GuiFlexibleArrayControl();
-
-   DECLARE_CONOBJECT(GuiFlexibleArrayControl);
-   DECLARE_CATEGORY( "Gui Containers" );
-
-   // ConsoleObject
-   static void initPersistFields();
-
-   // SimObject
-   void inspectPostApply();
-
-   // SimSet
-   void addObject(SimObject *obj);
-
-   // GuiControl
-   bool resize(const Point2I &newPosition, const Point2I &newExtent);
-   void childResized(GuiControl *child);
-
-   // GuiFlexibleArrayCtrl
-   void refresh();
-
-protected:
-
-   S32 mRows;
-   S32 mRowSpacing;
-   S32 mColSpacing;
-   bool mResizing;
-   bool mFrozen;
-
-   RectSpacingI mPadding;
-};
-
-#endif // _GUIFLEXIBLEARRAYCTRL_H_

+ 134 - 131
Templates/Empty/game/tools/navEditor/NavEditorGui.gui

@@ -199,10 +199,8 @@
             Extent = "86 18";
             text = "Actions";
          };
-         new GuiFlexibleArrayControl()
+         new GuiStackControl()
          {
-            colSpacing = 2;
-            rowSpacing = 2;
             internalName = "SelectActions";
             position = "7 21";
             extent = "190 64";
@@ -216,40 +214,47 @@
                text = "Build NavMesh";
                command = "NavEditorGui.buildSelectedMeshes();";
             };
-            new GuiCheckboxCtrl() {
-               internalName = "BackgroundBuildButton";
-               text = "Background";
-               groupNum = "-1";
-               buttonType = "ToggleButton";
-               useMouseEvents = "0";
-               extent = "75 20";
-               minExtent = "8 2";
-               profile = "GuiCheckBoxProfile";
-               visible = "1";
-               active = "1";
-               variable = "$Nav::Editor::backgroundBuild";
-               tooltipProfile = "GuiToolTipProfile";
-               hovertime = "1000";
-               isContainer = "0";
-               canSave = "1";
-               canSaveDynamicFields = "0";
-            };
-            new GuiCheckboxCtrl() {
-               internalName = "SaveIntermediatesButton";
-               text = "Keep intermediates";
-               groupNum = "-1";
-               buttonType = "ToggleButton";
-               useMouseEvents = "0";
-               extent = "105 20";
-               profile = "GuiCheckBoxProfile";
-               visible = "1";
-               active = "1";
-               variable = "$Nav::Editor::saveIntermediates";
-               tooltipProfile = "GuiToolTipProfile";
-               hovertime = "1000";
-               isContainer = "0";
-               canSave = "1";
-               canSaveDynamicFields = "0";
+            new GuiControl() {
+               profile = "GuiDefaultProfile";
+               Extent = "182 20";
+               position = "0 20";
+
+               new GuiCheckboxCtrl() {
+                  internalName = "BackgroundBuildButton";
+                  text = "Background";
+                  groupNum = "-1";
+                  buttonType = "ToggleButton";
+                  useMouseEvents = "0";
+                  extent = "75 20";
+                  minExtent = "8 2";
+                  profile = "GuiCheckBoxProfile";
+                  visible = "1";
+                  active = "1";
+                  variable = "NavEditorGui.backgroundBuild";
+                  tooltipProfile = "GuiToolTipProfile";
+                  hovertime = "1000";
+                  isContainer = "0";
+                  canSave = "1";
+                  canSaveDynamicFields = "0";
+               };
+               new GuiCheckboxCtrl() {
+                  position = "75 0";
+                  internalName = "SaveIntermediatesButton";
+                  text = "Keep intermediates";
+                  groupNum = "-1";
+                  buttonType = "ToggleButton";
+                  useMouseEvents = "0";
+                  extent = "105 20";
+                  profile = "GuiCheckBoxProfile";
+                  visible = "1";
+                  active = "1";
+                  variable = "NavEditorGui.saveIntermediates";
+                  tooltipProfile = "GuiToolTipProfile";
+                  hovertime = "1000";
+                  isContainer = "0";
+                  canSave = "1";
+                  canSaveDynamicFields = "0";
+               };
             };
             new GuiCheckboxCtrl() {
                internalName = "BuildSoundButton";
@@ -262,7 +267,7 @@
                profile = "GuiCheckBoxProfile";
                visible = "1";
                active = "1";
-               variable = "$Nav::Editor::playSoundWhenDone";
+               variable = "NavEditorGui.playSoundWhenDone";
                tooltipProfile = "GuiToolTipProfile";
                hovertime = "1000";
                isContainer = "0";
@@ -270,10 +275,8 @@
                canSaveDynamicFields = "0";
             };
          };
-         new GuiFlexibleArrayControl()
+         new GuiStackControl()
          {
-            colSpacing = 2;
-            rowSpacing = 2;
             internalName = "LinkActions";
             position = "7 21";
             extent = "190 64";
@@ -288,10 +291,8 @@
                command = "NavEditorGui.buildLinks();";
             };
          };
-         new GuiFlexibleArrayControl()
+         new GuiStackControl()
          {
-            colSpacing = 2;
-            rowSpacing = 2;
             internalName = "CoverActions";
             position = "7 21";
             extent = "190 64";
@@ -315,10 +316,8 @@
                command = "NavEditorGui.deleteCoverPoints();";
             };
          };
-         new GuiFlexibleArrayControl()
+         new GuiStackControl()
          {
-            colSpacing = 2;
-            rowSpacing = 2;
             internalName = "TileActions";
             position = "7 21";
             extent = "190 64";
@@ -333,10 +332,8 @@
                command = "NavEditorGui.buildTile();";
             };
          };
-         new GuiFlexibleArrayControl()
+         new GuiStackControl()
          {
-            colSpacing = 2;
-            rowSpacing = 2;
             internalName = "TestActions";
             position = "7 21";
             extent = "190 64";
@@ -350,41 +347,53 @@
                text = "Spawn";
                command = "NavEditorGui.spawnPlayer();";
             };
-            new GuiButtonCtrl() {
-               Profile = "GuiButtonProfile";
-               buttonType = "PushButton";
-               HorizSizing = "right";
-               VertSizing = "bottom";
-               Extent = "90 18";
-               text = "Delete";
-               command = "NavEditorGui.getPlayer().delete();";
-            };
-            new GuiButtonCtrl() {
-               Profile = "GuiButtonProfile";
-               buttonType = "PushButton";
-               HorizSizing = "right";
-               VertSizing = "bottom";
-               Extent = "90 18";
-               text = "Find cover";
-               command = "NavEditorGui.findCover();";
-            };
-            new GuiButtonCtrl() {
-               Profile = "GuiButtonProfile";
-               buttonType = "PushButton";
-               HorizSizing = "right";
-               VertSizing = "bottom";
-               Extent = "90 18";
-               text = "Follow";
-               command = "NavEditorGui.followObject();";
+            new GuiControl() {
+               profile = "GuiDefaultProfile";
+               Extent = "190 18";
+
+               new GuiButtonCtrl() {
+                  Profile = "GuiButtonProfile";
+                  buttonType = "PushButton";
+                  HorizSizing = "right";
+                  VertSizing = "bottom";
+                  Extent = "90 18";
+                  text = "Delete";
+                  command = "NavEditorGui.getPlayer().delete();";
+               };
+               new GuiButtonCtrl() {
+                  position = "100 0";
+                  Profile = "GuiButtonProfile";
+                  buttonType = "PushButton";
+                  HorizSizing = "right";
+                  VertSizing = "bottom";
+                  Extent = "90 18";
+                  text = "Find cover";
+                  command = "NavEditorGui.findCover();";
+               };
             };
-            new GuiButtonCtrl() {
-               Profile = "GuiButtonProfile";
-               buttonType = "PushButton";
-               HorizSizing = "right";
-               VertSizing = "bottom";
-               Extent = "90 18";
-               text = "Stop";
-               command = "NavEditorGui.getPlayer().stop();";
+            new GuiControl() {
+               profile = "GuiDefaultProfile";
+               Extent = "190 18";
+
+               new GuiButtonCtrl() {
+                  Profile = "GuiButtonProfile";
+                  buttonType = "PushButton";
+                  HorizSizing = "right";
+                  VertSizing = "bottom";
+                  Extent = "90 18";
+                  text = "Follow";
+                  command = "NavEditorGui.followObject();";
+               };
+               new GuiButtonCtrl() {
+                  position = "100 0";
+                  Profile = "GuiButtonProfile";
+                  buttonType = "PushButton";
+                  HorizSizing = "right";
+                  VertSizing = "bottom";
+                  Extent = "90 18";
+                  text = "Stop";
+                  command = "NavEditorGui.getPlayer().stop();";
+               };
             };
          };
       };
@@ -460,17 +469,15 @@
             dividerMargin = "5";
          };
          
-         new GuiFlexibleArrayControl() {
-            colSpacing = 2;
-            rowSpacing = 2;
+         new GuiStackControl() {
             internalName = "LinkProperties";
             position = "7 21";
             extent = "186 64";
             padding = "2 2 2 2";
             
             new GuiCheckBoxCtrl() {
-			   internalName = "LinkWalkFlag";
-			   class = "NavMeshLinkFlagButton";
+               internalName = "LinkWalkFlag";
+               class = "NavMeshLinkFlagButton";
                text = " Walk";
                buttonType = "ToggleButton";
                useMouseEvents = "0";
@@ -482,15 +489,15 @@
                visible = "1";
                active = "0";
                tooltipProfile = "GuiToolTipProfile";
-			   toolTip = "This link is just ordinary flat ground.";
+               toolTip = "This link is just ordinary flat ground.";
                hovertime = "1000";
                isContainer = "0";
                canSave = "1";
                canSaveDynamicFields = "0";
             };
             new GuiCheckBoxCtrl() {
-			   internalName = "LinkJumpFlag";
-			   class = "NavMeshLinkFlagButton";
+               internalName = "LinkJumpFlag";
+               class = "NavMeshLinkFlagButton";
                text = " Jump";
                buttonType = "ToggleButton";
                useMouseEvents = "0";
@@ -502,15 +509,15 @@
                visible = "1";
                active = "0";
                tooltipProfile = "GuiToolTipProfile";
-			   toolTip = "Does this link require a jump?";
+               toolTip = "Does this link require a jump?";
                hovertime = "1000";
                isContainer = "0";
                canSave = "1";
                canSaveDynamicFields = "0";
             };
             new GuiCheckBoxCtrl() {
-			   internalName = "LinkDropFlag";
-			   class = "NavMeshLinkFlagButton";
+               internalName = "LinkDropFlag";
+               class = "NavMeshLinkFlagButton";
                text = " Drop";
                buttonType = "ToggleButton";
                useMouseEvents = "0";
@@ -522,15 +529,15 @@
                visible = "1";
                active = "0";
                tooltipProfile = "GuiToolTipProfile";
-			   toolTip = "Does this link involve a significant drop?";
+               toolTip = "Does this link involve a significant drop?";
                hovertime = "1000";
                isContainer = "0";
                canSave = "1";
                canSaveDynamicFields = "0";
             };
             new GuiCheckBoxCtrl() {
-			   internalName = "LinkLedgeFlag";
-			   class = "NavMeshLinkFlagButton";
+               internalName = "LinkLedgeFlag";
+               class = "NavMeshLinkFlagButton";
                text = " Ledge";
                buttonType = "ToggleButton";
                useMouseEvents = "0";
@@ -542,15 +549,15 @@
                visible = "1";
                active = "0";
                tooltipProfile = "GuiToolTipProfile";
-			   toolTip = "Should the character jump at the next ledge?";
+               toolTip = "Should the character jump at the next ledge?";
                hovertime = "1000";
                isContainer = "0";
                canSave = "1";
                canSaveDynamicFields = "0";
             };
             new GuiCheckBoxCtrl() {
-			   internalName = "LinkClimbFlag";
-			   class = "NavMeshLinkFlagButton";
+               internalName = "LinkClimbFlag";
+               class = "NavMeshLinkFlagButton";
                text = " Climb";
                buttonType = "ToggleButton";
                useMouseEvents = "0";
@@ -562,15 +569,15 @@
                visible = "1";
                active = "0";
                tooltipProfile = "GuiToolTipProfile";
-			   toolTip = "Does this link involve climbing?";
+               toolTip = "Does this link involve climbing?";
                hovertime = "1000";
                isContainer = "0";
                canSave = "1";
                canSaveDynamicFields = "0";
             };
             new GuiCheckBoxCtrl() {
-			   internalName = "LinkTeleportFlag";
-			   class = "NavMeshLinkFlagButton";
+               internalName = "LinkTeleportFlag";
+               class = "NavMeshLinkFlagButton";
                text = " Teleport";
                buttonType = "ToggleButton";
                useMouseEvents = "0";
@@ -582,16 +589,14 @@
                visible = "1";
                active = "0";
                tooltipProfile = "GuiToolTipProfile";
-			   toolTip = "Is this link a teleporter?";
+               toolTip = "Is this link a teleporter?";
                hovertime = "1000";
                isContainer = "0";
                canSave = "1";
                canSaveDynamicFields = "0";
             };
          };
-         new GuiFlexibleArrayControl() {
-            colSpacing = 2;
-            rowSpacing = 2;
+         new GuiStackControl() {
             internalName = "TileProperties";
             position = "7 21";
             extent = "186 64";
@@ -613,7 +618,7 @@
                isContainer = "0";
                canSave = "1";
                canSaveDynamicFields = "0";
-			   variable = "$Nav::Editor::renderInput";
+               variable = "$Nav::Editor::renderInput";
             };
             new GuiCheckBoxCtrl() {
                text = " Display voxels";
@@ -631,24 +636,22 @@
                isContainer = "0";
                canSave = "1";
                canSaveDynamicFields = "0";
-			   variable = "$Nav::Editor::renderVoxels";
+               variable = "$Nav::Editor::renderVoxels";
             };
          };
-         new GuiFlexibleArrayControl() {
-            colSpacing = 2;
-            rowSpacing = 2;
+         new GuiStackControl() {
             internalName = "TestProperties";
             position = "7 21";
             extent = "186 64";
             padding = "2 2 2 2";
             
 			new GuiTextCtrl() {
-			   text = "Cover";
+               text = "Cover";
                profile = "GuiTextProfile";
                extent = "180 20";
                minExtent = "8 2";
                visible = "1";
-			};
+            };
             new GuiTextEditCtrl() {
                internalName = "CoverRadius";
                text = "10";
@@ -657,9 +660,9 @@
                minExtent = "8 2";
                visible = "1";
                tooltipProfile = "GuiToolTipProfile";
-			   toolTip = "Radius for cover-finding.";
+               toolTip = "Radius for cover-finding.";
             };
-			new GuiTextEditCtrl() {
+            new GuiTextEditCtrl() {
                internalName = "CoverPosition";
                text = "LocalClientConnection.getControlObject().getPosition();";
                profile = "GuiTextEditProfile";
@@ -667,15 +670,15 @@
                minExtent = "8 2";
                visible = "1";
                tooltipProfile = "GuiToolTipProfile";
-			   toolTip = "Position to find cover from.";
-			};
-			new GuiTextCtrl() {
-			   text = "Follow";
+               toolTip = "Position to find cover from.";
+            };
+            new GuiTextCtrl() {
+               text = "Follow";
                profile = "GuiTextProfile";
                extent = "180 20";
                minExtent = "8 2";
                visible = "1";
-			};
+            };
             new GuiTextEditCtrl() {
                internalName = "FollowRadius";
                text = "1";
@@ -684,9 +687,9 @@
                minExtent = "8 2";
                visible = "1";
                tooltipProfile = "GuiToolTipProfile";
-			   toolTip = "Radius for following.";
+               toolTip = "Radius for following.";
             };
-			new GuiTextEditCtrl() {
+            new GuiTextEditCtrl() {
                internalName = "FollowObject";
                text = "LocalClientConnection.player";
                profile = "GuiTextEditProfile";
@@ -694,18 +697,18 @@
                minExtent = "8 2";
                visible = "1";
                tooltipProfile = "GuiToolTipProfile";
-			   toolTip = "Object to follow.";
-			};
-			new GuiTextCtrl() {
-			   text = "Movement";
+               toolTip = "Object to follow.";
+            };
+            new GuiTextCtrl() {
+               text = "Movement";
                profile = "GuiTextProfile";
                extent = "180 20";
                minExtent = "8 2";
                visible = "1";
-			};
+            };
             new GuiCheckBoxCtrl() {
-			   internalName = "LinkWalkFlag";
-			   class = "NavMeshTestFlagButton";
+               internalName = "LinkWalkFlag";
+               class = "NavMeshTestFlagButton";
                text = " Walk";
                buttonType = "ToggleButton";
                useMouseEvents = "0";

+ 134 - 131
Templates/Full/game/tools/navEditor/NavEditorGui.gui

@@ -199,10 +199,8 @@
             Extent = "86 18";
             text = "Actions";
          };
-         new GuiFlexibleArrayControl()
+         new GuiStackControl()
          {
-            colSpacing = 2;
-            rowSpacing = 2;
             internalName = "SelectActions";
             position = "7 21";
             extent = "190 64";
@@ -216,40 +214,47 @@
                text = "Build NavMesh";
                command = "NavEditorGui.buildSelectedMeshes();";
             };
-            new GuiCheckboxCtrl() {
-               internalName = "BackgroundBuildButton";
-               text = "Background";
-               groupNum = "-1";
-               buttonType = "ToggleButton";
-               useMouseEvents = "0";
-               extent = "75 20";
-               minExtent = "8 2";
-               profile = "GuiCheckBoxProfile";
-               visible = "1";
-               active = "1";
-               variable = "$Nav::Editor::backgroundBuild";
-               tooltipProfile = "GuiToolTipProfile";
-               hovertime = "1000";
-               isContainer = "0";
-               canSave = "1";
-               canSaveDynamicFields = "0";
-            };
-            new GuiCheckboxCtrl() {
-               internalName = "SaveIntermediatesButton";
-               text = "Keep intermediates";
-               groupNum = "-1";
-               buttonType = "ToggleButton";
-               useMouseEvents = "0";
-               extent = "105 20";
-               profile = "GuiCheckBoxProfile";
-               visible = "1";
-               active = "1";
-               variable = "$Nav::Editor::saveIntermediates";
-               tooltipProfile = "GuiToolTipProfile";
-               hovertime = "1000";
-               isContainer = "0";
-               canSave = "1";
-               canSaveDynamicFields = "0";
+            new GuiControl() {
+               profile = "GuiDefaultProfile";
+               Extent = "182 20";
+               position = "0 20";
+
+               new GuiCheckboxCtrl() {
+                  internalName = "BackgroundBuildButton";
+                  text = "Background";
+                  groupNum = "-1";
+                  buttonType = "ToggleButton";
+                  useMouseEvents = "0";
+                  extent = "75 20";
+                  minExtent = "8 2";
+                  profile = "GuiCheckBoxProfile";
+                  visible = "1";
+                  active = "1";
+                  variable = "NavEditorGui.backgroundBuild";
+                  tooltipProfile = "GuiToolTipProfile";
+                  hovertime = "1000";
+                  isContainer = "0";
+                  canSave = "1";
+                  canSaveDynamicFields = "0";
+               };
+               new GuiCheckboxCtrl() {
+                  position = "75 0";
+                  internalName = "SaveIntermediatesButton";
+                  text = "Keep intermediates";
+                  groupNum = "-1";
+                  buttonType = "ToggleButton";
+                  useMouseEvents = "0";
+                  extent = "105 20";
+                  profile = "GuiCheckBoxProfile";
+                  visible = "1";
+                  active = "1";
+                  variable = "NavEditorGui.saveIntermediates";
+                  tooltipProfile = "GuiToolTipProfile";
+                  hovertime = "1000";
+                  isContainer = "0";
+                  canSave = "1";
+                  canSaveDynamicFields = "0";
+               };
             };
             new GuiCheckboxCtrl() {
                internalName = "BuildSoundButton";
@@ -262,7 +267,7 @@
                profile = "GuiCheckBoxProfile";
                visible = "1";
                active = "1";
-               variable = "$Nav::Editor::playSoundWhenDone";
+               variable = "NavEditorGui.playSoundWhenDone";
                tooltipProfile = "GuiToolTipProfile";
                hovertime = "1000";
                isContainer = "0";
@@ -270,10 +275,8 @@
                canSaveDynamicFields = "0";
             };
          };
-         new GuiFlexibleArrayControl()
+         new GuiStackControl()
          {
-            colSpacing = 2;
-            rowSpacing = 2;
             internalName = "LinkActions";
             position = "7 21";
             extent = "190 64";
@@ -288,10 +291,8 @@
                command = "NavEditorGui.buildLinks();";
             };
          };
-         new GuiFlexibleArrayControl()
+         new GuiStackControl()
          {
-            colSpacing = 2;
-            rowSpacing = 2;
             internalName = "CoverActions";
             position = "7 21";
             extent = "190 64";
@@ -315,10 +316,8 @@
                command = "NavEditorGui.deleteCoverPoints();";
             };
          };
-         new GuiFlexibleArrayControl()
+         new GuiStackControl()
          {
-            colSpacing = 2;
-            rowSpacing = 2;
             internalName = "TileActions";
             position = "7 21";
             extent = "190 64";
@@ -333,10 +332,8 @@
                command = "NavEditorGui.buildTile();";
             };
          };
-         new GuiFlexibleArrayControl()
+         new GuiStackControl()
          {
-            colSpacing = 2;
-            rowSpacing = 2;
             internalName = "TestActions";
             position = "7 21";
             extent = "190 64";
@@ -350,41 +347,53 @@
                text = "Spawn";
                command = "NavEditorGui.spawnPlayer();";
             };
-            new GuiButtonCtrl() {
-               Profile = "GuiButtonProfile";
-               buttonType = "PushButton";
-               HorizSizing = "right";
-               VertSizing = "bottom";
-               Extent = "90 18";
-               text = "Delete";
-               command = "NavEditorGui.getPlayer().delete();";
-            };
-            new GuiButtonCtrl() {
-               Profile = "GuiButtonProfile";
-               buttonType = "PushButton";
-               HorizSizing = "right";
-               VertSizing = "bottom";
-               Extent = "90 18";
-               text = "Find cover";
-               command = "NavEditorGui.findCover();";
-            };
-            new GuiButtonCtrl() {
-               Profile = "GuiButtonProfile";
-               buttonType = "PushButton";
-               HorizSizing = "right";
-               VertSizing = "bottom";
-               Extent = "90 18";
-               text = "Follow";
-               command = "NavEditorGui.followObject();";
+            new GuiControl() {
+               profile = "GuiDefaultProfile";
+               Extent = "190 18";
+
+               new GuiButtonCtrl() {
+                  Profile = "GuiButtonProfile";
+                  buttonType = "PushButton";
+                  HorizSizing = "right";
+                  VertSizing = "bottom";
+                  Extent = "90 18";
+                  text = "Delete";
+                  command = "NavEditorGui.getPlayer().delete();";
+               };
+               new GuiButtonCtrl() {
+                  position = "100 0";
+                  Profile = "GuiButtonProfile";
+                  buttonType = "PushButton";
+                  HorizSizing = "right";
+                  VertSizing = "bottom";
+                  Extent = "90 18";
+                  text = "Find cover";
+                  command = "NavEditorGui.findCover();";
+               };
             };
-            new GuiButtonCtrl() {
-               Profile = "GuiButtonProfile";
-               buttonType = "PushButton";
-               HorizSizing = "right";
-               VertSizing = "bottom";
-               Extent = "90 18";
-               text = "Stop";
-               command = "NavEditorGui.getPlayer().stop();";
+            new GuiControl() {
+               profile = "GuiDefaultProfile";
+               Extent = "190 18";
+
+               new GuiButtonCtrl() {
+                  Profile = "GuiButtonProfile";
+                  buttonType = "PushButton";
+                  HorizSizing = "right";
+                  VertSizing = "bottom";
+                  Extent = "90 18";
+                  text = "Follow";
+                  command = "NavEditorGui.followObject();";
+               };
+               new GuiButtonCtrl() {
+                  position = "100 0";
+                  Profile = "GuiButtonProfile";
+                  buttonType = "PushButton";
+                  HorizSizing = "right";
+                  VertSizing = "bottom";
+                  Extent = "90 18";
+                  text = "Stop";
+                  command = "NavEditorGui.getPlayer().stop();";
+               };
             };
          };
       };
@@ -460,17 +469,15 @@
             dividerMargin = "5";
          };
          
-         new GuiFlexibleArrayControl() {
-            colSpacing = 2;
-            rowSpacing = 2;
+         new GuiStackControl() {
             internalName = "LinkProperties";
             position = "7 21";
             extent = "186 64";
             padding = "2 2 2 2";
             
             new GuiCheckBoxCtrl() {
-			   internalName = "LinkWalkFlag";
-			   class = "NavMeshLinkFlagButton";
+               internalName = "LinkWalkFlag";
+               class = "NavMeshLinkFlagButton";
                text = " Walk";
                buttonType = "ToggleButton";
                useMouseEvents = "0";
@@ -482,15 +489,15 @@
                visible = "1";
                active = "0";
                tooltipProfile = "GuiToolTipProfile";
-			   toolTip = "This link is just ordinary flat ground.";
+               toolTip = "This link is just ordinary flat ground.";
                hovertime = "1000";
                isContainer = "0";
                canSave = "1";
                canSaveDynamicFields = "0";
             };
             new GuiCheckBoxCtrl() {
-			   internalName = "LinkJumpFlag";
-			   class = "NavMeshLinkFlagButton";
+               internalName = "LinkJumpFlag";
+               class = "NavMeshLinkFlagButton";
                text = " Jump";
                buttonType = "ToggleButton";
                useMouseEvents = "0";
@@ -502,15 +509,15 @@
                visible = "1";
                active = "0";
                tooltipProfile = "GuiToolTipProfile";
-			   toolTip = "Does this link require a jump?";
+               toolTip = "Does this link require a jump?";
                hovertime = "1000";
                isContainer = "0";
                canSave = "1";
                canSaveDynamicFields = "0";
             };
             new GuiCheckBoxCtrl() {
-			   internalName = "LinkDropFlag";
-			   class = "NavMeshLinkFlagButton";
+               internalName = "LinkDropFlag";
+               class = "NavMeshLinkFlagButton";
                text = " Drop";
                buttonType = "ToggleButton";
                useMouseEvents = "0";
@@ -522,15 +529,15 @@
                visible = "1";
                active = "0";
                tooltipProfile = "GuiToolTipProfile";
-			   toolTip = "Does this link involve a significant drop?";
+               toolTip = "Does this link involve a significant drop?";
                hovertime = "1000";
                isContainer = "0";
                canSave = "1";
                canSaveDynamicFields = "0";
             };
             new GuiCheckBoxCtrl() {
-			   internalName = "LinkLedgeFlag";
-			   class = "NavMeshLinkFlagButton";
+               internalName = "LinkLedgeFlag";
+               class = "NavMeshLinkFlagButton";
                text = " Ledge";
                buttonType = "ToggleButton";
                useMouseEvents = "0";
@@ -542,15 +549,15 @@
                visible = "1";
                active = "0";
                tooltipProfile = "GuiToolTipProfile";
-			   toolTip = "Should the character jump at the next ledge?";
+               toolTip = "Should the character jump at the next ledge?";
                hovertime = "1000";
                isContainer = "0";
                canSave = "1";
                canSaveDynamicFields = "0";
             };
             new GuiCheckBoxCtrl() {
-			   internalName = "LinkClimbFlag";
-			   class = "NavMeshLinkFlagButton";
+               internalName = "LinkClimbFlag";
+               class = "NavMeshLinkFlagButton";
                text = " Climb";
                buttonType = "ToggleButton";
                useMouseEvents = "0";
@@ -562,15 +569,15 @@
                visible = "1";
                active = "0";
                tooltipProfile = "GuiToolTipProfile";
-			   toolTip = "Does this link involve climbing?";
+               toolTip = "Does this link involve climbing?";
                hovertime = "1000";
                isContainer = "0";
                canSave = "1";
                canSaveDynamicFields = "0";
             };
             new GuiCheckBoxCtrl() {
-			   internalName = "LinkTeleportFlag";
-			   class = "NavMeshLinkFlagButton";
+               internalName = "LinkTeleportFlag";
+               class = "NavMeshLinkFlagButton";
                text = " Teleport";
                buttonType = "ToggleButton";
                useMouseEvents = "0";
@@ -582,16 +589,14 @@
                visible = "1";
                active = "0";
                tooltipProfile = "GuiToolTipProfile";
-			   toolTip = "Is this link a teleporter?";
+               toolTip = "Is this link a teleporter?";
                hovertime = "1000";
                isContainer = "0";
                canSave = "1";
                canSaveDynamicFields = "0";
             };
          };
-         new GuiFlexibleArrayControl() {
-            colSpacing = 2;
-            rowSpacing = 2;
+         new GuiStackControl() {
             internalName = "TileProperties";
             position = "7 21";
             extent = "186 64";
@@ -613,7 +618,7 @@
                isContainer = "0";
                canSave = "1";
                canSaveDynamicFields = "0";
-			   variable = "$Nav::Editor::renderInput";
+               variable = "$Nav::Editor::renderInput";
             };
             new GuiCheckBoxCtrl() {
                text = " Display voxels";
@@ -631,24 +636,22 @@
                isContainer = "0";
                canSave = "1";
                canSaveDynamicFields = "0";
-			   variable = "$Nav::Editor::renderVoxels";
+               variable = "$Nav::Editor::renderVoxels";
             };
          };
-         new GuiFlexibleArrayControl() {
-            colSpacing = 2;
-            rowSpacing = 2;
+         new GuiStackControl() {
             internalName = "TestProperties";
             position = "7 21";
             extent = "186 64";
             padding = "2 2 2 2";
             
 			new GuiTextCtrl() {
-			   text = "Cover";
+               text = "Cover";
                profile = "GuiTextProfile";
                extent = "180 20";
                minExtent = "8 2";
                visible = "1";
-			};
+            };
             new GuiTextEditCtrl() {
                internalName = "CoverRadius";
                text = "10";
@@ -657,9 +660,9 @@
                minExtent = "8 2";
                visible = "1";
                tooltipProfile = "GuiToolTipProfile";
-			   toolTip = "Radius for cover-finding.";
+               toolTip = "Radius for cover-finding.";
             };
-			new GuiTextEditCtrl() {
+            new GuiTextEditCtrl() {
                internalName = "CoverPosition";
                text = "LocalClientConnection.getControlObject().getPosition();";
                profile = "GuiTextEditProfile";
@@ -667,15 +670,15 @@
                minExtent = "8 2";
                visible = "1";
                tooltipProfile = "GuiToolTipProfile";
-			   toolTip = "Position to find cover from.";
-			};
-			new GuiTextCtrl() {
-			   text = "Follow";
+               toolTip = "Position to find cover from.";
+            };
+            new GuiTextCtrl() {
+               text = "Follow";
                profile = "GuiTextProfile";
                extent = "180 20";
                minExtent = "8 2";
                visible = "1";
-			};
+            };
             new GuiTextEditCtrl() {
                internalName = "FollowRadius";
                text = "1";
@@ -684,9 +687,9 @@
                minExtent = "8 2";
                visible = "1";
                tooltipProfile = "GuiToolTipProfile";
-			   toolTip = "Radius for following.";
+               toolTip = "Radius for following.";
             };
-			new GuiTextEditCtrl() {
+            new GuiTextEditCtrl() {
                internalName = "FollowObject";
                text = "LocalClientConnection.player";
                profile = "GuiTextEditProfile";
@@ -694,18 +697,18 @@
                minExtent = "8 2";
                visible = "1";
                tooltipProfile = "GuiToolTipProfile";
-			   toolTip = "Object to follow.";
-			};
-			new GuiTextCtrl() {
-			   text = "Movement";
+               toolTip = "Object to follow.";
+            };
+            new GuiTextCtrl() {
+               text = "Movement";
                profile = "GuiTextProfile";
                extent = "180 20";
                minExtent = "8 2";
                visible = "1";
-			};
+            };
             new GuiCheckBoxCtrl() {
-			   internalName = "LinkWalkFlag";
-			   class = "NavMeshTestFlagButton";
+               internalName = "LinkWalkFlag";
+               class = "NavMeshTestFlagButton";
                text = " Walk";
                buttonType = "ToggleButton";
                useMouseEvents = "0";