From 26852c5771eb986cfaf07cc9d5d1be47756d4e7e Mon Sep 17 00:00:00 2001
From: Rtch90 <ritchie.cunningham@protonmail.com>
Date: Thu, 18 Dec 2014 13:50:37 +0000
Subject: [PATCH] [Fix] Fixed singular selection.

---
 src/pdf_page_widget.cpp  | 37 +++++++++++++++++++++----------------
 src/pdf_page_widget.h    |  7 +++++--
 src/pdf_table_widget.cpp | 21 +++++++++++++++++----
 src/pdf_table_widget.h   |  8 ++++++--
 4 files changed, 49 insertions(+), 24 deletions(-)

diff --git a/src/pdf_page_widget.cpp b/src/pdf_page_widget.cpp
index 2b77448..1ce426c 100644
--- a/src/pdf_page_widget.cpp
+++ b/src/pdf_page_widget.cpp
@@ -12,7 +12,7 @@ PDFPageWidget::PDFPageWidget(QWidget* parent) :
   /* Resize widget. */
   this->resize(150, 150);
   this->setMinimumSize(150, 150);
-  this->setMinimumSize(150, 150);
+  this->setMaximumSize(150, 150);
   this->setAutoFillBackground(true);
 
   this->setMouseTracking(true);
@@ -44,25 +44,16 @@ 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)));
+
+  connect(this, SIGNAL(pageClicked(PDFPageWidget*, QMouseEvent*, QString)),
+          ancestor, SLOT(pageClicked(PDFPageWidget*, QMouseEvent*, QString)));
+  connect(this, SIGNAL(pageDropped(PDFPageWidget*, QDropEvent*, QString,QString)),
+          ancestor, SLOT(pageDropped(PDFPageWidget*, QDropEvent*, QString,QString)));
 }
 
 void PDFPageWidget::setFather(QWidget* father) {
@@ -86,9 +77,14 @@ void PDFPageWidget::setThumbnail(QImage pageImage) {
   update();
 }
 
+void PDFPageWidget::setSelected(bool select) {
+  selected = select;
+  update();
+}
+
 void PDFPageWidget::mousePressEvent(QMouseEvent* event) {
   if(pPage != NULL) {
-    emit pageClicked(event, path);
+    emit pageClicked(this, event, path);
     emit previewUpdate(pPage);
 
     selected = !selected;
@@ -96,6 +92,15 @@ void PDFPageWidget::mousePressEvent(QMouseEvent* event) {
   }
 }
 
+void PDFPageWidget::dragEnterEvent(QDragEnterEvent* event) {
+  event->acceptProposedAction();
+}
+
+void PDFPageWidget::dropEvent(QDropEvent* event) {
+  emit pageDropped(this, event, event->mimeData()->text(), path);
+  event->acceptProposedAction();
+}
+
 void PDFPageWidget::leaveEvent(QEvent* event) {
  btn1->hide();
  btn2->hide();
diff --git a/src/pdf_page_widget.h b/src/pdf_page_widget.h
index e10027e..7eb0a8a 100644
--- a/src/pdf_page_widget.h
+++ b/src/pdf_page_widget.h
@@ -26,6 +26,9 @@ public:
   QWidget* getFather() { return father; }
   void registerName(QString name) { path = name; }
 
+  void setSelected(bool select);
+  bool isSelected(void) { return selected; }
+
 protected:
   void paintEvent(QPaintEvent* event);
   void enterEvent(QEvent* event);
@@ -49,8 +52,8 @@ private:
   bool            selected;
 
 signals:
-  void pageClicked(QMouseEvent* event, QString path);
+  void pageClicked(PDFPageWidget* sender, QMouseEvent* event, QString);
+  void pageDropped(PDFPageWidget* sender, QDropEvent* event, QString, QString);
   void previewUpdate(Poppler::Page*);
-  void droppedPage(QString, QString);
 };
 
diff --git a/src/pdf_table_widget.cpp b/src/pdf_table_widget.cpp
index d24abb9..dd2af89 100644
--- a/src/pdf_table_widget.cpp
+++ b/src/pdf_table_widget.cpp
@@ -57,9 +57,21 @@ void PDFTableWidget::registerPage(PDFPageWidget* child) {
   child->registerName(name);
 }
 
-void PDFTableWidget::pageClicked(QMouseEvent* event, QString path) {
+void PDFTableWidget::pageClicked(PDFPageWidget* sender, QMouseEvent* event, QString path) {
   if(event->button() == Qt::LeftButton) {
-    /* Left click to start dragging. */
+    /* Handle selection. */
+    for(int i = 0; i < selectedPages.size(); i++) {
+      selectedPages.at(i)->setSelected(false);
+    }
+
+    selectedPages.clear();
+
+    if(!sender->isSelected()) {
+      sender->setSelected(true);
+      selectedPages.append(sender);
+    }
+
+    /* Handle drag. */
     QDrag*      drag      = new QDrag(this);
     QMimeData*  mimeData  = new QMimeData();
 
@@ -67,11 +79,12 @@ void PDFTableWidget::pageClicked(QMouseEvent* event, QString path) {
     drag->setMimeData(mimeData);
     drag->setPixmap(QPixmap(":/img/copy.png"));
 
-    Qt::DropAction dropAction = drag->exec();
+    drag->exec();
   }
 }
 
-void PDFTableWidget::droppedPage(QString pathFrom, QString pathTo) {
+void PDFTableWidget::pageDropped(PDFPageWidget* sender, QDropEvent* event,
+      QString pathFrom, QString pathTo) {
   /*
    * We have dragged the page and dropped it.
    * So we'll handle backend operations here.
diff --git a/src/pdf_table_widget.h b/src/pdf_table_widget.h
index 417f513..c528ab2 100644
--- a/src/pdf_table_widget.h
+++ b/src/pdf_table_widget.h
@@ -11,6 +11,7 @@ class QVBoxLayout;
 class QString;
 class QScrollArea;
 class QMouseEvent;
+class QPoint;
 class PDFFileWidget;
 
 class PDFTableWidget : public QFrame {
@@ -39,7 +40,10 @@ signals:
   void previewUpdate(Poppler::Page*);
 
 private slots:
-  void pageClicked(QMouseEvent*, QString path);
-  void droppedPage(QString pathFrom, QString pathTo);
+  void pageClicked(PDFPageWidget* sender, QMouseEvent* event, QString path);
+  void pageDropped(PDFPageWidget* sender, QDropEvent* event, QString, QString);
+
+private:
+  QVector<PDFPageWidget*> selectedPages;
 };