[Add] Cut/Copy/Paste.
[Add] Finalized Drag&Drop [Change] Resize after Drag&Drop
This commit is contained in:
parent
528b955d16
commit
207a5f7a0d
@ -2,6 +2,7 @@
|
|||||||
#include <QtGlobal>
|
#include <QtGlobal>
|
||||||
#include "pdf_file_widget.h"
|
#include "pdf_file_widget.h"
|
||||||
#include "pdf_page_widget.h"
|
#include "pdf_page_widget.h"
|
||||||
|
#include "pdf_table_widget.h"
|
||||||
|
|
||||||
#define COLLAPSE_BUTTON_WIDTH 32
|
#define COLLAPSE_BUTTON_WIDTH 32
|
||||||
#define COLLAPSE_BUTTON_HEIGHT 32
|
#define COLLAPSE_BUTTON_HEIGHT 32
|
||||||
@ -39,8 +40,8 @@ void PagesContainerWidget::dragEnterEvent(QDragEnterEvent* event) {
|
|||||||
|
|
||||||
void PagesContainerWidget::dropEvent(QDropEvent* event) {
|
void PagesContainerWidget::dropEvent(QDropEvent* event) {
|
||||||
QPoint pos = event->pos();
|
QPoint pos = event->pos();
|
||||||
qDebug() << "FILE DROP";
|
int page = (pos.x() / (CHILD_AREA_SIDE_MARGIN + CHILD_AREA_WIDTH));
|
||||||
qDebug() << (pos.x() / (CHILD_AREA_SIDE_MARGIN + CHILD_AREA_WIDTH));
|
((PDFTableWidget*)ancestor)->moveSelectedPages(event->mimeData()->text(), pageWidgets.at(page));
|
||||||
event->acceptProposedAction();
|
event->acceptProposedAction();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -86,6 +87,7 @@ PDFFileWidget::PDFFileWidget(QWidget* parent) :QFrame(parent) {
|
|||||||
|
|
||||||
void PDFFileWidget::setAncestor(QWidget* ancestor) {
|
void PDFFileWidget::setAncestor(QWidget* ancestor) {
|
||||||
this->ancestor = ancestor;
|
this->ancestor = ancestor;
|
||||||
|
pagesContainerWidget->setAncestor(ancestor);
|
||||||
connect(this, SIGNAL(fileClicked(PDFFileWidget*, QMouseEvent*)), ancestor,
|
connect(this, SIGNAL(fileClicked(PDFFileWidget*, QMouseEvent*)), ancestor,
|
||||||
SLOT(fileClicked(PDFFileWidget*, QMouseEvent*)));
|
SLOT(fileClicked(PDFFileWidget*, QMouseEvent*)));
|
||||||
}
|
}
|
||||||
@ -165,12 +167,19 @@ int PDFFileWidget::removeChild(PDFPageWidget* child) {
|
|||||||
pagesContainerWidget->pageWidgets.remove(pos);
|
pagesContainerWidget->pageWidgets.remove(pos);
|
||||||
pagesContainerWidget->mainLayout->removeItem(pagesContainerWidget->mainLayout->itemAt(pos));
|
pagesContainerWidget->mainLayout->removeItem(pagesContainerWidget->mainLayout->itemAt(pos));
|
||||||
|
|
||||||
|
pagesContainerWidget->adjustSize();
|
||||||
return pos;
|
return pos;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int PDFFileWidget::indexChild(PDFPageWidget* child) {
|
||||||
|
return pagesContainerWidget->pageWidgets.indexOf(child);
|
||||||
|
}
|
||||||
|
|
||||||
void PDFFileWidget::insertChildAt(PDFPageWidget* child, int pos) {
|
void PDFFileWidget::insertChildAt(PDFPageWidget* child, int pos) {
|
||||||
child->setFather(this);
|
child->setFather(this);
|
||||||
pagesContainerWidget->mainLayout->insertWidget(pos, child);
|
pagesContainerWidget->mainLayout->insertWidget(pos, child);
|
||||||
pagesContainerWidget->pageWidgets.insert(pos, child);
|
pagesContainerWidget->pageWidgets.insert(pos, child);
|
||||||
|
|
||||||
|
pagesContainerWidget->adjustSize();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -30,6 +30,7 @@ public:
|
|||||||
QHBoxLayout* mainLayout;
|
QHBoxLayout* mainLayout;
|
||||||
|
|
||||||
void addPageWidget(PDFPageWidget* image);
|
void addPageWidget(PDFPageWidget* image);
|
||||||
|
void setAncestor(QWidget* ancestor) {this->ancestor = ancestor; }
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void dragEnterEvent(QDragEnterEvent* event);
|
void dragEnterEvent(QDragEnterEvent* event);
|
||||||
@ -37,6 +38,7 @@ protected:
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
int getPagesCount() const;
|
int getPagesCount() const;
|
||||||
|
QWidget* ancestor;
|
||||||
};
|
};
|
||||||
|
|
||||||
class PDFFileWidget : public QFrame {
|
class PDFFileWidget : public QFrame {
|
||||||
@ -49,6 +51,7 @@ public:
|
|||||||
void setAncestor(QWidget* ancestor);
|
void setAncestor(QWidget* ancestor);
|
||||||
void setDocument(Poppler::Document* document, QString fileName);
|
void setDocument(Poppler::Document* document, QString fileName);
|
||||||
int removeChild(PDFPageWidget* child);
|
int removeChild(PDFPageWidget* child);
|
||||||
|
int indexChild(PDFPageWidget* child);
|
||||||
void insertChildAt(PDFPageWidget* child, int pos);
|
void insertChildAt(PDFPageWidget* child, int pos);
|
||||||
|
|
||||||
void setSelected(bool select);
|
void setSelected(bool select);
|
||||||
|
@ -54,8 +54,49 @@ bool PDFJam::removePage(int fileIndex, int numPages, int deletedPageIndex) {
|
|||||||
pushCommand(cmd);
|
pushCommand(cmd);
|
||||||
}
|
}
|
||||||
|
|
||||||
void PDFJam::movePage(int fromFileIndex, int fromPageIndex, int toFileIndex, int toPageIndex) {
|
void PDFJam::cutPage(int fileIndex, int numPages, int pageIndex) {
|
||||||
|
if((pageIndex < 0) || (pageIndex >= numPages)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
copyPage(fileIndex, numPages, pageIndex);
|
||||||
|
removePage(fileIndex, numPages, pageIndex);
|
||||||
|
}
|
||||||
|
|
||||||
|
void PDFJam::copyPage(int fileIndex, int numPages, int pageIndex) {
|
||||||
|
QString cpTmp = "cp /tmp/hpdf/%1%2.pdf /tmp/hpdf/clipboard.pdf ";
|
||||||
|
QString cmd = cpTmp.arg(QString::number(fileIndex)).arg(QString::number(pageIndex));
|
||||||
|
pushCommand(cmd);
|
||||||
|
}
|
||||||
|
|
||||||
|
void PDFJam::pastePage(int fileIndex, int numPages, int pageIndex) {
|
||||||
|
/* TODO: Check if the clipboard file exists. */
|
||||||
|
QString cmd = "";
|
||||||
|
QString mvTmp = "mv /tmp/hpdf/%1/%2.pdf /tmp/hpdf/%3/%4.pdf ";
|
||||||
|
for(int i = numPages-1; i >= pageIndex; i--) {
|
||||||
|
cmd += mvTmp.arg(QString::number(fileIndex)).arg(QString::number(i))
|
||||||
|
.arg(QString::number(fileIndex)).arg(QString::number(i+1));
|
||||||
|
if(i > pageIndex) cmd += " && ";
|
||||||
|
}
|
||||||
|
|
||||||
|
QString pasteTmp = "cp /tmp/hpdf/clipboard.pdf /tmp/hpdf/%1/%2.pdf ";
|
||||||
|
cmd += " && " + pasteTmp.arg(QString::number(fileIndex)).arg(QString::number(pageIndex));
|
||||||
|
pushCommand(cmd);
|
||||||
|
}
|
||||||
|
|
||||||
|
void PDFJam::movePage(int fromFileIndex, int fromFileNumPage, int fromPageIndex,
|
||||||
|
int toFileIndex, int toFileNumPage, int toPageIndex) {
|
||||||
|
/* TODO: Back up clipboard. */
|
||||||
|
/* If this page is moving with files update to file index. */
|
||||||
|
if(toFileIndex == fromFileIndex) {
|
||||||
|
toFileNumPage--;
|
||||||
|
if(toPageIndex > fromPageIndex)
|
||||||
|
toPageIndex--;
|
||||||
|
toPageIndex--;
|
||||||
|
}
|
||||||
|
|
||||||
|
cutPage(fromFileIndex, fromFileNumPage, fromPageIndex);
|
||||||
|
pastePage(toFileIndex, toFileNumPage, toPageIndex);
|
||||||
}
|
}
|
||||||
|
|
||||||
void PDFJam::savePageAsImage(Poppler::Page pp, QString dst, double dpi = 72) {
|
void PDFJam::savePageAsImage(Poppler::Page pp, QString dst, double dpi = 72) {
|
||||||
@ -109,9 +150,10 @@ void PDFJam::loadFile(QString fileName, int fileIndex, Poppler::Document* pd) {
|
|||||||
pushCommand(cmd);
|
pushCommand(cmd);
|
||||||
|
|
||||||
/* Test the backend functions. */
|
/* Test the backend functions. */
|
||||||
/*removePage(0, numPages, 5);
|
|
||||||
rotatePage(0, 5, 270);
|
rotatePage(0, 5, 270);
|
||||||
exportFile(0, numPages-1, "/home/allanis/conco.pdf", QSize(2, 2), true, true, 1, 0);*/
|
movePage(0, numPages, 5, 0, numPages, 10);
|
||||||
|
/*removePage(0, numPages, 5);*/
|
||||||
|
exportFile(0, numPages, "/home/allanis/conco.pdf", QSize(2, 2), true, true, 1, 0);
|
||||||
/* End test. */
|
/* End test. */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -16,7 +16,10 @@ public:
|
|||||||
void loadFile(QString fileName, int, Poppler::Document*);
|
void loadFile(QString fileName, int, Poppler::Document*);
|
||||||
void exportFile(int, int, QString, QSize, bool, bool, int, int);
|
void exportFile(int, int, QString, QSize, bool, bool, int, int);
|
||||||
void savePageAsImage(Poppler::Page pp, QString dst, double);
|
void savePageAsImage(Poppler::Page pp, QString dst, double);
|
||||||
void movePage(int fromFileIndex, int fromPageIndex, int toFileIndex, int toPageIndex);
|
void movePage(int, int, int, int, int, int);
|
||||||
|
void pastePage(int, int, int);
|
||||||
|
void copyPage(int, int, int);
|
||||||
|
void cutPage(int, int, int);
|
||||||
|
|
||||||
bool removePage(int, int, int);
|
bool removePage(int, int, int);
|
||||||
bool rotatePage(int, int, int);
|
bool rotatePage(int, int, int);
|
||||||
|
@ -21,8 +21,9 @@ public:
|
|||||||
void setPopplerPage(Poppler::Page*);
|
void setPopplerPage(Poppler::Page*);
|
||||||
void setAncestor(QWidget* ancestor);
|
void setAncestor(QWidget* ancestor);
|
||||||
void setFather(QWidget* father);
|
void setFather(QWidget* father);
|
||||||
QWidget* getFather() { return father; }
|
QWidget* getFather(void) const { return father; }
|
||||||
void registerName(QString name) { path = name; }
|
void registerName(QString name) { path = name; }
|
||||||
|
QString getName(void) { return path; }
|
||||||
|
|
||||||
void setSelected(bool select);
|
void setSelected(bool select);
|
||||||
bool isSelected(void) { return selected; }
|
bool isSelected(void) { return selected; }
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
#include <QtWidgets>
|
#include <QtWidgets>
|
||||||
|
#include <QtAlgorithms>
|
||||||
#include "pdf_table_widget.h"
|
#include "pdf_table_widget.h"
|
||||||
#include "pdf_page_widget.h"
|
#include "pdf_page_widget.h"
|
||||||
#include "pdf_file_widget.h"
|
#include "pdf_file_widget.h"
|
||||||
@ -106,61 +107,97 @@ void PDFTableWidget::fileRemoveButtonClicked(PDFFileWidget* sender) {
|
|||||||
void PDFTableWidget::pageClicked(PDFPageWidget* sender, QMouseEvent* event, QString path) {
|
void PDFTableWidget::pageClicked(PDFPageWidget* sender, QMouseEvent* event, QString path) {
|
||||||
if(event->button() == Qt::LeftButton) {
|
if(event->button() == Qt::LeftButton) {
|
||||||
/* Handle selection. */
|
/* Handle selection. */
|
||||||
if(event->modifiers() != Qt::ControlModifier) {
|
if(selectedPages.size() > 0 && event->modifiers() != Qt::ControlModifier) {
|
||||||
for(int i = 0; i < selectedPages.size(); i++) {
|
/* Handle Drag. */
|
||||||
selectedPages.at(i)->setSelected(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
selectedPages.clear();
|
|
||||||
|
|
||||||
if(!sender->isSelected()) {
|
|
||||||
sender->setSelected(true);
|
|
||||||
selectedPages.append(sender);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if(!sender->isSelected()) {
|
|
||||||
sender->setSelected(true);
|
|
||||||
selectedPages.append(sender);
|
|
||||||
} else {
|
|
||||||
sender->setSelected(false);
|
|
||||||
selectedPages.remove(selectedPages.indexOf(sender));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Handle drag. */
|
|
||||||
QDrag* drag = new QDrag(this);
|
QDrag* drag = new QDrag(this);
|
||||||
QMimeData* mimeData = new QMimeData();
|
QMimeData* mimeData = new QMimeData;
|
||||||
|
|
||||||
mimeData->setText(path);
|
mimeData->setText(path);
|
||||||
drag->setMimeData(mimeData);
|
drag->setMimeData(mimeData);
|
||||||
drag->setPixmap(QPixmap(":/img/copy.png"));
|
drag->setPixmap(QPixmap(":/img/copy.png"));
|
||||||
|
|
||||||
drag->exec();
|
drag->exec();
|
||||||
|
} else {
|
||||||
|
if(!sender->isSelected()) {
|
||||||
|
sender->setSelected(true);
|
||||||
|
PDFFileWidget* senderF = (PDFFileWidget*)sender->getFather();
|
||||||
|
int senderPID = senderF->indexChild(sender);
|
||||||
|
int senderFID = fileWidgets.indexOf(senderF);
|
||||||
|
|
||||||
|
int i = 0;
|
||||||
|
for(i = 0; i < selectedPages.size(); i++) {
|
||||||
|
PDFPageWidget* target = selectedPages.at(i);
|
||||||
|
PDFFileWidget* targetF = (PDFFileWidget*)target->getFather();
|
||||||
|
int targetPID = targetF->indexChild(target);
|
||||||
|
int targetFID = fileWidgets.indexOf(targetF);
|
||||||
|
|
||||||
|
if(targetFID == senderFID && targetFID > senderFID)
|
||||||
|
break;
|
||||||
|
|
||||||
|
if(targetFID > senderFID)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
selectedPages.insert(i, sender);
|
||||||
|
} else {
|
||||||
|
sender->setSelected(false);
|
||||||
|
selectedPages.remove(selectedPages.indexOf(sender));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(event->button() == Qt::RightButton) {
|
||||||
|
for(int i = 0; i < selectedPages.size(); i++) {
|
||||||
|
selectedPages.at(i)->setSelected(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
selectedPages.clear();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void PDFTableWidget::pageDropped(PDFPageWidget* sender, QDropEvent* event,
|
void PDFTableWidget::pageDropped(PDFPageWidget* sender, QDropEvent* event,
|
||||||
QString pathFrom, QString pathTo) {
|
QString pathFrom, QString pathTo) {
|
||||||
/*
|
|
||||||
* We have dragged the page and dropped it.
|
|
||||||
* So we'll handle backend operations here.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Frontend operations here.. */
|
moveSelectedPages(pathFrom, pathTo);
|
||||||
if(pathFrom == pathTo)
|
}
|
||||||
return;
|
|
||||||
qDebug() << pathFrom;
|
void PDFTableWidget::moveSelectedPages(QString pathFrom, PDFPageWidget* page) {
|
||||||
qDebug() << pathTo;
|
moveSelectedPages(pathFrom, page->getName());
|
||||||
PDFPageWidget* childFrom = pageChilds[pathFrom];
|
}
|
||||||
PDFPageWidget* childTo = pageChilds[pathTo];
|
|
||||||
|
void PDFTableWidget::moveSelectedPages(QString pathFrom, QString pathTo) {
|
||||||
PDFFileWidget* fileFrom = (PDFFileWidget*) childFrom->getFather();
|
if(selectedPages.size() == 0)
|
||||||
PDFFileWidget* fileTo = (PDFFileWidget*) childTo->getFather();
|
return;
|
||||||
|
|
||||||
int posFrom = fileFrom->removeChild(childFrom);
|
bool accept = false;
|
||||||
int posTo = fileTo->removeChild(childTo);
|
for(int i = 0; i < selectedPages.size(); i++)
|
||||||
|
if(selectedPages.at(i)->getName() == pathFrom)
|
||||||
fileTo->insertChildAt(childFrom, posTo);
|
accept = true;
|
||||||
fileFrom->insertChildAt(childTo, posFrom);
|
|
||||||
|
if(!accept)
|
||||||
|
return;
|
||||||
|
|
||||||
|
for(int i = 0; i < selectedPages.size(); i++)
|
||||||
|
if(selectedPages.at(i)->getName() == pathTo)
|
||||||
|
return;
|
||||||
|
|
||||||
|
PDFPageWidget* childTo = pageChilds[pathTo];
|
||||||
|
PDFFileWidget* fileTo = (PDFFileWidget*) childTo->getFather();
|
||||||
|
|
||||||
|
for(int i = selectedPages.size() - 1; i >= 0; i--) {
|
||||||
|
PDFPageWidget* childFrom = selectedPages[i];
|
||||||
|
PDFFileWidget* fileFrom = (PDFFileWidget*) childFrom->getFather();
|
||||||
|
fileFrom->removeChild(childFrom);
|
||||||
|
/*PDFFileWidget* fileFrom = (PDFFileWidget*) childFrom->getFather();*/
|
||||||
|
|
||||||
|
/*int posFrom = fileFrom->removeChild(childFrom);*/
|
||||||
|
}
|
||||||
|
int posTo = fileTo->indexChild(childTo);
|
||||||
|
|
||||||
|
for(int i = selectedPages.size() - 1; i >= 0; i--) {
|
||||||
|
PDFPageWidget* childFrom = selectedPages[i];
|
||||||
|
PDFFileWidget* fileFrom = (PDFFileWidget*)childFrom->getFather();
|
||||||
|
fileTo->insertChildAt(childFrom, posTo);
|
||||||
|
/*fileFrom->insertChildAt(childTo, posFrom);*/
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -50,5 +50,10 @@ private slots:
|
|||||||
private:
|
private:
|
||||||
QVector<PDFPageWidget*> selectedPages;
|
QVector<PDFPageWidget*> selectedPages;
|
||||||
QVector<PDFFileWidget*> selectedFiles;
|
QVector<PDFFileWidget*> selectedFiles;
|
||||||
|
|
||||||
|
/*bool operator()(PDFPageWidget* e1, PDFPageWidget* e2);*/
|
||||||
|
public:
|
||||||
|
void moveSelectedPages(QString, QString);
|
||||||
|
void moveSelectedPages(QString, PDFPageWidget* page);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user