/[projects]/infoscreen/MainView.cpp
ViewVC logotype

Contents of /infoscreen/MainView.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 869 - (show annotations) (download)
Mon Jun 21 13:32:45 2010 UTC (13 years, 11 months ago) by torben
File size: 8113 byte(s)
enable loading html files in local mode
1 #include "MainView.h"
2 #include <QApplication>
3 #include <QPushButton>
4 #include <QLabel>
5 #include <QVBoxLayout>
6 #include <QSvgWidget>
7
8 #include <QTimer>
9 #include <QKeyEvent>
10 #include <QSettings>
11 #include <QMessageBox>
12
13 #include "MyWebView.h"
14 #include "clientsiderender.h"
15 #include "pictureview.h"
16 #include "videoview.h"
17
18 #include "httpwrapper.h"
19
20
21 MainView::MainView(QWidget* parent)
22 : QWidget(parent), timer(0)
23 {
24 loadSettings();
25
26 if ( currentMode == ModeXml) {
27 xmlUrl = url + "?screen_id=" + screenid;
28 qDebug() << "Starting XML mode";
29 qDebug() << "xmlUrl" << xmlUrl;
30 }
31
32 if (currentMode == ModeSimpleWeb){
33 qDebug() << "Starting plain browser mode";
34 web->setVisible(true);
35 web->start(url,screenid);
36 }
37
38 if (currentMode == ModeLocal ) {
39 qDebug() << "Starting local mode";
40 qDebug() << "path" << path;
41
42 readLocalFiles();
43 }
44
45 this->resize(400,400);
46 this->setWindowState( Qt::WindowFullScreen );
47 this->grabKeyboard();
48
49 qApp->setOverrideCursor( QCursor( Qt::BlankCursor) );
50
51 render = new ClientSideRender(this);
52 render->setVisible( false );
53
54 web = new MyWebView(this);
55 web->setVisible( false);
56
57 picture = new PictureView(this);
58 picture->setVisible( false );
59
60 video = new VideoView(this);
61 video->setVisible(false);
62
63 svg = new QSvgWidget(this);
64 svg->setVisible(false);
65
66 QVBoxLayout* layout = new QVBoxLayout();
67 layout->addWidget(web,1);
68 layout->addWidget(render,1);
69 layout->addWidget(picture,1);
70 layout->addWidget(video,1);
71 layout->addWidget(svg,1);
72 layout->addStretch();
73 layout->setContentsMargins(0,0,0,0);
74 setLayout(layout);
75
76
77 if (currentMode == ModeXml || currentMode == ModeLocal) {
78 qDebug() << "Starting timer...";
79 timer = new QTimer(this);
80 connect(timer, SIGNAL(timeout() ), this, SLOT(onTimer() ));
81 timer->start(100);
82 }
83 }
84
85 void MainView::loadSettings()
86 {
87 settings = new QSettings("Caddi", "infoscreen");
88
89 qDebug() << "Loading settings" << settings->fileName();
90
91 QString mode = settings->value("mode").toString().toLower();
92 if (mode == "simpleweb") {
93 currentMode = ModeSimpleWeb;
94 } else if (mode == "xml") {
95 currentMode = ModeXml;
96 } else if (mode == "local") {
97 currentMode = ModeLocal;
98 } else {
99 currentMode = ModeNone;
100 QMessageBox::warning(this, "infoscreen", "no operation mode set or mode given an invalid value");
101 exit(1);
102 }
103
104
105 if (currentMode == ModeSimpleWeb || currentMode == ModeXml) {
106 url = settings->value("url").toString();
107 screenid = settings->value("screenid").toString();
108 if (url == "" || screenid == "") {
109 QMessageBox::warning(this,"infoscreen","Could not find url or screenid in config file " + settings->fileName());
110
111 exit(1); //Normal qApp->exit() doesn't terminate the init sequence so use std C exit function
112 }
113 }
114
115 if (currentMode == ModeLocal) {
116 path = settings->value("path").toString();
117
118 if (path == "") {
119 QMessageBox::warning(this,"infoscreen","Could not find path in config file " + settings->fileName());
120 exit(1);
121 }
122 }
123 }
124
125 void MainView::closeEvent ( QCloseEvent * event )
126 {
127 Q_UNUSED(event);
128 exit(0); //force application shutdown
129 }
130
131 void MainView::keyPressEvent ( QKeyEvent* event )
132 {
133 int key = event->key();
134 if (key == ' ' || key == Qt::Key_Return || key == Qt::Key_Enter) {
135 close();
136 }
137 }
138
139 void MainView::onTimer()
140 {
141 screenManager.timerTick();
142
143 if (currentMode == ModeXml) {
144 readXml();
145 }
146
147 switchScreens();
148 }
149
150
151 void MainView::readLocalFiles()
152 {
153 QDir dir(path);
154 if (! dir.exists()) {
155 QMessageBox::warning(this,"infoscreen","Local Source directory not found: " + path);
156 exit(1);
157 }
158 QFileInfoList files = dir.entryInfoList(QDir::Files, QDir::Name); //only files, sort by name
159
160 for (int i=0; i<files.size(); ++i) {
161 QFileInfo file = files[i];
162 qDebug() << "Found" << file.fileName();
163
164 ScreenItem item;
165 item.url = file.filePath();
166 item.module = ModuleUnknown;
167
168 QString ext = file.suffix().toLower();
169 if (ext == "avi" || ext == "mpg" || ext == "mpeg") {
170 item.module = ModuleVideo;
171 item.runtime = 1;
172 }
173
174 if (ext == "jpg" || ext == "jpeg" || ext == "png" ) {
175 item.module = ModuleImage;
176 item.runtime = 10;
177 }
178
179 if (ext == "svg") {
180 item.module = ModuleSvg;
181 item.runtime = 10;
182 }
183
184 if (ext == "htm" || ext == "html") {
185 item.module = ModuleWeb;
186 item.runtime = 10;
187 }
188
189 if (item.module != ModuleUnknown) { //no need to enqueue unknown modules
190 screenItems.push_back( item );
191 }
192
193 }
194
195 qDebug() << "Found " << screenItems.size() << " playable items";
196 }
197
198
199 bool MainView::readXml()
200 {
201 const int TIMEOUT = 30*60*1000; // 30 minutter
202 if ( lastXml.isNull() || lastXml.elapsed() > TIMEOUT) {
203
204
205 bool res = xmlHandler.readXml( xmlUrl );
206
207 lastXml = QTime::currentTime();
208
209 screenItems = xmlHandler.getScreenSet();
210
211 if ( currentItemIdx >= screenItems.size() )
212 currentItemIdx = screenItems.size()-1; //avoid overflow
213
214
215 return true;
216 } else {
217 return false;
218 }
219 }
220
221 void MainView::switchScreens()
222 {
223 if (video->isVisible() && video->isPlaying() ) {
224 return; //wait until current clip has finished
225 }
226
227 if (lastScreenSwitch.isNull() || lastScreenSwitch.elapsed() > (currentItem.runtime*1000)) {
228
229 QTime now = QTime::currentTime();
230 if (lastScreenSwitch.isNull())
231 currentItemIdx = -1;
232
233 bool found = false;
234 int tries = 0;
235
236 if (screenItems.size() > 0) { //only try if we have a any screens
237 while (found == false && tries <= screenItems.size()) { //find next with valid display time
238 tries++;
239 currentItemIdx = (currentItemIdx+1) % screenItems.size();
240 currentItem = screenItems.at(currentItemIdx);
241
242 if (currentItem.start.isValid() && currentItem.stop.isValid()) {
243 if (currentItem.start <= now && now <= currentItem.stop )
244 found = true;
245 } else { // if start or stop time was invalid - show them always
246 found = true;
247 }
248 }
249 }
250
251 if (found) {
252 switch(currentItem.module) {
253 case ModuleImage:
254 ensureVisible(picture);
255 picture->loadFromUrl( currentItem.url );
256 break;
257 case ModuleWeb:
258 ensureVisible(web);
259 web->load(currentItem.url);
260 break;
261 case ModuleVideo:
262 ensureVisible(video);
263 video->loadUrl(currentItem.url);
264 break;
265 case ModuleSvg:
266 ensureVisible(svg);
267 svg->load(currentItem.url);
268 break;
269 default:
270 // ModuleUnknown - what should we do??
271 break;
272 }
273
274 } else {
275 qDebug() << "no screen";
276 errorInfoScreen("Der er ingen information at vise");
277 }
278 lastScreenSwitch = QTime::currentTime();
279
280 }
281 }
282
283 void MainView::errorInfoScreen(QString msg)
284 {
285 ensureVisible(web);
286 web->setHtml("<html>\
287 <body text='#505050' bgcolor='#000000'>\
288 <table width='100%' height='100%'><tr><td align='center' valign='middel'><h1>" + msg+ "</h1></td></tr></table>\
289 </body></html>");
290 }
291
292 void MainView::ensureVisible(QWidget* widget)
293 {
294 if (! widget->isVisible()) {
295 hideAll();
296 widget->setVisible(true);
297 }
298 }
299
300 void MainView::hideAll()
301 {
302 render->setVisible( false );
303 web->setVisible( false);
304 picture->setVisible( false );
305 video->setVisible(false);
306 svg->setVisible(false);
307 }

  ViewVC Help
Powered by ViewVC 1.1.20