Torque3D/Engine/source/gui/editor/guiSeparatorCtrl.cpp

145 lines
5.2 KiB
C++
Raw Normal View History

2012-09-19 15:15:01 +00:00
//-----------------------------------------------------------------------------
// Copyright (c) 2012 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 "platform/platform.h"
#include "gui/editor/guiSeparatorCtrl.h"
#include "gfx/gfxDevice.h"
#include "gfx/gfxDrawUtil.h"
#include "console/console.h"
#include "console/consoleTypes.h"
#include "gui/core/guiCanvas.h"
#include "gui/core/guiDefaultControlRender.h"
2025-03-09 16:53:23 +00:00
#include "console/typeValidators.h"
2012-09-19 15:15:01 +00:00
IMPLEMENT_CONOBJECT(GuiSeparatorCtrl);
ConsoleDocClass( GuiSeparatorCtrl,
"@brief A control that renders a horizontal or vertical separator with "
"an optional text label (horizontal only)\n\n"
"@tsexample\n"
"new GuiSeparatorCtrl()\n"
"{\n"
" profile = \"GuiDefaultProfile\";\n"
" position = \"505 0\";\n"
" extent = \"10 17\";\n"
" minExtent = \"10 17\";\n"
" canSave = \"1\";\n"
" visible = \"1\";\n"
" horizSizing = \"left\";\n"
"};\n"
"@endtsexample\n\n"
"@ingroup GuiControls\n");
ImplementEnumType( GuiSeparatorType,
"GuiSeparatorCtrl orientations\n\n"
"@ingroup GuiControls" )
{ GuiSeparatorCtrl::separatorTypeVertical, "Vertical" },
{ GuiSeparatorCtrl::separatorTypeHorizontal,"Horizontal" }
EndImplementEnumType;
//--------------------------------------------------------------------------
GuiSeparatorCtrl::GuiSeparatorCtrl() : GuiControl()
{
mInvisible = false;
mTextLeftMargin = 0;
mMargin = 2;
setExtent( 12, 35 );
mSeparatorType = GuiSeparatorCtrl::separatorTypeVertical;
}
//--------------------------------------------------------------------------
void GuiSeparatorCtrl::initPersistFields()
{
docsURL;
2012-09-19 15:15:01 +00:00
addField("caption", TypeRealString, Offset(mText, GuiSeparatorCtrl),
"Optional text label to display." );
addField("type", TYPEID< separatorTypeOptions >(), Offset(mSeparatorType, GuiSeparatorCtrl),
"Orientation of separator." );
2025-03-09 16:53:23 +00:00
addFieldV("borderMargin", TypeRangedS32, Offset(mMargin, GuiSeparatorCtrl), &CommonValidators::PositiveInt);
2012-09-19 15:15:01 +00:00
addField("invisible", TypeBool, Offset(mInvisible, GuiSeparatorCtrl));// Nonsense. Should use GuiControl's visibility.
2025-03-09 16:53:23 +00:00
addFieldV("leftMargin", TypeRangedS32, Offset(mTextLeftMargin, GuiSeparatorCtrl), &CommonValidators::PositiveInt,
2012-09-19 15:15:01 +00:00
"Left margin of text label." );
Parent::initPersistFields();
}
//--------------------------------------------------------------------------
void GuiSeparatorCtrl::onRender(Point2I offset, const RectI &updateRect)
{
Parent::onRender( offset, updateRect );
if( mInvisible )
return;
if( mText.isNotEmpty() && mSeparatorType != separatorTypeVertical )
{
// If text is present and we have a left margin, then draw some separator, then the
// text, and then the rest of the separator.
S32 posx = offset.x + mMargin;
S32 fontheight = mProfile->mFont->getHeight();
S32 seppos = (fontheight - 2) / 2 + offset.y;
if( mTextLeftMargin > 0 )
{
RectI rect( Point2I( posx, seppos ), Point2I( mTextLeftMargin, 2 ) );
renderSlightlyLoweredBox(rect, mProfile);
posx += mTextLeftMargin;
}
GFX->getDrawUtil()->setBitmapModulation( mProfile->mFontColor );
posx = GFX->getDrawUtil()->drawText(mProfile->mFont, Point2I(posx,offset.y), mText, mProfile->mFontColors);
RectI rect( Point2I( posx, seppos ), Point2I( getWidth() - posx + offset.x, 2 ) );
// Space text and separator a bit apart at right end.
rect.point.x += 2;
rect.extent.x -= 2;
if( rect.extent.x > 0 )
renderSlightlyLoweredBox( rect, mProfile );
}
else
{
if( mSeparatorType == separatorTypeHorizontal )
{
S32 seppos = getHeight() / 2 + offset.y;
RectI rect(Point2I(offset.x + mMargin ,seppos),Point2I(getWidth() - (mMargin * 2),2));
renderSlightlyLoweredBox(rect, mProfile);
}
else
{
S32 seppos = getWidth() / 2 + offset.x;
RectI rect(Point2I(seppos, offset.y + mMargin),Point2I(2, getHeight() - (mMargin * 2)));
renderSlightlyLoweredBox(rect, mProfile);
}
}
renderChildControls(offset, updateRect);
}