#include <qapplication.h>
#include <qwidget.h>
#include <qfont.h>
#include <qlabel.h>
#include <qgroupbox.h>
#include <qlayout.h>
#include <qwt_thermo.h>

class ValueBar: public QWidget
{
public:
    ValueBar(Qt::Orientation orientation, 
            const QString &text, QWidget *parent, double value = 0.0):
        QWidget(parent)
    {
        d_label = new QLabel(text, this);
        d_label->setFont(QFont("Helvetica", 10));

        d_thermo = new QwtThermo(this);
        d_thermo->setRange(0.0,100.0);
        d_thermo->setValue(value);
        d_thermo->setFont(QFont("Helvetica", 8));
        d_thermo->setPipeWidth(6);
        d_thermo->setScaleMaxMajor(6);
        d_thermo->setScaleMaxMinor(5);
        d_thermo->setMargin(10);
        d_thermo->setFillColor(QColor("DarkMagenta"));

        QVBoxLayout *layout = new QVBoxLayout(this);
        layout->setMargin(0);
        layout->setSpacing(0);

        if ( orientation == Qt::Horizontal )
        {
            d_label->setAlignment(Qt::AlignCenter);
            d_thermo->setOrientation(orientation, QwtThermo::BottomScale);
            layout->addWidget(d_label);
            layout->addWidget(d_thermo);
        }
        else
        {
            d_label->setAlignment(Qt::AlignRight);
            d_thermo->setOrientation(orientation, QwtThermo::LeftScale);
            layout->addWidget(d_thermo, 10, Qt::AlignHCenter);
            layout->addWidget(d_label, 0);
        }
    }

    void setValue(double value)
    {
        d_thermo->setValue(value);
    }
private:
    QLabel *d_label;
    QwtThermo *d_thermo;
};

class SysInfo : public QFrame
{
public:
    SysInfo(QWidget *parent = NULL):
        QFrame(parent)
    {   
        QGroupBox *memBox = new QGroupBox("Memory Usage", this);
        memBox->setFont(QFont("Helvetica", 10));

        QVBoxLayout *memLayout = new QVBoxLayout(memBox);
        memLayout->setMargin(15);
        memLayout->setSpacing(5);

        Qt::Orientation o = Qt::Horizontal;
        memLayout->addWidget(new ValueBar(o, "Used", memBox, 57));
        memLayout->addWidget(new ValueBar(o, "Shared", memBox, 17));
        memLayout->addWidget(new ValueBar(o, "Cache", memBox, 30));
        memLayout->addWidget(new ValueBar(o, "Buffers", memBox, 22));
        memLayout->addWidget(new ValueBar(o, "Swap Used", memBox, 57));
        memLayout->addWidget(new QWidget(memBox), 10); // spacer

        QGroupBox *cpuBox = new QGroupBox("Cpu Usage", this);
        cpuBox->setFont(QFont("Helvetica", 10));

        QHBoxLayout *cpuLayout = new QHBoxLayout(cpuBox);
        cpuLayout->setMargin(15);
        cpuLayout->setSpacing(5);

        o = Qt::Vertical;
        cpuLayout->addWidget(new ValueBar(o, "User", cpuBox, 57));
        cpuLayout->addWidget(new ValueBar(o, "Total", cpuBox, 73));
        cpuLayout->addWidget(new ValueBar(o, "System", cpuBox, 16));
        cpuLayout->addWidget(new ValueBar(o, "Idle", cpuBox, 27));

        QHBoxLayout *layout = new QHBoxLayout(this);
        layout->setMargin(10);
        layout->addWidget(memBox, 10);
        layout->addWidget(cpuBox, 0);
    }
};

int main (int argc, char **argv)
{
    QApplication a(argc, argv);
    
    SysInfo info;
    info.resize(info.sizeHint().expandedTo(QSize(600, 400)));
#if QT_VERSION < 0x040000
    a.setMainWidget(&info);
#endif
    info.show();

    int rv = a.exec();
    return rv;
}
