tahoma2d/toonz/sources/tnztools/tooloptionscontrols.h

594 lines
16 KiB
C
Raw Normal View History

2016-05-17 03:04:11 +12:00
#pragma once
2016-03-19 06:57:51 +13:00
#ifndef TOOL_OPTIONS_CONTROLS_INCLUDED
#define TOOL_OPTIONS_CONTROLS_INCLUDED
// TnzCore includes
#include "tproperty.h"
// TnzBase includes
#include "tunit.h"
#include "tdoubleparamrelayproperty.h"
// ToonzQt includes
#include "toonzqt/doublepairfield.h"
#include "toonzqt/intpairfield.h"
#include "toonzqt/intfield.h"
#include "toonzqt/styleindexlineedit.h"
#include "toonzqt/checkbox.h"
#include "toonzqt/doublefield.h"
#include "toonzqt/popupbutton.h"
// TnzLib includes
#include "toonz/txsheet.h"
#include "toonz/tstageobject.h"
#include "toonz/stageobjectutil.h"
2016-03-19 06:57:51 +13:00
// STD includes
#include <string>
// Qt includes
#include <QComboBox>
#include <QFontComboBox>
2016-03-19 06:57:51 +13:00
#include <QToolButton>
#include <QTimer>
#include <QLabel>
2016-03-19 06:57:51 +13:00
#undef DVAPI
#undef DVVAR
#ifdef TNZTOOLS_EXPORTS
#define DVAPI DV_EXPORT_API
#define DVVAR DV_EXPORT_VAR
#else
#define DVAPI DV_IMPORT_API
#define DVVAR DV_IMPORT_VAR
#endif
class TTool;
class TFrameHandle;
class TObjectHandle;
class TXsheetHandle;
class SelectionTool;
class ToolHandle;
//***********************************************************************************
// ToolOptionControl declaration
//***********************************************************************************
//! ToolOptionControl is the base class for tool property toolbar controls.
/*!
This class implements the basic methods the allow toolbar controls to
interact with the tool properties.
*/
2016-06-15 18:43:10 +12:00
class ToolOptionControl : public TProperty::Listener {
2016-03-19 06:57:51 +13:00
protected:
2016-06-15 18:43:10 +12:00
std::string m_propertyName;
TTool *m_tool;
ToolHandle *m_toolHandle;
2016-03-19 06:57:51 +13:00
public:
2016-06-15 18:43:10 +12:00
ToolOptionControl(TTool *tool, std::string propertyName,
ToolHandle *toolHandle = 0);
2016-03-19 06:57:51 +13:00
2016-06-15 18:43:10 +12:00
const std::string &propertyName() const { return m_propertyName; }
2016-03-19 06:57:51 +13:00
2016-06-19 20:06:29 +12:00
void onPropertyChanged() override { updateStatus(); }
void notifyTool(bool addToUndo = false);
2016-06-15 18:43:10 +12:00
// return true if the control is belonging to the visible viewer
bool isInVisibleViewer(QWidget *widget);
2016-03-19 06:57:51 +13:00
2016-06-15 18:43:10 +12:00
virtual void updateStatus() = 0;
2016-03-19 06:57:51 +13:00
};
//***********************************************************************************
// ToolOptionControl derivative declarations
//***********************************************************************************
class ToolOptionCheckbox final : public DVGui::CheckBox,
public ToolOptionControl {
2016-06-15 18:43:10 +12:00
Q_OBJECT
2016-03-19 06:57:51 +13:00
protected:
2016-06-15 18:43:10 +12:00
TBoolProperty *m_property;
2016-03-19 06:57:51 +13:00
public:
2016-06-15 18:43:10 +12:00
ToolOptionCheckbox(TTool *tool, TBoolProperty *property,
ToolHandle *toolHandle = 0, QWidget *parent = 0);
2016-06-19 20:06:29 +12:00
void updateStatus() override;
2017-11-08 17:21:55 +13:00
protected:
void nextCheckState() override;
2016-03-19 06:57:51 +13:00
};
//-----------------------------------------------------------------------------
class ToolOptionSlider final : public DVGui::DoubleField,
public ToolOptionControl {
2016-06-15 18:43:10 +12:00
Q_OBJECT
2016-03-19 06:57:51 +13:00
protected:
2016-06-15 18:43:10 +12:00
TDoubleProperty *m_property;
2016-03-19 06:57:51 +13:00
public:
2016-06-15 18:43:10 +12:00
ToolOptionSlider(TTool *tool, TDoubleProperty *property,
ToolHandle *toolHandle = 0);
2016-06-19 20:06:29 +12:00
void updateStatus() override;
2016-03-19 06:57:51 +13:00
protected slots:
2016-06-15 18:43:10 +12:00
void onValueChanged(bool isDragging);
2016-03-19 06:57:51 +13:00
};
//-----------------------------------------------------------------------------
class ToolOptionPairSlider final : public DVGui::DoublePairField,
public ToolOptionControl {
2016-06-15 18:43:10 +12:00
Q_OBJECT
2016-03-19 06:57:51 +13:00
protected:
2016-06-15 18:43:10 +12:00
TDoublePairProperty *m_property;
2016-03-19 06:57:51 +13:00
public:
2016-06-15 18:43:10 +12:00
ToolOptionPairSlider(TTool *tool, TDoublePairProperty *property,
const QString &leftName, const QString &rightName,
ToolHandle *toolHandle = 0);
2016-06-19 20:06:29 +12:00
void updateStatus() override;
2016-03-19 06:57:51 +13:00
protected slots:
2016-06-15 18:43:10 +12:00
void onValuesChanged(bool isDragging);
2016-03-19 06:57:51 +13:00
};
//-----------------------------------------------------------------------------
class ToolOptionIntPairSlider final : public DVGui::IntPairField,
public ToolOptionControl {
2016-06-15 18:43:10 +12:00
Q_OBJECT
2016-03-19 06:57:51 +13:00
protected:
2016-06-15 18:43:10 +12:00
TIntPairProperty *m_property;
2016-03-19 06:57:51 +13:00
public:
2016-06-15 18:43:10 +12:00
ToolOptionIntPairSlider(TTool *tool, TIntPairProperty *property,
const QString &leftName, const QString &rightName,
ToolHandle *toolHandle = 0);
2016-06-19 20:06:29 +12:00
void updateStatus() override;
2016-03-19 06:57:51 +13:00
protected slots:
2016-06-15 18:43:10 +12:00
void onValuesChanged(bool isDragging);
2016-03-19 06:57:51 +13:00
};
//-----------------------------------------------------------------------------
class ToolOptionIntSlider final : public DVGui::IntField,
public ToolOptionControl {
2016-06-15 18:43:10 +12:00
Q_OBJECT
2016-03-19 06:57:51 +13:00
protected:
2016-06-15 18:43:10 +12:00
TIntProperty *m_property;
2016-03-19 06:57:51 +13:00
public:
2016-06-15 18:43:10 +12:00
ToolOptionIntSlider(TTool *tool, TIntProperty *property,
ToolHandle *toolHandle = 0);
2016-06-19 20:06:29 +12:00
void updateStatus() override;
2016-03-19 06:57:51 +13:00
protected slots:
2016-06-15 18:43:10 +12:00
void onValueChanged(bool isDragging);
2016-03-19 06:57:51 +13:00
};
//-----------------------------------------------------------------------------
class ToolOptionCombo final : public QComboBox, public ToolOptionControl {
2016-06-15 18:43:10 +12:00
Q_OBJECT
2016-03-19 06:57:51 +13:00
protected:
2016-06-15 18:43:10 +12:00
TEnumProperty *m_property;
2016-03-19 06:57:51 +13:00
public:
2016-06-15 18:43:10 +12:00
ToolOptionCombo(TTool *tool, TEnumProperty *property,
ToolHandle *toolHandle = 0);
void updateStatus() override;
TEnumProperty *getProperty() const { return m_property; }
public slots:
void reloadComboBoxList(std::string);
2016-06-15 18:43:10 +12:00
void loadEntries();
void onActivated(int);
};
//-----------------------------------------------------------------------------
class ToolOptionFontCombo final : public QFontComboBox,
public ToolOptionControl {
Q_OBJECT
protected:
TEnumProperty *m_property;
public:
ToolOptionFontCombo(TTool *tool, TEnumProperty *property,
ToolHandle *toolHandle = 0);
2016-06-19 20:06:29 +12:00
void updateStatus() override;
2016-03-19 06:57:51 +13:00
2018-05-31 17:18:15 +12:00
TEnumProperty *getProperty() const { return m_property; }
2016-03-19 06:57:51 +13:00
public slots:
2016-06-15 18:43:10 +12:00
void onActivated(int);
2016-03-19 06:57:51 +13:00
};
//-----------------------------------------------------------------------------
class ToolOptionPopupButton final : public PopupButton,
public ToolOptionControl {
2016-06-15 18:43:10 +12:00
Q_OBJECT
2016-03-19 06:57:51 +13:00
protected:
2016-06-15 18:43:10 +12:00
TEnumProperty *m_property;
2016-03-19 06:57:51 +13:00
public:
2016-06-15 18:43:10 +12:00
ToolOptionPopupButton(TTool *tool, TEnumProperty *property);
2016-06-19 20:06:29 +12:00
void updateStatus() override;
2016-06-15 18:43:10 +12:00
TEnumProperty *getProperty() { return m_property; }
2016-03-19 06:57:51 +13:00
public slots:
2016-06-15 18:43:10 +12:00
void onActivated(int);
void doSetCurrentIndex(int);
2016-03-19 06:57:51 +13:00
};
//-----------------------------------------------------------------------------
class ToolOptionTextField final : public DVGui::LineEdit,
public ToolOptionControl {
2016-06-15 18:43:10 +12:00
Q_OBJECT
2016-03-19 06:57:51 +13:00
protected:
2016-06-15 18:43:10 +12:00
TStringProperty *m_property;
2016-03-19 06:57:51 +13:00
public:
2016-06-15 18:43:10 +12:00
ToolOptionTextField(TTool *tool, TStringProperty *property);
2016-06-19 20:06:29 +12:00
void updateStatus() override;
2016-03-19 06:57:51 +13:00
public slots:
2016-06-15 18:43:10 +12:00
void onValueChanged();
2016-03-19 06:57:51 +13:00
};
//-----------------------------------------------------------------------------
class StyleIndexFieldAndChip final : public DVGui::StyleIndexLineEdit,
public ToolOptionControl {
2016-06-15 18:43:10 +12:00
Q_OBJECT
2016-03-19 06:57:51 +13:00
protected:
2016-06-15 18:43:10 +12:00
TStyleIndexProperty *m_property;
TPaletteHandle *m_pltHandle;
2016-03-19 06:57:51 +13:00
public:
2016-06-15 18:43:10 +12:00
StyleIndexFieldAndChip(TTool *tool, TStyleIndexProperty *property,
TPaletteHandle *pltHandle, ToolHandle *toolHandle = 0);
2016-06-19 20:06:29 +12:00
void updateStatus() override;
2016-03-19 06:57:51 +13:00
public slots:
2016-06-15 18:43:10 +12:00
void onValueChanged(const QString &);
void updateColor();
2016-03-19 06:57:51 +13:00
};
//-----------------------------------------------------------------------------
//! The ToolOptionMeasuredDoubleField class implements toolbar controls for
//! double properties that need to be displayed with a measure.
/*!
2016-06-15 18:43:10 +12:00
This option control is useful to display function editor curves in the
toolbar;
2016-03-19 06:57:51 +13:00
in particular, it deals with the following tasks:
\li Setting the preference-based keyframe interpolation type
2016-06-15 18:43:10 +12:00
\li Editing with global keyframes (ie affecting multiple parameters other than
the edited one)
2016-03-19 06:57:51 +13:00
\li Undo/Redo of user interactions.
*/
class ToolOptionParamRelayField final : public DVGui::MeasuredDoubleLineEdit,
public ToolOptionControl {
2016-06-15 18:43:10 +12:00
Q_OBJECT
2016-03-19 06:57:51 +13:00
2016-06-15 18:43:10 +12:00
TDoubleParamP m_param; //!< Cached property param
TMeasure *m_measure; //!< Cached property param measure
2016-03-19 06:57:51 +13:00
protected:
2016-06-15 18:43:10 +12:00
TDoubleParamRelayProperty
*m_property; //!< The TDoubleParam relaying property
2016-03-19 06:57:51 +13:00
2016-06-15 18:43:10 +12:00
TBoolProperty *m_globalKey; //!< The property enforcing global keys
TPropertyGroup *m_globalGroup; //!< The property group whose properties
//!< are affected by m_globalKey
2016-03-19 06:57:51 +13:00
public:
2016-06-15 18:43:10 +12:00
ToolOptionParamRelayField(TTool *tool, TDoubleParamRelayProperty *property,
int decimals = 2);
2016-03-19 06:57:51 +13:00
2016-06-15 18:43:10 +12:00
void setGlobalKey(TBoolProperty *globalKey, TPropertyGroup *globalGroup);
2016-03-19 06:57:51 +13:00
2016-06-19 20:06:29 +12:00
void updateStatus() override;
2016-03-19 06:57:51 +13:00
protected slots:
2016-06-15 18:43:10 +12:00
virtual void onValueChanged();
2016-03-19 06:57:51 +13:00
};
//=============================================================================
//
// Widget specifici di ArrowTool (derivati da ToolOptionControl)
//
//=============================================================================
2016-06-15 18:43:10 +12:00
class DVAPI MeasuredValueField : public DVGui::LineEdit {
Q_OBJECT
2016-03-19 06:57:51 +13:00
2016-06-15 18:43:10 +12:00
TMeasuredValue *m_value;
bool m_modified;
double m_errorHighlighting;
QTimer m_errorHighlightingTimer;
int m_xMouse = -1;
2016-06-15 18:43:10 +12:00
int m_precision;
bool m_mouseEdit = false;
bool m_labelClicked = false;
double m_originalValue;
2017-11-25 01:13:52 +13:00
bool m_isTyping = false;
2016-03-19 06:57:51 +13:00
protected:
2016-06-15 18:43:10 +12:00
bool m_isGlobalKeyframe;
2016-03-19 06:57:51 +13:00
// these are used for mouse dragging to edit a value
void mousePressEvent(QMouseEvent *) override;
void mouseMoveEvent(QMouseEvent *) override;
void mouseReleaseEvent(QMouseEvent *) override;
2017-11-25 01:13:52 +13:00
void focusOutEvent(QFocusEvent *) override;
2016-03-19 06:57:51 +13:00
public:
2016-06-15 18:43:10 +12:00
MeasuredValueField(QWidget *parent, QString name = "numfield");
~MeasuredValueField();
2016-03-19 06:57:51 +13:00
2016-06-15 18:43:10 +12:00
void setMeasure(std::string name);
2016-03-19 06:57:51 +13:00
2016-06-15 18:43:10 +12:00
void enableGlobalKeyframe(bool isGlobalKeyframe) {
m_isGlobalKeyframe = isGlobalKeyframe;
}
2016-03-19 06:57:51 +13:00
2016-06-15 18:43:10 +12:00
TMeasuredValue *getMeasuredValue() const { return m_value; }
2016-03-19 06:57:51 +13:00
2016-06-15 18:43:10 +12:00
void setValue(double v);
double getValue() const;
2016-03-19 06:57:51 +13:00
2016-06-15 18:43:10 +12:00
void setPrecision(int precision);
int getPrecision() { return m_precision; }
2016-03-19 06:57:51 +13:00
protected slots:
2016-06-15 18:43:10 +12:00
void commit();
void onTextChanged(const QString &);
void errorHighlightingTick();
2016-03-19 06:57:51 +13:00
// clicking on the label connected to a field
// can be used to drag and change the value
void receiveMouseMove(QMouseEvent *event);
void receiveMousePress(QMouseEvent *event);
void receiveMouseRelease(QMouseEvent *event);
2016-03-19 06:57:51 +13:00
signals:
void measuredValueChanged(TMeasuredValue *value, bool addToUndo = true);
2016-03-19 06:57:51 +13:00
};
//-----------------------------------------------------------------------------
class PegbarChannelField final : public MeasuredValueField,
public ToolOptionControl {
2016-06-15 18:43:10 +12:00
Q_OBJECT
2016-03-19 06:57:51 +13:00
2016-06-15 18:43:10 +12:00
const enum TStageObject::Channel m_actionId;
TFrameHandle *m_frameHandle;
TObjectHandle *m_objHandle;
TXsheetHandle *m_xshHandle;
enum ScaleType { eNone = 0, eAR = 1, eMass = 2 } m_scaleType;
TStageObjectValues m_before;
bool m_firstMouseDrag = false;
2016-03-19 06:57:51 +13:00
public:
2016-06-15 18:43:10 +12:00
PegbarChannelField(TTool *tool, enum TStageObject::Channel actionId,
QString name, TFrameHandle *frameHandle,
TObjectHandle *objHandle, TXsheetHandle *xshHandle,
QWidget *parent = 0);
2016-03-19 06:57:51 +13:00
2016-06-15 18:43:10 +12:00
~PegbarChannelField() {}
2016-03-19 06:57:51 +13:00
2016-06-19 20:06:29 +12:00
void updateStatus() override;
2016-03-19 06:57:51 +13:00
public slots:
2016-06-15 18:43:10 +12:00
void onScaleTypeChanged(int type);
2016-03-19 06:57:51 +13:00
protected slots:
// add to undo is only false if mouse dragging to change the value
// on mouse release, add to undo is true
void onChange(TMeasuredValue *fld, bool addToUndo = true);
2016-03-19 06:57:51 +13:00
};
//-----------------------------------------------------------------------------
class DVAPI PegbarCenterField final : public MeasuredValueField,
public ToolOptionControl {
2016-06-15 18:43:10 +12:00
Q_OBJECT
2016-03-19 06:57:51 +13:00
2016-06-15 18:43:10 +12:00
int m_index; // 0 = x, 1 = y
TObjectHandle *m_objHandle;
TXsheetHandle *m_xshHandle;
TPointD m_oldCenter;
bool m_firstMouseDrag = false;
2016-03-19 06:57:51 +13:00
public:
2016-06-15 18:43:10 +12:00
PegbarCenterField(TTool *tool, int index, QString name,
TObjectHandle *objHandle, TXsheetHandle *xshHandle,
QWidget *parent = 0);
2016-03-19 06:57:51 +13:00
2016-06-15 18:43:10 +12:00
~PegbarCenterField() {}
2016-03-19 06:57:51 +13:00
2016-06-19 20:06:29 +12:00
void updateStatus() override;
2016-03-19 06:57:51 +13:00
protected slots:
// add to undo is only false if mouse dragging to change the value
// on mouse release, add to undo is true
void onChange(TMeasuredValue *fld, bool addToUndo = true);
2016-03-19 06:57:51 +13:00
};
//-----------------------------------------------------------------------------
class NoScaleField final : public MeasuredValueField, public ToolOptionControl {
2016-06-15 18:43:10 +12:00
Q_OBJECT
2016-03-19 06:57:51 +13:00
public:
2016-06-15 18:43:10 +12:00
NoScaleField(TTool *tool, QString name);
~NoScaleField() {}
2016-03-19 06:57:51 +13:00
2016-06-19 20:06:29 +12:00
void updateStatus() override;
2016-03-19 06:57:51 +13:00
protected slots:
// add to undo is only false if mouse dragging to change the value
// on mouse release, add to undo is true
void onChange(TMeasuredValue *fld, bool addToUndo = true);
2016-03-19 06:57:51 +13:00
};
//-----------------------------------------------------------------------------
class PropertyMenuButton final : public QToolButton, public ToolOptionControl {
2016-06-15 18:43:10 +12:00
Q_OBJECT
2016-03-19 06:57:51 +13:00
2016-06-15 18:43:10 +12:00
QList<TBoolProperty *> m_properties;
2016-03-19 06:57:51 +13:00
public:
2016-06-15 18:43:10 +12:00
PropertyMenuButton(
QWidget *parent = 0, TTool *tool = 0,
QList<TBoolProperty *> properties = QList<TBoolProperty *>(),
QIcon icon = QIcon(), QString tooltip = QString());
~PropertyMenuButton() {}
2016-03-19 06:57:51 +13:00
2016-06-19 20:06:29 +12:00
void updateStatus() override;
2016-03-19 06:57:51 +13:00
protected slots:
2016-06-15 18:43:10 +12:00
void onActionTriggered(QAction *);
2016-03-19 06:57:51 +13:00
signals:
2016-06-15 18:43:10 +12:00
void onPropertyChanged(QString name);
2016-03-19 06:57:51 +13:00
};
//-----------------------------------------------------------------------------
class SelectionScaleField final : public MeasuredValueField {
2016-06-15 18:43:10 +12:00
Q_OBJECT
2016-03-19 06:57:51 +13:00
2016-06-15 18:43:10 +12:00
int m_id;
SelectionTool *m_tool;
double m_originalValue;
2016-03-19 06:57:51 +13:00
public:
2016-06-15 18:43:10 +12:00
SelectionScaleField(SelectionTool *tool, int actionId, QString name);
2016-03-19 06:57:51 +13:00
2016-06-15 18:43:10 +12:00
~SelectionScaleField() {}
2016-03-19 06:57:51 +13:00
2016-06-15 18:43:10 +12:00
void updateStatus();
bool applyChange(bool addToUndo = true);
2016-03-19 06:57:51 +13:00
protected slots:
// add to undo is only false if mouse dragging to change the value
// on mouse release, add to undo is true
void onChange(TMeasuredValue *fld, bool addToUndo = true);
2016-03-19 06:57:51 +13:00
signals:
void valueChange(bool addToUndo);
2016-03-19 06:57:51 +13:00
};
//-----------------------------------------------------------------------------
class SelectionRotationField final : public MeasuredValueField {
2016-06-15 18:43:10 +12:00
Q_OBJECT
2016-03-19 06:57:51 +13:00
2016-06-15 18:43:10 +12:00
SelectionTool *m_tool;
2016-03-19 06:57:51 +13:00
public:
2016-06-15 18:43:10 +12:00
SelectionRotationField(SelectionTool *tool, QString name);
2016-03-19 06:57:51 +13:00
2016-06-15 18:43:10 +12:00
~SelectionRotationField() {}
2016-03-19 06:57:51 +13:00
2016-06-15 18:43:10 +12:00
void updateStatus();
2016-03-19 06:57:51 +13:00
protected slots:
// add to undo is only false if mouse dragging to change the value
// on mouse release, add to undo is true
void onChange(TMeasuredValue *fld, bool addToUndo = true);
2016-03-19 06:57:51 +13:00
};
//-----------------------------------------------------------------------------
class SelectionMoveField final : public MeasuredValueField {
2016-06-15 18:43:10 +12:00
Q_OBJECT
2016-03-19 06:57:51 +13:00
2016-06-15 18:43:10 +12:00
int m_id;
SelectionTool *m_tool;
2016-03-19 06:57:51 +13:00
public:
2016-06-15 18:43:10 +12:00
SelectionMoveField(SelectionTool *tool, int id, QString name);
2016-03-19 06:57:51 +13:00
2016-06-15 18:43:10 +12:00
~SelectionMoveField() {}
2016-03-19 06:57:51 +13:00
2016-06-15 18:43:10 +12:00
void updateStatus();
2016-03-19 06:57:51 +13:00
protected slots:
// add to undo is only false if mouse dragging to change the value
// on mouse release, add to undo is true
void onChange(TMeasuredValue *fld, bool addToUndo = true);
2016-03-19 06:57:51 +13:00
};
//-----------------------------------------------------------------------------
class ThickChangeField final : public MeasuredValueField {
2016-06-15 18:43:10 +12:00
Q_OBJECT
2016-03-19 06:57:51 +13:00
2016-06-15 18:43:10 +12:00
SelectionTool *m_tool;
2016-03-19 06:57:51 +13:00
public:
2016-06-15 18:43:10 +12:00
ThickChangeField(SelectionTool *tool, QString name);
2016-03-19 06:57:51 +13:00
2016-06-15 18:43:10 +12:00
~ThickChangeField() {}
2016-03-19 06:57:51 +13:00
2016-06-15 18:43:10 +12:00
void updateStatus();
2016-03-19 06:57:51 +13:00
protected slots:
void onChange(TMeasuredValue *fld, bool addToUndo = true);
2016-03-19 06:57:51 +13:00
};
//-----------------------------------------------------------------------------
// The ClickableLabel class is used to allow click and dragging
// on a label to change the value of a linked field
class ClickableLabel : public QLabel {
Q_OBJECT
protected:
void mousePressEvent(QMouseEvent *) override;
void mouseMoveEvent(QMouseEvent *) override;
void mouseReleaseEvent(QMouseEvent *) override;
public:
ClickableLabel(const QString &text, QWidget *parent = nullptr,
Qt::WindowFlags f = Qt::WindowFlags());
~ClickableLabel();
signals:
void onMousePress(QMouseEvent *event);
void onMouseMove(QMouseEvent *event);
void onMouseRelease(QMouseEvent *event);
};
//-----------------------------------------------------------------------------
2016-03-19 06:57:51 +13:00
#endif