[Add] Added Drag&Drop. Pages are identified by their path.

This commit is contained in:
Rtch90 2014-12-18 11:07:45 +00:00
parent 1ece30f562
commit 671e75bf52
6 changed files with 126 additions and 51 deletions

View File

@ -14,7 +14,7 @@
PagesContainerWidget::PagesContainerWidget(QWidget* parent) { PagesContainerWidget::PagesContainerWidget(QWidget* parent) {
setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
setAcceptDrops(true); /*setAcceptDrops(true);*/
mainLayout = new QHBoxLayout(); mainLayout = new QHBoxLayout();
setLayout(mainLayout); setLayout(mainLayout);
@ -35,17 +35,10 @@ void PagesContainerWidget::addPageWidget(PDFPageWidget* pageWidget) {
} }
void PagesContainerWidget::dragEnterEvent(QDragEnterEvent* event) { void PagesContainerWidget::dragEnterEvent(QDragEnterEvent* event) {
if(event->mimeData()->hasFormat("text/plain"))
event->acceptProposedAction(); event->acceptProposedAction();
} }
void PagesContainerWidget::dropEvent(QDropEvent* event) { 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(); event->acceptProposedAction();
} }
@ -142,14 +135,11 @@ void PDFFileWidget::setDocument(Poppler::Document* document, QString fileName) {
PDFPageWidget* pageWidget = new PDFPageWidget(); PDFPageWidget* pageWidget = new PDFPageWidget();
pageWidget->setAncestor(ancestor);
pageWidget->setFather(this);
pageWidget->setPopplerPage(doc->page(i)); pageWidget->setPopplerPage(doc->page(i));
tgen.render(pageWidget, pdfPage); 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); pagesContainerWidget->addPageWidget(pageWidget);
/* Process event. */ /* Process event. */
/*qApp->processEvents();*/ /*qApp->processEvents();*/
@ -158,3 +148,17 @@ void PDFFileWidget::setDocument(Poppler::Document* document, QString fileName) {
fileNameLabel->setText(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);
}

View File

@ -24,6 +24,8 @@ class PagesContainerWidget : public QWidget {
public: public:
PagesContainerWidget(QWidget* parent = 0); PagesContainerWidget(QWidget* parent = 0);
QSize sizeHint() const; QSize sizeHint() const;
QVector<PDFPageWidget*> pageWidgets;
QHBoxLayout* mainLayout;
void addPageWidget(PDFPageWidget* image); void addPageWidget(PDFPageWidget* image);
@ -31,10 +33,8 @@ protected:
void dragEnterEvent(QDragEnterEvent* event); void dragEnterEvent(QDragEnterEvent* event);
void dropEvent(QDropEvent* event); void dropEvent(QDropEvent* event);
void mousePressEvent(QMouseEvent* event); void mousePressEvent(QMouseEvent* event);
private:
QVector<PDFPageWidget*> pageWidgets;
QHBoxLayout* mainLayout;
private:
int findPageContainingClickEvent(QPoint pos); int findPageContainingClickEvent(QPoint pos);
int findPageWidgetInLayout(PDFPageWidget* pageWidgets); int findPageWidgetInLayout(PDFPageWidget* pageWidgets);
int getPagesCount() const; int getPagesCount() const;
@ -49,6 +49,8 @@ public:
void setAncestor(QWidget* ancestor) { this->ancestor = ancestor; } void setAncestor(QWidget* ancestor) { this->ancestor = ancestor; }
void setDocument(Poppler::Document* document, QString fileName); void setDocument(Poppler::Document* document, QString fileName);
int removeChild(PDFPageWidget* child);
void insertChildAt(PDFPageWidget* child, int pos);
bool isCollapsed(void) { return collapsed; } bool isCollapsed(void) { return collapsed; }
void setCollapsed(bool collapsed); void setCollapsed(bool collapsed);

View File

@ -1,15 +1,17 @@
#include <QtGlobal> #include <QtGlobal>
#include <QtWidgets> #include <QtWidgets>
#include "pdf_page_widget.h" #include "pdf_page_widget.h"
#include "pdf_table_widget.h"
PDFPageWidget::PDFPageWidget(QWidget* parent) : PDFPageWidget::PDFPageWidget(QWidget* parent) :
QFrame(parent) { QFrame(parent) {
setAcceptDrops(true);
/* Resize widget. */ /* Resize widget. */
this->resize(150, 150); this->resize(150, 150);
this->setMinimumSize(150, 150); this->setMinimumSize(150, 150);
this->setMinimumSize(150, 150); this->setMinimumSize(150, 150);
this->setAutoFillBackground(true);
this->setMouseTracking(true); this->setMouseTracking(true);
this->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); this->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
@ -40,6 +42,31 @@ PDFPageWidget::PDFPageWidget(QWidget* parent) :
this->setLayout(vbox); 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) { void PDFPageWidget::setButton(QPushButton* btn) {
button = btn; button = btn;
update(); update();
@ -52,44 +79,29 @@ void PDFPageWidget::setPopplerPage(Poppler::Page* pp) {
void PDFPageWidget::setThumbnail(QImage pageImage) { void PDFPageWidget::setThumbnail(QImage pageImage) {
image = pageImage; image = pageImage;
pixmap = QPixmap::fromImage(image); pixmap = QPixmap::fromImage(image);
pixmap = pixmap.scaled(size() - QSize(6, 6), Qt::KeepAspectRatio); pixmap = pixmap.scaled(size(), Qt::KeepAspectRatio);
update(); update();
} }
void PDFPageWidget::mousePressEvent(QMouseEvent* event) { void PDFPageWidget::mousePressEvent(QMouseEvent* event) {
if(pPage != NULL) { if(pPage != NULL) {
emit pageClicked(event, image); emit pageClicked(event, path);
emit previewUpdate(pPage); emit previewUpdate(pPage);
selected = !selected;
update();
} }
} }
void PDFPageWidget::leaveEvent(QEvent* event) { void PDFPageWidget::leaveEvent(QEvent* event) {
btn1->hide(); btn1->hide();
btn2->hide(); btn2->hide();
this->setFrameStyle(QFrame::Plain);
} }
void PDFPageWidget::enterEvent(QEvent* event) { void PDFPageWidget::enterEvent(QEvent* event) {
btn1->show(); btn1->show();
btn2->show(); btn2->show();
this->setFrameStyle(QFrame::StyledPanel | QFrame::Raised);
} }
void PDFPageWidget::paintEvent(QPaintEvent* event) { 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); QPainter painter(this);
painter.drawPixmap(QRect((size().width() - pixmap.width()) / 2, painter.drawPixmap(QRect((size().width() - pixmap.width()) / 2,
(size().height() - pixmap.height()) / 2, (size().height() - pixmap.height()) / 2,

View File

@ -21,25 +21,34 @@ public:
void setButton(QPushButton* btn); void setButton(QPushButton* btn);
QSize sizeHint() const; QSize sizeHint() const;
/*void setButtonImage(QImage* pageImage);*/ /*void setButtonImage(QImage* pageImage);*/
void setAncestor(QWidget* ancestor);
void setFather(QWidget* father);
QWidget* getFather() { return father; }
void registerName(QString name) { path = name; }
protected: protected:
void paintEvent(QPaintEvent* event); void paintEvent(QPaintEvent* event);
void enterEvent(QEvent* event); void enterEvent(QEvent* event);
void leaveEvent(QEvent* event); void leaveEvent(QEvent* event);
void mousePressEvent(QMouseEvent* event); void mousePressEvent(QMouseEvent* event);
void dragEnterEvent(QDragEnterEvent* event);
void dropEvent(QDropEvent* event);
private: private:
/*QVector<QPushButton> buttons;*/ /*QVector<QPushButton> buttons;*/
QString path;
QWidget* ancestor;
QWidget* father;
QPushButton* button; QPushButton* button;
QImage image; QImage image;
Poppler::Page* pPage; Poppler::Page* pPage;
QPixmap pixmap; QPixmap pixmap;
QPushButton* btn1, *btn2; QPushButton* btn1, *btn2;
bool selected = false;
signals: signals:
void pageClicked(QMouseEvent* event, QImage pageImage); void pageClicked(QMouseEvent* event, QString path);
void previewUpdate(Poppler::Page*); void previewUpdate(Poppler::Page*);
void droppedPage(QString, QString);
}; };

View File

@ -39,10 +39,6 @@ void PDFTableWidget::loadFile(QString fileName) {
PDFFileWidget* fileWidget = new PDFFileWidget(); PDFFileWidget* fileWidget = new PDFFileWidget();
fileWidget->setAncestor(this); fileWidget->setAncestor(this);
fileWidget->setDocument(doc, fileName); 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); fileWidgets.append(fileWidget);
@ -51,3 +47,46 @@ void PDFTableWidget::loadFile(QString fileName) {
containerLayout->insertWidget(containerLayout->count()-1, fileWidget); 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);
}

View File

@ -1,7 +1,10 @@
#pragma once #pragma once
#include <QFrame> #include <QFrame>
#include <QHash>
#include <poppler-qt5.h> #include <poppler-qt5.h>
#include "pdf_page_widget.h"
class QImage; class QImage;
class QVBoxLayout; class QVBoxLayout;
class QString; class QString;
@ -14,12 +17,12 @@ class PDFTableWidget : public QFrame {
public: public:
PDFTableWidget(QWidget* parent = 0); PDFTableWidget(QWidget* parent = 0);
void loadFile(QString fileName); void loadFile(QString fileName);
void registerPage(PDFPageWidget* child);
protected: protected:
private: private:
QVBoxLayout* outerLayout; QVBoxLayout* outerLayout;
QScrollArea* scrollArea; QScrollArea* scrollArea;
QWidget* containerWidget; QWidget* containerWidget;
QVBoxLayout* containerLayout; QVBoxLayout* containerLayout;
@ -28,8 +31,14 @@ private:
QVector<QString> fileNames; QVector<QString> fileNames;
QVector<PDFFileWidget*> fileWidgets; QVector<PDFFileWidget*> fileWidgets;
QHash<QString, PDFPageWidget*> pageChilds;
signals: signals:
void pageClicked(QMouseEvent*, QImage); void pageClicked(QMouseEvent*, QImage);
void previewUpdate(Poppler::Page*); void previewUpdate(Poppler::Page*);
private slots:
void pageClicked(QMouseEvent*, QString path);
void droppedPage(QString pathFrom, QString pathTo);
}; };