text: /* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
   * Qwt Widget Library
   * Copyright (C) 1997   Josef Wilgen
   * Copyright (C) 2002   Uwe Rathmann
   *
   * This library is free software; you can redistribute it and/or
   * modify it under the terms of the Qwt License, Version 1.0
   *****************************************************************************/
  
  #ifndef QWT_KNOB_H
  #define QWT_KNOB_H
  
  #include "qwt_global.h"
  #include "qwt_abstract_slider.h"
  #include "qwt_abstract_scale.h"
  
  class QwtRoundScaleDraw;
  
  /*!
    \brief The Knob Widget
  
    The QwtKnob widget imitates look and behaviour of a volume knob on a radio.
    It contains a scale around the knob which is set up automatically or can
    be configured manually (see QwtAbstractScale).
    Automatic scrolling is enabled when the user presses a mouse
    button on the scale. For a description of signals, slots and other
    members, see QwtAbstractSlider.
  
    \image html knob.png
    \sa   QwtAbstractSlider and QwtAbstractScale for the descriptions
      of the inherited members.
  */
  
  class QWT_EXPORT QwtKnob : public QwtAbstractSlider, public QwtAbstractScale
  {
      Q_OBJECT
  
      Q_ENUMS ( KnobStyle )
      Q_ENUMS ( MarkerStyle )
  
      Q_PROPERTY( KnobStyle knobStyle READ knobStyle WRITE setKnobStyle )
      Q_PROPERTY( MarkerStyle markerStyle READ markerStyle WRITE setMarkerStyle )
      Q_PROPERTY( int knobWidth READ knobWidth WRITE setKnobWidth )
      Q_PROPERTY( int borderWidth READ borderWidth WRITE setBorderWidth )
      Q_PROPERTY( double totalAngle READ totalAngle WRITE setTotalAngle )
      Q_PROPERTY( int markerSize READ markerSize WRITE setMarkerSize )
      Q_PROPERTY( int borderWidth READ borderWidth WRITE setBorderWidth )
  
  public:
      /*! 
         \brief Style of the knob surface
  
         Depending on the KnobStyle the surface of the knob is
         filled from the brushes of the widget palette().
  
         \sa setKnobStyle(), knobStyle()
       */
      enum KnobStyle
      {
          //! Fill the knob with a brush from QPalette::Button.
          NoStyle = -1,
  
          //! Build a gradient from QPalette::Midlight and QPalette::Button
          Raised,
  
          /*! 
            Build a gradient from QPalette::Midlight, QPalette::Button
            and QPalette::Midlight
           */
          Sunken
      };
  
      /*!
          \brief Marker type
   
          The marker indicates the current value on the knob
          The default setting is a Notch marker.
  
          \sa setMarkerStyle(), setMarkerSize()
      */
      enum MarkerStyle 
      { 
          //! Don't paint any marker
          NoMarker = -1,
  
          //! Paint a single tick in QPalette::ButtonText color
          Tick, 
  
          //! Paint a circle in QPalette::ButtonText color
          Dot, 
  
          /*! 
            Draw a raised ellipse with a gradient build from
            QPalette::Light and QPalette::Mid
           */ 
          Nub, 
  
          /*! 
            Draw a sunken ellipse with a gradient build from
            QPalette::Light and QPalette::Mid
           */ 
          Notch 
      };
  
      explicit QwtKnob( QWidget* parent = NULL );
      virtual ~QwtKnob();
  
      void setKnobWidth( int w );
      int knobWidth() const;
  
      void setTotalAngle ( double angle );
      double totalAngle() const;
  
      void setKnobStyle( KnobStyle );
      KnobStyle knobStyle() const;
  
      void setBorderWidth( int bw );
      int borderWidth() const;
  
      void setMarkerStyle( MarkerStyle );
      MarkerStyle markerStyle() const;
  
      void setMarkerSize( int );
      int markerSize() const;
  
      virtual QSize sizeHint() const;
      virtual QSize minimumSizeHint() const;
  
      void setScaleDraw( QwtRoundScaleDraw * );
      const QwtRoundScaleDraw *scaleDraw() const;
      QwtRoundScaleDraw *scaleDraw();
  
  protected:
      virtual void paintEvent( QPaintEvent * );
      virtual void resizeEvent( QResizeEvent * );
      virtual void changeEvent( QEvent * );
  
      virtual void drawKnob( QPainter *, const QRectF & ) const;
      virtual void drawMarker( QPainter *, 
          const QRectF &, double arc ) const;
  
      virtual double getValue( const QPoint &p );
      virtual void getScrollMode( const QPoint &, 
          QwtAbstractSlider::ScrollMode &, int &direction ) const;
  
  private:
      void initKnob();
      void layoutKnob( bool update );
      void recalcAngle();
  
      virtual void valueChange();
      virtual void rangeChange();
      virtual void scaleChange();
  
      class PrivateData;
      PrivateData *d_data;
  };
  
  #endif
  