MyGUI  3.2.0
MyGUI_SkinItem.cpp
Go to the documentation of this file.
00001 
00006 /*
00007     This file is part of MyGUI.
00008 
00009     MyGUI is free software: you can redistribute it and/or modify
00010     it under the terms of the GNU Lesser General Public License as published by
00011     the Free Software Foundation, either version 3 of the License, or
00012     (at your option) any later version.
00013 
00014     MyGUI is distributed in the hope that it will be useful,
00015     but WITHOUT ANY WARRANTY; without even the implied warranty of
00016     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00017     GNU Lesser General Public License for more details.
00018 
00019     You should have received a copy of the GNU Lesser General Public License
00020     along with MyGUI.  If not, see <http://www.gnu.org/licenses/>.
00021 */
00022 
00023 #include "MyGUI_Precompiled.h"
00024 #include "MyGUI_SkinItem.h"
00025 #include "MyGUI_FactoryManager.h"
00026 #include "MyGUI_Widget.h"
00027 #include "MyGUI_RenderManager.h"
00028 
00029 namespace MyGUI
00030 {
00031     SkinItem::SkinItem() :
00032         mText(nullptr),
00033         mMainSkin(nullptr),
00034         mTexture(nullptr),
00035         mSubSkinsVisible(true)
00036     {
00037     }
00038 
00039     void SkinItem::_setSkinItemAlign(const IntSize& _size)
00040     {
00041         for (VectorSubWidget::iterator skin = mSubSkinChild.begin(); skin != mSubSkinChild.end(); ++skin)
00042             (*skin)->_setAlign(_size);
00043     }
00044 
00045     void SkinItem::_setSkinItemVisible(bool _value)
00046     {
00047         for (VectorSubWidget::iterator skin = mSubSkinChild.begin(); skin != mSubSkinChild.end(); ++skin)
00048             (*skin)->setVisible(_value);
00049     }
00050 
00051     void SkinItem::_setSkinItemColour(const Colour& _value)
00052     {
00053         for (VectorSubWidget::iterator skin = mSubSkinChild.begin(); skin != mSubSkinChild.end(); ++skin)
00054         {
00055             ISubWidgetRect* rect = (*skin)->castType<ISubWidgetRect>(false);
00056             if (rect)
00057                 rect->_setColour(_value);
00058         }
00059     }
00060 
00061     void SkinItem::_setSkinItemAlpha(float _value)
00062     {
00063         for (VectorSubWidget::iterator skin = mSubSkinChild.begin(); skin != mSubSkinChild.end(); ++skin)
00064             (*skin)->setAlpha(_value);
00065     }
00066 
00067     void SkinItem::_correctSkinItemView()
00068     {
00069         for (VectorSubWidget::iterator skin = mSubSkinChild.begin(); skin != mSubSkinChild.end(); ++skin)
00070             (*skin)->_correctView();
00071     }
00072 
00073     void SkinItem::_updateSkinItemView()
00074     {
00075         for (VectorSubWidget::iterator skin = mSubSkinChild.begin(); skin != mSubSkinChild.end(); ++skin)
00076             (*skin)->_updateView();
00077     }
00078 
00079     bool SkinItem::_setSkinItemState(const std::string& _state)
00080     {
00081         MapWidgetStateInfo::const_iterator iter = mStateInfo.find(_state);
00082         if (iter == mStateInfo.end())
00083             return false;
00084 
00085         size_t index = 0;
00086         for (VectorSubWidget::iterator skin = mSubSkinChild.begin(); skin != mSubSkinChild.end(); ++skin, ++index)
00087         {
00088             IStateInfo* data = (*iter).second[index];
00089             if (data != nullptr)
00090                 (*skin)->setStateData(data);
00091         }
00092         return true;
00093     }
00094 
00095     void SkinItem::_createSkinItem(ResourceSkin* _info)
00096     {
00097         mStateInfo = _info->getStateInfo();
00098 
00099         // все что с текстурой можно тоже перенести в скин айтем и setRenderItemTexture
00100         mTextureName = _info->getTextureName();
00101         mTexture = RenderManager::getInstance().getTexture(mTextureName);
00102 
00103         setRenderItemTexture(mTexture);
00104 
00105         // загружаем кирпичики виджета
00106         FactoryManager& factory = FactoryManager::getInstance();
00107         for (VectorSubWidgetInfo::const_iterator iter = _info->getBasisInfo().begin(); iter != _info->getBasisInfo().end(); ++iter)
00108         {
00109             IObject* object = factory.createObject("BasisSkin", (*iter).type);
00110             if (object == nullptr)
00111                 continue;
00112 
00113             ISubWidget* sub = object->castType<ISubWidget>();
00114             sub->_setCroppedParent(static_cast<Widget*>(this));
00115             sub->setCoord((*iter).coord);
00116             sub->setAlign((*iter).align);
00117 
00118             mSubSkinChild.push_back(sub);
00119             addRenderItem(sub);
00120 
00121             // ищем дефолтные сабвиджеты
00122             if (mMainSkin == nullptr)
00123                 mMainSkin = sub->castType<ISubWidgetRect>(false);
00124             if (mText == nullptr)
00125                 mText = sub->castType<ISubWidgetText>(false);
00126         }
00127 
00128         _setSkinItemState("normal");
00129     }
00130 
00131     void SkinItem::_deleteSkinItem()
00132     {
00133         mTexture = nullptr;
00134 
00135         mStateInfo.clear();
00136 
00137         removeAllRenderItems();
00138         // удаляем все сабскины
00139         mMainSkin = nullptr;
00140         mText = nullptr;
00141 
00142         for (VectorSubWidget::iterator skin = mSubSkinChild.begin(); skin != mSubSkinChild.end(); ++skin)
00143             delete (*skin);
00144         mSubSkinChild.clear();
00145     }
00146 
00147     void SkinItem::_setTextureName(const std::string& _texture)
00148     {
00149         mTextureName = _texture;
00150         mTexture = RenderManager::getInstance().getTexture(mTextureName);
00151 
00152         setRenderItemTexture(mTexture);
00153     }
00154 
00155     const std::string& SkinItem::_getTextureName() const
00156     {
00157         return mTextureName;
00158     }
00159 
00160     void SkinItem::_setSubSkinVisible(bool _visible)
00161     {
00162         if (mSubSkinsVisible == _visible)
00163             return;
00164         mSubSkinsVisible = _visible;
00165 
00166         _updateSkinItemView();
00167     }
00168 
00169     ISubWidgetText* SkinItem::getSubWidgetText()
00170     {
00171         return mText;
00172     }
00173 
00174     ISubWidgetRect* SkinItem::getSubWidgetMain()
00175     {
00176         return mMainSkin;
00177     }
00178 
00179 } // namespace MyGUI