annotate widgets/Panner.h @ 349:369a197737c7

* Various fixes to object lifetime management, particularly in the spectrum layer and for notification of main model deletion. The main purpose of this is to improve the behaviour of the spectrum, but I think it may also help with #1840922 Various crashes in Layer Summary window.
author Chris Cannam
date Wed, 23 Jan 2008 15:43:27 +0000
parents c492902dba40
children 13f5f84fbfad
rev   line source
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@182 7 This file copyright 2006 QMUL.
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@173 29 void setDefaultRectCentre(float, float);
Chris@173 30
Chris@174 31 void setThumbColour(QColor colour);
Chris@174 32 void setAlpha(int backgroundAlpha, int thumbAlpha);
Chris@174 33
Chris@256 34 /**
Chris@256 35 * Set the amount the scroll() function or mouse wheel movement
Chris@256 36 * makes the panner rectangle move by. The default value of 0
Chris@256 37 * means to select a value automatically based on the dimensions
Chris@256 38 * of the panner rectangle.
Chris@256 39 */
Chris@256 40 void setScrollUnit(float unit);
Chris@256 41
Chris@188 42 void getRectExtents(float &x0, float &y0, float &width, float &height);
Chris@188 43
Chris@172 44 virtual QSize sizeHint() const;
Chris@172 45
Chris@172 46 signals:
Chris@172 47 /**
Chris@172 48 * Emitted when the panned rectangle is dragged or otherwise
Chris@172 49 * moved. Arguments are x0, y0, width and height of the rectangle
Chris@172 50 * in the range 0 -> 1 as proportions of the width and height of
Chris@172 51 * the whole widget.
Chris@172 52 */
Chris@172 53 void rectExtentsChanged(float, float, float, float);
Chris@172 54
Chris@172 55 /**
Chris@172 56 * Emitted when the rectangle is dragged or otherwise moved (as
Chris@172 57 * well as extentsChanged). Arguments are the centre coordinates
Chris@172 58 * of the rectangle in the range 0 -> 1 as proportions of the
Chris@172 59 * width and height of the whole widget.
Chris@172 60 */
Chris@172 61 void rectCentreMoved(float, float);
Chris@172 62
Chris@188 63 /**
Chris@188 64 * Emitted when the panner is double-clicked (for the "customer"
Chris@188 65 * code to pop up a value editing dialog, for example).
Chris@188 66 */
Chris@188 67 void doubleClicked();
Chris@188 68
Chris@189 69 void mouseEntered();
Chris@189 70 void mouseLeft();
Chris@189 71
Chris@172 72 public slots:
Chris@172 73 /**
Chris@172 74 * Set the extents of the panned rectangle within the overall
Chris@172 75 * panner widget. Coordinates are in the range 0 -> 1 in both axes,
Chris@172 76 * with 0 at the top in the y axis.
Chris@172 77 */
Chris@172 78 void setRectExtents(float x0, float y0, float width, float height);
Chris@172 79
Chris@172 80 /**
Chris@172 81 * Set the width of the panned rectangle as a fraction (0 -> 1) of
Chris@172 82 * that of the whole panner widget.
Chris@172 83 */
Chris@172 84 void setRectWidth(float width);
Chris@172 85
Chris@172 86 /**
Chris@172 87 * Set the height of the panned rectangle as a fraction (0 -> 1)
Chris@172 88 * of that of the whole panner widget.
Chris@172 89 */
Chris@172 90 void setRectHeight(float height);
Chris@172 91
Chris@172 92 /**
Chris@172 93 * Set the location of the centre of the panned rectangle on the x
Chris@172 94 * axis, as a proportion (0 -> 1) of the width of the whole panner
Chris@172 95 * widget.
Chris@172 96 */
Chris@172 97 void setRectCentreX(float x);
Chris@172 98
Chris@172 99 /**
Chris@172 100 * Set the location of the centre of the panned rectangle on the y
Chris@172 101 * axis, as a proportion (0 -> 1) of the height of the whole panner
Chris@172 102 * widget.
Chris@172 103 */
Chris@172 104 void setRectCentreY(float y);
Chris@172 105
Chris@256 106 /**
Chris@256 107 * Move up (if up is true) or down a bit. This is basically the
Chris@256 108 * same action as rolling the mouse wheel one notch.
Chris@256 109 */
Chris@256 110 void scroll(bool up);
Chris@256 111
Chris@188 112 void resetToDefault();
Chris@188 113
Chris@172 114 protected:
Chris@189 115 virtual void mousePressEvent(QMouseEvent *e);
Chris@189 116 virtual void mouseDoubleClickEvent(QMouseEvent *e);
Chris@189 117 virtual void mouseMoveEvent(QMouseEvent *e);
Chris@189 118 virtual void mouseReleaseEvent(QMouseEvent *e);
Chris@189 119 virtual void wheelEvent(QWheelEvent *e);
Chris@189 120 virtual void paintEvent(QPaintEvent *e);
Chris@189 121 virtual void enterEvent(QEvent *);
Chris@189 122 virtual void leaveEvent(QEvent *);
Chris@189 123
Chris@172 124 void normalise();
Chris@172 125 void emitAndUpdate();
Chris@172 126
Chris@172 127 float m_rectX;
Chris@172 128 float m_rectY;
Chris@172 129 float m_rectWidth;
Chris@172 130 float m_rectHeight;
Chris@256 131 float m_scrollUnit;
Chris@173 132
Chris@173 133 float m_defaultCentreX;
Chris@173 134 float m_defaultCentreY;
Chris@173 135 bool m_defaultsSet;
Chris@173 136
Chris@174 137 QColor m_thumbColour;
Chris@174 138 int m_backgroundAlpha;
Chris@174 139 int m_thumbAlpha;
Chris@174 140
Chris@173 141 float centreX() const { return m_rectX + m_rectWidth/2; }
Chris@173 142 float centreY() const { return m_rectY + m_rectHeight/2; }
Chris@173 143
Chris@173 144 bool m_clicked;
Chris@173 145 QPoint m_clickPos;
Chris@173 146 float m_dragStartX;
Chris@173 147 float m_dragStartY;
Chris@172 148 };
Chris@172 149
Chris@172 150 #endif
Chris@172 151