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

Annotation of /infoscreen/mainview.cpp

Parent Directory Parent Directory | Revision Log Revision Log


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

  ViewVC Help
Powered by ViewVC 1.1.20