diff --git a/bin/hpdf.pro b/bin/hpdf.pro index 33fd368..fc6c862 100644 --- a/bin/hpdf.pro +++ b/bin/hpdf.pro @@ -10,13 +10,16 @@ HEADERS += \ ../src/pdf_factory.h \ ../src/pdf_page_widget.h \ ../src/pdf_table_widget.h \ - ../src/pdf_file_widget.h + ../src/pdf_file_widget.h \ + ../src/pdf_preview_widget.h + SOURCES += \ ../src/main.cpp \ ../src/pdf_factory.cpp \ ../src/pdf_page_widget.cpp \ ../src/pdf_table_widget.cpp \ - ../src/pdf_file_widget.cpp + ../src/pdf_file_widget.cpp \ + ../src/pdf_preview_widget.cpp RESOURCES += hpdf.qrc diff --git a/img/hpdf.png b/img/hpdf.png index bdf001a..cd777b8 100644 Binary files a/img/hpdf.png and b/img/hpdf.png differ diff --git a/src/pdf_factory.cpp b/src/pdf_factory.cpp index d71eb6d..21078d9 100644 --- a/src/pdf_factory.cpp +++ b/src/pdf_factory.cpp @@ -2,6 +2,7 @@ #include #include "pdf_factory.h" #include "pdf_table_widget.h" +#include "pdf_preview_widget.h" #include "pdf_page_widget.h" PDFFactory::PDFFactory(void) { @@ -34,10 +35,9 @@ void PDFFactory::createWidgets(void) { /* Create main area (table). */ pdfTableView = new PDFTableWidget(); - splitter = new QSplitter(); - /* TODO: change pdfPreview widget. */ - pdfPreview = new QWidget(); + pdfPreview = new PDFPreviewWidget(); pdfPreview->setMinimumWidth(100); + splitter = new QSplitter(); splitter->setOrientation(Qt::Horizontal); splitter->addWidget(pdfTableView); splitter->addWidget(pdfPreview); @@ -48,6 +48,9 @@ void PDFFactory::createWidgets(void) { splitter->setStretchFactor(1, 0.5); layout->addWidget(splitter); + connect(pdfTableView, SIGNAL(pageClicked(QMouseEvent*,QImage)), pdfPreview, + SLOT(pageClicked(QMouseEvent*,QImage))); + setWindowIcon(QIcon(":/img/hpdf.png")); setWindowTitle(tr("HPDF")); setGeometry(0, 0, 1300, 650); diff --git a/src/pdf_factory.h b/src/pdf_factory.h index cc079fc..6ed4549 100644 --- a/src/pdf_factory.h +++ b/src/pdf_factory.h @@ -1,6 +1,5 @@ #pragma once #include -#include "pdf_table_widget.h" class QAction; class QWidget; @@ -8,6 +7,8 @@ class QTabWidget; class QScrollArea; class QSplitter; class QToolBar; +class PDFTableWidget; +class PDFPreviewWidget; class PDFFactory : public QMainWindow { Q_OBJECT @@ -39,11 +40,10 @@ private: QWidget* centralWidget; - QTabWidget* ribbon; - QScrollArea* scrollArea; - PDFTableWidget* pdfTableView; - QSplitter* splitter; - QWidget* pdfPreview; + QTabWidget* ribbon; + QSplitter* splitter; + PDFTableWidget* pdfTableView; + PDFPreviewWidget* pdfPreview; QToolBar* fileToolBar; QToolBar* editToolBar; diff --git a/src/pdf_file_widget.cpp b/src/pdf_file_widget.cpp index 4bee5c8..b15c9e1 100644 --- a/src/pdf_file_widget.cpp +++ b/src/pdf_file_widget.cpp @@ -10,7 +10,7 @@ #define CHILD_AREA_WIDTH 150 #define CHILD_AREA_HEIGHT 150 -FilesContainerWidget::FilesContainerWidget(QWidget* parent) { +PagesContainerWidget::PagesContainerWidget(QWidget* parent) { setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); setAcceptDrops(true); mainLayout = new QHBoxLayout(); @@ -18,26 +18,26 @@ FilesContainerWidget::FilesContainerWidget(QWidget* parent) { setLayout(mainLayout); } -int FilesContainerWidget::getPagesCount() const { +int PagesContainerWidget::getPagesCount() const { return pageWidgets.size(); } -QSize FilesContainerWidget::sizeHint() const { +QSize PagesContainerWidget::sizeHint() const { return QSize(CHILD_AREA_WIDTH*getPagesCount(), CHILD_AREA_HEIGHT + 20); } -void FilesContainerWidget::addPageWidget(PDFPageWidget* pageWidget) { +void PagesContainerWidget::addPageWidget(PDFPageWidget* pageWidget) { pageWidgets.append(pageWidget); mainLayout->addWidget(pageWidget); adjustSize(); } -void FilesContainerWidget::dragEnterEvent(QDragEnterEvent* event) { +void PagesContainerWidget::dragEnterEvent(QDragEnterEvent* event) { if(event->mimeData()->hasFormat("text/plain")) event->acceptProposedAction(); } -void FilesContainerWidget::dropEvent(QDropEvent* event) { +void PagesContainerWidget::dropEvent(QDropEvent* event) { int from = event->mimeData()->text().toInt(); int to = findPageWidgetInLayout(pageWidgets[findPageContainingClickEvent(event->pos())]); @@ -47,7 +47,7 @@ void FilesContainerWidget::dropEvent(QDropEvent* event) { event->acceptProposedAction(); } -void FilesContainerWidget::mousePressEvent(QMouseEvent* event) { +void PagesContainerWidget::mousePressEvent(QMouseEvent* event) { if(event->button() == Qt::LeftButton) { int draggedChild = (findPageContainingClickEvent(event->pos())); @@ -62,7 +62,7 @@ void FilesContainerWidget::mousePressEvent(QMouseEvent* event) { } } -int FilesContainerWidget::findPageContainingClickEvent(QPoint pos) { +int PagesContainerWidget::findPageContainingClickEvent(QPoint pos) { for(int i = 0; i < getPagesCount(); i++) if(pageWidgets[i]->geometry().contains(pos)) return i; @@ -70,7 +70,7 @@ int FilesContainerWidget::findPageContainingClickEvent(QPoint pos) { return getPagesCount()-1; } -int FilesContainerWidget::findPageWidgetInLayout(PDFPageWidget* pageWidget) { +int PagesContainerWidget::findPageWidgetInLayout(PDFPageWidget* pageWidget) { for(int i = 0; i < getPagesCount(); i++) if(mainLayout->itemAt(i)->widget() == pageWidget) return i; @@ -93,9 +93,9 @@ PDFFileWidget::PDFFileWidget(QWidget* parent) { fileNameLabel = new QLabel(); topLayout->addWidget(fileNameLabel, 0, 1); - filesContainerWidget = new FilesContainerWidget(); + pagesContainerWidget = new PagesContainerWidget(); scrollArea = new QScrollArea(); - scrollArea->setWidget(filesContainerWidget); + scrollArea->setWidget(pagesContainerWidget); topLayout->addWidget(scrollArea, 1, 0, 1, 5); setLayout(topLayout); @@ -127,8 +127,10 @@ void PDFFileWidget::setDocument(Poppler::Document* document, QString fileName) { PDFPageWidget* pageWidget = new PDFPageWidget(); pageWidget->setThumbnail(pageImage); + connect(pageWidget, SIGNAL(pageClicked(QMouseEvent*,QImage)), this, + SIGNAL(pageClicked(QMouseEvent*,QImage))); - filesContainerWidget->addPageWidget(pageWidget); + pagesContainerWidget->addPageWidget(pageWidget); } fileNameLabel->setText(fileName); } diff --git a/src/pdf_file_widget.h b/src/pdf_file_widget.h index 4faeba2..300fe19 100644 --- a/src/pdf_file_widget.h +++ b/src/pdf_file_widget.h @@ -17,10 +17,10 @@ class QDropEvent; class QMouseEvent; class PDFPageWidget; -class FilesContainerWidget : public QWidget { +class PagesContainerWidget : public QWidget { Q_OBJECT public: - FilesContainerWidget(QWidget* parent = 0); + PagesContainerWidget(QWidget* parent = 0); QSize sizeHint() const; void addPageWidget(PDFPageWidget* image); @@ -62,9 +62,12 @@ private: QLabel* fileNameLabel; QPushButton* collapseButton; - FilesContainerWidget* filesContainerWidget; + PagesContainerWidget* pagesContainerWidget; QScrollArea* scrollArea; QWidget* ancestor; bool collapsed; + +signals: + void pageClicked(QMouseEvent*, QImage); }; diff --git a/src/pdf_page_widget.cpp b/src/pdf_page_widget.cpp index c05c957..2518c5c 100644 --- a/src/pdf_page_widget.cpp +++ b/src/pdf_page_widget.cpp @@ -52,6 +52,10 @@ void PDFPageWidget::setThumbnail(QImage pageImage) { update(); } +void PDFPageWidget::mousePressEvent(QMouseEvent* event) { + emit pageClicked(event, image); +} + void PDFPageWidget::leaveEvent(QEvent* event) { btn1->hide(); btn2->hide(); diff --git a/src/pdf_page_widget.h b/src/pdf_page_widget.h index 06ab870..5667bc7 100644 --- a/src/pdf_page_widget.h +++ b/src/pdf_page_widget.h @@ -7,6 +7,7 @@ class QImage; class QPixmap; class QPaintEvent; class QEvent; +class QMouseEvent; class QSize; class PDFPageWidget : public QFrame { @@ -22,6 +23,7 @@ protected: void paintEvent(QPaintEvent* event); void enterEvent(QEvent* event); void leaveEvent(QEvent* event); + void mousePressEvent(QMouseEvent* event); private: /*QVector buttons;*/ @@ -29,5 +31,8 @@ private: QImage image; QPixmap pixmap; QPushButton* btn1, *btn2; + +signals: + void pageClicked(QMouseEvent* event, QImage pageImage); }; diff --git a/src/pdf_preview_widget.cpp b/src/pdf_preview_widget.cpp new file mode 100644 index 0000000..19ab864 --- /dev/null +++ b/src/pdf_preview_widget.cpp @@ -0,0 +1,26 @@ +#include +#include "pdf_preview_widget.h" + +PDFPreviewWidget::PDFPreviewWidget(QWidget* parent) : QWidget(parent) { + +} + +void PDFPreviewWidget::setImage(QImage image) { + previewImage = image; + update(); +} + +void PDFPreviewWidget::pageClicked(QMouseEvent* mouseEvent, QImage image) { + setImage(image); +} + +void PDFPreviewWidget::paintEvent(QPaintEvent* event) { + QPainter painter(this); + + QPixmap pixmap = QPixmap::fromImage(previewImage); + pixmap = pixmap.scaled(size(), Qt::KeepAspectRatio); + painter.drawPixmap(QRect((size().width() - pixmap.width()) / 2, + (size().height() - pixmap.height()) / 2, + pixmap.width(), pixmap.height()), pixmap); +} + diff --git a/src/pdf_preview_widget.h b/src/pdf_preview_widget.h new file mode 100644 index 0000000..f3512eb --- /dev/null +++ b/src/pdf_preview_widget.h @@ -0,0 +1,23 @@ +#pragma once +#include + +class QImage; +class QPaintEvent; +class QMouseEvent; + +class PDFPreviewWidget : public QWidget { + Q_OBJECT +public: + explicit PDFPreviewWidget(QWidget* parent = 0); + void setImage(QImage image); + +public slots: + void pageClicked(QMouseEvent* mouseEvent, QImage image); + +protected: + void paintEvent(QPaintEvent* event); + +private: + QImage previewImage; +}; + diff --git a/src/pdf_table_widget.cpp b/src/pdf_table_widget.cpp index 1a4a7cf..a6a687d 100644 --- a/src/pdf_table_widget.cpp +++ b/src/pdf_table_widget.cpp @@ -39,6 +39,8 @@ void PDFTableWidget::loadFile(QString fileName) { PDFFileWidget* fileWidget = new PDFFileWidget(); fileWidget->setAncestor(this); fileWidget->setDocument(doc, fileName); + connect(fileWidget, SIGNAL(pageClicked(QMouseEvent*,QImage)), this, + SIGNAL(pageClicked(QMouseEvent*,QImage))); fileWidgets.append(fileWidget); diff --git a/src/pdf_table_widget.h b/src/pdf_table_widget.h index 4a864a8..741a270 100644 --- a/src/pdf_table_widget.h +++ b/src/pdf_table_widget.h @@ -2,10 +2,11 @@ #include #include +class QImage; class QVBoxLayout; class QString; class QScrollArea; - +class QMouseEvent; class PDFFileWidget; class PDFTableWidget : public QFrame { @@ -26,5 +27,8 @@ private: QVector files; QVector fileNames; QVector fileWidgets; + +signals: + void pageClicked(QMouseEvent*, QImage); };