#include "BsGUITextField.h" #include "BsGUIArea.h" #include "BsGUILayout.h" #include "BsGUILabel.h" #include "BsGUIInputBox.h" #include "BsBuiltinResources.h" #include "BsGUIWidget.h" #include "BsGUIMouseEvent.h" #include "BsGUIWidget.h" using namespace CamelotFramework; using namespace BansheeEngine; namespace BansheeEditor { GUITextField::GUITextField(const PrivatelyConstruct& dummy, GUIWidget& parent, const GUIContent& labelContent, GUIElementStyle* labelStyle, GUIElementStyle* inputBoxStyle, const GUILayoutOptions& layoutOptions) :GUIElementContainer(parent, layoutOptions), mLabel(nullptr), mInputBox(nullptr), mLabelWidth(100) { const GUIElementStyle* curLabelStyle = labelStyle; const GUIElementStyle* curInputBoxStyle = inputBoxStyle; if(curLabelStyle == nullptr) curLabelStyle = parent.getSkin().getStyle("Label"); if(curInputBoxStyle == nullptr) curInputBoxStyle = parent.getSkin().getStyle("InputBox"); mLabel = GUILabel::create(parent, labelContent, curLabelStyle); mInputBox = GUIInputBox::create(parent, false, inputBoxStyle); _registerChildElement(mLabel); _registerChildElement(mInputBox); } GUITextField::GUITextField(const PrivatelyConstruct& dummy, GUIWidget& parent, GUIElementStyle* labelStyle, GUIElementStyle* inputBoxStyle, const GUILayoutOptions& layoutOptions) :GUIElementContainer(parent, layoutOptions), mLabel(nullptr), mInputBox(nullptr), mLabelWidth(100) { const GUIElementStyle* curInputBoxStyle = inputBoxStyle; if(curInputBoxStyle == nullptr) curInputBoxStyle = parent.getSkin().getStyle("InputBox"); mInputBox = GUIInputBox::create(parent, false, inputBoxStyle); _registerChildElement(mInputBox); } GUITextField::~GUITextField() { } GUITextField* GUITextField::create(GUIWidget& parent, const GUIContent& labelContent, const GUIOptions& layoutOptions, GUIElementStyle* labelStyle, GUIElementStyle* inputBoxStyle) { return cm_new(PrivatelyConstruct(), parent, labelContent, labelStyle, inputBoxStyle, GUILayoutOptions::create(layoutOptions, &GUISkin::DefaultStyle)); } GUITextField* GUITextField::create(GUIWidget& parent, const GUIContent& labelContent, GUIElementStyle* labelStyle, GUIElementStyle* inputBoxStyle) { return cm_new(PrivatelyConstruct(), parent, labelContent, labelStyle, inputBoxStyle, GUILayoutOptions::create(&GUISkin::DefaultStyle)); } GUITextField* GUITextField::create(GUIWidget& parent, const HString& labelContent, const GUIOptions& layoutOptions, GUIElementStyle* labelStyle, GUIElementStyle* inputBoxStyle) { return cm_new(PrivatelyConstruct(), parent, GUIContent(labelContent), labelStyle, inputBoxStyle, GUILayoutOptions::create(layoutOptions, &GUISkin::DefaultStyle)); } GUITextField* GUITextField::create(GUIWidget& parent, const HString& labelContent, GUIElementStyle* labelStyle, GUIElementStyle* inputBoxStyle) { return cm_new(PrivatelyConstruct(), parent, GUIContent(labelContent), labelStyle, inputBoxStyle, GUILayoutOptions::create(&GUISkin::DefaultStyle)); } GUITextField* GUITextField::create(GUIWidget& parent, const GUIOptions& layoutOptions, GUIElementStyle* labelStyle, GUIElementStyle* inputBoxStyle) { return cm_new(PrivatelyConstruct(), parent, labelStyle, inputBoxStyle, GUILayoutOptions::create(layoutOptions, &GUISkin::DefaultStyle)); } GUITextField* GUITextField::create(GUIWidget& parent, GUIElementStyle* labelStyle, GUIElementStyle* inputBoxStyle) { return cm_new(PrivatelyConstruct(), parent, labelStyle, inputBoxStyle, GUILayoutOptions::create(&GUISkin::DefaultStyle)); } WString GUITextField::getValue() const { return mInputBox->getText(); } void GUITextField::setValue(const WString& value) { mInputBox->setText(value); } void GUITextField::setLabelWidth(UINT32 width) { mLabelWidth = width; markContentAsDirty(); } void GUITextField::_updateLayoutInternal(INT32 x, INT32 y, UINT32 width, UINT32 height, RectI clipRect, UINT8 widgetDepth, UINT16 areaDepth) { UINT32 inputBoxOffset = 0; UINT32 inputBoxWidth = width; if(mLabel != nullptr) { UINT32 labelWidth = mLabelWidth; Vector2I optimalSize = mLabel->_getOptimalSize(); INT32 yOffset = Math::roundToInt((height - optimalSize.y) * 0.5f); Vector2I offset(x, y + yOffset); mLabel->_setOffset(offset); mLabel->_setWidth(labelWidth); mLabel->_setHeight(optimalSize.y); mLabel->_setAreaDepth(areaDepth); mLabel->_setWidgetDepth(widgetDepth); RectI elemClipRect(clipRect.x - offset.x, clipRect.y - offset.y, clipRect.width, clipRect.height); mLabel->_setClipRect(elemClipRect); inputBoxOffset = labelWidth; inputBoxWidth = width - labelWidth; } Vector2I inputBoxSize = mInputBox->_getOptimalSize(); { Vector2I optimalSize = mInputBox->_getOptimalSize(); INT32 yOffset = Math::roundToInt((height - optimalSize.y) * 0.5f); Vector2I offset(x + inputBoxOffset, y + yOffset); mInputBox->_setOffset(offset); mInputBox->_setWidth(inputBoxWidth); mInputBox->_setHeight(optimalSize.y); mInputBox->_setAreaDepth(areaDepth); mInputBox->_setWidgetDepth(widgetDepth); RectI elemClipRect(clipRect.x - offset.x, clipRect.y - offset.y, clipRect.width, clipRect.height); mInputBox->_setClipRect(elemClipRect); } } Vector2I GUITextField::_getOptimalSize() const { Vector2I optimalsize = mInputBox->_getOptimalSize(); if(mLabel != nullptr) { optimalsize.x += mLabel->_getOptimalSize().x; optimalsize.y = std::max(optimalsize.y, mLabel->_getOptimalSize().y); } return optimalsize; } const String& GUITextField::getGUITypeName() { static String typeName = "GUITextField"; return typeName; } }