1
1
#include "nPresenter.h"
3
3
#include "widgets/WaitingIndicator.h"
4
4
#include "widgets/SectionViewer.h"
6
5
#include "widgets/PreviewCurrentPageWidget.h"
7
6
#include "widgets/PreviewNextPageWidget.h"
9
7
#include "widgets/ClockWidget.h"
25
23
qDebug() << "nPresenter is singleton...";
26
_nPresenterInstance = this;
29
_layoutNames.append("1");
30
_layoutNames.append("1:N");
31
_layoutNames.append("N:1");
32
_layoutNamesCurrent = 0;
30
35
this->resize(1280, 750);
31
36
this->setWindowState(Qt::WindowMaximized);
32
37
this->setWindowTitle("nPresenter::Notes");
34
_nPresenterInstance = this;
37
39
this->setupWidgets();
39
this->connect(&_futureWatcher, SIGNAL(finished()), this, SIGNAL(currentPageReady()));
41
44
_freezeEnabled = false;
42
45
_blackoutEnabled = true;
54
void nPresenter::updatePages()
60
if(_futureWatcher.isRunning())
62
_futureWatcher.cancel();
63
_futureWatcher.waitForFinished();
66
QList<int> keys = _pages.keys();
67
while(!keys.isEmpty())
68
delete _pages.take(keys.takeFirst());
70
_renderFuture = QtConcurrent::run(this, &nPresenter::renderPages);
71
_futureWatcher.setFuture(_renderFuture);
77
void nPresenter::renderPages()
80
int numPages = _doc->numPages();
81
for(int i = 0; i < numPages; i++)
83
_pages.insert(i, _doc->page(i));
88
58
void nPresenter::setupWidgets()
173
143
SLOT(enableFreeze(bool))
146
SIGNAL(requestedViewportReady(Viewports,int,QSize)),
148
SLOT(viewportIsReady(Viewports,int,QSize)));
177
SIGNAL(currentPageReady()),
150
SIGNAL(currentPageChanged(int)),
179
SLOT(slideChanged()));
152
SLOT(requestPage(int)));
154
connect(widget, SIGNAL(viewportSizeChanged(ViewportWidget*)),
155
this, SLOT(viewportSizesChanged()));
182
158
_waitingIndicator = new WaitingIndicator();
183
159
_waitingIndicator->setParent(this);
184
160
_waitingIndicator->resize(100, 100);
186
163
connect(this, SIGNAL(waitingOnPage()),
187
164
_waitingIndicator, SLOT(show()));
188
connect(this, SIGNAL(currentPageReady()),
165
connect(&_document, SIGNAL(finishedRendering()),
189
166
_waitingIndicator, SLOT(hide()));
199
Document * nPresenter::document()
201
return instance()._doc;
204
Page & nPresenter::currentPage()
206
Page & nullPage = instance()._nullPage;
207
int currentPage = instance()._currentPage;
209
if(!instance()._pages.contains(currentPage))
211
if(instance()._pages[currentPage] == 0)
214
return *instance()._pages[currentPage];
217
Page & nPresenter::nextPage()
219
Page & nullPage = instance()._nullPage;
220
int currentPage = instance()._currentPage+1;
222
if(!instance()._pages.contains(currentPage))
224
if(instance()._pages[currentPage] == 0)
227
return *instance()._pages[currentPage];
231
QSize nPresenter::notesViewportSize()
233
return instance()._notesViewport.viewportSize();
236
QRectF nPresenter::notesViewport()
238
return QRectF(0.5, 0.0, 0.5, 1.0);
241
QSize nPresenter::presentationViewportSize()
243
//qDebug() << "viewportSize:" << instance()._notesViewport.viewportSize();
244
return instance()._presentationViewport.viewportSize();
248
QRectF nPresenter::presentationViewport()
250
return QRectF(0.0, 0.0, 0.5, 1.0);
176
Document & nPresenter::document()
178
return instance()._document;
181
int nPresenter::currentPage()
183
return instance()._currentPage;
186
QRectF nPresenter::viewport(Document::Viewports viewport)
188
if(viewport == Document::NotesViewport)
189
return QRectF(0.5, 0.0, 0.5, 1.0);
190
if(viewport == Document::PresentationOneViewport)
191
return QRectF(0.0, 0.0, 0.5, 1.0);
253
197
void nPresenter::mouseReleaseEvent(QMouseEvent *event)
293
237
_freezeEnabled = !_freezeEnabled;
294
238
emit this->freezeEnabled(_freezeEnabled);
295
if(!_freezeEnabled && this->document())
296
emit this->currentPageReady();
299
241
/* key O - open a document*/
322
261
/* Check whether current page is inside document page bounds.
323
262
If so, set to current page.
324
263
So you can reload your document during presentation */
326
265
int newCurrentPage = _currentPage;
327
if(newCurrentPage < 0 || newCurrentPage >= (_doc->numPages()-1))
266
if(newCurrentPage < 0 || newCurrentPage >= (_document.numPages()-1))
328
267
newCurrentPage = 0;
330
269
this->toPage(newCurrentPage);
333
/* key R - rerender pages */
334
if(event->key() == Qt::Key_R)
270
this->requestAllPages();
272
/* clear the help text */
273
_notesViewport.update();
276
/* key L - cycle through viewpot layouts */
277
if(event->key() == Qt::Key_L)
279
_layoutNamesCurrent++;
280
if(_layoutNamesCurrent >= _layoutNames.size())
281
_layoutNamesCurrent = 0;
282
document().setViewportLayout(_layoutNames[_layoutNamesCurrent]);
283
this->requestAllPages();
340
290
bool nPresenter::loadDocument(QString path)
342
/* delete previous doc */
343
Document * newDoc = 0;
345
newDoc = new Document(path);
349
qDebug() << "nPresenter::loadDocument(): " << path << "failed.";
357
if(_futureWatcher.isRunning())
359
_futureWatcher.cancel();
360
_futureWatcher.waitForFinished();
366
/* clear page cache */
367
QList<int> keys = _pages.keys();
369
delete _pages.take(keys.takeFirst());
373
emit this->waitingOnPage();
293
if(!_document.open(path))
374
296
emit this->documentChanged();
395
315
/* react on layout changes */
397
if(event->type() == QEvent::MouseButtonRelease)
399
QMouseEvent * mEvent = dynamic_cast<QMouseEvent*>(event);
400
if(!this->childAt(mEvent->pos()))
317
// if(event->type() == QEvent::MouseButtonRelease)
405
322
if(event->type() == QEvent::Resize || event->type() == QEvent::Paint)
426
343
void nPresenter::toPage(int pageNum)
429
if(!this->document())
346
if(!this->document().loaded())
349
/* page mus be inside page count boundaries */
435
if(pageNum >= this->document()->numPages())
436
pageNum = this->document()->numPages()-1;
353
if(pageNum >= this->document().numPages())
354
pageNum = this->document().numPages()-1;
438
356
_currentPage = pageNum;
440
/* signal that that the current page has changed */
358
/* stop any active rendering so that the new page will show up fast */
359
document().abortRendering();
361
/* finally signal that the current page has changed */
441
362
emit this->currentPageChanged(_currentPage);
443
/* if the page is already rendered, signal that the page is ready */
444
if(_pages.contains(_currentPage))
445
emit this->currentPageReady();
364
if(!document().isPageRendered(this->currentPage()))
366
//document().abortRendering();
367
emit waitingOnPage();
449
373
void nPresenter::toNextPage()
451
if(_currentPage+1 < this->document()->numPages())
375
if(_currentPage+1 < this->document().numPages())
452
376
this->toPage(_currentPage + 1);
458
382
this->toPage(_currentPage - 1);
385
void nPresenter::viewportSizesChanged()
388
/* no document loaded. no need to update */
389
if(!document().loaded())
393
QTimer::singleShot(500, this, SLOT(sizeChangeTimeout()));
396
void nPresenter::sizeChangeTimeout()
400
/* still updates active. */
404
this->requestAllPages();
408
void nPresenter::requestAllPages()
410
this->document().abortRendering();
411
this->document().clearCache();
413
QList<QWidget*> widgets = qApp->allWidgets();
414
//QList<QWidget*> widgets = this->findChildren<QWidget*>();
415
int pageCount = document().numPages();
417
/* first request the current page */
418
for(int i = 0; i < widgets.size(); i++)
420
ViewportWidget * widget = qobject_cast<ViewportWidget*>(widgets[i]);
423
widget->requestPage(this->currentPage());
426
/* then do the rest */
427
while(!widgets.empty())
429
ViewportWidget * widget = qobject_cast<ViewportWidget*>(widgets.takeFirst());
434
for(int i = 0; i < pageCount; i++)
435
widget->requestPage(i);
438
emit waitingOnPage();