Blob Blame Raw


#ifndef TONECURVEFIELD_H
#define TONECURVEFIELD_H

#include "tcommon.h"
#include "tstroke.h"
#include "toonzqt/histogram.h"
#include <QWidget>

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

// forward declaration
class TStroke;
class QPainterPath;
class QStackedWidget;
class FxHistogramRender;

//=============================================================================
namespace DVGui
{

// forward declaration
class IntPairField;
class CheckBox;

//=============================================================================
// ChennelCurveEditor
//-----------------------------------------------------------------------------

class DVAPI ChennelCurveEditor : public QWidget
{
	Q_OBJECT

	HistogramView *m_histogramView;
	ChannelBar *m_verticalChannelBar;

	QList<QPointF> m_points;
	int m_currentControlPointIndex;

	Qt::MouseButton m_mouseButton;

	int m_curveHeight;

	int m_LeftRightMargin;
	int m_TopMargin;
	int m_BottomMargin;

	bool m_isLinear;

public:
	ChennelCurveEditor(QWidget *parent = 0, HistogramView *histogramView = 0);

	void setPoints(QList<TPointD> points);
	QList<TPointD> getPoints();

	int getCurrentControlPointIndex() { return m_currentControlPointIndex; };
	void setCurrentControlPointIndex(int index) { m_currentControlPointIndex = index; };

	bool eventFilter(QObject *object, QEvent *event);

	void setFirstLastXPosition(std::pair<int, int> values, bool isDragging);

	void setLinear(bool isLinear);

protected:
	QPointF strokeToViewPoint(const TPointD p);
	TPointD viewToStrokePoint(const QPointF &p);
	int getClosestPointIndex(const QPointF &pos, double &minDistance2) const;

	bool isCentralControlPoint(int index) { return index % 3 == 0; }
	bool isLeftControlPoint(int index) { return index % 3 == 2; }
	bool isRightControlPoint(int index) { return index % 3 == 1; }

	void movePoint(int index, const QPointF delta);
	void setPoint(int index, const QPointF point);
	QPointF checkPoint(const QPointF p);

	void moveCurrentControlPoint(const QPointF delta);
	void moveCentralControlPoint(int index, const QPointF delta);
	//	bool eraseControlPointWhileMove(int index, const QPointF delta);

	void addControlPoint(double percent);

	void removeControlPoint(int index);
	void removeCurrentControlPoint();

	QPainterPath getPainterPath();

	void paintEvent(QPaintEvent *);
	void mouseMoveEvent(QMouseEvent *);
	void mousePressEvent(QMouseEvent *);
	void mouseReleaseEvent(QMouseEvent *);
	void keyPressEvent(QKeyEvent *e);
	void enterEvent(QEvent *);
	void leaveEvent(QEvent *);

	void focusInEvent(QFocusEvent *fe);
	void focusOutEvent(QFocusEvent *fe);

signals:
	void focusOut();
	void controlPointChanged(bool isDragging);
	void controlPointAdded(int index);
	void controlPointRemoved(int index);

	void firstLastXPostionChanged(int, int);
};

//=============================================================================
// ToneCurveField
//-----------------------------------------------------------------------------

class DVAPI ToneCurveField : public QWidget
{
	Q_OBJECT

	QStackedWidget *m_toneCurveStackedWidget;
	QStackedWidget *m_sliderStackedWidget;
	QComboBox *m_channelListChooser;
	CheckBox *m_isLinearCheckBox;

public:
	ToneCurveField(QWidget *parent = 0, FxHistogramRender *fxHistogramRender = 0);

	void setCurrentChannel(int currentChannel);
	ChennelCurveEditor *getChannelEditor(int channel) const;
	ChennelCurveEditor *getCurrentChannelEditor() const;
	IntPairField *getCurrentSlider() const;

	int getChannelCount() { return m_toneCurveStackedWidget->count(); }

	void setIsLinearCheckBox(bool isChecked);

protected slots:
	void sliderValueChanged(bool);
	void onFirstLastXPostionChanged(int, int);

public slots:
	void setLinear(bool);

	void setLinearManually(bool);

signals:
	void currentChannelIndexChanged(int);
	void isLinearChanged(bool);
};
}

#endif // TONECURVEFIELD_H