lbajardsilogic@0: /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ lbajardsilogic@0: lbajardsilogic@0: /* lbajardsilogic@0: Sonic Visualiser lbajardsilogic@0: An audio file viewer and annotation editor. lbajardsilogic@0: Centre for Digital Music, Queen Mary, University of London. lbajardsilogic@0: This file copyright 2006 QMUL. lbajardsilogic@0: lbajardsilogic@0: This program is free software; you can redistribute it and/or lbajardsilogic@0: modify it under the terms of the GNU General Public License as lbajardsilogic@0: published by the Free Software Foundation; either version 2 of the lbajardsilogic@0: License, or (at your option) any later version. See the file lbajardsilogic@0: COPYING included with this distribution for more information. lbajardsilogic@0: */ lbajardsilogic@0: lbajardsilogic@0: #ifndef _PANNER_H_ lbajardsilogic@0: #define _PANNER_H_ lbajardsilogic@0: lbajardsilogic@0: #include lbajardsilogic@0: lbajardsilogic@0: class Panner : public QWidget lbajardsilogic@0: { lbajardsilogic@0: Q_OBJECT lbajardsilogic@0: lbajardsilogic@0: public: lbajardsilogic@0: Panner(QWidget *parent = 0); lbajardsilogic@0: virtual ~Panner(); lbajardsilogic@0: lbajardsilogic@0: void setDefaultRectCentre(float, float); lbajardsilogic@0: lbajardsilogic@0: void setThumbColour(QColor colour); lbajardsilogic@0: void setAlpha(int backgroundAlpha, int thumbAlpha); lbajardsilogic@0: lbajardsilogic@0: void getRectExtents(float &x0, float &y0, float &width, float &height); lbajardsilogic@0: lbajardsilogic@0: virtual QSize sizeHint() const; lbajardsilogic@0: lbajardsilogic@0: signals: lbajardsilogic@0: /** lbajardsilogic@0: * Emitted when the panned rectangle is dragged or otherwise lbajardsilogic@0: * moved. Arguments are x0, y0, width and height of the rectangle lbajardsilogic@0: * in the range 0 -> 1 as proportions of the width and height of lbajardsilogic@0: * the whole widget. lbajardsilogic@0: */ lbajardsilogic@0: void rectExtentsChanged(float, float, float, float); lbajardsilogic@0: lbajardsilogic@0: /** lbajardsilogic@0: * Emitted when the rectangle is dragged or otherwise moved (as lbajardsilogic@0: * well as extentsChanged). Arguments are the centre coordinates lbajardsilogic@0: * of the rectangle in the range 0 -> 1 as proportions of the lbajardsilogic@0: * width and height of the whole widget. lbajardsilogic@0: */ lbajardsilogic@0: void rectCentreMoved(float, float); lbajardsilogic@0: lbajardsilogic@0: /** lbajardsilogic@0: * Emitted when the panner is double-clicked (for the "customer" lbajardsilogic@0: * code to pop up a value editing dialog, for example). lbajardsilogic@0: */ lbajardsilogic@0: void doubleClicked(); lbajardsilogic@0: lbajardsilogic@0: void mouseEntered(); lbajardsilogic@0: void mouseLeft(); lbajardsilogic@0: lbajardsilogic@0: public slots: lbajardsilogic@0: /** lbajardsilogic@0: * Set the extents of the panned rectangle within the overall lbajardsilogic@0: * panner widget. Coordinates are in the range 0 -> 1 in both axes, lbajardsilogic@0: * with 0 at the top in the y axis. lbajardsilogic@0: */ lbajardsilogic@0: void setRectExtents(float x0, float y0, float width, float height); lbajardsilogic@0: lbajardsilogic@0: /** lbajardsilogic@0: * Set the width of the panned rectangle as a fraction (0 -> 1) of lbajardsilogic@0: * that of the whole panner widget. lbajardsilogic@0: */ lbajardsilogic@0: void setRectWidth(float width); lbajardsilogic@0: lbajardsilogic@0: /** lbajardsilogic@0: * Set the height of the panned rectangle as a fraction (0 -> 1) lbajardsilogic@0: * of that of the whole panner widget. lbajardsilogic@0: */ lbajardsilogic@0: void setRectHeight(float height); lbajardsilogic@0: lbajardsilogic@0: /** lbajardsilogic@0: * Set the location of the centre of the panned rectangle on the x lbajardsilogic@0: * axis, as a proportion (0 -> 1) of the width of the whole panner lbajardsilogic@0: * widget. lbajardsilogic@0: */ lbajardsilogic@0: void setRectCentreX(float x); lbajardsilogic@0: lbajardsilogic@0: /** lbajardsilogic@0: * Set the location of the centre of the panned rectangle on the y lbajardsilogic@0: * axis, as a proportion (0 -> 1) of the height of the whole panner lbajardsilogic@0: * widget. lbajardsilogic@0: */ lbajardsilogic@0: void setRectCentreY(float y); lbajardsilogic@0: lbajardsilogic@0: void resetToDefault(); lbajardsilogic@0: lbajardsilogic@0: protected: lbajardsilogic@0: virtual void mousePressEvent(QMouseEvent *e); lbajardsilogic@0: virtual void mouseDoubleClickEvent(QMouseEvent *e); lbajardsilogic@0: virtual void mouseMoveEvent(QMouseEvent *e); lbajardsilogic@0: virtual void mouseReleaseEvent(QMouseEvent *e); lbajardsilogic@0: virtual void wheelEvent(QWheelEvent *e); lbajardsilogic@0: virtual void paintEvent(QPaintEvent *e); lbajardsilogic@0: virtual void enterEvent(QEvent *); lbajardsilogic@0: virtual void leaveEvent(QEvent *); lbajardsilogic@0: lbajardsilogic@0: void normalise(); lbajardsilogic@0: void emitAndUpdate(); lbajardsilogic@0: lbajardsilogic@0: float m_rectX; lbajardsilogic@0: float m_rectY; lbajardsilogic@0: float m_rectWidth; lbajardsilogic@0: float m_rectHeight; lbajardsilogic@0: lbajardsilogic@0: float m_defaultCentreX; lbajardsilogic@0: float m_defaultCentreY; lbajardsilogic@0: bool m_defaultsSet; lbajardsilogic@0: lbajardsilogic@0: QColor m_thumbColour; lbajardsilogic@0: int m_backgroundAlpha; lbajardsilogic@0: int m_thumbAlpha; lbajardsilogic@0: lbajardsilogic@0: float centreX() const { return m_rectX + m_rectWidth/2; } lbajardsilogic@0: float centreY() const { return m_rectY + m_rectHeight/2; } lbajardsilogic@0: lbajardsilogic@0: bool m_clicked; lbajardsilogic@0: QPoint m_clickPos; lbajardsilogic@0: float m_dragStartX; lbajardsilogic@0: float m_dragStartY; lbajardsilogic@0: }; lbajardsilogic@0: lbajardsilogic@0: #endif lbajardsilogic@0: