From 671e75bf521068658cb2eeed4da289e50e957b75 Mon Sep 17 00:00:00 2001 From: Rtch90 Date: Thu, 18 Dec 2014 11:07:45 +0000 Subject: [PATCH] [Add] Added Drag&Drop. Pages are identified by their path. --- src/pdf_file_widget.cpp | 32 ++++++++++++++----------- src/pdf_file_widget.h | 12 ++++++---- src/pdf_page_widget.cpp | 52 ++++++++++++++++++++++++---------------- src/pdf_page_widget.h | 15 +++++++++--- src/pdf_table_widget.cpp | 47 ++++++++++++++++++++++++++++++++---- src/pdf_table_widget.h | 19 +++++++++++---- 6 files changed, 126 insertions(+), 51 deletions(-) diff --git a/src/pdf_file_widget.cpp b/src/pdf_file_widget.cpp index 82f55b4..dd93edd 100644 --- a/src/pdf_file_widget.cpp +++ b/src/pdf_file_widget.cpp @@ -14,7 +14,7 @@ PagesContainerWidget::PagesContainerWidget(QWidget* parent) { setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); - setAcceptDrops(true); + /*setAcceptDrops(true);*/ mainLayout = new QHBoxLayout(); setLayout(mainLayout); @@ -35,17 +35,10 @@ void PagesContainerWidget::addPageWidget(PDFPageWidget* pageWidget) { } void PagesContainerWidget::dragEnterEvent(QDragEnterEvent* event) { - if(event->mimeData()->hasFormat("text/plain")) - event->acceptProposedAction(); + event->acceptProposedAction(); } void PagesContainerWidget::dropEvent(QDropEvent* event) { - int from = event->mimeData()->text().toInt(); - int to = findPageWidgetInLayout(pageWidgets[findPageContainingClickEvent(event->pos())]); - - mainLayout->removeWidget(pageWidgets[from]); - mainLayout->insertWidget(to, pageWidgets[from]); - event->acceptProposedAction(); } @@ -142,14 +135,11 @@ void PDFFileWidget::setDocument(Poppler::Document* document, QString fileName) { PDFPageWidget* pageWidget = new PDFPageWidget(); + pageWidget->setAncestor(ancestor); + pageWidget->setFather(this); pageWidget->setPopplerPage(doc->page(i)); tgen.render(pageWidget, pdfPage); - connect(pageWidget, SIGNAL(pageClicked(QMouseEvent*,QImage)), this, - SIGNAL(pageClicked(QMouseEvent*,QImage))); - connect(pageWidget, SIGNAL(previewUpdate(Poppler::Page*)), this, - SIGNAL(previewUpdate(Poppler::Page*))); - pagesContainerWidget->addPageWidget(pageWidget); /* Process event. */ /*qApp->processEvents();*/ @@ -158,3 +148,17 @@ void PDFFileWidget::setDocument(Poppler::Document* document, QString fileName) { fileNameLabel->setText(fileName); } +int PDFFileWidget::removeChild(PDFPageWidget* child) { + int pos = pagesContainerWidget->pageWidgets.indexOf(child); + pagesContainerWidget->pageWidgets.remove(pos); + pagesContainerWidget->mainLayout->removeItem(pagesContainerWidget->mainLayout->itemAt(pos)); + + return pos; +} + +void PDFFileWidget::insertChildAt(PDFPageWidget* child, int pos) { + child->setFather(this); + pagesContainerWidget->mainLayout->insertWidget(pos, child); + pagesContainerWidget->pageWidgets.insert(pos, child); +} + diff --git a/src/pdf_file_widget.h b/src/pdf_file_widget.h index c151d55..d333bf3 100644 --- a/src/pdf_file_widget.h +++ b/src/pdf_file_widget.h @@ -24,6 +24,8 @@ class PagesContainerWidget : public QWidget { public: PagesContainerWidget(QWidget* parent = 0); QSize sizeHint() const; + QVector pageWidgets; + QHBoxLayout* mainLayout; void addPageWidget(PDFPageWidget* image); @@ -31,10 +33,8 @@ protected: void dragEnterEvent(QDragEnterEvent* event); void dropEvent(QDropEvent* event); void mousePressEvent(QMouseEvent* event); -private: - QVector pageWidgets; - QHBoxLayout* mainLayout; +private: int findPageContainingClickEvent(QPoint pos); int findPageWidgetInLayout(PDFPageWidget* pageWidgets); int getPagesCount() const; @@ -47,8 +47,10 @@ class PDFFileWidget : public QWidget { public: PDFFileWidget(QWidget* parent = 0); - void setAncestor(QWidget* ancestor) { this->ancestor = ancestor; } - void setDocument(Poppler::Document* document, QString fileName); + void setAncestor(QWidget* ancestor) { this->ancestor = ancestor; } + void setDocument(Poppler::Document* document, QString fileName); + int removeChild(PDFPageWidget* child); + void insertChildAt(PDFPageWidget* child, int pos); bool isCollapsed(void) { return collapsed; } void setCollapsed(bool collapsed); diff --git a/src/pdf_page_widget.cpp b/src/pdf_page_widget.cpp index 9495e0f..a80c115 100644 --- a/src/pdf_page_widget.cpp +++ b/src/pdf_page_widget.cpp @@ -1,15 +1,17 @@ #include #include #include "pdf_page_widget.h" +#include "pdf_table_widget.h" PDFPageWidget::PDFPageWidget(QWidget* parent) : QFrame(parent) { + setAcceptDrops(true); + /* Resize widget. */ this->resize(150, 150); this->setMinimumSize(150, 150); this->setMinimumSize(150, 150); - this->setAutoFillBackground(true); this->setMouseTracking(true); this->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); @@ -40,6 +42,31 @@ PDFPageWidget::PDFPageWidget(QWidget* parent) : this->setLayout(vbox); } +void PDFPageWidget::dragEnterEvent(QDragEnterEvent* event) { + event->acceptProposedAction(); +} + +void PDFPageWidget::dropEvent(QDropEvent* event) { + emit droppedPage(event->mimeData()->text(), path); + event->acceptProposedAction(); +} + +void PDFPageWidget::setAncestor(QWidget* ancestor) { + this->ancestor = ancestor; + ((PDFTableWidget*)ancestor)->registerPage(this); + connect(this, SIGNAL(pageClicked(QMouseEvent*,QString)), ancestor, + SLOT(pageClicked(QMouseEvent*,QString))); + + connect(this, SIGNAL(previewUpdate(Poppler::Page*)), ancestor, + SIGNAL(previewUpdate(Poppler::Page*))); + connect(this, SIGNAL(droppedPage(QString, QString)), ancestor, + SLOT(droppedPage(QString,QString))); +} + +void PDFPageWidget::setFather(QWidget* father) { + this->father = father; +} + void PDFPageWidget::setButton(QPushButton* btn) { button = btn; update(); @@ -50,46 +77,31 @@ void PDFPageWidget::setPopplerPage(Poppler::Page* pp) { } void PDFPageWidget::setThumbnail(QImage pageImage) { - image = pageImage; - pixmap = QPixmap::fromImage(image); - pixmap = pixmap.scaled(size() - QSize(6, 6), Qt::KeepAspectRatio); + image = pageImage; + pixmap = QPixmap::fromImage(image); + pixmap = pixmap.scaled(size(), Qt::KeepAspectRatio); update(); } void PDFPageWidget::mousePressEvent(QMouseEvent* event) { if(pPage != NULL) { - emit pageClicked(event, image); + emit pageClicked(event, path); emit previewUpdate(pPage); - - selected = !selected; - update(); } } void PDFPageWidget::leaveEvent(QEvent* event) { btn1->hide(); btn2->hide(); - - this->setFrameStyle(QFrame::Plain); } void PDFPageWidget::enterEvent(QEvent* event) { btn1->show(); btn2->show(); - - this->setFrameStyle(QFrame::StyledPanel | QFrame::Raised); } void PDFPageWidget::paintEvent(QPaintEvent* event) { - QPalette palette = this->palette(); - if(selected) - palette.setColor(backgroundRole(), palette.color(QPalette::Highlight)); - else - palette.setColor(backgroundRole(), palette.color(QPalette::AlternateBase)); - this->setPalette(palette); - - QFrame::paintEvent(event); QPainter painter(this); painter.drawPixmap(QRect((size().width() - pixmap.width()) / 2, (size().height() - pixmap.height()) / 2, diff --git a/src/pdf_page_widget.h b/src/pdf_page_widget.h index 8d82e87..f27cd92 100644 --- a/src/pdf_page_widget.h +++ b/src/pdf_page_widget.h @@ -21,25 +21,34 @@ public: void setButton(QPushButton* btn); QSize sizeHint() const; /*void setButtonImage(QImage* pageImage);*/ + void setAncestor(QWidget* ancestor); + void setFather(QWidget* father); + QWidget* getFather() { return father; } + void registerName(QString name) { path = name; } protected: void paintEvent(QPaintEvent* event); void enterEvent(QEvent* event); void leaveEvent(QEvent* event); void mousePressEvent(QMouseEvent* event); + void dragEnterEvent(QDragEnterEvent* event); + void dropEvent(QDropEvent* event); private: /*QVector buttons;*/ + QString path; + QWidget* ancestor; + QWidget* father; + QPushButton* button; QImage image; Poppler::Page* pPage; QPixmap pixmap; QPushButton* btn1, *btn2; - bool selected = false; - signals: - void pageClicked(QMouseEvent* event, QImage pageImage); + void pageClicked(QMouseEvent* event, QString path); void previewUpdate(Poppler::Page*); + void droppedPage(QString, QString); }; diff --git a/src/pdf_table_widget.cpp b/src/pdf_table_widget.cpp index b8d349b..1cd02c2 100644 --- a/src/pdf_table_widget.cpp +++ b/src/pdf_table_widget.cpp @@ -39,10 +39,6 @@ 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))); - connect(fileWidget, SIGNAL(previewUpdate(Poppler::Page*)), this, - SIGNAL(previewUpdate(Poppler::Page*))); fileWidgets.append(fileWidget); @@ -51,3 +47,46 @@ void PDFTableWidget::loadFile(QString fileName) { containerLayout->insertWidget(containerLayout->count()-1, fileWidget); } +void PDFTableWidget::registerPage(PDFPageWidget* child) { + /* Need new name? */ + QString name = QString("/home/pdfpage").append(QString::number(pageChilds.size())); + pageChilds[name] = child; + child->registerName(name); +} + +void PDFTableWidget::pageClicked(QMouseEvent* event, QString path) { + if(event->button() == Qt::LeftButton) { + /* Left click to start dragging. */ + QDrag* drag = new QDrag(this); + QMimeData* mimeData = new QMimeData(); + + mimeData->setText(path); + drag->setMimeData(mimeData); + drag->setPixmap(QPixmap(":/img/copy.png")); + + Qt::DropAction dropAction = drag->exec(); + } +} + +void PDFTableWidget::droppedPage(QString pathFrom, QString pathTo) { + /* + * We have dragged the page and dropped it. + * So we'll handle backend operations here. + */ + + /* Frontend operations here.. */ + qDebug() << pathFrom; + qDebug() << pathTo; + PDFPageWidget* childFrom = pageChilds[pathFrom]; + PDFPageWidget* childTo = pageChilds[pathTo]; + + PDFFileWidget* fileFrom = (PDFFileWidget*) childFrom->getFather(); + PDFFileWidget* fileTo = (PDFFileWidget*) childTo->getFather(); + + int posFrom = fileFrom->removeChild(childFrom); + int posTo = fileTo->removeChild(childTo); + + fileTo->insertChildAt(childFrom, posTo); + fileFrom->insertChildAt(childTo, posFrom); +} + diff --git a/src/pdf_table_widget.h b/src/pdf_table_widget.h index fd254ea..d529578 100644 --- a/src/pdf_table_widget.h +++ b/src/pdf_table_widget.h @@ -1,7 +1,10 @@ #pragma once #include +#include #include +#include "pdf_page_widget.h" + class QImage; class QVBoxLayout; class QString; @@ -14,22 +17,28 @@ class PDFTableWidget : public QFrame { public: PDFTableWidget(QWidget* parent = 0); void loadFile(QString fileName); + void registerPage(PDFPageWidget* child); protected: private: - QVBoxLayout* outerLayout; - - QScrollArea* scrollArea; - QWidget* containerWidget; - QVBoxLayout* containerLayout; + QVBoxLayout* outerLayout; + QScrollArea* scrollArea; + QWidget* containerWidget; + QVBoxLayout* containerLayout; QVector files; QVector fileNames; QVector fileWidgets; + QHash pageChilds; + signals: void pageClicked(QMouseEvent*, QImage); void previewUpdate(Poppler::Page*); + +private slots: + void pageClicked(QMouseEvent*, QString path); + void droppedPage(QString pathFrom, QString pathTo); };