#ifndef FUNCTIONSHEET_H
#define FUNCTIONSHEET_H
#include "tcommon.h"
#include "functiontreeviewer.h"
#include "spreadsheetviewer.h"
#include "functionselection.h"
#include "toonzqt/lineedit.h"
#include <QWidget>
#include <set>
#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
class FunctionSheet;
class TDoubleParam;
class TFrameHandle;
class FunctionSelection;
class FunctionSheetRowViewer : public Spreadsheet::RowPanel
{
FunctionSheet *m_sheet;
public:
FunctionSheetRowViewer(FunctionSheet *parent);
protected:
void paintEvent(QPaintEvent *);
void mousePressEvent(QMouseEvent *);
void mouseReleaseEvent(QMouseEvent *);
void mouseMoveEvent(QMouseEvent *);
void contextMenuEvent(QContextMenuEvent *);
};
class FunctionSheetColumnHeadViewer : public Spreadsheet::ColumnPanel
{
FunctionSheet *m_sheet;
//enable drag and drop the expression arguments
QPoint m_dragStartPosition;
FunctionTreeModel::Channel *m_draggingChannel;
public:
FunctionSheetColumnHeadViewer(FunctionSheet *parent);
protected:
void paintEvent(QPaintEvent *);
void mousePressEvent(QMouseEvent *);
//update the tooltip
void mouseMoveEvent(QMouseEvent *);
void contextMenuEvent(QContextMenuEvent *);
};
class FunctionSheetCellViewer : public Spreadsheet::CellPanel
{
Q_OBJECT
FunctionSheet *m_sheet;
DVGui::LineEdit *m_lineEdit;
int m_editRow, m_editCol;
public:
FunctionSheetCellViewer(FunctionSheet *parent);
Spreadsheet::DragTool *createDragTool(QMouseEvent *);
protected:
void drawCells(QPainter &p, int r0, int c0, int r1, int c1);
void mouseDoubleClickEvent(QMouseEvent *);
void mousePressEvent(QMouseEvent *);
void mouseReleaseEvent(QMouseEvent *);
void mouseMoveEvent(QMouseEvent *);
void openContextMenu(QMouseEvent *);
private slots:
void onCellEditorEditingFinished();
};
class FunctionSheet : public SpreadsheetViewer
{
Q_OBJECT
public:
FunctionSheet(QWidget *parent = 0);
~FunctionSheet();
void setModel(FunctionTreeModel *model);
FunctionTreeModel *getModel() const { return m_functionTreeModel; }
void setViewer(FunctionViewer *viewer);
FunctionViewer *getViewer() const { return m_functionViewer; }
void setCurrentFrame(int frame);
int getCurrentFrame() const;
int getChannelCount();
TDoubleParam *getCurve(int column);
FunctionTreeModel::Channel *getChannel(int column);
QRect getSelectedCells() const;
void selectCells(const QRect &selectedCells);
FunctionSelection *getSelection() const { return m_selection; }
void setSelection(FunctionSelection *selection); // does NOT get ownership
QString getSelectedParamName();
int getColumnIndexByCurve(TDoubleParam *param) const;
bool anyWidgetHasFocus();
protected:
void showEvent(QShowEvent *e);
void hideEvent(QHideEvent *e);
private:
FunctionSheetRowViewer *m_rowViewer;
FunctionSheetColumnHeadViewer *m_columnHeadViewer;
FunctionSheetCellViewer *m_cellViewer;
FunctionSelection *m_selection;
FunctionTreeModel *m_functionTreeModel;
FunctionViewer *m_functionViewer;
QRect m_selectedCells;
public slots:
void updateAll();
void onFrameSwitched();
/*--- カレントChannelが切り替わったら、NumericalColumnsがそのChannelを表示できるようにスクロールする。---*/
void onCurrentChannelChanged(FunctionTreeModel::Channel *);
};
#endif