Files
qwt/playground/scaleengine/TransformPlot.cpp
2023-10-31 09:22:42 +01:00

119 lines
3.3 KiB
C++

/*****************************************************************************
* Qwt Examples - Copyright (C) 2002 Uwe Rathmann
* This file may be used under the terms of the 3-clause BSD License
*****************************************************************************/
#include "TransformPlot.h"
#include <QwtPlotCurve>
#include <QwtSyntheticPointData>
#include <QwtTransform>
#include <QwtLegend>
#include <QwtLegendLabel>
namespace
{
class TransformData : public QwtSyntheticPointData
{
public:
TransformData( QwtTransform* transform )
: QwtSyntheticPointData( 200 )
, m_transform( transform )
{
}
virtual ~TransformData()
{
delete m_transform;
}
const QwtTransform* transform() const
{
return m_transform;
}
virtual double y( double x ) const QWT_OVERRIDE
{
const double min = 10.0;
const double max = 1000.0;
const double value = min + x * ( max - min );
const double s1 = m_transform->transform( min );
const double s2 = m_transform->transform( max );
const double s = m_transform->transform( value );
return ( s - s1 ) / ( s2 - s1 );
}
private:
const QwtTransform* m_transform;
};
}
TransformPlot::TransformPlot( QWidget* parent )
: QwtPlot( parent )
{
setTitle( "Transformations" );
setCanvasBackground( Qt::white );
setAxisScale( QwtAxis::XBottom, 0.0, 1.0 );
setAxisScale( QwtAxis::YLeft, 0.0, 1.0 );
QwtLegend* legend = new QwtLegend();
legend->setDefaultItemMode( QwtLegendData::Checkable );
insertLegend( legend, QwtPlot::RightLegend );
connect( legend, SIGNAL(checked(const QVariant&,bool,int)),
this, SLOT(legendChecked(const QVariant&,bool)) );
}
void TransformPlot::insertTransformation(
const QString& title, const QColor& color, QwtTransform* transform )
{
QwtPlotCurve* curve = new QwtPlotCurve( title );
curve->setRenderHint( QwtPlotItem::RenderAntialiased, true );
curve->setPen( color, 2 );
curve->setData( new TransformData( transform ) );
curve->attach( this );
}
void TransformPlot::legendChecked( const QVariant& itemInfo, bool on )
{
QwtPlotItem* plotItem = infoToItem( itemInfo );
setLegendChecked( plotItem );
if ( on && plotItem->rtti() == QwtPlotItem::Rtti_PlotCurve )
{
QwtPlotCurve* curve = static_cast< QwtPlotCurve* >( plotItem );
TransformData* curveData = static_cast< TransformData* >( curve->data() );
Q_EMIT selected( curveData->transform()->copy() );
}
}
void TransformPlot::setLegendChecked( QwtPlotItem* plotItem )
{
const QwtPlotItemList items = itemList();
for ( int i = 0; i < items.size(); i++ )
{
QwtPlotItem* item = items[ i ];
if ( item->testItemAttribute( QwtPlotItem::Legend ) )
{
QwtLegend* lgd = qobject_cast< QwtLegend* >( legend() );
QwtLegendLabel* label = qobject_cast< QwtLegendLabel* >(
lgd->legendWidget( itemToInfo( item ) ) );
if ( label )
{
lgd->blockSignals( true );
label->setChecked( item == plotItem );
lgd->blockSignals( false );
}
}
}
}
#include "moc_TransformPlot.cpp"