Browse Source

Added the GuiChainCtrl

Added a new Gui control that orders its children in a single line while allowing them to maintain their unique size.
Greenfire27 4 years ago
parent
commit
3a471eb67e

+ 3 - 0
engine/compilers/VisualStudio 2017/Torque 2D.vcxproj

@@ -395,6 +395,7 @@
     <ClCompile Include="..\..\source\graphics\TextureDictionary.cc" />
     <ClCompile Include="..\..\source\graphics\TextureHandle.cc" />
     <ClCompile Include="..\..\source\graphics\TextureManager.cc" />
+    <ClCompile Include="..\..\source\gui\containers\guiChainCtrl.cc" />
     <ClCompile Include="..\..\source\gui\containers\guiExpandCtrl.cc" />
     <ClCompile Include="..\..\source\gui\containers\guiGridCtrl.cc" />
     <ClCompile Include="..\..\source\gui\containers\guiTabPageCtrl.cc" />
@@ -929,6 +930,8 @@
     <ClInclude Include="..\..\source\graphics\TextureObject.h" />
     <ClInclude Include="..\..\source\gui\buttons\guiButtonCtrl_ScriptBinding.h" />
     <ClInclude Include="..\..\source\gui\buttons\guiCheckBoxCtrl_ScriptBinding.h" />
+    <ClInclude Include="..\..\source\gui\containers\guiChainCtrl.h" />
+    <ClInclude Include="..\..\source\gui\containers\guiChainCtrl_ScriptBinding.h" />
     <ClInclude Include="..\..\source\gui\containers\guiExpandCtrl.h" />
     <ClInclude Include="..\..\source\gui\containers\guiExpandCtrl_ScriptBinding.h" />
     <ClInclude Include="..\..\source\gui\containers\guiGridCtrl.h" />

+ 9 - 0
engine/compilers/VisualStudio 2017/Torque 2D.vcxproj.filters

@@ -1480,6 +1480,9 @@
     <ClCompile Include="..\..\source\gui\containers\guiPanelCtrl.cc">
       <Filter>gui\containers</Filter>
     </ClCompile>
+    <ClCompile Include="..\..\source\gui\containers\guiChainCtrl.cc">
+      <Filter>gui\containers</Filter>
+    </ClCompile>
   </ItemGroup>
   <ItemGroup>
     <ClInclude Include="..\..\source\audio\audio.h">
@@ -3325,6 +3328,12 @@
     <ClInclude Include="..\..\source\gui\buttons\guiButtonCtrl_ScriptBinding.h">
       <Filter>gui\buttons</Filter>
     </ClInclude>
+    <ClInclude Include="..\..\source\gui\containers\guiChainCtrl.h">
+      <Filter>gui\containers</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\source\gui\containers\guiChainCtrl_ScriptBinding.h">
+      <Filter>gui\containers</Filter>
+    </ClInclude>
   </ItemGroup>
   <ItemGroup>
     <CustomBuild Include="..\..\source\math\mMath_ASM.asm">

+ 143 - 0
engine/source/gui/containers/guiChainCtrl.cc

@@ -0,0 +1,143 @@
+//-----------------------------------------------------------------------------
+// Copyright (c) 2013 GarageGames, LLC
+//
+// 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/consoleTypes.h"
+#include "console/console.h"
+#include "gui/containers/guiChainCtrl.h"
+
+#include "guiChainCtrl_ScriptBinding.h"
+
+IMPLEMENT_CONOBJECT(GuiChainCtrl);
+
+//------------------------------------------------------------------------------
+
+GuiChainCtrl::GuiChainCtrl()
+{
+	mIsContainer = true;
+	mChildSpacing = 0;
+	mIsVertical = true;
+}
+
+//------------------------------------------------------------------------------
+
+void GuiChainCtrl::initPersistFields()
+{
+	Parent::initPersistFields();
+
+	addField("ChildSpacing", TypeS32, Offset(mChildSpacing, GuiChainCtrl));
+	addField("IsVertical", TypeBool, Offset(mIsVertical, GuiChainCtrl));
+}
+
+//------------------------------------------------------------------------------
+
+void GuiChainCtrl::inspectPostApply()
+{
+	calculateExtent();
+	Parent::inspectPostApply();
+}
+
+//------------------------------------------------------------------------------
+
+void GuiChainCtrl::childResized(GuiControl *child)
+{
+	calculateExtent();
+}
+
+void GuiChainCtrl::resize(const Point2I &newPosition, const Point2I &newExtent)
+{
+	Point2I actualNewExtent = newExtent;
+	if (mIsVertical)
+	{
+		actualNewExtent.y = getExtent().y;
+	}
+	else
+	{
+		actualNewExtent.x = getExtent().x;
+	}
+	if(newPosition != getPosition() || actualNewExtent != getExtent())
+	{
+		Parent::resize(newPosition, actualNewExtent);
+	}
+}
+
+void GuiChainCtrl::onChildAdded(GuiControl *child)
+{
+	Parent::onChildAdded(child);
+	calculateExtent();
+}
+
+void GuiChainCtrl::onChildRemoved(SimObject *child)
+{
+	calculateExtent();
+}
+
+void GuiChainCtrl::calculateExtent()
+{
+	RectI innerRect = getInnerRect(mBounds.point.Zero, getExtent(), NormalState, mProfile);
+
+	iterator i;
+	S32 length = 0;
+	for (i = begin(); i != end(); i++)
+	{
+		GuiControl *ctrl = static_cast<GuiControl *>(*i);
+		if (ctrl->isVisible())
+		{
+			if (length != 0)
+			{
+				length += mChildSpacing;
+			}
+			Point2I childPos = ctrl->getPosition();
+			if (!mIsVertical)
+			{
+				childPos.x = length;
+			}
+			else
+			{
+				childPos.y = length;
+			}
+			ctrl->setPosition(childPos);
+			length += mIsVertical ? ctrl->getExtent().y : ctrl->getExtent().x;
+		}
+	}
+
+	if (!mIsVertical)
+	{
+		innerRect.extent.x = length;
+	}
+	else
+	{
+		innerRect.extent.y = length;
+	}
+
+	//call set update both before and after
+	setUpdate();
+
+	Point2I oldExtent = getExtent();
+	mBounds.extent = getOuterExtent(innerRect.extent, NormalState, mProfile);
+	GuiControl *parent = getParent();
+
+	if(oldExtent != getExtent() && parent)
+	{
+		parent->childResized(this);
+	}
+	setUpdate();
+}

+ 42 - 0
engine/source/gui/containers/guiChainCtrl.h

@@ -0,0 +1,42 @@
+#ifndef _GUICHAINCTRL_H_
+#define _GUICHAINCTRL_H_
+
+#ifndef _GUICONTROL_H_
+#include "gui/guiControl.h"
+#endif
+
+#ifndef _VECTOR2_H_
+#include "2d/core/Vector2.h"
+#endif
+
+#include "graphics/dgl.h"
+#include "console/console.h"
+#include "console/consoleTypes.h"
+
+class GuiChainCtrl : public GuiControl
+{
+private:
+	typedef GuiControl Parent;
+	S32 mChildSpacing;
+	bool mIsVertical;
+
+	void calculateExtent();
+
+public:
+	GuiChainCtrl();
+
+	void childResized(GuiControl *child);
+	void resize(const Point2I &newPosition, const Point2I &newExtent);
+	void inspectPostApply();
+	void onChildAdded(GuiControl *child);
+	void onChildRemoved(SimObject *child);
+
+	inline void setChildSpacing(S32 space) { mChildSpacing = space; }
+	inline S32 getChildSpacing() { return mChildSpacing; }
+	inline bool getIsVertical() { return mIsVertical; }
+
+	static void initPersistFields();
+	DECLARE_CONOBJECT(GuiChainCtrl);
+};
+
+#endif // _GUICHAINCTRL_H_

+ 63 - 0
engine/source/gui/containers/guiChainCtrl_ScriptBinding.h

@@ -0,0 +1,63 @@
+//-----------------------------------------------------------------------------
+// Copyright (c) 2013 GarageGames, LLC
+//
+// 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.
+//-----------------------------------------------------------------------------
+
+ConsoleMethodGroupBeginWithDocs(GuiChainCtrl, GuiControl)
+
+/*! Sets the spacing used between each child control. Note that if child controls use margin, there will appear to be additional spacing.
+	@param spacing The spacing to be used.
+	@return No return value.
+*/
+ConsoleMethodWithDocs(GuiChainCtrl, setChildSpacing, ConsoleVoid, 3, 3, (int spacing))
+{
+	F32 spacing;
+
+	if (argc > 2)
+	{
+		spacing = dAtoi(argv[2]);
+	}
+	else
+	{
+		Con::warnf("GuiChainCtrl::setChildSpacing() - Invalid number of parameters!");
+		return;
+	}
+
+	// Set Position.
+	object->setChildSpacing(spacing);
+}
+
+/*! Gets the spacing that will be between each child control.
+	@return (int spacing) The spacing between each child.
+*/
+ConsoleMethodWithDocs(GuiChainCtrl, getChildSpacing, ConsoleInt, 2, 2, ())
+{
+	return object->getChildSpacing();
+}
+
+/*! Returns true if the chain of children are arranged vertically, false if they are arranged horizontally.
+	@return The direction of the chain.
+*/
+ConsoleMethodWithDocs(GuiChainCtrl, getIsVertical, ConsoleBool, 2, 2, ())
+{
+	return object->getIsVertical();
+}
+
+ConsoleMethodGroupEndWithDocs(GuiChainCtrl)