1 /*! 2 @file 3 @author Georgiy Evmenov 4 @date 09/2008 5 */ 6 7 #include "Precompiled.h" 8 #include "PanelMainProperties.h" 9 #include "Localise.h" 10 #include "PropertyFieldManager.h" 11 #include "UndoManager.h" 12 #include "WidgetSelectorManager.h" 13 #include "GroupMessage.h" 14 15 namespace tools 16 { 17 PanelMainProperties()18 PanelMainProperties::PanelMainProperties() : 19 BasePanelViewItem("PanelMainProperties.layout"), 20 mCurrentWidget(nullptr), 21 mUserDataTargetType("LE_TargetWidgetType") 22 { 23 } 24 initialise()25 void PanelMainProperties::initialise() 26 { 27 mPanelCell->setCaption(replaceTags("Main_properties")); 28 } 29 shutdown()30 void PanelMainProperties::shutdown() 31 { 32 destroyPropertyFields(); 33 } 34 update(MyGUI::Widget * _currentWidget)35 void PanelMainProperties::update(MyGUI::Widget* _currentWidget) 36 { 37 hidePropertyFields(); 38 39 mCurrentWidget = _currentWidget; 40 if (mCurrentWidget == nullptr) 41 return; 42 43 WidgetStyle* widgetType = WidgetTypes::getInstance().findWidgetStyle(mCurrentWidget->getTypeName()); 44 WidgetContainer* widgetContainer = EditorWidgets::getInstance().find(mCurrentWidget); 45 bool existTargetType = widgetContainer->existUserData(mUserDataTargetType); 46 47 IPropertyField* field = getPropertyField(mWidgetClient, "Name", "Name"); 48 field->setTarget(_currentWidget); 49 field->setValue(widgetContainer->getName()); 50 51 if (widgetType->resizeable) 52 { 53 field = getPropertyField(mWidgetClient, "Position", "Position"); 54 field->setTarget(_currentWidget); 55 field->setValue(widgetContainer->position()); 56 } 57 58 field = getPropertyField(mWidgetClient, "Type", "Type"); 59 field->setTarget(_currentWidget); 60 if (existTargetType) 61 { 62 std::string targetType = widgetContainer->getUserData(mUserDataTargetType); 63 field->setValue(targetType); 64 } 65 else 66 { 67 field->setValue(widgetContainer->getType()); 68 } 69 70 field = getPropertyField(mWidgetClient, "Align", "Align"); 71 field->setTarget(_currentWidget); 72 field->setValue(widgetContainer->getAlign()); 73 74 if (mCurrentWidget->isRootWidget()) 75 { 76 field = getPropertyField(mWidgetClient, "Layer", "Layer"); 77 field->setTarget(_currentWidget); 78 field->setValue(widgetContainer->getLayerName()); 79 80 field = getPropertyField(mWidgetClient, "Template", "Bool"); 81 field->setTarget(_currentWidget); 82 field->setValue(existTargetType ? "true" : "false"); 83 } 84 85 field = getPropertyField(mWidgetClient, "Skin", "Skin"); 86 field->setTarget(_currentWidget); 87 field->setValue(widgetContainer->getSkin()); 88 89 updateSize(); 90 } 91 updateSize()92 void PanelMainProperties::updateSize() 93 { 94 int height = 0; 95 96 for (MapPropertyField::iterator item = mFields.begin(); item != mFields.end(); ++ item) 97 { 98 if ((*item).second->getVisible()) 99 { 100 MyGUI::IntSize size = (*item).second->getContentSize(); 101 (*item).second->setCoord(MyGUI::IntCoord(0, height, mMainWidget->getWidth(), size.height)); 102 height += size.height; 103 } 104 } 105 106 mPanelCell->setClientHeight(height); 107 } 108 destroyPropertyFields()109 void PanelMainProperties::destroyPropertyFields() 110 { 111 for (MapPropertyField::iterator item = mFields.begin(); item != mFields.end(); ++ item) 112 delete (*item).second; 113 mFields.clear(); 114 } 115 notifyActionSkin(const std::string & _type,const std::string & _value,bool _final)116 void PanelMainProperties::notifyActionSkin(const std::string& _type, const std::string& _value, bool _final) 117 { 118 if (_final) 119 { 120 WidgetContainer* widgetContainer = EditorWidgets::getInstance().find(mCurrentWidget); 121 122 widgetContainer->setSkin(_value); 123 if (isSkinExist(widgetContainer->getSkin()) || widgetContainer->getSkin().empty()) 124 { 125 WidgetSelectorManager::getInstance().saveSelectedWidget(); 126 127 MyGUI::xml::Document* savedDoc = EditorWidgets::getInstance().savexmlDocument(); 128 EditorWidgets::getInstance().clear(); 129 EditorWidgets::getInstance().loadxmlDocument(savedDoc); 130 delete savedDoc; 131 132 WidgetSelectorManager::getInstance().restoreSelectedWidget(); 133 } 134 else 135 { 136 std::string mess = MyGUI::utility::toString("Skin '", widgetContainer->getSkin(), "' not found. This value will be saved."); 137 GroupMessage::getInstance().addMessage(mess, MyGUI::LogLevel::Error); 138 } 139 140 UndoManager::getInstance().addValue(PR_PROPERTIES); 141 } 142 } 143 isSkinExist(const std::string & _skinName)144 bool PanelMainProperties::isSkinExist(const std::string& _skinName) 145 { 146 return _skinName == "Default" || 147 MyGUI::SkinManager::getInstance().isExist(_skinName) || 148 (MyGUI::LayoutManager::getInstance().isExist(_skinName) && checkTemplate(_skinName)); 149 } 150 checkTemplate(const std::string & _skinName)151 bool PanelMainProperties::checkTemplate(const std::string& _skinName) 152 { 153 MyGUI::ResourceLayout* templateInfo = MyGUI::LayoutManager::getInstance().getByName(_skinName, false); 154 if (templateInfo != nullptr) 155 { 156 const MyGUI::VectorWidgetInfo& data = templateInfo->getLayoutData(); 157 for (MyGUI::VectorWidgetInfo::const_iterator container = data.begin(); container != data.end(); ++container) 158 { 159 if (container->name == "Root") 160 return true; 161 } 162 } 163 164 return false; 165 } 166 notifyActionLayer(const std::string & _type,const std::string & _value,bool _final)167 void PanelMainProperties::notifyActionLayer(const std::string& _type, const std::string& _value, bool _final) 168 { 169 if (_final) 170 { 171 WidgetContainer* widgetContainer = EditorWidgets::getInstance().find(mCurrentWidget); 172 widgetContainer->setLayerName(_value); 173 174 UndoManager::getInstance().addValue(PR_PROPERTIES); 175 } 176 } 177 notifyActionName(const std::string & _type,const std::string & _value,bool _final)178 void PanelMainProperties::notifyActionName(const std::string& _type, const std::string& _value, bool _final) 179 { 180 if (_final) 181 { 182 WidgetContainer* widgetContainer = EditorWidgets::getInstance().find(mCurrentWidget); 183 widgetContainer->setName(_value); 184 185 UndoManager::getInstance().addValue(PR_PROPERTIES); 186 } 187 } 188 notifyActionType(const std::string & _type,const std::string & _value,bool _final)189 void PanelMainProperties::notifyActionType(const std::string& _type, const std::string& _value, bool _final) 190 { 191 if (_final) 192 { 193 WidgetContainer* widgetContainer = EditorWidgets::getInstance().find(mCurrentWidget); 194 if (!widgetContainer->existUserData(mUserDataTargetType)) 195 { 196 widgetContainer->setType(_value); 197 198 WidgetSelectorManager::getInstance().saveSelectedWidget(); 199 200 MyGUI::xml::Document* savedDoc = EditorWidgets::getInstance().savexmlDocument(); 201 EditorWidgets::getInstance().clear(); 202 EditorWidgets::getInstance().loadxmlDocument(savedDoc); 203 delete savedDoc; 204 205 WidgetSelectorManager::getInstance().restoreSelectedWidget(); 206 207 UndoManager::getInstance().addValue(PR_PROPERTIES); 208 } 209 else 210 { 211 widgetContainer->setUserData(mUserDataTargetType, _value); 212 213 WidgetSelectorManager::getInstance().saveSelectedWidget(); 214 215 MyGUI::xml::Document* savedDoc = EditorWidgets::getInstance().savexmlDocument(); 216 EditorWidgets::getInstance().clear(); 217 EditorWidgets::getInstance().loadxmlDocument(savedDoc); 218 delete savedDoc; 219 220 WidgetSelectorManager::getInstance().restoreSelectedWidget(); 221 222 UndoManager::getInstance().addValue(PR_PROPERTIES); 223 } 224 } 225 } 226 notifyActionAlign(const std::string & _type,const std::string & _value,bool _final)227 void PanelMainProperties::notifyActionAlign(const std::string& _type, const std::string& _value, bool _final) 228 { 229 if (_final) 230 { 231 WidgetContainer* widgetContainer = EditorWidgets::getInstance().find(mCurrentWidget); 232 233 widgetContainer->setAlign(_value); 234 widgetContainer->getWidget()->setAlign(MyGUI::Align::parse(_value)); 235 236 UndoManager::getInstance().addValue(PR_PROPERTIES); 237 } 238 } 239 notifyActionTemplate(const std::string & _type,const std::string & _value,bool _final)240 void PanelMainProperties::notifyActionTemplate(const std::string& _type, const std::string& _value, bool _final) 241 { 242 if (_final) 243 { 244 WidgetContainer* widgetContainer = EditorWidgets::getInstance().find(mCurrentWidget); 245 if (_value == "true") 246 { 247 if (!widgetContainer->existUserData(mUserDataTargetType)) 248 { 249 widgetContainer->setUserData(mUserDataTargetType, widgetContainer->getType()); 250 widgetContainer->setType(MyGUI::Widget::getClassTypeName()); 251 252 WidgetSelectorManager::getInstance().saveSelectedWidget(); 253 254 MyGUI::xml::Document* savedDoc = EditorWidgets::getInstance().savexmlDocument(); 255 EditorWidgets::getInstance().clear(); 256 EditorWidgets::getInstance().loadxmlDocument(savedDoc); 257 delete savedDoc; 258 259 WidgetSelectorManager::getInstance().restoreSelectedWidget(); 260 261 UndoManager::getInstance().addValue(PR_PROPERTIES); 262 } 263 } 264 else 265 { 266 if (widgetContainer->existUserData(mUserDataTargetType)) 267 { 268 std::string targetType = widgetContainer->getUserData(mUserDataTargetType); 269 widgetContainer->clearUserData(mUserDataTargetType); 270 widgetContainer->setType(targetType); 271 272 WidgetSelectorManager::getInstance().saveSelectedWidget(); 273 274 MyGUI::xml::Document* savedDoc = EditorWidgets::getInstance().savexmlDocument(); 275 EditorWidgets::getInstance().clear(); 276 EditorWidgets::getInstance().loadxmlDocument(savedDoc); 277 delete savedDoc; 278 279 WidgetSelectorManager::getInstance().restoreSelectedWidget(); 280 281 UndoManager::getInstance().addValue(PR_PROPERTIES); 282 } 283 } 284 } 285 } 286 getPropertyField(MyGUI::Widget * _client,const std::string & _name,const std::string & _type)287 IPropertyField* PanelMainProperties::getPropertyField(MyGUI::Widget* _client, const std::string& _name, const std::string& _type) 288 { 289 MapPropertyField::iterator item = mFields.find(_name); 290 if (item != mFields.end()) 291 { 292 (*item).second->setVisible(true); 293 return (*item).second; 294 } 295 296 IPropertyField* result = PropertyFieldManager::getInstance().createPropertyField(_client, _type); 297 result->setName(_name); 298 result->eventAction = MyGUI::newDelegate(this, &PanelMainProperties::notifyAction); 299 300 mFields[_name] = result; 301 302 return result; 303 } 304 hidePropertyFields()305 void PanelMainProperties::hidePropertyFields() 306 { 307 for (MapPropertyField::iterator item = mFields.begin(); item != mFields.end(); ++ item) 308 (*item).second->setVisible(false); 309 } 310 notifyAction(const std::string & _name,const std::string & _value,bool _final)311 void PanelMainProperties::notifyAction(const std::string& _name, const std::string& _value, bool _final) 312 { 313 if (_name == "Skin") 314 notifyActionSkin(_name, _value, _final); 315 else if (_name == "Layer") 316 notifyActionLayer(_name, _value, _final); 317 else if (_name == "Name") 318 notifyActionName(_name, _value, _final); 319 else if (_name == "Type") 320 notifyActionType(_name, _value, _final); 321 else if (_name == "Align") 322 notifyActionAlign(_name, _value, _final); 323 else if (_name == "Template") 324 notifyActionTemplate(_name, _value, _final); 325 } 326 327 } 328