khanat-opennel-code/code/nel/tools/3d/object_viewer_qt/src/attrib_widget.h

363 lines
10 KiB
C
Raw Normal View History

/*
Object Viewer Qt
Copyright (C) 2010 Dzmitry Kamiahin <dnk-88@tut.by>
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
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 General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef ATTRIB_WIDGET_H
#define ATTRIB_WIDGET_H
#include <nel/misc/types_nl.h>
#include "ui_attrib_form.h"
// Qt includes
#include <QtGui/QDialog>
// STL includes
// NeL includes
#include <nel/misc/config_file.h>
#include <nel/misc/rgba.h>
#include <nel/3d/ps_plane_basis.h>
#include <nel/3d/ps_attrib_maker.h>
// Project includes
#include "ps_wrapper.h"
#include "particle_node.h"
namespace NLQT {
/**
@class CAttribWidget
@brief Base attrib maker edition dialog.
*/
class CAttribWidget: public QGroupBox
{
Q_OBJECT
public:
CAttribWidget(QWidget *parent = 0);
~CAttribWidget();
/// @param enableConstantValue - when false, only a scheme is available
void setEnabledConstantValue(bool enableConstantValue = true);
/// Force to update dialog content
void updateUi();
/// Сonnects all the slots with signals
void init();
/// Sets the pointer CWorkspaceNode* in the wrappers.
virtual void setWorkspaceNode(CWorkspaceNode *node) = 0;
/// Private usage (not private because accessed by a static function) : return the nbCycles parameter of the scheme (e.g the input multiplier).
virtual float getSchemeNbCycles(void) const = 0;
/// Private usage (not private because accessed by a static function) : set the nbCycles parameter of the scheme (e.g the input multiplier)
virtual void setSchemeNbCycles(float nbCycles) = 0;
/// Enable the srcInput
void enableSrcInput(bool enable = true) { _SrcInputEnabled = enable; }
bool isSrcInputEnabled() const { return _SrcInputEnabled; }
/// Disable the possibility to choose a scheme that has memory. (for example, a scheme for lifetime of a located has no sense
/// because located have already some memory to store it)
void enableMemoryScheme(bool enabled = true);
/// Tells wether memory schemes are enables
/// @see enableMemoryScheme()
bool isMemorySchemeEnabled() const { return !_DisableMemoryScheme; }
/// Enable Nb Cycle tuning
void enableNbCycles(bool enabled) { _NbCycleEnabled = enabled; }
bool isNbCycleEnabled() const { return _NbCycleEnabled; }
private Q_SLOTS:
virtual void clickedEdit();
virtual void setClamp(bool state);
virtual void changeCurrentScheme(int index);
virtual void setCurrentSrc(int index);
virtual void setUserIndex();
virtual void changeUseScheme(int index);
protected:
/// change the dialog for constant values
virtual void cstValueUpdate() = 0;
/// enable / disable the 'edit input' button, when input can be edited
void inputValueUpdate(void);
/// toggle back from scheme to cst value
virtual void resetCstValue(void) = 0;
/// change the dialog for scheme usage
void schemeValueUpdate();
/// return true if a scheme is used
virtual bool useScheme(void) const = 0;
/// edit the current scheme. And return a window on it
virtual QDialog *editScheme(void) = 0;
/// set the current scheme
virtual void setCurrentScheme(uint index) = 0;
/// set the current scheme ptr
virtual void setCurrentSchemePtr(NL3D::CPSAttribMakerBase *) = 0;
/// get the current scheme, -1 if the scheme is unknow (created outside the editor ?)
virtual sint getCurrentScheme(void) const = 0;
/// get a pointer on the current scheme base class
virtual NL3D::CPSAttribMakerBase *getCurrentSchemePtr(void) const = 0;
/// tells wether the scheme supports custom input
virtual bool hasSchemeCustomInput(void) const = 0;
/// retrieve the scheme input id
virtual NL3D::CPSInputType getSchemeInput(void) const = 0;
/// set the scheme input id
virtual void setSchemeInput(const NL3D::CPSInputType &input) = 0;
/// tells wether the scheme input value is clamped or not
virtual bool isSchemeClamped(void) const = 0;
/// clamp / unclamp the scheme
virtual void clampScheme(bool clamped = true) = 0;
/// return true if clamping is supported
virtual bool isClampingSupported(void) const = 0;
/// bool : true is src input are allowed
bool _SrcInputEnabled;
/// true if constant values are allowed
bool _EnableConstantValue;
/// this is equal to true when memory schemes are not permitted
bool _DisableMemoryScheme;
/// true to enable 'nb cycles' control
bool _NbCycleEnabled;
/// wrapper to tune the number of cycles
struct CNbCyclesWrapper : public IPSWrapperFloat
{
CAttribWidget *widget;
float get(void) const { return widget->getSchemeNbCycles(); }
void set(const float &v) { widget->setSchemeNbCycles(v); }
} _NbCyclesWrapper;
CWorkspaceNode *_Node;
QDialog *_SchemeWidget;
Ui::CAttribWidget _ui;
}; /* class CAttribWidget */
/**
@class CAttribWidgetT
@brief A template class that helps to specialize the attrib maker edition dialog with various types.
*/
template <typename T> class CAttribWidgetT : public CAttribWidget
{
public:
CAttribWidgetT(QWidget *parent = 0): CAttribWidget(parent),
_Wrapper(NULL),
_SchemeWrapper(NULL)
{
}
virtual void setWrapper(IPSWrapper<T> *wrapper) = 0;
void setSchemeWrapper(IPSSchemeWrapper<T> *schemeWrapper) { nlassert(schemeWrapper); _SchemeWrapper = schemeWrapper; }
// Inherited from CAttribWidget
virtual QDialog *editScheme(void) = 0;
virtual void setCurrentScheme(uint index) = 0;
virtual sint getCurrentScheme(void) const = 0;
virtual void resetCstValue(void)
{
_Wrapper->setAndUpdateModifiedFlag(_Wrapper->get()); // reuse current color
}
virtual bool hasSchemeCustomInput(void) const { return _SchemeWrapper->getScheme()->hasCustomInput(); }
virtual NL3D::CPSInputType getSchemeInput(void) const { return _SchemeWrapper->getScheme()->getInput(); }
virtual void setSchemeInput(const NL3D::CPSInputType &input) { _SchemeWrapper->getScheme()->setInput(input); }
virtual void setWorkspaceNode(CWorkspaceNode *node)
{
_Node = node; if (_Wrapper != NULL) _Wrapper->OwnerNode = _Node; if (_SchemeWrapper != NULL) _SchemeWrapper->OwnerNode = _Node;
};
virtual float getSchemeNbCycles(void) const { return _SchemeWrapper->getScheme()->getNbCycles(); }
virtual void setSchemeNbCycles(float nbCycles) { _SchemeWrapper->getScheme()->setNbCycles(nbCycles); }
virtual bool isSchemeClamped(void) const { return _SchemeWrapper->getScheme()->getClamping(); }
virtual void clampScheme(bool clamped = true) { _SchemeWrapper->getScheme()->setClamping(clamped); }
virtual bool isClampingSupported(void) const { return _SchemeWrapper->getScheme()->isClampingSupported(); };
virtual NL3D::CPSAttribMakerBase *getCurrentSchemePtr(void) const { return _SchemeWrapper->getScheme(); }
virtual void setCurrentSchemePtr(NL3D::CPSAttribMakerBase *s)
{
_SchemeWrapper->setSchemeAndUpdateModifiedFlag(NLMISC::safe_cast<NL3D::CPSAttribMaker<T> *>(s));
}
virtual void cstValueUpdate() = 0;
protected:
virtual bool useScheme(void) const
{
nlassert(_SchemeWrapper);
return(_SchemeWrapper->getScheme() != NULL);
}
public:
/// Wrapper to set/get a constant float
IPSWrapper<T> *_Wrapper;
/// Wrapper to set/get a scheme
IPSSchemeWrapper<T> *_SchemeWrapper;
};
/**
@class CAttribFloatWidget
@brief An attribute editor specialized for float values
*/
class CAttribFloatWidget: public CAttribWidgetT<float>
{
Q_OBJECT
public:
CAttribFloatWidget(QWidget *parent = 0);
~CAttribFloatWidget();
void setRange(float minValue = 0, float maxValue = 10);
void setWrapper(IPSWrapper<float> *wrapper);
// inherited from CAttribWidget
virtual QDialog *editScheme(void);
virtual void setCurrentScheme(uint index);
virtual sint getCurrentScheme(void) const;
virtual void cstValueUpdate();
private:
float _MinRange, _MaxRange;
}; /* class CAttribFloatWidget */
/**
@class CAttribUIntWidget
@brief An attribute editor specialized for unsigned int values
*/
class CAttribUIntWidget: public CAttribWidgetT<uint32>
{
Q_OBJECT
public:
CAttribUIntWidget(QWidget *parent = 0);
~CAttribUIntWidget();
void setRange(uint32 minValue = 0, uint32 maxValue = 10);
void setWrapper(IPSWrapper<uint32> *wrapper);
// inherited from CAttribWidget
virtual QDialog *editScheme(void);
virtual void setCurrentScheme(uint index);
virtual sint getCurrentScheme(void) const;
virtual void cstValueUpdate();
private:
uint32 _MinRange, _MaxRange;
}; /* class CAttribUIntWidget */
/**
@class CAttribIntWidget
@brief An attribute editor specialized for signed int values
*/
class CAttribIntWidget: public CAttribWidgetT<sint32>
{
Q_OBJECT
public:
CAttribIntWidget(QWidget *parent = 0);
~CAttribIntWidget();
void setRange(sint32 minValue = 0, sint32 maxValue = 10);
void setWrapper(IPSWrapper<sint32> *wrapper);
// inherited from CAttribWidget
virtual QDialog *editScheme(void);
virtual void setCurrentScheme(uint index);
virtual sint getCurrentScheme(void) const;
virtual void cstValueUpdate();
private:
sint32 _MinRange, _MaxRange;
}; /* class CAttribIntWidget */
/**
@class CAttribRGBAWidget
@brief An attribute editor specialized for RGB values
*/
class CAttribRGBAWidget: public CAttribWidgetT<NLMISC::CRGBA>
{
Q_OBJECT
public:
CAttribRGBAWidget(QWidget *parent = 0);
~CAttribRGBAWidget();
void setWrapper(IPSWrapper<NLMISC::CRGBA> *wrapper);
// inherited from CAttribWidget
virtual QDialog *editScheme(void);
virtual void setCurrentScheme(uint index);
virtual sint getCurrentScheme(void) const;
virtual void cstValueUpdate();
private:
}; /* class CAttribRGBAWidget */
/**
@class CAttribPlaneBasisWidget
@brief An attribute editor specialized for plane basis values
*/
class CAttribPlaneBasisWidget: public CAttribWidgetT<NL3D::CPlaneBasis>
{
Q_OBJECT
public:
CAttribPlaneBasisWidget(QWidget *parent = 0);
~CAttribPlaneBasisWidget();
void setWrapper(IPSWrapper<NL3D::CPlaneBasis> *wrapper);
// inherited from CAttribWidget
virtual QDialog *editScheme(void);
virtual void setCurrentScheme(uint index);
virtual sint getCurrentScheme(void) const;
virtual void cstValueUpdate();
private:
}; /* class CAttribPlaneBasisWidget */
} /* namespace NLQT */
#endif // ATTRIB_WIDGET_H