| Chris@172 | 1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*-  vi:set ts=8 sts=4 sw=4: */ | 
| Chris@172 | 2 | 
| Chris@172 | 3 /* | 
| Chris@172 | 4     Sonic Visualiser | 
| Chris@172 | 5     An audio file viewer and annotation editor. | 
| Chris@172 | 6     Centre for Digital Music, Queen Mary, University of London. | 
| Chris@172 | 7     This file copyright 2006 Chris Cannam. | 
| Chris@172 | 8 | 
| Chris@172 | 9     This program is free software; you can redistribute it and/or | 
| Chris@172 | 10     modify it under the terms of the GNU General Public License as | 
| Chris@172 | 11     published by the Free Software Foundation; either version 2 of the | 
| Chris@172 | 12     License, or (at your option) any later version.  See the file | 
| Chris@172 | 13     COPYING included with this distribution for more information. | 
| Chris@172 | 14 */ | 
| Chris@172 | 15 | 
| Chris@172 | 16 #ifndef _PANNER_H_ | 
| Chris@172 | 17 #define _PANNER_H_ | 
| Chris@172 | 18 | 
| Chris@172 | 19 #include <QWidget> | 
| Chris@172 | 20 | 
| Chris@172 | 21 class Panner : public QWidget | 
| Chris@172 | 22 { | 
| Chris@172 | 23     Q_OBJECT | 
| Chris@172 | 24 | 
| Chris@172 | 25 public: | 
| Chris@172 | 26     Panner(QWidget *parent = 0); | 
| Chris@172 | 27     virtual ~Panner(); | 
| Chris@172 | 28 | 
| Chris@172 | 29     virtual void mousePressEvent(QMouseEvent *e); | 
| Chris@172 | 30     virtual void mouseDoubleClickEvent(QMouseEvent *e); | 
| Chris@172 | 31     virtual void mouseMoveEvent(QMouseEvent *e); | 
| Chris@172 | 32     virtual void mouseReleaseEvent(QMouseEvent *e); | 
| Chris@172 | 33     virtual void wheelEvent(QWheelEvent *e); | 
| Chris@172 | 34     virtual void paintEvent(QPaintEvent *e); | 
| Chris@172 | 35 | 
| Chris@172 | 36     virtual QSize sizeHint() const; | 
| Chris@172 | 37 | 
| Chris@172 | 38 signals: | 
| Chris@172 | 39     /** | 
| Chris@172 | 40      * Emitted when the panned rectangle is dragged or otherwise | 
| Chris@172 | 41      * moved.  Arguments are x0, y0, width and height of the rectangle | 
| Chris@172 | 42      * in the range 0 -> 1 as proportions of the width and height of | 
| Chris@172 | 43      * the whole widget. | 
| Chris@172 | 44      */ | 
| Chris@172 | 45     void rectExtentsChanged(float, float, float, float); | 
| Chris@172 | 46 | 
| Chris@172 | 47     /** | 
| Chris@172 | 48      * Emitted when the rectangle is dragged or otherwise moved (as | 
| Chris@172 | 49      * well as extentsChanged).  Arguments are the centre coordinates | 
| Chris@172 | 50      * of the rectangle in the range 0 -> 1 as proportions of the | 
| Chris@172 | 51      * width and height of the whole widget. | 
| Chris@172 | 52      */ | 
| Chris@172 | 53     void rectCentreMoved(float, float); | 
| Chris@172 | 54 | 
| Chris@172 | 55 public slots: | 
| Chris@172 | 56     /** | 
| Chris@172 | 57      * Set the extents of the panned rectangle within the overall | 
| Chris@172 | 58      * panner widget.  Coordinates are in the range 0 -> 1 in both axes, | 
| Chris@172 | 59      * with 0 at the top in the y axis. | 
| Chris@172 | 60      */ | 
| Chris@172 | 61     void setRectExtents(float x0, float y0, float width, float height); | 
| Chris@172 | 62 | 
| Chris@172 | 63     /** | 
| Chris@172 | 64      * Set the width of the panned rectangle as a fraction (0 -> 1) of | 
| Chris@172 | 65      * that of the whole panner widget. | 
| Chris@172 | 66      */ | 
| Chris@172 | 67     void setRectWidth(float width); | 
| Chris@172 | 68 | 
| Chris@172 | 69     /** | 
| Chris@172 | 70      * Set the height of the panned rectangle as a fraction (0 -> 1) | 
| Chris@172 | 71      * of that of the whole panner widget. | 
| Chris@172 | 72      */ | 
| Chris@172 | 73     void setRectHeight(float height); | 
| Chris@172 | 74 | 
| Chris@172 | 75     /** | 
| Chris@172 | 76      * Set the location of the centre of the panned rectangle on the x | 
| Chris@172 | 77      * axis, as a proportion (0 -> 1) of the width of the whole panner | 
| Chris@172 | 78      * widget. | 
| Chris@172 | 79      */ | 
| Chris@172 | 80     void setRectCentreX(float x); | 
| Chris@172 | 81 | 
| Chris@172 | 82     /** | 
| Chris@172 | 83      * Set the location of the centre of the panned rectangle on the y | 
| Chris@172 | 84      * axis, as a proportion (0 -> 1) of the height of the whole panner | 
| Chris@172 | 85      * widget. | 
| Chris@172 | 86      */ | 
| Chris@172 | 87     void setRectCentreY(float y); | 
| Chris@172 | 88 | 
| Chris@172 | 89 protected: | 
| Chris@172 | 90     void normalise(); | 
| Chris@172 | 91     void emitAndUpdate(); | 
| Chris@172 | 92 | 
| Chris@172 | 93     float m_rectX; | 
| Chris@172 | 94     float m_rectY; | 
| Chris@172 | 95     float m_rectWidth; | 
| Chris@172 | 96     float m_rectHeight; | 
| Chris@172 | 97 }; | 
| Chris@172 | 98 | 
| Chris@172 | 99 #endif | 
| Chris@172 | 100 |