MyGUI  3.2.1
MyGUI_SkinItem.cpp
Go to the documentation of this file.
00001 /*
00002  * This source file is part of MyGUI. For the latest info, see http://mygui.info/
00003  * Distributed under the MIT License
00004  * (See accompanying file COPYING.MIT or copy at http://opensource.org/licenses/MIT)
00005  */
00006 
00007 #include "MyGUI_Precompiled.h"
00008 #include "MyGUI_SkinItem.h"
00009 #include "MyGUI_FactoryManager.h"
00010 #include "MyGUI_Widget.h"
00011 #include "MyGUI_RenderManager.h"
00012 #include "MyGUI_SubWidgetManager.h"
00013 
00014 namespace MyGUI
00015 {
00016     SkinItem::SkinItem() :
00017         mText(nullptr),
00018         mMainSkin(nullptr),
00019         mTexture(nullptr),
00020         mSubSkinsVisible(true)
00021     {
00022     }
00023 
00024     void SkinItem::_setSkinItemAlign(const IntSize& _size)
00025     {
00026         for (VectorSubWidget::iterator skin = mSubSkinChild.begin(); skin != mSubSkinChild.end(); ++skin)
00027             (*skin)->_setAlign(_size);
00028     }
00029 
00030     void SkinItem::_setSkinItemVisible(bool _value)
00031     {
00032         for (VectorSubWidget::iterator skin = mSubSkinChild.begin(); skin != mSubSkinChild.end(); ++skin)
00033             (*skin)->setVisible(_value);
00034     }
00035 
00036     void SkinItem::_setSkinItemColour(const Colour& _value)
00037     {
00038         for (VectorSubWidget::iterator skin = mSubSkinChild.begin(); skin != mSubSkinChild.end(); ++skin)
00039         {
00040             ISubWidgetRect* rect = (*skin)->castType<ISubWidgetRect>(false);
00041             if (rect)
00042                 rect->_setColour(_value);
00043         }
00044     }
00045 
00046     void SkinItem::_setSkinItemAlpha(float _value)
00047     {
00048         for (VectorSubWidget::iterator skin = mSubSkinChild.begin(); skin != mSubSkinChild.end(); ++skin)
00049             (*skin)->setAlpha(_value);
00050     }
00051 
00052     void SkinItem::_correctSkinItemView()
00053     {
00054         for (VectorSubWidget::iterator skin = mSubSkinChild.begin(); skin != mSubSkinChild.end(); ++skin)
00055             (*skin)->_correctView();
00056     }
00057 
00058     void SkinItem::_updateSkinItemView()
00059     {
00060         for (VectorSubWidget::iterator skin = mSubSkinChild.begin(); skin != mSubSkinChild.end(); ++skin)
00061             (*skin)->_updateView();
00062     }
00063 
00064     bool SkinItem::_setSkinItemState(const std::string& _state)
00065     {
00066         MapWidgetStateInfo::const_iterator iter = mStateInfo.find(_state);
00067         if (iter == mStateInfo.end())
00068             return false;
00069 
00070         size_t index = 0;
00071         for (VectorSubWidget::iterator skin = mSubSkinChild.begin(); skin != mSubSkinChild.end(); ++skin, ++index)
00072         {
00073             IStateInfo* data = (*iter).second[index];
00074             if (data != nullptr)
00075                 (*skin)->setStateData(data);
00076         }
00077         return true;
00078     }
00079 
00080     void SkinItem::_createSkinItem(ResourceSkin* _info)
00081     {
00082         mStateInfo = _info->getStateInfo();
00083 
00084         // все что с текстурой можно тоже перенести в скин айтем и setRenderItemTexture
00085         mTextureName = _info->getTextureName();
00086         mTexture = RenderManager::getInstance().getTexture(mTextureName);
00087 
00088         setRenderItemTexture(mTexture);
00089 
00090         std::string categoryName = SubWidgetManager::getInstance().getCategoryName();
00091         // загружаем кирпичики виджета
00092         FactoryManager& factory = FactoryManager::getInstance();
00093         for (VectorSubWidgetInfo::const_iterator iter = _info->getBasisInfo().begin(); iter != _info->getBasisInfo().end(); ++iter)
00094         {
00095             IObject* object = factory.createObject(categoryName, (*iter).type);
00096             if (object == nullptr)
00097                 continue;
00098 
00099             ISubWidget* sub = object->castType<ISubWidget>();
00100             sub->_setCroppedParent(static_cast<Widget*>(this));
00101             sub->setCoord((*iter).coord);
00102             sub->setAlign((*iter).align);
00103 
00104             mSubSkinChild.push_back(sub);
00105             addRenderItem(sub);
00106 
00107             // ищем дефолтные сабвиджеты
00108             if (mMainSkin == nullptr)
00109                 mMainSkin = sub->castType<ISubWidgetRect>(false);
00110             if (mText == nullptr)
00111                 mText = sub->castType<ISubWidgetText>(false);
00112         }
00113 
00114         _setSkinItemState("normal");
00115     }
00116 
00117     void SkinItem::_deleteSkinItem()
00118     {
00119         mTexture = nullptr;
00120 
00121         mStateInfo.clear();
00122 
00123         removeAllRenderItems();
00124         // удаляем все сабскины
00125         mMainSkin = nullptr;
00126         mText = nullptr;
00127 
00128         for (VectorSubWidget::iterator skin = mSubSkinChild.begin(); skin != mSubSkinChild.end(); ++skin)
00129             delete (*skin);
00130         mSubSkinChild.clear();
00131     }
00132 
00133     void SkinItem::_setTextureName(const std::string& _texture)
00134     {
00135         mTextureName = _texture;
00136         mTexture = RenderManager::getInstance().getTexture(mTextureName);
00137 
00138         setRenderItemTexture(mTexture);
00139     }
00140 
00141     const std::string& SkinItem::_getTextureName() const
00142     {
00143         return mTextureName;
00144     }
00145 
00146     void SkinItem::_setSubSkinVisible(bool _visible)
00147     {
00148         if (mSubSkinsVisible == _visible)
00149             return;
00150         mSubSkinsVisible = _visible;
00151 
00152         _updateSkinItemView();
00153     }
00154 
00155     ISubWidgetText* SkinItem::getSubWidgetText()
00156     {
00157         return mText;
00158     }
00159 
00160     ISubWidgetRect* SkinItem::getSubWidgetMain()
00161     {
00162         return mMainSkin;
00163     }
00164 
00165 } // namespace MyGUI