Shinya Kitaoka 810553
#pragma once
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#ifndef FUNCTIONPANEL_H
Toshihiro Shimizu 890ddd
#define FUNCTIONPANEL_H
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#include "tcommon.h"
Toshihiro Shimizu 890ddd
#include "functiontreeviewer.h"
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#include <qdialog></qdialog>
Toshihiro Shimizu 890ddd
#include <set></set>
Keisuke Ogaki e76b22
#include <cmath></cmath>
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 TDoubleParam;
Toshihiro Shimizu 890ddd
class TDoubleKeyframe;
Toshihiro Shimizu 890ddd
class TFrameHandle;
Toshihiro Shimizu 890ddd
class FunctionSelection;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//! Channel edit panel (numcols + graph popup)
Shinya Kitaoka d1f6c4
class FunctionPanel final : public QDialog {
Shinya Kitaoka 120a6e
  Q_OBJECT
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  QColor m_bgColor;
Shinya Kitaoka 120a6e
  QColor m_valueLineColor;
Shinya Kitaoka 120a6e
  QColor m_frameLineColor;
Shinya Kitaoka 120a6e
  QColor m_otherCurvesColor;
Shinya Kitaoka 120a6e
  QColor m_rulerBackground;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  Q_PROPERTY(QColor BGColor READ getBGColor WRITE setBGColor)
Shinya Kitaoka 120a6e
  Q_PROPERTY(
Shinya Kitaoka 120a6e
      QColor ValueLineColor READ getValueLineColor WRITE setValueLineColor)
Shinya Kitaoka 120a6e
  Q_PROPERTY(
Shinya Kitaoka 120a6e
      QColor FrameLineColor READ getFrameLineColor WRITE setFrameLineColor)
Shinya Kitaoka 120a6e
  Q_PROPERTY(QColor OtherCurvesColor READ getOtherCurvesColor WRITE
Shinya Kitaoka 120a6e
                 setOtherCurvesColor)
Shinya Kitaoka 120a6e
  Q_PROPERTY(
Shinya Kitaoka 120a6e
      QColor RulerBackground READ getRulerBackground WRITE setRulerBackground)
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  QColor m_textColor;      // black
Shinya Kitaoka 120a6e
  QColor m_subColor;       // white
Shinya Kitaoka 120a6e
  QColor m_selectedColor;  // blue
Shinya Kitaoka 120a6e
  Q_PROPERTY(QColor TextColor READ getTextColor WRITE setTextColor)
Shinya Kitaoka 120a6e
  Q_PROPERTY(QColor SubColor READ getSubColor WRITE setSubColor)
Shinya Kitaoka 120a6e
  Q_PROPERTY(QColor SelectedColor READ getSelectedColor WRITE setSelectedColor)
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
public:
Shinya Kitaoka 120a6e
  class DragTool;
Shinya Kitaoka 120a6e
  enum Handle {
Shinya Kitaoka 120a6e
    None,
Shinya Kitaoka 120a6e
    Curve,
Shinya Kitaoka 120a6e
    Point,
Shinya Kitaoka 120a6e
    SpeedIn,
Shinya Kitaoka 120a6e
    SpeedOut,
Shinya Kitaoka 120a6e
    EaseIn,
Shinya Kitaoka 120a6e
    EaseOut,
Shinya Kitaoka 120a6e
    EaseInPercentage,
Shinya Kitaoka 120a6e
    EaseOutPercentage
Shinya Kitaoka 120a6e
  };
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
private:
Shinya Kitaoka 120a6e
  QTransform m_viewTransform;  // world -> window
Shinya Kitaoka 120a6e
  int m_valueAxisX, m_frameAxisY, m_graphViewportY;
Shinya Kitaoka 120a6e
  QPoint m_origin;              // axes origin (window coords)
Shinya Kitaoka 120a6e
  QPoint m_startPos, m_oldPos;  // mouse click position, last mouse click/drag
Shinya Kitaoka 120a6e
                                // position (window coords)
Jeremy Bullock 4ce953
  bool m_isFloating = true;
Shinya Kitaoka 120a6e
  struct Gadget {
Shinya Kitaoka 120a6e
    Handle m_handle;
Shinya Kitaoka 120a6e
    int m_kIndex;
Shinya Kitaoka 120a6e
    QRect m_hitRegion;
Shinya Kitaoka 120a6e
    QPointF m_pos, m_pointPos;
Shinya Kitaoka 120a6e
    double m_keyframePosition;
Shinya Kitaoka 120a6e
    FunctionTreeModel::Channel *m_channel;
Shinya Kitaoka 120a6e
    Gadget(Handle handle, int kIndex, const QPointF &p, int rx, int ry,
Shinya Kitaoka 120a6e
           const QPointF &pointPos = QPointF());
Shinya Kitaoka 120a6e
  };
Shinya Kitaoka 120a6e
  QList<gadget> m_gadgets;</gadget>
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  DragTool *m_dragTool;
Shinya Kitaoka 120a6e
  FunctionSelection *m_selection;
Shinya Kitaoka 120a6e
  TFrameHandle *m_frameHandle;
Shinya Kitaoka 120a6e
  FunctionTreeModel *m_functionTreeModel;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  int m_currentFrameStatus;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  struct Highlighted {
Shinya Kitaoka 120a6e
    Handle handle;
Shinya Kitaoka 120a6e
    int gIndex;
Shinya Kitaoka 120a6e
  } m_highlighted;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  struct {
Shinya Kitaoka 120a6e
    bool visible;
Shinya Kitaoka 120a6e
    double frame, value;
Shinya Kitaoka 120a6e
  } m_cursor;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  struct {
Shinya Kitaoka 120a6e
    QPoint curvePos, labelPos;
Shinya Kitaoka 120a6e
    std::string text;
Shinya Kitaoka 120a6e
    TDoubleParam *curve;
Shinya Kitaoka 120a6e
  } m_curveLabel;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  enum CURVE_SHAPE {
Shinya Kitaoka 120a6e
    SMOOTH = 0,
Shinya Kitaoka 120a6e
    FRAME_BASED  // curves with the connected polylines of integer frames
Shinya Kitaoka 120a6e
  } m_curveShape;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
public:
Jeremy Bullock 4ce953
  FunctionPanel(QWidget *parent, bool isFloating = true);
Shinya Kitaoka 120a6e
  ~FunctionPanel();
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  void setModel(FunctionTreeModel *model) { m_functionTreeModel = model; };
Shinya Kitaoka 120a6e
  FunctionTreeModel *getModel() const { return m_functionTreeModel; }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  FunctionSelection *getSelection() const { return m_selection; }
Shinya Kitaoka 120a6e
  void setSelection(FunctionSelection *selection) {
Shinya Kitaoka 120a6e
    m_selection = selection;
Shinya Kitaoka 120a6e
  }  // does NOT get ownership
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  void setFrameHandle(TFrameHandle *frameHandle);
Shinya Kitaoka 120a6e
  TFrameHandle *getFrameHandle() const { return m_frameHandle; }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  QTransform getViewTransform() const { return m_viewTransform; }
Shinya Kitaoka 120a6e
  void setViewTransform(const QTransform &viewTransform) {
Shinya Kitaoka 120a6e
    m_viewTransform = viewTransform;
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  // frame pixel size / value pixel size
Shinya Kitaoka 120a6e
  double getPixelRatio(TDoubleParam *curve) const;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  double xToFrame(double x) const;
Shinya Kitaoka 120a6e
  double frameToX(double frame) const;
Shinya Kitaoka 120a6e
luz paz 6454c4
  // note: the y-unit depends on the unit (e.g. degrees, inches,..) and
Shinya Kitaoka 120a6e
  // therefore on the curve
Shinya Kitaoka 120a6e
  double valueToY(TDoubleParam *curve, double value) const;
Shinya Kitaoka 120a6e
  double yToValue(TDoubleParam *curve, double y) const;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  void pan(int dx, int dy);
Shinya Kitaoka 120a6e
  void pan(const QPoint &delta) { pan(delta.x(), delta.y()); }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  void zoom(double sx, double sy, const QPoint ¢er);
Shinya Kitaoka 120a6e
  void fitSelectedPoints();
Shinya Kitaoka 120a6e
  void fitCurve();
Shinya Kitaoka 120a6e
  void fitGraphToWindow(bool currentCurveOnly = false);
Shinya Kitaoka 120a6e
  void fitRegion(double f0, double v0, double f1, double v1);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  QPointF getWinPos(TDoubleParam *curve, double frame, double value) const;
Shinya Kitaoka 120a6e
  QPointF getWinPos(TDoubleParam *curve, const TPointD &frameValuePos) const {
Shinya Kitaoka 120a6e
    return getWinPos(curve, frameValuePos.x, frameValuePos.y);
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
  QPointF getWinPos(TDoubleParam *curve, double frame) const;
Shinya Kitaoka 120a6e
  QPointF getWinPos(TDoubleParam *curve, const TDoubleKeyframe &kf) const;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  int getCurveDistance(TDoubleParam *curve, const QPoint &winPos);
Shinya Kitaoka 120a6e
  TDoubleParam *findClosestCurve(const QPoint &winPos, int maxWinDistance);
Shinya Kitaoka 120a6e
  FunctionTreeModel::Channel *findClosestChannel(const QPoint &winPos,
Shinya Kitaoka 120a6e
                                                 int maxWinDistance);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  // returns the keyframe index (-1 if no keyframe found)
Shinya Kitaoka 120a6e
  // int findClosestKeyframe(TDoubleParam* curve, const QPoint &winPos, Handle
Shinya Kitaoka 120a6e
  // &handle, int maxWinDistance);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  int findClosestGadget(const QPoint &winPos, Handle &handle,
Shinya Kitaoka 120a6e
                        int maxWinDistance);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  // creates a QPainterPath representing a curve segment, limited in [x0,x1]
Shinya Kitaoka 120a6e
  // segmentIndex = -1 => ]-inf,first keyframe]
Shinya Kitaoka 120a6e
  // segmentIndex = segmentCount => [last keyframe, inf[
Shinya Kitaoka 120a6e
  QPainterPath getSegmentPainterPath(TDoubleParam *curve, int segmentIndex,
Shinya Kitaoka 120a6e
                                     int x0, int x1);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  TDoubleParam *getCurrentCurve() const;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  void emitKeyframeSelected(double frame) { emit keyframeSelected(frame); }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  void setBGColor(const QColor &color) { m_bgColor = color; }
Shinya Kitaoka 120a6e
  QColor getBGColor() const { return m_bgColor; }
Shinya Kitaoka 120a6e
  void setValueLineColor(const QColor &color) { m_valueLineColor = color; }
Shinya Kitaoka 120a6e
  QColor getValueLineColor() const { return m_valueLineColor; }
Shinya Kitaoka 120a6e
  void setFrameLineColor(const QColor &color) { m_frameLineColor = color; }
Shinya Kitaoka 120a6e
  QColor getFrameLineColor() const { return m_frameLineColor; }
Shinya Kitaoka 120a6e
  void setOtherCurvesColor(const QColor &color) { m_otherCurvesColor = color; }
Shinya Kitaoka 120a6e
  QColor getOtherCurvesColor() const { return m_otherCurvesColor; }
Shinya Kitaoka 120a6e
  void setRulerBackground(const QColor &color) { m_rulerBackground = color; }
Shinya Kitaoka 120a6e
  QColor getRulerBackground() const { return m_rulerBackground; }
Shinya Kitaoka 120a6e
  void setTextColor(const QColor &color) { m_textColor = color; }
Shinya Kitaoka 120a6e
  QColor getTextColor() const { return m_textColor; }
Shinya Kitaoka 120a6e
  void setSubColor(const QColor &color) { m_subColor = color; }
Shinya Kitaoka 120a6e
  QColor getSubColor() const { return m_subColor; }
Shinya Kitaoka 120a6e
  void setSelectedColor(const QColor &color) { m_selectedColor = color; }
Shinya Kitaoka 120a6e
  QColor getSelectedColor() const { return m_selectedColor; }
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
protected:
Shinya Kitaoka 120a6e
  void updateGadgets(TDoubleParam *curve);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  void drawCurrentFrame(QPainter &);
Shinya Kitaoka 120a6e
  void drawFrameGrid(QPainter &);
Shinya Kitaoka 120a6e
  void drawValueGrid(QPainter &);
Shinya Kitaoka 120a6e
  void drawOtherCurves(QPainter &);
Shinya Kitaoka 120a6e
  void drawCurrentCurve(QPainter &);
Shinya Kitaoka 120a6e
  void drawGroupKeyframes(QPainter &);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 473e70
  void paintEvent(QPaintEvent *e) override;
Shinya Kitaoka 473e70
  void mousePressEvent(QMouseEvent *e) override;
Shinya Kitaoka 473e70
  void mouseReleaseEvent(QMouseEvent *e) override;
Shinya Kitaoka 473e70
  void mouseMoveEvent(QMouseEvent *e) override;
Shinya Kitaoka 473e70
  void wheelEvent(QWheelEvent *e) override;
Shinya Kitaoka 120a6e
  void openContextMenu(QMouseEvent *e);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 473e70
  void keyPressEvent(QKeyEvent *e) override;
Shinya Kitaoka 473e70
  void enterEvent(QEvent *) override;
Shinya Kitaoka 473e70
  void leaveEvent(QEvent *) override;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 473e70
  void showEvent(QShowEvent *) override;
Shinya Kitaoka 473e70
  void hideEvent(QHideEvent *) override;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
public slots:
Shinya Kitaoka 120a6e
  void onFrameSwitched();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
signals:
Shinya Kitaoka 120a6e
  // void segmentSelected(TDoubleParam *curve, int segmentIndex);
Shinya Kitaoka 120a6e
  void keyframeSelected(double frame);
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#endif