german translation
[qbat.git] / powermanager.cpp
blobbb6eccd6988d73d955b93df76fbf80ebf2c2922d
1 //
2 // C++ Implementation: powermanager
3 //
4 // Author: Oliver Groß <z.o.gross@gmx.de>, (C) 2008
5 //
6 // Copyright: See COPYING file that comes with this distribution
7 //
8 #include <QtGui>
9 #include "powermanager.h"
10 #include "common.h"
11 #include "settings.h"
12 #include "batteryicon.h"
13 #include "qtimermessagebox.h"
15 namespace qbat {
16 using namespace std;
18 CPowerManager::CPowerManager(QObject * parent) :
19 QObject(parent),
20 m_Timer(-1),
21 m_DataTimer(-1),
22 // m_RelativeCapacity(100),
23 m_ACPlug(false),
24 m_CriticalHandled(false),
25 m_SettingsFile(UI_FILE_CONFIG, QSettings::IniFormat, this)
27 readSettings();
28 m_ContextMenu.addAction(tr("&Settings"), this, SLOT(showSettings()))->setEnabled(CBatteryIcon::sysfsDir.exists());
29 m_ContextMenu.addAction(tr("&About"), this, SLOT(showAbout()));
30 m_ContextMenu.addSeparator();
31 m_ContextMenu.addAction(tr("&Quit"), qApp, SLOT(quit()));
33 m_DefaultIcon = new CBatteryIcon(&m_Settings, tr("merged"), this);
34 m_DefaultIcon->setContextMenu(&m_ContextMenu);
36 if (CBatteryIcon::sysfsDir.exists()) {
37 m_DataTimer = startTimer(15000);
38 m_Timer = startTimer(m_Settings.pollingRate);
40 updateSupplies();
43 CPowerManager::~CPowerManager() {
44 killTimer(m_Timer);
45 killTimer(m_DataTimer);
46 writeSettings();
49 inline void CPowerManager::readSettings() {
50 m_SettingsFile.beginGroup("Main");
51 m_Settings.pollingRate = m_SettingsFile.value("pollingRate", 3000).toUInt();
52 m_Settings.showBalloon = m_SettingsFile.value("showBalloon", false).toBool();
53 m_SettingsFile.endGroup();
55 m_SettingsFile.beginGroup("TrayIcons");
56 m_Settings.mergeBatteries = m_SettingsFile.value("mergeBatteries", false).toBool();
57 m_Settings.colors[UI_COLOR_PEN] = m_SettingsFile.value("textColor", 0).toUInt();
58 m_Settings.colors[UI_COLOR_PEN_FULL] = m_SettingsFile.value("textFullColor", 0).toUInt();
59 m_Settings.colors[UI_COLOR_BRUSH_CHARGED] = m_SettingsFile.value("mainChargedColor", qRgb( 0, 255, 0)).toUInt();
60 m_Settings.colors[UI_COLOR_BRUSH_EMPTY] = m_SettingsFile.value("mainEmptyColor", qRgb(255, 255, 255)).toUInt();
61 m_Settings.colors[UI_COLOR_BRUSH_FULL] = m_SettingsFile.value("mainFullColor", m_Settings.colors[UI_COLOR_BRUSH_CHARGED]).toUInt();
62 m_Settings.colors[UI_COLOR_BRUSH_POLE] = m_SettingsFile.value("poleColor", qRgb(255, 255, 0)).toUInt();
63 m_Settings.colors[UI_COLOR_BRUSH_POLE_FULL] = m_SettingsFile.value("poleFullColor", m_Settings.colors[UI_COLOR_BRUSH_POLE]).toUInt();
64 m_SettingsFile.endGroup();
66 m_SettingsFile.beginGroup("CriticalEvent");
67 m_Settings.handleCritical = m_SettingsFile.value("handle", false).toBool();
68 m_Settings.criticalCapacity = m_SettingsFile.value("criticalCapacity", 7).toUInt();
69 m_Settings.executeCommand = m_SettingsFile.value("executeCommand", false).toBool();
70 m_Settings.criticalCommand = m_SettingsFile.value("command", "").toString();
71 m_Settings.confirmCommand = m_SettingsFile.value("confirmCommand", false).toBool();
72 m_Settings.confirmWithTimeout = m_SettingsFile.value("confirmWithTimeout", false).toBool();
73 m_Settings.timeoutValue = m_SettingsFile.value("timeoutValue", 5).toUInt();
74 m_SettingsFile.endGroup();
77 inline void CPowerManager::writeSettings() {
78 m_SettingsFile.beginGroup("Main");
79 m_SettingsFile.setValue("pollingRate", m_Settings.pollingRate);
80 m_SettingsFile.setValue("showBalloon", m_Settings.showBalloon);
81 m_SettingsFile.endGroup();
83 m_SettingsFile.beginGroup("TrayIcons");
84 m_SettingsFile.setValue("mergeBatteries", m_Settings.mergeBatteries);
85 m_SettingsFile.setValue("textColor", m_Settings.colors[UI_COLOR_PEN]);
86 m_SettingsFile.setValue("textFullColor", m_Settings.colors[UI_COLOR_PEN_FULL]);
87 m_SettingsFile.setValue("mainChargedColor", m_Settings.colors[UI_COLOR_BRUSH_CHARGED]);
88 m_SettingsFile.setValue("mainEmptyColor", m_Settings.colors[UI_COLOR_BRUSH_EMPTY]);
89 m_SettingsFile.setValue("mainFullColor", m_Settings.colors[UI_COLOR_BRUSH_FULL]);
90 m_SettingsFile.setValue("poleColor", m_Settings.colors[UI_COLOR_BRUSH_POLE]);
91 m_SettingsFile.setValue("poleFullColor", m_Settings.colors[UI_COLOR_BRUSH_POLE_FULL]);
92 m_SettingsFile.endGroup();
94 m_SettingsFile.beginGroup("CriticalEvent");
95 m_SettingsFile.setValue("handle", m_Settings.handleCritical);
96 m_SettingsFile.setValue("criticalCapacity", m_Settings.criticalCapacity);
97 m_SettingsFile.setValue("executeCommand", m_Settings.executeCommand);
98 m_SettingsFile.setValue("command", m_Settings.criticalCommand);
99 m_SettingsFile.setValue("confirmCommand", m_Settings.confirmCommand);
100 m_SettingsFile.setValue("confirmWithTimeout", m_Settings.confirmWithTimeout);
101 m_SettingsFile.setValue("timeoutValue", m_Settings.timeoutValue);
102 m_SettingsFile.endGroup();
105 void CPowerManager::timerEvent(QTimerEvent * event) {
106 if (event->timerId() == m_Timer)
107 updateSupplies();
108 else if (event->timerId() == m_DataTimer)
109 updateBatteryData();
112 void CPowerManager::updateSupplies() {
113 if (CBatteryIcon::sysfsDir.exists()) {
114 bool oldAC = m_ACPlug;
115 m_ACPlug = false;
117 QStringList powerSupplies = CBatteryIcon::sysfsDir.entryList(QDir::Dirs | QDir::NoDotAndDotDot);
119 QList<CBatteryIcon *> newBatteryIcons;
120 CBatteryIcon * currentBatteryIcon;
122 foreach(QString i, powerSupplies) {
123 // this is possibly not very reliable
124 if (CBatteryIcon::sysfsDir.exists(i + "/online")) {
125 if (readIntSysFile(CBatteryIcon::sysfsDir.filePath(i + "/online").toAscii().constData()) == 1) {
126 m_ACPlug = true;
127 m_CriticalHandled = false;
130 else {
131 if (m_BatteryIcons.contains(i)) {
132 currentBatteryIcon = m_BatteryIcons.take(i);
134 else {
135 // qDebug("new battery: %s", i.toAscii().constData());
136 currentBatteryIcon = new CBatteryIcon(&m_Settings, i, this);
137 currentBatteryIcon->setContextMenu(&m_ContextMenu);
138 currentBatteryIcon->updateData();
139 currentBatteryIcon->updateIcon();
140 currentBatteryIcon->updateToolTip();
142 if (!m_Settings.mergeBatteries)
143 currentBatteryIcon->show();
145 m_CriticalHandled = false;
147 newBatteryIcons << currentBatteryIcon;
151 foreach(CBatteryIcon * i, m_BatteryIcons)
152 delete i;
154 m_BatteryIcons.clear();
156 foreach(CBatteryIcon * i, newBatteryIcons)
157 m_BatteryIcons.insert(i->data().name, i);
159 if (oldAC != m_ACPlug)
160 updateBatteryData();
161 else
162 updateMergedData();
164 if (m_BatteryIcons.isEmpty()) {
165 if (!m_DefaultIcon->isVisible()) {
166 m_DefaultIcon->setVisible(true);
167 m_DefaultIcon->setIcon(QIcon(UI_ICON_QBAT_SMALL));
169 if (m_ACPlug)
170 m_DefaultIcon->setToolTip("QBat - " + tr("AC adapter plugged in"));
171 else
172 m_DefaultIcon->setToolTip("QBat - " + tr("AC adapter unplugged"));
175 else {
176 if (!m_DefaultIcon->isVisible()) {
177 m_DefaultIcon->updateData();
178 m_DefaultIcon->updateIcon();
180 m_DefaultIcon->setVisible(m_Settings.mergeBatteries);
183 checkCritical();
185 else {
186 m_DefaultIcon->setToolTip("QBat - " + tr("no information available"));
187 m_DefaultIcon->setVisible(true);
192 void CPowerManager::updateMergedData() {
193 if (!m_BatteryIcons.isEmpty()) {
194 int fullCount = 0;
196 int fullCapacity = 0;
197 int currentCapacity = 0;
198 int status = 0;
200 foreach (CBatteryIcon * battery, m_BatteryIcons) {
201 if (battery->data().fullCapacity) {
202 fullCapacity += battery->data().fullCapacity;
203 fullCount++;
206 currentCapacity += battery->data().currentCapacity;
208 if ((!status) || (battery->data().status != UI_BATTERY_FULL))
209 status = battery->data().status;
212 if (fullCount)
213 fullCapacity /= fullCount;
215 currentCapacity /= m_BatteryIcons.count();
217 m_DefaultIcon->updateData(currentCapacity, fullCapacity, 0, 0, 0, status, false);
221 void CPowerManager::checkCritical() {
222 if (m_ACPlug || m_CriticalHandled ||
223 m_DefaultIcon->data().relativeCharge == -1 || !m_Settings.handleCritical ||
224 m_DefaultIcon->data().relativeCharge > m_Settings.criticalCapacity)
225 return;
227 QString msgTitle = (m_Settings.executeCommand && m_Settings.confirmWithTimeout) ?
228 tr("QBat - critical battery capacity (will automatically choose ok on timeout)"):
229 tr("QBat - critical battery capacity");
230 QString msgText = (m_Settings.executeCommand && m_Settings.confirmCommand) ?
231 tr("WARNING: The attached battery(s) reached the critical mark.\n"
232 "Click cancel and please make sure to save and shut down soon or provide another source of power\n"
233 "or:\n"
234 "Click ok to execute:\n%1").arg(m_Settings.criticalCommand) :
235 tr("WARNING: The attached battery(s) reached the critical mark.\n"
236 "Please make sure to save and shut down soon or provide another source of power.");
237 if (m_Settings.executeCommand && (!m_Settings.confirmCommand || (QTimerMessageBox::warning(NULL, msgTitle, msgText,
238 (m_Settings.confirmWithTimeout) ? m_Settings.timeoutValue : -1, QMessageBox::Ok | QMessageBox::Cancel))))
239 QProcess::startDetached(m_Settings.criticalCommand);
240 else {
241 if (m_Settings.showBalloon)
242 m_BatteryIcons.begin().value()->showMessage(msgTitle, msgText, QSystemTrayIcon::Warning, 7000);
243 else
244 QMessageBox::warning(NULL, msgTitle, msgText);
246 m_CriticalHandled = true;
249 void CPowerManager::updateBatteryData() {
250 foreach (CBatteryIcon * battery, m_BatteryIcons)
251 battery->updateData();
253 updateMergedData();
254 checkCritical();
257 void CPowerManager::restartTimer() {
258 killTimer(m_Timer);
259 m_Timer = startTimer(m_Settings.pollingRate);
260 killTimer(m_DataTimer);
261 m_DataTimer = startTimer(15000);
264 void CPowerManager::showSettings() {
265 CSettings dialog;
267 if (dialog.execute(&m_Settings)) {
268 foreach (CBatteryIcon * i, m_BatteryIcons) {
269 delete i;
272 m_BatteryIcons.clear();
273 m_DefaultIcon->updateData(0, 0, 0, 0, 0, 0, false);
275 updateSupplies();
276 restartTimer();
280 void CPowerManager::showAbout() {
281 if (m_Settings.showBalloon) {
282 if (m_DefaultIcon->isVisible())
283 m_DefaultIcon->showMessage(tr("About QBat"), UI_NAME + "\nv" + QString(UI_VERSION),
284 QSystemTrayIcon::Information, 4000);
285 else
286 m_BatteryIcons.begin().value()->showMessage(tr("About QBat"), UI_NAME + "\nv" + QString(UI_VERSION),
287 QSystemTrayIcon::Information, 4000);
289 else {
290 QMessageBox aboutBox;
292 aboutBox.setWindowIcon(QIcon(UI_ICON_QBAT_SMALL));
293 aboutBox.setIconPixmap(QPixmap(UI_ICON_QBAT_LARGE));
294 aboutBox.setWindowTitle(tr("About QBat"));
295 aboutBox.setText(UI_NAME + "\nv" + QString(UI_VERSION));
296 aboutBox.setStandardButtons(QMessageBox::Ok);
298 aboutBox.exec();