Shinya Kitaoka 810553
#pragma once
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#ifndef FUNCTIONSELECTION_H
Toshihiro Shimizu 890ddd
#define FUNCTIONSELECTION_H
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#include "tcommon.h"
Toshihiro Shimizu 890ddd
#include "functiontreeviewer.h"
Toshihiro Shimizu 890ddd
#include "toonzqt/selection.h"
Toshihiro Shimizu 890ddd
#include "toonzqt/dvmimedata.h"
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#include "tdoublekeyframe.h"
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#include <qwidget></qwidget>
Toshihiro Shimizu 890ddd
#include <qlist></qlist>
Toshihiro Shimizu 890ddd
#include <qset></qset>
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 TFrameHandle;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
class ColumnToCurveMapper {
Toshihiro Shimizu 890ddd
public:
Shinya Kitaoka 120a6e
  virtual TDoubleParam *getCurve(int columnIndex) const = 0;
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka d1f6c4
class FunctionSelection final : public QObject, public TSelection {
Shinya Kitaoka 120a6e
  Q_OBJECT
Shinya Kitaoka 120a6e
  QRect m_selectedCells;  // yrange = rowrange of the selected keyframes;
Shinya Kitaoka 120a6e
                          // xrange = columnrange (functionsheet only)
Shinya Kitaoka 120a6e
  QList<qpair<tdoubleparam *,="" qset<int="">>> m_selectedKeyframes;</qpair<tdoubleparam>
Shinya Kitaoka 120a6e
  // first = curve, second = set of selected keyframes index
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  int m_selectedSegment;  // index of the first keyframe of the segment; -1 if
Shinya Kitaoka 120a6e
                          // no segment selected
Shinya Kitaoka 120a6e
                          // (functionpanel only)
Shinya Kitaoka 120a6e
  // assert(m_selectedSegment<0 || m_selectedKeyframes.size()==1)
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  TFrameHandle *m_frameHandle;
Shinya Kitaoka 120a6e
  ColumnToCurveMapper *m_columnToCurveMapper;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  int getCurveIndex(TDoubleParam *curve) const;
Shinya Kitaoka 120a6e
  // finds i : m_selectedKeyframes[i].first == curve
Shinya Kitaoka 120a6e
  //-1 if curve not found
Shinya Kitaoka 120a6e
  int touchCurveIndex(TDoubleParam *curve);
Shinya Kitaoka 120a6e
  // as getCurve(); if curve not found then add it
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
public:
Shinya Kitaoka 120a6e
  FunctionSelection();
Shinya Kitaoka 120a6e
  ~FunctionSelection();
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  void setFrameHandle(TFrameHandle *frameHandle) {
Shinya Kitaoka 120a6e
    m_frameHandle = frameHandle;
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  // function graph
Shinya Kitaoka 120a6e
  void selectCurve(TDoubleParam *curve);
Shinya Kitaoka 120a6e
  void deselectAllKeyframes();
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  // function sheet
Shinya Kitaoka 120a6e
  QRect getSelectedCells() const { return m_selectedCells; }
Shinya Kitaoka 120a6e
  void selectCells(const QRect &selectedCells,
Shinya Kitaoka 120a6e
                   const QList<tdoubleparam *=""> &curves);</tdoubleparam>
Shinya Kitaoka 120a6e
  void selectCells(const QRect &selectedCells);
Shinya Kitaoka 120a6e
  void deselectAllCells();
Shinya Kitaoka 120a6e
Shinya Kitaoka 473e70
  bool isEmpty() const override { return m_selectedKeyframes.empty(); }
Shinya Kitaoka 473e70
  void selectNone() override;
Shinya Kitaoka 120a6e
  void select(TDoubleParam *curve, int k);
Shinya Kitaoka 120a6e
  bool isSelected(TDoubleParam *curve, int k) const;
Shinya Kitaoka 120a6e
  void selectSegment(TDoubleParam *, int k,
Shinya Kitaoka 120a6e
                     QRect selectedCells = QRect());  // note: if a segment is
Shinya Kitaoka 120a6e
                                                      // selected then also the
Shinya Kitaoka 120a6e
                                                      // segment ends are
Shinya Kitaoka 120a6e
                                                      // selected
Shinya Kitaoka 120a6e
  int getSelectedKeyframeCount() const;
Shinya Kitaoka 120a6e
  QPair<tdoubleparam *,="" int=""> getSelectedKeyframe(int index)</tdoubleparam>
Shinya Kitaoka 120a6e
      const;  // if index<0 || index>=getSelectedKeyframeCount() returns (0,-1)
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  QPair<tdoubleparam *,="" int=""> getSelectedSegment()</tdoubleparam>
Shinya Kitaoka 120a6e
      const;  // if no segment is selected returns (0,-1)
Shinya Kitaoka 120a6e
  bool isSegmentSelected(TDoubleParam *, int k) const;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  void setColumnToCurveMapper(ColumnToCurveMapper *mapper);  // gets ownership
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  TDoubleParam *getCurveFromColumn(int columnIndex) const {
Shinya Kitaoka 120a6e
    return m_columnToCurveMapper ? m_columnToCurveMapper->getCurve(columnIndex)
Shinya Kitaoka 120a6e
                                 : 0;
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
Shinya Kitaoka 473e70
  void enableCommands() override;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  void doCopy();
Shinya Kitaoka 120a6e
  void doPaste();
Shinya Kitaoka 120a6e
  void doCut();
Shinya Kitaoka 120a6e
  void doDelete();
Shinya Kitaoka 120a6e
  void insertCells();
Toshihiro Shimizu 890ddd
shun-iwasawa 298c96
  // if inclusive == true, consider all segments overlapping the selection
shun-iwasawa 298c96
  void setStep(int, bool inclusive = true);
shun-iwasawa 298c96
  void setStep1() { setStep(1); }
shun-iwasawa 298c96
  void setStep2() { setStep(2); }
shun-iwasawa 298c96
  void setStep3() { setStep(3); }
shun-iwasawa 298c96
  void setStep4() { setStep(4); }
shun-iwasawa 298c96
shun-iwasawa 298c96
  // return step if all the selected segments has the same value.
shun-iwasawa 298c96
  // return -1 if the selection does not overlap any segments
shun-iwasawa 298c96
  // return 0 if the step value is uneven in the selection
shun-iwasawa 298c96
  // if inclusive == true, consider all segments overlapping the selection
shun-iwasawa 298c96
  int getCommonStep(bool inclusive = true);
shun-iwasawa 298c96
shun-iwasawa 298c96
  void setSegmentType(TDoubleKeyframe::Type type, bool inclusive = true);
shun-iwasawa 298c96
shun-iwasawa 298c96
  // return TDoubleKeyframe::Type value if the selected segments has the same
shun-iwasawa 298c96
  // interpolation type. return -1 if the selection does not overlap any
shun-iwasawa 298c96
  // segments return 0 (TDoubleKeyframe::None) if the interpolation is not
shun-iwasawa 298c96
  // identical in the selection if inclusive == true, consider all segments
shun-iwasawa 298c96
  // overlapping the selection
shun-iwasawa 298c96
  int getCommonSegmentType(bool inclusive = true);
shun-iwasawa 298c96
shun-iwasawa 23df06
  QList<int> getSelectedKeyIndices(TDoubleParam *curve);</int>
Toshihiro Shimizu 890ddd
signals:
Shinya Kitaoka 120a6e
  void selectionChanged();
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka d1f6c4
class FunctionKeyframesData final : public DvMimeData {
Toshihiro Shimizu 890ddd
public:
Shinya Kitaoka 120a6e
  FunctionKeyframesData();
Shinya Kitaoka 120a6e
  ~FunctionKeyframesData();
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  typedef std::vector<tdoublekeyframe> Keyframes;</tdoublekeyframe>
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  void setColumnCount(int columnCount);
Shinya Kitaoka 120a6e
  int getColumnCount() const { return (int)m_keyframes.size(); }
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  int getRowCount() const;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  void getData(int columnIndex, TDoubleParam *curve, double frame,
Shinya Kitaoka 120a6e
               const QSet<int> &kIndices);</int>
Shinya Kitaoka 120a6e
  void setData(int columnIndex, TDoubleParam *curve, double frame) const;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  const Keyframes &getKeyframes(int columnIndex) const;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 473e70
  DvMimeData *clone() const override;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  bool isCircularReferenceFree(int columnIndex, TDoubleParam *curve) const;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
private:
Shinya Kitaoka 120a6e
  std::vector<keyframes> m_keyframes;</keyframes>
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#endif