地面站终端 App
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

163 lines
3.7 KiB

/* -*- 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
*****************************************************************************/
// vim: expandtab
#include "qwt_scale_div.h"
#include "qwt_plot.h"
#include "qwt_plot_canvas.h"
#include "qwt_plot_panner.h"
class QwtPlotPanner::PrivateData
{
public:
PrivateData() {
for ( int axis = 0; axis < QwtPlot::axisCnt; axis++ )
isAxisEnabled[axis] = true;
}
bool isAxisEnabled[QwtPlot::axisCnt];
};
/*!
\brief Create a plot panner
The panner is enabled for all axes
\param canvas Plot canvas to pan, also the parent object
\sa setAxisEnabled
*/
QwtPlotPanner::QwtPlotPanner(QwtPlotCanvas *canvas):
QwtPanner(canvas)
{
d_data = new PrivateData();
connect(this, SIGNAL(panned(int, int)),
SLOT(moveCanvas(int, int)));
}
//! Destructor
QwtPlotPanner::~QwtPlotPanner()
{
delete d_data;
}
/*!
\brief En/Disable an axis
Axes that are enabled will be synchronized to the
result of panning. All other axes will remain unchanged.
\param axis Axis, see QwtPlot::Axis
\param on On/Off
\sa isAxisEnabled, moveCanvas
*/
void QwtPlotPanner::setAxisEnabled(int axis, bool on)
{
if ( axis >= 0 && axis < QwtPlot::axisCnt )
d_data->isAxisEnabled[axis] = on;
}
/*!
Test if an axis is enabled
\param axis Axis, see QwtPlot::Axis
\return True, if the axis is enabled
\sa setAxisEnabled, moveCanvas
*/
bool QwtPlotPanner::isAxisEnabled(int axis) const
{
if ( axis >= 0 && axis < QwtPlot::axisCnt )
return d_data->isAxisEnabled[axis];
return true;
}
//! Return observed plot canvas
QwtPlotCanvas *QwtPlotPanner::canvas()
{
QWidget *w = parentWidget();
if ( w && w->inherits("QwtPlotCanvas") )
return (QwtPlotCanvas *)w;
return NULL;
}
//! Return Observed plot canvas
const QwtPlotCanvas *QwtPlotPanner::canvas() const
{
return ((QwtPlotPanner *)this)->canvas();
}
//! Return plot widget, containing the observed plot canvas
QwtPlot *QwtPlotPanner::plot()
{
QObject *w = canvas();
if ( w ) {
w = w->parent();
if ( w && w->inherits("QwtPlot") )
return (QwtPlot *)w;
}
return NULL;
}
//! Return plot widget, containing the observed plot canvas
const QwtPlot *QwtPlotPanner::plot() const
{
return ((QwtPlotPanner *)this)->plot();
}
/*!
Adjust the enabled axes according to dx/dy
\param dx Pixel offset in x direction
\param dy Pixel offset in y direction
\sa QwtPanner::panned()
*/
void QwtPlotPanner::moveCanvas(int dx, int dy)
{
if ( dx == 0 && dy == 0 )
return;
QwtPlot *plot = QwtPlotPanner::plot();
if ( plot == NULL )
return;
const bool doAutoReplot = plot->autoReplot();
plot->setAutoReplot(false);
for ( int axis = 0; axis < QwtPlot::axisCnt; axis++ ) {
if ( !d_data->isAxisEnabled[axis] )
continue;
const QwtScaleMap map = plot->canvasMap(axis);
const int i1 = map.transform(plot->axisScaleDiv(axis)->lBound());
const int i2 = map.transform(plot->axisScaleDiv(axis)->hBound());
double d1, d2;
if ( axis == QwtPlot::xBottom || axis == QwtPlot::xTop ) {
d1 = map.invTransform(i1 - dx);
d2 = map.invTransform(i2 - dx);
} else {
d1 = map.invTransform(i1 - dy);
d2 = map.invTransform(i2 - dy);
}
plot->setAxisScale(axis, d1, d2);
}
plot->setAutoReplot(doAutoReplot);
plot->replot();
}