1 /*! 2 @file 3 @author Georgiy Evmenov 4 @date 12/2009 5 */ 6 7 #include "Precompiled.h" 8 #include "PanelControllers.h" 9 #include "EditorWidgets.h" 10 #include "UndoManager.h" 11 #include "PropertyFieldManager.h" 12 #include "Localise.h" 13 14 namespace tools 15 { 16 PanelControllers()17 PanelControllers::PanelControllers() : 18 BasePanelViewItem("PanelControllers.layout"), 19 mControllerName(nullptr), 20 mButtonAdd(nullptr), 21 mButtonDelete(nullptr), 22 mList(nullptr), 23 mCurrentWidget(nullptr), 24 mButtonLeft(0), 25 mButtonRight(0), 26 mButtonSpace(0), 27 mIndexSelected(MyGUI::ITEM_NONE) 28 { 29 } 30 initialise()31 void PanelControllers::initialise() 32 { 33 mPanelCell->setCaption(replaceTags("PanelControllersName")); 34 35 assignWidget(mControllerName, "controllerName"); 36 assignWidget(mButtonAdd, "buttonAdd"); 37 assignWidget(mButtonDelete, "buttonDelete"); 38 assignWidget(mList, "list"); 39 40 mButtonAdd->eventMouseButtonClick += MyGUI::newDelegate(this, &PanelControllers::notifyAdd); 41 mButtonDelete->eventMouseButtonClick += MyGUI::newDelegate(this, &PanelControllers::notifyDelete); 42 mList->eventListChangePosition += MyGUI::newDelegate(this, &PanelControllers::notifySelectItem); 43 44 mButtonLeft = mButtonAdd->getLeft(); 45 mButtonRight = mMainWidget->getWidth() - mButtonDelete->getRight(); 46 mButtonSpace = mButtonDelete->getLeft() - mButtonAdd->getRight(); 47 48 MyGUI::ResourceManager::getInstance().registerLoadXmlDelegate("ControllerTypes") = MyGUI::newDelegate(this, &PanelControllers::loadControllerTypes); 49 MyGUI::ResourceManager::getInstance().load("Controllers.xml"); 50 } 51 shutdown()52 void PanelControllers::shutdown() 53 { 54 destroyPropertyFields(); 55 } 56 update(MyGUI::Widget * _currentWidget)57 void PanelControllers::update(MyGUI::Widget* _currentWidget) 58 { 59 destroyPropertyFields(); 60 61 mCurrentWidget = _currentWidget; 62 if (mCurrentWidget == nullptr) 63 return; 64 65 WidgetContainer* widgetContainer = EditorWidgets::getInstance().find(_currentWidget); 66 67 mList->removeAllItems(); 68 for (std::vector<ControllerInfo*>::iterator iter = widgetContainer->mController.begin(); iter != widgetContainer->mController.end(); ++iter) 69 { 70 mList->addItem((*iter)->mType, *iter); 71 } 72 73 mPanelCell->setClientHeight(mButtonDelete->getCoord().bottom()); 74 } 75 notifyChangeWidth(int _width)76 void PanelControllers::notifyChangeWidth(int _width) 77 { 78 int width = mMainWidget->getClientCoord().width; 79 80 int half_width = (width - (mButtonLeft + mButtonRight + mButtonSpace)) / 2; 81 mButtonAdd->setSize(half_width, mButtonAdd->getHeight()); 82 mButtonDelete->setCoord(mButtonAdd->getRight() + mButtonSpace, mButtonDelete->getTop(), width - (mButtonAdd->getRight() + mButtonSpace + mButtonRight), mButtonDelete->getHeight()); 83 } 84 notifyAdd(MyGUI::Widget * _sender)85 void PanelControllers::notifyAdd(MyGUI::Widget* _sender) 86 { 87 std::string key = mControllerName->getOnlyText(); 88 WidgetContainer* widgetContainer = EditorWidgets::getInstance().find(mCurrentWidget); 89 90 ControllerInfo* controllerInfo = new ControllerInfo(); 91 controllerInfo->mType = key; 92 widgetContainer->mController.push_back(controllerInfo); 93 94 mList->addItem(key, controllerInfo); 95 UndoManager::getInstance().addValue(); 96 } 97 notifyDelete(MyGUI::Widget * _sender)98 void PanelControllers::notifyDelete(MyGUI::Widget* _sender) 99 { 100 size_t index = mList->getIndexSelected(); 101 if (MyGUI::ITEM_NONE == index) 102 return; 103 104 WidgetContainer* widgetContainer = EditorWidgets::getInstance().find(mCurrentWidget); 105 std::vector<ControllerInfo*>::iterator iter = std::find(widgetContainer->mController.begin(), widgetContainer->mController.end(), *mList->getItemDataAt<ControllerInfo*>(index)); 106 if (iter != widgetContainer->mController.end()) 107 { 108 delete *iter; 109 widgetContainer->mController.erase(iter); 110 } 111 112 mList->removeItemAt(index); 113 UndoManager::getInstance().addValue(); 114 115 // обновляем текущий индекс 116 notifySelectItem(mList, mList->getIndexSelected()); 117 } 118 notifySelectItem(MyGUI::ListBox * _sender,size_t _index)119 void PanelControllers::notifySelectItem(MyGUI::ListBox* _sender, size_t _index) 120 { 121 destroyPropertyFields(); 122 123 mIndexSelected = mList->getIndexSelected(); 124 if (MyGUI::ITEM_NONE == mIndexSelected) 125 return; 126 127 std::string key = mList->getItemNameAt(mIndexSelected); 128 mControllerName->setOnlyText(key); 129 130 if (mControllersProperties.find(key) != mControllersProperties.end()) 131 { 132 ControllerInfo* controllerInfo = *mList->getItemDataAt<ControllerInfo*>(mIndexSelected); 133 134 for (MyGUI::MapString::iterator iter = mControllersProperties[key].begin(); iter != mControllersProperties[key].end(); ++iter) 135 { 136 std::string value = ""; 137 if (controllerInfo->mProperty.find(iter->first) != controllerInfo->mProperty.end()) 138 value = controllerInfo->mProperty[iter->first]; 139 140 IPropertyField* field = PropertyFieldManager::getInstance().createPropertyField(mWidgetClient, iter->second); 141 field->setTarget(mCurrentWidget); 142 field->setName(iter->first); 143 field->setValue(value); 144 field->eventAction = MyGUI::newDelegate(this, &PanelControllers::notifyAction); 145 mFields.push_back(field); 146 } 147 } 148 149 updateSize(); 150 } 151 updateSize()152 void PanelControllers::updateSize() 153 { 154 int height = mButtonDelete->getCoord().bottom() + 3; 155 156 for (VectorPropertyField::iterator item = mFields.begin(); item != mFields.end(); ++ item) 157 { 158 MyGUI::IntSize size = (*item)->getContentSize(); 159 (*item)->setCoord(MyGUI::IntCoord(0, height, mMainWidget->getWidth(), size.height)); 160 height += size.height; 161 } 162 163 mPanelCell->setClientHeight(height); 164 } 165 loadControllerTypes(MyGUI::xml::ElementPtr _node,const std::string & _file,MyGUI::Version _version)166 void PanelControllers::loadControllerTypes(MyGUI::xml::ElementPtr _node, const std::string& _file, MyGUI::Version _version) 167 { 168 MyGUI::xml::ElementEnumerator controller = _node->getElementEnumerator(); 169 while (controller.next("Controller")) 170 { 171 MyGUI::MapString controllerProperties; 172 std::string name = controller->findAttribute("name"); 173 mControllerName->addItem(name); 174 MyGUI::xml::ElementEnumerator prop = controller->getElementEnumerator(); 175 while (prop.next("Property")) 176 controllerProperties[prop->findAttribute("key")] = prop->findAttribute("type"); 177 mControllersProperties[name] = controllerProperties; 178 } 179 } 180 destroyPropertyFields()181 void PanelControllers::destroyPropertyFields() 182 { 183 for (VectorPropertyField::iterator item = mFields.begin(); item != mFields.end(); ++ item) 184 delete (*item); 185 mFields.clear(); 186 } 187 notifyAction(const std::string & _name,const std::string & _value,bool _final)188 void PanelControllers::notifyAction(const std::string& _name, const std::string& _value, bool _final) 189 { 190 if (_final) 191 { 192 if (mIndexSelected != MyGUI::ITEM_NONE) 193 { 194 WidgetContainer* widgetContainer = EditorWidgets::getInstance().find(mCurrentWidget); 195 widgetContainer->mController[mIndexSelected]->mProperty[_name] = _value; 196 197 UndoManager::getInstance().addValue(PR_PROPERTIES); 198 } 199 } 200 } 201 202 } 203