Dump traffic info.
[yandex-traffic] / mainwidget.cpp
1 #include <QtGui>
2
3 #include "globals.hpp"
4 #include "mainwidget.hpp"
5 #include "settingsDialog.hpp"
6 #include "connection.hpp"
7 #include "devstate.hpp"
8 #include "settings.hpp"
9 #include "log.hpp"
10 #include "menudialog.hpp"
11
12
13 // --------------------------------------------------
14 // MainWidget
15 // --------------------------------------------------
16 MainWidget::MainWidget ()
17     : QWidget ()
18 {
19 #ifdef Q_WS_MAEMO_5
20     setAttribute(Qt::WA_TranslucentBackground);
21 #endif
22     _light = new TrafficLight (this);
23     _label = new QLabel (this);
24     _timer = new QTimer (this);
25
26     _label->setAlignment (Qt::AlignHCenter | Qt::AlignVCenter);
27
28     _traffic = new Traffic;
29     _regions = new RegionsTable;
30     _settings = Settings::instance ();
31
32     QHBoxLayout *layout = new QHBoxLayout;
33     layout->addWidget (_light);
34     layout->addWidget (_label);
35     setLayout (layout);
36
37     applySettings ();
38
39     connect (_traffic, SIGNAL (updated ()), SLOT (trafficUpdated ()));
40     connect (_timer, SIGNAL (timeout ()), SLOT (updateData ()));
41     connect (DeviceState::instance (), SIGNAL (lockChanged (bool)), SLOT (deviceLockChanged (bool)));
42
43     updateData ();
44 }
45
46
47 MainWidget::~MainWidget ()
48 {
49     delete _traffic;
50     delete _regions;
51     delete _settings;
52
53     delete _light;
54     delete _label;
55 }
56
57
58 void MainWidget::paintEvent(QPaintEvent *event)
59 {
60     QPainter p(this);
61     p.setBrush (QColor(0, 0, 0, 128));
62     p.setPen (Qt::NoPen);
63     p.drawRoundedRect (rect(), 10, 10);
64     p.end ();
65
66     QWidget::paintEvent (event);
67 }
68
69
70 void MainWidget::trafficUpdated ()
71 {
72     ExtendedTrafficInfo info = _traffic->lookup_ext (_settings->regionID ());
73
74     if (info.valid ()) {
75         QString data;
76         bool first = true;
77         Log::instance ()->add ("trafficUpdated, info valid");
78         info.dump ();
79         _light->setColor (info.color ());
80
81         if (_settings->check (Settings::C_ShowRank)) {
82             data.append (tr ("%n point(s)", "", info.level ()));
83             first = false;
84         }
85
86         if (_settings->check (Settings::C_ShowTime)) {
87             if (!first)
88                 data.append (", ");
89             data.append (info.localtime ());
90             first = false;
91         }
92
93         if (_settings->check (Settings::C_ShowHint)) {
94             if (!first)
95                 data.append ("\n");
96             data.append (info.hint ());
97         }
98
99         _label->setText (data);
100     }
101     else {
102         Log::instance ()->add ("trafficUpdated, but info not valid");
103         _light->setColor (ExtendedTrafficInfo::Unknown);
104         _label->setText (tr ("No data"));
105     }
106 }
107
108
109 void MainWidget::updateData ()
110 {
111     bool update = true;
112
113     Log::instance ()->add ("updateData called");
114
115 #if CHECK_FOR_CONNECTION
116     update = ConnectionChecker::instance ()->checkConnection (_settings->check (Settings::C_UpdateOnGSM),
117                                                               _settings->check (Settings::C_UpdateOnWiFi));
118     Log::instance ()->add (QString ("checkConnection returned %1").arg (update ? "true" : "false"));
119     if (!_settings->check (Settings::C_UpdateWhenLocked)) {
120         Log::instance ()->add ("Check for device state");
121         update &= !DeviceState::instance ()->locked ();
122     }
123 #endif
124
125     if (update) {
126         Log::instance ()->add ("Perform update");
127         _traffic->update ();
128     }
129     else
130         Log::instance ()->add ("Update not performed");
131 }
132
133
134 void MainWidget::settingsDialog ()
135 {
136     SettingsDialog dlg (_settings);
137
138     dlg.exec ();
139
140     applySettings ();
141     trafficUpdated ();
142 }
143
144
145 void MainWidget::updateSize ()
146 {
147     QSize minSize (0, 80);
148
149     if (_settings->check (Settings::C_ShowLight))
150         minSize += QSize (80, 0);
151     if (_settings->check (Settings::C_ShowHint))
152         minSize += QSize (270, 0);
153     else {
154         if (_settings->check (Settings::C_ShowTime))
155             minSize += QSize (75, 0);
156         if (_settings->check (Settings::C_ShowRank))
157             minSize += QSize (75, 0);
158     }
159
160     setFixedSize (minSize);
161 }
162
163
164
165 void MainWidget::applySettings ()
166 {
167     _light->setVisible (_settings->check (Settings::C_ShowLight));
168
169     updateSize ();
170
171     Log::instance ()->add (QString ("applySettings: updateInterval is %1").arg (_settings->updateInterval ()));
172
173     if (_settings->updateInterval () < 0) {
174         _timer->stop ();
175         Log::instance ()->add ("Timer disabled");
176     }
177     else {
178         _timer->setInterval (1000 * 60 * _settings->updateInterval ());
179         _timer->start ();
180         Log::instance ()->add (QString ("Timer interval set to %1 ms").arg (1000 * 60 * _settings->updateInterval ()));
181     }
182 }
183
184
185 bool MainWidget::event (QEvent *event)
186 {
187     if (event->type () != QEvent::WindowActivate)
188         return QWidget::event (event);
189
190     MenuDialog menu (tr ("Yandex.Traffic"));
191
192     menu.addEntry (tr ("Settings")).addEntry (tr ("Update"));
193
194     switch (menu.run ()) {
195         case 0:
196             settingsDialog ();
197             break;
198         case 1:
199             _traffic->update ();
200             break;
201     }
202
203     return QWidget::event (event);
204 }
205
206
207 void MainWidget::deviceLockChanged (bool locked)
208 {
209     if (!_settings->check (Settings::C_UpdateWhenLocked))
210         if (!locked)
211             updateData ();
212 }