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

Contents of /infoscreen/MainView.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 867 - (show annotations) (download)
Mon Jun 21 12:23:07 2010 UTC (13 years, 11 months ago) by torben
File size: 7981 byte(s)
add support for svg files
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 (item.module != ModuleUnknown) { //no need to enqueue unknown modules
185 screenItems.push_back( item );
186 }
187
188 }
189
190 qDebug() << "Found " << screenItems.size() << " playable items";
191 }
192
193
194 bool MainView::readXml()
195 {
196 const int TIMEOUT = 30*60*1000; // 30 minutter
197 if ( lastXml.isNull() || lastXml.elapsed() > TIMEOUT) {
198
199
200 bool res = xmlHandler.readXml( xmlUrl );
201
202 lastXml = QTime::currentTime();
203
204 screenItems = xmlHandler.getScreenSet();
205
206 if ( currentItemIdx >= screenItems.size() )
207 currentItemIdx = screenItems.size()-1; //avoid overflow
208
209
210 return true;
211 } else {
212 return false;
213 }
214 }
215
216 void MainView::switchScreens()
217 {
218 if (video->isVisible() && video->isPlaying() ) {
219 return; //wait until current clip has finished
220 }
221
222 if (lastScreenSwitch.isNull() || lastScreenSwitch.elapsed() > (currentItem.runtime*1000)) {
223
224 QTime now = QTime::currentTime();
225 if (lastScreenSwitch.isNull())
226 currentItemIdx = -1;
227
228 bool found = false;
229 int tries = 0;
230
231 if (screenItems.size() > 0) { //only try if we have a any screens
232 while (found == false && tries <= screenItems.size()) { //find next with valid display time
233 tries++;
234 currentItemIdx = (currentItemIdx+1) % screenItems.size();
235 currentItem = screenItems.at(currentItemIdx);
236
237 if (currentItem.start.isValid() && currentItem.stop.isValid()) {
238 if (currentItem.start <= now && now <= currentItem.stop )
239 found = true;
240 } else { // if start or stop time was invalid - show them always
241 found = true;
242 }
243 }
244 }
245
246 if (found) {
247 switch(currentItem.module) {
248 case ModuleImage:
249 ensureVisible(picture);
250 picture->loadFromUrl( currentItem.url );
251 break;
252 case ModuleWeb:
253 ensureVisible(web);
254 web->load(currentItem.url);
255 break;
256 case ModuleVideo:
257 ensureVisible(video);
258 video->loadUrl(currentItem.url);
259 break;
260 case ModuleSvg:
261 ensureVisible(svg);
262 svg->load(currentItem.url);
263 break;
264 default:
265 // ModuleUnknown - what should we do??
266 break;
267 }
268
269 } else {
270 qDebug() << "no screen";
271 errorInfoScreen("Der er ingen information at vise");
272 }
273 lastScreenSwitch = QTime::currentTime();
274
275 }
276 }
277
278 void MainView::errorInfoScreen(QString msg)
279 {
280 ensureVisible(web);
281 web->setHtml("<html>\
282 <body text='#505050' bgcolor='#000000'>\
283 <table width='100%' height='100%'><tr><td align='center' valign='middel'><h1>" + msg+ "</h1></td></tr></table>\
284 </body></html>");
285 }
286
287 void MainView::ensureVisible(QWidget* widget)
288 {
289 if (! widget->isVisible()) {
290 hideAll();
291 widget->setVisible(true);
292 }
293 }
294
295 void MainView::hideAll()
296 {
297 render->setVisible( false );
298 web->setVisible( false);
299 picture->setVisible( false );
300 video->setVisible(false);
301 svg->setVisible(false);
302 }

  ViewVC Help
Powered by ViewVC 1.1.20