• Skip to content
  • Skip to link menu
KDE 4.2 API Reference
  • KDE API Reference
  • API Reference
  • Sitemap
  • Contact Us
 

Applets

temperature.cpp

Go to the documentation of this file.
00001 /*
00002  *   Copyright (C) 2007 Petri Damsten <damu@iki.fi>
00003  *   Copyright (C) 2008 Marco Martin <notmart@gmail.com>
00004  *
00005  *   This program is free software; you can redistribute it and/or modify
00006  *   it under the terms of the GNU Library General Public License version 2 as
00007  *   published by the Free Software Foundation
00008  *
00009  *   This program is distributed in the hope that it will be useful,
00010  *   but WITHOUT ANY WARRANTY; without even the implied warranty of
00011  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00012  *   GNU General Public License for more details
00013  *
00014  *   You should have received a copy of the GNU Library General Public
00015  *   License along with this program; if not, write to the
00016  *   Free Software Foundation, Inc.,
00017  *   51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
00018  */
00019 
00020 #include "temperature.h"
00021 #include <Plasma/SignalPlotter>
00022 #include <Plasma/Meter>
00023 #include <Plasma/Containment>
00024 #include <Plasma/Theme>
00025 #include <KConfigDialog>
00026 #include <QGraphicsLinearLayout>
00027 #include <QTimer>
00028 #include <cmath>
00029 
00030 Temperature::Temperature(QObject *parent, const QVariantList &args)
00031     : SM::Applet(parent, args), m_showPlotters(false), m_tempModel(0)
00032 {
00033     setHasConfigurationInterface(true);
00034     resize(215 + 20 + 23, 109 + 20 + 25);
00035     setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred);
00036     connect(Plasma::Theme::defaultTheme(), SIGNAL(themeChanged()), this, SLOT(themeChanged()));
00037 }
00038 
00039 Temperature::~Temperature()
00040 {
00041 }
00042 
00043 void Temperature::init()
00044 {
00045     KConfigGroup cg = persistentConfig();
00046     setEngine(dataEngine("systemmonitor"));
00047     m_showPlotters = cg.readEntry("showPlotters", true);
00048     setInterval(cg.readEntry("interval", 2) * 1000);
00049 
00050     setTitle(i18n("Temperature"));
00051     if (engine()->sources().count() == 0) {
00052         connect(engine(), SIGNAL(sourceAdded(QString)), this, SLOT(initLater(const QString)));
00053     } else {
00054         parseSources();
00055     }
00056 }
00057 
00058 void Temperature::parseSources()
00059 {
00060     KConfigGroup cg = persistentConfig();
00061     setItems(cg.readEntry("temps", engine()->sources().filter(QRegExp(".*temp.*", Qt::CaseInsensitive))));
00062     connectToEngine();
00063 }
00064 
00065 void Temperature::initLater(const QString &name)
00066 {
00067     // How we know all (cpu) sources are ready???
00068     if (name == "system/uptime") {
00069         QTimer::singleShot(0, this, SLOT(parseSources()));
00070     }
00071 }
00072 
00073 void Temperature::createConfigurationInterface(KConfigDialog *parent)
00074 {
00075     QWidget *widget = new QWidget();
00076     ui.setupUi(widget);
00077     m_tempModel.clear();
00078     m_tempModel.setHorizontalHeaderLabels(QStringList() << i18n("Sensor")
00079                                                         << i18n("Name"));
00080     Plasma::DataEngine *engine = dataEngine("systemmonitor");
00081     QStringList temps = engine->sources().filter(QRegExp(".*temp.*", Qt::CaseInsensitive));
00082 
00083     QStandardItem *parentItem = m_tempModel.invisibleRootItem();
00084     foreach (const QString& temp, temps) {
00085         QStandardItem *item1 = new QStandardItem(temp);
00086         item1->setEditable(false);
00087         item1->setCheckable(true);
00088         if (items().contains(temp)) {
00089             item1->setCheckState(Qt::Checked);
00090         }
00091         QStandardItem *item2 = new QStandardItem(title(temp));
00092         item2->setEditable(true);
00093         parentItem->appendRow(QList<QStandardItem *>() << item1 << item2);
00094     }
00095     ui.treeView->setModel(&m_tempModel);
00096     ui.treeView->resizeColumnToContents(0);
00097 
00098     ui.showPlotters->setChecked(m_showPlotters);
00099     ui.intervalSpinBox->setValue(interval() / 1000);
00100 
00101     parent->setButtons(KDialog::Ok | KDialog::Cancel | KDialog::Apply);
00102     parent->addPage(widget, i18n("Temperature"), "cpu");
00103     connect(parent, SIGNAL(applyClicked()), this, SLOT(configAccepted()));
00104     connect(parent, SIGNAL(okClicked()), this, SLOT(configAccepted()));
00105 }
00106 
00107 void Temperature::configAccepted()
00108 {
00109     KConfigGroup cg = persistentConfig();
00110     QStandardItem *parentItem = m_tempModel.invisibleRootItem();
00111 
00112     clearItems();
00113     for (int i = 0; i < parentItem->rowCount(); ++i) {
00114         QStandardItem *item = parentItem->child(i, 0);
00115         if (item) {
00116             cg.writeEntry(item->text(),
00117                         parentItem->child(i, 1)->text());
00118             if (item->checkState() == Qt::Checked) {
00119                 appendItem(item->text());
00120             }
00121         }
00122     }
00123     cg.writeEntry("temps", items());
00124 
00125     m_showPlotters = ui.showPlotters->isChecked();
00126     cg.writeEntry("showPlotters", m_showPlotters);
00127     uint interval = ui.intervalSpinBox->value();
00128     cg.writeEntry("interval", interval);
00129     interval *= 1000;
00130     setInterval(interval);
00131 
00132     emit configNeedsSaving();
00133     connectToEngine();
00134 }
00135 
00136 QString Temperature::title(const QString& source)
00137 {
00138     KConfigGroup cg = persistentConfig();
00139     return cg.readEntry(source, source.mid(source.lastIndexOf('/') + 1));
00140 }
00141 
00142 bool Temperature::addMeter(const QString& source)
00143 {
00144     Plasma::DataEngine *engine = dataEngine("systemmonitor");
00145     Plasma::DataEngine::Data data;
00146     Plasma::Theme* theme = Plasma::Theme::defaultTheme();
00147 
00148     if (!engine) {
00149         return false;
00150     }
00151     data = engine->query(source);
00152     QGraphicsLinearLayout *layout = new QGraphicsLinearLayout(Qt::Horizontal);
00153     layout->setContentsMargins(3, 3, 3, 3);
00154     layout->setSpacing(5);
00155 
00156     Plasma::Meter *meter = new Plasma::Meter(this);
00157     meter->setMeterType(Plasma::Meter::AnalogMeter);
00158     meter->setLabel(0, title(source));
00159     meter->setLabelColor(0, theme->color(Plasma::Theme::TextColor));
00160     meter->setLabel(1, QString());
00161     meter->setLabelColor(1, QColor("#000"));
00162     meter->setLabelAlignment(1, Qt::AlignCenter);
00163     QFont font = theme->font(Plasma::Theme::DefaultFont);
00164     font.setPointSize(7);
00165     meter->setLabelFont(0, font);
00166     meter->setLabelFont(1, font);
00167     meter->setMinimum(0);
00168     meter->setMaximum(110);
00169     layout->addItem(meter);
00170     appendMeter(source, meter);
00171     appendKeepRatio(meter);
00172 
00173     if (mode() != SM::Applet::Panel && m_showPlotters) {
00174         Plasma::SignalPlotter *plotter = new Plasma::SignalPlotter(this);
00175         plotter->addPlot(theme->color(Plasma::Theme::TextColor));
00176         plotter->setUseAutoRange(true);
00177         plotter->setThinFrame(false);
00178         plotter->setShowLabels(false);
00179         plotter->setShowTopBar(false);
00180         plotter->setShowVerticalLines(false);
00181         plotter->setShowHorizontalLines(false);
00182         plotter->setSvgBackground("widgets/plot-background");
00183         layout->addItem(plotter);
00184         appendPlotter(source, plotter);
00185         setRatioOrientation(Qt::Horizontal);
00186     } else {
00187         setMinimumWidth(24);
00188     }
00189     mainLayout()->addItem(layout);
00190 
00191     dataUpdated(source, data);
00192     //setPreferredItemHeight(layout->preferredSize().height());
00193     setPreferredItemHeight(80);
00194     return true;
00195 }
00196 
00197 void Temperature::themeChanged()
00198 {
00199     Plasma::Theme* theme = Plasma::Theme::defaultTheme();
00200     foreach (Plasma::Meter *w, meters().values()) {
00201         w->setLabelColor(0, theme->color(Plasma::Theme::TextColor));
00202         QFont font = theme->font(Plasma::Theme::DefaultFont);
00203         font.setPointSize(7);
00204         w->setLabelFont(0, font);
00205         w->setLabelFont(1, font);
00206     }
00207     foreach (Plasma::SignalPlotter *plotter, plotters().values()) {
00208         plotter->removePlot(0);
00209         plotter->addPlot(theme->color(Plasma::Theme::TextColor));
00210     }
00211 }
00212 
00213 void Temperature::dataUpdated(const QString& source,
00214                               const Plasma::DataEngine::Data &data)
00215 {
00216     if (!items().contains(source)) {
00217         return;
00218     }
00219     Plasma::Meter *w = meters().value(source);
00220     if (!w) {
00221         return;
00222     }
00223     w->setValue(data["value"].toDouble());
00224 
00225     qreal celsius = ((qreal)data["value"].toDouble());
00226 
00227     if (KGlobal::locale()->measureSystem() == KLocale::Metric) {
00228         w->setLabel(1, i18n("%1 °C", celsius));
00229     } else {
00230         w->setLabel(1, i18n("%1 °F", (celsius * 1.8) + 32));
00231     }
00232 
00233     if (m_showPlotters) {
00234         Plasma::SignalPlotter *plotter = plotters().value(source);
00235         if (plotter) {
00236             plotter->addSample(QList<double>() << data["value"].toDouble());
00237         }
00238     }
00239 }
00240 
00241 #include "temperature.moc"

Applets

Skip menu "Applets"
  • Main Page
  • Namespace List
  • Class Hierarchy
  • Alphabetical List
  • Class List
  • File List
  • Namespace Members
  • Class Members

API Reference

Skip menu "API Reference"
  • KWin
  •   KWin Libraries
  • Libraries
  •   libkworkspace
  •   libsolidcontrol
  •   libtaskmanager
  • Plasma
  •   Animators
  •   Applets
  •   Engines
  • Solid Modules
Generated for API Reference by doxygen 1.5.7
This website is maintained by Adriaan de Groot and Allen Winter.
KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal