Sophie

Sophie

distrib > Mandriva > cooker > i586 > by-pkgid > 76bdad05b5dca2a491582dbec0713d55 > files > 209

libqwt-devel-6.0.1-2.i586.rpm

#include "panel.h"
#include <qlabel.h>
#include <qcombobox.h>
#include <qspinbox.h>
#include <qcheckbox.h>
#include <qlayout.h>
#include <qwt_plot_curve.h>

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(d_numPoints, SIGNAL(valueChanged(int)), SLOT(edited()) );
    connect(d_updateInterval, SIGNAL(valueChanged(int)), SLOT(edited()) );
    connect(d_curveWidth, SIGNAL(valueChanged(int)), SLOT(edited()) );
    connect(d_paintCache, SIGNAL(stateChanged(int)), SLOT(edited()) );
    connect(d_paintOnScreen, SIGNAL(stateChanged(int)), SLOT(edited()) );
    connect(d_immediatePaint, SIGNAL(stateChanged(int)), SLOT(edited()) );
    connect(d_curveAntialiasing, SIGNAL(stateChanged(int)), SLOT(edited()) );
    connect(d_curveClipping, SIGNAL(stateChanged(int)), SLOT(edited()) );
    connect(d_lineSplitting, SIGNAL(stateChanged(int)), SLOT(edited()) );
    connect(d_curveFilled, SIGNAL(stateChanged(int)), SLOT(edited()) );

    connect(d_updateType, SIGNAL(currentIndexChanged(int)), SLOT(edited()) );
    connect(d_gridStyle, SIGNAL(currentIndexChanged(int)), SLOT(edited()) );
    connect(d_curveType, SIGNAL(currentIndexChanged(int)), SLOT(edited()) );
    connect(d_curvePen, SIGNAL(currentIndexChanged(int)), SLOT(edited()) );
}

QWidget *Panel::createPlotTab(QWidget *parent)
{
    QWidget *page = new QWidget(parent);

    d_updateInterval = new SpinBox(0, 1000, 10, page);
    d_numPoints = new SpinBox(10, 1000000, 1000, page);

    d_updateType = new QComboBox(page);
    d_updateType->addItem("Repaint");
    d_updateType->addItem("Replot");

    int row = 0;

    QGridLayout *layout = new QGridLayout(page);

    layout->addWidget(new QLabel("Updates", page), row, 0 );
    layout->addWidget(d_updateInterval, row, 1);
    layout->addWidget(new QLabel("ms", page), row++, 2 );

    layout->addWidget(new QLabel("Points", page), row, 0 );
    layout->addWidget(d_numPoints, row++, 1);

    layout->addWidget(new QLabel("Update", page), row, 0 );
    layout->addWidget(d_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);

    d_gridStyle = new QComboBox(page);
    d_gridStyle->addItem("None");
    d_gridStyle->addItem("Solid");
    d_gridStyle->addItem("Dashes");

    d_paintCache = new CheckBox("Paint Cache", page);
    d_paintOnScreen = new CheckBox("Paint On Screen", page);
    d_immediatePaint = new CheckBox("Immediate Paint", page);

    int row = 0;

    QGridLayout *layout = new QGridLayout(page);
    layout->addWidget(new QLabel("Grid", page), row, 0);
    layout->addWidget(d_gridStyle, row++, 1);

    layout->addWidget(d_paintCache, row++, 0, 1, -1);
    layout->addWidget(d_paintOnScreen, row++, 0, 1, -1);
    layout->addWidget(d_immediatePaint, row++, 0, 1, -1);

    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);

    d_curveType = new QComboBox(page);
    d_curveType->addItem("Wave");
    d_curveType->addItem("Noise");

    d_curveAntialiasing = new CheckBox("Antialiasing", page);
    d_curveClipping = new CheckBox("Clipping", page);
    d_lineSplitting = new CheckBox("Split Lines", page);

    d_curveWidth = new SpinBox(0, 10, 1, page);

    d_curvePen = new QComboBox(page);
    d_curvePen->addItem("Solid");
    d_curvePen->addItem("Dotted");

    d_curveFilled = new CheckBox("Filled", page);

    int row = 0;

    QGridLayout *layout = new QGridLayout(page);
    layout->addWidget(new QLabel("Type", page), row, 0 );
    layout->addWidget(d_curveType, row++, 1);

    layout->addWidget(d_curveAntialiasing, row++, 0, 1, -1);
    layout->addWidget(d_curveClipping, row++, 0, 1, -1);
    layout->addWidget(d_lineSplitting, row++, 0, 1, -1);

    layout->addWidget(new QLabel("Width", page), row, 0 );
    layout->addWidget(d_curveWidth, row++, 1);

    layout->addWidget(new QLabel("Style", page), row, 0 );
    layout->addWidget(d_curvePen, row++, 1);

    layout->addWidget(d_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);

    switch(d_gridStyle->currentIndex())
    {
        case 0:
            s.grid.pen.setStyle(Qt::NoPen);
            break;
        case 2:
            s.grid.pen.setStyle(Qt::DashLine);
            break;
    }
    
    s.curve.pen.setStyle(d_curvePen->currentIndex() == 0 ?
        Qt::SolidLine : Qt::DotLine);
    s.curve.pen.setWidth(d_curveWidth->value());
    s.curve.brush.setStyle((d_curveFilled->isChecked()) ?
        Qt::SolidPattern : Qt::NoBrush);
    s.curve.numPoints = d_numPoints->value();
    s.curve.functionType = (Settings::FunctionType)d_curveType->currentIndex();
    if ( d_curveClipping->isChecked() )
        s.curve.paintAttributes |= QwtPlotCurve::ClipPolygons;
    else
        s.curve.paintAttributes &= ~QwtPlotCurve::ClipPolygons;

    if ( d_curveAntialiasing->isChecked() )
        s.curve.renderHint |= QwtPlotCurve::RenderAntialiased;
    else
        s.curve.renderHint &= ~QwtPlotCurve::RenderAntialiased;

    s.curve.lineSplitting = (d_lineSplitting->isChecked() );

    s.canvas.useBackingStore = (d_paintCache->isChecked() );
    s.canvas.paintOnScreen = (d_paintOnScreen->isChecked() );
    s.canvas.immediatePaint = (d_immediatePaint->isChecked() );

    s.updateInterval = d_updateInterval->value();
    s.updateType = (Settings::UpdateType)d_updateType->currentIndex();

    return s;
}

void Panel::setSettings(const Settings &s)
{
    d_numPoints->setValue(s.curve.numPoints);
    d_updateInterval->setValue(s.updateInterval);
    d_updateType->setCurrentIndex(s.updateType);

    switch(s.grid.pen.style())
    {
        case Qt::NoPen:
            d_gridStyle->setCurrentIndex(0);
            break;
        case Qt::DashLine:
            d_gridStyle->setCurrentIndex(2);
            break;
        default:
            d_gridStyle->setCurrentIndex(1); // Solid
    }

    d_paintCache->setChecked(s.canvas.useBackingStore );
    d_paintOnScreen->setChecked(s.canvas.paintOnScreen);
    d_immediatePaint->setChecked(s.canvas.immediatePaint);

    d_curveType->setCurrentIndex(s.curve.functionType);
    d_curveAntialiasing->setChecked(
        s.curve.renderHint & QwtPlotCurve::RenderAntialiased );

    d_curveClipping->setChecked(
        s.curve.paintAttributes & QwtPlotCurve::ClipPolygons);

    d_lineSplitting->setChecked(s.curve.lineSplitting );

    d_curveWidth->setValue(s.curve.pen.width());
    d_curvePen->setCurrentIndex(
        s.curve.pen.style() == Qt::SolidLine ? 0 : 1);
    d_curveFilled->setChecked(s.curve.brush.style() != Qt::NoBrush);
}