diff options
| author | Bryan Galdrikian <[email protected]> | 2017-02-24 09:32:20 -0800 |
|---|---|---|
| committer | Bryan Galdrikian <[email protected]> | 2017-02-24 09:32:20 -0800 |
| commit | e1bf674c16e3c8472b29574159c789cd3f0c64e0 (patch) | |
| tree | 9f0cfce09c71a2c27ff19589fcad6cd83504477c /tools/CurveEditor/source/Internal/Window/CurveEditorMainWindow.cpp | |
| parent | first commit (diff) | |
| download | blast-e1bf674c16e3c8472b29574159c789cd3f0c64e0.tar.xz blast-e1bf674c16e3c8472b29574159c789cd3f0c64e0.zip | |
Updating to [email protected] and [email protected] with a new directory structure.
NvBlast folder is gone, files have been moved to top level directory. README is changed to reflect this.
Diffstat (limited to 'tools/CurveEditor/source/Internal/Window/CurveEditorMainWindow.cpp')
| -rw-r--r-- | tools/CurveEditor/source/Internal/Window/CurveEditorMainWindow.cpp | 1530 |
1 files changed, 1530 insertions, 0 deletions
diff --git a/tools/CurveEditor/source/Internal/Window/CurveEditorMainWindow.cpp b/tools/CurveEditor/source/Internal/Window/CurveEditorMainWindow.cpp new file mode 100644 index 0000000..b11c4cf --- /dev/null +++ b/tools/CurveEditor/source/Internal/Window/CurveEditorMainWindow.cpp @@ -0,0 +1,1530 @@ +#include "CurveEditorMainWindow.h" +#include "ui_CurveEditorMainWindow.h" +#include <QtWidgets/QSplitter> +#include <QtWidgets/QColorDialog> +#include "CurveWidget.h" +#include "ColorWidget.h" +#include "AlphaDialog.h" +#include <QtCore/QDebug> +#include <QtWidgets/QFileDialog> +#include <QtWidgets/QMessageBox> +#include <float.h> + +namespace nvidia { +namespace CurveEditor { + +// each value is associated with the tab index of tab control of attributes +enum AttributesTabIndex +{ + eCurveTab = 0, + eColorTab = 1, +}; + +///////////////////////////////////////////////////////////////////////////////////// +QString InterpolateModeToString(InterpolateMode mode) +{ + switch(mode) + { + case eDiscret: + return "Discret"; + case eLinear: + return "Linear"; + case eBezierSpline: + return "BezierSpline"; + case eCatmullRomSpline: + return "CatmullRomSpline"; + default: + return "Discret"; + } +} + +///////////////////////////////////////////////////////////////////////////////////// +InterpolateMode StringToInterpolateMode(const QString& mode) +{ + if (mode == "Discret") + { + return eDiscret; + } + else if (mode == "Linear") + { + return eLinear; + } + else if (mode == "BezierSpline") + { + return eBezierSpline; + } + else if (mode == "CatmullRomSpline") + { + return eCatmullRomSpline; + } + else + { + return eDiscret; + } +} + +QString OpenTextureFile( QString lastDir, QString title = "") +{ + QString titleStr = "Open Texture File"; + if(!title.isEmpty()) + titleStr = title; + + QString fileName = QFileDialog::getOpenFileName(nullptr, titleStr, lastDir, "Images (*.dds *.png *.bmp *.jpg *.tga)"); + + return fileName; +} + +///////////////////////////////////////////////////////////////////////////////////// +void setTextureButtons(QPushButton *pTex, QPushButton *pReload, QPushButton *pClear) +{ + pTex->setIcon(QIcon(":/AppMainWindow/Icon/TextureEnabled_icon.png")); + pReload->setIcon(QIcon(":/AppMainWindow/Icon/Refresh_icon.png")); + pClear->setIcon(QIcon(":/AppMainWindow/Icon/Remove_icon.png")); + + pTex->setIconSize(QSize(12,12)); + pReload->setIconSize(QSize(12,12)); + pClear->setIconSize(QSize(12,12)); +} + +////////////////////////////////////////////////////////// +QString addStar(QString text, bool add) +{ + QByteArray ba = text.toUtf8(); + + const char* in = ba.data(); + char out[1024]; + + int i = 0; + for (i = 0; i < strlen(in); i++) + { + if (in[i] == '*') + break; + out[i] = in[i]; + } + out[i] = 0; + + QString newtext; + if (add) + newtext = QString((const char*)out) + QString("*"); + else + newtext = QString((const char*)out) ; + return newtext; +} + +////////////////////////////////////////////////////////// +void setFocusColor(QWidget* qWidget, bool sameForAllAttributes) +{ + if (!qWidget) + return; + + QString sameStyle = QString("font: ; color: rgb(150,150,150);") ; + QString differentStyle = QString("font: bold; color: rgb(255,55,55);"); + QString style = (sameForAllAttributes) ? sameStyle : differentStyle; + + qWidget->setStyleSheet(style); + + QLabel* label = dynamic_cast<QLabel*>(qWidget); + if (label) + { + QString newtext = addStar(label->text(), !sameForAllAttributes); + + label->setFrameStyle(0); + label->setText(newtext); + } +} + +////////////////////////////////////////////////////////// +void pickColor(QColor& color, QWidget* parent) +{ + QColor newColor = QColorDialog::getColor(color, parent); + if(newColor.isValid()) + { + color = newColor; + } +} + +////////////////////////////////////////////////////////// +void pickAlpha(int& alpha, QWidget* parent) +{ + alpha = AlphaDialog::getAlpha(alpha, parent); +} + +////////////////////////////////////////////////////////// +void setButtonColor(QPushButton *button, const QColor& color) +{ + QString specBtnStyle = QString("background-color: rgb(%1,%2,%3);") + .arg(color.red()) + .arg(color.green()) + .arg(color.blue()); + + button->setStyleSheet(specBtnStyle); +} + +////////////////////////////////////////////////////////// +void setButtonTex(QPushButton *button, bool used) +{ + if (used) + button->setIcon(QIcon(":/AppMainWindow/Icon/TextureIsUsed_icon.png")); + else + button->setIcon(QIcon(":/AppMainWindow/Icon/TextureEnabled_icon.png")); +} + +CurveEditorMainWindow::CurveEditorMainWindow(QWidget *parent) + : QMainWindow(parent) + , ui(new Ui::CurveEditorMainWindow) + , _curveWidget(nullptr) + , _colorWidget(nullptr) + , _curveAttributeCache(nullptr) + , _colorAttributeCache(nullptr) + , _updateUIFromData(false) + , _canMoveCurveControlPointHorizontally(true) + , _canAddRemoveCurveControlPoint(true) + , _canChangeCurveTangentType(true) +{ + Q_INIT_RESOURCE(CurveEditor); + + ui->setupUi(this); + + setTextureButtons(ui->btnColorTex, ui->btnColorReload, ui->btnColorClear); + setTextureButtons(ui->btnAlphaTex, ui->btnAlphaReload, ui->btnAlphaClear); + + ui->centralWidget->setStretchFactor(0, 30); + ui->centralWidget->setStretchFactor(1, 70); + + { + QActionGroup* groupSnap = new QActionGroup(this); + groupSnap->addAction(ui->actionSnap_All); + groupSnap->addAction(ui->actionSnap_Horizontal); + groupSnap->addAction(ui->actionSnap_Vertical); + } + + { + QActionGroup* groupAddRemoveCtrlPnt = new QActionGroup(this); + groupAddRemoveCtrlPnt->addAction(ui->actionAdd_Control_Point_By_Click); + groupAddRemoveCtrlPnt->addAction(ui->actionRemove_Control_Point_By_Click); + } + + _fillCurveAttributesTree(); + + _fillColorAttributesTree(); + + { + _curveWidget = new CurveWidget(ui->frameCurveEditorArea); + ui->layoutCurveEditorArea->addWidget(_curveWidget); + connect(_curveWidget, SIGNAL(PickedControlPointChanged(const std::vector<CurveEntity*>)), this, SLOT(onCurvePickedControlPointChanged(const std::vector<CurveEntity*>))); + connect(_curveWidget, SIGNAL(PickedControlPointValueChanged(QPointF&)), this, SLOT(onCurvePickedControlPointValueChanged(QPointF&))); + } + + { + _colorWidget = new ColorWidget(ui->frameColorAlphaRamp); + ui->layoutColorEditorArea->addWidget(_colorWidget); + connect(_colorWidget, SIGNAL(PickedControlPointChanged(bool)), this, SLOT(onColorPickedControlPointChanged(bool))); + + QColor color = _colorWidget->getColor(); + setButtonColor(ui->btnColor, color); + setButtonColor(ui->btnAlpha, QColor(color.alpha(), color.alpha(), color.alpha())); + } + + connect(_curveWidget, SIGNAL(CurveAttributeChanged(nvidia::CurveEditor::CurveAttribute*)), this, SIGNAL(CurveAttributeChanged(nvidia::CurveEditor::CurveAttribute*))); + connect(_colorWidget, SIGNAL(ColorAttributeChanged(nvidia::CurveEditor::ColorAttribute*)), this, SIGNAL(ColorAttributeChanged(nvidia::CurveEditor::ColorAttribute*))); + connect(_colorWidget, SIGNAL(ReloadColorAttributeTexture(nvidia::CurveEditor::ColorAttribute*, bool, int)), this, SIGNAL(ReloadColorAttributeTexture(nvidia::CurveEditor::ColorAttribute*, bool, int))); + + QString defFilePath; + + QString appDir = qApp->applicationDirPath(); + QDir dir(appDir); + if (dir.cd("../../media")) + defFilePath = dir.absolutePath(); + + _lastFilePath = defFilePath; + _presetPath = _lastFilePath + "/Presets/"; +} + +CurveEditorMainWindow::~CurveEditorMainWindow() +{ + delete ui; + ui = nullptr; +} + +void CurveEditorMainWindow::setCurveAttributes(const std::vector<CurveAttributeBase*>& attributes) +{ + _curveWidget->setCurveAttributes(std::vector<CurveAttributeBase*>()); + + _curveAttributes = attributes; + _fillCurveAttributesTree(); + + _canMoveCurveControlPointHorizontally = false; + _canAddRemoveCurveControlPoint = false; + _canChangeCurveTangentType = false; + size_t countAttributes = _curveAttributes.size(); + for (size_t i = 0; i < countAttributes; ++i) + { + CurveAttributeBase* attribute = _curveAttributes[i]; + + if (attribute->getType() == eGroupAttr) + { + CurveAttributeGroup* attributeGroup = static_cast<CurveAttributeGroup*>(attribute); + size_t countAttributesInGroup = attributeGroup->attributes.size(); + for (size_t j = 0; j < countAttributesInGroup; ++j) + { + CurveAttribute* attributeInGroup = static_cast<CurveAttribute*>(attributeGroup->attributes[j]); + if (attributeInGroup->canMoveControlPointHorizontally()) + _canMoveCurveControlPointHorizontally = true; + if (attributeInGroup->canAddRemoveControlPoint()) + _canAddRemoveCurveControlPoint = true; + if (attributeInGroup->canChangeTangentType()) + _canChangeCurveTangentType = true; + } + } + else + { + CurveAttribute* attributeSecific = static_cast<CurveAttribute*>(attribute); + if (attributeSecific->canMoveControlPointHorizontally()) + _canMoveCurveControlPointHorizontally = true; + if (attributeSecific->canAddRemoveControlPoint()) + _canAddRemoveCurveControlPoint = true; + if (attributeSecific->canChangeTangentType()) + _canChangeCurveTangentType = true; + } + } + + ui->spinBoxLocation->setEnabled(_canMoveCurveControlPointHorizontally); + _syncUIStatusWithSelectedAttribute(_canAddRemoveCurveControlPoint, _canChangeCurveTangentType); +} + +void CurveEditorMainWindow::setColorCurveAttributes(const std::vector<ColorAttribute*>& attributes) +{ + _colorWidget->setColorAttribute(nullptr); + + _colorAttributes = attributes; + _fillColorAttributesTree(); +} + +void CurveEditorMainWindow::setSelectedCurveAttributes(const std::vector<CurveAttributeBase*>& attributes) +{ + ui->tabWidgetAttributes->setCurrentIndex(eCurveTab); + + for (size_t i = 0; i < attributes.size(); ++i) + { + CurveAttributeBase* attribute = attributes[i]; + QList<QTreeWidgetItem*> items = ui->treeWidgetCurveAttributes->findItems(attribute->getName().c_str(), Qt::MatchExactly); + if (items.size() > 0) + items[0]->setSelected(true); + } +} + +void CurveEditorMainWindow::setSelectedColorAttribute(const ColorAttribute* attribute) +{ + ui->tabWidgetAttributes->setCurrentIndex(eColorTab); + + if (attribute) + { + QList<QTreeWidgetItem*> items = ui->treeWidgetColorAttributes->findItems(attribute->getName().c_str(), Qt::MatchExactly); + if (items.size() > 0) + items[0]->setSelected(true); + } +} + +void CurveEditorMainWindow::setResampleEnabled(bool enable) +{ + ui->checkBoxResamplePoints->setVisible(enable); + ui->spinBoxResamplePoints->setVisible(enable); + ui->checkBoxResamplePoints->setEnabled(enable); + ui->spinBoxResamplePoints->setEnabled(enable); +} + +void CurveEditorMainWindow::on_actionCopy_triggered() +{ + if (eCurveTab == ui->tabWidgetAttributes->currentIndex()) + { + QList<QTreeWidgetItem*> items = ui->treeWidgetCurveAttributes->selectedItems(); + if (1 == items.count()) + { + CurveAttributeTreeItem* item = static_cast<CurveAttributeTreeItem*>(items.at(0)); + + if (eSingleAttr == item->_attribute->getType()) + { + if (_curveAttributeCache == nullptr) + _curveAttributeCache = new CurveAttribute("curveAttributeCache"); + + CurveAttribute* selectedAttribute = static_cast<CurveAttribute*>(item->_attribute); + _curveAttributeCache->curve = selectedAttribute->curve; + return ; + } + } + + QMessageBox::warning(this, tr("Warning"), tr("You should select only one attribute to copy attribute data.")); + } + else if (eColorTab == ui->tabWidgetAttributes->currentIndex()) + { + QList<QTreeWidgetItem*> items = ui->treeWidgetColorAttributes->selectedItems(); + if (1 == items.count()) + { + ColorAttributeTreeItem* item = static_cast<ColorAttributeTreeItem*>(items.at(0)); + + if (eColorAttr == item->_attribute->getType()) + { + if (_colorAttributeCache == nullptr) + _colorAttributeCache = new ColorAttribute("colorAttributeCache"); + + ColorAttribute* selectedAttribute = static_cast<ColorAttribute*>(item->_attribute); + _colorAttributeCache->colorCurve = selectedAttribute->colorCurve; + _colorAttributeCache->alphaCurve = selectedAttribute->alphaCurve; + return ; + } + } + } +} + +void CurveEditorMainWindow::on_actionPaste_triggered() +{ + if (eCurveTab == ui->tabWidgetAttributes->currentIndex()) + { + if (nullptr == _curveAttributeCache) + { + QMessageBox::warning(this, tr("Warning"), tr("You should copy or load an curve attribute's data first.")); + return ; + } + + QList<QTreeWidgetItem*> items = ui->treeWidgetCurveAttributes->selectedItems(); + if (1 == items.count()) + { + CurveAttributeTreeItem* item = static_cast<CurveAttributeTreeItem*>(items.at(0)); + + if (eSingleAttr == item->_attribute->getType()) + { + CurveAttribute* selectedAttribute = static_cast<CurveAttribute*>(item->_attribute); + bool compatible = true; + if (compatible) + { + selectedAttribute->curve = _curveAttributeCache->curve; + on_treeWidgetCurveAttributes_itemSelectionChanged(); + CurveAttributeChanged(selectedAttribute); + } + else + { + QMessageBox::warning(this, tr("Warning"), tr("The data types between the curve attribute copyed from and the curve attribute copy to are incompatible .")); + } + return ; + } + } + + QMessageBox::warning(this, tr("Warning"), tr("You should select only one curve attribute to paste curve attribute data.")); + } + else if (eColorTab == ui->tabWidgetAttributes->currentIndex()) + { + if (nullptr == _colorAttributeCache) + { + QMessageBox::warning(this, tr("Warning"), tr("You should copy or load an color attribute's data first.")); + return ; + } + + QList<QTreeWidgetItem*> items = ui->treeWidgetColorAttributes->selectedItems(); + if (1 == items.count()) + { + ColorAttributeTreeItem* item = static_cast<ColorAttributeTreeItem*>(items.at(0)); + + if (eColorAttr == item->_attribute->getType()) + { + ColorAttribute* selectedAttribute = static_cast<ColorAttribute*>(item->_attribute); + bool compatible = true; + if (compatible) + { + selectedAttribute->colorCurve = _colorAttributeCache->colorCurve; + selectedAttribute->alphaCurve = _colorAttributeCache->alphaCurve; + on_treeWidgetColorAttributes_itemSelectionChanged(); + ColorAttributeChanged(selectedAttribute); + } + else + { + QMessageBox::warning(this, tr("Warning"), tr("The data types between copy from attribute and copy to attribute are incompatible .")); + } + return ; + } + } + + QMessageBox::warning(this, tr("Warning"), tr("You should select only one attribute to paste attribute data.")); + } +} + +void CurveEditorMainWindow::on_actionSave_Selected_as_Preset_triggered() +{ + QDir dir(_presetPath); + if (!dir.exists()) + dir.mkdir(_presetPath); + + CurveAttribute* curveAttribute = nullptr; + ColorAttribute* colorAttribute = nullptr; + QString presetFile = _presetPath; + + if (eCurveTab == ui->tabWidgetAttributes->currentIndex()) + { + QList<QTreeWidgetItem*> items = ui->treeWidgetCurveAttributes->selectedItems(); + if (1 != items.count()) + { + QMessageBox::warning(this, tr("Warning"), tr("You should select one attribute only to save preset.")); + return ; + } + + CurveAttributeTreeItem* item = static_cast<CurveAttributeTreeItem*>(items.at(0)); + + if (eSingleAttr != item->_attribute->getType()) + { + return; + } + + curveAttribute = static_cast<CurveAttribute*>(item->_attribute); + presetFile += curveAttribute->getName().c_str(); + presetFile += ".cps"; + } + else if (eColorTab == ui->tabWidgetAttributes->currentIndex()) + { + QList<QTreeWidgetItem*> items = ui->treeWidgetColorAttributes->selectedItems(); + if (1 != items.count()) + { + QMessageBox::warning(this, tr("Warning"), tr("You should select one attribute only to save preset.")); + return ; + } + + ColorAttributeTreeItem* item = static_cast<ColorAttributeTreeItem*>(items.at(0)); + + if (eColorAttr != item->_attribute->getType()) + { + return; + } + + colorAttribute = item->_attribute; + presetFile += colorAttribute->getName().c_str(); + presetFile += ".cps"; + } + + QString filePath = QFileDialog::getSaveFileName(this, tr("Save Curve PreSet"), presetFile, tr("Curve PreSet(*.cps)")); + if (filePath.length() == 0) + { + QMessageBox::warning(this, tr("Path"), tr("You didn't select any files.")); + return ; + } + + QFileInfo fileInfo(filePath); + _presetPath = fileInfo.absoluteDir().absolutePath(); + if (!_presetPath.endsWith("/")) + _presetPath += "/"; + + QFile file(filePath); + if (!file.open(QIODevice::WriteOnly|QIODevice::Truncate)) + { + return; + } + QTextStream out(&file); + + QDomDocument xmlDoc; + QDomElement rootElm = xmlDoc.createElement(tr("CurvePreSet")); + xmlDoc.appendChild(rootElm); + + if (curveAttribute != nullptr) + { + _saveAttribute(rootElm, curveAttribute); + } + else if (colorAttribute != nullptr) + { + _saveAttribute(rootElm, colorAttribute); + } + // 4 is count of indent + xmlDoc.save(out, 4); +} + +void CurveEditorMainWindow::on_actionLoad_Preset_to_Copy_Buffer_triggered() +{ + QString filePath = QFileDialog::getOpenFileName(this, tr("Open Curve PreSet"), _presetPath, tr("Curve PreSet(*.cps)")); + if (filePath.length() == 0) + { + QMessageBox::warning(this, tr("Path"), tr("You didn't select any files.")); + return; + } + + QFileInfo fileInfo(filePath); + _presetPath = fileInfo.absoluteDir().absolutePath(); + if (!_presetPath.endsWith("/")) + _presetPath += "/"; + + QFile file(filePath); + + if (!file.open(QIODevice::ReadOnly)) + { + return; + } + + QDomDocument xmlDoc; + if (!xmlDoc.setContent(&file)) + { + file.close(); + return; + } + file.close(); + + if (xmlDoc.isNull() || xmlDoc.documentElement().tagName() != tr("CurvePreSet")) + { + QMessageBox::warning(this, tr("Warning"), tr("The file you selected is empty or not a cps file.")); + return; + } + + QDomElement elm = xmlDoc.documentElement().firstChildElement(); + CurveAttributeBase* presetAttribute = _loadAttribute(elm); + if (nullptr == presetAttribute) + { + QMessageBox::warning(this, tr("Warning"), tr("Faid to load the cps file!")); + return; + } + + if (eSingleAttr == presetAttribute->_type) + { + if (_curveAttributeCache == nullptr) + _curveAttributeCache = new CurveAttribute("curveAttributeCache"); + + CurveAttribute* presetCurveAttribute = static_cast<CurveAttribute*>(presetAttribute); + _curveAttributeCache->curve = presetCurveAttribute->curve; + } + else if (eColorAttr == presetAttribute->_type) + { + if (_colorAttributeCache == nullptr) + _colorAttributeCache = new ColorAttribute("colorAttributeCache"); + + ColorAttribute* presetColorAttribute = static_cast<ColorAttribute*>(presetAttribute); + _colorAttributeCache->colorCurve = presetColorAttribute->colorCurve; + _colorAttributeCache->alphaCurve = presetColorAttribute->alphaCurve; + } +} + +void CurveEditorMainWindow::on_actionImport_Preset_onto_Selected_triggered() +{ + CurveAttribute* curveAttribute = nullptr; + ColorAttribute* colorAttribute = nullptr; + if (eCurveTab == ui->tabWidgetAttributes->currentIndex()) + { + QList<QTreeWidgetItem*> items = ui->treeWidgetCurveAttributes->selectedItems(); + if (1 != items.count()) + { + QMessageBox::warning(this, tr("Warning"), tr("You should select only one attribute to import preset.")); + return; + } + + CurveAttributeTreeItem* item = static_cast<CurveAttributeTreeItem*>(items.at(0)); + + if (eSingleAttr != item->_attribute->getType()) + { + return; + } + + curveAttribute = static_cast<CurveAttribute*>(item->_attribute); + } + else if (eColorTab == ui->tabWidgetAttributes->currentIndex()) + { + QList<QTreeWidgetItem*> items = ui->treeWidgetColorAttributes->selectedItems(); + if (1 != items.count()) + { + QMessageBox::warning(this, tr("Warning"), tr("You should select only one attribute to import preset.")); + return; + } + + ColorAttributeTreeItem* item = static_cast<ColorAttributeTreeItem*>(items.at(0)); + + if (eColorAttr != item->_attribute->getType()) + { + return; + } + + colorAttribute = item->_attribute; + } + + QString filePath = QFileDialog::getOpenFileName(this, tr("Open Curve PreSet"), _presetPath, tr("Curve PreSet(*.cps)")); + if (filePath.length() == 0) + { + QMessageBox::warning(this, tr("Path"), tr("You didn't select any files.")); + return; + } + + QFileInfo fileInfo(filePath); + _presetPath = fileInfo.absoluteDir().absolutePath(); + if (!_presetPath.endsWith("/")) + _presetPath += "/"; + + QFile file(filePath); + + if (!file.open(QIODevice::ReadOnly)) + { + return; + } + + QDomDocument xmlDoc; + if (!xmlDoc.setContent(&file)) + { + file.close(); + return; + } + file.close(); + + if (xmlDoc.isNull() || xmlDoc.documentElement().tagName() != tr("CurvePreSet")) + { + QMessageBox::warning(this, tr("Warning"), tr("The file you selected is empty or not a cps file.")); + return; + } + + QDomElement elm = xmlDoc.documentElement().firstChildElement(); + CurveAttributeBase* presetAttribute = _loadAttribute(elm); + if (nullptr == presetAttribute) + { + QMessageBox::warning(this, tr("Warning"), tr("Faid to load the cps file!")); + return; + } + + if (eSingleAttr == presetAttribute->_type) + { + CurveAttribute* presetCurveAttribute = static_cast<CurveAttribute*>(presetAttribute); + + bool compatible = (curveAttribute != nullptr) ? true:false; + if (compatible) + { + curveAttribute->curve = presetCurveAttribute->curve; + on_treeWidgetCurveAttributes_itemSelectionChanged(); + CurveAttributeChanged(curveAttribute); + } + else + { + QMessageBox::warning(this, tr("Warning"), tr("The selected attribute is incompatible with preset attribute.")); + } + } + else if (eColorAttr == presetAttribute->_type) + { + ColorAttribute* presetColorAttribute = static_cast<ColorAttribute*>(presetAttribute); + + bool compatible = (colorAttribute != nullptr) ? true:false;; + if (compatible) + { + colorAttribute->colorCurve = presetColorAttribute->colorCurve; + colorAttribute->alphaCurve = presetColorAttribute->alphaCurve; + on_treeWidgetColorAttributes_itemSelectionChanged(); + ColorAttributeChanged(colorAttribute); + } + else + { + QMessageBox::warning(this, tr("Warning"), tr("The selected attribute is incompatible with preset attribute.")); + } + } +} + +void CurveEditorMainWindow::on_actionReset_Curve_triggered() +{ + if (ui->tabWidgetAttributes->currentIndex() == eCurveTab) + { + _curveWidget->reset(); + } + else if (ui->tabWidgetAttributes->currentIndex() == eColorTab) + { + _colorWidget->reset(); + } + +} + +void CurveEditorMainWindow::on_actionAdd_Before_Selected_triggered() +{ + if (_curveWidget->hasFocus()) + _curveWidget->addControlPointsBeforeSelected(); + + if (_colorWidget->hasFocus()) + _colorWidget->addControlPointsBeforeSelected(); +} + +void CurveEditorMainWindow::on_actionAdd_After_Selected_triggered() +{ + if (_curveWidget->hasFocus()) + _curveWidget->addControlPointsAfterSelected(); + + if (_colorWidget->hasFocus()) + _colorWidget->addControlPointsAfterSelected(); +} + +void CurveEditorMainWindow::on_actionRemove_Selected_triggered() +{ + if (_curveWidget->hasFocus()) + _curveWidget->removeSelectedControlPoints(); + + if (_colorWidget->hasFocus()) + _colorWidget->removeSelectedControlPoint(); +} + +void CurveEditorMainWindow::on_actionTangent_Stepped_triggered() +{ + if (_curveWidget->hasFocus()) + _curveWidget->setTangentType(eDiscret); + + if (_colorWidget->hasFocus()) + _colorWidget->setTangentType(eDiscret); +} + +void CurveEditorMainWindow::on_actionTangent_Linear_triggered() +{ + if (_curveWidget->hasFocus()) + _curveWidget->setTangentType(eLinear); + + if (_colorWidget->hasFocus()) + _colorWidget->setTangentType(eLinear); +} + +void CurveEditorMainWindow::on_actionTangent_Smooth_triggered() +{ + if (_curveWidget->hasFocus()) + _curveWidget->setSmoothTangent(); + + if (_colorWidget->hasFocus()) + _colorWidget->setSmoothTangent(); +} + +void CurveEditorMainWindow::on_actionTangent_Ease_Out_triggered() +{ + if (_curveWidget->hasFocus()) + _curveWidget->setEaseOutTangent(); + + if (_colorWidget->hasFocus()) + _colorWidget->setEaseOutTangent(); +} + +void CurveEditorMainWindow::on_actionTangent_Ease_In_triggered() +{ + if (_curveWidget->hasFocus()) + _curveWidget->setEaseInTangent(); + + if (_colorWidget->hasFocus()) + _colorWidget->setEaseInTangent(); +} + +void CurveEditorMainWindow::on_actionTangent_Spline_triggered() +{ + if (_curveWidget->hasFocus()) + _curveWidget->setTangentType(eCatmullRomSpline); + + if (_colorWidget->hasFocus()) + _colorWidget->setTangentType(eCatmullRomSpline); +} + +void CurveEditorMainWindow::on_actionSnap_All_triggered() +{ + _curveWidget->setSnapAll(); +} + +void CurveEditorMainWindow::on_actionSnap_Horizontal_triggered() +{ + _curveWidget->setSnapHorizontal(); +} + +void CurveEditorMainWindow::on_actionSnap_Vertical_triggered() +{ + _curveWidget->setSnapVertical(); +} + +void CurveEditorMainWindow::on_actionContract_Horizontally_triggered() +{ + _curveWidget->decreaseCurveScaleHorizontally(); +} + +void CurveEditorMainWindow::on_actionExpand_Horizontally_triggered() +{ + _curveWidget->increaseCurveScaleHorizontally(); +} + +void CurveEditorMainWindow::on_actionContract_Vertically_triggered() +{ + _curveWidget->decreaseCurveScaleVertically(); +} + +void CurveEditorMainWindow::on_actionExpand_Vertically_triggered() +{ + _curveWidget->increaseCurveScaleVertically(); +} + +void CurveEditorMainWindow::on_actionFrame_Horizontally_triggered() +{ + _curveWidget->frameCurveScaleHorizontally(); +} + +void CurveEditorMainWindow::on_actionFrame_Vertically_triggered() +{ + _curveWidget->frameCurveScaleVertically(); +} + +void CurveEditorMainWindow::on_actionFrame_All_triggered() +{ + _curveWidget->frameCurveScale(); +} + +void CurveEditorMainWindow::on_spinBoxLocation_valueChanged(double value) +{ + if (!_updateUIFromData) + _curveWidget->setLocation(value); +} + +void CurveEditorMainWindow::on_spinBoxValue_valueChanged(double value) +{ + if (!_updateUIFromData) + _curveWidget->setValue(value); +} + +void CurveEditorMainWindow::on_btnColor_clicked() +{ + QColor color = _colorWidget->getColor(); + pickColor(color, nullptr); + _colorWidget->setColor(color); + setButtonColor(ui->btnColor, color); +} + +void CurveEditorMainWindow::on_btnColorTex_clicked() +{ + QString filePath = OpenTextureFile(_colorWidget->getColorTex().isEmpty() ? _lastFilePath : _colorWidget->getColorTex()); + _colorWidget->setColorTex(filePath); + setButtonTex(ui->btnColorTex, !filePath.isEmpty()); + + if (!filePath.isEmpty()) + { + QFileInfo fileInfo(filePath); + _lastFilePath = fileInfo.absoluteDir().absolutePath(); + } +} + +void CurveEditorMainWindow::on_btnColorReload_clicked() +{ + QList<QTreeWidgetItem*> items = ui->treeWidgetColorAttributes->selectedItems(); + if (0 ==items.count()) + return; + + _colorWidget->reloadColorTex(); +} + +void CurveEditorMainWindow::on_btnColorClear_clicked() +{ + _colorWidget->clearColorTex(); + setButtonTex(ui->btnColorTex, false); +} + +void CurveEditorMainWindow::on_btnAlpha_clicked() +{ + int alpha = _colorWidget->getAlpha(); + pickAlpha(alpha, nullptr); + _colorWidget->setAlpha(alpha); + setButtonColor(ui->btnAlpha, QColor(alpha, alpha, alpha)); +} + +void CurveEditorMainWindow::on_btnAlphaTex_clicked() +{ + QString filePath = OpenTextureFile(_colorWidget->getAlphaTex().isEmpty() ? _lastFilePath : _colorWidget->getAlphaTex()); + _colorWidget->setAlphaTex(filePath); + setButtonTex(ui->btnAlphaTex, !filePath.isEmpty()); + + if (!filePath.isEmpty()) + { + QFileInfo fileInfo(filePath); + _lastFilePath = fileInfo.absoluteDir().absolutePath(); + } +} + +void CurveEditorMainWindow::on_btnAlphaReload_clicked() +{ + QList<QTreeWidgetItem*> items = ui->treeWidgetColorAttributes->selectedItems(); + if (0 ==items.count()) + return; + + _colorWidget->reloadAlphaTex(); +} + +void CurveEditorMainWindow::on_btnAlphaClear_clicked() +{ + _colorWidget->clearAlphaTex(); + setButtonTex(ui->btnAlphaTex, false); +} + +void CurveEditorMainWindow::on_checkBoxUseAlphaChannellFromColor_stateChanged(int val) +{ + _colorWidget->setUseAlphaFromColor(0 != val); +} + +void CurveEditorMainWindow::on_treeWidgetCurveAttributes_itemSelectionChanged() +{ + std::vector<CurveAttributeBase*> attributes; + + QList<QTreeWidgetItem*> items = ui->treeWidgetCurveAttributes->selectedItems(); + int count = items.count(); + for (int i = 0; i < items.count(); ++i) + { + CurveAttributeTreeItem* item = static_cast<CurveAttributeTreeItem*>(items.at(i)); + + attributes.push_back(item->_attribute); + + qDebug()<< item->_attribute->getName().c_str(); + } + + _curveWidget->setCurveAttributes(attributes); + + bool canMoveControlPointHorizontally = _canMoveCurveControlPointHorizontally; + bool canAddRemoveControlPoint = _canAddRemoveCurveControlPoint; + bool canChangeTangentType = _canChangeCurveTangentType; + for (size_t i = 0; i < attributes.size(); ++i) + { + CurveAttributeBase* attribute = attributes[i]; + if (eGroupAttr == attribute->getType()) + { + CurveAttributeGroup* attributeGroup = static_cast<CurveAttributeGroup*>(attribute); + for (size_t j = 0; j < attributeGroup->attributes.size(); ++j) + { + CurveAttributeBase* attributeInGroup = attributeGroup->attributes[j]; + + if (attributeInGroup->canMoveControlPointHorizontally()) + canMoveControlPointHorizontally = true; + + if (attributeInGroup->canAddRemoveControlPoint()) + canAddRemoveControlPoint = true; + + if (attributeInGroup->canChangeTangentType()) + canChangeTangentType = true; + } + } + else + { + if (attribute->canMoveControlPointHorizontally()) + canMoveControlPointHorizontally = true; + + if (attribute->canAddRemoveControlPoint()) + canAddRemoveControlPoint = attribute->canAddRemoveControlPoint(); + + if (attribute->canChangeTangentType()) + canChangeTangentType = true; + } + } + + ui->spinBoxLocation->setEnabled(canMoveControlPointHorizontally); + _syncUIStatusWithSelectedAttribute(canAddRemoveControlPoint, canChangeTangentType); +} + +void CurveEditorMainWindow::on_treeWidgetColorAttributes_itemSelectionChanged() +{ + QList<QTreeWidgetItem*> items = ui->treeWidgetColorAttributes->selectedItems(); + if (0 == items.count()) + return; + + ColorAttributeTreeItem* item = static_cast<ColorAttributeTreeItem*>(items.at(0)); + _colorWidget->setColorAttribute(item->_attribute); + _colorWidget->setCanAddRemoveControlPoint(item->_attribute->canAddRemoveControlPoint()); + + _syncUIStatusWithSelectedAttribute(item->_attribute->canAddRemoveControlPoint(), item->_attribute->canChangeTangentType()); +} + +void CurveEditorMainWindow::on_tabWidgetAttributes_currentChanged(int index) +{ + //if (eCurveTab == index) + //{ + // _setCurveExclusiveUIEnable(true); + //} + //else if (eColorTab == index) + //{ + // _setCurveExclusiveUIEnable(false); + //} +} + +void CurveEditorMainWindow::on_sliderColorFallOff_sliderMoved(int value) +{ + if (!_updateUIFromData) + { + _colorWidget->setColorFallOff((float)value/100); + + if (_colorWidget->isLink()) + { + _updateUIFromData = true; + ui->sliderAlphaFallOff->setValue(value); + _updateUIFromData = false; + } + } +} + +void CurveEditorMainWindow::on_sliderAlphaFallOff_sliderMoved(int value) +{ + if (!_updateUIFromData) + { + _colorWidget->setAlphaFallOff((float)value/100); + + if (_colorWidget->isLink()) + { + _updateUIFromData = true; + ui->sliderAlphaFallOff->setValue(value); + _updateUIFromData = false; + } + } +} + +void CurveEditorMainWindow::on_actionAdd_Control_Point_By_Click_triggered(bool val) +{ + _curveWidget->setAddCtrlPntByClick(val); + _curveWidget->setRemoveCtrlPntByClick(false); + + _colorWidget->setAddCtrlPntByClick(val); + _colorWidget->setRemoveCtrlPntByClick(false); +} + +void CurveEditorMainWindow::on_actionRemove_Control_Point_By_Click_triggered(bool val) +{ + _curveWidget->setAddCtrlPntByClick(false); + _curveWidget->setRemoveCtrlPntByClick(val); + + _colorWidget->setAddCtrlPntByClick(false); + _colorWidget->setRemoveCtrlPntByClick(val); +} + +void CurveEditorMainWindow::onCurvePickedControlPointChanged(const std::vector<CurveEntity*>& pickedCurves) +{ + bool enableChangeTangentType = true; + bool enableAddRemoveCtrlPnts = true; + bool enableLoactionEditor = true; + bool locationSameForAllAttributes = true; + bool valueSameForAllAttributes = true; + float location = FLT_MIN, value = FLT_MIN; + _updateUIFromData = true; + ui->spinBoxLocation->setValue(location); + ui->spinBoxValue->setValue(value); + _updateUIFromData = false; + for(size_t i = 0; i < pickedCurves.size(); ++i) + { + CurveEntity* curveEntity = pickedCurves[i]; + std::vector<int>& pickedControlPoints = pickedCurves[i]->getPickedControlPointIndexes(); + const ControlPoint& ctrlPnt = pickedCurves[i]->_curve->getControlPoint(pickedControlPoints[0]); + + if (!curveEntity->_attribute->canMoveControlPointHorizontally()) + enableLoactionEditor = false; + + if (pickedControlPoints.size() > 1) + enableLoactionEditor = false; + + if (location == FLT_MIN) + { + location = ctrlPnt.value.x(); + _updateUIFromData = true; + ui->spinBoxLocation->setValue(location); + _updateUIFromData = false; + } + else if (location != ctrlPnt.value.x()) + locationSameForAllAttributes = false; + + if (value == FLT_MIN) + { + value = ctrlPnt.value.y(); + _updateUIFromData = true; + ui->spinBoxValue->setValue(value); + _updateUIFromData = false; + } + else if (value != ctrlPnt.value.y()) + valueSameForAllAttributes = false; + + if (!curveEntity->_attribute->canChangeTangentType() && pickedControlPoints.size() != 0) + enableChangeTangentType = false; + + if (!curveEntity->_attribute->canAddRemoveControlPoint() && pickedControlPoints.size() != 0) + enableAddRemoveCtrlPnts = false; + + } + + if (pickedCurves.size() > 0) + { + ui->spinBoxLocation->setEnabled(enableLoactionEditor); + + setFocusColor(ui->labelLoacation, locationSameForAllAttributes); + setFocusColor(ui->labelValue, valueSameForAllAttributes); + + _setTangentTypeUIStatus(enableChangeTangentType); + _setAddRemoveCtrlPntUIStatus(enableAddRemoveCtrlPnts); + } + else + { + on_treeWidgetCurveAttributes_itemSelectionChanged(); + } + +} + +void CurveEditorMainWindow::onCurvePickedControlPointValueChanged(QPointF& value) +{ + _updateUIFromData = true; + ui->spinBoxLocation->setValue(value.x()); + ui->spinBoxValue->setValue(value.y()); + _updateUIFromData = false; + + QList<QTreeWidgetItem*> selectedAttributes = ui->treeWidgetCurveAttributes->selectedItems(); + if (selectedAttributes.count() > 0) + { + + } +} + +void CurveEditorMainWindow::_fillCurveAttributesTree() +{ + ui->treeWidgetCurveAttributes->clear(); + + size_t countAttributes = _curveAttributes.size(); + for (size_t i = 0; i < countAttributes; ++i) + { + CurveAttributeBase* attribute = _curveAttributes[i]; + CurveAttributeTreeItem* itemFirstLevel = new CurveAttributeTreeItem(ui->treeWidgetCurveAttributes, attribute); + itemFirstLevel->setText(0, attribute->getName().c_str()); + + if (attribute->getType() == eGroupAttr) + { + CurveAttributeGroup* attributeGroup = static_cast<CurveAttributeGroup*>(attribute); + size_t countAttributesInGroup = attributeGroup->attributes.size(); + for (size_t j = 0; j < countAttributesInGroup; ++j) + { + CurveAttribute* attributeInGroup = static_cast<CurveAttribute*>(attributeGroup->attributes[j]); + CurveAttributeTreeItem* itemSecondLevel = new CurveAttributeTreeItem(itemFirstLevel, attributeInGroup); + itemSecondLevel->setText(0, attributeInGroup->getName().c_str()); + itemSecondLevel->setForeground(0, QBrush(attributeInGroup->color)); + } + } + else + { + CurveAttribute* attributeSecific = static_cast<CurveAttribute*>(attribute); + itemFirstLevel->setForeground(0, QBrush(attributeSecific->color)); + } + } +} + +void CurveEditorMainWindow::_fillColorAttributesTree() +{ + ui->treeWidgetColorAttributes->clear(); + + size_t countAttributes = _colorAttributes.size(); + for (size_t i = 0; i < countAttributes; ++i) + { + ColorAttribute* attribute = _colorAttributes[i]; + ColorAttributeTreeItem* itemFirstLevel = new ColorAttributeTreeItem(ui->treeWidgetColorAttributes, attribute); + itemFirstLevel->setText(0, attribute->getName().c_str()); + } +} + +void CurveEditorMainWindow::_syncUIStatusWithSelectedAttribute(bool canAddRemoveControlPoint, bool canChangeTangentType) +{ + _setAddRemoveCtrlPntUIStatus(canAddRemoveControlPoint); + _setTangentTypeUIStatus(canChangeTangentType); +} + +void CurveEditorMainWindow::_setCurveExclusiveUIEnable(bool enable) +{ + ui->actionSnap_All->setEnabled(enable); + ui->actionSnap_Horizontal->setEnabled(enable); + ui->actionSnap_Vertical->setEnabled(enable); + ui->actionExpand_Horizontally->setEnabled(enable); + ui->actionExpand_Vertically->setEnabled(enable); + ui->actionFrame_Horizontally->setEnabled(enable); + ui->actionFrame_Vertically->setEnabled(enable); + ui->actionFrame_All->setEnabled(enable); + ui->actionContract_Horizontally->setEnabled(enable); + ui->actionContract_Vertically->setEnabled(enable); +} + +void CurveEditorMainWindow::_setColorUIEnable(bool enable) +{ + ui->btnColor->setEnabled(enable); + ui->btnColorTex->setEnabled(enable); + ui->btnColorReload->setEnabled(enable); + ui->btnColorClear->setEnabled(enable); + ui->sliderColorFallOff->setEnabled(enable); +} + +void CurveEditorMainWindow::_setAlphaUIEnable(bool enable) +{ + if (_colorWidget->isLink()) + ui->btnAlpha->setEnabled(true); + else + ui->btnAlpha->setEnabled(enable); + ui->btnAlphaTex->setEnabled(enable); + ui->btnAlphaReload->setEnabled(enable); + ui->btnAlphaClear->setEnabled(enable); + ui->sliderAlphaFallOff->setEnabled(enable); +} + +void CurveEditorMainWindow::onColorPickedControlPointChanged(bool isColorCtrlPnt) +{ + QColor color = _colorWidget->getColor(); + setButtonColor(ui->btnColor, color); + int alpha = _colorWidget->getAlpha(); + setButtonColor(ui->btnAlpha, QColor(alpha, alpha, alpha)); + + QString colorTex = _colorWidget->getColorTex(); + setButtonTex(ui->btnColorTex, !colorTex.isEmpty()); + QString alphaTex = _colorWidget->getAlphaTex(); + setButtonTex(ui->btnAlphaTex, !alphaTex.isEmpty()); + + _updateUIFromData = true; + ui->sliderColorFallOff->setValue(_colorWidget->getColorFallOff() * 100); + ui->sliderAlphaFallOff->setValue(_colorWidget->getAlphaFallOff() * 100); + _setColorUIEnable(isColorCtrlPnt); + _setAlphaUIEnable(!isColorCtrlPnt); + _updateUIFromData = false; +} + +void CurveEditorMainWindow::_saveAttribute(QDomElement& parentElm, CurveAttribute* attribute) +{ + QDomElement newElm = parentElm.ownerDocument().createElement(tr("Attribute")); + parentElm.appendChild(newElm); + newElm.setAttribute(tr("Name"), attribute->getName().c_str()); + newElm.setAttribute(tr("Color"), QString().setNum(attribute->color.rgba(), 16)); + if (!ui->checkBoxResamplePoints->isChecked()) + { + _saveCurve(newElm, attribute->curve); + } + else + { + _saveCurve(newElm, attribute->curve.resampleCurve(ui->spinBoxResamplePoints->value())); + } +} + +void CurveEditorMainWindow::_saveAttribute(QDomElement& parentElm, ColorAttribute* attribute) +{ + QDomElement newElm = parentElm.ownerDocument().createElement(tr("Attribute")); + parentElm.appendChild(newElm); + newElm.setAttribute(tr("Name"), attribute->getName().c_str()); + + _saveCurve(newElm, attribute->colorCurve, tr("ColorCurve")); + if (attribute->alphaCurve.getControlPointCount() > 0) + _saveCurve(newElm, attribute->alphaCurve, tr("AlphaCurve")); +} + +void CurveEditorMainWindow::_saveCurve(QDomElement& parentElm, Curve& curve) +{ + QDomDocument domDoc = parentElm.ownerDocument(); + QDomElement curveElm = domDoc.createElement(tr("Curve")); + parentElm.appendChild(curveElm); + curveElm.setAttribute(tr("MinValueX"), curve.getMinValue().x()); + curveElm.setAttribute(tr("MinValueY"), curve.getMinValue().y()); + curveElm.setAttribute(tr("MaxValueX"), curve.getMaxValue().x()); + curveElm.setAttribute(tr("MaxValueY"), curve.getMaxValue().y()); + + int ctrlPntCount = curve.getControlPointCount(); + for (int i = 0; i < ctrlPntCount; ++i) + { + const ControlPoint& ctrlPnt = curve.getControlPoint(i); + _saveCtrlPnt(curveElm, ctrlPnt); + } +} + +void CurveEditorMainWindow::_saveCurve(QDomElement& parentElm, ColorCurve& curve, const QString& curveName) +{ + QDomDocument domDoc = parentElm.ownerDocument(); + QDomElement curveElm = domDoc.createElement(curveName); + parentElm.appendChild(curveElm); + curveElm.setAttribute(tr("MinValue"), curve.getMinValue()); + curveElm.setAttribute(tr("MaxValue"), curve.getMaxValue()); + + int ctrlPntCount = curve.getControlPointCount(); + for (int i = 0; i < ctrlPntCount; ++i) + { + const ColorControlPoint& ctrlPnt = curve.getControlPoint(i); + _saveCtrlPnt(curveElm, ctrlPnt); + } +} + +void CurveEditorMainWindow::_saveCtrlPnt(QDomElement& parentElm, const ControlPoint& ctrlPnt) +{ + QDomDocument domDoc = parentElm.ownerDocument(); + QDomElement ctrlPntElm = domDoc.createElement(tr("ControlPoint")); + parentElm.appendChild(ctrlPntElm); + + QDomElement valueElm = domDoc.createElement(tr("Value")); + ctrlPntElm.appendChild(valueElm); + valueElm.setAttribute(tr("X"), ctrlPnt.value.x()); + valueElm.setAttribute(tr("Y"), ctrlPnt.value.y()); + + QDomElement modeElm = domDoc.createElement(tr("InterpolateMode")); + ctrlPntElm.appendChild(modeElm); + QDomNode txt = domDoc.createTextNode(InterpolateModeToString(ctrlPnt.mode)); + modeElm.appendChild(txt); + + if (eBezierSpline == ctrlPnt.mode) + { + QDomElement bezierSplineDataElm = domDoc.createElement(tr("BezierSplineData")); + ctrlPntElm.appendChild(bezierSplineDataElm); + + bezierSplineDataElm.setAttribute(tr("InTan"), QString("%0").arg(ctrlPnt.splineData.inTan)); + bezierSplineDataElm.setAttribute(tr("InLen"), QString("%0").arg(ctrlPnt.splineData.inLen)); + bezierSplineDataElm.setAttribute(tr("OutTan"), QString("%0").arg(ctrlPnt.splineData.outTan)); + bezierSplineDataElm.setAttribute(tr("OutLen"), QString("%0").arg(ctrlPnt.splineData.outLen)); + } +} + +void CurveEditorMainWindow::_saveCtrlPnt(QDomElement& parentElm, const ColorControlPoint& ctrlPnt) +{ + QDomDocument domDoc = parentElm.ownerDocument(); + QDomElement ctrlPntElm = domDoc.createElement(tr("ColorControlPoint")); + parentElm.appendChild(ctrlPntElm); + + QDomElement valueElm = domDoc.createElement(tr("Value")); + ctrlPntElm.appendChild(valueElm); + valueElm.setAttribute(tr("X"), ctrlPnt.x); + valueElm.setAttribute(tr("Color"), QString().setNum(ctrlPnt.color.rgba(), 16)); + valueElm.setAttribute(tr("Weight"), ctrlPnt.weight); + valueElm.setAttribute(tr("FallOff"), ctrlPnt.fallOff); + valueElm.setAttribute(tr("TexturePath"), ctrlPnt.texturePath.c_str()); + + QDomElement modeElm = domDoc.createElement(tr("InterpolateMode")); + ctrlPntElm.appendChild(modeElm); + QDomNode txt = domDoc.createTextNode(InterpolateModeToString(ctrlPnt.mode)); + modeElm.appendChild(txt); + + if (eBezierSpline == ctrlPnt.mode) + { + QDomElement bezierSplineDataElm = domDoc.createElement(tr("BezierSplineData")); + ctrlPntElm.appendChild(bezierSplineDataElm); + + bezierSplineDataElm.setAttribute(tr("InTan"), QString("%0").arg(ctrlPnt.splineData.inTan)); + bezierSplineDataElm.setAttribute(tr("InLen"), QString("%0").arg(ctrlPnt.splineData.inLen)); + bezierSplineDataElm.setAttribute(tr("OutTan"), QString("%0").arg(ctrlPnt.splineData.outTan)); + bezierSplineDataElm.setAttribute(tr("OutLen"), QString("%0").arg(ctrlPnt.splineData.outLen)); + } +} + +CurveAttributeBase* CurveEditorMainWindow::_loadAttribute(QDomElement& elm) +{ + QString name = elm.attribute(tr("Name")); + + QDomElement curveElm = elm.firstChildElement(tr("Curve")); + if (!curveElm.isNull()) + { + CurveAttribute* attribute = new CurveAttribute(""); + attribute->_name = name.toStdString(); + //qDebug()<<"attribute Name"<<name<<" Color:"<<elm.attribute(tr("Color")); + attribute->color.setRgba(elm.attribute(tr("Color")).toUInt(0, 16)); + //qDebug()<<"color:::"<<QString().setNum(attrData->color.rgba(), 16); + float minValueX = curveElm.attribute(tr("MinValueX")).toFloat(); + float minValueY = curveElm.attribute(tr("MinValueY")).toFloat(); + float maxValueX = curveElm.attribute(tr("MaxValueX")).toFloat(); + float maxValueY = curveElm.attribute(tr("MaxValueY")).toFloat(); + attribute->curve.initValueRange(QPointF(minValueX, minValueY), QPointF(maxValueX, maxValueY)); + _loadCurve(curveElm, attribute->curve); + + return attribute; + } + else + { + curveElm = elm.firstChildElement(tr("ColorCurve")); + + if (!curveElm.isNull()) + { + ColorAttribute* attribute = new ColorAttribute(""); + attribute->_name = name.toStdString(); + float minValue = curveElm.attribute(tr("MinValue")).toFloat(); + float maxValue = curveElm.attribute(tr("MaxValue")).toFloat(); + attribute->colorCurve.initValueRange(minValue, maxValue); + _loadCurve(curveElm, attribute->colorCurve); + + curveElm = elm.firstChildElement(tr("AlphaCurve")); + minValue = curveElm.attribute(tr("MinValue")).toFloat(); + maxValue = curveElm.attribute(tr("MaxValue")).toFloat(); + attribute->alphaCurve.initValueRange(minValue, maxValue); + _loadCurve(curveElm, attribute->alphaCurve); + return attribute; + } + } + + return nullptr; +} + +void CurveEditorMainWindow::_loadCurve(QDomElement& elm, Curve& curve) +{ + QDomNodeList nodeList = elm.elementsByTagName(tr("ControlPoint")); + for (int i = 0; i < nodeList.count(); ++i) + { + QDomElement ctrlElm = nodeList.at(i).toElement(); + + ControlPoint ctrlPnt; + if (!ctrlElm.isNull()) + { + _loadCtrlPnt(ctrlElm, ctrlPnt); + curve.appendControlPoint(ctrlPnt, false); + } + } +} + +void CurveEditorMainWindow::_loadCurve(QDomElement& elm, ColorCurve& curve) +{ + QDomNodeList nodeList = elm.elementsByTagName(tr("ColorControlPoint")); + for (int i = 0; i < nodeList.count(); ++i) + { + QDomElement ctrlElm = nodeList.at(i).toElement(); + + ColorControlPoint ctrlPnt; + if (!ctrlElm.isNull()) + { + _loadCtrlPnt(ctrlElm, ctrlPnt); + curve.appendControlPoint(ctrlPnt, false); + } + } +} + +void CurveEditorMainWindow::_loadCtrlPnt(QDomElement& elm, ControlPoint& ctrlPnt) +{ + QDomElement valueElm = elm.firstChildElement(tr("Value")); + ctrlPnt.value.setX(valueElm.attribute(tr("X")).toFloat()); + ctrlPnt.value.setY(valueElm.attribute(tr("Y")).toFloat()); + + QDomElement modeElm = elm.firstChildElement(tr("InterpolateMode")); + + ctrlPnt.mode = StringToInterpolateMode(modeElm.text()); + + if (eBezierSpline == ctrlPnt.mode) + { + QDomElement bezierElm = elm.firstChildElement(tr("BezierSplineData")); + + ctrlPnt.splineData.inTan = bezierElm.attribute(tr("InTan")).toFloat(); + ctrlPnt.splineData.inLen = bezierElm.attribute(tr("InLen")).toFloat(); + ctrlPnt.splineData.outTan = bezierElm.attribute(tr("OutTan")).toFloat(); + ctrlPnt.splineData.outLen = bezierElm.attribute(tr("OutLen")).toFloat(); + } +} + +void CurveEditorMainWindow::_loadCtrlPnt(QDomElement& elm, ColorControlPoint& ctrlPnt) +{ + QDomElement valueElm = elm.firstChildElement(tr("Value")); + ctrlPnt.x = valueElm.attribute(tr("X")).toFloat(); + ctrlPnt.color.setRgba(valueElm.attribute(tr("Color")).toUInt(0, 16)); + ctrlPnt.weight = valueElm.attribute(tr("Weight")).toFloat(); + ctrlPnt.fallOff = valueElm.attribute(tr("FallOff")).toFloat(); + ctrlPnt.weight = valueElm.attribute(tr("Weight")).toFloat(); + ctrlPnt.texturePath = valueElm.attribute(tr("TexturePath")).toStdString(); + + QDomElement modeElm = elm.firstChildElement(tr("InterpolateMode")); + + ctrlPnt.mode = StringToInterpolateMode(modeElm.text()); + + if (eBezierSpline == ctrlPnt.mode) + { + QDomElement bezierElm = elm.firstChildElement(tr("BezierSplineData")); + + ctrlPnt.splineData.inTan = bezierElm.attribute(tr("InTan")).toFloat(); + ctrlPnt.splineData.inLen = bezierElm.attribute(tr("InLen")).toFloat(); + ctrlPnt.splineData.outTan = bezierElm.attribute(tr("OutTan")).toFloat(); + ctrlPnt.splineData.outLen = bezierElm.attribute(tr("OutLen")).toFloat(); + } +} + +void CurveEditorMainWindow::_setTangentTypeUIStatus(bool enable) +{ + ui->actionTangent_Stepped->setEnabled(enable); + ui->actionTangent_Linear->setEnabled(enable); + ui->actionTangent_Smooth->setEnabled(enable); + ui->actionTangent_Ease_Out->setEnabled(enable); + ui->actionTangent_Ease_In->setEnabled(enable); + ui->actionTangent_Spline->setEnabled(enable); +} + +void CurveEditorMainWindow::_setAddRemoveCtrlPntUIStatus(bool enable) +{ + ui->actionAdd_Before_Selected->setEnabled(enable); + ui->actionAdd_After_Selected->setEnabled(enable); + ui->actionRemove_Selected->setEnabled(enable); + ui->actionAdd_Control_Point_By_Click->setEnabled(enable); + ui->actionRemove_Control_Point_By_Click->setEnabled(enable); +} + +} // namespace CurveEditor +} // namespace nvidia
\ No newline at end of file |