Shinya Kitaoka 810553
#pragma once
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#ifndef _EDITTOOLGADGETS_H_
Toshihiro Shimizu 890ddd
#define _EDITTOOLGADGETS_H_
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
// TnzCore includes
Toshihiro Shimizu 890ddd
#include "tgeometry.h"
Toshihiro Shimizu 890ddd
#include "tgl.h"
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
// TnzBase includes
Toshihiro Shimizu 890ddd
#include "tparamchange.h"
Toshihiro Shimizu 890ddd
#include "tdoubleparam.h"
Toshihiro Shimizu 890ddd
#include "tparamset.h"
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
// Qt includes
Toshihiro Shimizu 890ddd
#include <qobject></qobject>
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//=================================================
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//    Forward declarations
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
class TMouseEvent;
Toshihiro Shimizu 890ddd
class TFxHandle;
Toshihiro Shimizu 890ddd
class TTool;
Toshihiro Shimizu 890ddd
class FxParamsGraphicEditor;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
class FxGadgetController;
Toshihiro Shimizu 890ddd
class TUndo;
Toshihiro Shimizu 890ddd
class TParamUIConcept;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//=================================================
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
class FxGadget : public TParamObserver {
Shinya Kitaoka 120a6e
  GLuint m_id;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  std::vector<tdoubleparamp> m_params;</tdoubleparamp>
Shinya Kitaoka 120a6e
  double m_pixelSize;
Shinya Kitaoka 120a6e
  std::string m_label;
Shinya Kitaoka 120a6e
  TUndo *m_undo;
Shinya Kitaoka 120a6e
  double m_scaleFactor;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
protected:
Shinya Kitaoka 120a6e
  FxGadgetController *m_controller;
shun-iwasawa 6817df
  int m_handleCount = 1;
shun-iwasawa 6817df
  // -1 : not selected, 0~ : handle id
shun-iwasawa 6817df
  int m_selected;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
public:
Shinya Kitaoka 120a6e
  static GLdouble m_selectedColor[3];  // rgb
Toshihiro Shimizu 890ddd
shun-iwasawa 6817df
  FxGadget(FxGadgetController *controller, int handleCount = 1);
Shinya Kitaoka 120a6e
  virtual ~FxGadget();
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  void setLabel(std::string label) { m_label = label; }
Shinya Kitaoka 120a6e
  std::string getLabel() const { return m_label; }
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  FxGadgetController *getController() const { return m_controller; }
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  void addParam(const TDoubleParamP ¶m);
Shinya Kitaoka 120a6e
  double getValue(const TDoubleParamP ¶m) const;
Shinya Kitaoka 120a6e
  void setValue(const TDoubleParamP ¶m, double value);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  TPointD getValue(const TPointParamP ¶m) const;
Shinya Kitaoka 120a6e
  void setValue(const TPointParamP ¶m, const TPointD &pos);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  void setId(GLuint id) { m_id = id; }
Shinya Kitaoka 120a6e
  GLuint getId() const { return m_id; }
Toshihiro Shimizu 890ddd
shun-iwasawa 6817df
  int getHandleCount() { return m_handleCount; }
shun-iwasawa 6817df
shun-iwasawa 6817df
  void select(int selected) { m_selected = selected; }
shun-iwasawa 6817df
  bool isSelected() const { return m_selected >= 0; }
shun-iwasawa 6817df
  bool isSelected(int id) const { return m_selected == id; }
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  void setPixelSize();  // uses tglGetPixelSize2()
Shinya Kitaoka 120a6e
  void setPixelSize(double pixelSize) { m_pixelSize = pixelSize; }
Shinya Kitaoka 120a6e
  inline double getPixelSize() const { return m_pixelSize; }
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  void drawDot(const TPointD &pos);
Shinya Kitaoka 120a6e
  void drawDot(double x, double y) { drawDot(TPointD(x, y)); }
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  void drawTooltip(const TPointD &tooltipPos, std::string tooltipPosText);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  virtual void draw(bool picking) = 0;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  virtual void leftButtonDown(const TPointD &pos, const TMouseEvent &) {}
Shinya Kitaoka 120a6e
  virtual void leftButtonDrag(const TPointD &pos, const TMouseEvent &) {}
Shinya Kitaoka 120a6e
  virtual void leftButtonUp(const TPointD &pos, const TMouseEvent &) {}
Toshihiro Shimizu 890ddd
Shinya Kitaoka 473e70
  void onChange(const TParamChange &) override;
Shinya Kitaoka 120a6e
  void createUndo();
Shinya Kitaoka 120a6e
  void commitUndo();
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  void setScaleFactor(double s) { m_scaleFactor = s; }
Shinya Kitaoka 120a6e
  double getScaleFactor() const { return m_scaleFactor; }
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
namespace EditToolGadgets {
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//=============================================================================
Toshihiro Shimizu 890ddd
// DragTool
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
class DragTool {
Toshihiro Shimizu 890ddd
public:
Shinya Kitaoka 120a6e
  virtual void leftButtonDown(const TPointD &pos, const TMouseEvent &) = 0;
Shinya Kitaoka 120a6e
  virtual void leftButtonDrag(const TPointD &pos, const TMouseEvent &) = 0;
Shinya Kitaoka 120a6e
  virtual void leftButtonUp(const TPointD &pos, const TMouseEvent &)   = 0;
Shinya Kitaoka 120a6e
  virtual ~DragTool() {}
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  virtual void enableGlobalKeyframes(bool enabled) {}
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
shun-iwasawa 6817df
}  // namespace EditToolGadgets
Toshihiro Shimizu 890ddd
Shinya Kitaoka d1f6c4
class FxGadgetController final : public QObject {
Shinya Kitaoka 120a6e
  Q_OBJECT
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  TTool *m_tool;
Shinya Kitaoka 120a6e
  TFxHandle *m_fxHandle;
Shinya Kitaoka 120a6e
  std::vector<fxgadget *=""> m_gadgets;</fxgadget>
Shinya Kitaoka 120a6e
  unsigned long m_idBase, m_nextId;
Shinya Kitaoka 120a6e
  std::map<gluint, *="" fxgadget=""> m_idTable;</gluint,>
Shinya Kitaoka 120a6e
  FxGadget *m_selectedGadget;
Shinya Kitaoka 120a6e
  bool m_editingNonZeraryFx;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
public:
Shinya Kitaoka 120a6e
  FxGadgetController(TTool *tool);
Shinya Kitaoka 120a6e
  ~FxGadgetController();
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  void clearGadgets();
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  TAffine getMatrix();
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  void draw(bool picking = false);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  void selectById(unsigned int id);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  EditToolGadgets::DragTool *createDragTool(int gadgetId);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  void assignId(FxGadget *gadget);
Shinya Kitaoka 120a6e
  void addGadget(FxGadget *gadget);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  int getCurrentFrame() const;
Shinya Kitaoka 120a6e
  void invalidateViewer();
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  bool isEditingNonZeraryFx() const { return m_editingNonZeraryFx; }
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  bool hasGadget() { return m_gadgets.size() != 0; }
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
public slots:
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  void onFxSwitched();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
private:
Shinya Kitaoka 120a6e
  FxGadget *allocateGadget(const TParamUIConcept &uiConcept);
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#endif