diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/world_editor/property_editor_widget.cpp b/code/nel/tools/3d/object_viewer_qt/src/plugins/world_editor/property_editor_widget.cpp index d015adaf1..6d3fdaec1 100644 --- a/code/nel/tools/3d/object_viewer_qt/src/plugins/world_editor/property_editor_widget.cpp +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/world_editor/property_editor_widget.cpp @@ -1,434 +1,434 @@ -// Object Viewer Qt - MMORPG Framework -// Copyright (C) 2010 Winch Gate Property Limited -// Copyright (C) 2011 Dzmitry Kamiahin -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU Affero General Public License as -// published by the Free Software Foundation, either version 3 of the -// License, or (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Affero General Public License for more details. -// -// You should have received a copy of the GNU Affero General Public License -// along with this program. If not, see . - -// Project includes -#include "property_editor_widget.h" -#include "world_editor_misc.h" - -// NeL includes -#include - -// STL includes -#include -#include - -// Qt includes -#include - -namespace WorldEditor -{ - -PropertyEditorWidget::PropertyEditorWidget(QWidget *parent) - : QWidget(parent) -{ - m_ui.setupUi(this); - - m_stringManager = new QtStringPropertyManager(this); - m_boolManager = new QtBoolPropertyManager(this); - m_enumManager = new QtEnumPropertyManager(this); - m_stringArrayManager = new QtTextPropertyManager(this); - - QtLineEditFactory *lineEditFactory = new QtLineEditFactory(this); - QtCheckBoxFactory *boolFactory = new QtCheckBoxFactory(this); - QtEnumEditorFactory *enumFactory = new QtEnumEditorFactory(this); - QtTextEditorFactory *textFactory = new QtTextEditorFactory(this); - - m_ui.treePropertyBrowser->setFactoryForManager(m_stringManager, lineEditFactory); - m_ui.treePropertyBrowser->setFactoryForManager(m_boolManager, boolFactory); - m_ui.treePropertyBrowser->setFactoryForManager(m_enumManager, enumFactory); - m_ui.treePropertyBrowser->setFactoryForManager(m_stringArrayManager, textFactory); - - m_groupManager = new QtGroupPropertyManager(this); - - connect(m_stringManager, SIGNAL(propertyChanged(QtProperty *)), this, SLOT(propertyChanged(QtProperty *))); - connect(m_boolManager, SIGNAL(propertyChanged(QtProperty *)), this, SLOT(propertyChanged(QtProperty *))); - connect(m_enumManager, SIGNAL(propertyChanged(QtProperty *)), this, SLOT(propertyChanged(QtProperty *))); - connect(m_stringArrayManager, SIGNAL(propertyChanged(QtProperty *)), this, SLOT(propertyChanged(QtProperty *))); - - connect(m_boolManager, SIGNAL(resetProperty(QtProperty *)), this, SLOT(resetProperty(QtProperty *))); - connect(m_stringManager, SIGNAL(resetProperty(QtProperty *)), this, SLOT(resetProperty(QtProperty *))); - connect(m_enumManager, SIGNAL(resetProperty(QtProperty *)), this, SLOT(resetProperty(QtProperty *))); - connect(m_stringArrayManager, SIGNAL(resetProperty(QtProperty *)), this, SLOT(resetProperty(QtProperty *))); -} - -PropertyEditorWidget::~PropertyEditorWidget() -{ -} - -void PropertyEditorWidget::clearProperties() -{ - m_ui.treePropertyBrowser->clear(); -} - -void PropertyEditorWidget::updateSelection(Node *node) -{ - clearProperties(); - - if ((node == 0) || (node->type() != Node::PrimitiveNodeType)) - return; - - blockSignalsOfProperties(true); - - // The parameter list - std::list parameterList; - - PrimitiveNode *primNode = static_cast(node); - const NLLIGO::IPrimitive *primitive = primNode->primitive(); - const NLLIGO::CPrimitiveClass *primClass = primNode->primitiveClass(); - - // Use the class or not ? - if (primClass) - { - // For each properties of the class - for (uint p = 0; p < primClass->Parameters.size(); p++) - { - // Is the parameter visible ? - if (primClass->Parameters[p].Visible) - { - if (primClass->Parameters[p].Name == "name") - parameterList.push_front(primClass->Parameters[p]); - else - parameterList.push_back(primClass->Parameters[p]); - } - } - } - else - { - // For each primitive property - uint numProp = primitive->getNumProperty(); - for (uint p = 0; p < numProp; p++) - { - // Get the property - std::string propertyName; - const NLLIGO::IProperty *prop; - nlverify(primitive->getProperty(p, propertyName, prop)); - - // Add a default property - NLLIGO::CPrimitiveClass::CParameter defProp(*prop, propertyName.c_str()); - - if (defProp.Name == "name") - parameterList.push_front(defProp); - else - parameterList.push_back(defProp); - } - } - - // Remove property class - std::list::iterator ite = parameterList.begin (); - while (ite != parameterList.end ()) - { - std::list::iterator next = ite; - next++; - if (ite->Name == "class") - { - parameterList.erase(ite); - } - ite = next; - } - - QtProperty *groupNode; - groupNode = m_groupManager->addProperty(QString("%1(%2)").arg(node->data(Qt::DisplayRole).toString()).arg(primClass->Name.c_str())); - m_ui.treePropertyBrowser->addProperty(groupNode); - - ite = parameterList.begin(); - while (ite != parameterList.end()) - { - NLLIGO::CPrimitiveClass::CParameter ¶meter = (*ite); - QtProperty *prop; - NLLIGO::IProperty *ligoProperty = 0; - primitive->getPropertyByName(parameter.Name.c_str(), ligoProperty); - - if (parameter.Type == NLLIGO::CPrimitiveClass::CParameter::ConstString) - prop = addConstStringProperty(ligoProperty, parameter, primitive); - else if (parameter.Type == NLLIGO::CPrimitiveClass::CParameter::String) - prop = addStringProperty(ligoProperty, parameter, primitive); - else if (parameter.Type == NLLIGO::CPrimitiveClass::CParameter::StringArray) - prop = addStringArrayProperty(ligoProperty, parameter, primitive); - else if (parameter.Type == NLLIGO::CPrimitiveClass::CParameter::ConstStringArray) - prop = addConstStringArrayProperty(ligoProperty, parameter, primitive); - else - prop = addBoolProperty(ligoProperty, parameter, primitive); - - // Default value ? - if ((ligoProperty == NULL) || (ligoProperty->Default)) - prop->setModified(false); - else - prop->setModified(true); - - bool staticChildSelected = Utils::ligoConfig()->isStaticChild(*primitive); - if (parameter.ReadOnly || (staticChildSelected && (parameter.Name == "name"))) - prop->setEnabled(false); - - // File ? - if (parameter.Filename && (parameter.FileExtension.empty() || parameter.Type != NLLIGO::CPrimitiveClass::CParameter::StringArray)) - { - // TODO: Create an edit box - // CHECK: only for ConstString - } - - groupNode->addSubProperty(prop); - - ite++; - } - - blockSignalsOfProperties(false); -} - +// Object Viewer Qt - MMORPG Framework +// Copyright (C) 2010 Winch Gate Property Limited +// Copyright (C) 2011 Dzmitry Kamiahin +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +// Project includes +#include "property_editor_widget.h" +#include "world_editor_misc.h" + +// NeL includes +#include + +// STL includes +#include +#include + +// Qt includes +#include + +namespace WorldEditor +{ + +PropertyEditorWidget::PropertyEditorWidget(QWidget *parent) + : QWidget(parent) +{ + m_ui.setupUi(this); + + m_stringManager = new QtStringPropertyManager(this); + m_boolManager = new QtBoolPropertyManager(this); + m_enumManager = new QtEnumPropertyManager(this); + m_stringArrayManager = new QtTextPropertyManager(this); + + QtLineEditFactory *lineEditFactory = new QtLineEditFactory(this); + QtCheckBoxFactory *boolFactory = new QtCheckBoxFactory(this); + QtEnumEditorFactory *enumFactory = new QtEnumEditorFactory(this); + QtTextEditorFactory *textFactory = new QtTextEditorFactory(this); + + m_ui.treePropertyBrowser->setFactoryForManager(m_stringManager, lineEditFactory); + m_ui.treePropertyBrowser->setFactoryForManager(m_boolManager, boolFactory); + m_ui.treePropertyBrowser->setFactoryForManager(m_enumManager, enumFactory); + m_ui.treePropertyBrowser->setFactoryForManager(m_stringArrayManager, textFactory); + + m_groupManager = new QtGroupPropertyManager(this); + + connect(m_stringManager, SIGNAL(propertyChanged(QtProperty *)), this, SLOT(propertyChanged(QtProperty *))); + connect(m_boolManager, SIGNAL(propertyChanged(QtProperty *)), this, SLOT(propertyChanged(QtProperty *))); + connect(m_enumManager, SIGNAL(propertyChanged(QtProperty *)), this, SLOT(propertyChanged(QtProperty *))); + connect(m_stringArrayManager, SIGNAL(propertyChanged(QtProperty *)), this, SLOT(propertyChanged(QtProperty *))); + + connect(m_boolManager, SIGNAL(resetProperty(QtProperty *)), this, SLOT(resetProperty(QtProperty *))); + connect(m_stringManager, SIGNAL(resetProperty(QtProperty *)), this, SLOT(resetProperty(QtProperty *))); + connect(m_enumManager, SIGNAL(resetProperty(QtProperty *)), this, SLOT(resetProperty(QtProperty *))); + connect(m_stringArrayManager, SIGNAL(resetProperty(QtProperty *)), this, SLOT(resetProperty(QtProperty *))); +} + +PropertyEditorWidget::~PropertyEditorWidget() +{ +} + +void PropertyEditorWidget::clearProperties() +{ + m_ui.treePropertyBrowser->clear(); +} + +void PropertyEditorWidget::updateSelection(Node *node) +{ + clearProperties(); + + if ((node == 0) || (node->type() != Node::PrimitiveNodeType)) + return; + + blockSignalsOfProperties(true); + + // The parameter list + std::list parameterList; + + PrimitiveNode *primNode = static_cast(node); + const NLLIGO::IPrimitive *primitive = primNode->primitive(); + const NLLIGO::CPrimitiveClass *primClass = primNode->primitiveClass(); + + // Use the class or not ? + if (primClass) + { + // For each properties of the class + for (uint p = 0; p < primClass->Parameters.size(); p++) + { + // Is the parameter visible ? + if (primClass->Parameters[p].Visible) + { + if (primClass->Parameters[p].Name == "name") + parameterList.push_front(primClass->Parameters[p]); + else + parameterList.push_back(primClass->Parameters[p]); + } + } + } + else + { + // For each primitive property + uint numProp = primitive->getNumProperty(); + for (uint p = 0; p < numProp; p++) + { + // Get the property + std::string propertyName; + const NLLIGO::IProperty *prop; + nlverify(primitive->getProperty(p, propertyName, prop)); + + // Add a default property + NLLIGO::CPrimitiveClass::CParameter defProp(*prop, propertyName.c_str()); + + if (defProp.Name == "name") + parameterList.push_front(defProp); + else + parameterList.push_back(defProp); + } + } + + // Remove property class + std::list::iterator ite = parameterList.begin (); + while (ite != parameterList.end ()) + { + std::list::iterator next = ite; + next++; + if (ite->Name == "class") + { + parameterList.erase(ite); + } + ite = next; + } + + QtProperty *groupNode; + groupNode = m_groupManager->addProperty(QString("%1(%2)").arg(node->data(Qt::DisplayRole).toString()).arg(primClass->Name.c_str())); + m_ui.treePropertyBrowser->addProperty(groupNode); + + ite = parameterList.begin(); + while (ite != parameterList.end()) + { + NLLIGO::CPrimitiveClass::CParameter ¶meter = (*ite); + QtProperty *prop; + NLLIGO::IProperty *ligoProperty = 0; + primitive->getPropertyByName(parameter.Name.c_str(), ligoProperty); + + if (parameter.Type == NLLIGO::CPrimitiveClass::CParameter::ConstString) + prop = addConstStringProperty(ligoProperty, parameter, primitive); + else if (parameter.Type == NLLIGO::CPrimitiveClass::CParameter::String) + prop = addStringProperty(ligoProperty, parameter, primitive); + else if (parameter.Type == NLLIGO::CPrimitiveClass::CParameter::StringArray) + prop = addStringArrayProperty(ligoProperty, parameter, primitive); + else if (parameter.Type == NLLIGO::CPrimitiveClass::CParameter::ConstStringArray) + prop = addConstStringArrayProperty(ligoProperty, parameter, primitive); + else + prop = addBoolProperty(ligoProperty, parameter, primitive); + + // Default value ? + if ((ligoProperty == NULL) || (ligoProperty->Default)) + prop->setModified(false); + else + prop->setModified(true); + + bool staticChildSelected = Utils::ligoConfig()->isStaticChild(*primitive); + if (parameter.ReadOnly || (staticChildSelected && (parameter.Name == "name"))) + prop->setEnabled(false); + + // File ? + if (parameter.Filename && (parameter.FileExtension.empty() || parameter.Type != NLLIGO::CPrimitiveClass::CParameter::StringArray)) + { + // TODO: Create an edit box + // CHECK: only for ConstString + } + + groupNode->addSubProperty(prop); + + ite++; + } + + blockSignalsOfProperties(false); +} + void PropertyEditorWidget::propertyChanged(QtProperty *property) { - nlinfo(QString("property %1 changed").arg(property->propertyName()).toStdString().c_str()); + nlinfo(QString("property %1 changed").arg(property->propertyName()).toUtf8().constData()); } void PropertyEditorWidget::resetProperty(QtProperty *property) -{ - nlinfo(QString("property %1 reset").arg(property->propertyName()).toStdString().c_str()); -} - -QtProperty *PropertyEditorWidget::addBoolProperty(const NLLIGO::IProperty *property, - const NLLIGO::CPrimitiveClass::CParameter ¶meter, - const NLLIGO::IPrimitive *primitive) -{ - std::string value; - std::string name = parameter.Name.c_str(); - primitive->getPropertyByName(name.c_str(), value); - QtProperty *prop = m_boolManager->addProperty(name.c_str()); - // if (Default) - { - //DialogProperties->setDefaultValue (this, value); - m_boolManager->setValue(prop, bool((value=="true")?1:0)); - } - return prop; -} - -QtProperty *PropertyEditorWidget::addConstStringProperty(const NLLIGO::IProperty *property, - const NLLIGO::CPrimitiveClass::CParameter ¶meter, - const NLLIGO::IPrimitive *primitive) -{ - std::string value; - std::string name = parameter.Name.c_str(); - - // Get current value - primitive->getPropertyByName(name.c_str(), value); - - // Create qt property - QtProperty *prop = m_enumManager->addProperty(parameter.Name.c_str()); - - QStringList listEnums = getComboValues(parameter); - - if (listEnums.isEmpty()) - { - listEnums << QString(value.c_str()) + tr(" (WRN: Check leveldesign!)"); - m_enumManager->setEnumNames(prop, listEnums); - m_enumManager->setValue(prop, 0); - prop->setEnabled(false); - } - else - { - // TODO: check this logic - if (parameter.DefaultValue.empty() || (parameter.DefaultValue[0].Name.empty())) - listEnums.prepend(""); - - // Fill qt property - m_enumManager->setEnumNames(prop, listEnums); - - // Find index of current value - for (int i = 0; i < listEnums.size(); i++) - { - if (value == listEnums[i].toStdString()) - { - m_enumManager->setValue(prop, i); - break; - } - } - } - - return prop; -} - -QtProperty *PropertyEditorWidget::addStringProperty(const NLLIGO::IProperty *property, - const NLLIGO::CPrimitiveClass::CParameter ¶meter, - const NLLIGO::IPrimitive *primitive) -{ - std::string value; - std::string name = parameter.Name.c_str(); - primitive->getPropertyByName(name.c_str(), value); - QtProperty *prop = m_stringManager->addProperty(parameter.Name.c_str()); - m_stringManager->setValue(prop, QString(value.c_str())); - return prop; -} - -QtProperty *PropertyEditorWidget::addStringArrayProperty(const NLLIGO::IProperty *property, - const NLLIGO::CPrimitiveClass::CParameter ¶meter, - const NLLIGO::IPrimitive *primitive) -{ - std::string name = parameter.Name.c_str(); - QtProperty *prop = m_stringArrayManager->addProperty(parameter.Name.c_str()); - - const NLLIGO::IProperty *ligoProperty; - std::vector vectString; - - if (primitive->getPropertyByName(parameter.Name.c_str (), ligoProperty)) - { - const NLLIGO::CPropertyStringArray *const propStringArray = dynamic_cast (ligoProperty); - if (propStringArray) - { - const std::vector &vectString = propStringArray->StringArray; - if (!vectString.empty()) - { - std::string temp; - for (size_t i = 0; i < vectString.size(); i++) - { - temp += vectString[i]; - if (i != (vectString.size() - 1)) - temp += '\n'; - } - m_stringArrayManager->setValue(prop, temp.c_str()); - prop->setToolTip(temp.c_str()); - } - } - else - { - m_stringArrayManager->setValue(prop, "StringArray :("); - } - } - - // Create an "EDIT" button if the text is editable (FileExtension != "") - if (parameter.FileExtension != "") - { - // Create an edit box - // TODO: - } - return prop; -} - -QtProperty *PropertyEditorWidget::addConstStringArrayProperty(const NLLIGO::IProperty *property, - const NLLIGO::CPrimitiveClass::CParameter ¶meter, - const NLLIGO::IPrimitive *primitive) -{ - std::string value; - std::string name = parameter.Name.c_str(); - - // Get current value - primitive->getPropertyByName(name.c_str(), value); - - // Create qt property -// QtProperty *prop = m_enumManager->addProperty(parameter.Name.c_str()); - QtProperty *prop = m_stringArrayManager->addProperty(parameter.Name.c_str()); - - QStringList listEnums = getComboValues(parameter); - - if (listEnums.isEmpty()) - { -// listEnums << QString(value.c_str()) + tr(" (WRN: Check leveldesign!)"); -// m_enumManager->setEnumNames(prop, listEnums); -// m_enumManager->setValue(prop, 0); - prop->setEnabled(false); - } - else - { - // Fill qt property - m_enumManager->setEnumNames(prop, listEnums); - - // Find index of current value - //for (int i = 0; i < listEnums.size(); i++) - //{ - // if (value == listEnums[i].toStdString()) - // { - // m_enumManager->setValue(prop, i); - // break; - // } - //} - - const NLLIGO::IProperty *ligoProperty; - std::vector vectString; - - if (primitive->getPropertyByName (parameter.Name.c_str(), ligoProperty)) - { - const NLLIGO::CPropertyStringArray *const propStringArray = dynamic_cast (ligoProperty); - if (propStringArray) - { - const std::vector &vectString = propStringArray->StringArray; - if (!vectString.empty()) - { - std::string temp; - for (size_t i = 0; i < vectString.size(); i++) - { - temp += vectString[i]; - if (i != (vectString.size() - 1)) - temp += '\n'; - } - m_stringArrayManager->setValue(prop, temp.c_str()); - prop->setToolTip(temp.c_str()); - } - } - else - { - m_stringArrayManager->setValue(prop, "StringArray :("); - } - } - - m_enumManager->setValue(prop, 0); - } - - return prop; -} - -QStringList PropertyEditorWidget::getComboValues(const NLLIGO::CPrimitiveClass::CParameter ¶meter) -{ - // TODO: get context value from dialog - std::string context("jungle"); - std::string defaultContext("default"); - - std::vector listContext; - - if (context != defaultContext) - listContext.push_back(context); - listContext.push_back(defaultContext); - - QStringList listEnums; - - // Correct fill properties with *both* contexts if the current context is not default and is valid. - for (size_t j = 0; j < listContext.size(); j++) - { - std::map::const_iterator ite = parameter.ComboValues.find(listContext[j].c_str()); - - if (ite != parameter.ComboValues.end()) - { - std::vector pathList; - - // Fill pathList - ite->second.appendFilePath(pathList); - - if (parameter.SortEntries) - std::sort(pathList.begin(), pathList.end()); - - for (size_t i = 0; i < pathList.size(); ++i) - listEnums.append(pathList[i].c_str()); - } - } - - return listEnums; -} - +{ + nlinfo(QString("property %1 reset").arg(property->propertyName()).toUtf8().constData()); +} + +QtProperty *PropertyEditorWidget::addBoolProperty(const NLLIGO::IProperty *property, + const NLLIGO::CPrimitiveClass::CParameter ¶meter, + const NLLIGO::IPrimitive *primitive) +{ + std::string value; + std::string name = parameter.Name.c_str(); + primitive->getPropertyByName(name.c_str(), value); + QtProperty *prop = m_boolManager->addProperty(name.c_str()); + // if (Default) + { + //DialogProperties->setDefaultValue (this, value); + m_boolManager->setValue(prop, bool((value=="true")?1:0)); + } + return prop; +} + +QtProperty *PropertyEditorWidget::addConstStringProperty(const NLLIGO::IProperty *property, + const NLLIGO::CPrimitiveClass::CParameter ¶meter, + const NLLIGO::IPrimitive *primitive) +{ + std::string value; + std::string name = parameter.Name.c_str(); + + // Get current value + primitive->getPropertyByName(name.c_str(), value); + + // Create qt property + QtProperty *prop = m_enumManager->addProperty(parameter.Name.c_str()); + + QStringList listEnums = getComboValues(parameter); + + if (listEnums.isEmpty()) + { + listEnums << QString(value.c_str()) + tr(" (WRN: Check leveldesign!)"); + m_enumManager->setEnumNames(prop, listEnums); + m_enumManager->setValue(prop, 0); + prop->setEnabled(false); + } + else + { + // TODO: check this logic + if (parameter.DefaultValue.empty() || (parameter.DefaultValue[0].Name.empty())) + listEnums.prepend(""); + + // Fill qt property + m_enumManager->setEnumNames(prop, listEnums); + + // Find index of current value + for (int i = 0; i < listEnums.size(); i++) + { + if (value == std::string(listEnums[i].toUtf8().constData())) + { + m_enumManager->setValue(prop, i); + break; + } + } + } + + return prop; +} + +QtProperty *PropertyEditorWidget::addStringProperty(const NLLIGO::IProperty *property, + const NLLIGO::CPrimitiveClass::CParameter ¶meter, + const NLLIGO::IPrimitive *primitive) +{ + std::string value; + std::string name = parameter.Name.c_str(); + primitive->getPropertyByName(name.c_str(), value); + QtProperty *prop = m_stringManager->addProperty(parameter.Name.c_str()); + m_stringManager->setValue(prop, QString(value.c_str())); + return prop; +} + +QtProperty *PropertyEditorWidget::addStringArrayProperty(const NLLIGO::IProperty *property, + const NLLIGO::CPrimitiveClass::CParameter ¶meter, + const NLLIGO::IPrimitive *primitive) +{ + std::string name = parameter.Name.c_str(); + QtProperty *prop = m_stringArrayManager->addProperty(parameter.Name.c_str()); + + const NLLIGO::IProperty *ligoProperty; + std::vector vectString; + + if (primitive->getPropertyByName(parameter.Name.c_str (), ligoProperty)) + { + const NLLIGO::CPropertyStringArray *const propStringArray = dynamic_cast (ligoProperty); + if (propStringArray) + { + const std::vector &vectString = propStringArray->StringArray; + if (!vectString.empty()) + { + std::string temp; + for (size_t i = 0; i < vectString.size(); i++) + { + temp += vectString[i]; + if (i != (vectString.size() - 1)) + temp += '\n'; + } + m_stringArrayManager->setValue(prop, temp.c_str()); + prop->setToolTip(temp.c_str()); + } + } + else + { + m_stringArrayManager->setValue(prop, "StringArray :("); + } + } + + // Create an "EDIT" button if the text is editable (FileExtension != "") + if (parameter.FileExtension != "") + { + // Create an edit box + // TODO: + } + return prop; +} + +QtProperty *PropertyEditorWidget::addConstStringArrayProperty(const NLLIGO::IProperty *property, + const NLLIGO::CPrimitiveClass::CParameter ¶meter, + const NLLIGO::IPrimitive *primitive) +{ + std::string value; + std::string name = parameter.Name.c_str(); + + // Get current value + primitive->getPropertyByName(name.c_str(), value); + + // Create qt property +// QtProperty *prop = m_enumManager->addProperty(parameter.Name.c_str()); + QtProperty *prop = m_stringArrayManager->addProperty(parameter.Name.c_str()); + + QStringList listEnums = getComboValues(parameter); + + if (listEnums.isEmpty()) + { +// listEnums << QString(value.c_str()) + tr(" (WRN: Check leveldesign!)"); +// m_enumManager->setEnumNames(prop, listEnums); +// m_enumManager->setValue(prop, 0); + prop->setEnabled(false); + } + else + { + // Fill qt property + m_enumManager->setEnumNames(prop, listEnums); + + // Find index of current value + //for (int i = 0; i < listEnums.size(); i++) + //{ + // if (value == std::string(listEnums[i].toUtf8().constData())) + // { + // m_enumManager->setValue(prop, i); + // break; + // } + //} + + const NLLIGO::IProperty *ligoProperty; + std::vector vectString; + + if (primitive->getPropertyByName (parameter.Name.c_str(), ligoProperty)) + { + const NLLIGO::CPropertyStringArray *const propStringArray = dynamic_cast (ligoProperty); + if (propStringArray) + { + const std::vector &vectString = propStringArray->StringArray; + if (!vectString.empty()) + { + std::string temp; + for (size_t i = 0; i < vectString.size(); i++) + { + temp += vectString[i]; + if (i != (vectString.size() - 1)) + temp += '\n'; + } + m_stringArrayManager->setValue(prop, temp.c_str()); + prop->setToolTip(temp.c_str()); + } + } + else + { + m_stringArrayManager->setValue(prop, "StringArray :("); + } + } + + m_enumManager->setValue(prop, 0); + } + + return prop; +} + +QStringList PropertyEditorWidget::getComboValues(const NLLIGO::CPrimitiveClass::CParameter ¶meter) +{ + // TODO: get context value from dialog + std::string context("jungle"); + std::string defaultContext("default"); + + std::vector listContext; + + if (context != defaultContext) + listContext.push_back(context); + listContext.push_back(defaultContext); + + QStringList listEnums; + + // Correct fill properties with *both* contexts if the current context is not default and is valid. + for (size_t j = 0; j < listContext.size(); j++) + { + std::map::const_iterator ite = parameter.ComboValues.find(listContext[j].c_str()); + + if (ite != parameter.ComboValues.end()) + { + std::vector pathList; + + // Fill pathList + ite->second.appendFilePath(pathList); + + if (parameter.SortEntries) + std::sort(pathList.begin(), pathList.end()); + + for (size_t i = 0; i < pathList.size(); ++i) + listEnums.append(pathList[i].c_str()); + } + } + + return listEnums; +} + void PropertyEditorWidget::blockSignalsOfProperties(bool block) { - m_stringManager->blockSignals(block); - m_boolManager->blockSignals(block); - m_enumManager->blockSignals(block); + m_stringManager->blockSignals(block); + m_boolManager->blockSignals(block); + m_enumManager->blockSignals(block); m_stringArrayManager->blockSignals(block); -} -} /* namespace WorldEditor */ +} +} /* namespace WorldEditor */