Blob Blame Raw


#ifndef TOOLOPTIONS_H
#define TOOLOPTIONS_H

// TnzQt includes
#include "toonzqt/checkbox.h"

// TnzLib includes
#include "toonz/tstageobject.h"

// TnzCore includes
#include "tcommon.h"
#include "tproperty.h"

// Qt includes
#include <QFrame>
#include <QAction>
#include <QList>
#include <QToolBar>
#include <QMap>

// STD includes
#include <map>

#undef DVAPI
#undef DVVAR
#ifdef TNZTOOLS_EXPORTS
#define DVAPI DV_EXPORT_API
#define DVVAR DV_EXPORT_VAR
#else
#define DVAPI DV_IMPORT_API
#define DVVAR DV_IMPORT_VAR
#endif

//=============================================================================

//    Forward declarations

class TTool;
class ToolOptionToolBar;
class TPropertyGroup;
class TPaletteHandle;
class TFrameHandle;
class TObjectHandle;
class TXsheetHandle;
class ToolHandle;
class SelectionScaleField;
class SelectionRotationField;
class SelectionMoveField;
class ToolOptionSlider;
class ToolOptionIntSlider;
class ThickChangeField;
class ToolOptionCombo;
class ToolOptionCheckbox;
class PegbarChannelField;
class ToolOptionPairSlider;
class ToolOptionControl;
class ToolOptionPopupButton;
class TXshLevelHandle;
class NoScaleField;
class PegbarCenterField;
class RGBLabel;
class MeasuredValueField;
class PaletteController;

class QLabel;
class QPushButton;
class QPropertyAnimation;
class QFrame;
class QHBoxLayout;
class QComboBox;
class QStackedWidget;

//=============================================================================

// Preprocessor definitions

#define TOOL_OPTIONS_LEFT_MARGIN 5

//=============================================================================

//***********************************************************************************************
//    ToolOptionToolBar  declaration
//***********************************************************************************************

class ToolOptionToolBar : public QToolBar
{
public:
	ToolOptionToolBar(QWidget *parent = 0);

	void addSpacing(int width);
};

//***********************************************************************************************
//    ToolOptionsBox  declaration
//***********************************************************************************************

class ToolOptionsBox : public QFrame
{
	Q_OBJECT

protected:
	QMap<std::string, ToolOptionControl *> m_controls; //!< property name -> ToolOptionControl
	QMap<std::string, QLabel *> m_labels;

	QHBoxLayout *m_layout;

public:
	ToolOptionsBox(QWidget *parent);
	~ToolOptionsBox();

	virtual void updateStatus(); //!< Invokes updateStatus() on all registered controls
	virtual void onStageObjectChange() {}

	QHBoxLayout *hLayout() { return m_layout; }
	void addControl(ToolOptionControl *control);

	ToolOptionControl *control(const std::string &controlName) const;

	QLabel *addLabel(QString name);
	void addLabel(std::string propName, QLabel *label);
	void addSeparator();
};

//***********************************************************************************************
//    ToolOptionControlBuilder  declaration
//***********************************************************************************************

class ToolOptionControlBuilder : public TProperty::Visitor
{
	ToolOptionsBox *m_panel;
	TTool *m_tool;
	TPaletteHandle *m_pltHandle;
	ToolHandle *m_toolHandle;

	int m_singleValueWidgetType;
	int m_enumWidgetType;

public:
	ToolOptionControlBuilder(ToolOptionsBox *panel, TTool *tool, TPaletteHandle *pltHandle, ToolHandle *toolHandle = 0);

	enum SingleValueWidgetType { SLIDER = 0,
								 FIELD };
	void setSingleValueWidgetType(int type) { m_singleValueWidgetType = type; }

	enum EnumWidgetType { COMBOBOX = 0,
						  POPUPBUTTON };
	void setEnumWidgetType(int type) { m_enumWidgetType = type; }

private:
	QHBoxLayout *hLayout() { return m_panel->hLayout(); }
	QLabel *addLabel(TProperty *p);

	void visit(TDoubleProperty *p);
	void visit(TDoublePairProperty *p);
	void visit(TIntPairProperty *p);
	void visit(TIntProperty *p);
	void visit(TBoolProperty *p);
	void visit(TStringProperty *p);
	void visit(TEnumProperty *p);
	void visit(TStyleIndexProperty *p);
	void visit(TPointerProperty *p);
};

//***********************************************************************************************
//    GenericToolOptionsBox  declaration
//***********************************************************************************************

class GenericToolOptionsBox : public ToolOptionsBox
{
public:
	GenericToolOptionsBox(QWidget *parent, TTool *tool, TPaletteHandle *pltHandle,
						  int propertyGroupIdx = 0,
						  ToolHandle *toolHandle = 0);
};

//=============================================================================
//
// ArrowToolOptionsBox
//
//=============================================================================

class ArrowToolOptionsBox : public ToolOptionsBox
{
	Q_OBJECT

	TPropertyGroup *m_pg;
	bool m_splined;
	TTool *m_tool;
	TFrameHandle *m_frameHandle;
	TObjectHandle *m_objHandle;
	TXsheetHandle *m_xshHandle;

	QStackedWidget *m_mainStackedWidget;

	//General
	ToolOptionCombo *m_chooseActiveAxisCombo;
	ToolOptionCombo *m_pickCombo;
	//enable to choose the target pegbar from the combobox
	QComboBox *m_currentStageObjectCombo;

	//Position
	PegbarChannelField *m_motionPathPosField;
	PegbarChannelField *m_ewPosField;
	PegbarChannelField *m_nsPosField;
	QLabel *m_ewPosLabel;
	QLabel *m_nsPosLabel;
	PegbarChannelField *m_zField;
	NoScaleField *m_noScaleZField;
	ToolOptionCheckbox *m_lockEWPosCheckbox;
	ToolOptionCheckbox *m_lockNSPosCheckbox;

	//SO = Stacked Order
	QLabel *m_soLabel;
	PegbarChannelField *m_soField;

	//Rotation
	PegbarChannelField *m_rotationField;

	//Scale
	PegbarChannelField *m_globalScaleField;
	PegbarChannelField *m_scaleHField;
	PegbarChannelField *m_scaleVField;
	ToolOptionCheckbox *m_lockScaleHCheckbox;
	ToolOptionCheckbox *m_lockScaleVCheckbox;
	ToolOptionCombo *m_maintainCombo;

	//Shear
	PegbarChannelField *m_shearHField;
	PegbarChannelField *m_shearVField;
	ToolOptionCheckbox *m_lockShearHCheckbox;
	ToolOptionCheckbox *m_lockShearVCheckbox;

	//Center Position
	PegbarCenterField *m_ewCenterField;
	PegbarCenterField *m_nsCenterField;
	ToolOptionCheckbox *m_lockEWCenterCheckbox;
	ToolOptionCheckbox *m_lockNSCenterCheckbox;

public:
	ArrowToolOptionsBox(QWidget *parent, TTool *tool, TPropertyGroup *pg,
						TFrameHandle *frameHandle, TObjectHandle *objHandle, TXsheetHandle *xshHandle,
						ToolHandle *toolHandle);

	void updateStatus();
	void onStageObjectChange();

protected:
	void showEvent(QShowEvent *);
	void hideEvent(QShowEvent *);

	void setSplined(bool on);
	bool isCurrentObjectSplined() const;

protected slots:
	void onFrameSwitched() { updateStatus(); }
	//update the object list in combobox
	void updateStageObjectComboItems();
	//syncronize the current item in the combobox to the selected stage object
	void syncCurrentStageObjectComboItem();
	//change the current stage object when user changes it via combobox by hand
	void onCurrentStageObjectComboActivated(int index);
};

//=============================================================================
//
// SelectionToolOptionsBox
//
//=============================================================================

class SelectionToolOptionsBox : public ToolOptionsBox, public TProperty::Listener
{
	Q_OBJECT

	TTool *m_tool;

	ToolOptionCheckbox *m_setSaveboxCheckbox;
	bool m_isVectorSelction;
	QLabel *m_scaleXLabel;
	SelectionScaleField *m_scaleXField;
	QLabel *m_scaleYLabel;
	SelectionScaleField *m_scaleYField;
	DVGui::CheckBox *m_scaleLink;
	SelectionRotationField *m_rotationField;
	QLabel *m_moveXLabel;
	SelectionMoveField *m_moveXField;
	QLabel *m_moveYLabel;
	SelectionMoveField *m_moveYField;
	ThickChangeField *m_thickChangeField;

	ToolOptionPopupButton *m_capStyle;
	ToolOptionPopupButton *m_joinStyle;
	ToolOptionIntSlider *m_miterField;

public:
	SelectionToolOptionsBox(QWidget *parent, TTool *tool, TPaletteHandle *pltHandle,
							ToolHandle *toolHandle);

	void updateStatus();
	void onPropertyChanged();

protected slots:
	void onScaleXValueChanged();
	void onScaleYValueChanged();
	void onSetSaveboxCheckboxChanged(bool);
};

//=============================================================================
//
// GeometricToolOptionsBox
//
//=============================================================================

class GeometricToolOptionsBox : public ToolOptionsBox
{
	Q_OBJECT

	int m_targetType;

	QLabel *m_poligonSideLabel, *m_hardnessLabel;
	ToolOptionSlider *m_hardnessField;
	ToolOptionIntSlider *m_poligonSideField;
	ToolOptionCombo *m_shapeField;
	ToolOptionCheckbox *m_pencilMode;
	ToolOptionIntSlider *m_miterField;

public:
	GeometricToolOptionsBox(QWidget *parent, TTool *tool, TPaletteHandle *pltHandle,
							ToolHandle *toolHandle);

	void updateStatus();

protected slots:
	void onShapeValueChanged();
	void onPencilModeToggled(bool);
	void onJoinStyleChanged(int);
};

//=============================================================================
//
// TypeToolOptionsBox
//
//=============================================================================

class TypeToolOptionsBox : public ToolOptionsBox
{
	Q_OBJECT

	TTool *m_tool;

public:
	TypeToolOptionsBox(QWidget *parent, TTool *tool, TPaletteHandle *pltHandle,
					   ToolHandle *toolHandle);

	void updateStatus();

protected slots:
	void onFieldChanged();
};

//=============================================================================
//
// PaintbrushToolOptionsBox
//
//=============================================================================

class PaintbrushToolOptionsBox : public ToolOptionsBox
{
	Q_OBJECT

	ToolOptionCombo *m_colorMode;
	ToolOptionCheckbox *m_selectiveMode;

public:
	PaintbrushToolOptionsBox(QWidget *parent, TTool *tool, TPaletteHandle *pltHandle,
							 ToolHandle *toolHandle);

	void updateStatus();

protected slots:
	void onColorModeChanged();
};

//=============================================================================
//
// FillToolOptionsBox
//
//=============================================================================

class FillToolOptionsBox : public ToolOptionsBox
{
	Q_OBJECT

	int m_targetType;
	QLabel *m_fillDepthLabel;
	ToolOptionCombo *m_colorMode, *m_toolType;
	ToolOptionCheckbox *m_selectiveMode, *m_segmentMode, *m_onionMode, *m_multiFrameMode;
	ToolOptionPairSlider *m_fillDepthField;

public:
	FillToolOptionsBox(QWidget *parent, TTool *tool, TPaletteHandle *pltHandle,
					   ToolHandle *toolHandle);

	void updateStatus();

protected slots:
	void onColorModeChanged();
	void onToolTypeChanged();
	void onOnionModeToggled(bool);
	void onMultiFrameModeToggled(bool);
};

//=============================================================================
//
// BrushToolOptionsBox
//
//=============================================================================

class BrushToolOptionsBox : public ToolOptionsBox
{
	Q_OBJECT

	TTool *m_tool;

	ToolOptionCheckbox *m_pencilMode;
	QLabel *m_hardnessLabel;
	ToolOptionSlider *m_hardnessField;
	ToolOptionPopupButton *m_joinStyleCombo;
	ToolOptionIntSlider *m_miterField;
	ToolOptionCombo *m_presetCombo;
	QPushButton *m_addPresetButton;
	QPushButton *m_removePresetButton;

private:
	class PresetNamePopup;
	PresetNamePopup *m_presetNamePopup;

public:
	BrushToolOptionsBox(QWidget *parent, TTool *tool, TPaletteHandle *pltHandle,
						ToolHandle *toolHandle);

	void updateStatus();

protected slots:

	void onPencilModeToggled(bool);
	void onAddPreset();
	void onRemovePreset();
};

//=============================================================================
//
// EraserToolOptionsBox
//
//=============================================================================

class EraserToolOptionsBox : public ToolOptionsBox
{
	Q_OBJECT

	ToolOptionCheckbox *m_pencilMode, *m_invertMode, *m_multiFrameMode;
	ToolOptionCombo *m_toolType, *m_colorMode;
	QLabel *m_hardnessLabel;
	ToolOptionSlider *m_hardnessField;

public:
	EraserToolOptionsBox(QWidget *parent, TTool *tool, TPaletteHandle *pltHandle,
						 ToolHandle *toolHandle);

	void updateStatus();

protected slots:
	void onPencilModeToggled(bool);
	void onToolTypeChanged();
	void onColorModeChanged();
};

//=============================================================================
//
// RulerToolOptionsBox
//
//=============================================================================

class RulerToolOptionsBox : public ToolOptionsBox
{
	Q_OBJECT

	MeasuredValueField *m_Xfld;
	MeasuredValueField *m_Yfld;
	MeasuredValueField *m_Wfld;
	MeasuredValueField *m_Hfld;
	MeasuredValueField *m_Afld;
	MeasuredValueField *m_Lfld;

	QLabel *m_XpixelFld;
	QLabel *m_YpixelFld;
	QLabel *m_WpixelFld;
	QLabel *m_HpixelFld;

	TTool *m_tool;

public:
	RulerToolOptionsBox(QWidget *parent,
						TTool *tool);

	void updateValues(bool isRasterLevelEditing,
					  double X,
					  double Y,
					  double W,
					  double H,
					  double A,
					  double L,
					  int Xpix = 0,
					  int Ypix = 0,
					  int Wpix = 0,
					  int Hpix = 0);

	void resetValues();
};

//=============================================================================
//
// TapeToolOptionsBox
//
//=============================================================================

class TapeToolOptionsBox : public ToolOptionsBox
{
	Q_OBJECT

	ToolOptionCheckbox *m_smoothMode, *m_joinStrokesMode;
	ToolOptionCombo *m_toolMode, *m_typeMode;
	QLabel *m_autocloseLabel;
	ToolOptionSlider *m_autocloseField;

public:
	TapeToolOptionsBox(QWidget *parent, TTool *tool, TPaletteHandle *pltHandle,
					   ToolHandle *toolHandle);

	void updateStatus();

protected slots:
	void onToolTypeChanged();
	void onToolModeChanged();
	void onJoinStrokesModeChanged();
};

//=============================================================================
//
// RGBPickerToolOptionsBox
//
//=============================================================================

class RGBPickerToolOptionsBox : public ToolOptionsBox
{
	Q_OBJECT
	ToolOptionCheckbox *m_realTimePickMode;
	//label with background color
	RGBLabel *m_currentRGBLabel;

public:
	RGBPickerToolOptionsBox(QWidget *parent, TTool *tool, TPaletteHandle *pltHandle,
							ToolHandle *toolHandle, PaletteController *paletteController);
	void updateStatus();
protected slots:
	void updateRealTimePickLabel(const QColor &);
};

//=============================================================================
//
// StylePickerToolOptionsBox
//
//=============================================================================

class StylePickerToolOptionsBox : public ToolOptionsBox
{
	Q_OBJECT
	ToolOptionCheckbox *m_realTimePickMode;

	QLabel *m_currentStyleLabel;

public:
	StylePickerToolOptionsBox(QWidget *parent, TTool *tool, TPaletteHandle *pltHandle,
							  ToolHandle *toolHandle, PaletteController *paletteController);
	void updateStatus();
protected slots:
	void updateRealTimePickLabel(const int, const int, const int);
};

//-----------------------------------------------------------------------------

class DVAPI ToolOptions : public QFrame
{
	Q_OBJECT

	int m_width, m_height;
	std::map<TTool *, ToolOptionsBox *> m_panels;
	QWidget *m_panel;

public:
	ToolOptions();
	~ToolOptions();

	QWidget *getPanel() const { return m_panel; }

protected:
	void showEvent(QShowEvent *);
	void hideEvent(QShowEvent *);

public slots:

	void onToolSwitched();
	void onToolChanged();
	void onStageObjectChange();

	//signals:

	//  void toolOptionChange();
};

#endif // PANE_H