Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#ifndef DVSCROLLWIDGET_H
Toshihiro Shimizu 890ddd
#define DVSCROLLWIDGET_H
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
// TnzCore includes
Toshihiro Shimizu 890ddd
#include "tcommon.h"
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
// Qt includes
Toshihiro Shimizu 890ddd
#include <qframe></qframe>
Toshihiro Shimizu 890ddd
#include <qeasingcurve></qeasingcurve>
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
//====================================================
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//    Forward declarations
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
class FreeLayout;
Toshihiro Shimizu 890ddd
class QPropertyAnimation;
Toshihiro Shimizu 890ddd
class QPushButton;
Toshihiro Shimizu 890ddd
class QTimer;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//====================================================
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//****************************************************************************
Toshihiro Shimizu 890ddd
//    DvScrollWidget class
Toshihiro Shimizu 890ddd
//****************************************************************************
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*!
Toshihiro Shimizu 890ddd
  \brief    The DvScrollWidget class is a QScrollArea-like container
Toshihiro Shimizu 890ddd
            widget for monodirectional scrolling.
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
  \details  Unlike a QScrollArea, scrolling is enforced using directional buttons
Toshihiro Shimizu 890ddd
            at the side of the content whose activation performs animated scrolling
Toshihiro Shimizu 890ddd
            by half a widget in the represented direction.
Toshihiro Shimizu 890ddd
            Alternatively, free-scroll is available by default where mouse events
Toshihiro Shimizu 890ddd
            are un-accepted by the content's child widgets.
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
            The push buttons at the side of the content appear only when there is
Toshihiro Shimizu 890ddd
            available content space in that direction. They are \a empty by default,
Toshihiro Shimizu 890ddd
            but can be filled in or styled with a style sheet.
Toshihiro Shimizu 890ddd
            In the latter case, they are given an object name dependant on the
Toshihiro Shimizu 890ddd
            scroll orientation - in the form <tt>Scroll<left down="" right="" up="">Button</left></tt>.
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
  \note     The default size QSizePolicy for DvScrollWidget is \p Preferred in
Toshihiro Shimizu 890ddd
            the orientation direction, and \p Fixed in the other.
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
  \sa       The FreeLayout class.
Toshihiro Shimizu 890ddd
*/
Toshihiro Shimizu 890ddd
class DVAPI DvScrollWidget : public QFrame
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	Q_OBJECT
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	QWidget *m_content;
Toshihiro Shimizu 890ddd
	QPushButton *m_scrollBackward,
Toshihiro Shimizu 890ddd
		*m_scrollForward;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	QPropertyAnimation *m_animation;
Toshihiro Shimizu 890ddd
	QEasingCurve m_clickEase,
Toshihiro Shimizu 890ddd
		m_holdEase;
Toshihiro Shimizu 890ddd
	QTimer *m_backwardTimer,
Toshihiro Shimizu 890ddd
		*m_forwardTimer;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	int m_mousePos;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	bool m_horizontal,
Toshihiro Shimizu 890ddd
		m_pressed,
Toshihiro Shimizu 890ddd
		m_heldRelease,
Toshihiro Shimizu 890ddd
		m_heldClick;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
public:
Toshihiro Shimizu 890ddd
	DvScrollWidget(QWidget *parent = 0, Qt::Orientation = Qt::Horizontal);
Toshihiro Shimizu 890ddd
	~DvScrollWidget() {}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	/*! \remark Ownership is \a transferred to this class. Any previously set widget
Toshihiro Shimizu 890ddd
              is deleted before being replaced.                                               */
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	void setWidget(QWidget *widget); //!< Sets the scrollable content widget.
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	/*! \note   Function setOrientation() restores the widget's size policy to
Toshihiro Shimizu 890ddd
              \p Preferred in the specified direction, and \p Fixed in the other.             */
Toshihiro Shimizu 890ddd
	void setOrientation(Qt::Orientation orientation);
Toshihiro Shimizu 890ddd
	Qt::Orientation getOrientation() const;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	void setEasing(QEasingCurve clickEase, QEasingCurve holdPressEase);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	void scroll(int dx, int duration = 0, QEasingCurve easing = QEasingCurve(QEasingCurve::OutCubic));
Toshihiro Shimizu 890ddd
	void scrollTo(int pos, int duration = 0, QEasingCurve easing = QEasingCurve(QEasingCurve::OutCubic));
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
public slots:
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	void scrollBackward();
Toshihiro Shimizu 890ddd
	void scrollForward();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
protected:
Toshihiro Shimizu 890ddd
	void resizeEvent(QResizeEvent *re);
Toshihiro Shimizu 890ddd
	void mousePressEvent(QMouseEvent *me);
Toshihiro Shimizu 890ddd
	void mouseMoveEvent(QMouseEvent *me);
Toshihiro Shimizu 890ddd
	void mouseReleaseEvent(QMouseEvent *me);
Toshihiro Shimizu 890ddd
	void showEvent(QShowEvent *se);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
protected slots:
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	void updateButtonsVisibility();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	void holdBackward();
Toshihiro Shimizu 890ddd
	void holdForward();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	void releaseBackward();
Toshihiro Shimizu 890ddd
	void releaseForward();
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#endif //DVSCROLLWIDGET_H