diff --git a/src/pdf_page_widget.cpp b/src/pdf_page_widget.cpp index 1ce426c..ad79d95 100644 --- a/src/pdf_page_widget.cpp +++ b/src/pdf_page_widget.cpp @@ -9,7 +9,6 @@ PDFPageWidget::PDFPageWidget(QWidget* parent) : selected = false; setAcceptDrops(true); - /* Resize widget. */ this->resize(150, 150); this->setMinimumSize(150, 150); this->setMaximumSize(150, 150); diff --git a/src/pdf_preview_widget.cpp b/src/pdf_preview_widget.cpp index 27a6ab7..47d0984 100644 --- a/src/pdf_preview_widget.cpp +++ b/src/pdf_preview_widget.cpp @@ -1,7 +1,9 @@ #include #include "pdf_preview_widget.h" -PDFPreviewWidget::PDFPreviewWidget(QWidget* parent) : QWidget(parent) { +PDFPreviewWidget::PDFPreviewWidget(QWidget* parent) : QFrame(parent) { + setCursor(Qt::OpenHandCursor); + setFrameStyle(QFrame::StyledPanel | QFrame::Plain); pPage = NULL; currentPixmapSize = QSize(0,0); } @@ -23,14 +25,35 @@ void PDFPreviewWidget::regenImage(void) { previewImage = pPage->renderToImage(dpi, dpi); } +void PDFPreviewWidget::regenPixmap(void) { + pixmap = QPixmap::fromImage(previewImage); + pixmap = pixmap.scaled(currentPixmapSize, Qt::KeepAspectRatioByExpanding); + currentPixmapSize = pixmap.size(); +} + +void PDFPreviewWidget::repositionPixmap(void) { + currentPixmapPos = QPoint((size().width() - pixmap.width()) / 2, + (size().height() - pixmap.height()) / 2); +} + void PDFPreviewWidget::previewUpdate(Poppler::Page* pp) { pPage = pp; regenImage(); + regenPixmap(); + repositionPixmap(); update(); } +void PDFPreviewWidget::resizeEvent(QResizeEvent* event) { + if(pPage != NULL) { + repositionPixmap(); + update(); + } +} + void PDFPreviewWidget::wheelEvent(QWheelEvent* event) { if(pPage != NULL) { + qDebug() << currentPixmapSize; if(event->delta() > 0) currentPixmapSize += QSize(30, 30); else if(event->delta() < 0) @@ -41,20 +64,59 @@ void PDFPreviewWidget::wheelEvent(QWheelEvent* event) { } regenImage(); + regenPixmap(); + repositionPixmap(); update(); } } +void PDFPreviewWidget::mousePressEvent(QMouseEvent* event) { + if(pPage != NULL) { + setCursor(Qt::ClosedHandCursor); + + if(event->button() == Qt::LeftButton) { + dragStartPos = event->pos(); + lastPixmapPos = currentPixmapPos; + } + } +} + +void PDFPreviewWidget::mouseMoveEvent(QMouseEvent* event) { + if(pPage != NULL) { + if(!(event->buttons() & Qt::LeftButton)) { + return; + } + + QPoint currentPos = event->pos(); + QPoint vector = currentPos - dragStartPos; + QPoint newPos = lastPixmapPos + vector; + + if(pixmap.width() > size().width()) { + if(newPos.x() <= 0 && newPos.x() >= size().width() - pixmap.width()) + currentPixmapPos.setX(newPos.x()); + } + + if(pixmap.height() > size().height()) { + if(newPos.y() <= 0 && newPos.y() >= size().height() - pixmap.height()) + currentPixmapPos.setY(newPos.y()); + } + + update(); + } +} + +void PDFPreviewWidget::mouseReleaseEvent(QMouseEvent* event) { + setCursor(Qt::OpenHandCursor); +} + void PDFPreviewWidget::paintEvent(QPaintEvent* event) { if(pPage != NULL) { QPainter painter(this); - QPixmap pixmap = QPixmap::fromImage(previewImage); - pixmap = pixmap.scaled(currentPixmapSize, Qt::KeepAspectRatio); - currentPixmapSize = pixmap.size(); - painter.drawPixmap(QRect((size().width() - pixmap.width()) / 2, - (size().height() - pixmap.height()) / 2, - pixmap.width(), pixmap.height()), pixmap); + painter.drawPixmap(QRect(currentPixmapPos.x(), currentPixmapPos.y(), + pixmap.width(), pixmap.height()), pixmap); + + QFrame::paintEvent(event); } } diff --git a/src/pdf_preview_widget.h b/src/pdf_preview_widget.h index c2b211f..dbfb659 100644 --- a/src/pdf_preview_widget.h +++ b/src/pdf_preview_widget.h @@ -1,33 +1,44 @@ #pragma once -#include +#include #include class QImage; +class QPixmap; class QSize; class QPoint; +class QResizeEvent; class QWheelEvent; class QPaintEvent; class QMouseEvent; -class PDFPreviewWidget : public QWidget { +class PDFPreviewWidget : public QFrame { Q_OBJECT public: explicit PDFPreviewWidget(QWidget* parent = 0); public slots: void regenImage(void); + void regenPixmap(void); + void repositionPixmap(void); void previewUpdate(Poppler::Page*); protected: void wheelEvent(QWheelEvent* event); void paintEvent(QPaintEvent* event); + void resizeEvent(QResizeEvent* event); + void mousePressEvent(QMouseEvent* event); + void mouseMoveEvent(QMouseEvent* event); + void mouseReleaseEvent(QMouseEvent* event); private: QImage previewImage; + QPixmap pixmap; Poppler::Page* pPage; - QSize currentPixmapSize; - QPoint currentPixmapPos; + QSize currentPixmapSize; + QPoint currentPixmapPos; + QPoint lastPixmapPos; + QPoint dragStartPos; signals: void updatePreview(QImage);