2
* Copyright (C) 2007 Petri Damsten <damu@iki.fi>
3
* Copyright (C) 2008 Marco Martin <notmart@gmail.com>
4
* Copyright (C) 2010 Michel Lafon-Puyo <michel.lafonpuyo@gmail.com>
5
* Copyright (C) 2011 Elvis Stansvik <elvstone@gmail.com>
7
* This program is free software; you can redistribute it and/or modify
8
* it under the terms of the GNU Library General Public License version 2 as
9
* published by the Free Software Foundation
11
* This program is distributed in the hope that it will be useful,
12
* but WITHOUT ANY WARRANTY; without even the implied warranty of
13
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
* GNU General Public License for more details
16
* You should have received a copy of the GNU Library General Public
17
* License along with this program; if not, write to the
18
* Free Software Foundation, Inc.,
19
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
22
#include "temperature.h"
23
#include <Plasma/Meter>
24
#include <Plasma/Containment>
25
#include <Plasma/Theme>
26
#include <KConfigDialog>
27
#include <KUnitConversion/Converter>
28
#include <KUnitConversion/Value>
29
#include <QGraphicsLinearLayout>
33
#include "temperature-offset-delegate.h"
35
using namespace KUnitConversion;
37
Temperature::Temperature(QObject *parent, const QVariantList &args)
38
: SM::Applet(parent, args)
40
, m_rx(".*temp.*", Qt::CaseInsensitive)
42
setHasConfigurationInterface(true);
43
resize(215 + 20 + 23, 109 + 20 + 25);
44
setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred);
45
m_sourceTimer.setSingleShot(true);
46
connect(&m_sourceTimer, SIGNAL(timeout()), this, SLOT(sourcesAdded()));
49
Temperature::~Temperature()
53
void Temperature::init()
55
KGlobal::locale()->insertCatalog("plasma_applet_system-monitor");
56
setEngine(dataEngine("systemmonitor"));
57
setTitle(i18n("Temperature"));
59
/* At the time this method is running, not all source may be connected. */
60
connect(engine(), SIGNAL(sourceAdded(const QString&)), this, SLOT(sourceAdded(const QString&)));
61
foreach (const QString& source, engine()->sources()) {
66
void Temperature::configChanged()
68
KConfigGroup cg = config();
69
setInterval(cg.readEntry("interval", 2.0) * 1000.0);
70
setSources(cg.readEntry("temps", m_sources.mid(0, 5)));
74
void Temperature::sourceAdded(const QString& name)
76
if (m_rx.indexIn(name) != -1) {
77
//kDebug() << m_rx.cap(1);
79
if (!m_sourceTimer.isActive()) {
80
m_sourceTimer.start(0);
85
void Temperature::sourcesAdded()
90
void Temperature::createConfigurationInterface(KConfigDialog *parent)
92
QWidget *widget = new QWidget();
95
m_tempModel.setHorizontalHeaderLabels(QStringList() << i18n("Sensor")
99
QStandardItem *parentItem = m_tempModel.invisibleRootItem();
100
foreach (const QString& temp, m_sources) {
101
QStandardItem *item1 = new QStandardItem(temp);
102
item1->setEditable(false);
103
item1->setCheckable(true);
104
if (sources().contains(temp)) {
105
item1->setCheckState(Qt::Checked);
107
QStandardItem *item2 = new QStandardItem(temperatureTitle(temp));
108
item2->setEditable(true);
109
QStandardItem *item3 = new QStandardItem(
110
KGlobal::locale()->formatNumber(temperatureOffset(temp), 1));
111
item3->setEditable(true);
112
parentItem->appendRow(QList<QStandardItem *>() << item1 << item2 << item3);
114
ui.treeView->setModel(&m_tempModel);
115
ui.treeView->resizeColumnToContents(0);
116
ui.treeView->setItemDelegateForColumn(2, new TemperatureOffsetDelegate());
118
ui.intervalSpinBox->setValue(interval() / 1000.0);
119
ui.intervalSpinBox->setSuffix(i18nc("second", " s"));
120
parent->setButtons(KDialog::Ok | KDialog::Cancel | KDialog::Apply);
121
parent->addPage(widget, i18n("Temperature"), "media-flash");
123
connect(parent, SIGNAL(applyClicked()), this, SLOT(configAccepted()));
124
connect(parent, SIGNAL(okClicked()), this, SLOT(configAccepted()));
125
connect(ui.treeView, SIGNAL(clicked(QModelIndex)), parent, SLOT(settingsModified()));
126
connect(ui.intervalSpinBox, SIGNAL(valueChanged(QString)), parent, SLOT(settingsModified()));
129
void Temperature::configAccepted()
131
KConfigGroup cg = config();
132
KConfigGroup cgGlobal = globalConfig();
133
QStandardItem *parentItem = m_tempModel.invisibleRootItem();
137
for (int i = 0; i < parentItem->rowCount(); ++i) {
138
QStandardItem *item = parentItem->child(i, 0);
140
cgGlobal.writeEntry(item->text(),
141
parentItem->child(i, 1)->text());
142
cgGlobal.writeEntry(item->text() + "_offset", QString::number(
143
parentItem->child(i, 2)->data(Qt::EditRole).toDouble(), 'f', 1));
144
if (item->checkState() == Qt::Checked) {
145
appendSource(item->text());
149
cg.writeEntry("temps", sources());
150
uint interval = ui.intervalSpinBox->value();
151
cg.writeEntry("interval", interval);
153
emit configNeedsSaving();
156
QString Temperature::temperatureTitle(const QString& source)
158
KConfigGroup cg = globalConfig();
159
return cg.readEntry(source, source.mid(source.lastIndexOf('/') + 1).replace('_',' '));
162
double Temperature::temperatureOffset(const QString& source)
164
KConfigGroup cg = globalConfig();
165
return cg.readEntry(source + "_offset", 0.0);
168
bool Temperature::addVisualization(const QString& source)
170
Plasma::DataEngine *engine = dataEngine("systemmonitor");
176
SM::Plotter *plotter = new SM::Plotter(this);
177
plotter->setTitle(temperatureTitle(source));
178
plotter->setAnalog(mode() != SM::Applet::Panel);
180
if (KGlobal::locale()->measureSystem() == KLocale::Metric) {
181
plotter->setMinMax(0, 110);
182
plotter->setUnit(QString::fromUtf8("°C"));
184
plotter->setMinMax(32, 230);
185
plotter->setUnit(QString::fromUtf8("°F"));
187
appendVisualization(source, plotter);
189
Plasma::DataEngine::Data data = engine->query(source);
190
dataUpdated(source, data);
191
setPreferredItemHeight(80);
195
void Temperature::dataUpdated(const QString& source,
196
const Plasma::DataEngine::Data &data)
198
if (!sources().contains(source)) {
201
SM::Plotter *plotter = qobject_cast<SM::Plotter*>(visualization(source));
203
QString unit = data["units"].toString();
204
double doubleValue = data["value"].toDouble() + temperatureOffset(source);
205
Value value = Value(doubleValue, unit);
207
if (KGlobal::locale()->measureSystem() == KLocale::Metric) {
208
value = value.convertTo(Celsius);
210
value = value.convertTo(Fahrenheit);
215
plotter->addSample(QList<double>() << value.number());
218
temp = value.toSymbolString();
220
if (mode() == SM::Applet::Panel) {
222
QString("<tr><td>%1</td><td>%2</td></tr>").arg(temperatureTitle(source)).arg(temp));
226
#include "temperature.moc"