annotate widgets/LevelPanWidget.h @ 1553:76e4302a3fc2

Fix note numbering - ensure stable across whole track (as it used to be, but without scanning all notes in paint in order to do that)
author Chris Cannam
date Fri, 22 Nov 2019 14:12:50 +0000
parents a18e78b9c78b
children 27ea5d61b402
rev   line source
Chris@923 1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
Chris@923 2
Chris@923 3 /*
Chris@923 4 Sonic Visualiser
Chris@923 5 An audio file viewer and annotation editor.
Chris@923 6 Centre for Digital Music, Queen Mary, University of London.
Chris@923 7
Chris@923 8 This program is free software; you can redistribute it and/or
Chris@923 9 modify it under the terms of the GNU General Public License as
Chris@923 10 published by the Free Software Foundation; either version 2 of the
Chris@923 11 License, or (at your option) any later version. See the file
Chris@923 12 COPYING included with this distribution for more information.
Chris@923 13 */
Chris@923 14
Chris@923 15 #ifndef LEVEL_PAN_WIDGET_H
Chris@923 16 #define LEVEL_PAN_WIDGET_H
Chris@923 17
Chris@923 18 #include <QWidget>
Chris@923 19
Chris@1303 20 #include "WheelCounter.h"
Chris@1303 21
Chris@923 22 /**
Chris@923 23 * A simple widget for coarse level and pan control.
Chris@923 24 */
Chris@923 25
Chris@923 26 class LevelPanWidget : public QWidget
Chris@923 27 {
Chris@923 28 Q_OBJECT
Chris@923 29
Chris@923 30 public:
Chris@923 31 LevelPanWidget(QWidget *parent = 0);
Chris@923 32 ~LevelPanWidget();
Chris@923 33
Chris@1201 34 /// Return level as a gain value. The basic level range is [0,1] but the
Chris@1201 35 /// gain scale may go up to 4.0
Chris@923 36 float getLevel() const;
Chris@923 37
Chris@923 38 /// Return pan as a value in the range [-1,1]
Chris@923 39 float getPan() const;
Chris@923 40
Chris@923 41 /// Find out whether the widget is editable
Chris@923 42 bool isEditable() const;
Chris@923 43
Chris@940 44 /// Discover whether the level range includes muting or not
Chris@940 45 bool includesMute() const;
Chris@940 46
Chris@929 47 /// Draw a suitably sized copy of the widget's contents to the given device
Chris@929 48 void renderTo(QPaintDevice *, QRectF, bool asIfEditable) const;
Chris@929 49
Chris@1406 50 QSize sizeHint() const override;
Chris@929 51
Chris@923 52 public slots:
Chris@1201 53 /// Set level. The basic level range is [0,1] but the scale may go
Chris@1201 54 /// higher. The value will be rounded.
Chris@923 55 void setLevel(float);
Chris@923 56
Chris@1201 57 /// Set pan in the range [-1,1]. The value will be rounded
Chris@923 58 void setPan(float);
Chris@923 59
Chris@1177 60 /// Set left and right peak monitoring levels in the range [0,1]
Chris@1177 61 void setMonitoringLevels(float, float);
Chris@1177 62
Chris@923 63 /// Specify whether the widget is editable or read-only (default editable)
Chris@923 64 void setEditable(bool);
Chris@940 65
Chris@940 66 /// Specify whether the level range should include muting or not
Chris@940 67 void setIncludeMute(bool);
Chris@1249 68
Chris@1249 69 /// Reset to default values
Chris@1249 70 void setToDefault();
Chris@923 71
Chris@1200 72 // public so it can be called from LevelPanToolButton (ew)
Chris@1406 73 void wheelEvent(QWheelEvent *ev) override;
Chris@1200 74
Chris@923 75 signals:
Chris@1177 76 void levelChanged(float); // range [0,1]
Chris@1177 77 void panChanged(float); // range [-1,1]
Chris@923 78
Chris@1180 79 void mouseEntered();
Chris@1180 80 void mouseLeft();
Chris@1180 81
Chris@923 82 protected:
Chris@1406 83 void mousePressEvent(QMouseEvent *ev) override;
Chris@1406 84 void mouseMoveEvent(QMouseEvent *ev) override;
Chris@1406 85 void mouseReleaseEvent(QMouseEvent *ev) override;
Chris@1406 86 void paintEvent(QPaintEvent *ev) override;
Chris@1406 87 void enterEvent(QEvent *) override;
Chris@1406 88 void leaveEvent(QEvent *) override;
Chris@923 89
Chris@923 90 void emitLevelChanged();
Chris@923 91 void emitPanChanged();
Chris@1301 92
Chris@1301 93 int m_minNotch;
Chris@1301 94 int m_maxNotch;
Chris@1301 95 int m_notch;
Chris@923 96 int m_pan;
Chris@1177 97 float m_monitorLeft;
Chris@1177 98 float m_monitorRight;
Chris@923 99 bool m_editable;
Chris@1249 100 bool m_editing;
Chris@940 101 bool m_includeMute;
Chris@1301 102 bool m_includeHalfSteps;
Chris@1303 103
Chris@1303 104 WheelCounter m_wheelCounter;
Chris@923 105
Chris@1301 106 int clampNotch(int notch) const;
Chris@1302 107 int clampPan(int pan) const;
Chris@1177 108
Chris@1301 109 int audioLevelToNotch(float audioLevel) const;
Chris@1301 110 float notchToAudioLevel(int notch) const;
Chris@1301 111
Chris@1301 112 int audioPanToPan(float audioPan) const;
Chris@1301 113 float panToAudioPan(int pan) const;
Chris@1301 114
Chris@1301 115 int coordsToNotch(QRectF rect, QPointF pos) const;
Chris@1301 116 int coordsToPan(QRectF rect, QPointF pos) const;
Chris@1301 117
Chris@1306 118 QColor cellToColour(int cell) const;
Chris@1177 119
Chris@929 120 QSizeF cellSize(QRectF) const;
Chris@1301 121 QPointF cellCentre(QRectF, int row, int col) const;
Chris@929 122 QSizeF cellLightSize(QRectF) const;
Chris@1301 123 QRectF cellLightRect(QRectF, int row, int col) const;
Chris@1301 124 QRectF cellOutlineRect(QRectF, int row, int col) const;
Chris@929 125 double thinLineWidth(QRectF) const;
Chris@1304 126 double cornerRadius(QRectF) const;
Chris@923 127 };
Chris@923 128
Chris@923 129 #endif