Skip to content
Snippets Groups Projects
qwt_plot_grid.cpp 7.34 KiB
Newer Older
  • Learn to ignore specific revisions
  • pixhawk's avatar
    pixhawk committed
    /* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
     * Qwt Widget Library
     * Copyright (C) 1997   Josef Wilgen
     * Copyright (C) 2002   Uwe Rathmann
    
    pixhawk's avatar
    pixhawk committed
     * This library is free software; you can redistribute it and/or
     * modify it under the terms of the Qwt License, Version 1.0
     *****************************************************************************/
    
    #include <qpainter.h>
    #include <qpen.h>
    #include "qwt_painter.h"
    #include "qwt_text.h"
    #include "qwt_scale_map.h"
    #include "qwt_scale_div.h"
    #include "qwt_plot_grid.h"
    
    class QwtPlotGrid::PrivateData
    {
    public:
        PrivateData():
            xEnabled(true),
            yEnabled(true),
            xMinEnabled(false),
    
            yMinEnabled(false) {
    
    pixhawk's avatar
    pixhawk committed
        }
    
        bool xEnabled;
        bool yEnabled;
        bool xMinEnabled;
        bool yMinEnabled;
    
        QwtScaleDiv xScaleDiv;
        QwtScaleDiv yScaleDiv;
    
        QPen majPen;
        QPen minPen;
    };
    
    //! Enables major grid, disables minor grid
    QwtPlotGrid::QwtPlotGrid():
        QwtPlotItem(QwtText("Grid"))
    {
        d_data = new PrivateData;
        setZ(10.0);
    }
    
    //! Destructor
    QwtPlotGrid::~QwtPlotGrid()
    {
        delete d_data;
    }
    
    //! \return QwtPlotItem::Rtti_PlotGrid
    int QwtPlotGrid::rtti() const
    {
        return QwtPlotItem::Rtti_PlotGrid;
    }
    
    /*!
      \brief Enable or disable vertical gridlines
      \param tf Enable (true) or disable
    
      \sa Minor gridlines can be enabled or disabled with
          enableXMin()
    */
    void QwtPlotGrid::enableX(bool tf)
    {
    
        if ( d_data->xEnabled != tf ) {
    
    pixhawk's avatar
    pixhawk committed
            d_data->xEnabled = tf;
            itemChanged();
        }
    }
    
    /*!
      \brief Enable or disable horizontal gridlines
      \param tf Enable (true) or disable
      \sa Minor gridlines can be enabled or disabled with enableYMin()
    */
    void QwtPlotGrid::enableY(bool tf)
    {
    
        if ( d_data->yEnabled != tf ) {
            d_data->yEnabled = tf;
    
    pixhawk's avatar
    pixhawk committed
            itemChanged();
        }
    }
    
    /*!
      \brief Enable or disable  minor vertical gridlines.
      \param tf Enable (true) or disable
      \sa enableX()
    */
    void QwtPlotGrid::enableXMin(bool tf)
    {
    
        if ( d_data->xMinEnabled != tf ) {
    
    pixhawk's avatar
    pixhawk committed
            d_data->xMinEnabled = tf;
            itemChanged();
        }
    }
    
    /*!
      \brief Enable or disable minor horizontal gridlines
      \param tf Enable (true) or disable
      \sa enableY()
    */
    void QwtPlotGrid::enableYMin(bool tf)
    {
    
        if ( d_data->yMinEnabled != tf ) {
    
    pixhawk's avatar
    pixhawk committed
            d_data->yMinEnabled = tf;
            itemChanged();
        }
    }
    
    /*!
      \brief Assign an x axis scale division
      \param scaleDiv Scale division
      \warning QwtPlotGrid uses implicit sharing (see Qt Manual) for
      the scale divisions.
    */
    void QwtPlotGrid::setXDiv(const QwtScaleDiv &scaleDiv)
    {
    
        if ( d_data->xScaleDiv != scaleDiv ) {
    
    pixhawk's avatar
    pixhawk committed
            d_data->xScaleDiv = scaleDiv;
            itemChanged();
        }
    }
    
    /*!
      \brief Assign a y axis division
      \param sy Scale division
      \warning QwtPlotGrid uses implicit sharing (see Qt Manual) for
      the scale divisions.
    */
    void QwtPlotGrid::setYDiv(const QwtScaleDiv &sy)
    {
    
        if ( d_data->yScaleDiv != sy ) {
            d_data->yScaleDiv = sy;
    
    pixhawk's avatar
    pixhawk committed
            itemChanged();
        }
    }
    
    /*!
      \brief Assign a pen for both major and minor gridlines
      \param p Pen
      \sa setMajPen(), setMinPen()
    */
    void QwtPlotGrid::setPen(const QPen &p)
    {
    
        if ( d_data->majPen != p || d_data->minPen != p ) {
    
    pixhawk's avatar
    pixhawk committed
            d_data->majPen = p;
            d_data->minPen = p;
            itemChanged();
        }
    }
    
    /*!
      \brief Assign a pen for the major gridlines
      \param p Pen
      \sa majPen(), setMinPen(), setPen()
    */
    void QwtPlotGrid::setMajPen(const QPen &p)
    {
    
        if ( d_data->majPen != p ) {
    
    pixhawk's avatar
    pixhawk committed
            d_data->majPen = p;
            itemChanged();
        }
    }
    
    /*!
      \brief Assign a pen for the minor gridlines
      \param p Pen
    */
    void QwtPlotGrid::setMinPen(const QPen &p)
    {
    
        if ( d_data->minPen != p ) {
            d_data->minPen = p;
    
    pixhawk's avatar
    pixhawk committed
            itemChanged();
        }
    }
    
    /*!
      \brief Draw the grid
    
    
      The grid is drawn into the bounding rectangle such that
    
    pixhawk's avatar
    pixhawk committed
      gridlines begin and end at the rectangle's borders. The X and Y
      maps are used to map the scale divisions into the drawing region
      screen.
      \param painter  Painter
      \param xMap X axis map
    
      \param yMap Y axis
    
    pixhawk's avatar
    pixhawk committed
      \param canvasRect Contents rect of the plot canvas
    */
    
    void QwtPlotGrid::draw(QPainter *painter,
                           const QwtScaleMap &xMap, const QwtScaleMap &yMap,
                           const QRect &canvasRect) const
    
    pixhawk's avatar
    pixhawk committed
    {
        //  draw minor gridlines
        painter->setPen(d_data->minPen);
    
    
        if (d_data->xEnabled && d_data->xMinEnabled) {
            drawLines(painter, canvasRect, Qt::Vertical, xMap,
                      d_data->xScaleDiv.ticks(QwtScaleDiv::MinorTick));
            drawLines(painter, canvasRect, Qt::Vertical, xMap,
                      d_data->xScaleDiv.ticks(QwtScaleDiv::MediumTick));
    
    pixhawk's avatar
    pixhawk committed
        }
    
    
        if (d_data->yEnabled && d_data->yMinEnabled) {
            drawLines(painter, canvasRect, Qt::Horizontal, yMap,
                      d_data->yScaleDiv.ticks(QwtScaleDiv::MinorTick));
            drawLines(painter, canvasRect, Qt::Horizontal, yMap,
                      d_data->yScaleDiv.ticks(QwtScaleDiv::MediumTick));
    
    pixhawk's avatar
    pixhawk committed
        }
    
        //  draw major gridlines
        painter->setPen(d_data->majPen);
    
    
        if (d_data->xEnabled) {
    
    pixhawk's avatar
    pixhawk committed
            drawLines(painter, canvasRect, Qt::Vertical, xMap,
    
                      d_data->xScaleDiv.ticks(QwtScaleDiv::MajorTick));
    
    pixhawk's avatar
    pixhawk committed
        }
    
    
        if (d_data->yEnabled) {
    
    pixhawk's avatar
    pixhawk committed
            drawLines(painter, canvasRect, Qt::Horizontal, yMap,
    
                      d_data->yScaleDiv.ticks(QwtScaleDiv::MajorTick));
    
    pixhawk's avatar
    pixhawk committed
        }
    }
    
    void QwtPlotGrid::drawLines(QPainter *painter, const QRect &canvasRect,
    
                                Qt::Orientation orientation, const QwtScaleMap &scaleMap,
                                const QwtValueList &values) const
    
    pixhawk's avatar
    pixhawk committed
    {
        const int x1 = canvasRect.left();
        const int x2 = canvasRect.right();
        const int y1 = canvasRect.top();
        const int y2 = canvasRect.bottom();
    
    
        for (uint i = 0; i < (uint)values.count(); i++) {
    
    pixhawk's avatar
    pixhawk committed
            const int value = scaleMap.transform(values[i]);
    
            if ( orientation == Qt::Horizontal ) {
    
    pixhawk's avatar
    pixhawk committed
                if ((value >= y1) && (value <= y2))
                    QwtPainter::drawLine(painter, x1, value, x2, value);
    
    pixhawk's avatar
    pixhawk committed
                if ((value >= x1) && (value <= x2))
                    QwtPainter::drawLine(painter, value, y1, value, y2);
            }
        }
    }
    
    /*!
      \return the pen for the major gridlines
      \sa setMajPen(), setMinPen(), setPen()
    */
    
    const QPen &QwtPlotGrid::majPen() const
    {
        return d_data->majPen;
    
    pixhawk's avatar
    pixhawk committed
    }
    
    /*!
      \return the pen for the minor gridlines
      \sa setMinPen(), setMajPen(), setPen()
    */
    
    const QPen &QwtPlotGrid::minPen() const
    {
        return d_data->minPen;
    
    pixhawk's avatar
    pixhawk committed
    }
    
    pixhawk's avatar
    pixhawk committed
    /*!
      \return true if vertical gridlines are enabled
      \sa enableX()
    */
    bool QwtPlotGrid::xEnabled() const
    
    {
        return d_data->xEnabled;
    
    pixhawk's avatar
    pixhawk committed
    }
    
    /*!
      \return true if minor vertical gridlines are enabled
      \sa enableXMin()
    */
    
    bool QwtPlotGrid::xMinEnabled() const
    {
        return d_data->xMinEnabled;
    
    pixhawk's avatar
    pixhawk committed
    }
    
    /*!
      \return true if horizontal gridlines are enabled
      \sa enableY()
    */
    
    bool QwtPlotGrid::yEnabled() const
    {
        return d_data->yEnabled;
    
    pixhawk's avatar
    pixhawk committed
    }
    
    /*!
      \return true if minor horizontal gridlines are enabled
      \sa enableYMin()
    */
    
    bool QwtPlotGrid::yMinEnabled() const
    
    pixhawk's avatar
    pixhawk committed
    {
    
        return d_data->yMinEnabled;
    
    pixhawk's avatar
    pixhawk committed
    }
    
    
    pixhawk's avatar
    pixhawk committed
    /*! \return the scale division of the x axis */
    
    const QwtScaleDiv &QwtPlotGrid::xScaleDiv() const
    {
        return d_data->xScaleDiv;
    
    pixhawk's avatar
    pixhawk committed
    }
    
    /*! \return the scale division of the y axis */
    
    const QwtScaleDiv &QwtPlotGrid::yScaleDiv() const
    {
        return d_data->yScaleDiv;
    
    pixhawk's avatar
    pixhawk committed
    }
    
    pixhawk's avatar
    pixhawk committed
    void QwtPlotGrid::updateScaleDiv(const QwtScaleDiv& xDiv,
    
                                     const QwtScaleDiv& yDiv)
    
    pixhawk's avatar
    pixhawk committed
    {
        setXDiv(xDiv);
        setYDiv(yDiv);
    }