diff options
Diffstat (limited to 'notebookview.cc')
-rw-r--r-- | notebookview.cc | 89 |
1 files changed, 73 insertions, 16 deletions
diff --git a/notebookview.cc b/notebookview.cc index 1f97ead..f8394c0 100644 --- a/notebookview.cc +++ b/notebookview.cc @@ -18,6 +18,7 @@ #include <QtCore/QDebug> #include <QtGui/QResizeEvent> +#include "stfexporter.h" #include "notebookview.h" #define VIEW_MARGIN 2 @@ -25,7 +26,7 @@ NotebookView::NotebookView(QWidget *parent) : QGraphicsView(parent), _nb(new AfdNotebook(this)), _replay(new PaperReplay(this)), - _zoom(100), _curPage(0) + _numColumns(1), _zoom(100), _curPage(0) { setScene(new QGraphicsScene(this)); setTransformationAnchor(AnchorUnderMouse); @@ -69,6 +70,16 @@ QString NotebookView::paperReplay() const return _replayPath; } +void NotebookView::setPenUserTime(quint64 userTime) +{ + _penUserTime = userTime; +} + +quint64 NotebookView::penUserTime() const +{ + return _penUserTime; +} + QList<int> NotebookView::pageNumbers() const { return _pages.keys(); @@ -102,7 +113,12 @@ void NotebookView::setZoom(int zoom) { if (zoom != _zoom) { _zoom = zoom; + int oldNumColumns = _numColumns; calculateScale(); + if (_numColumns != oldNumColumns) { + layoutPages(); + } + emit zoomChanged(_zoom); } } @@ -116,9 +132,9 @@ QRect NotebookView::getCurPageTrim() const return _nb->getPageTrim(_curPage); } -QImage NotebookView::exportPage(int pageNum) const +QImage NotebookView::exportPageAsImage(int pageNum) const { - const QRect pageTrim = getCurPageTrim(); + const QRect pageTrim = _nb->getPageTrim(pageNum); QImage image(pageTrim.width() / 4, pageTrim.height() / 4, QImage::Format_RGB32); QPainter painter(&image); painter.setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform); @@ -134,6 +150,18 @@ void NotebookView::renderPage(QPainter *painter, int pageNum, const QRectF &targ scene.render(painter, target, source, Qt::KeepAspectRatio); } +void NotebookView::exportPageAsTXYP(QIODevice *device, int pageNum, bool relativeTime) +{ + StfExporter writer(_nb); + writer.exportToTXYP(device, pageNum, relativeTime); +} + +void NotebookView::exportPageAsInkML(QIODevice *device, int pageNum) +{ + StfExporter writer(_nb); + writer.exportToInkML(device, pageNum); +} + void NotebookView::requestPaperReplay(const QString &file, qint64 time) { emit paperReplayRequested(file, time); @@ -162,6 +190,16 @@ void NotebookView::nextPage() } } +void NotebookView::focusOnPage(int pageNum) +{ + if (_pages.contains(pageNum)) { + if (_zoom < 100) { + setZoom(100); + } + setCurPage(pageNum); + } +} + void NotebookView::resizeEvent(QResizeEvent *event) { QGraphicsView::resizeEvent(event); @@ -209,7 +247,7 @@ bool NotebookView::createPages() if (pens.isEmpty()) return false; // Failure to open paperreplay data is not fatal - bool haveReplay = _replay->open(_replayPath, _nb->guid()); + bool haveReplay = _replay->open(_replayPath, _nb->guid(), _penUserTime); QList<int> pagesWithStrokes = _nb->pagesWithStrokes(pens.first()); Q_ASSERT(_pages.isEmpty()); @@ -226,21 +264,11 @@ bool NotebookView::createPages() _maxPageSize.setHeight(box.height()); } _pages.insert(pageNum, page); - } - - calculateScale(); - - qreal curY = 0; - foreach (PageItem *page, _pages) { - QRectF box = page->boundingRect(); - page->setPos((_maxPageSize.width() - box.width()) / 2.0, curY); - curY += box.height(); - curY += PAGE_SEPARATION; - scene()->addItem(page); } - scene()->setSceneRect(0, 0, _maxPageSize.width(), curY); + calculateScale(); + layoutPages(); return true; } @@ -253,12 +281,41 @@ void NotebookView::calculateScale() qreal baseScale = qMin(viewRect.width() / _maxPageSize.width(), viewRect.height() / _maxPageSize.height()); resetTransform(); + _numColumns = 1; + scale(baseScale, baseScale); + if (_zoom < 100) { qreal s = 0.25 + ((_zoom / 100.0) * 0.75); + int potentialColumns = viewRect.width() / (_maxPageSize.width() * baseScale * s); + if (potentialColumns >= 2) { + _numColumns = std::min(potentialColumns, _pages.size()); + } scale(s, s); } else if (_zoom > 100) { qreal s = 1.0 + (_zoom - 100) * 0.015; scale(s, s); } } + +void NotebookView::layoutPages() +{ + const int numRows = _pages.size() / _numColumns + + (_pages.size() % _numColumns > 0 ? 1 : 0); + const QSizeF pageSpace( _maxPageSize.width() + PAGE_SEPARATION, + _maxPageSize.height() + PAGE_SEPARATION); + + int pageIndex = 0; + foreach (PageItem *page, _pages) { + QRectF box = page->boundingRect(); + qreal curX = (pageIndex % _numColumns) * pageSpace.width(); + qreal curY = (pageIndex / _numColumns) * pageSpace.height(); + page->setPos(curX + (_maxPageSize.width() - box.width()) / 2.0, + curY + (_maxPageSize.height() - box.height()) / 2.0); + pageIndex++; + } + + scene()->setSceneRect(0, 0, + pageSpace.width() * _numColumns, + pageSpace.height() * numRows); +} |