Files
qwt/examples/refreshtest/Panel.cpp
2023-10-31 09:22:42 +01:00

333 lines
9.8 KiB
C++

/*****************************************************************************
* Qwt Examples - Copyright (C) 2002 Uwe Rathmann
* This file may be used under the terms of the 3-clause BSD License
*****************************************************************************/
#include "Panel.h"
#include <QwtPlotCurve>
#include <QLabel>
#include <QComboBox>
#include <QSpinBox>
#include <QCheckBox>
#include <QLayout>
class SpinBox : public QSpinBox
{
public:
SpinBox( int min, int max, int step, QWidget* parent )
: QSpinBox( parent )
{
setRange( min, max );
setSingleStep( step );
}
};
class CheckBox : public QCheckBox
{
public:
CheckBox( const QString& title, QWidget* parent )
: QCheckBox( title, parent )
{
}
void setChecked( bool checked )
{
setCheckState( checked ? Qt::Checked : Qt::Unchecked );
}
bool isChecked() const
{
return checkState() == Qt::Checked;
}
};
Panel::Panel( QWidget* parent )
: QTabWidget( parent )
{
setTabPosition( QTabWidget::West );
addTab( createPlotTab( this ), "Plot" );
addTab( createCanvasTab( this ), "Canvas" );
addTab( createCurveTab( this ), "Curve" );
setSettings( Settings() );
connect( m_numPoints, SIGNAL(valueChanged(int)), SLOT(edited()) );
connect( m_updateInterval, SIGNAL(valueChanged(int)), SLOT(edited()) );
connect( m_curveWidth, SIGNAL(valueChanged(int)), SLOT(edited()) );
connect( m_paintCache, SIGNAL(stateChanged(int)), SLOT(edited()) );
connect( m_paintOnScreen, SIGNAL(stateChanged(int)), SLOT(edited()) );
connect( m_immediatePaint, SIGNAL(stateChanged(int)), SLOT(edited()) );
#ifndef QWT_NO_OPENGL
connect( m_openGL, SIGNAL(stateChanged(int)), SLOT(edited()) );
#endif
connect( m_curveAntialiasing, SIGNAL(stateChanged(int)), SLOT(edited()) );
connect( m_curveClipping, SIGNAL(stateChanged(int)), SLOT(edited()) );
connect( m_curveWeeding, SIGNAL(currentIndexChanged(int)), SLOT(edited()) );
connect( m_lineSplitting, SIGNAL(stateChanged(int)), SLOT(edited()) );
connect( m_curveFilled, SIGNAL(stateChanged(int)), SLOT(edited()) );
connect( m_updateType, SIGNAL(currentIndexChanged(int)), SLOT(edited()) );
connect( m_gridStyle, SIGNAL(currentIndexChanged(int)), SLOT(edited()) );
connect( m_curveType, SIGNAL(currentIndexChanged(int)), SLOT(edited()) );
connect( m_curvePen, SIGNAL(currentIndexChanged(int)), SLOT(edited()) );
}
QWidget* Panel::createPlotTab( QWidget* parent )
{
QWidget* page = new QWidget( parent );
m_updateInterval = new SpinBox( 0, 1000, 10, page );
m_numPoints = new SpinBox( 10, 1000000, 1000, page );
m_updateType = new QComboBox( page );
m_updateType->addItem( "Repaint" );
m_updateType->addItem( "Replot" );
int row = 0;
QGridLayout* layout = new QGridLayout( page );
layout->addWidget( new QLabel( "Updates", page ), row, 0 );
layout->addWidget( m_updateInterval, row, 1 );
layout->addWidget( new QLabel( "ms", page ), row++, 2 );
layout->addWidget( new QLabel( "Points", page ), row, 0 );
layout->addWidget( m_numPoints, row++, 1 );
layout->addWidget( new QLabel( "Update", page ), row, 0 );
layout->addWidget( m_updateType, row++, 1 );
layout->addLayout( new QHBoxLayout(), row++, 0 );
layout->setColumnStretch( 1, 10 );
layout->setRowStretch( row, 10 );
return page;
}
QWidget* Panel::createCanvasTab( QWidget* parent )
{
QWidget* page = new QWidget( parent );
m_gridStyle = new QComboBox( page );
m_gridStyle->addItem( "None" );
m_gridStyle->addItem( "Solid" );
m_gridStyle->addItem( "Dashes" );
m_paintCache = new CheckBox( "Paint Cache", page );
m_paintOnScreen = new CheckBox( "Paint On Screen", page );
m_immediatePaint = new CheckBox( "Immediate Paint", page );
#ifndef QWT_NO_OPENGL
m_openGL = new CheckBox( "OpenGL", page );
#endif
int row = 0;
QGridLayout* layout = new QGridLayout( page );
layout->addWidget( new QLabel( "Grid", page ), row, 0 );
layout->addWidget( m_gridStyle, row++, 1 );
layout->addWidget( m_paintCache, row++, 0, 1, -1 );
layout->addWidget( m_paintOnScreen, row++, 0, 1, -1 );
layout->addWidget( m_immediatePaint, row++, 0, 1, -1 );
#ifndef QWT_NO_OPENGL
layout->addWidget( m_openGL, row++, 0, 1, -1 );
#endif
layout->addLayout( new QHBoxLayout(), row++, 0 );
layout->setColumnStretch( 1, 10 );
layout->setRowStretch( row, 10 );
return page;
}
QWidget* Panel::createCurveTab( QWidget* parent )
{
QWidget* page = new QWidget( parent );
m_curveType = new QComboBox( page );
m_curveType->addItem( "Wave" );
m_curveType->addItem( "Noise" );
m_curveAntialiasing = new CheckBox( "Antialiasing", page );
m_curveClipping = new CheckBox( "Clipping", page );
m_lineSplitting = new CheckBox( "Split Lines", page );
m_curveWeeding = new QComboBox( page );
m_curveWeeding->addItem( "None" );
m_curveWeeding->addItem( "Normal" );
m_curveWeeding->addItem( "Aggressive" );
m_curveWidth = new SpinBox( 0, 10, 1, page );
m_curvePen = new QComboBox( page );
m_curvePen->addItem( "Solid" );
m_curvePen->addItem( "Dotted" );
m_curveFilled = new CheckBox( "Filled", page );
int row = 0;
QGridLayout* layout = new QGridLayout( page );
layout->addWidget( new QLabel( "Type", page ), row, 0 );
layout->addWidget( m_curveType, row++, 1 );
layout->addWidget( m_curveAntialiasing, row++, 0, 1, -1 );
layout->addWidget( m_curveClipping, row++, 0, 1, -1 );
layout->addWidget( m_lineSplitting, row++, 0, 1, -1 );
layout->addWidget( new QLabel( "Weeding", page ), row, 0 );
layout->addWidget( m_curveWeeding, row++, 1 );
layout->addWidget( new QLabel( "Width", page ), row, 0 );
layout->addWidget( m_curveWidth, row++, 1 );
layout->addWidget( new QLabel( "Style", page ), row, 0 );
layout->addWidget( m_curvePen, row++, 1 );
layout->addWidget( m_curveFilled, row++, 0, 1, -1 );
layout->addLayout( new QHBoxLayout(), row++, 0 );
layout->setColumnStretch( 1, 10 );
layout->setRowStretch( row, 10 );
return page;
}
void Panel::edited()
{
const Settings s = settings();
Q_EMIT settingsChanged( s );
}
Settings Panel::settings() const
{
Settings s;
s.grid.pen = QPen( Qt::black, 0 );
switch( m_gridStyle->currentIndex() )
{
case 0:
s.grid.pen.setStyle( Qt::NoPen );
break;
case 2:
s.grid.pen.setStyle( Qt::DashLine );
break;
}
s.curve.pen.setStyle( m_curvePen->currentIndex() == 0 ?
Qt::SolidLine : Qt::DotLine );
s.curve.pen.setWidth( m_curveWidth->value() );
s.curve.brush.setStyle( ( m_curveFilled->isChecked() ) ?
Qt::SolidPattern : Qt::NoBrush );
s.curve.numPoints = m_numPoints->value();
s.curve.functionType = static_cast< Settings::FunctionType >(
m_curveType->currentIndex() );
if ( m_curveClipping->isChecked() )
s.curve.paintAttributes |= QwtPlotCurve::ClipPolygons;
else
s.curve.paintAttributes &= ~QwtPlotCurve::ClipPolygons;
s.curve.paintAttributes &= ~QwtPlotCurve::FilterPoints;
s.curve.paintAttributes &= ~QwtPlotCurve::FilterPointsAggressive;
switch( m_curveWeeding->currentIndex() )
{
case 1:
{
s.curve.paintAttributes |= QwtPlotCurve::FilterPoints;
break;
}
case 2:
{
s.curve.paintAttributes |= QwtPlotCurve::FilterPointsAggressive;
break;
}
}
if ( m_curveAntialiasing->isChecked() )
s.curve.renderHint |= QwtPlotItem::RenderAntialiased;
else
s.curve.renderHint &= ~QwtPlotItem::RenderAntialiased;
s.curve.lineSplitting = ( m_lineSplitting->isChecked() );
s.canvas.useBackingStore = ( m_paintCache->isChecked() );
s.canvas.paintOnScreen = ( m_paintOnScreen->isChecked() );
s.canvas.immediatePaint = ( m_immediatePaint->isChecked() );
#ifndef QWT_NO_OPENGL
s.canvas.openGL = ( m_openGL->isChecked() );
#endif
s.updateInterval = m_updateInterval->value();
s.updateType = static_cast< Settings::UpdateType >( m_updateType->currentIndex() );
return s;
}
void Panel::setSettings( const Settings& s )
{
m_numPoints->setValue( s.curve.numPoints );
m_updateInterval->setValue( s.updateInterval );
m_updateType->setCurrentIndex( s.updateType );
switch( s.grid.pen.style() )
{
case Qt::NoPen:
{
m_gridStyle->setCurrentIndex( 0 );
break;
}
case Qt::DashLine:
{
m_gridStyle->setCurrentIndex( 2 );
break;
}
default:
{
m_gridStyle->setCurrentIndex( 1 ); // Solid
}
}
m_paintCache->setChecked( s.canvas.useBackingStore );
m_paintOnScreen->setChecked( s.canvas.paintOnScreen );
m_immediatePaint->setChecked( s.canvas.immediatePaint );
#ifndef QWT_NO_OPENGL
m_openGL->setChecked( s.canvas.openGL );
#endif
m_curveType->setCurrentIndex( s.curve.functionType );
m_curveAntialiasing->setChecked(
s.curve.renderHint & QwtPlotCurve::RenderAntialiased );
m_curveClipping->setChecked(
s.curve.paintAttributes & QwtPlotCurve::ClipPolygons );
int weedingIndex = 0;
if ( s.curve.paintAttributes & QwtPlotCurve::FilterPointsAggressive )
weedingIndex = 2;
else if ( s.curve.paintAttributes & QwtPlotCurve::FilterPoints )
weedingIndex = 1;
m_curveWeeding->setCurrentIndex( weedingIndex );
m_lineSplitting->setChecked( s.curve.lineSplitting );
m_curveWidth->setValue( s.curve.pen.width() );
m_curvePen->setCurrentIndex(
s.curve.pen.style() == Qt::SolidLine ? 0 : 1 );
m_curveFilled->setChecked( s.curve.brush.style() != Qt::NoBrush );
}
#include "moc_Panel.cpp"