Changed: #1193 If switch between the force properties in a workspace erroneously marked that the particle system has been changed.

This commit is contained in:
timon 2010-11-22 22:50:05 +02:00
parent 74d5adb2bb
commit 6a657037b1
10 changed files with 161 additions and 226 deletions

View file

@ -84,7 +84,6 @@ Using this widget you can set the color(RGBA) using the four sliders or through
CDirectionWidget CDirectionWidget
</b><br> </b><br>
This widget helps to choose from several preset directions, or to choose a custom one. This widget helps to choose from several preset directions, or to choose a custom one.
To use it you have to create a wrapper.
<br><br> <br><br>
<img src="cdirection_widget.png" alt="CDirectionWidget"> <img src="cdirection_widget.png" alt="CDirectionWidget">
@see @see

View file

@ -25,12 +25,11 @@
// NeL includes // NeL includes
#include <nel/misc/vector.h> #include <nel/misc/vector.h>
#include <nel/3d/particle_system.h>
namespace NLQT { namespace NLQT {
CDirectionWidget::CDirectionWidget(QWidget *parent) CDirectionWidget::CDirectionWidget(QWidget *parent)
: QWidget(parent), _Wrapper(NULL), _DirectionWrapper(NULL), _globalName("") : QWidget(parent), _globalName("")
{ {
_ui.setupUi(this); _ui.setupUi(this);
@ -59,31 +58,10 @@ CDirectionWidget::~CDirectionWidget()
{ {
} }
void CDirectionWidget::enableGlobalVariable() void CDirectionWidget::enabledGlobalVariable(bool enabled)
{ {
_ui.globalPushButton->setVisible(true); _ui.globalPushButton->setVisible(enabled);
_globalName = ""; setGlobalName("", false);
}
void CDirectionWidget::setWrapper(IPSWrapper<NLMISC::CVector> *wrapper)
{
_Wrapper = wrapper;
_ui.globalPushButton->hide();
}
void CDirectionWidget::setDirectionWrapper(NL3D::CPSDirection *wrapper)
{
_DirectionWrapper = wrapper;
if (_DirectionWrapper && _DirectionWrapper->supportGlobalVectorValue())
_ui.globalPushButton->show();
else
_ui.globalPushButton->hide();
}
void CDirectionWidget::updateUi()
{
setValue(_Wrapper->get(), false);
checkEnabledGlobalDirection();
} }
void CDirectionWidget::setValue(const NLMISC::CVector &value, bool emit) void CDirectionWidget::setValue(const NLMISC::CVector &value, bool emit)
@ -97,8 +75,6 @@ void CDirectionWidget::setValue(const NLMISC::CVector &value, bool emit)
if (emit) if (emit)
{ {
Q_EMIT valueChanged(_value); Q_EMIT valueChanged(_value);
if (_Wrapper)
_Wrapper->setAndUpdateModifiedFlag(_value);
} }
} }
@ -122,24 +98,13 @@ void CDirectionWidget::setGlobalName(const QString &globalName, bool emit)
void CDirectionWidget::setGlobalDirection() void CDirectionWidget::setGlobalDirection()
{ {
nlassert(_DirectionWrapper);
bool ok; bool ok;
QString text = QInputDialog::getText(this, tr("Enter Name"), QString text = QInputDialog::getText(this, tr("Enter Name"),
"", QLineEdit::Normal, "", QLineEdit::Normal,
QString(_DirectionWrapper->getGlobalVectorValueName().c_str()), &ok); QString(_globalName), &ok);
if (ok) if (ok)
{
setGlobalName(text); setGlobalName(text);
_DirectionWrapper->enableGlobalVectorValue(text.toStdString());
if (!_globalName.isEmpty())
{
// take a non NULL value for the direction
NL3D::CParticleSystem::setGlobalVectorValue(text.toStdString(), NLMISC::CVector::I);
}
}
} }
void CDirectionWidget::incVecI() void CDirectionWidget::incVecI()
@ -175,11 +140,7 @@ void CDirectionWidget::decVecK()
void CDirectionWidget::setNewVecXZ(float x, float y) void CDirectionWidget::setNewVecXZ(float x, float y)
{ {
const float epsilon = 10E-3f; const float epsilon = 10E-3f;
NLMISC::CVector v; NLMISC::CVector v = _value;
if (_Wrapper)
v = _Wrapper->get();
else
v = _value;
v.x = x; v.x = x;
v.z = y; v.z = y;
@ -202,11 +163,7 @@ void CDirectionWidget::setNewVecXZ(float x, float y)
void CDirectionWidget::setNewVecYZ(float x, float y) void CDirectionWidget::setNewVecYZ(float x, float y)
{ {
const float epsilon = 10E-3f; const float epsilon = 10E-3f;
NLMISC::CVector v; NLMISC::CVector v = _value;
if (_Wrapper)
v = _Wrapper->get();
else
v = _value;
v.y = x; v.y = x;
v.z = y; v.z = y;
@ -226,23 +183,4 @@ void CDirectionWidget::setNewVecYZ(float x, float y)
setValue(v); setValue(v);
} }
void CDirectionWidget::checkEnabledGlobalDirection()
{
bool enableUserDirection = true;
_ui.xzWidget->show();
_ui.yzWidget->show();
if (_DirectionWrapper && _DirectionWrapper->supportGlobalVectorValue() && !_DirectionWrapper->getGlobalVectorValueName().empty())
{
enableUserDirection = false;
_ui.xzWidget->hide();
_ui.yzWidget->hide();
}
_ui.incVecIPushButton->setEnabled(enableUserDirection);
_ui.incVecJPushButton->setEnabled(enableUserDirection);
_ui.incVecKPushButton->setEnabled(enableUserDirection);
_ui.decVecIPushButton->setEnabled(enableUserDirection);
_ui.decVecJPushButton->setEnabled(enableUserDirection);
_ui.decVecKPushButton->setEnabled(enableUserDirection);
}
} /* namespace NLQT */ } /* namespace NLQT */

View file

@ -28,7 +28,6 @@
#include <nel/3d/ps_direction.h> #include <nel/3d/ps_direction.h>
// Project includes // Project includes
#include "ps_wrapper.h"
namespace NLQT { namespace NLQT {
@ -45,13 +44,7 @@ public:
CDirectionWidget(QWidget *parent = 0); CDirectionWidget(QWidget *parent = 0);
~CDirectionWidget(); ~CDirectionWidget();
void enableGlobalVariable(); void enabledGlobalVariable(bool enabled);
void setWrapper(IPSWrapper<NLMISC::CVector> *wrapper);
/// The CPSDirection object is used to see if a global variable can be bound to the direction.
/// When set to NULL it has no effect (the default)
void setDirectionWrapper(NL3D::CPSDirection *wrapper);
void updateUi();
Q_SIGNALS: Q_SIGNALS:
void valueChanged(const NLMISC::CVector &value); void valueChanged(const NLMISC::CVector &value);
@ -73,10 +66,6 @@ private Q_SLOTS:
void setNewVecYZ(float x, float y); void setNewVecYZ(float x, float y);
private: private:
void checkEnabledGlobalDirection();
IPSWrapper<NLMISC::CVector> *_Wrapper ;
NL3D::CPSDirection *_DirectionWrapper;
NLMISC::CVector _value; NLMISC::CVector _value;
QString _globalName; QString _globalName;

View file

@ -280,17 +280,20 @@ void CEmitterPage::setDirectionMode(int index)
void CEmitterPage::setSpeedInheritanceFactor(float value) void CEmitterPage::setSpeedInheritanceFactor(float value)
{ {
_Emitter->setSpeedInheritanceFactor(value); _Emitter->setSpeedInheritanceFactor(value);
updateModifiedFlag();
} }
void CEmitterPage::setConicEmitterRadius(float value) void CEmitterPage::setConicEmitterRadius(float value)
{ {
dynamic_cast<NL3D::CPSEmitterConic *>(_Emitter)->setRadius(value); dynamic_cast<NL3D::CPSEmitterConic *>(_Emitter)->setRadius(value);
updateModifiedFlag();
} }
void CEmitterPage::setEmitDelay(float value) void CEmitterPage::setEmitDelay(float value)
{ {
_Emitter->setEmitDelay(value); _Emitter->setEmitDelay(value);
Modules::psEdit().resetAutoCount(_Node); Modules::psEdit().resetAutoCount(_Node);
updateModifiedFlag();
} }
void CEmitterPage::setMaxEmissionCount(uint32 value) void CEmitterPage::setMaxEmissionCount(uint32 value)
@ -304,6 +307,7 @@ void CEmitterPage::setMaxEmissionCount(uint32 value)
QMessageBox::Ok); QMessageBox::Ok);
_ui.maxEmissionCountWidget->setValue((uint32)_Emitter->getMaxEmissionCount(), false); _ui.maxEmissionCountWidget->setValue((uint32)_Emitter->getMaxEmissionCount(), false);
updateModifiedFlag();
} }
Modules::psEdit().resetAutoCount(_Node); Modules::psEdit().resetAutoCount(_Node);
} }
@ -311,6 +315,7 @@ void CEmitterPage::setMaxEmissionCount(uint32 value)
void CEmitterPage::setDir(const NLMISC::CVector &value) void CEmitterPage::setDir(const NLMISC::CVector &value)
{ {
dynamic_cast<NL3D::CPSDirection *>(_Emitter)->setDir(value); dynamic_cast<NL3D::CPSDirection *>(_Emitter)->setDir(value);
updateModifiedFlag();
} }
void CEmitterPage::updatePeriodWidget() void CEmitterPage::updatePeriodWidget()

View file

@ -41,18 +41,17 @@ CForcePage::CForcePage(QWidget *parent)
_ui.forceIntensityWidget->init(); _ui.forceIntensityWidget->init();
_ui.parametricFactorWidget->setRange(0.0, 64.0); _ui.parametricFactorWidget->setRange(0.0, 64.0);
_ui.parametricFactorWidget->setWrapper(&_ParamFactorWrapper);
_ui.radialViscosityWidget->setRange(0.0, 1.0); _ui.radialViscosityWidget->setRange(0.0, 1.0);
_ui.radialViscosityWidget->setWrapper(&_RadialViscosityWrapper);
_ui.tangentialViscosityWidget->setRange(0, 1); _ui.tangentialViscosityWidget->setRange(0, 1);
_ui.tangentialViscosityWidget->setWrapper(&_TangentialViscosityWrapper);
_ui.directionWidget->setWrapper(&_DirectionWrapper);
connect(_ui.toTargetsPushButton, SIGNAL(clicked()), this, SLOT(addTarget())); connect(_ui.toTargetsPushButton, SIGNAL(clicked()), this, SLOT(addTarget()));
connect(_ui.toAvaibleTargetsPushButton, SIGNAL(clicked()), this, SLOT(removeTarget())); connect(_ui.toAvaibleTargetsPushButton, SIGNAL(clicked()), this, SLOT(removeTarget()));
connect(_ui.parametricFactorWidget, SIGNAL(valueChanged(float)), this, SLOT(setFactorBrownianForce(float)));
connect(_ui.radialViscosityWidget, SIGNAL(valueChanged(float)), this, SLOT(setRadialViscosity(float)));
connect(_ui.tangentialViscosityWidget, SIGNAL(valueChanged(float)), this, SLOT(setTangentialViscosity(float)));
connect(_ui.directionWidget, SIGNAL(valueChanged(NLMISC::CVector)), this, SLOT(setDir(NLMISC::CVector)));
connect(_ui.directionWidget, SIGNAL(globalNameChanged(QString)), this, SLOT(setGlobalName(QString)));
} }
CForcePage::~CForcePage() CForcePage::~CForcePage()
@ -61,10 +60,11 @@ CForcePage::~CForcePage()
void CForcePage::setEditedItem(CWorkspaceNode *ownerNode, NL3D::CPSLocatedBindable *locatedBindable) void CForcePage::setEditedItem(CWorkspaceNode *ownerNode, NL3D::CPSLocatedBindable *locatedBindable)
{ {
hideWrappersWidget(); nlassert(locatedBindable);
hideAdditionalWidget();
_Node = ownerNode; _Node = ownerNode;
_LBTarget = static_cast<NL3D::CPSTargetLocatedBindable *>(locatedBindable); _LBTarget = static_cast<NL3D::CPSTargetLocatedBindable *>(locatedBindable);
updateTargets(); updateTargets();
// force with intensity case // force with intensity case
@ -77,41 +77,33 @@ void CForcePage::setEditedItem(CWorkspaceNode *ownerNode, NL3D::CPSLocatedBindab
} }
// vortex (to tune viscosity) // vortex (to tune viscosity)
if (dynamic_cast<NL3D::CPSCylindricVortex *>(_LBTarget)) NL3D::CPSCylindricVortex *cylindricVortex = dynamic_cast<NL3D::CPSCylindricVortex *>(_LBTarget);
if (cylindricVortex)
{ {
_RadialViscosityWrapper.OwnerNode = _Node; _ui.radialViscosityWidget->setValue(cylindricVortex->getRadialViscosity(), false);
_RadialViscosityWrapper.V = dynamic_cast<NL3D::CPSCylindricVortex *>(_LBTarget);
_ui.radialViscosityWidget->updateUi();
_ui.radialViscosityLabel->show(); _ui.radialViscosityLabel->show();
_ui.radialViscosityWidget->show(); _ui.radialViscosityWidget->show();
_TangentialViscosityWrapper.OwnerNode = _Node; _ui.tangentialViscosityWidget->setValue(cylindricVortex->getTangentialViscosity(), false);
_TangentialViscosityWrapper.V = dynamic_cast<NL3D::CPSCylindricVortex *>(_LBTarget);
_ui.tangentialViscosityWidget->updateUi();
_ui.tangentialViscosityLabel->show(); _ui.tangentialViscosityLabel->show();
_ui.tangentialViscosityWidget->show(); _ui.tangentialViscosityWidget->show();
} }
// deals with emitters that have a direction // deals with emitters that have a direction
if (dynamic_cast<NL3D::CPSDirection *>(_LBTarget)) NL3D::CPSDirection *direction = dynamic_cast<NL3D::CPSDirection *>(_LBTarget);
if (direction)
{ {
_DirectionWrapper.OwnerNode = _Node; _ui.directionWidget->setValue(direction->getDir(), false);
_DirectionWrapper.E = dynamic_cast<NL3D::CPSDirection *>(_LBTarget); _ui.directionWidget->enabledGlobalVariable(direction->supportGlobalVectorValue());
_ui.directionWidget->setDirectionWrapper(dynamic_cast<NL3D::CPSDirection *>(_LBTarget)); _ui.directionWidget->setGlobalName(QString(direction->getGlobalVectorValueName().c_str()), false);
_ui.directionWidget->updateUi();
_ui.directionWidget->show(); _ui.directionWidget->show();
} }
// Brownian (to tune parametric factor) // Brownian (to tune parametric factor)
if (dynamic_cast<NL3D::CPSBrownianForce *>(_LBTarget)) NL3D::CPSBrownianForce *brownianForce = dynamic_cast<NL3D::CPSBrownianForce *>(_LBTarget);
if (brownianForce)
{ {
_ParamFactorWrapper.OwnerNode = _Node; _ui.parametricFactorWidget->setValue(brownianForce->getParametricFactor(), false);
_ParamFactorWrapper.F = static_cast<NL3D::CPSBrownianForce *>(_LBTarget);
_ui.parametricFactorWidget->updateUi();
_ui.parametricFactorLabel->show(); _ui.parametricFactorLabel->show();
_ui.parametricFactorWidget->show(); _ui.parametricFactorWidget->show();
} }
@ -168,8 +160,47 @@ void CForcePage::removeTarget()
_ui.avaibleTargetsListWidget->addItem(item); _ui.avaibleTargetsListWidget->addItem(item);
updateModifiedFlag(); updateModifiedFlag();
} }
void CForcePage::setRadialViscosity(float value)
{
nlassert(_LBTarget);
dynamic_cast<NL3D::CPSCylindricVortex *>(_LBTarget)->setRadialViscosity(value);
updateModifiedFlag();
}
void CForcePage::hideWrappersWidget() void CForcePage::setTangentialViscosity(float value)
{
nlassert(_LBTarget);
dynamic_cast<NL3D::CPSCylindricVortex *>(_LBTarget)->setTangentialViscosity(value);
updateModifiedFlag();
}
void CForcePage::setDir(const NLMISC::CVector &value)
{
nlassert(_LBTarget);
dynamic_cast<NL3D::CPSDirection *>(_LBTarget)->setDir(value);
updateModifiedFlag();
}
void CForcePage::setGlobalName(const QString &globalName)
{
nlassert(_LBTarget);
dynamic_cast<NL3D::CPSDirection *>(_LBTarget)->enableGlobalVectorValue(globalName.toStdString());
if (!globalName.isEmpty())
{
// take a non NULL value for the direction
NL3D::CParticleSystem::setGlobalVectorValue(globalName.toStdString(), NLMISC::CVector::I);
}
updateModifiedFlag();
}
void CForcePage::setFactorBrownianForce(float value)
{
nlassert(_LBTarget);
dynamic_cast<NL3D::CPSBrownianForce *>(_LBTarget)->setParametricFactor(value);
updateModifiedFlag();
}
void CForcePage::hideAdditionalWidget()
{ {
_ui.directionWidget->hide(); _ui.directionWidget->hide();
_ui.parametricFactorLabel->hide(); _ui.parametricFactorLabel->hide();
@ -182,6 +213,7 @@ void CForcePage::hideWrappersWidget()
void CForcePage::updateTargets() void CForcePage::updateTargets()
{ {
nlassert(_LBTarget);
uint k; uint k;
uint nbTarg = _LBTarget->getNbTargets(); uint nbTarg = _LBTarget->getNbTargets();

View file

@ -71,7 +71,13 @@ public:
private Q_SLOTS: private Q_SLOTS:
void addTarget(); void addTarget();
void removeTarget(); void removeTarget();
void setRadialViscosity(float value);
void setTangentialViscosity(float value);
void setDir(const NLMISC::CVector &value);
void setGlobalName(const QString &globalName);
void setFactorBrownianForce(float value);
private: private:
/// wrapper to tune the intensity of a force /// wrapper to tune the intensity of a force
@ -84,40 +90,7 @@ private:
void setScheme(scheme_type *s) {F->setIntensityScheme(s); } void setScheme(scheme_type *s) {F->setIntensityScheme(s); }
} _ForceIntensityWrapper; } _ForceIntensityWrapper;
/// wrapper to tune the radial viscosity for vortices void hideAdditionalWidget();
struct CRadialViscosityWrapper : public IPSWrapperFloat
{
NL3D::CPSCylindricVortex *V;
float get(void) const { return V->getRadialViscosity(); }
void set(const float &value) { V->setRadialViscosity(value); }
} _RadialViscosityWrapper;
/// wrapper to tune the tangential viscosity for vortices
struct CTangentialViscosityWrapper : public IPSWrapperFloat
{
NL3D::CPSCylindricVortex *V;
float get(void) const { return V->getTangentialViscosity(); }
void set(const float &value) { V->setTangentialViscosity(value); }
} _TangentialViscosityWrapper;
/// wrappers to tune the direction
struct CDirectionWrapper : public IPSWrapper<NLMISC::CVector>
{
NL3D::CPSDirection *E;
NLMISC::CVector get(void) const { return E->getDir(); }
void set(const NLMISC::CVector &d){ E->setDir(d); }
} _DirectionWrapper;
/// wrappers to tune the parametric factor of brownian force
struct CParamFactorWrapper : public IPSWrapperFloat
{
NL3D::CPSBrownianForce *F;
float get(void) const { return F->getParametricFactor(); }
void set(const float &f){ F->setParametricFactor(f); }
} _ParamFactorWrapper;
void hideWrappersWidget();
void updateTargets(); void updateTargets();

View file

@ -48,12 +48,14 @@ CPSMoverPage::CPSMoverPage(QWidget *parent)
_ui.scaleZWidget->setRange(0.f, 4.f); _ui.scaleZWidget->setRange(0.f, 4.f);
_ui.scaleZWidget->setWrapper(&_ZScaleWrapper); _ui.scaleZWidget->setWrapper(&_ZScaleWrapper);
_ui.directionWidget->setWrapper(&_DirectionWrapper); //_ui.directionWidget->setWrapper(&_DirectionWrapper);
connect(_ui.xDoubleSpinBox, SIGNAL(valueChanged(double)), this, SLOT(setXPosition(double))); connect(_ui.xDoubleSpinBox, SIGNAL(valueChanged(double)), this, SLOT(setXPosition(double)));
connect(_ui.yDoubleSpinBox, SIGNAL(valueChanged(double)), this, SLOT(setYPosition(double))); connect(_ui.yDoubleSpinBox, SIGNAL(valueChanged(double)), this, SLOT(setYPosition(double)));
connect(_ui.zDoubleSpinBox, SIGNAL(valueChanged(double)), this, SLOT(setZPosition(double))); connect(_ui.zDoubleSpinBox, SIGNAL(valueChanged(double)), this, SLOT(setZPosition(double)));
connect(_ui.directionWidget, SIGNAL(valueChanged(NLMISC::CVector)), this, SLOT(setDir(NLMISC::CVector)));
connect(_ui.listWidget, SIGNAL(currentItemChanged(QListWidgetItem*,QListWidgetItem*)), connect(_ui.listWidget, SIGNAL(currentItemChanged(QListWidgetItem*,QListWidgetItem*)),
this, SLOT(changeSubComponent())); this, SLOT(changeSubComponent()));
} }
@ -71,7 +73,7 @@ void CPSMoverPage::setEditedItem(CWorkspaceNode *ownerNode, NL3D::CPSLocated *lo
updatePosition(); updatePosition();
_ui.listWidget->clear(); _ui.listWidget->clear();
hideWrappersWidget(); hideAdditionalWidget();
uint numBound = _EditedLocated->getNbBoundObjects(); uint numBound = _EditedLocated->getNbBoundObjects();
@ -101,7 +103,7 @@ void CPSMoverPage::updatePosition(void)
} }
void CPSMoverPage::hideWrappersWidget() void CPSMoverPage::hideAdditionalWidget()
{ {
_ui.scaleLabel->hide(); _ui.scaleLabel->hide();
_ui.scaleXLabel->hide(); _ui.scaleXLabel->hide();
@ -162,7 +164,7 @@ void CPSMoverPage::setZPosition(double value)
void CPSMoverPage::changeSubComponent() void CPSMoverPage::changeSubComponent()
{ {
hideWrappersWidget(); hideAdditionalWidget();
NL3D::IPSMover *m = getMoverInterface(); NL3D::IPSMover *m = getMoverInterface();
if (!m) return; if (!m) return;
@ -213,15 +215,17 @@ void CPSMoverPage::changeSubComponent()
if (m->onlyStoreNormal()) if (m->onlyStoreNormal())
{ {
_DirectionWrapper.OwnerNode = _Node; _ui.directionWidget->setValue(getMoverInterface()->getNormal(getLocatedIndex()), false);
_DirectionWrapper.M = m;
_DirectionWrapper.Index = _EditedLocatedIndex;
_ui.directionWidget->updateUi();
_ui.directionWidget->show(); _ui.directionWidget->show();
} }
} }
void CPSMoverPage::setDir(const NLMISC::CVector &value)
{
getMoverInterface()->setNormal(getLocatedIndex(), value);
updateModifiedFlag();
}
NL3D::IPSMover *CPSMoverPage::getMoverInterface(void) NL3D::IPSMover *CPSMoverPage::getMoverInterface(void)
{ {
nlassert(_EditedLocated); nlassert(_EditedLocated);

View file

@ -92,6 +92,8 @@ private Q_SLOTS:
void setZPosition(double value); void setZPosition(double value);
void changeSubComponent(); void changeSubComponent();
void setDir(const NLMISC::CVector &value);
private: private:
/// wrappers to scale objects /// wrappers to scale objects
@ -142,19 +144,10 @@ private:
} }
} _ZScaleWrapper ; } _ZScaleWrapper ;
/// wrapper for direction void hideAdditionalWidget();
struct CDirectionWrapper : public IPSWrapper<NLMISC::CVector>
{
uint32 Index ;
NL3D::IPSMover *M ;
NLMISC::CVector get(void) const { return M->getNormal(Index) ; }
void set(const NLMISC::CVector &v) { M->setNormal(Index, v) ; }
} _DirectionWrapper ;
void hideWrappersWidget();
void updateModifiedFlag() { if (_Node) _Node->setModified(true); }
/// update the mouse listener position when the user entered a value with the keyboard /// update the mouse listener position when the user entered a value with the keyboard
void updateListener(void) ; void updateListener(void) ;

View file

@ -1,19 +1,19 @@
/* /*
Object Viewer Qt Object Viewer Qt
Copyright (C) 2010 Dzmitry Kamiahin <dnk-88@tut.by> Copyright (C) 2010 Dzmitry Kamiahin <dnk-88@tut.by>
This program is free software: you can redistribute it and/or modify This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or the Free Software Foundation, either version 3 of the License, or
(at your option) any later version. (at your option) any later version.
This program is distributed in the hope that it will be useful, This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details. GNU General Public License for more details.
You should have received a copy of the GNU General Public License You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>. along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
@ -21,48 +21,59 @@
#include "spinner_dialog.h" #include "spinner_dialog.h"
namespace NLQT { namespace NLQT {
CSpinnerDialog::CSpinnerDialog(NL3D::CPSBasisSpinner *sf, CWorkspaceNode *ownerNode, QWidget *parent) CSpinnerDialog::CSpinnerDialog(NL3D::CPSBasisSpinner *sf, CWorkspaceNode *ownerNode, QWidget *parent)
: QDialog(parent) : QDialog(parent), _Node(ownerNode), _BasicSpinner(sf)
{ {
_verticalLayout = new QVBoxLayout(this); nlassert(_BasicSpinner);
_nbSamplesLabel = new QLabel(this);
_verticalLayout->addWidget(_nbSamplesLabel);
_nbSamplesWidget = new NLQT::CEditRangeUIntWidget(this); _verticalLayout = new QVBoxLayout(this);
QSizePolicy sizePolicy(QSizePolicy::Preferred, QSizePolicy::Expanding); _nbSamplesLabel = new QLabel(this);
sizePolicy.setHorizontalStretch(0); _verticalLayout->addWidget(_nbSamplesLabel);
sizePolicy.setVerticalStretch(0);
sizePolicy.setHeightForWidth(_nbSamplesWidget->sizePolicy().hasHeightForWidth()); _nbSamplesWidget = new NLQT::CEditRangeUIntWidget(this);
_nbSamplesWidget->setSizePolicy(sizePolicy); QSizePolicy sizePolicy(QSizePolicy::Preferred, QSizePolicy::Expanding);
_verticalLayout->addWidget(_nbSamplesWidget); sizePolicy.setHorizontalStretch(0);
sizePolicy.setVerticalStretch(0);
sizePolicy.setHeightForWidth(_nbSamplesWidget->sizePolicy().hasHeightForWidth());
_nbSamplesWidget->setSizePolicy(sizePolicy);
_verticalLayout->addWidget(_nbSamplesWidget);
_dirWidget = new NLQT::CDirectionWidget(this);
sizePolicy.setHeightForWidth(_dirWidget->sizePolicy().hasHeightForWidth());
_dirWidget->setSizePolicy(sizePolicy);
_verticalLayout->addWidget(_dirWidget);
_dirWidget = new NLQT::CDirectionWidget(this);
sizePolicy.setHeightForWidth(_dirWidget->sizePolicy().hasHeightForWidth());
_dirWidget->setSizePolicy(sizePolicy);
_verticalLayout->addWidget(_dirWidget);
setWindowTitle(tr("Edit spinner")); setWindowTitle(tr("Edit spinner"));
_nbSamplesLabel->setText(tr("Nb samples:"));
_AxisWrapper.OwnerNode = ownerNode;
_NbSampleWrapper.OwnerNode = ownerNode;
_NbSampleWrapper.S = sf;
_AxisWrapper.S = sf;
_nbSamplesLabel->setText(tr("Nb samples:"));
_nbSamplesWidget->setRange(1, 512); _nbSamplesWidget->setRange(1, 512);
_nbSamplesWidget->setWrapper(&_NbSampleWrapper);
_nbSamplesWidget->enableLowerBound(0, true); _nbSamplesWidget->enableLowerBound(0, true);
_nbSamplesWidget->updateUi(); _nbSamplesWidget->setValue(_BasicSpinner->_F.getNumSamples(), false);
_dirWidget->setValue(_BasicSpinner->_F.getAxis());
_dirWidget->setWrapper(&_AxisWrapper);
_dirWidget->updateUi();
setFixedHeight(sizeHint().height()); setFixedHeight(sizeHint().height());
connect(_nbSamplesWidget, SIGNAL(valueChanged(uint32)), this, SLOT(setNumSamples(uint32)));
connect(_dirWidget, SIGNAL(valueChanged(NLMISC::CVector)), this, SLOT(setAxis(NLMISC::CVector)));
} }
CSpinnerDialog::~CSpinnerDialog() CSpinnerDialog::~CSpinnerDialog()
{ {
} }
void CSpinnerDialog::setNumSamples(uint32 value)
{
nlassert(_BasicSpinner);
_BasicSpinner->_F.setNumSamples(value);
updateModifiedFlag();
}
void CSpinnerDialog::setAxis(const NLMISC::CVector &axis)
{
nlassert(_BasicSpinner);
_BasicSpinner->_F.setAxis(axis);
updateModifiedFlag();
}
} /* namespace NLQT */ } /* namespace NLQT */

View file

@ -43,29 +43,20 @@ public:
CSpinnerDialog(NL3D::CPSBasisSpinner *sf, CWorkspaceNode *ownerNode, QWidget *parent = 0); CSpinnerDialog(NL3D::CPSBasisSpinner *sf, CWorkspaceNode *ownerNode, QWidget *parent = 0);
~CSpinnerDialog(); ~CSpinnerDialog();
private Q_SLOTS:
void setNumSamples(uint32 value);
void setAxis(const NLMISC::CVector &axis);
protected: protected:
void updateModifiedFlag() { if (_Node) _Node->setModified(true); }
/// Wrapper to set the number of samples in the spinner
struct CNbSampleWrapper : public IPSWrapperUInt
{
NL3D::CPSBasisSpinner *S;
uint32 get(void) const { return S->_F.getNumSamples(); }
void set(const uint32 &val) { S->_F.setNumSamples(val); }
} _NbSampleWrapper;
/// Wrapper to set the axis of the spinner
struct CAxisWrapper : public IPSWrapper<NLMISC::CVector>
{
NL3D::CPSBasisSpinner *S;
NLMISC::CVector get(void) const { return S->_F.getAxis(); }
void set(const NLMISC::CVector &axis) { S->_F.setAxis(axis); }
} _AxisWrapper;
QLabel *_nbSamplesLabel; QLabel *_nbSamplesLabel;
QVBoxLayout *_verticalLayout; QVBoxLayout *_verticalLayout;
CEditRangeUIntWidget *_nbSamplesWidget; CEditRangeUIntWidget *_nbSamplesWidget;
CDirectionWidget *_dirWidget; CDirectionWidget *_dirWidget;
CWorkspaceNode *_Node;
NL3D::CPSBasisSpinner *_BasicSpinner;
}; };
} /* namespace NLQT */ } /* namespace NLQT */