Shinya Kitaoka 810553
#pragma once
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#ifndef DOUBLEPAIRFIELD_H
Toshihiro Shimizu 890ddd
#define DOUBLEPAIRFIELD_H
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#include "toonzqt/doublefield.h"
Toshihiro Shimizu 890ddd
#include "tcommon.h"
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#undef DVAPI
Toshihiro Shimizu 890ddd
#undef DVVAR
Toshihiro Shimizu 890ddd
#ifdef TOONZQT_EXPORTS
Toshihiro Shimizu 890ddd
#define DVAPI DV_EXPORT_API
Toshihiro Shimizu 890ddd
#define DVVAR DV_EXPORT_VAR
Toshihiro Shimizu 890ddd
#else
Toshihiro Shimizu 890ddd
#define DVAPI DV_IMPORT_API
Toshihiro Shimizu 890ddd
#define DVVAR DV_IMPORT_VAR
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
// forward declaration
Toshihiro Shimizu 890ddd
class QSlider;
Toshihiro Shimizu 890ddd
class QLabel;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//=============================================================================
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
namespace DVGui {
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//=============================================================================
Shinya Kitaoka 120a6e
/*! \brief The DoubleValuePairField class provides to view an object to manage a
Shinya Kitaoka 120a6e
   pair
Shinya Kitaoka 120a6e
                                         of double parameter.
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
                Inherits \b QWidget.
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
                The object is composed of an horizontal layout \b QHBoxLayout
Shinya Kitaoka 120a6e
   which contains
Shinya Kitaoka 120a6e
                two pair [label, text field] and a slider with two grab, one for
Shinya Kitaoka 120a6e
   each double
Shinya Kitaoka 120a6e
                value to manage. [label, text field] are a \b QLabel and a \b
Shinya Kitaoka 120a6e
   DoubleLineEdit.
Shinya Kitaoka 120a6e
                Objects are inserted in the following order: a label and
Shinya Kitaoka 120a6e
   respective text field,
Shinya Kitaoka 120a6e
                the slider and the other pair [lebel,text field].
Shinya Kitaoka 120a6e
                Object size width is not fixed, while height is equal to
Shinya Kitaoka 120a6e
   DVGui::WidgetHeight, 20;
Shinya Kitaoka 120a6e
                labels width depend from its text lenght, text fields has fixed
Shinya Kitaoka 120a6e
   size, while
Shinya Kitaoka 120a6e
                slider width change in according with widget size.
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
                Objects contained in this widget are connected, so if you change
Shinya Kitaoka 120a6e
   one value the
Shinya Kitaoka 120a6e
                other automatically change, if it is necessary. You can set
Shinya Kitaoka 120a6e
   current value,
Shinya Kitaoka 120a6e
                getValues(), minimum and max value, getRange(), using
Shinya Kitaoka 120a6e
   setValues(), setRange().
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
                To know when one of two double parameter value change class
Shinya Kitaoka 120a6e
   provides a signal,
Shinya Kitaoka 120a6e
                valuesChanged(); class emit signal when a grab slider position
Shinya Kitaoka 120a6e
   change or when
Shinya Kitaoka 120a6e
                editing text field, left or right is finished and current value
Shinya Kitaoka 120a6e
   is changed.
Shinya Kitaoka 120a6e
                Editing text field finished may occur if focus is lost or enter
Shinya Kitaoka 120a6e
   key is pressed.
Shinya Kitaoka 120a6e
                See SLOT: onLeftEditingFinished() and onRightEditingFinished().
Toshihiro Shimizu 890ddd
*/
Shinya Kitaoka 120a6e
class DVAPI DoubleValuePairField : public QWidget {
Shinya Kitaoka 120a6e
  Q_OBJECT
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
protected:
Shinya Kitaoka 120a6e
  QPixmap m_handleLeftPixmap, m_handleRightPixmap, m_handleLeftGrayPixmap,
Shinya Kitaoka 120a6e
      m_handleRightGrayPixmap;
Shinya Kitaoka 120a6e
  Q_PROPERTY(QPixmap HandleLeftPixmap READ getHandleLeftPixmap WRITE
Shinya Kitaoka 120a6e
                 setHandleLeftPixmap);
Shinya Kitaoka 120a6e
  Q_PROPERTY(QPixmap HandleRightPixmap READ getHandleRightPixmap WRITE
Shinya Kitaoka 120a6e
                 setHandleRightPixmap);
Shinya Kitaoka 120a6e
  Q_PROPERTY(QPixmap HandleLeftGrayPixmap READ getHandleLeftGrayPixmap WRITE
Shinya Kitaoka 120a6e
                 setHandleLeftGrayPixmap);
Shinya Kitaoka 120a6e
  Q_PROPERTY(QPixmap HandleRightGrayPixmap READ getHandleRightGrayPixmap WRITE
Shinya Kitaoka 120a6e
                 setHandleRightGrayPixmap);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  QColor m_lightLineColor; /*-- スライダ溝の明るい色(白) --*/
Shinya Kitaoka 120a6e
  QColor m_darkLineColor; /*-- スライダ溝の暗い色(128,128,128) --*/
Shinya Kitaoka 120a6e
  Q_PROPERTY(
Shinya Kitaoka 120a6e
      QColor LightLineColor READ getLightLineColor WRITE setLightLineColor);
Shinya Kitaoka 120a6e
  Q_PROPERTY(QColor DarkLineColor READ getDarkLineColor WRITE setDarkLineColor);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  DoubleValueLineEdit *m_leftLineEdit;
Shinya Kitaoka 120a6e
  DoubleValueLineEdit *m_rightLineEdit;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  QLabel *m_leftLabel, *m_rightLabel;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  std::pair<double, double=""> m_values;</double,>
Shinya Kitaoka 120a6e
  double m_minValue, m_maxValue;
Shinya Kitaoka 120a6e
  int m_grabOffset, m_grabIndex;
Shinya Kitaoka 120a6e
  int m_leftMargin, m_rightMargin;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  bool m_isMaxRangeLimited;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
public:
Shinya Kitaoka 120a6e
  DoubleValuePairField(QWidget *parent, bool isMaxRangeLimited,
Shinya Kitaoka 120a6e
                       DoubleValueLineEdit *leftLineEdit,
Shinya Kitaoka 120a6e
                       DoubleValueLineEdit *rightLineEdit);
Shinya Kitaoka 120a6e
  ~DoubleValuePairField() {}
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  /*! Set current values to \b values. */
Shinya Kitaoka 120a6e
  void setValues(const std::pair<double, double=""> &values);</double,>
Shinya Kitaoka 120a6e
  /*!	Return a pair containing current values. */
Shinya Kitaoka 120a6e
  std::pair<double, double=""> getValues() const { return m_values; }</double,>
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  /*! Set left label string to \b QString \b text. Recompute left margin adding
Shinya Kitaoka 120a6e
                  label width. */
Shinya Kitaoka 120a6e
  void setLeftText(const QString &text);
Shinya Kitaoka 120a6e
  /*! Set right label string to \b QString \b text. Recompute right margin
Shinya Kitaoka 120a6e
     adding
Shinya Kitaoka 120a6e
                  label width. */
Shinya Kitaoka 120a6e
  void setRightText(const QString &text);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  void setLabelsEnabled(bool enable);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  /*! Set range of \b DoublePairField to \b minValue, \b maxValue. */
Shinya Kitaoka 120a6e
  void setRange(double minValue, double maxValue);
Shinya Kitaoka 120a6e
  /*! Set \b minValue and \b maxValue to DoublePairField range. */
Shinya Kitaoka 120a6e
  void getRange(double &minValue, double &maxValue);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  QPixmap getHandleLeftPixmap() const { return m_handleLeftPixmap; }
Shinya Kitaoka 120a6e
  void setHandleLeftPixmap(const QPixmap &pixmap) {
Shinya Kitaoka 120a6e
    m_handleLeftPixmap = pixmap;
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
  QPixmap getHandleRightPixmap() const { return m_handleRightPixmap; }
Shinya Kitaoka 120a6e
  void setHandleRightPixmap(const QPixmap &pixmap) {
Shinya Kitaoka 120a6e
    m_handleRightPixmap = pixmap;
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
  QPixmap getHandleLeftGrayPixmap() const { return m_handleLeftGrayPixmap; }
Shinya Kitaoka 120a6e
  void setHandleLeftGrayPixmap(const QPixmap &pixmap) {
Shinya Kitaoka 120a6e
    m_handleLeftGrayPixmap = pixmap;
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
  QPixmap getHandleRightGrayPixmap() const { return m_handleRightGrayPixmap; }
Shinya Kitaoka 120a6e
  void setHandleRightGrayPixmap(const QPixmap &pixmap) {
Shinya Kitaoka 120a6e
    m_handleRightGrayPixmap = pixmap;
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  void setLightLineColor(const QColor &color) { m_lightLineColor = color; }
Shinya Kitaoka 120a6e
  QColor getLightLineColor() const { return m_lightLineColor; }
Shinya Kitaoka 120a6e
  void setDarkLineColor(const QColor &color) { m_darkLineColor = color; }
Shinya Kitaoka 120a6e
  QColor getDarkLineColor() const { return m_darkLineColor; }
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
protected:
Shinya Kitaoka 120a6e
  /*! Return value corresponding \b x position. */
Shinya Kitaoka 120a6e
  double pos2value(int x) const;
Shinya Kitaoka 120a6e
  /*! Return x position corresponding \b value. */
Shinya Kitaoka 120a6e
  int value2pos(double v) const;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  /*! Set current value to \b value.
Shinya Kitaoka 120a6e
                  Set left or right value, or both, to value depending on
Shinya Kitaoka 120a6e
     current slider
Shinya Kitaoka 120a6e
                  grab edited and \b value. */
Shinya Kitaoka 120a6e
  void setValue(double v);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 473e70
  void paintEvent(QPaintEvent *) override;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 473e70
  void mousePressEvent(QMouseEvent *event) override;
Shinya Kitaoka 473e70
  void mouseMoveEvent(QMouseEvent *event) override;
Shinya Kitaoka 473e70
  void mouseReleaseEvent(QMouseEvent *event) override;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
protected slots:
Shinya Kitaoka 120a6e
  /*! Set current left value to value in left text field; if necessary, if left
Shinya Kitaoka 120a6e
                  value is greater than right, change also current right value.
Shinya Kitaoka 120a6e
  \n	This protected slot is called when text editing is finished.
Shinya Kitaoka 120a6e
  \n	Emit valuesChanged().
Shinya Kitaoka 120a6e
  \n	If current left value is equal to left text field value, return and do
Shinya Kitaoka 120a6e
  nothing. */
Shinya Kitaoka 120a6e
  void onLeftEditingFinished();
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  /*! Set current right value to value in right text field; if necessary, if
Shinya Kitaoka 120a6e
  right
Shinya Kitaoka 120a6e
                  value is lower than left, change also current left value.
Shinya Kitaoka 120a6e
  \n	This protected slot is called when text editing is finished.
Shinya Kitaoka 120a6e
  \n	Emit valuesChanged().
Shinya Kitaoka 120a6e
  \n	If current right value is equal to right text field value return and
Shinya Kitaoka 120a6e
  do nothing. */
Shinya Kitaoka 120a6e
  void onRightEditingFinished();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
signals:
Shinya Kitaoka 120a6e
  /*!	This signal is emitted when change one of two DoubleField value;
Shinya Kitaoka 120a6e
                  if one slider grab position change or if one text field
Shinya Kitaoka 120a6e
     editing is finished. */
Shinya Kitaoka 120a6e
  void valuesChanged(bool isDragging);
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//=============================================================================
Toshihiro Shimizu 890ddd
/*! \brief The DoublePairField class provides a DoubleValuePairField with
Shinya Kitaoka 120a6e
                left DoubleLineEdit and right DoubleLineEdit.
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
                Inherits \b DoubleValuePairField.
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
                \b Example:
Shinya Kitaoka 120a6e
                \code
Shinya Kitaoka 120a6e
                        DoublePairField* doublePairFieldExample = new
Shinya Kitaoka 120a6e
   DoublePairField(this);
Shinya Kitaoka 120a6e
                        doublePairFieldExample->setLeftText(tr("Left Value:"));
Shinya Kitaoka 120a6e
                        doublePairFieldExample->setRightText(tr("Rigth
Shinya Kitaoka 120a6e
   Value:"));
Shinya Kitaoka 120a6e
                        doublePairFieldExample->setRange(0,10);
Shinya Kitaoka 120a6e
                        doublePairFieldExample->setValues(std::make_pair(3.58,7.65));
Shinya Kitaoka 120a6e
                \endcode
Shinya Kitaoka 120a6e
                \b Result:
Shinya Kitaoka 120a6e
                        \image html DoublePairField.jpg
Toshihiro Shimizu 890ddd
*/
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
class DVAPI DoublePairField : public DoubleValuePairField {
Toshihiro Shimizu 890ddd
public:
Shinya Kitaoka 120a6e
  DoublePairField(QWidget *parent = 0, bool isMaxRangeLimited = true);
Shinya Kitaoka 120a6e
  ~DoublePairField() {}
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//=============================================================================
Shinya Kitaoka 120a6e
/*! \brief The MeasuredDoublePairField class provides a DoubleValuePairField
Shinya Kitaoka 120a6e
   with
Shinya Kitaoka 120a6e
                left MeasuredDoubleLineEdit and right DoubleLineEdit.
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
                Inherits \b DoubleValuePairField.
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
                \b Example:
Shinya Kitaoka 120a6e
                \code
Shinya Kitaoka 120a6e
                        MeasuredDoublePairField* doublePairFieldExample = new
Shinya Kitaoka 120a6e
   MeasuredDoublePairField(this);
Shinya Kitaoka 120a6e
                        doublePairFieldExample->setLeftText(tr("Left Value:"));
Shinya Kitaoka 120a6e
                        doublePairFieldExample->setRightText(tr("Rigth
Shinya Kitaoka 120a6e
   Value:"));
Shinya Kitaoka 120a6e
                        doublePairFieldExample->setRange(0,10);
Shinya Kitaoka 120a6e
                        doublePairFieldExample->setValues(std::make_pair(3.58,7.65));
Shinya Kitaoka 120a6e
                \endcode
Shinya Kitaoka 120a6e
                \b Result:
Shinya Kitaoka 120a6e
                        \image html DoublePairField.jpg
Toshihiro Shimizu 890ddd
*/
Toshihiro Shimizu 890ddd
Shinya Kitaoka d1f6c4
class DVAPI MeasuredDoublePairField final : public DoubleValuePairField {
Toshihiro Shimizu 890ddd
public:
Shinya Kitaoka 120a6e
  MeasuredDoublePairField(QWidget *parent = 0, bool isMaxRangeLimited = true);
Shinya Kitaoka 120a6e
  ~MeasuredDoublePairField() {}
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  void setMeasure(std::string measureName);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  void setPrecision(int precision);
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Shinya Kitaoka 120a6e
}  // namespace DVGui
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
#endif  // DOUBLEPAIRFIELD_H