34 std::string_view _skinName,
37 std::string_view _name)
50 mWidgetStyle = _style;
57#if MYGUI_DEBUG_MODE == 1
81 const WidgetInfo* root = initialiseWidgetSkinBase(skinInfo, templateInfo);
87 mParent->addChildItem(
this);
94 mParent->addChildNode(
this);
100 if (skinInfo !=
nullptr)
101 setSkinProperty(skinInfo);
121 shutdownWidgetSkinBase();
129 mParent->removeChildItem(
this);
136 mParent->removeChildNode(
this);
157 shutdownWidgetSkinBase();
158 const WidgetInfo* root = initialiseWidgetSkinBase(skinInfo, templateInfo);
164 if (skinInfo !=
nullptr)
165 setSkinProperty(skinInfo);
179 bool skinOnly =
false;
181 if (_skinInfo ==
nullptr)
184 std::string_view skinName;
187 for (
const auto& item : data)
189 if (item.name ==
"Root")
191 skinName = item.skin;
203 if (_skinInfo !=
nullptr)
218#ifndef MYGUI_DONT_USE_OBSOLETE
220 for (
const auto& property : properties)
227 <<
" skin property is deprecated, move it to UserString in a widget in ResourceLayout"
236 for (
const auto& iter : child)
248 for (
const auto& prop : iter.params)
249 widget->setUserString(prop.first, prop.second);
275 void Widget::shutdownWidgetSkinBase()
282 for (
auto& iter : mWidgetChildSkin)
285 mWidgetChild.push_back(iter);
288 mWidgetChildSkin.clear();
290 mWidgetClient =
nullptr;
295 std::string_view _type,
296 std::string_view _skin,
299 std::string_view _layer,
300 std::string_view _name,
315 mWidgetChildSkin.push_back(widget);
319 if (mWidgetClient !=
nullptr)
322 mWidgetClient->
baseCreateWidget(_style, _type, _skin, _coord, _align, _layer, _name, _template);
350 std::string_view _type,
351 std::string_view _skin,
354 std::string_view _name)
376 for (
auto& widget : mWidgetChild)
377 widget->_updateView();
378 for (
auto& widget : mWidgetChildSkin)
379 widget->_updateView();
398 for (
auto& widget : mWidgetChild)
399 widget->_updateView();
400 for (
auto& widget : mWidgetChildSkin)
401 widget->_updateView();
413 MYGUI_ASSERT(
nullptr != _widget,
"invalid widget pointer");
415 if (mParent !=
nullptr && mParent->getClientWidget() ==
this)
416 mParent->onWidgetDestroy(_widget);
420 VectorWidgetPtr::iterator iter = std::find(mWidgetChild.begin(), mWidgetChild.end(), _widget);
421 if (iter != mWidgetChild.end())
427 mWidgetChild.erase(iter);
445 while (!mWidgetChild.empty())
448 Widget* widget = mWidgetChild.back();
449 mWidgetChild.pop_back();
461 if (mWidgetClient !=
nullptr)
462 return mWidgetClient->getCoord();
468 if (mAlpha == _alpha)
475 void Widget::_updateAlpha()
477 if (
nullptr != mParent)
478 mRealAlpha = mAlpha * (mInheritsAlpha ? mParent->_getRealAlpha() :
ALPHA_MAX);
482 for (
auto& widget : mWidgetChild)
483 widget->_updateAlpha();
484 for (
auto& widget : mWidgetChildSkin)
485 widget->_updateAlpha();
492 mInheritsAlpha = _inherits;
506 for (VectorWidgetPtr::const_reverse_iterator widget = mWidgetChild.rbegin(); widget != mWidgetChild.rend();
518 for (VectorWidgetPtr::const_reverse_iterator widget = mWidgetChildSkin.rbegin();
519 widget != mWidgetChildSkin.rend();
531 void Widget::_updateAbsolutePoint()
539 for (
auto& widget : mWidgetChild)
540 widget->_updateAbsolutePoint();
541 for (
auto& widget : mWidgetChildSkin)
542 widget->_updateAbsolutePoint();
549 if (mWidgetClient !=
nullptr)
551 mWidgetClient->_forcePick(_widget);
555 auto iter = std::find(mWidgetChild.begin(), mWidgetChild.end(), _widget);
556 if (iter == mWidgetChild.end())
559 for (
auto& widget : mWidgetChild)
561 if (widget == _widget)
563 else if (widget->getDepth() == -1)
569 mWidgetChild.begin(),
571 [](
Widget* lhs,
Widget* rhs) { return lhs->getDepth() < rhs->getDepth(); });
579 if (mWidgetClient !=
nullptr)
582 for (
const auto& widget : mWidgetChild)
614 const IntSize& size = _newSize;
616 bool need_move =
false;
617 bool need_size =
false;
621 if (mAlign.isHStretch())
627 else if (mAlign.isRight())
633 else if (mAlign.isHCenter())
640 if (mAlign.isVStretch())
646 else if (mAlign.isBottom())
652 else if (mAlign.isVCenter())
681 for (
auto& widget : mWidgetChild)
682 widget->_updateAbsolutePoint();
683 for (
auto& widget : mWidgetChildSkin)
684 widget->_updateAbsolutePoint();
717 for (
auto& widget : mWidgetChild)
718 widget->_setAlign(old,
getSize());
719 for (
auto& widget : mWidgetChildSkin)
720 widget->_setAlign(old,
getSize());
735 for (
auto& widget : mWidgetChild)
736 widget->_updateAbsolutePoint();
737 for (
auto& widget : mWidgetChildSkin)
738 widget->_updateAbsolutePoint();
762 for (
auto& widget : mWidgetChild)
764 for (
auto& widget : mWidgetChildSkin)
782 std::string_view oldlayer;
796 mParent->removeChildItem(
this);
800 mParent->removeChildNode(
this);
810 for (
auto& widget : mWidgetChild)
811 widget->_updateAbsolutePoint();
812 for (
auto& widget : mWidgetChildSkin)
813 widget->_updateAbsolutePoint();
826 mParent->_unlinkChildWidget(
this);
834 else if (!oldlayer.empty())
845 MYGUI_ASSERT(_parent !=
this,
"cyclic attach (attaching to self)");
860 mWidgetStyle = _style;
864 if (mParent ==
nullptr)
867 mParent->_unlinkChildWidget(
this);
870 mParent->_linkChildWidget(
this);
883 if (mParent ==
nullptr)
886 mParent->_unlinkChildWidget(
this);
890 mParent->_linkChildWidget(
this);
895 for (
auto& widget : mWidgetChild)
896 widget->_updateAbsolutePoint();
897 for (
auto& widget : mWidgetChildSkin)
898 widget->_updateAbsolutePoint();
906 if (mParent ==
nullptr)
909 mParent->_unlinkChildWidget(
this);
912 mParent->_linkChildWidget(
this);
917 for (
auto& widget : mWidgetChild)
918 widget->_updateAbsolutePoint();
919 for (
auto& widget : mWidgetChildSkin)
920 widget->_updateAbsolutePoint();
922 mParent->addChildNode(
this);
932 if (_style == mWidgetStyle)
945 std::string_view _type,
946 std::string_view _skin,
949 std::string_view _name)
955 std::string_view _type,
956 std::string_view _skin,
962 std::string_view _name)
968 std::string_view _type,
969 std::string_view _skin,
975 std::string_view _name)
982 std::string_view _type,
983 std::string_view _skin,
986 std::string_view _layer,
987 std::string_view _name)
989 return baseCreateWidget(_style, _type, _skin, _coord, _align, _layer, _name,
false);
994 if (mWidgetClient !=
nullptr)
995 return mWidgetClient->getEnumerator();
996 return {mWidgetChild.begin(), mWidgetChild.end()};
1001 if (mWidgetClient !=
nullptr)
1002 return mWidgetClient->getChildCount();
1003 return mWidgetChild.size();
1008 if (mWidgetClient !=
nullptr)
1011 return mWidgetChild[_index];
1024 if (mVisible == _value)
1031 void Widget::_updateVisible()
1034 mInheritedVisible = mVisible && mInheritedVisible;
1038 for (
auto& widget : mWidgetChild)
1039 widget->_updateVisible();
1040 for (
auto& widget : mWidgetChildSkin)
1041 widget->_updateVisible();
1051 if (mEnabled == _value)
1058 void Widget::_updateEnabled()
1061 mInheritedEnabled = mInheritedEnabled && mEnabled;
1063 for (
auto& iter : mWidgetChild)
1064 iter->_updateEnabled();
1065 for (
auto& iter : mWidgetChildSkin)
1066 iter->_updateEnabled();
1070 if (!mInheritedEnabled)
1078 for (
auto& widget : mWidgetChildSkin)
1079 widget->setColour(_value);
1104 void Widget::_linkChildWidget(
Widget* _widget)
1106 VectorWidgetPtr::iterator iter = std::find(mWidgetChild.begin(), mWidgetChild.end(), _widget);
1107 MYGUI_ASSERT(iter == mWidgetChild.end(),
"widget already exist");
1111 void Widget::_unlinkChildWidget(Widget* _widget)
1113 VectorWidgetPtr::iterator iter = std::remove(mWidgetChild.begin(), mWidgetChild.end(), _widget);
1114 MYGUI_ASSERT(iter != mWidgetChild.end(),
"widget not found");
1115 mWidgetChild.erase(iter);
1131 for (
const auto& property : properties)
1137 std::string key{_key};
1138 std::string value{_value};
1142 size_t index = key.find(
'_');
1143 if (index != std::string::npos)
1147 "Widget property '" << key <<
"' have type prefix - use '" << key.substr(index + 1) <<
"' instead ["
1149 key = key.substr(index + 1);
1160 for (
const auto& childSkin : mWidgetChildSkin)
1161 childSkin->findWidgets(_name, result);
1169 _result.push_back(
this);
1171 if (mWidgetClient !=
nullptr)
1173 mWidgetClient->findWidgets(_name, _result);
1177 for (
const auto& widget : mWidgetChild)
1178 widget->findWidgets(_name, _result);
1192 MYGUI_ASSERT(mWidgetClient !=
this,
"mWidgetClient can not be this widget");
1193 mWidgetClient = _widget;
1208 std::string_view _type,
1209 std::string_view _skin,
1212 std::string_view _layer,
1213 std::string_view _name)
1215 return baseCreateWidget(_style, _type, _skin, _coord, _align, _layer, _name,
true);
1221 if (_key ==
"Position")
1225 else if (_key ==
"Size")
1229 else if (_key ==
"Coord")
1233 else if (_key ==
"Visible")
1237 else if (_key ==
"Depth")
1241 else if (_key ==
"Alpha")
1245 else if (_key ==
"Colour")
1249 else if (_key ==
"InheritsAlpha")
1253 else if (_key ==
"InheritsPick")
1257 else if (_key ==
"MaskPick")
1261 else if (_key ==
"NeedKey")
1265 else if (_key ==
"NeedMouse")
1269 else if (_key ==
"Enabled")
1273 else if (_key ==
"NeedToolTip")
1277 else if (_key ==
"Pointer")
1284 "Widget '" <<
getName() <<
"|" <<
getTypeName() <<
"' have unknown property '" << _key <<
"' "
1344 return mInheritsAlpha;
1369 return mWidgetClient;
1374 return mWidgetClient;
1379 return mWidgetStyle;
1389 mContainer = _value;
1407 float Widget::_getRealAlpha()
const
1414 return mInheritedEnabled;
1419 return mInheritedVisible;
1422 void Widget::resizeLayerItemView(
const IntSize& _oldView,
const IntSize& _newView)
1429 if (mDepth == _value)
1434 if (mParent !=
nullptr)
1436 mParent->_unlinkChildWidget(
this);
1437 mParent->_linkChildWidget(
this);
1438 mParent->_updateChilds();
1447 void Widget::addWidget(
Widget* _widget)
1453 for (
size_t index = 0; index < mWidgetChild.size(); ++index)
1455 Widget* widget = mWidgetChild[index];
1458 mWidgetChild.insert(mWidgetChild.begin() + index, _widget);
1464 mWidgetChild.push_back(_widget);
1469 for (
auto& widget : mWidgetChild)
1478 for (
auto& widget : mWidgetChild)
#define MYGUI_ASSERT(exp, dest)
#define MYGUI_EXCEPT(dest)
#define MYGUI_ASSERT_RANGE(index, size, owner)
#define MYGUI_LOG(level, text)
static bool isIgnoreProperty(std::string_view _key)
static bool checkProperty(Widget *_owner, std::string &_key, std::string &_value)
static IntCoord convertFromRelative(const FloatCoord &_coord, const IntSize &_view)
void _unlinkChildWidget(Widget *_widget)
void _linkChildWidget(Widget *_widget)
static Gui & getInstance()
const IntPoint & getAbsolutePosition() const
bool _checkOutside() const
ICroppedRectangle * mCroppedParent
IntPoint mAbsolutePosition
int _getViewRight() const
int _getViewBottom() const
const std::string & getName() const
virtual const IntSize & getSize() const =0
virtual ILayerItem * getLayerItemByPoint(int _left, int _top) const =0
void detachFromLayerItemNode(bool _deep)
void addChildItem(LayerItem *_item)
void removeChildItem(LayerItem *_item)
ILayer * getLayer() const
void detachFromLayer(Widget *_item)
static LayerManager & getInstance()
void attachToLayerNode(std::string_view _name, Widget *_item)
const std::string & getCurrentLayout() const
static LayoutManager & getInstance()
ResourceLayout * getByName(std::string_view _name, bool _throw=true) const
virtual const IntSize & getViewSize() const =0
static RenderManager & getInstance()
Widget * createWidget(const WidgetInfo &_widgetInfo, std::string_view _prefix={}, Widget *_parent=nullptr, bool _template=false)
const VectorWidgetInfo & getLayoutData() const
const IntSize & getSize() const
const MapString & getProperties() const
const VectorChildSkinInfo & getChild() const
void _correctSkinItemView()
void _setSkinItemAlpha(float _value)
void _createSkinItem(ResourceSkin *_info)
void _setSkinItemColour(const Colour &_value)
bool _setSkinItemState(std::string_view _state)
void _updateSkinItemView()
void _setSubSkinVisible(bool _visible)
void _setSkinItemAlign(const IntSize &_size)
void _setSkinItemVisible(bool _value)
static SkinManager & getInstance()
ResourceSkin * getByName(std::string_view _name) const
void setUserString(std::string_view _key, std::string_view _value)
void setUserData(Any _data)
T parseValue(std::string_view _value)
constexpr float ALPHA_MAX
types::TPoint< int > IntPoint
types::TCoord< float > FloatCoord
std::map< std::string, std::string, std::less<> > MapString
std::vector< WidgetInfo > VectorWidgetInfo
Enumerator< VectorWidgetPtr > EnumeratorWidgetPtr
types::TPoint< float > FloatPoint
constexpr size_t ITEM_NONE
types::TSize< float > FloatSize
types::TCoord< int > IntCoord
types::TSize< int > IntSize
std::vector< Widget * > VectorWidgetPtr
std::vector< ChildSkinInfo > VectorChildSkinInfo
TPoint< T > point() const