00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
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
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
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"