1 /*! 2 @file 3 @author Georgiy Evmenov 4 @date 09/2008 5 */ 6 7 #include "Precompiled.h" 8 #include "Common.h" 9 #include "WidgetsWindow.h" 10 #include "EditorWidgets.h" 11 #include "WidgetTypes.h" 12 #include "UndoManager.h" 13 #include "SettingsManager.h" 14 #include "WidgetCreatorManager.h" 15 16 namespace tools 17 { 18 WidgetsWindow(MyGUI::Widget * _parent)19 WidgetsWindow::WidgetsWindow(MyGUI::Widget* _parent) : 20 BaseLayout("WidgetsWindow.layout", _parent), 21 mTabSkins(nullptr), 22 mPopupMode(nullptr), 23 mWidgetsButtonWidth(0), 24 mWidgetsButtonHeight(0), 25 mWidgetsButtonOffset(0) 26 { 27 assignWidget(mTabSkins, "tabSkins"); 28 assignWidget(mPopupMode, "PopupMode"); 29 30 mPopupMode->eventMouseButtonClick += MyGUI::newDelegate(this, &WidgetsWindow::notifyMouseButtonClickPopupMode); 31 32 mWidgetsButtonWidth = SettingsManager::getInstance().getValue<int>("Controls/WidgetsWindow/WidgetsButtonWidth"); 33 mWidgetsButtonHeight = SettingsManager::getInstance().getValue<int>("Controls/WidgetsWindow/WidgetsButtonHeight"); 34 mWidgetsButtonOffset = SettingsManager::getInstance().getValue<int>("Controls/WidgetsWindow/WidgetsButtonOffset"); 35 mSkinSheetName = SettingsManager::getInstance().getValue("Controls/WidgetsWindow/LastSkinGroup"); 36 37 if (!SettingsManager::getInstance().tryGetValue("Controls/WidgetsWindow/ButtonSkinName", mButtonSkinName)) 38 mButtonSkinName = "Button"; 39 40 initialise(); 41 42 WidgetCreatorManager::getInstance().eventChangeCreatorMode += MyGUI::newDelegate(this, &WidgetsWindow::notifyChangeCreatorMode); 43 } 44 ~WidgetsWindow()45 WidgetsWindow::~WidgetsWindow() 46 { 47 WidgetCreatorManager::getInstance().eventChangeCreatorMode -= MyGUI::newDelegate(this, &WidgetsWindow::notifyChangeCreatorMode); 48 49 size_t sheet_index = mTabSkins->getIndexSelected(); 50 if (sheet_index != MyGUI::ITEM_NONE) 51 mSkinSheetName = mTabSkins->getItemNameAt(sheet_index); 52 else 53 mSkinSheetName = ""; 54 55 SettingsManager::getInstance().setValue("Controls/WidgetsWindow/LastSkinGroup", mSkinSheetName); 56 57 mPopupMode->eventMouseButtonClick -= MyGUI::newDelegate(this, &WidgetsWindow::notifyMouseButtonClickPopupMode); 58 } 59 initialise()60 void WidgetsWindow::initialise() 61 { 62 const SkinGroups& groups = WidgetTypes::getInstance().getSkinGroups(); 63 for (SkinGroups::const_iterator iter = groups.begin(); iter != groups.end(); ++iter) 64 { 65 MyGUI::TabItem* page = mTabSkins->addItem(iter->first); 66 MyGUI::ItemBox* box = page->createWidget<MyGUI::ItemBox>("ItemBoxEmpty", MyGUI::IntCoord(0, 0, page->getSize().width, page->getSize().height), MyGUI::Align::Stretch); 67 mItemBoxs.push_back(box); 68 69 box->requestCreateWidgetItem = MyGUI::newDelegate(this, &WidgetsWindow::requestCreateWidgetItem); 70 box->requestCoordItem = MyGUI::newDelegate(this, &WidgetsWindow::requestCoordItem); 71 box->requestDrawItem = MyGUI::newDelegate(this, &WidgetsWindow::requestDrawItem); 72 73 for (VectorSkinInfo::const_iterator iterSkin = iter->second.begin(); iterSkin != iter->second.end(); ++iterSkin) 74 { 75 box->addItem(*iterSkin); 76 } 77 } 78 } 79 getCellSelected(MyGUI::Widget * _widget)80 bool WidgetsWindow::getCellSelected(MyGUI::Widget* _widget) 81 { 82 MyGUI::Widget* container = _widget->getParent()->_getContainer(); 83 MyGUI::ItemBox* box = container->castType<MyGUI::ItemBox>(); 84 return box->getIndexSelected() == box->getIndexByWidget(_widget->getParent()); 85 } 86 getCellData(MyGUI::Widget * _widget)87 SkinInfo WidgetsWindow::getCellData(MyGUI::Widget* _widget) 88 { 89 MyGUI::Widget* container = _widget->getParent()->_getContainer(); 90 MyGUI::ItemBox* box = container->castType<MyGUI::ItemBox>(); 91 size_t index = box->getIndexByWidget(_widget->getParent()); 92 return *box->getItemDataAt<SkinInfo>(index); 93 } 94 notifySelectWidgetType(MyGUI::Widget * _sender)95 void WidgetsWindow::notifySelectWidgetType(MyGUI::Widget* _sender) 96 { 97 SkinInfo data = getCellData(_sender); 98 99 if (getCellSelected(_sender)) 100 WidgetCreatorManager::getInstance().resetCreatorInfo(); 101 else 102 WidgetCreatorManager::getInstance().setCreatorInfo(data.widget_type, data.widget_skin); 103 } 104 notifyToolTip(MyGUI::Widget * _sender,const MyGUI::ToolTipInfo & _info)105 void WidgetsWindow::notifyToolTip(MyGUI::Widget* _sender, const MyGUI::ToolTipInfo& _info) 106 { 107 if (_info.type == MyGUI::ToolTipInfo::Show) 108 { 109 SkinInfo data = getCellData(_sender); 110 EditorToolTip::getInstancePtr()->show(data); 111 EditorToolTip::getInstancePtr()->move(_info.point); 112 } 113 else if (_info.type == MyGUI::ToolTipInfo::Hide) 114 { 115 EditorToolTip::getInstancePtr()->hide(); 116 } 117 else if (_info.type == MyGUI::ToolTipInfo::Move) 118 { 119 EditorToolTip::getInstancePtr()->move(_info.point); 120 } 121 } 122 notifyChangeCreatorMode(bool _modeCreate)123 void WidgetsWindow::notifyChangeCreatorMode(bool _modeCreate) 124 { 125 const std::string& widgetType = WidgetCreatorManager::getInstance().getWidgetType(); 126 const std::string& widgetSkin = WidgetCreatorManager::getInstance().getWidgetSkin(); 127 128 for (VectorItemBox::iterator item = mItemBoxs.begin(); item != mItemBoxs.end(); ++item) 129 { 130 MyGUI::ItemBox* box = (*item); 131 box->setIndexSelected(MyGUI::ITEM_NONE); 132 for (size_t index = 0; index < box->getItemCount(); ++index) 133 { 134 SkinInfo* info = box->getItemDataAt<SkinInfo>(index); 135 if (info->widget_skin == widgetSkin && info->widget_type == widgetType) 136 { 137 box->setIndexSelected(index); 138 break; 139 } 140 } 141 } 142 143 mPopupMode->setStateSelected(WidgetCreatorManager::getInstance().getPopupMode()); 144 } 145 requestCreateWidgetItem(MyGUI::ItemBox * _sender,MyGUI::Widget * _item)146 void WidgetsWindow::requestCreateWidgetItem(MyGUI::ItemBox* _sender, MyGUI::Widget* _item) 147 { 148 MyGUI::Button* button = _item->createWidget<MyGUI::Button>(mButtonSkinName, MyGUI::IntCoord( 149 mWidgetsButtonOffset, 150 mWidgetsButtonOffset, 151 _item->getWidth() - mWidgetsButtonOffset - mWidgetsButtonOffset, 152 _item->getHeight() - mWidgetsButtonOffset - mWidgetsButtonOffset), 153 MyGUI::Align::Stretch); 154 155 button->setTextAlign(MyGUI::Align::Center); 156 button->eventMouseButtonClick += MyGUI::newDelegate(this, &WidgetsWindow::notifySelectWidgetType); 157 button->setNeedToolTip(true); 158 button->eventToolTip += MyGUI::newDelegate(this, &WidgetsWindow::notifyToolTip); 159 160 _item->setUserData(button); 161 } 162 requestCoordItem(MyGUI::ItemBox * _sender,MyGUI::IntCoord & _coord,bool _drag)163 void WidgetsWindow::requestCoordItem(MyGUI::ItemBox* _sender, MyGUI::IntCoord& _coord, bool _drag) 164 { 165 _coord.set(0, 0, mWidgetsButtonWidth + mWidgetsButtonOffset + mWidgetsButtonOffset, mWidgetsButtonHeight + mWidgetsButtonOffset + mWidgetsButtonOffset); 166 } 167 requestDrawItem(MyGUI::ItemBox * _sender,MyGUI::Widget * _item,const MyGUI::IBDrawItemInfo & _info)168 void WidgetsWindow::requestDrawItem(MyGUI::ItemBox* _sender, MyGUI::Widget* _item, const MyGUI::IBDrawItemInfo& _info) 169 { 170 MyGUI::Button* button = *_item->getUserData<MyGUI::Button*>(); 171 SkinInfo data = *_sender->getItemDataAt<SkinInfo>(_info.index); 172 if (_info.update) 173 { 174 button->setCaption(data.widget_button_name); 175 } 176 177 button->setStateSelected(_info.select); 178 } 179 notifyMouseButtonClickPopupMode(MyGUI::Widget * _sender)180 void WidgetsWindow::notifyMouseButtonClickPopupMode(MyGUI::Widget* _sender) 181 { 182 if (mPopupMode->getStateSelected()) 183 WidgetCreatorManager::getInstance().setPopupMode(false); 184 else 185 WidgetCreatorManager::getInstance().setPopupMode(true); 186 } 187 188 } 189