Chris@58: /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*-  vi:set ts=8 sts=4 sw=4: */
Chris@0: 
Chris@0: /*
Chris@59:     Sonic Visualiser
Chris@59:     An audio file viewer and annotation editor.
Chris@59:     Centre for Digital Music, Queen Mary, University of London.
Chris@0:     
Chris@59:     This program is free software; you can redistribute it and/or
Chris@59:     modify it under the terms of the GNU General Public License as
Chris@59:     published by the Free Software Foundation; either version 2 of the
Chris@59:     License, or (at your option) any later version.  See the file
Chris@59:     COPYING included with this distribution for more information.
Chris@0: */
Chris@0: 
Chris@0: #ifndef _AUDIO_DIAL_H_
Chris@0: #define _AUDIO_DIAL_H_
Chris@0: 
Chris@0: /**
Chris@0:  * A rotary dial widget.
Chris@0:  *
Chris@0:  * Based on an original design by Thorsten Wilms.
Chris@0:  *
Chris@0:  * Implemented as a widget for the Rosegarden MIDI and audio sequencer
Chris@0:  * and notation editor by Chris Cannam.
Chris@0:  *
Chris@0:  * Extracted into a standalone Qt3 widget by Pedro Lopez-Cabanillas
Chris@0:  * and adapted for use in QSynth.
Chris@0:  * 
Chris@0:  * Ported to Qt4 by Chris Cannam.
Chris@0:  *
Chris@182:  * This file copyright 2003-2006 Chris Cannam, copyright 2005 Pedro
Chris@182:  * Lopez-Cabanillas, copyright 2006 Queen Mary, University of London.
Chris@0:  *
Chris@0:  * This program is free software; you can redistribute it and/or
Chris@0:  * modify it under the terms of the GNU General Public License as
Chris@0:  * published by the Free Software Foundation; either version 2 of the
Chris@0:  * License, or (at your option) any later version.  See the file
Chris@0:  * COPYING included with this distribution for more information.
Chris@0:  */
Chris@0: 
Chris@0: #include <QDial>
Chris@0: #include <map>
Chris@0: 
Chris@167: class RangeMapper;
Chris@167: 
Chris@0: /**
Chris@0:  * AudioDial is a nicer-looking QDial that by default reacts to mouse
Chris@0:  * movement on horizontal and vertical axes instead of in a radial
Chris@0:  * motion.  Move the mouse up or right to increment the value, down or
Chris@0:  * left to decrement it.  AudioDial also responds to the mouse wheel.
Chris@0:  *
Chris@0:  * The programming interface for this widget is compatible with QDial,
Chris@0:  * with the addition of properties for the knob colour and meter
Chris@0:  * colour and a boolean property mouseDial that determines whether to
Chris@0:  * respond to radial mouse motion in the same way as QDial (the
Chris@0:  * default is no).
Chris@0:  */
Chris@0: 
Chris@0: class AudioDial : public QDial
Chris@0: {
Chris@0:     Q_OBJECT
Chris@0:     Q_PROPERTY( QColor knobColor READ getKnobColor WRITE setKnobColor )
Chris@0:     Q_PROPERTY( QColor meterColor READ getMeterColor WRITE setMeterColor )
Chris@0:     Q_PROPERTY( bool mouseDial READ getMouseDial WRITE setMouseDial )
Chris@0: 
Chris@0: public:
Chris@0:     AudioDial(QWidget *parent = 0);
Chris@0:     ~AudioDial();
Chris@0: 
Chris@0:     const QColor& getKnobColor()  const { return m_knobColor;  }
Chris@0:     const QColor& getMeterColor() const { return m_meterColor; }
Chris@0:     bool getMouseDial() const { return m_mouseDial; }
Chris@0: 
Chris@167:     void setRangeMapper(RangeMapper *mapper); // I take ownership, will delete
Chris@168:     const RangeMapper *rangeMapper() const { return m_rangeMapper; }
Chris@168:     float mappedValue() const;
Chris@167: 
Chris@271:     int defaultValue() const { return m_defaultValue; }
Chris@271: 
Chris@168:     void setShowToolTip(bool show);
Chris@167: 
Chris@189: signals:
Chris@189:     void mouseEntered();
Chris@189:     void mouseLeft();
Chris@189: 
Chris@0: public slots:
Chris@0:     /**
Chris@0:      * Set the colour of the knob.  The default is to inherit the
Chris@0:      * colour from the widget's palette.
Chris@0:      */
Chris@0:     void setKnobColor(const QColor &color);
Chris@0: 
Chris@0:     /**
Chris@0:      * Set the colour of the meter (the highlighted area around the
Chris@0:      * knob that shows the current value).  The default is to inherit
Chris@0:      * the colour from the widget's palette.
Chris@0:      */
Chris@0:     void setMeterColor(const QColor &color);
Chris@0:     
Chris@0:     /**
Chris@0:      * Specify that the dial should respond to radial mouse movements
Chris@0:      * in the same way as QDial.
Chris@0:      */
Chris@0:     void setMouseDial(bool mouseDial);
Chris@0: 
Chris@34:     void setDefaultValue(int defaultValue);
Chris@34: 
Chris@219:     void setValue(int value);
Chris@219: 
Chris@177:     void setMappedValue(float mappedValue);
Chris@177: 
Chris@0: protected:
Chris@0:     void drawTick(QPainter &paint, float angle, int size, bool internal);
Chris@0:     virtual void paintEvent(QPaintEvent *);
Chris@0: 
Chris@0:     // Alternate mouse behavior event handlers.
Chris@0:     virtual void mousePressEvent(QMouseEvent *pMouseEvent);
Chris@0:     virtual void mouseMoveEvent(QMouseEvent *pMouseEvent);
Chris@0:     virtual void mouseReleaseEvent(QMouseEvent *pMouseEvent);
Chris@34:     virtual void mouseDoubleClickEvent(QMouseEvent *pMouseEvent);
Chris@189:     virtual void enterEvent(QEvent *);
Chris@189:     virtual void leaveEvent(QEvent *);
Chris@0: 
Chris@168: protected slots:
Chris@168:     void updateMappedValue(int value);
Chris@168: 
Chris@0: private:
Chris@0:     QColor m_knobColor;
Chris@0:     QColor m_meterColor;
Chris@0:     
Chris@34:     int m_defaultValue;
Chris@168:     float m_mappedValue;
Chris@168:     bool m_noMappedUpdate;
Chris@34: 
Chris@0:     // Alternate mouse behavior tracking.
Chris@0:     bool m_mouseDial;
Chris@0:     bool m_mousePressed;
Chris@0:     QPoint m_posMouse;
Chris@167: 
Chris@168:     bool m_showTooltip;
Chris@168: 
Chris@167:     RangeMapper *m_rangeMapper;
Chris@0: };
Chris@0: 
Chris@0: 
Chris@0: #endif  // __AudioDial_h
Chris@0: 
Chris@0: // end of AudioDial.h