/******************************************************************************
 * QwtPolar Widget Library
 * Copyright (C) 2008   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
 *****************************************************************************/

#include "qwt_polar_magnifier.h"
#include "qwt_polar_plot.h"
#include "qwt_polar_canvas.h"
#include "qwt_scale_div.h"
#include "qwt_point_polar.h"

#include <qevent.h>

class QwtPolarMagnifier::PrivateData
{
  public:
    PrivateData()
        : unzoomKey( Qt::Key_Home )
        , unzoomKeyModifiers( Qt::NoModifier )
    {
    }

    int unzoomKey;
    int unzoomKeyModifiers;
};

/*!
   Constructor
   \param canvas Plot canvas to be magnified
 */
QwtPolarMagnifier::QwtPolarMagnifier( QwtPolarCanvas* canvas )
    : QwtMagnifier( canvas )
{
    m_data = new PrivateData();
}

//! Destructor
QwtPolarMagnifier::~QwtPolarMagnifier()
{
    delete m_data;
}

/*!
   Assign key and modifiers, that are used for unzooming
   The default combination is Qt::Key_Home + Qt::NoModifier.

   \param key Key code
   \param modifiers Modifiers
   \sa getUnzoomKey(), QwtPolarPlot::unzoom()
 */
void QwtPolarMagnifier::setUnzoomKey( int key, int modifiers )
{
    m_data->unzoomKey = key;
    m_data->unzoomKeyModifiers = modifiers;
}

/*!
   \return Key, and modifiers that are used for unzooming

   \param key Key code
   \param modifiers Modifiers
   \sa setUnzoomKey(), QwtPolarPlot::unzoom()
 */
void QwtPolarMagnifier::getUnzoomKey( int& key, int& modifiers ) const
{
    key = m_data->unzoomKey;
    modifiers = m_data->unzoomKeyModifiers;
}

//! \return Observed plot canvas
QwtPolarCanvas* QwtPolarMagnifier::canvas()
{
    return qobject_cast< QwtPolarCanvas* >( parent() );
}

//! \return Observed plot canvas
const QwtPolarCanvas* QwtPolarMagnifier::canvas() const
{
    return qobject_cast< QwtPolarCanvas* >( parent() );
}

//! \return Observed plot
QwtPolarPlot* QwtPolarMagnifier::plot()
{
    QwtPolarCanvas* c = canvas();
    if ( c )
        return c->plot();

    return NULL;
}

//! \return observed plot
const QwtPolarPlot* QwtPolarMagnifier::plot() const
{
    const QwtPolarCanvas* c = canvas();
    if ( c )
        return c->plot();

    return NULL;
}

/*!
   Handle a key press event for the observed widget.

   \param event Key event
 */
void QwtPolarMagnifier::widgetKeyPressEvent( QKeyEvent* event )
{
    const int key = event->key();
    const int state = event->modifiers();

    if ( key == m_data->unzoomKey &&
        state == m_data->unzoomKeyModifiers )
    {
        unzoom();
        return;
    }

    QwtMagnifier::widgetKeyPressEvent( event );
}

/*!
   Zoom in/out the zoomed area
   \param factor A value < 1.0 zooms in, a value > 1.0 zooms out.
 */
void QwtPolarMagnifier::rescale( double factor )
{
    factor = qAbs( factor );
    if ( factor == 1.0 || factor == 0.0 )
        return;

    QwtPolarPlot* plt = plot();
    if ( plt == NULL )
        return;

    QwtPointPolar zoomPos;
    double newZoomFactor = plt->zoomFactor() * factor;

    if ( newZoomFactor >= 1.0 )
        newZoomFactor = 1.0;
    else
        zoomPos = plt->zoomPos();

    const bool autoReplot = plt->autoReplot();
    plt->setAutoReplot( false );

    plt->zoom( zoomPos, newZoomFactor );

    plt->setAutoReplot( autoReplot );
    plt->replot();
}

//! Unzoom the plot widget
void QwtPolarMagnifier::unzoom()
{
    QwtPolarPlot* plt = plot();

    const bool autoReplot = plt->autoReplot();
    plt->setAutoReplot( false );

    plt->unzoom();

    plt->setAutoReplot( autoReplot );
    plt->replot();
}

#if QWT_MOC_INCLUDE
#include "moc_qwt_polar_magnifier.cpp"
#endif
