From cc955d6489a392e840677b5282f462c22fdd7a03 Mon Sep 17 00:00:00 2001 From: Rtch90 Date: Mon, 22 Dec 2014 11:06:01 +0000 Subject: [PATCH] [Add] Export dialogue. --- bin/hpdf.pro | 67 ++---- bin/hpdf.qrc | 1 + img/collapse.png | Bin 850 -> 244 bytes img/expand.png | Bin 893 -> 387 bytes img/export.png | Bin 2203 -> 1117 bytes src/PDFExportDialog.cpp | 229 ++++++++++++++++++ src/PDFExportDialog.h | 50 ++++ src/PDFFactory.cpp | 218 +++++++++++++++++ src/PDFFactory.h | 55 +++++ src/PDFFileWidget.cpp | 232 ++++++++++++++++++ src/PDFFileWidget.h | 102 ++++++++ src/PDFJam.cpp | 183 ++++++++++++++ src/PDFJam.h | 37 +++ src/PDFPageWidget.cpp | 187 +++++++++++++++ src/PDFPageWidget.h | 84 +++++++ src/PDFPreviewWidget.cpp | 158 +++++++++++++ src/PDFPreviewWidget.h | 58 +++++ src/PDFTableWidget.cpp | 421 +++++++++++++++++++++++++++++++++ src/PDFTableWidget.h | 87 +++++++ src/PreviewGen.cpp | 25 ++ src/PreviewGen.h | 30 +++ src/ThumbGen.cpp | 46 ++++ src/{thumbgen.h => ThumbGen.h} | 20 +- src/main.cpp | 15 +- src/main_window.cpp | 14 -- src/main_window.h | 17 -- src/main_window.ui | 24 -- src/pdf_factory.cpp | 155 ------------ src/pdf_factory.h | 52 ---- src/pdf_file_widget.cpp | 185 --------------- src/pdf_file_widget.h | 88 ------- src/pdf_jam.cpp | 185 --------------- src/pdf_jam.h | 38 --- src/pdf_page_widget.cpp | 137 ----------- src/pdf_page_widget.h | 57 ----- src/pdf_preview_widget.cpp | 121 ---------- src/pdf_preview_widget.h | 46 ---- src/pdf_table_widget.cpp | 203 ---------------- src/pdf_table_widget.h | 59 ----- src/thumbgen.cpp | 45 ---- 40 files changed, 2246 insertions(+), 1485 deletions(-) create mode 100644 src/PDFExportDialog.cpp create mode 100644 src/PDFExportDialog.h create mode 100644 src/PDFFactory.cpp create mode 100644 src/PDFFactory.h create mode 100644 src/PDFFileWidget.cpp create mode 100644 src/PDFFileWidget.h create mode 100644 src/PDFJam.cpp create mode 100644 src/PDFJam.h create mode 100644 src/PDFPageWidget.cpp create mode 100644 src/PDFPageWidget.h create mode 100644 src/PDFPreviewWidget.cpp create mode 100644 src/PDFPreviewWidget.h create mode 100644 src/PDFTableWidget.cpp create mode 100644 src/PDFTableWidget.h create mode 100644 src/PreviewGen.cpp create mode 100644 src/PreviewGen.h create mode 100644 src/ThumbGen.cpp rename src/{thumbgen.h => ThumbGen.h} (62%) delete mode 100644 src/main_window.cpp delete mode 100644 src/main_window.h delete mode 100644 src/main_window.ui delete mode 100644 src/pdf_factory.cpp delete mode 100644 src/pdf_factory.h delete mode 100644 src/pdf_file_widget.cpp delete mode 100644 src/pdf_file_widget.h delete mode 100644 src/pdf_jam.cpp delete mode 100644 src/pdf_jam.h delete mode 100644 src/pdf_page_widget.cpp delete mode 100644 src/pdf_page_widget.h delete mode 100644 src/pdf_preview_widget.cpp delete mode 100644 src/pdf_preview_widget.h delete mode 100644 src/pdf_table_widget.cpp delete mode 100644 src/pdf_table_widget.h delete mode 100644 src/thumbgen.cpp diff --git a/bin/hpdf.pro b/bin/hpdf.pro index 8f52170..9325d7b 100644 --- a/bin/hpdf.pro +++ b/bin/hpdf.pro @@ -1,49 +1,30 @@ QT += widgets - TEMPLATE = app -TARGET = hpdf -DEPENDPATH += . -INCLUDEPATH += /usr/include/poppler/qt5/ -LIBS += -L/usr/lib -lpoppler-qt5 +TARGET = hpdf +DEPENDPATH += . +INCLUDEPATH += /usr/include/poppler/qt5 +LIBS += -L/usr/lib -lpoppler-qt5 -HEADERS += \ - ../src/pdf_factory.h \ - ../src/pdf_page_widget.h \ - ../src/pdf_table_widget.h \ - ../src/pdf_file_widget.h \ - ../src/pdf_jam.h \ - ../src/thumbgen.h \ - ../src/pdf_preview_widget.h +# Input +HEADERS += ../src/PDFExportDialog.h \ + ../src/PDFFactory.h \ + ../src/PDFFileWidget.h \ + ../src/PDFJam.h \ + ../src/PDFPageWidget.h \ + ../src/PDFPreviewWidget.h \ + ../src/PDFTableWidget.h \ + ../src/PreviewGen.h \ + ../src/ThumbGen.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_jam.cpp \ - ../src/thumbgen.cpp \ - ../src/pdf_preview_widget.cpp +SOURCES += ../src/main.cpp \ + ../src/PDFExportDialog.cpp \ + ../src/PDFFactory.cpp \ + ../src/PDFFileWidget.cpp \ + ../src/PDFJam.cpp \ + ../src/PDFPageWidget.cpp \ + ../src/PDFPreviewWidget.cpp \ + ../src/PDFTableWidget.cpp \ + ../src/PreviewGen.cpp \ + ../src/ThumbGen.cpp RESOURCES += hpdf.qrc - -#CONFIG += console - -macx { - CONFIG(release, debug|release) { - DESTDIR = ../bin/ - } -} - -win32 { - CONFIG(release, debug|release) { - DESTDIR = ../bin/ - } -} - -linux { - CONFIG(release, debug|release) { - DESTDIR = ../bin/ - } -} - diff --git a/bin/hpdf.qrc b/bin/hpdf.qrc index da6679d..114f0b2 100644 --- a/bin/hpdf.qrc +++ b/bin/hpdf.qrc @@ -13,5 +13,6 @@ ../img/expand.png ../img/remove.png ../img/rotate.png + ../img/delete.png diff --git a/img/collapse.png b/img/collapse.png index 93cadf81b1374f7e3f8006e8857304d98e7f594d..d31bb94aff8e02281eb37b9dc767eb60ac3b27ba 100644 GIT binary patch delta 192 zcmV;x06+iI2J``t85jcq001a04^sdD00d`2O+f$vugEtAis_LdCw~AoP)t-s|NsBY zA^`tpM9(J$)GrO$Hx=796y87{;zuRsO)KzHF#l>u|8P$KcUAv>T>pe(|A=P)s)*#Q z%vb;b00VSVPE!ECzryv{v;Y7AHAzH4R2Uh(!N&mrAP4}lvmz*#{g?IY1SarD?8E2U udrcob0(Kq-RDV<;q#azOsWvG&1^&2O9-IV>1-4xy`*kxUc_g&;b&FM`+5TsZ(ozyI7%uYIF(@@j> z|8%zXey1W6>Vt=K&iB2~^ZtHE*4^C=nM?+`TrNEcIfQZmJVA?}D?s>~PNzQ+wtopo zrBYx|1^z4*q26FHoa^c7xl&S6QYDI_bf8cuAPB;TiHV6ZkH_M`3n0G=G5r{Bv{IaxA0D(tDcYIFUrQnTR}@O!9iYzPYWf z)glZHB9Dyocpl+!7&|*V5+acZc-qU}-NpLwFj`t#EQN)I&5X+#jmCz)zUu>Fha)#@ z;Vm*%D(sSBEEf91)r4otFEkurLp{uRs?e@iG1*sJ1bh--nlQ9%)G=K1Vy;9-6 zClZq92t|^h_umCAC@KP$9LT?Qvx0G%z_DO3gs9UAF((I&v$OE|eAwUL2jvR2S`7^e zXJlkZ0MyQM`)}yWPBJwN-IT{&)>Os>dVI! zY;Sm=X5mVK5|OY<2sfNX`GZH8o}PSax4*H`0KR7e>|%JG&UbREjeopjV9T2m`1p-K}|sb0I$e51&ZmBAt!$U6-h)vRCwB~Q#)>iFc39TfP!wR zX=u0sqC#G2Pe8F}$q{mvEjU4>1w=(p3k~(sK*3LrXEr$YDsDnX8Z^usKhGQ624jpI zu{Zc!Kd--Gckc8%&bXgn3vQR&lVIC65{97yR#ip!oE%H|PY3I|B8hBrPKOJEWm!aG zH#vW&!v(=S&mys#oYUbl!M!X?YFQQmH%*hct}7NnT-P;&e^?04CE;L^V45bHB#E-a zIF4i(28@FsAdcfGc$%hEk!Xj?%nNo zu4Nwh-t)WXoX_{1dw%C!O?!JgG#U*!j#F#W4pJomk(7^(5+g+ve?|F5S|TBv&4See z{udqTU}KSo+uGW?nwpxr zFM4}0!F!;XIhe!(e;5n4BbJ-M`}ibYhTq_PO?M5?^AedXF%wRfWwE5Bq`~1h>bx|2 z9T}4ZqtS>^D1-;QdR2wPVYO}Dn8s!QO*A$(I*W^o8yL$B>}SrL?i`wbf>nJS3fV@Z zQKV9-&COx)%F2owFKK__X=D^FEzO;b73fi9u~_VPzq^oEf2ha8!h$+5olawUc^S!M z5`kbq-E~%WiXuMICmt!Rvon?%7~}CZcv4?s&K6Qgf4Skc3hjGU4~17Y&O|PcN|aN?F@rdpeQ|cyJH6jf138vf&tJxrfwWE9 zoR!6_jY*r~P@}KL++1LqvCQDJ%jI%6izi`86+xTeq3G$TYO|XLESB?Re zbR5IOZZ~5&T1Lq4_l^w>J$}?*bq9NXTA=eOkTn?;fBWnZzgMVnt{<>Pt?0G)V`OCb z(cGMWjIq4gY-TC?F*P;GQKq;Xr*7HA-v!Vv((UmCp$h;!?8ddK9=KfhhaNs0 zaMO`~MjIh%s;jHj9LHj@Jj(rvva)i=g$q|(YHRDtwp=t!OuX~;_1%8z^Ub`_>2#y{ z`T0rpI|gqtKq8SqCX=zy`ypa>lT3g4C@Da|d#zSGZ!j1@2I?>1j{pMzRYQ}R@4FW( P00000NkvXXu0mjf(@~W~ diff --git a/img/export.png b/img/export.png index 4bf2cba36cd2399269fe4185724400ba1fa74513..f69e5ff1ffac8b7dc4fd2f32b708dd70a71d59ec 100644 GIT binary patch delta 1071 zcmV+~1kn4N5#0!o87l+;008|9F$@3z00MJDNmK|3RqRFt00009a7bBm000Fs000Fs z0k`caQjta{e*@e}L_t(o!_}9&i)2L<#($@(`tB&s29AOX27`j&in|kt@$MQerX~hr z?muB@Y-}i^$%+^W!pH`iDF*ApD6Xih;P?szdv^NPF{snkRdw&3rMoroHr;jl*5f?B z@0_X<<-dI#|91r;HP3yxcu{cd{r3AD#5!Mn@R|FRe;y&wF(U$k2OttT;gnOr^ZDD? z-}LVbAm`cDBY*Yq$Fznd3=TB8^AN|jya2Co34jhqV8)C92nyWdCXq`s;}k+itgM%!-<7ean5GsYZ-Ej72No_tYy>!bV|^I`S1zYnTE6u-Jm<0< zLbNbRF++&OT$7|xP=;xxLhu9xM~9#}`mR_if6xy+&=vz$1S_PZFd7ct02T|HW^+8T zLQ)DNLk%i5)oifP6AKn8a0w;Sv%nEX=pkbs^!O^#zU6s?)B!z8Psa@9l&5%-o;ff_ z_^Baz!Kfr$(A51f51}nZ}I7@DHV!v%&)l;30P&4 ze<#^u-@9=S@($$z>B;?_}?O3T@Nj(b|^hLXpJO@p& z2z3B_5oMk9;H*9=wy$PCDA8DF$)O}ue;|uR{)A5oUJRL%@|>pc0_U?V8HT}*7Exwg z-N5eDGVVcHtT%~#$uOp?>9UM%7Wo$F$^BqE52CFj<1}qOSjX-q24=2I(DdKHfN7d8 z6aL14gl7>ny?L759H7aAS5gqTyf)CWkS9TwjUzwAVB*-ad69@k$OLUOnQ8;sf5wA2 zm1xstZe1nyu_d&HPPeS3G^dL&tfkv|(4G#n2T!oW?L2rsy1>~xMKJSrc$^b{s6l>| zw}5wT@F`ynb_31ctx`*?q}!)MiM-4;;I-O=V83dYqGz|LrQYs6m4feiogKd5+Lo0_ zf$JPG=T3{kVLlsgw;RAO91d#{d0%o-fjjh7K2X40N4$Nrl>RjSgq!*JE}pQrzw?sr z;?&_J-7=gy@i^ywP$v$-S*t{eL`P~RinTA(N$@Atm`hPy0eb@jCCOS&gHeDiSx p9L{#7XeX|84(po}S|qA1{0{(@kS}o!05ileXBZN>wcvMt`K+0G? zfK(mO1cdsUG0fNpI(GO#`++*eX+N}ObSTwU#%haD=}d>t(4no=GPd#>9E%D#4#>j{ z6e5J=KF(wBemLh|ZeHXaaLugjGyCN3v;S-D|JrM>bA*4^ny<1*zT#qD@8*gX4^1$` zc{>du3cK7C*Y6O3?^_KTROUJmt#BMW?I6U5+EZIET)6bly?gh%{RJSdw}e(c+W6|s znKPf9UpHTNo}Ca9DFg_C6cQmoNQpooq{!Y^TH|^Sp6lYeF0SX`x*n-ilHI%i>bAGH znXcfi!U3%no~KaC!}C0pQbFr=={F36 zNI2?i#BcNS_#nouZABpe|U zi4u#&QJzMjh(#k*S64HAdTqoojqg3OV%bw88ilmhJzBqWzm&c=Olcy7Kp>EY#0puI zS5z>yW@2i<@b$v7|mF{HxNoGl-8K0iDg;D}FCQq)4V2GVf zO-+B+fJr{<5h+lQUDNu|@co{M1^7=|P-mY09& z%S(;G8zTxJm*h$bgwTLS2pO~*kd%%uWy#_tSY`+-6vDC$G;rne6+Suk5p8X4!ZM8~ zZWw@T-q2mFueGM6xP%4szmXGi{nqtd>gs>$P)h4V2M29B=0Wd`mGU=yl&on zVVYL!h;yJfk_*w57a)UviIgCOz%(tSX(Vqd0J$X3>;Kn$q|lv3<^XD3%%6EuG= zT}j#a@k6+jybd8Z!vn2UZw}}?fM_&II1*via|?NE^PgEX=KnU)2|7{VzI#k(1uqvcX8F6%DHBq(jG$i6^4)zWmISkrVM`}gkX_T zPP_Ldj+aIV{{Vk6d74;WE06qO7Movsi8U*qp|+-Gh6h zh2y0t2#rGs1L@aQd>}zR$RU5l=gtA{d!m*DyZ+5bTRvvll4V(Mc9!z;@*x2rua!tZ zDcz&CB%5hTHRE_`Y%lGXNHW)+jpNy*+ytLqd7o*E^C_B|V#^y_vLU#$_5^I;9?+nb zuRY0?A8MBBKinhq-??sx`_}ewm{O z^*lvO;tL$d#&*-#u8rf`*p7c~JHBUZH_h4B0Wm~ zTP10;TZkC(9LtL?wIZ!GE#5hbM^`Xzmd9`2e1)dfYq}jX9*Z@92&d_1fowK@a^l-p1wlZ zjAa2_^MWR36;L^9HhX_}hT5`uG(6jI-SNWV@KA(NKic#m0SuN>3ZW%3*t|1R7#T-t zsFppyKFebdKFxx;3r1!mQyP&8nSGU%PGSlx8;5U=Pa!Nj83IOhvEv^&MmH~f;4;$lWZOaM=K`s62e7nI1&3mrBLl7ok8&gN~f1&+Y0h@oekw_#mvbm5-B>wa1ejY#Z ze#fN#*0IG+cin$^XZ`f)GXQw)53ezI%{8Kjj3_l@>-qTa3C4$Ju;Itg4ftFzC;&%~ z9<_lToo}vw?9oM2s;lZ3*3SoE$6vOgbsD8Kd7(n8i|RPE{VI#@evswgT7E;S8vV|u zl-3kQ##0`h#e1)}@||z5<*u*KzF}pVUIBD2ZRCea7^8n`+5cu6FRXi!+bSxCwPw_t zba+b{qy|<1%vk!s(#Ci^wmBY;+W^N-ACJzszfd08)uJYqPD+`UIec%)1tb$m({Y?v zw{QF7I=}^7tvl{i!mq;!0fYmM0MQJPnwlxKp-?Capz`F81S+W$Vw2R`>CJ#rN;Tl6 zVVY^JrMG{7|NajE2e5&3MzvpD%>uB1JYZCyg#nmQfZUHd(P+$0CKG*}gBLtZ>Z0G^w?=b2%V_e~tn1pf!U*vH +#include +#include "PDFExportDialog.h" + +PDFExportDialog::PDFExportDialog(QWidget *parent) : + QDialog(parent) { + mainLayout = new QGridLayout(); + mainLayout->setSpacing(15); + + // File list + fileListBox = new QGroupBox("Selected files"); + QVBoxLayout *fileListLayout = new QVBoxLayout(); + fileList = new QListWidget(); + connect(fileList, SIGNAL(currentRowChanged(int)), this, SLOT(fileListChanged(int))); + fileListLayout->addWidget(fileList); + fileListLayout->setContentsMargins(0, 20, 6, 6); + fileListBox->setLayout(fileListLayout); + mainLayout->addWidget(fileListBox, 0, 0, 4, 2); + + // is landscape + landscapeBox = new QGroupBox("Output orientation"); + QVBoxLayout *landscapeLayout = new QVBoxLayout(); + chkPortrait = new QRadioButton("Portrait"); + chkPortrait->setChecked(true); + chkLandscape = new QRadioButton("Landscape"); + connect(chkLandscape, SIGNAL(toggled(bool)), this, SLOT(chkLandscapeChanged(bool))); + landscapeLayout->addWidget(chkPortrait); + landscapeLayout->addWidget(chkLandscape); + landscapeBox->setLayout(landscapeLayout); + + // n-up + nupBox = new QGroupBox("N-up option"); + nupBox->setCheckable(true); + nupBox->setChecked(false); + connect(nupBox, SIGNAL(toggled(bool)), this, SLOT(nupBoxToggled(bool))); + QGridLayout *nupLayout = new QGridLayout(); + QLabel *lblRow = new QLabel("Col:"); + QLabel *lblCol = new QLabel("Row:"); + txtRow = new QLineEdit("1"); + connect(txtRow, SIGNAL(textEdited(const QString &)), this, SLOT(txtRowChanged(const QString &))); + txtCol = new QLineEdit("1"); + connect(txtCol, SIGNAL(textEdited(const QString &)), this, SLOT(txtColChanged(const QString &))); + nupLayout->addWidget(lblRow, 0, 0, 1, 1); + nupLayout->addWidget(txtRow, 0, 1, 1, 2); + nupLayout->addWidget(lblCol, 1, 0, 1, 1); + nupLayout->addWidget(txtCol, 1, 1, 1, 2); + nupBox->setLayout(nupLayout); + + // offsets + offsetBox = new QGroupBox("Two-sided offset"); + offsetBox->setCheckable(true); + offsetBox->setChecked(false); + connect(offsetBox, SIGNAL(toggled(bool)), this, SLOT(offsetBoxToggled(bool))); + QGridLayout *offsetLayout = new QGridLayout(); + QLabel *lblLeft = new QLabel("Left Offset:"); + txtLeftOffset = new QLineEdit("0"); + connect(txtLeftOffset, SIGNAL(textEdited(const QString &)), this, SLOT(txtLeftChanged(const QString &))); + offsetLayout->addWidget(lblLeft, 0, 0, 1, 1); + offsetLayout->addWidget(txtLeftOffset, 0, 1, 1, 2); + offsetBox->setLayout(offsetLayout); + + QVBoxLayout *midLayout = new QVBoxLayout(); + midLayout->addWidget(landscapeBox);midLayout->addWidget(nupBox);midLayout->addWidget(offsetBox); + midLayout->addStretch(1); + midLayout->setSpacing(10); + QFrame *midFrame = new QFrame(); + midFrame->setFrameStyle(QFrame::StyledPanel | QFrame::Plain); + midFrame->setLayout(midLayout); + mainLayout->addWidget(midFrame, 0, 2, 4, 2); + + // buttons + QVBoxLayout *rightLayout = new QVBoxLayout(); + btnSave = new QPushButton("&Export..."); + connect(btnSave, SIGNAL(clicked()), this, SLOT(btnSaveClicked())); + rightLayout->addWidget(btnSave); + btnSaveAll = new QPushButton("Export &all files using\nthese settings..."); + connect(btnSaveAll, SIGNAL(clicked()), this, SLOT(btnSaveAllClicked())); + rightLayout->addWidget(btnSaveAll); + btnCancel = new QPushButton("&Done"); + connect(btnCancel, SIGNAL(clicked()), this, SLOT(btnCancelClicked())); + rightLayout->addWidget(btnCancel); + rightLayout->addStretch(1); + mainLayout->addLayout(rightLayout, 0, 4, 2, 1); + + setLayout(mainLayout); + setGeometry(400, 400, 800, 450); + setWindowTitle("Export to file"); +} + +void PDFExportDialog::setFilesToExport(QVector fileWidgets, + QVector fileNames, + QVector fileIndices) { + this->fileWidgets = fileWidgets; + this->fileNames = fileNames; + this->fileIndices = fileIndices; + + QStringList modelList; + + foreach (const QString str, fileNames) { + modelList << str; + + QVector option; // Landscape, row, col, left, right, twosided + bool ok; + option.append(QVariant(chkLandscape->isChecked())); + option.append(QVariant(nupBox->isChecked())); + option.append(QVariant(txtRow->text().toInt(&ok))); + option.append(QVariant(txtCol->text().toInt(&ok))); + option.append(QVariant(offsetBox->isChecked())); + option.append(QVariant(txtLeftOffset->text().toInt(&ok))); + + options.append(option); + } + + fileList->addItems(modelList); +} + +void PDFExportDialog::btnSaveClicked(void) { + int selectedIndex = fileList->currentRow(); + QVector option = options.at(selectedIndex); + + QString fileName = QFileDialog::getSaveFileName(this, + tr("Save PDF file"), ".", + tr("PDF file (*.pdf)")); + if (!fileName.isEmpty()) { + QSize nup; + //if (option.at(0).toBool()) + //nup = QSize(option.at(3).toInt(), option.at(2).toInt()); + //else + nup = QSize(option.at(2).toInt(), option.at(3).toInt()); + + pdfJam.exportFile(fileIndices.at(selectedIndex), fileWidgets.at(selectedIndex)->getChildCount(), fileName, + option.at(1).toBool(), nup, // nup + option.at(0).toBool(), // landscape + option.at(4).toBool(), option.at(5).toInt()); //offset + + QMessageBox::information(this, tr("PDFFactory"), tr("Exported succesfully to\n%1.").arg(fileName)); + } +} + +void PDFExportDialog::btnSaveAllClicked(void) { + bool ok; + for (int i = 0; i < fileNames.size(); i++) { + QString fileName = QFileDialog::getSaveFileName(this, + tr("Save PDF file"), ".", + tr("PDF file (*.pdf)")); + + QSize nup; + //if (chkLandscape->isChecked()) + //nup = QSize(txtCol->text().toInt(&ok), txtRow->text().toInt(&ok)); + //else + nup = QSize(txtRow->text().toInt(&ok), txtCol->text().toInt(&ok)); + + if (!fileName.isEmpty()) { + pdfJam.exportFile(fileIndices.at(i), fileWidgets.at(i)->getChildCount(), fileName, + nupBox->isChecked(), nup, + chkLandscape->isChecked(), + offsetBox->isChecked(), txtLeftOffset->text().toInt(&ok)); + QMessageBox::information(this, tr("PDFFactory"), tr("Exported succesfully to\n%1.").arg(fileName)); + } + } +} + +void PDFExportDialog::btnCancelClicked(void) { + accept(); +} + +void PDFExportDialog::fileListChanged(int row) { + QVector option = options.at(row); + chkLandscape->setChecked(option.at(0).toBool()); + nupBox->setChecked(option.at(1).toBool()); + txtRow->setText(QString::number(option.at(2).toInt())); + txtCol->setText(QString::number(option.at(3).toInt())); + offsetBox->setChecked(option.at(4).toBool()); + txtLeftOffset->setText(QString::number(option.at(5).toInt())); +} + +void PDFExportDialog::txtRowChanged(const QString &txt) { + bool ok; + QVector option = options.at(fileList->currentRow()); + option.remove(2); + option.insert(2, QVariant(txt.toInt(&ok))); + options.remove(fileList->currentRow()); + options.insert(fileList->currentRow(), option); +} + +void PDFExportDialog::txtColChanged(const QString &txt) { + bool ok; + QVector option = options.at(fileList->currentRow()); + option.remove(3); + option.insert(3, QVariant(txt.toInt(&ok))); + options.remove(fileList->currentRow()); + options.insert(fileList->currentRow(), option); +} + +void PDFExportDialog::txtLeftChanged(const QString &txt) { + bool ok; + QVector option = options.at(fileList->currentRow()); + option.remove(5); + option.insert(5, QVariant(txt.toInt(&ok))); + options.remove(fileList->currentRow()); + options.insert(fileList->currentRow(), option); +} + +void PDFExportDialog::chkLandscapeChanged(bool state) { + (void) state; + QVector option = options.at(fileList->currentRow()); + option.remove(0); + option.insert(0, QVariant(chkLandscape->isChecked())); + options.remove(fileList->currentRow()); + options.insert(fileList->currentRow(), option); +} + +void PDFExportDialog::nupBoxToggled(bool checked) { + (void) checked; + QVector option = options.at(fileList->currentRow()); + option.remove(1); + option.insert(1, QVariant(nupBox->isChecked())); + options.remove(fileList->currentRow()); + options.insert(fileList->currentRow(), option); +} + +void PDFExportDialog::offsetBoxToggled(bool checked) { + (void) checked; + QVector option = options.at(fileList->currentRow()); + option.remove(4); + option.insert(4, QVariant(offsetBox->isChecked())); + options.remove(fileList->currentRow()); + options.insert(fileList->currentRow(), option); +} diff --git a/src/PDFExportDialog.h b/src/PDFExportDialog.h new file mode 100644 index 0000000..87eed5b --- /dev/null +++ b/src/PDFExportDialog.h @@ -0,0 +1,50 @@ +#pragma once +#include +#include "PDFFileWidget.h" +#include "PDFJam.h" + +class QGridLayout; +class QGroupBox; +class QListWidget; +class QLineEdit; +class QRadioButton; + +class PDFExportDialog : public QDialog { + Q_OBJECT + +public: + explicit PDFExportDialog(QWidget *parent = 0); + +private: + QVector fileWidgets; + QVector fileNames; + QVector fileIndices; + QVector > options; + +private: + PDFJam pdfJam; + QGroupBox *fileListBox, *landscapeBox, *nupBox, *offsetBox; + + QPushButton *btnSave, *btnSaveAll, *btnCancel; + QGridLayout *mainLayout; + + QListWidget *fileList; + QLineEdit *txtRow, *txtCol; + QRadioButton *chkPortrait, *chkLandscape; + QLineEdit *txtLeftOffset; + +public: + void setFilesToExport(QVector fileWidgets, QVector fileNames, QVector fileIndices); + +private slots: + void fileListChanged(int); + void btnSaveClicked(void); + void btnSaveAllClicked(void); + void btnCancelClicked(void); + void txtRowChanged(const QString &); + void txtColChanged(const QString &); + void txtLeftChanged(const QString &); + void chkLandscapeChanged(bool); + void nupBoxToggled(bool); + void offsetBoxToggled(bool); +}; diff --git a/src/PDFFactory.cpp b/src/PDFFactory.cpp new file mode 100644 index 0000000..fa30f5b --- /dev/null +++ b/src/PDFFactory.cpp @@ -0,0 +1,218 @@ +#include +#include +#include "PDFFactory.h" +#include "PDFExportDialog.h" +#include "PDFTableWidget.h" +#include "PDFPreviewWidget.h" +#include "PDFPageWidget.h" + +PDFFactory::PDFFactory() +{ + createWidgets(); + createActions(); + createToolBars(); + createRibbon(); + createStatusBar(); +} + +void PDFFactory::createWidgets() +{ + // Set central widget to be the container root + centralWidget = new QWidget(); + QVBoxLayout *layout = new QVBoxLayout(); + layout->setContentsMargins(2,2,2,2); + centralWidget->setLayout(layout); + setCentralWidget(centralWidget); + + // Create ribbon + ribbon = new QTabWidget(); + ribbon->addTab(new QWidget(), tr("File")); + ribbon->addTab(new QWidget(), tr("Edit")); + ribbon->addTab(new QWidget(), tr("Tools")); + ribbon->addTab(new QWidget(), tr("Help")); + ribbon->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); + ribbon->setFixedHeight(100); + layout->addWidget(ribbon); + + // Create main area (table) + + pdfTableView = new PDFTableWidget(); + pdfPreview = new PDFPreviewWidget(); + pdfPreview->setMinimumWidth(100); + splitter = new QSplitter(); + splitter->setOrientation(Qt::Horizontal); + splitter->addWidget(pdfTableView); + splitter->addWidget(pdfPreview); + QList splitterWidgetSizes; + splitterWidgetSizes << 200 << 1000; + splitter->setSizes(splitterWidgetSizes); + splitter->setStretchFactor(0, 1); + splitter->setStretchFactor(1, 0.5); + layout->addWidget(splitter); + + connect(pdfTableView, SIGNAL(previewUpdate(Poppler::Page*, Poppler::Page::Rotation)), pdfPreview, SLOT(previewUpdate(Poppler::Page*, Poppler::Page::Rotation))); + connect(pdfTableView, SIGNAL(checkPreviewUpdate(Poppler::Page*, Poppler::Page::Rotation)), pdfPreview, SLOT(checkPreviewUpdate(Poppler::Page*, Poppler::Page::Rotation))); + connect(pdfTableView, SIGNAL(checkPagePreviewExisted(Poppler::Page*)), pdfPreview, SLOT(checkPagePreviewExisted(Poppler::Page*))); + + setWindowIcon(QIcon(":/img/hpdf.png")); + setWindowTitle(tr("PDF Factory")); + setGeometry(0, 0, 1300, 650); +} + + +void PDFFactory::createActions() +{ + openAction = new QAction(tr("&Open"), this); + openAction->setIcon(QIcon(":/img/open.png")); + openAction->setShortcut(tr("Ctrl+O")); + openAction->setStatusTip(tr("Open a PDF")); + connect(openAction, SIGNAL(triggered()), this, SLOT(openFile())); + + exportAction = new QAction(tr("&Export a single file"), this); + exportAction->setIcon(QIcon(":/img/export.png")); + exportAction->setShortcut(tr("Ctrl+S")); + exportAction->setStatusTip(tr("Export the selected file to a new PDF")); + connect(exportAction, SIGNAL(triggered()), this, SLOT(exportFile())); + + exportAllAction = new QAction(tr("Export all"), this); + exportAllAction->setIcon(QIcon(":/img/exportall.png")); + exportAllAction->setShortcut(tr("Shift+Ctrl+S")); + exportAllAction->setStatusTip(tr("Export all to multiple PDF files")); + connect(exportAllAction, SIGNAL(triggered()), this, SLOT(exportAllFiles())); + + cutAction = new QAction(tr("C&ut"), this); + cutAction->setIcon(QIcon(":/img/cut.png")); + cutAction->setShortcut(tr("Ctrl+X")); + cutAction->setStatusTip(tr("Cut selected contents to clipboard")); + connect(cutAction, SIGNAL(triggered()), pdfTableView, SLOT(cutSelected())); + + copyAction = new QAction(tr("&Copy"), this); + copyAction->setIcon(QIcon(":/img/copy.png")); + copyAction->setShortcut(tr("Ctrl+C")); + copyAction->setStatusTip(tr("Copy selected contents to clipboard")); + connect(copyAction, SIGNAL(triggered()), pdfTableView, SLOT(copySelected())); + + pasteAction = new QAction(tr("&Paste"), this); + pasteAction->setIcon(QIcon(":/img/paste.png")); + pasteAction->setShortcut(tr("Ctrl+V")); + pasteAction->setStatusTip(tr("Paste clipboard's contents into current selection")); + //connect(pasteAction, SIGNAL(triggered()), textEdit, SLOT(paste())); + + deleteAction = new QAction(tr("&Delete"), this); + deleteAction->setIcon(QIcon(":/img/delete.png")); + deleteAction->setShortcut(tr("Ctrl+D")); + deleteAction->setStatusTip(tr("Delete selected contents")); + connect(deleteAction, SIGNAL(triggered()), pdfTableView, SLOT(deleteSelected())); + + rotateAction = new QAction(tr("&Rotate"), this); + rotateAction->setIcon(QIcon(":/img/rotate.png")); + rotateAction->setShortcut(tr("Ctrl+R")); + rotateAction->setStatusTip(tr("Rotate selected pages")); + connect(rotateAction, SIGNAL(triggered()), pdfTableView, SLOT(rotateSelected())); + + aboutAction = new QAction(tr("A&bout"), this); + aboutAction->setIcon(QIcon(":/img/about.png")); + aboutAction->setStatusTip(tr("About this program")); + connect(aboutAction, SIGNAL(triggered()), this, SLOT(about())); +} + +void PDFFactory::createToolBars() +{ + fileToolBar = new QToolBar(tr("File")); + fileToolBar->addAction(openAction); + fileToolBar->addAction(exportAction); + fileToolBar->addAction(exportAllAction); + fileToolBar->setIconSize(QSize(48, 48)); + + editToolBar = new QToolBar(tr("Edit")); + editToolBar->addAction(cutAction); + editToolBar->addAction(copyAction); + editToolBar->addAction(pasteAction); + editToolBar->addSeparator(); + editToolBar->addAction(deleteAction); + editToolBar->setIconSize(QSize(48, 48)); + + toolsToolBar = new QToolBar(tr("Tools")); + toolsToolBar->addAction(rotateAction); + toolsToolBar->setIconSize(QSize(48, 48)); + + helpToolBar = new QToolBar(tr("Help")); + helpToolBar->addAction(aboutAction); + helpToolBar->setIconSize(QSize(48, 48)); +} + +void PDFFactory::createRibbon() +{ + QWidget *tabFile = ribbon->widget(0); + QVBoxLayout *layoutTabFile = new QVBoxLayout(); + layoutTabFile->setContentsMargins(2,0,2,0); + layoutTabFile->addWidget(fileToolBar); + tabFile->setLayout(layoutTabFile); + + QWidget *tabEdit = ribbon->widget(1); + QVBoxLayout *layoutTabEdit = new QVBoxLayout(); + layoutTabEdit->setContentsMargins(2,0,2,0); + layoutTabEdit->addWidget(editToolBar); + tabEdit->setLayout(layoutTabEdit); + + QWidget *tabTools = ribbon->widget(2); + QVBoxLayout *layoutTabTools = new QVBoxLayout(); + layoutTabTools->setContentsMargins(2,0,2,0); + layoutTabTools->addWidget(toolsToolBar); + tabTools->setLayout(layoutTabTools); + + QWidget *tabHelp = ribbon->widget(3); + QVBoxLayout *layoutTabHelp = new QVBoxLayout(); + layoutTabHelp->setContentsMargins(2,0,2,0); + layoutTabHelp->addWidget(helpToolBar); + tabHelp->setLayout(layoutTabHelp); +} + +void PDFFactory::createStatusBar() +{ + statusBar()->showMessage(tr("")); +} + +void PDFFactory::openFile(void) { + QStringList fileNames = QFileDialog::getOpenFileNames(this, + tr("Open PDF file"), ".", + tr("PDF file (*.pdf)")); + + for (int i = 0; i < fileNames.size(); i++) { + QString fileName = fileNames.at(i); + if (!fileName.isEmpty()) { + pdfTableView->loadFile(fileName); + } + } +} + +void PDFFactory::exportFile(void) { + PDFExportDialog *exportDialog = new PDFExportDialog(); + + QVector selectedFiles = pdfTableView->getSelectedFiles(); + if (selectedFiles.size() > 0) { + exportDialog->setFilesToExport(selectedFiles, pdfTableView->getSelectedFileNames(), pdfTableView->getSelectedIndices()); + exportDialog->show(); + } +} + +void PDFFactory::exportAllFiles(void) { + PDFExportDialog *exportDialog = new PDFExportDialog(); + + QVector visibleFiles = pdfTableView->getVisibleFiles(); + + if (visibleFiles.size() > 0) { + exportDialog->setFilesToExport(visibleFiles, pdfTableView->getVisibleFileNames(), pdfTableView->getVisibleIndices()); + exportDialog->show(); + } +} + +void PDFFactory::about(void) { + QMessageBox::information(this, tr("PDFFactory"), tr("HPDF (Harringtons PDF) " + "version 0.1.0\nWritten by: Ritchie Cunningham\n\n" + "HPDF is primarily a PDF viewer with the prospect of becoming a full " + "featured PDF editor.\n\n" + "This software is unique in the fact that it automates tasks " + "unique to Harringtons Advisory.\n\n" + "Need support? Email customerservice@sccsolutions.biz")); +} diff --git a/src/PDFFactory.h b/src/PDFFactory.h new file mode 100644 index 0000000..e5086df --- /dev/null +++ b/src/PDFFactory.h @@ -0,0 +1,55 @@ +#pragma once +#include + +class PDFTableWidget; +class PDFPreviewWidget; + +class QAction; +class QWidget; +class QTabWidget; +class QScrollArea; +class QSplitter; +class QToolBar; + +class PDFFactory: public QMainWindow +{ + Q_OBJECT + +public: + PDFFactory(); + +private slots: + void openFile(void); + void exportFile(void); + void exportAllFiles(void); + void about(void); + +private: + void createWidgets(void); + void createActions(void); + void createToolBars(void); + void createRibbon(void); + void createStatusBar(void); + + QAction *openAction; + QAction *exportAction; + QAction *exportAllAction; + QAction *cutAction; + QAction *copyAction; + QAction *pasteAction; + QAction *deleteAction; + QAction *rotateAction; + QAction *aboutAction; + + QWidget *centralWidget; + + QTabWidget *ribbon; + QSplitter *splitter; + PDFTableWidget *pdfTableView; + PDFPreviewWidget *pdfPreview; + + QToolBar *fileToolBar; + QToolBar *editToolBar; + QToolBar *toolsToolBar; + QToolBar *helpToolBar; +}; diff --git a/src/PDFFileWidget.cpp b/src/PDFFileWidget.cpp new file mode 100644 index 0000000..df23fa7 --- /dev/null +++ b/src/PDFFileWidget.cpp @@ -0,0 +1,232 @@ +#include +#include + +#include "PDFFileWidget.h" +#include "PDFPageWidget.h" +#include "PDFTableWidget.h" + +#define COLLAPSE_BUTTON_WIDTH 32 +#define COLLAPSE_BUTTON_HEIGHT 32 + +#define CHILD_AREA_WIDTH 150 +#define CHILD_AREA_HEIGHT 150 +#define CHILD_AREA_SIDE_MARGIN 20 + +#define DEFAULT_CHILD_SIZE 169 + +PagesContainerWidget::PagesContainerWidget(QWidget *parent) { + (void) parent; + setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); + setAcceptDrops(true); + mainLayout = new QHBoxLayout(); + + this->setContextMenuPolicy(Qt::CustomContextMenu); + connect(this, SIGNAL(customContextMenuRequested(const QPoint&)), + this, SLOT(ShowContextMenu(const QPoint&))); + + setLayout(mainLayout); +} + +void PagesContainerWidget::ShowContextMenu(const QPoint& pos){ + if (((PDFTableWidget*)ancestor)->hasClipboard()){ + QPoint globalPos = this->mapToGlobal(pos); + + QMenu myMenu; + myMenu.addAction(QIcon(":/img/remove.png"), "Paste"); + + QAction* selectedItem = myMenu.exec(globalPos); + if (selectedItem) + { + int page; + + if (pageWidgets.size()>=2) + page = (pos.x() / (pageWidgets.at(1)->geometry().x() - + pageWidgets.at(0)->geometry().x()) ); + else + page = (pos.x() / DEFAULT_CHILD_SIZE ); + + + PDFTableWidget *tableview = (PDFTableWidget*) ancestor; + tableview->pastePage((PDFFileWidget*)father, page); + } + } + +} +int PagesContainerWidget::getPagesCount() const { + return pageWidgets.size(); +} + +QSize PagesContainerWidget::sizeHint() const { + QSize temp = QSize((CHILD_AREA_SIDE_MARGIN + CHILD_AREA_WIDTH) * getPagesCount(), CHILD_AREA_HEIGHT + 30); + return temp; +} + +void PagesContainerWidget::addPageWidget(PDFPageWidget *pageWidget){ + pageWidgets.append(pageWidget); + mainLayout->addWidget(pageWidget); + adjustSize(); +} + +void PagesContainerWidget::dragEnterEvent(QDragEnterEvent *event) { + event->acceptProposedAction(); +} + +void PagesContainerWidget::dropEvent(QDropEvent *event) { + QPoint pos = event->pos(); + int page = (pos.x() / (CHILD_AREA_SIDE_MARGIN + CHILD_AREA_WIDTH)); + ((PDFTableWidget*)ancestor)->moveSelectedPages(event->mimeData()->text() , pageWidgets.at(page)); + event->acceptProposedAction(); +} + +// ====================================================================== + +PDFFileWidget::PDFFileWidget(QWidget *parent):QFrame(parent){ + setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); + setFrameStyle(QFrame::Box); + + topLayout = new QGridLayout(); + + collapseButton = new QPushButton(); + collapseButton->resize(QSize(COLLAPSE_BUTTON_WIDTH,COLLAPSE_BUTTON_HEIGHT)); + collapseButton->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); + collapseButton->setIcon(QIcon(":/img/collapse.png")); + connect(collapseButton, SIGNAL(released()), this, SLOT(collapsedButtonClicked())); + topLayout->addWidget(collapseButton, 0, 0); + + fileNameLabel = new QLabel(); + fileNameLabel->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); + topLayout->addWidget(fileNameLabel, 0, 1); + + removeButton = new QPushButton(); + removeButton->resize(QSize(COLLAPSE_BUTTON_WIDTH,COLLAPSE_BUTTON_HEIGHT)); + removeButton->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); + removeButton->setIcon(QIcon(":/img/remove.png")); + connect(removeButton, SIGNAL(released()), this, SLOT(removeButtonClicked())); + topLayout->addWidget(removeButton, 0, 2); + + pagesContainerWidget = new PagesContainerWidget(); + pagesContainerWidget->setFather(this); + scrollArea = new QScrollArea(); + scrollArea->setWidget(pagesContainerWidget); + scrollArea->setVerticalScrollBarPolicy( Qt::ScrollBarAlwaysOff ); + topLayout->addWidget(scrollArea, 1, 0, 1, 3); + + topLayout->setContentsMargins(6, 10, 6, 10); + setLayout(topLayout); + + setCollapsed(false); + selected = false; + + connect(&tgen, SIGNAL(updateThumbnail(QImage,PDFPageWidget*)), this, SLOT(updateThumbnail(QImage,PDFPageWidget*))); +} + +void PDFFileWidget::setAncestor(QWidget* ancestor) { + this->ancestor = ancestor; + pagesContainerWidget->setAncestor(ancestor); + connect(this, SIGNAL(fileClicked(PDFFileWidget*, QMouseEvent*)), ancestor, SLOT(fileClicked(PDFFileWidget*, QMouseEvent*))); +} + +void PDFFileWidget::setSelected(bool select) { + selected = select; + update(); +} + +void PDFFileWidget::mousePressEvent(QMouseEvent *event) { + emit fileClicked(this, event); +} + +void PDFFileWidget::paintEvent(QPaintEvent *event) { + QPalette palette = this->palette(); + QPalette labelPalette = fileNameLabel->palette(); + if (selected) { + palette.setColor( foregroundRole(), palette.color(QPalette::Highlight) ); + labelPalette.setColor( foregroundRole(), palette.color(QPalette::Highlight) ); + } else { + palette.setColor( foregroundRole(), palette.color(QPalette::Dark) ); + labelPalette.setColor( foregroundRole(), palette.color(QPalette::Text) ); + } + this->setPalette(palette); + fileNameLabel->setPalette(labelPalette); + + QFrame::paintEvent(event); +} + +void PDFFileWidget::updateThumbnail(QImage img, PDFPageWidget* pageWidget){ + pageWidget->setThumbnail(img); +} + +void PDFFileWidget::setCollapsed(bool state){ + collapsed = state; + if (state == true) { + scrollArea->hide(); + collapseButton->setIcon(QIcon(":/img/expand.png")); + } else { + scrollArea->show(); + collapseButton->setIcon(QIcon(":/img/collapse.png")); + } +} + +void PDFFileWidget::collapsedButtonClicked(){ + setCollapsed(!collapsed); +} + +void PDFFileWidget::removeButtonClicked() { + emit fileRemoveButtonClicked(this); +} + +void PDFFileWidget::setDocument(Poppler::Document* document, QString fileName){ + document->setRenderHint(Poppler::Document::TextAntialiasing); + Poppler::Document *previewDoc = Poppler::Document::load(fileName); + previewDoc->setRenderHint(Poppler::Document::TextAntialiasing); + Poppler::Document *thumbDoc = Poppler::Document::load(fileName); + thumbDoc->setRenderHint(Poppler::Document::TextAntialiasing); + + int numPages = document -> numPages(); + for (int i = 0; i < numPages; i++){ + Poppler::Page *pdfPage = document->page(i); + + PDFPageWidget *pageWidget = new PDFPageWidget(); + + pageWidget->setAncestor(ancestor); + pageWidget->setFather(this); + pageWidget->setPopplerPage(previewDoc->page(i)); + pageWidget->setThumbPopplerPage(thumbDoc->page(i)); + pageWidget->setOriginInfo(fileName,i); + tgen.render(pageWidget,pdfPage); + + pagesContainerWidget->addPageWidget(pageWidget); + } + tgen.start(); + + fileNameLabel->setText(fileName); +} + +int PDFFileWidget::removeChild(PDFPageWidget* child){ + int pos = pagesContainerWidget->pageWidgets.indexOf(child); + pagesContainerWidget->pageWidgets.remove(pos); + pagesContainerWidget->mainLayout->removeWidget(child); + child->hide(); + //pagesContainerWidget->mainLayout->removeItem(pagesContainerWidget->mainLayout->itemAt(pos)); + + pagesContainerWidget->adjustSize(); + return pos; +} + +int PDFFileWidget::indexChild(PDFPageWidget* child){ + return pagesContainerWidget->pageWidgets.indexOf(child); +} + +void PDFFileWidget::insertChildAt(PDFPageWidget* child, int pos){ + child->setFather(this); + pagesContainerWidget->mainLayout->insertWidget(pos, child); + pagesContainerWidget->pageWidgets.insert(pos,child); + tgen.render(child,child->getNewThumbPopplerPage()); + tgen.start(); + child->show(); + + pagesContainerWidget->adjustSize(); +} + +int PDFFileWidget::getChildCount() { + return pagesContainerWidget->getPagesCount(); +} diff --git a/src/PDFFileWidget.h b/src/PDFFileWidget.h new file mode 100644 index 0000000..32d3458 --- /dev/null +++ b/src/PDFFileWidget.h @@ -0,0 +1,102 @@ +#pragma once +#include +#include "ThumbGen.h" + +#include +#include + +class QImage; +class QHBoxLayout; +class QGridLayout; +class QScrollArea; +class QPushButton; +class QLabel; +class QString; +class QSize; +class QPoint; +class QDragEnterEvent; +class QDropEvent; +class QMouseEvent; +class QPaintEvent; +class ThumbGen; + +class PDFPageWidget; + +class PagesContainerWidget : public QWidget { + + Q_OBJECT + +public: + PagesContainerWidget(QWidget *parent = 0); + QSize sizeHint() const; + QVector pageWidgets; + QHBoxLayout *mainLayout; + + void addPageWidget(PDFPageWidget *pageWidget); + void setAncestor(QWidget* ancestor){ this-> ancestor = ancestor;} + void setFather(QWidget* father){this->father = father;} + int getPagesCount() const; + QWidget* getFather(){return father;} + +protected: + void dragEnterEvent(QDragEnterEvent *event); + void dropEvent(QDropEvent *event); + +private: + QWidget *ancestor; + QWidget *father; +private slots: + void ShowContextMenu(const QPoint&); +}; + +// ======================================== + +class PDFFileWidget : public QFrame { + + Q_OBJECT + Q_PROPERTY(bool collapsed READ isCollapsed WRITE setCollapsed) + +public: + PDFFileWidget(QWidget *parent = 0); + +public: + void setAncestor(QWidget* ancestor); + void setDocument(Poppler::Document* document, QString fileName); + int removeChild(PDFPageWidget* child); + int indexChild(PDFPageWidget* child); + void insertChildAt(PDFPageWidget* child, int pos); + int getChildCount(); + + void setSelected(bool select); + bool isSelected() {return selected;} + bool isCollapsed(){ return collapsed; } + void setCollapsed(bool collapsed); + +protected: + void mousePressEvent(QMouseEvent *event); + void paintEvent(QPaintEvent *event); + +private slots: + void removeButtonClicked(void); + void collapsedButtonClicked(void); + void updateThumbnail(QImage,PDFPageWidget*); + +public : + PagesContainerWidget *pagesContainerWidget; +private: + ThumbGen tgen; + QGridLayout *topLayout; + + QLabel *fileNameLabel; + QPushButton *collapseButton; + QPushButton *removeButton; + QScrollArea *scrollArea; + QWidget *ancestor; + + bool collapsed; + bool selected; + +signals: + void fileRemoveButtonClicked(PDFFileWidget*); + void fileClicked(PDFFileWidget*, QMouseEvent*); +}; diff --git a/src/PDFJam.cpp b/src/PDFJam.cpp new file mode 100644 index 0000000..ac5c740 --- /dev/null +++ b/src/PDFJam.cpp @@ -0,0 +1,183 @@ +#include +#include +#include +#include "stdlib.h" +#include "PDFJam.h" + +PDFJam::PDFJam() +{ + +} +//to make sure this folder exists and has no file inside +void PDFJam::makeCleanFolder(QString path){ + QString temp = "mkdir -p %1 && rm %2*"; + int value = system(temp.arg(path).arg(path).toStdString().c_str()); +} + +void PDFJam::pushCommand(QString cmd){ + mutex.lock(); + cmdQueue.push_back(cmd); + mutex.unlock(); + if(!isRunning()) start(); + +} +//to rotate a page in a pdf file, clockwise direction +bool PDFJam::rotatePage(int fileIndex,int rotatedPageIndex,int degree){ + if ((degree!=90) && (degree!=180) && (degree!=270)){ + return false; + } + + QString rtTemp = "pdf%1 /tmp/pdffactory/%2/%3.pdf --outfile /tmp/pdffactory/%4/%5.pdf "; + QString cmd = rtTemp.arg(QString::number(degree)).arg(QString::number(fileIndex)).arg(QString::number(rotatedPageIndex)).arg(QString::number(fileIndex)).arg(QString::number(rotatedPageIndex)); + pushCommand(cmd); + +} + +//to remove a page in a pdf file +bool PDFJam::removePage(int fileIndex,int numPages, int deletedPageIndex){ + if ((deletedPageIndex<0)||(deletedPageIndex>=numPages)) { + return false; + } + //QString temp = "file1.pdf '-' file2.pdf '1,2' file3.pdf '2-' --outfile output.pdf" + QString rmTemp = "rm /tmp/pdffactory/%1/%2.pdf "; + QString cmd = rmTemp.arg(QString::number(fileIndex)).arg(QString::number(deletedPageIndex)); + QString temp = "mv /tmp/pdffactory/%1/%2.pdf /tmp/pdffactory/%3/%4.pdf "; + + + + for (int i = deletedPageIndex+1; i < numPages; i++) { + cmd += "&& " + temp.arg(QString::number(fileIndex)).arg(QString::number(i)).arg(QString::number(fileIndex)).arg(QString::number(i-1)); + } + pushCommand(cmd); + +} +void PDFJam::cutPage(int fileIndex,int numPages, int pageIndex,int slot=0) { + qDebug()<<"cuting page"<=numPages)) { + return ; + } + + copyPage(fileIndex,pageIndex,slot); + removePage(fileIndex,numPages,pageIndex); + +} +void PDFJam::copyPage(int fileIndex,int pageIndex,int slot=0){ + QString cpTemp = "cp /tmp/pdffactory/%1/%2.pdf /tmp/pdffactory/clipboard%3.pdf"; + QString cmd = cpTemp.arg(QString::number(fileIndex)).arg(QString::number(pageIndex)).arg(QString::number(slot)); + pushCommand(cmd); +} +void PDFJam::pastePage(int fileIndex,int numPages, int pageIndex, int slot=0){ + QString cmd = ""; + QString mvTemp = "mv /tmp/pdffactory/%1/%2.pdf /tmp/pdffactory/%3/%4.pdf "; + for (int i = numPages-1; i >= pageIndex; i--) { + cmd += mvTemp.arg(QString::number(fileIndex)).arg(QString::number(i)).arg(QString::number(fileIndex)).arg(QString::number(i+1)); + if (i>pageIndex) cmd+=" && "; + } + + QString pasteTemp = "cp /tmp/pdffactory/clipboard%1.pdf /tmp/pdffactory/%2/%3.pdf "; + cmd += " && " + pasteTemp.arg(QString::number(slot)).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 is page moving within files, update file Index. + if (toFileIndex == fromFileIndex) { + toFileNumPage--; + if(toPageIndex>fromPageIndex) + toPageIndex--; + toPageIndex--; + } + cutPage(fromFileIndex,fromFileNumPage,fromPageIndex,0); + pastePage(toFileIndex,toFileNumPage,toPageIndex,0); +} +void PDFJam::savePageAsImage(Poppler::Page pp, QString dest,double dpi = 72){ + (void)pp; + (void)dest; + (void)dpi; +} +//to export file number "fileIndex" to destination +//support n-up, orientation, offset options +void PDFJam::exportFile(int fileIndex,int numPages, QString dest, bool isNup,QSize nup, bool isLandscape , bool hasTwoSidedOffset, int leftOffset){ + + QString cmd = "pdfjam "; + QString temp = "/tmp/pdffactory/%1/%2.pdf '-' "; + + for (int i = 0; i < numPages; i++) { + cmd += temp.arg(QString::number(fileIndex)).arg(QString::number(i)); + } + QString orientation = isLandscape?" --landscape ": " --no-landscape "; + cmd += orientation; + + if (isNup) { + QString nupTemp = " --nup '%1x%2' --frame true "; + cmd += nupTemp.arg(QString::number(nup.width())).arg(QString::number(nup.height())); + } + //offset + if(hasTwoSidedOffset){ + //pipe to another pdfjam to do offset, after other things are done + QString outStdout = " --outfile /dev/stdout | pdfjam "; + cmd += outStdout.arg(dest); + + cmd+=" --twoside "; + QString offsetTemp =" --offset \"%1cm 0cm\" "; + cmd+=offsetTemp.arg(QString::number(leftOffset)); + + //TODO - extension: 2 orientations, this one is after n-up, can extend later + QString orientation = isLandscape?" --landscape ": " --no-landscape "; + cmd += orientation; + + } + + QString outTemp = " --outfile %1 "; + cmd += outTemp.arg(dest); + pushCommand(cmd); + + +} + +void PDFJam::loadFile(QString fileName, int fileIndex,Poppler::Document* pd){ + int numPages = pd->numPages(); + QString path= "/tmp/pdffactory/%1/"; + path = path.arg(QString::number(fileIndex)); + makeCleanFolder(path); + + QString temp = "pdfjam %1 %2 --outfile %3%4.pdf %5"; + QString cmd=""; + for (int i = 0; i < numPages; i++) { + QString orientation = " --no-landscape "; + QSizeF pageSize = pd->page(i)->pageSizeF(); + if(pageSize.width() > pageSize.height()){ + orientation = " --landscape "; + } + cmd += temp.arg(fileName).arg(QString::number(i+1)).arg(path).arg(QString::number(i)).arg(orientation) + " ; "; + } + pushCommand(cmd); +} +QString PDFJam::nextCommand(){ + + QString cmd; + + mutex.lock(); + cmd = cmdQueue.first(); + cmdQueue.pop_front(); + mutex.unlock(); + + return cmd; +} +bool PDFJam::isQueueEmpty(){ + return (cmdQueue.size()==0); +} + +void PDFJam::run(){ + while(!isQueueEmpty()){ + QString cmd = nextCommand(); + //int value = system(cmd.toStdString().c_str()); + + //if(value) + //qDebug() << "ERROR: Failed to execute " << cmd; + //else + //qDebug() << "SUCCESS: executed " << cmd; + } +} diff --git a/src/PDFJam.h b/src/PDFJam.h new file mode 100644 index 0000000..598fe9d --- /dev/null +++ b/src/PDFJam.h @@ -0,0 +1,37 @@ +#pragma once + +#include +#include +#include +#include +class PDFPageWidget; +class QImage; + +class PDFJam: public QThread +{ + Q_OBJECT +public: + PDFJam(); + void pushCommand(QString); + void loadFile(QString fileName,int,Poppler::Document*); + void exportFile(int ,int , QString , bool ,QSize , bool , bool , int ); + + void savePageAsImage(Poppler::Page pp, QString dest, double); + void movePage(int , int , int , int , int , int ); + + void pastePage(int ,int , int ,int); + void copyPage(int , int , int ); + void cutPage(int ,int , int ,int); + + bool removePage(int ,int , int ); + bool rotatePage(int,int,int); +protected: + void run(); +private: + void makeCleanFolder(QString); + QVector cmdQueue; + QString nextCommand(); + bool isQueueEmpty(); + QMutex mutex; + +}; diff --git a/src/PDFPageWidget.cpp b/src/PDFPageWidget.cpp new file mode 100644 index 0000000..4392e4a --- /dev/null +++ b/src/PDFPageWidget.cpp @@ -0,0 +1,187 @@ +#include +#include +#include "ThumbGen.h" +#include "PDFPageWidget.h" +#include "PDFTableWidget.h" + +#define PAGE_WIDTH 150 +#define PAGE_HEIGHT 150 + +PDFPageWidget::PDFPageWidget(QWidget *parent) : + QFrame(parent) +{ + selected = false; + rotation = 0; + setAcceptDrops(true); + + this->resize(PAGE_WIDTH, PAGE_HEIGHT); + this->setMinimumSize(PAGE_WIDTH, PAGE_HEIGHT); + this->setMaximumSize(PAGE_WIDTH, PAGE_HEIGHT); + this->setAutoFillBackground(true); + + this->setMouseTracking(true); + this->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); + + QHBoxLayout *topHBox = new QHBoxLayout(); + btnRotate = new QPushButton("", this); + btnRotate->setObjectName("rotate"); + btnRotate->setIcon(QPixmap::fromImage(QImage(":/img/rotate.png"))); + btnRotate->hide(); + topHBox->addWidget(btnRotate, 0, Qt::AlignLeft); + + btnDelete = new QPushButton("", this); + btnDelete->setObjectName("rotate"); + btnDelete->setIcon(QPixmap::fromImage(QImage(":/img/remove.png"))); + btnDelete->hide(); + topHBox->addWidget(btnDelete, 1, Qt::AlignRight); + + QHBoxLayout *bottomHBox = new QHBoxLayout(); + btnCut = new QPushButton("", this); + btnCut->setObjectName("cut"); + btnCut->setIcon(QPixmap::fromImage(QImage(":/img/cut.png"))); + btnCut->hide(); + + btnCopy = new QPushButton("", this); + btnCopy->setObjectName("copy"); + btnCopy->setIcon(QPixmap::fromImage(QImage(":/img/copy.png"))); + btnCopy->hide(); + + bottomHBox->addWidget(btnCut, 0, Qt::AlignLeft); + bottomHBox->addWidget(btnCopy, 1, Qt::AlignRight); + + QVBoxLayout *vbox = new QVBoxLayout(); + vbox->addLayout(topHBox); + vbox->addStretch(1); + vbox->addLayout(bottomHBox); + vbox->setContentsMargins(0, 3, 0, 3); + this->setLayout(vbox); +} + +void PDFPageWidget::setAncestor(QWidget* ancestor){ + this->ancestor = ancestor; + ((PDFTableWidget*)ancestor)->registerPage(this); + 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))); + connect(btnDelete, SIGNAL(clicked()), this, SLOT(pageDelete())); + connect(btnCopy, SIGNAL(clicked()), this, SLOT(pageCopy())); + connect(btnRotate, SIGNAL(clicked()), this, SLOT(pageRotate())); + connect(btnCut, SIGNAL(clicked()), this, SLOT(pageCut())); +} + +void PDFPageWidget::pageCut(){ + ((PDFTableWidget*)ancestor)->clearClipboard(); + ((PDFTableWidget*)ancestor)->cutPage(this); +} + +void PDFPageWidget::pageDelete(){ + ((PDFTableWidget*)ancestor)->deletePage(this); +} + +void PDFPageWidget::pageCopy(){ + ((PDFTableWidget*)ancestor)->clearClipboard(); + ((PDFTableWidget*)ancestor)->copyPage(this); +} + +void PDFPageWidget::pageRotate(){ + ((PDFTableWidget*)ancestor)->rotatePage(this); +} + +void PDFPageWidget::rotate90() { + rotation += 90; + if (rotation == 360) rotation = 0; + + ThumbGen *tgen = new ThumbGen(); + double dpi=tgen->calcDpi(thumbPage,size()); + + image = thumbPage->renderToImage(dpi, dpi, -1, -1, -1, -1, getRotation()); + setThumbnail(image); +} + +Poppler::Page::Rotation PDFPageWidget::getRotation() { + if (rotation == 0) return Poppler::Page::Rotate0; + else if (rotation == 90) return Poppler::Page::Rotate90; + else if (rotation == 180) return Poppler::Page::Rotate180; + else if (rotation == 270) return Poppler::Page::Rotate270; +} + +void PDFPageWidget::setFather(QWidget *father){ + this->father = father; +} + +void PDFPageWidget::setPopplerPage(Poppler::Page* pp) { + previewPage = pp; +} +Poppler::Page* PDFPageWidget::getNewThumbPopplerPage(){ + Poppler::Document *thumbDoc = Poppler::Document::load(oriFilePath); + thumbDoc->setRenderHint(Poppler::Document::TextAntialiasing); + return thumbDoc->page(pageNo); +} +void PDFPageWidget::setThumbPopplerPage(Poppler::Page* pp) { + thumbPage = pp; +} + + +void PDFPageWidget::setThumbnail(QImage pageImage) { + image = pageImage; + pixmap = QPixmap::fromImage(image); + pixmap = pixmap.scaled(size() - QSize(6, 6), Qt::KeepAspectRatio); + + update(); +} + +void PDFPageWidget::setSelected(bool select) { + selected = select; + update(); +} + +void PDFPageWidget::mousePressEvent(QMouseEvent *event) { + if (previewPage!=NULL){ + emit pageClicked(this, event, path); + } +} + +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) { + (void)event; + btnRotate->hide(); + btnCut->hide(); + btnCopy->hide(); + btnDelete->hide(); + + this->setFrameStyle(QFrame::Plain); +} + +void PDFPageWidget::enterEvent(QEvent *event) { + (void)event; + btnRotate->show(); + btnCut->show(); + btnCopy->show(); + btnDelete->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, pixmap.width(), pixmap.height()), pixmap); +} + +QSize PDFPageWidget::sizeHint() const { + return size(); +} diff --git a/src/PDFPageWidget.h b/src/PDFPageWidget.h new file mode 100644 index 0000000..2ecfc68 --- /dev/null +++ b/src/PDFPageWidget.h @@ -0,0 +1,84 @@ +#pragma once + +#include +#include + +class QWidget; +class QPushButton; +class QImage; +class QPixmap; +class QEvent; +class QMouseEvent; +class QPaintEvent; +class QDragEnterEvent; +class QDropEvent; +class QSize; +class QString; + +class PDFPageWidget : public QFrame +{ + Q_OBJECT + +public: + PDFPageWidget(QWidget *parent = 0); + QSize sizeHint() const; + + void setThumbnail(QImage pageImage); + void setOriginInfo(QString path,int num){pageNo = num;oriFilePath=path;}; + void setPopplerPage(Poppler::Page*); + void setThumbPopplerPage(Poppler::Page*); + void setAncestor(QWidget *ancestor); + void setFather(QWidget *father); + void rotate90(); + Poppler::Page::Rotation getRotation(); + int getIntRotation(){return rotation;}; + int setIntRotation(int r){rotation = r;}; + QWidget* getFather() const { return father;} + void registerName(QString name) { path = name;} + QString getName() { return path;} + int getPageNo() { return pageNo;} + QString getOriFilePath() { return oriFilePath;} + Poppler::Page* getNewThumbPopplerPage(); + + void setSelected(bool select); + bool isSelected() {return selected;} + + Poppler::Page* getPage(){return previewPage;} + Poppler::Page* getThumbPage(){return thumbPage;} + +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; + int pageNo; + QString oriFilePath; + QWidget *ancestor; + QWidget *father; + + QImage image; + Poppler::Page *previewPage,*thumbPage; + QPixmap pixmap; + QPushButton *btnRotate, *btnCut, *btnCopy, *btnDelete; + + int rotation; + + + bool selected; + +signals: + void pageClicked(PDFPageWidget*, QMouseEvent*, QString); + void pageDropped(PDFPageWidget*, QDropEvent*, QString, QString); + +private slots: + void pageDelete(); + void pageCopy(); + void pageRotate(); + void pageCut(); +}; diff --git a/src/PDFPreviewWidget.cpp b/src/PDFPreviewWidget.cpp new file mode 100644 index 0000000..d1e3ce6 --- /dev/null +++ b/src/PDFPreviewWidget.cpp @@ -0,0 +1,158 @@ +#include +#include "PDFPreviewWidget.h" + +PreviewGen pgen; + +PDFPreviewWidget::PDFPreviewWidget(QWidget *parent) : + QFrame(parent) +{ + + setCursor(Qt::OpenHandCursor); + setFrameStyle(QFrame::StyledPanel | QFrame::Plain); + pPage = NULL; + currentPixmapSize = QSize(0,0); + connect(&pgen, SIGNAL(updatePreview(QImage)), + this, SLOT(updateImage(QImage))); +} + +void PDFPreviewWidget::updateImage(QImage qimg) { + previewImage = qimg; + regenPixmap(); + repositionPixmap(); + update(); +} + +void PDFPreviewWidget::regenImage() { + double dpi; + double dpi2; + QSize targetSize; + + if (currentPixmapSize == QSize(0,0)) + currentPixmapSize = this->size(); + + targetSize = currentPixmapSize; + + QSizeF oriSize = pPage->pageSizeF(); + double oriDpi = 72; + dpi = targetSize.height()/(float)oriSize.height()*oriDpi; + dpi2= targetSize.width()/(float)oriSize.width()*oriDpi; + dpi = dpirenderToImage(dpi,dpi, -1, -1, -1, -1, rotation); + pgen.render(pPage,dpi,rotation); + pgen.start(); +} + +void PDFPreviewWidget::regenPixmap() { + pixmap = QPixmap::fromImage(previewImage); + pixmap = pixmap.scaled(currentPixmapSize, Qt::KeepAspectRatioByExpanding); + currentPixmapSize = pixmap.size(); +} + +void PDFPreviewWidget::repositionPixmap() { + currentPixmapPos = QPoint((size().width() - pixmap.width()) / 2, (size().height() - pixmap.height()) / 2); +} + +void PDFPreviewWidget::previewUpdate(Poppler::Page* pp, Poppler::Page::Rotation rotation) { + pPage = pp; + this->rotation = rotation; + currentPixmapSize = this->size(); + regenImage(); + //regenPixmap(); + //repositionPixmap(); + //update(); +} + +void PDFPreviewWidget::checkPreviewUpdate(Poppler::Page* pp, Poppler::Page::Rotation rotation) { + //if (pPage != NULL && pPage == pp) { + previewUpdate(pp, rotation); + //} +} + +void PDFPreviewWidget::checkPagePreviewExisted(Poppler::Page* pp) { + (void) pp; + //if (pPage != NULL && pPage == pp) { + pPage = NULL; + rotation = Poppler::Page::Rotate0; + + QPainter painter(this); + painter.drawPixmap(QRect(0, 0, 0, 0), pixmap); + update(); + //} +} + +void PDFPreviewWidget::resizeEvent(QResizeEvent *event) { + (void) event; + if (pPage!=NULL) { + repositionPixmap(); + update(); + } +} + +void PDFPreviewWidget::wheelEvent(QWheelEvent *event) { + if (pPage!=NULL) { + if (event->delta() > 0) + currentPixmapSize += QSize(30, 30); + else if (event->delta() < 0) + currentPixmapSize -= QSize(30, 30); + + if (currentPixmapSize.width() < 150 || currentPixmapSize.height() < 150) { + currentPixmapSize = QSize(150, 150); + } + + regenImage(); + regenPixmap(); + repositionPixmap(); + update(); + } +} + +void PDFPreviewWidget::mousePressEvent(QMouseEvent *event) +{ + if (pPage!=NULL) { + setCursor(Qt::ClosedHandCursor); + + if (event->button() == Qt::LeftButton) { + dragStartPos = event->pos(); + lastPixmapPos = currentPixmapPos; + } + } +} + +void PDFPreviewWidget::mouseMoveEvent(QMouseEvent *event) { + if (pPage!=NULL) { + if (!(event->buttons() & Qt::LeftButton)) { + return; + } + + QPoint currentPos = event->pos(); + QPoint vector = currentPos - dragStartPos; + QPoint newPos = lastPixmapPos + vector; + + if (pixmap.width() > size().width()) { + if (newPos.x() <= 0 && newPos.x() >= size().width() - pixmap.width()) + currentPixmapPos.setX(newPos.x()); + } + + if (pixmap.height() > size().height()) { + if (newPos.y() <= 0 && newPos.y() >= size().height() - pixmap.height()) + currentPixmapPos.setY(newPos.y()); + } + + update(); + } +} + +void PDFPreviewWidget::mouseReleaseEvent(QMouseEvent *event) { + (void) event; + setCursor(Qt::OpenHandCursor); +} + +void PDFPreviewWidget::paintEvent(QPaintEvent *event) { + (void) event; + if (pPage!=NULL) { + QPainter painter(this); + painter.drawPixmap(QRect(currentPixmapPos.x(), currentPixmapPos.y(), pixmap.width(), pixmap.height()), pixmap); + } + QFrame::paintEvent(event); +} diff --git a/src/PDFPreviewWidget.h b/src/PDFPreviewWidget.h new file mode 100644 index 0000000..fac7abe --- /dev/null +++ b/src/PDFPreviewWidget.h @@ -0,0 +1,58 @@ +#pragma once + +#include +#include +#include "PreviewGen.h" + + +class QImage; +class QPixmap; +class QSize; +class QPoint; +class QResizeEvent; +class QWheelEvent; +class QPaintEvent; +class QMouseEvent; +class PreviewGen; + +class PDFPreviewWidget : public QFrame +{ + Q_OBJECT +public: + explicit PDFPreviewWidget(QWidget *parent = 0); + +public slots: + void regenImage(); + void regenPixmap(); + void repositionPixmap(); + void previewUpdate(Poppler::Page*, Poppler::Page::Rotation); + void checkPreviewUpdate(Poppler::Page*, Poppler::Page::Rotation); + void checkPagePreviewExisted(Poppler::Page*); + +protected: + void wheelEvent(QWheelEvent *event); + void paintEvent(QPaintEvent *event); + void resizeEvent(QResizeEvent *event); + void mousePressEvent(QMouseEvent *event); + void mouseMoveEvent(QMouseEvent *event); + void mouseReleaseEvent(QMouseEvent *event); + +public: + Poppler::Page* pPage; + +private: + QImage previewImage; + QPixmap pixmap; + Poppler::Page::Rotation rotation; + + QSize currentPixmapSize; + QPoint currentPixmapPos; + QPoint lastPixmapPos; + QPoint dragStartPos; + +private slots: + void updateImage(QImage); + +signals: + void updatePreview(QImage); +}; diff --git a/src/PDFTableWidget.cpp b/src/PDFTableWidget.cpp new file mode 100644 index 0000000..9d9eabc --- /dev/null +++ b/src/PDFTableWidget.cpp @@ -0,0 +1,421 @@ +#include + +#include "PDFTableWidget.h" +#include "PDFPageWidget.h" +#include "PDFFileWidget.h" +#include +#include "PDFJam.h" + +// Constructor +PDFTableWidget::PDFTableWidget(QWidget* parent) : QFrame(parent) +{ + // Frame (Expanding with VBox) - Scroll Area (Expanding) - Container (Expanding with VBox) - Children + + setFrameStyle(QFrame::StyledPanel | QFrame::Plain); + setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); + + outerLayout = new QVBoxLayout(); + outerLayout->setContentsMargins(0,0,0,0); + + scrollArea = new QScrollArea(); + scrollArea -> setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); + scrollArea -> setWidgetResizable(true); + scrollArea -> setFrameStyle(QFrame::Plain); + + containerLayout = new QVBoxLayout(); + containerLayout -> setSpacing(10); + containerWidget = new QWidget(); + containerWidget -> setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); + QWidget *spacer = new QWidget(); + spacer -> setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); + containerLayout -> addWidget(spacer); + containerWidget -> setLayout(containerLayout); + + scrollArea -> setWidget(containerWidget); + + outerLayout -> addWidget(scrollArea); + + setLayout(outerLayout); +} + +void PDFTableWidget::loadFile(QString fileName){ + Poppler::Document *doc = Poppler::Document::load(fileName); + files.append(doc); + + PDFFileWidget *fileWidget = new PDFFileWidget(); + fileWidget->setAncestor(this); + fileWidget->setDocument(doc,fileName); + pdfJam.loadFile(fileName,files.size()-1,doc); + + fileWidgets.append(fileWidget); + fileNames.append(fileName); + + containerLayout->insertWidget(containerLayout->count() - 1, fileWidget); + connect(fileWidget, SIGNAL(fileRemoveButtonClicked(PDFFileWidget*)), this, SLOT(fileRemoveButtonClicked(PDFFileWidget*))); +} + +QVector PDFTableWidget::getSelectedFiles() { + return selectedFiles; +} + +QVector PDFTableWidget::getSelectedIndices() { + QVector retVector; + for (int i = 0; i < selectedFiles.size(); i++) { + retVector.append(fileWidgets.indexOf(selectedFiles.at(i))); + } + return retVector; +} + +QVector PDFTableWidget::getSelectedFileNames() { + QVector retVector; + QVector indices = getSelectedIndices(); + for (int i = 0; i < indices.size(); i++) { + retVector.append(fileNames.at(indices.at(i))); + } + return retVector; +} + +QVector PDFTableWidget::getVisibleFiles() { + QVector retVector; + for (int i = 0; i < fileWidgets.size(); i++) { + if (fileWidgets.at(i)->isVisible()) + retVector.append(fileWidgets.at(i)); + } + return retVector; +} + +QVector PDFTableWidget::getVisibleIndices() { + QVector retVector; + QVector visibleFiles = getVisibleFiles(); + for (int i = 0; i < visibleFiles.size(); i++) { + retVector.append(fileWidgets.indexOf(visibleFiles.at(i))); + } + return retVector; +} + +QVector PDFTableWidget::getVisibleFileNames() { + QVector retVector; + QVector indices = getVisibleIndices(); + for (int i = 0; i < indices.size(); i++) { + retVector.append(fileNames.at(indices.at(i))); + } + return retVector; +} + +void PDFTableWidget::registerPage(PDFPageWidget* child){ + //come up with a new name here + QString name = QString("/home/pdfpage").append(QString::number(pageChilds.size())); + pageChilds[name] = child; + child->registerName(name); +} + +void PDFTableWidget::copySelected(){ + clearClipboard(); + for (int i = 0;ibutton() == Qt::LeftButton){ + if (event->modifiers() != Qt::ControlModifier) { + for (int i = 0; i < selectedFiles.size(); i++) { + selectedFiles.at(i)->setSelected(false); + } + + selectedFiles.clear(); + + if (!sender->isSelected()) { + sender->setSelected(true); + selectedFiles.append(sender); + } + } else { + if (!sender->isSelected()) { + sender->setSelected(true); + selectedFiles.append(sender); + } else { + sender->setSelected(false); + selectedFiles.remove(selectedFiles.indexOf(sender)); + } + } + } +} + +void PDFTableWidget::fileRemoveButtonClicked(PDFFileWidget* sender) { + if (selectedFiles.indexOf(sender) > 0) + selectedFiles.remove(selectedFiles.indexOf(sender)); + + for (int i = 0; i < sender->getChildCount(); i++) { + PDFPageWidget *pageWidget = sender->pagesContainerWidget->pageWidgets.at(i); + pageWidget->setSelected(false); + emit checkPagePreviewExisted(pageWidget->getPage()); + if (selectedPages.indexOf(pageWidget) > 0) + selectedPages.remove(selectedPages.indexOf(pageWidget)); + } + + // Handle remove file + sender->hide(); +} + +void PDFTableWidget::pageClicked(PDFPageWidget *sender, QMouseEvent* event, QString path){ + if (event->button() == Qt::LeftButton){ + // Handle selection + if (selectedPages.size() > 0 && event->modifiers() != Qt::ControlModifier) { + + if (sender->isSelected() ){ + QDrag *drag = new QDrag(this); + QMimeData *mimeData = new QMimeData; + + mimeData->setText(path); + drag->setMimeData(mimeData); + drag->setPixmap(QPixmap(":/img/copy.png")); + + drag->exec(); + }else { + for (int i = 0; i < selectedPages.size(); i++) { + selectedPages.at(i)->setSelected(false); + } + selectedPages.clear(); + sender->setSelected(true); + + selectedPages.insert(0,sender); + emit previewUpdate(sender->getNewThumbPopplerPage(), sender->getRotation()); + } + + } else { + if (!sender->isSelected()) { + sender->setSelected(true); + emit previewUpdate(sender->getNewThumbPopplerPage(), sender->getRotation()); + + PDFFileWidget* senderF = (PDFFileWidget*)sender->getFather(); + int senderPID = senderF->indexChild(sender); + int senderFID = fileWidgets.indexOf(senderF); + + int i = 0; + for (i = 0;igetFather(); + int targetPID = targetF->indexChild(target); + int targetFID = fileWidgets.indexOf(targetF); + + if (targetFID == senderFID && targetPID > senderPID) + 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, QString pathFrom, QString pathTo){ + (void)sender; + (void)event; + moveSelectedPages(pathFrom, pathTo); +} + +void PDFTableWidget::moveSelectedPages(QString pathFrom, PDFPageWidget* page){ + moveSelectedPages(pathFrom, page->getName()); +} + +void PDFTableWidget::deletePageSkipSelection(PDFPageWidget* pageWidget){ + if (pageWidget->isSelected()) + emit checkPagePreviewExisted(pageWidget->getPage()); + + PDFFileWidget *daddy = (PDFFileWidget*)pageWidget->getFather(); + int daddyID = fileWidgets.indexOf(daddy); + int pageID = daddy->indexChild(pageWidget); + + pdfJam.removePage(daddyID, daddy->pagesContainerWidget->pageWidgets.size(),pageID); + daddy->removeChild(pageWidget); + + int spos = copiedPages.indexOf(pageWidget); + if (spos!=-1){ + copiedPages.remove(spos); + } + pageChilds.remove(pageWidget->getName()); + + + // PLS ACTIVATE THIS LINE ONCE EVERYTHING HAS BEEN FIXED + // :D :D :D :D :D :D + //delete page; + +} + +void PDFTableWidget::deletePage(PDFPageWidget* pageWidget){ + if (pageWidget->isSelected()) + emit checkPagePreviewExisted(pageWidget->getPage()); + + PDFFileWidget *daddy = (PDFFileWidget*)pageWidget->getFather(); + int daddyID = fileWidgets.indexOf(daddy); + int pageID = daddy->indexChild(pageWidget); + + pdfJam.removePage(daddyID, daddy->pagesContainerWidget->pageWidgets.size(),pageID); + daddy->removeChild(pageWidget); + + int spos = selectedPages.indexOf(pageWidget); + if (spos!=-1){ + selectedPages.remove(spos); + } + spos = copiedPages.indexOf(pageWidget); + if (spos!=-1){ + copiedPages.remove(spos); + } + pageChilds.remove(pageWidget->getName()); + + + // PLS ACTIVATE THIS LINE ONCE EVERYTHING HAS BEEN FIXED + // :D :D :D :D :D :D + //delete page; + +} + +void PDFTableWidget::cutPage(PDFPageWidget* pageWidget){ + deletePage(pageWidget); + int id = copiedPages.size(); + copiedPages.push_back(pageWidget); + + PDFFileWidget *daddy = (PDFFileWidget*)pageWidget->getFather(); + int daddyID = fileWidgets.indexOf(daddy); + int pageID = daddy->indexChild(pageWidget); + + pdfJam.cutPage(daddyID, daddy->pagesContainerWidget->pageWidgets.size(),pageID, id); +} + +void PDFTableWidget::clearClipboard(){ + copiedPages.clear(); +} + +void PDFTableWidget::copyPage(PDFPageWidget* pageWidget){ + int id = copiedPages.size(); + copiedPages.push_back(pageWidget); + + PDFFileWidget *daddy = (PDFFileWidget*)pageWidget->getFather(); + int daddyID = fileWidgets.indexOf(daddy); + int pageID = daddy->indexChild(pageWidget); + + pdfJam.copyPage(daddyID, pageID, id); +} + +void PDFTableWidget::pastePage(PDFFileWidget* fileWidget, int pageID){ + if (copiedPages.size() > 0){ + for (int i = 0;isetAncestor(this); + pageWidget->setFather(page->getFather()); + pageWidget->setPopplerPage(page->getNewThumbPopplerPage()); + pageWidget->setThumbPopplerPage(page->getNewThumbPopplerPage()); + pageWidget->setOriginInfo(page->getOriFilePath(),page->getPageNo()); + pageWidget->setIntRotation(page->getIntRotation()); + + int fileID = fileWidgets.indexOf(fileWidget); + pdfJam.pastePage(fileID, fileWidget->pagesContainerWidget->pageWidgets.size(), pageID, i); + + fileWidget->insertChildAt(pageWidget,pageID+i); + } + } +} + +void PDFTableWidget::rotatePage(PDFPageWidget* pageWidget) { + pageWidget->rotate90(); + + int fileIndex = fileWidgets.indexOf((PDFFileWidget *)pageWidget->getFather()); + int pageIndex = fileWidgets.at(fileIndex)->indexChild(pageWidget); + pdfJam.rotatePage(fileIndex, pageIndex, pageWidget->getIntRotation()); + + if (pageWidget->isSelected()) + emit checkPreviewUpdate(pageWidget->getPage(), pageWidget->getRotation()); +} + +void PDFTableWidget::rotateSelected() { + for (int i = 0; i < selectedPages.size(); i++) { + rotatePage(selectedPages.at(i)); + } +} + +void PDFTableWidget::moveSelectedPages(QString pathFrom, QString pathTo){ + if (selectedPages.size() == 0) + return; + + bool accept = false; + for (int i = 0;igetName() == pathFrom) + accept=true; + if (!accept) + return; + /* + for (int i = 0;igetName() == pathTo) + return;*/ + + PDFPageWidget* childTo = pageChilds[pathTo]; + PDFFileWidget* fileTo = (PDFFileWidget*) childTo->getFather(); + + int posTo= -1; + PDFFileWidget* file = NULL; + for (int i = selectedPages.size() - 1; i>=0 ;i--){ + PDFPageWidget* childFrom = selectedPages[i]; + PDFFileWidget* fileFrom = (PDFFileWidget*) childFrom->getFather(); + if (file == fileFrom){ + posTo-=1; + } + + if (pathTo==childFrom->getName() ){ + file = fileFrom; + posTo = fileFrom->indexChild(childFrom); + } + + + pdfJam.cutPage( + fileWidgets.indexOf(fileFrom), + fileFrom->pagesContainerWidget->pageWidgets.size(), + fileFrom->indexChild(childFrom), + i + ); + + fileFrom->removeChild(childFrom); + + } + if (posTo ==-1) + posTo = fileTo->indexChild(childTo); + for (int i = selectedPages.size() - 1; i>=0 ;i--){ + pdfJam.pastePage( + fileWidgets.indexOf(fileTo), + fileTo->pagesContainerWidget->pageWidgets.size(), + posTo, + i + ); + + PDFPageWidget* childFrom = selectedPages[i]; + //PDFFileWidget* fileFrom = (PDFFileWidget*) childFrom->getFather(); + fileTo->insertChildAt(childFrom, posTo); + + //fileFrom->insertChildAt(childTo, posFrom); + } +} diff --git a/src/PDFTableWidget.h b/src/PDFTableWidget.h new file mode 100644 index 0000000..43c9270 --- /dev/null +++ b/src/PDFTableWidget.h @@ -0,0 +1,87 @@ +#pragma once +#include +#include "PDFJam.h" + +#include +#include +#include "PDFPageWidget.h" +#include "ThumbGen.h" + +class QImage; +class QVBoxLayout; +class QString; +class QScrollArea; +class QMouseEvent; +class QPoint; + +class PDFFileWidget; + +class PDFTableWidget: public QFrame +{ + Q_OBJECT +public: + PDFTableWidget(QWidget *parent = 0); + void loadFile (QString fileName); + void registerPage(PDFPageWidget *child); + + +public: + PDFJam pdfJam; + ThumbGen mainTgen; + +private: + QVBoxLayout *outerLayout; + QScrollArea *scrollArea; + QWidget *containerWidget; + QVBoxLayout *containerLayout; + + QVector files; + QVector fileNames; + QVector fileWidgets; + + QHash pageChilds; + +signals: + void previewUpdate(Poppler::Page*, Poppler::Page::Rotation); + void checkPreviewUpdate(Poppler::Page*, Poppler::Page::Rotation); + void checkPagePreviewExisted(Poppler::Page*); + +private slots: + void fileRemoveButtonClicked(PDFFileWidget*); + void pageClicked(PDFPageWidget*, QMouseEvent*, QString); + void pageDropped(PDFPageWidget*, QDropEvent*, QString, QString); + + void fileClicked(PDFFileWidget*, QMouseEvent*); + +private: + QVector selectedPages; + QVector selectedFiles; + + QVector copiedPages; +public: + QVector getSelectedFiles(); + QVector getSelectedIndices(); + QVector getSelectedFileNames(); + + QVector getVisibleFiles(); + QVector getVisibleIndices(); + QVector getVisibleFileNames(); + +public: + void moveSelectedPages(QString, QString); + void moveSelectedPages(QString, PDFPageWidget* page); + void deletePage(PDFPageWidget* pageWidget); + void deletePageSkipSelection(PDFPageWidget* pageWidget); + void copyPage(PDFPageWidget* pageWidget); + void pastePage(PDFFileWidget* fileWidget, int pageID); + void rotatePage(PDFPageWidget* pageWidget); + void cutPage(PDFPageWidget* pageWidget); + void clearClipboard(); + bool hasClipboard(){ return copiedPages.size() > 0; } + +public slots: + void rotateSelected(); + void copySelected(); + void cutSelected(); + void deleteSelected(); +}; diff --git a/src/PreviewGen.cpp b/src/PreviewGen.cpp new file mode 100644 index 0000000..405a306 --- /dev/null +++ b/src/PreviewGen.cpp @@ -0,0 +1,25 @@ +#include +#include +#include "PreviewGen.h" +PreviewGen::PreviewGen() +{ + +} +void PreviewGen::run(){ + mutex.lock(); + Poppler::Page *pp =pPage; + double instantDpi =dpi; + double instantRotation = rotation; + mutex.unlock(); + + QImage pageImage = pp->renderToImage(instantDpi, instantDpi,-1,-1,-1,-1,rotation); + emit updatePreview(pageImage); +} +void PreviewGen::render(Poppler::Page* pp,double aDpi,Poppler::Page::Rotation r){ + mutex.lock(); + pPage = pp; + dpi = aDpi; + rotation = r; + mutex.unlock(); +} + diff --git a/src/PreviewGen.h b/src/PreviewGen.h new file mode 100644 index 0000000..d8abea6 --- /dev/null +++ b/src/PreviewGen.h @@ -0,0 +1,30 @@ +#pragma once +#include +#include +#include +#include +#include "PDFPreviewWidget.h" + +class QImage; + +class PreviewGen: public QThread +{ + Q_OBJECT + +public: + PreviewGen(); + void render(Poppler::Page*,double,Poppler::Page::Rotation); + +protected: + void run(); + Poppler::Page* pPage; + double dpi; + Poppler::Page::Rotation rotation; + QMutex mutex; + +public: + double calcDpi(Poppler::Page *pdfPage, double dpi); + +signals: + void updatePreview(QImage); +}; diff --git a/src/ThumbGen.cpp b/src/ThumbGen.cpp new file mode 100644 index 0000000..a956e0f --- /dev/null +++ b/src/ThumbGen.cpp @@ -0,0 +1,46 @@ +#include +#include +#include "ThumbGen.h" + + +#include "PDFPageWidget.h" +ThumbGen::ThumbGen() +{ + +} + +double ThumbGen::calcDpi(Poppler::Page *pdfPage, QSize targetSize){ + double dpi; + QSizeF oriSize = pdfPage->pageSizeF(); + double oriDpi = 72; + if (targetSize.width() > targetSize.height()){ + dpi = targetSize.height()/(float)oriSize.height()*72; + }else { + dpi= targetSize.width()/(float)oriSize.width()*72; + } + return dpi; + +} + +void ThumbGen::run(){ + while(pWidgets.size()!=0){ + mutex.lock(); + PDFPageWidget *pw = pWidgets.first(); + pWidgets.pop_front(); + Poppler::Page *pp = pPages.first(); + pPages.pop_front(); + mutex.unlock(); + + double dpi=calcDpi(pp,pw->size()); + QImage pageImage = pp->renderToImage(dpi, dpi); + emit updateThumbnail(pageImage,pw); + } +} +void ThumbGen::render(PDFPageWidget* pw,Poppler::Page* pp){ + mutex.lock(); + pWidgets.append(pw); + pPages.append(pp); + mutex.unlock(); + +} + diff --git a/src/thumbgen.h b/src/ThumbGen.h similarity index 62% rename from src/thumbgen.h rename to src/ThumbGen.h index d758923..c44fac6 100644 --- a/src/thumbgen.h +++ b/src/ThumbGen.h @@ -1,30 +1,30 @@ #pragma once + #include #include -#include #include - +#include class PDFPageWidget; class QImage; -class ThumbGen : public QThread { +class ThumbGen: public QThread +{ Q_OBJECT + public: - ThumbGen(void); - void render(PDFPageWidget*, Poppler::Page*); + ThumbGen(); + void render(PDFPageWidget*,Poppler::Page*); protected: - void run(void); + void run(); QVector pWidgets; QVector pPages; QMutex mutex; -private: - double calcDpi(Poppler::Page* pdfPage, QSize targetSize); +public: + double calcDpi(Poppler::Page *pdfPage, QSize targetSize); signals: void updateThumbnail(QImage, PDFPageWidget*); - }; - diff --git a/src/main.cpp b/src/main.cpp index 19f7a9b..fe4c97a 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,10 +1,13 @@ -#include -#include "pdf_factory.h" +// main.cpp -int main(int argc, char* argv[]) { - QApplication a(argc, argv); +#include +#include "PDFFactory.h" + +int main(int argc, char *argv[]) +{ + QApplication app(argc, argv); PDFFactory pdffactory; pdffactory.show(); - - return a.exec(); + return app.exec(); } + diff --git a/src/main_window.cpp b/src/main_window.cpp deleted file mode 100644 index 62ca750..0000000 --- a/src/main_window.cpp +++ /dev/null @@ -1,14 +0,0 @@ -#include "main_window.h" -#include "ui_main_window.h" - -MainWindow::Mainwindow(Qwidget* parent) : - QMainWindow(parent), - ui(new UI::MainWindow { - - ui->setupUI(this); -} - -MainWindow::~MainWindow(void) { - delete ui; -} - diff --git a/src/main_window.h b/src/main_window.h deleted file mode 100644 index 3ccfcbf..0000000 --- a/src/main_window.h +++ /dev/null @@ -1,17 +0,0 @@ -#pragma once -#include - -namespace Ui { - class MainWindow; -} - -class MainWindow : public QMainWindow { - Q_OBJECT -public: - explicit MainWindow(QWidget* parent = 0); - ~MainWindow(void); - -private: - Ui::MainWindow* ui; -}; - diff --git a/src/main_window.ui b/src/main_window.ui deleted file mode 100644 index 6050363..0000000 --- a/src/main_window.ui +++ /dev/null @@ -1,24 +0,0 @@ - - MainWindow - - - - 0 - 0 - 400 - 300 - - - - MainWindow - - - - - - - - - - - diff --git a/src/pdf_factory.cpp b/src/pdf_factory.cpp deleted file mode 100644 index 8811473..0000000 --- a/src/pdf_factory.cpp +++ /dev/null @@ -1,155 +0,0 @@ -#include -#include -#include "pdf_factory.h" -#include "pdf_table_widget.h" -#include "pdf_preview_widget.h" -#include "pdf_page_widget.h" - -PDFFactory::PDFFactory(void) { - createWidgets(); - createActions(); - createToolBars(); - createRibbon(); - createStatusBar(); -} - -/* Create the shit we need for our window. */ -void PDFFactory::createWidgets(void) { - /* Set central widget to be the container root. */ - centralWidget = new QWidget(); - QVBoxLayout* layout = new QVBoxLayout(); - layout->setContentsMargins(2, 2, 2, 2); - centralWidget->setLayout(layout); - setCentralWidget(centralWidget); - - /* Create ribbon. */ - ribbon = new QTabWidget(); - ribbon->addTab(new QWidget(), tr("File")); - ribbon->addTab(new QWidget(), tr("Edit")); - ribbon->addTab(new QWidget(), tr("View")); - ribbon->addTab(new QWidget(), tr("Help")); - ribbon->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); - ribbon->setFixedHeight(100); - layout->addWidget(ribbon); - - /* Create main area (table). */ - pdfTableView = new PDFTableWidget(); - - pdfPreview = new PDFPreviewWidget(); - pdfPreview->setMinimumWidth(100); - splitter = new QSplitter(); - splitter->setOrientation(Qt::Horizontal); - splitter->addWidget(pdfTableView); - splitter->addWidget(pdfPreview); - QList splitterWidgetSizes; - splitterWidgetSizes << 200 << 1000; - splitter->setSizes(splitterWidgetSizes); - splitter->setStretchFactor(0, 1); - splitter->setStretchFactor(1, 0.5); - layout->addWidget(splitter); - - connect(pdfTableView, SIGNAL(previewUpdate(Poppler::Page*)), pdfPreview, - SLOT(previewUpdate(Poppler::Page*))); - - setWindowIcon(QIcon(":/img/hpdf.png")); - setWindowTitle(tr("HPDF")); - setGeometry(0, 0, 1300, 650); -} - -void PDFFactory::createActions(void) { - openAction = new QAction(tr("&Open"), this); - openAction->setIcon(QIcon(":/img/open.png")); - openAction->setShortcut(tr("Ctrl+O")); - openAction->setStatusTip(tr("Open a PDF")); - connect(openAction, SIGNAL(triggered()), this, SLOT(openFile())); - - exportAction = new QAction(tr("&Export a single file"), this); - exportAction->setIcon(QIcon(":/img/export.png")); - exportAction->setShortcut(tr("Ctrl+S")); - exportAction->setStatusTip(tr("Export the selected file to a new PDF")); - /*connect(saveAction, SIGNAL(triggered()), this, SLOT(save()))*/ - - exportAllAction = new QAction(tr("Combine all"), this); - exportAllAction->setIcon(QIcon(":/img/exportall.png")); - exportAllAction->setShortcut(tr("Shift+Ctrl+S")); - exportAllAction->setStatusTip(tr("Export all to multiple PDF files")); - /*connect(saveAsAction, SIGNAL(triggered()), this, SLOT(saveAs()))*/ - - cutAction = new QAction(tr("C&ut"), this); - cutAction->setIcon(QIcon(":/img/cut.png")); - cutAction->setShortcut(tr("Ctrl+X")); - cutAction->setStatusTip(tr("Cut selected contents to clipboard")); - /*connect(cutAction, SIGNAL(triggered()), this, SLOT(cut()))*/ - - copyAction = new QAction(tr("&Copy"), this); - copyAction->setIcon(QIcon(":/img/copy.png")); - copyAction->setShortcut(tr("Ctrl+C")); - copyAction->setStatusTip(tr("Copy selected contents to clipboard")); - /*connect(copyAction, SIGNAL(triggered()), this, SLOT(copy()))*/ - - pasteAction = new QAction(tr("&Paste"), this); - pasteAction->setIcon(QIcon(":/img/paste.png")); - pasteAction->setShortcut(tr("Ctrl+V")); - pasteAction->setStatusTip(tr("Paste clipboard's contents into current selection")); - /*connect(pasteAction, SIGNAL(triggered()), this, SLOT(paste()))*/ - - aboutAction = new QAction(tr("A&bout"), this); - aboutAction->setIcon(QIcon(":/img/about.png")); - aboutAction->setStatusTip(tr("About this program")); -} - -void PDFFactory::createToolBars() { - fileToolBar = new QToolBar(tr("File")); - fileToolBar->addAction(openAction); - fileToolBar->addAction(exportAction); - fileToolBar->addAction(exportAllAction); - fileToolBar->setIconSize(QSize(48, 48)); - - editToolBar = new QToolBar(tr("Edit")); - editToolBar->addAction(cutAction); - editToolBar->addAction(copyAction); - editToolBar->addAction(pasteAction); - editToolBar->setIconSize(QSize(48, 48)); - - helpToolBar = new QToolBar(tr("Help")); - helpToolBar->addAction(aboutAction); - helpToolBar->setIconSize(QSize(48, 48)); -} - -void PDFFactory::createRibbon(void) { - QWidget* tabFile = ribbon->widget(0); - QVBoxLayout* layoutTabFile = new QVBoxLayout(); - layoutTabFile->setContentsMargins(2, 0, 2, 0); - layoutTabFile->addWidget(fileToolBar); - tabFile->setLayout(layoutTabFile); - - QWidget* tabEdit = ribbon->widget(1); - QVBoxLayout* layoutTabEdit = new QVBoxLayout(); - layoutTabEdit->setContentsMargins(2, 0, 2, 0); - layoutTabEdit->addWidget(editToolBar); - tabEdit->setLayout(layoutTabEdit); - - QWidget* tabHelp = ribbon->widget(3); - QVBoxLayout* layoutTabHelp = new QVBoxLayout(); - layoutTabHelp->setContentsMargins(2, 0, 2, 0); - layoutTabHelp->addWidget(helpToolBar); - tabHelp->setLayout(layoutTabHelp); -} - -void PDFFactory::createStatusBar(void) { - statusBar()->showMessage(tr("")); -} - -void PDFFactory::openFile(void) { - QStringList fileNames = QFileDialog::getOpenFileNames(this, - tr("Open PDF file"), ".", - tr("PDF file (*.pdf)")); - - for(int i = 0; i < fileNames.size(); i++) { - QString fileName = fileNames.at(i); - if(!fileName.isEmpty()) { - pdfTableView->loadFile(fileName); - } - } -} - diff --git a/src/pdf_factory.h b/src/pdf_factory.h deleted file mode 100644 index 6ed4549..0000000 --- a/src/pdf_factory.h +++ /dev/null @@ -1,52 +0,0 @@ -#pragma once -#include - -class QAction; -class QWidget; -class QTabWidget; -class QScrollArea; -class QSplitter; -class QToolBar; -class PDFTableWidget; -class PDFPreviewWidget; - -class PDFFactory : public QMainWindow { - Q_OBJECT -public: - PDFFactory(); - -protected: - /*void closeEvent(QCloseEvent* event);*/ - -private slots: - void openFile(void); - /*void exportFile(void); - void exportAllFiles(void);*/ - -private: - void createWidgets(void); - void createActions(void); - void createToolBars(void); - void createRibbon(); - void createStatusBar(); - - QAction* openAction; - QAction* exportAction; - QAction* exportAllAction; - QAction* cutAction; - QAction* copyAction; - QAction* pasteAction; - QAction* aboutAction; - - QWidget* centralWidget; - - QTabWidget* ribbon; - QSplitter* splitter; - PDFTableWidget* pdfTableView; - PDFPreviewWidget* pdfPreview; - - QToolBar* fileToolBar; - QToolBar* editToolBar; - QToolBar* helpToolBar; -}; - diff --git a/src/pdf_file_widget.cpp b/src/pdf_file_widget.cpp deleted file mode 100644 index 46ef26f..0000000 --- a/src/pdf_file_widget.cpp +++ /dev/null @@ -1,185 +0,0 @@ -#include -#include -#include "pdf_file_widget.h" -#include "pdf_page_widget.h" -#include "pdf_table_widget.h" - -#define COLLAPSE_BUTTON_WIDTH 32 -#define COLLAPSE_BUTTON_HEIGHT 32 - -#define CHILD_AREA_WIDTH 150 -#define CHILD_AREA_HEIGHT 150 - -#define CHILD_AREA_SIDE_MARGIN 20 - -PagesContainerWidget::PagesContainerWidget(QWidget* parent) { - setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); - setAcceptDrops(true); - mainLayout = new QHBoxLayout(); - - setLayout(mainLayout); -} - -int PagesContainerWidget::getPagesCount() const { - return pageWidgets.size(); -} - -QSize PagesContainerWidget::sizeHint() const { - return QSize((CHILD_AREA_SIDE_MARGIN + CHILD_AREA_WIDTH)*getPagesCount(), CHILD_AREA_HEIGHT + 30); -} - -void PagesContainerWidget::addPageWidget(PDFPageWidget* pageWidget) { - pageWidgets.append(pageWidget); - mainLayout->addWidget(pageWidget); - adjustSize(); -} - -void PagesContainerWidget::dragEnterEvent(QDragEnterEvent* event) { - event->acceptProposedAction(); -} - -void PagesContainerWidget::dropEvent(QDropEvent* event) { - QPoint pos = event->pos(); - int page = (pos.x() / (CHILD_AREA_SIDE_MARGIN + CHILD_AREA_WIDTH)); - ((PDFTableWidget*)ancestor)->moveSelectedPages(event->mimeData()->text(), pageWidgets.at(page)); - event->acceptProposedAction(); -} - -PDFFileWidget::PDFFileWidget(QWidget* parent) :QFrame(parent) { - setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); - setFrameStyle(QFrame::Box); - - topLayout = new QGridLayout(); - - collapseButton = new QPushButton(); - collapseButton->resize(QSize(COLLAPSE_BUTTON_WIDTH, COLLAPSE_BUTTON_HEIGHT)); - collapseButton->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); - collapseButton->setIcon(QIcon(":/img/collapse.png")); - connect(collapseButton, SIGNAL(released()), this, SLOT(collapsedButtonClicked())); - topLayout->addWidget(collapseButton, 0, 0); - - fileNameLabel = new QLabel(); - fileNameLabel->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); - topLayout->addWidget(fileNameLabel, 0, 1); - - removeButton = new QPushButton(); - removeButton->resize(QSize(COLLAPSE_BUTTON_WIDTH, COLLAPSE_BUTTON_HEIGHT)); - removeButton->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); - removeButton->setIcon(QIcon(":img/remove.png")); - connect(collapseButton, SIGNAL(released()), this, SLOT(collapsedButtonClicked())); - topLayout->addWidget(removeButton, 0, 2); - - pagesContainerWidget = new PagesContainerWidget(); - scrollArea = new QScrollArea(); - scrollArea->setWidget(pagesContainerWidget); - scrollArea->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); - topLayout->addWidget(scrollArea, 1, 0, 1, 3); - - topLayout->setContentsMargins(6, 10, 6, 10); - setLayout(topLayout); - - setCollapsed(false); - selected = false; - - connect(&tgen, SIGNAL(updateThumbnail(QImage,PDFPageWidget*)), this, - SLOT(updateThumbnail(QImage,PDFPageWidget*))); -} - -void PDFFileWidget::setAncestor(QWidget* ancestor) { - this->ancestor = ancestor; - pagesContainerWidget->setAncestor(ancestor); - connect(this, SIGNAL(fileClicked(PDFFileWidget*, QMouseEvent*)), ancestor, - SLOT(fileClicked(PDFFileWidget*, QMouseEvent*))); -} - -void PDFFileWidget::setSelected(bool select) { - selected = select; - update(); -} - -void PDFFileWidget::mousePressEvent(QMouseEvent* event) { - emit fileClicked(this, event); -} - -void PDFFileWidget::paintEvent(QPaintEvent* event) { - QPalette palette = this->palette(); - QPalette labelPalette = fileNameLabel->palette(); - if(selected) { - palette.setColor(foregroundRole(), palette.color(QPalette::Highlight)); - labelPalette.setColor(foregroundRole(), palette.color(QPalette::Highlight)); - } else { - palette.setColor(foregroundRole(), palette.color(QPalette::Dark)); - labelPalette.setColor(foregroundRole(), palette.color(QPalette::Text)); - } - this->setPalette(palette); - fileNameLabel->setPalette(labelPalette); - - QFrame::paintEvent(event); -} - -void PDFFileWidget::updateThumbnail(QImage img, PDFPageWidget* pw) { - pw->setThumbnail(img); -} - -void PDFFileWidget::setCollapsed(bool state) { - collapsed = state; - if(state == true) { - scrollArea->hide(); - collapseButton->setIcon(QIcon(":/img/expand.png")); - } else { - scrollArea->show(); - collapseButton->setIcon(QIcon(":img/collapse.png")); - } -} - -void PDFFileWidget::collapsedButtonClicked(void) { - setCollapsed(!collapsed); -} - -void PDFFileWidget::removeButtonClicked(void) { - emit fileRemoveButtonClicked(this); -} - -void PDFFileWidget::setDocument(Poppler::Document* document, QString fileName) { - document->setRenderHint(Poppler::Document::TextAntialiasing); - Poppler::Document* doc = Poppler::Document::load(fileName); - doc->setRenderHint(Poppler::Document::TextAntialiasing); - - int numPages = document->numPages(); - for(int i = 0; i < numPages; i++) { - Poppler::Page* pdfPage = document->page(i); - - PDFPageWidget* pageWidget = new PDFPageWidget(); - - pageWidget->setAncestor(ancestor); - pageWidget->setFather(this); - pageWidget->setPopplerPage(doc->page(i)); - tgen.render(pageWidget, pdfPage); - - pagesContainerWidget->addPageWidget(pageWidget); - } - tgen.start(); - 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)); - - pagesContainerWidget->adjustSize(); - return pos; -} - -int PDFFileWidget::indexChild(PDFPageWidget* child) { - return pagesContainerWidget->pageWidgets.indexOf(child); -} - -void PDFFileWidget::insertChildAt(PDFPageWidget* child, int pos) { - child->setFather(this); - pagesContainerWidget->mainLayout->insertWidget(pos, child); - pagesContainerWidget->pageWidgets.insert(pos, child); - - pagesContainerWidget->adjustSize(); -} - diff --git a/src/pdf_file_widget.h b/src/pdf_file_widget.h deleted file mode 100644 index d180ccf..0000000 --- a/src/pdf_file_widget.h +++ /dev/null @@ -1,88 +0,0 @@ -#pragma once -#include -#include -#include -#include "pdf_page_widget.h" -#include "thumbgen.h" - -class QImage; -class QHBoxLayout; -class QGridLayout; -class QScrollArea; -class QPushButton; -class QLabel; -class QString; -class QSize; -class QPoint; -class QDragEnterEvent; -class QDropEvent; -class QMouseEvent; -class QPaintEvent; -class ThumbGen; -class PDFPageWidget; - -class PagesContainerWidget : public QWidget { - Q_OBJECT -public: - PagesContainerWidget(QWidget* parent = 0); - QSize sizeHint() const; - QVector pageWidgets; - QHBoxLayout* mainLayout; - - void addPageWidget(PDFPageWidget* image); - void setAncestor(QWidget* ancestor) {this->ancestor = ancestor; } - -protected: - void dragEnterEvent(QDragEnterEvent* event); - void dropEvent(QDropEvent* event); - -private: - int getPagesCount() const; - QWidget* ancestor; -}; - -class PDFFileWidget : public QFrame { - Q_OBJECT - Q_PROPERTY(bool collapsed READ isCollapsed WRITE setCollapsed) - -public: - PDFFileWidget(QWidget* parent = 0); - - void setAncestor(QWidget* ancestor); - void setDocument(Poppler::Document* document, QString fileName); - int removeChild(PDFPageWidget* child); - int indexChild(PDFPageWidget* child); - void insertChildAt(PDFPageWidget* child, int pos); - - void setSelected(bool select); - bool isSelected(void) { return selected; } - bool isCollapsed(void) { return collapsed; } - void setCollapsed(bool collapsed); - -protected: - void mousePressEvent(QMouseEvent* event); - void paintEvent(QPaintEvent* event); - -private slots: - void removeButtonClicked(void); - void collapsedButtonClicked(void); - void updateThumbnail(QImage, PDFPageWidget*); - -private: - ThumbGen tgen; - QGridLayout* topLayout; - - QLabel* fileNameLabel; - QPushButton* collapseButton; - QPushButton* removeButton; - PagesContainerWidget* pagesContainerWidget; - QScrollArea* scrollArea; - QWidget* ancestor; - bool collapsed; - bool selected; - -signals: - void fileRemoveButtonClicked(PDFFileWidget*); - void fileClicked(PDFFileWidget*, QMouseEvent*); -}; - diff --git a/src/pdf_jam.cpp b/src/pdf_jam.cpp deleted file mode 100644 index b7c232f..0000000 --- a/src/pdf_jam.cpp +++ /dev/null @@ -1,185 +0,0 @@ -#include -#include -#include -#include -#include "pdf_jam.h" - -PDFJam::PDFJam(void) { - -} - -/* Ensure the folder exists. */ -void PDFJam::makeFolder(QString path) { - QString tmp = "mkdir -p %1 && rm %2*"; - int value = system(tmp.arg(path).arg(path).toStdString().c_str()); - /*if(value != 0) - qDebug() << "ERROR: Failed to make " << path;*/ -} - -void PDFJam::pushCommand(QString cmd) { - mutex.lock(); - cmdQueue.push_back(cmd); - mutex.unlock(); - if(!isRunning()) start(); -} - -/* Rotate PDF page clockwise. */ -bool PDFJam::rotatePage(int fileIndex, int rotatedPageIndex, int degree) { - if((degree != 90) && (degree != 180) && (degree != 270)) { - return false; - } - - QString rtTmp = "pdf%1 /tmp/hpdf/%2/%3.pdf --outfile /tmp/hpdf/%4/%5.pdf "; - QString cmd = rtTmp.arg(QString::number(degree)).arg(QString::number(fileIndex)) - .arg(QString::number(rotatedPageIndex)).arg(QString::number(fileIndex)) - .arg(QString::number(rotatedPageIndex)); - pushCommand(cmd); -} - -/* Remove page in a pdf file. */ -bool PDFJam::removePage(int fileIndex, int numPages, int deletedPageIndex) { - if((deletedPageIndex < 0) || (deletedPageIndex >= numPages)) { - return false; - } - /*QString tmp = "file1.pdf '-' file2.pdf '1,2' file3.pdf '2-2' --outfile output.pdf"*/ - QString rmTmp = "rm /tmp/hpdf/%1/%2.pdf "; - QString cmd = rmTmp.arg(QString::number(fileIndex)).arg(QString::number(deletedPageIndex)); - QString tmp = "mv /tmp/hpdf/%1/%2.pdf /tmp/hpdf/%3/%4.pdf "; - - for(int i = deletedPageIndex+1; i < numPages; i++) { - cmd += "&& " + tmp.arg(QString::number(fileIndex)).arg(QString::number(i)) - .arg(QString::number(fileIndex)).arg(QString::number(i-1)); - } - - pushCommand(cmd); -} - -void PDFJam::cutPage(int fileIndex, int numPages, int pageIndex, int slot) { - if((pageIndex < 0) || (pageIndex >= numPages)) { - return; - } - - copyPage(fileIndex, numPages, pageIndex, 0); - removePage(fileIndex, numPages, pageIndex); -} - -void PDFJam::copyPage(int fileIndex, int numPages, int pageIndex, int slot) { - QString cpTmp = "cp /tmp/hpdf/%1/%2.pdf /tmp/hpdf/clipboard%3.pdf"; - QString cmd = cpTmp.arg(QString::number(fileIndex)).arg(QString::number(pageIndex)) - .arg(QString::number(slot)); - pushCommand(cmd); -} - -void PDFJam::pastePage(int fileIndex, int numPages, int pageIndex, int slot) { - /* 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%3.pdf /tmp/hpdf/%1/%2.pdf "; - cmd += " && " + pasteTmp.arg(QString::number(fileIndex)) - .arg(QString::number(pageIndex)).arg(QString::number(slot)); - 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, 0); - pastePage(toFileIndex, toFileNumPage, toPageIndex, 0); -} - -void PDFJam::savePageAsImage(Poppler::Page pp, QString dst, double dpi = 72) { - -} - - -/* Export file number 'fileIndex' to destination. */ -/* Supported n-up, orientation, offset options. */ -void PDFJam::exportFile(int fileIndex, int numPages, QString dst, - QSize nup = QSize(1,1), bool isLandscape = false, bool hasTwoSideOffset = false, - int leftOffset = 0, int rightOffset = 0) { - - QString cmd = "pdfjam "; - QString tmp = "/tmp/hpdf/%1/%2.pdf '-' "; - - for(int i = 0; i < numPages; i++) { - cmd += tmp.arg(QString::number(fileIndex)).arg(QString::number(i)); - } - - QString orientation = isLandscape?" --landscape ": " --no-landscape "; - cmd = orientation; - if((nup.width() == 1) || (nup.height() != 1)) { - QString nupTmp = " --nup '%1x%1' --frame true "; - cmd += nupTmp.arg(QString::number(nup.width())).arg(QString::number(nup.height())); - } - - QString outTmp = " --outfile %1 "; - cmd += outTmp.arg(dst); - pushCommand(cmd); - /* Offset comes next. */ -} - -void PDFJam::loadFile(QString fileName, int fileIndex, Poppler::Document* pd) { - int numPages = pd->numPages(); - QString path = "/tmp/hpdf/%1/"; - path = path.arg(QString::number(fileIndex)); - makeFolder(path); - - QString tmp = "pdfjam %1 %2 --outfile %3%4.pdf %5"; - QString cmd = ""; - for(int i = 0; i <= numPages; i++) { - QString orientation = " --no-landscape "; - QSizeF pageSize = pd->page(i)->pageSizeF(); - if(pageSize.width() > pageSize.height()) { - orientation = " --landscape "; - } - cmd += tmp.arg(fileName).arg(QString::number(i+1)).arg(path) - .arg(QString::number(i)).arg(orientation) + " ; "; - } - pushCommand(cmd); - - /* Test the backend functions. */ - rotatePage(0, 5, 270); - 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. */ -} - -QString PDFJam::nextCommand(void) { - QString cmd; - mutex.lock(); - cmd = cmdQueue.first(); - cmdQueue.pop_front(); - mutex.unlock(); - return cmd; -} - -bool PDFJam::isQueueEmpty(void) { - return (cmdQueue.size()==0); -} - -void PDFJam::run(void) { - while(!isQueueEmpty()) { - QString cmd = nextCommand(); - int value = system(cmd.toStdString().c_str()); - if(value != 0) - qDebug() << "ERROR: Failed to execute " << cmd; - else - qDebug() << "SUCCESS: executed " << cmd; - } -} - diff --git a/src/pdf_jam.h b/src/pdf_jam.h deleted file mode 100644 index b1b6487..0000000 --- a/src/pdf_jam.h +++ /dev/null @@ -1,38 +0,0 @@ -#pragma once -#include -#include -#include -#include - -class PDFPageWidget; -class QImage; - -class PDFJam : public QThread { - Q_OBJECT -public: - PDFJam(void); - - void pushCommand(QString); - void loadFile(QString fileName, int, Poppler::Document*); - void exportFile(int, int, QString, QSize, bool, bool, int, int); - void savePageAsImage(Poppler::Page pp, QString dst, double); - void movePage(int, int, int, int, int, int); - - void pastePage(int, int, int, int); - void copyPage(int, int, int, int); - void cutPage(int, int, int, int); - - bool removePage(int, int, int); - bool rotatePage(int, int, int); - void makeFolder(QString); - -protected: - void run(void); - -private: - QVector cmdQueue; - QString nextCommand(void); - bool isQueueEmpty(void); - QMutex mutex; -}; - diff --git a/src/pdf_page_widget.cpp b/src/pdf_page_widget.cpp deleted file mode 100644 index 3c73db3..0000000 --- a/src/pdf_page_widget.cpp +++ /dev/null @@ -1,137 +0,0 @@ -#include -#include -#include "pdf_page_widget.h" -#include "pdf_table_widget.h" - -PDFPageWidget::PDFPageWidget(QWidget* parent) : - QFrame(parent) { - - selected = false; - setAcceptDrops(true); - - this->resize(150, 150); - this->setMinimumSize(150, 150); - this->setMaximumSize(150, 150); - this->setAutoFillBackground(true); - - this->setMouseTracking(true); - this->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); - - - QHBoxLayout* topHBox = new QHBoxLayout(); - btnRotate = new QPushButton("", this); - btnRotate->setObjectName("rotate"); - btnRotate->setIcon(QPixmap::fromImage(QImage("img/rotate.png"))); - btnRotate->hide(); - topHBox->addWidget(btnRotate, 0, Qt::AlignLeft); - - QHBoxLayout* bottomHBox = new QHBoxLayout(); - btnCut = new QPushButton("", this); - btnCut->setObjectName("cut"); - btnCut->setIcon(QPixmap::fromImage(QImage("img/cut.png"))); - btnCut->hide(); - - btnCopy = new QPushButton("", this); - btnCopy->setObjectName("copy"); - - btnCopy->setIcon(QPixmap::fromImage(QImage("img/copy.png"))); - btnCopy->hide(); - - bottomHBox->addWidget(btnCut, 0, Qt::AlignLeft); - bottomHBox->addWidget(btnCopy, 1, Qt::AlignRight); - - QVBoxLayout* vbox = new QVBoxLayout(); - vbox->addLayout(topHBox); - vbox->addStretch(1); - vbox->addLayout(bottomHBox); - vbox->setContentsMargins(0, 3, 0, 3); - this->setLayout(vbox); -} - -void PDFPageWidget::setAncestor(QWidget* ancestor) { - this->ancestor = ancestor; - ((PDFTableWidget*)ancestor)->registerPage(this); - connect(this, SIGNAL(previewUpdate(Poppler::Page*)), ancestor, - SIGNAL(previewUpdate(Poppler::Page*))); - - 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) { - this->father = father; -} - -void PDFPageWidget::setPopplerPage(Poppler::Page* pp) { - pPage = pp; -} - -void PDFPageWidget::setThumbnail(QImage pageImage) { - image = pageImage; - pixmap = QPixmap::fromImage(image); - pixmap = pixmap.scaled(size() - QSize(6,6), Qt::KeepAspectRatio); - - update(); -} - -void PDFPageWidget::setSelected(bool select) { - selected = select; - update(); -} - -void PDFPageWidget::mousePressEvent(QMouseEvent* event) { - if(pPage != NULL) { - emit pageClicked(this, event, path); - emit previewUpdate(pPage); - - selected = !selected; - update(); - } -} - -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) { - btnRotate->hide(); - btnCut->hide(); - btnCopy->hide(); - - this->setFrameStyle(QFrame::Plain); -} - -void PDFPageWidget::enterEvent(QEvent* event) { - btnRotate->show(); - btnCut->show(); - btnCopy->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, - pixmap.width(), pixmap.height()), pixmap); -} - -QSize PDFPageWidget::sizeHint() const { - return size(); -} - diff --git a/src/pdf_page_widget.h b/src/pdf_page_widget.h deleted file mode 100644 index a7bd7eb..0000000 --- a/src/pdf_page_widget.h +++ /dev/null @@ -1,57 +0,0 @@ -#pragma once -#include -#include - -class QWidget; -class QPushButton; -class QImage; -class QPixmap; -class QPaintEvent; -class QEvent; -class QMouseEvent; -class QSize; - -class PDFPageWidget : public QFrame { - Q_OBJECT -public: - PDFPageWidget(QWidget* parent = 0); - QSize sizeHint(void) const; - - void setThumbnail(QImage pageImage); - void setPopplerPage(Poppler::Page*); - void setAncestor(QWidget* ancestor); - void setFather(QWidget* father); - QWidget* getFather(void) const { return father; } - void registerName(QString name) { path = name; } - QString getName(void) { return path; } - - void setSelected(bool select); - bool isSelected(void) { return selected; } - -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; - - QImage image; - Poppler::Page* pPage; - QPixmap pixmap; - QPushButton* btnRotate, *btnCut, *btnCopy; - - bool selected; - -signals: - void pageClicked(PDFPageWidget*, QMouseEvent*, QString); - void pageDropped(PDFPageWidget*, QDropEvent*, QString, QString); - void previewUpdate(Poppler::Page*); -}; - diff --git a/src/pdf_preview_widget.cpp b/src/pdf_preview_widget.cpp deleted file mode 100644 index 1194d21..0000000 --- a/src/pdf_preview_widget.cpp +++ /dev/null @@ -1,121 +0,0 @@ -#include -#include "pdf_preview_widget.h" - -PDFPreviewWidget::PDFPreviewWidget(QWidget* parent) : QFrame(parent) { - setCursor(Qt::OpenHandCursor); - setFrameStyle(QFrame::StyledPanel | QFrame::Plain); - pPage = NULL; - currentPixmapSize = QSize(0,0); -} - -void PDFPreviewWidget::regenImage(void) { - double dpi; - double dpi2; - QSize targetSize; - - if(currentPixmapSize == QSize(0,0)) - currentPixmapSize = this->size(); - - targetSize = currentPixmapSize; - QSizeF oriSize = pPage->pageSizeF(); - double oriDpi = 72; - dpi = targetSize.height() / (float)oriSize.height()*oriDpi; - dpi2 = targetSize.width() / (float)oriSize.width()*oriDpi; - dpi = dpirenderToImage(dpi, dpi); -} - -void PDFPreviewWidget::regenPixmap(void) { - pixmap = QPixmap::fromImage(previewImage); - pixmap = pixmap.scaled(currentPixmapSize, Qt::KeepAspectRatioByExpanding); - currentPixmapSize = pixmap.size(); -} - -void PDFPreviewWidget::repositionPixmap(void) { - currentPixmapPos = QPoint((size().width() - pixmap.width()) / 2, - (size().height() - pixmap.height()) / 2); -} - -void PDFPreviewWidget::previewUpdate(Poppler::Page* pp) { - pPage = pp; - regenImage(); - regenPixmap(); - repositionPixmap(); - update(); -} - -void PDFPreviewWidget::resizeEvent(QResizeEvent* event) { - if(pPage != NULL) { - repositionPixmap(); - update(); - } -} - -void PDFPreviewWidget::wheelEvent(QWheelEvent* event) { - if(pPage != NULL) { - if(event->delta() > 0) - currentPixmapSize += QSize(30, 30); - else if(event->delta() < 0) - currentPixmapSize -= QSize(30, 30); - - if(currentPixmapSize.width() < 150 || currentPixmapSize.height() < 150) { - currentPixmapSize = QSize(150, 150); - } - - regenImage(); - regenPixmap(); - repositionPixmap(); - update(); - } -} - -void PDFPreviewWidget::mousePressEvent(QMouseEvent* event) { - if(pPage != NULL) { - setCursor(Qt::ClosedHandCursor); - - if(event->button() == Qt::LeftButton) { - dragStartPos = event->pos(); - lastPixmapPos = currentPixmapPos; - } - } -} - -void PDFPreviewWidget::mouseMoveEvent(QMouseEvent* event) { - if(pPage != NULL) { - if(!(event->buttons() & Qt::LeftButton)) { - return; - } - - QPoint currentPos = event->pos(); - QPoint vector = currentPos - dragStartPos; - QPoint newPos = lastPixmapPos + vector; - - if(pixmap.width() > size().width()) { - if(newPos.x() <= 0 && newPos.x() >= size().width() - pixmap.width()) - currentPixmapPos.setX(newPos.x()); - } - - if(pixmap.height() > size().height()) { - if(newPos.y() <= 0 && newPos.y() >= size().height() - pixmap.height()) - currentPixmapPos.setY(newPos.y()); - } - - update(); - } -} - -void PDFPreviewWidget::mouseReleaseEvent(QMouseEvent* event) { - setCursor(Qt::OpenHandCursor); -} - -void PDFPreviewWidget::paintEvent(QPaintEvent* event) { - if(pPage != NULL) { - - QPainter painter(this); - painter.drawPixmap(QRect(currentPixmapPos.x(), currentPixmapPos.y(), - pixmap.width(), pixmap.height()), pixmap); - - QFrame::paintEvent(event); - } -} - diff --git a/src/pdf_preview_widget.h b/src/pdf_preview_widget.h deleted file mode 100644 index dbfb659..0000000 --- a/src/pdf_preview_widget.h +++ /dev/null @@ -1,46 +0,0 @@ -#pragma once -#include -#include - -class QImage; -class QPixmap; -class QSize; -class QPoint; -class QResizeEvent; -class QWheelEvent; -class QPaintEvent; -class QMouseEvent; - -class PDFPreviewWidget : public QFrame { - Q_OBJECT -public: - explicit PDFPreviewWidget(QWidget* parent = 0); - -public slots: - void regenImage(void); - void regenPixmap(void); - void repositionPixmap(void); - void previewUpdate(Poppler::Page*); - -protected: - void wheelEvent(QWheelEvent* event); - void paintEvent(QPaintEvent* event); - void resizeEvent(QResizeEvent* event); - void mousePressEvent(QMouseEvent* event); - void mouseMoveEvent(QMouseEvent* event); - void mouseReleaseEvent(QMouseEvent* event); - -private: - QImage previewImage; - QPixmap pixmap; - Poppler::Page* pPage; - - QSize currentPixmapSize; - QPoint currentPixmapPos; - QPoint lastPixmapPos; - QPoint dragStartPos; - -signals: - void updatePreview(QImage); -}; - diff --git a/src/pdf_table_widget.cpp b/src/pdf_table_widget.cpp deleted file mode 100644 index 639ea6f..0000000 --- a/src/pdf_table_widget.cpp +++ /dev/null @@ -1,203 +0,0 @@ -#include -#include -#include "pdf_table_widget.h" -#include "pdf_page_widget.h" -#include "pdf_file_widget.h" - -PDFTableWidget::PDFTableWidget(QWidget* parent) : QFrame(parent) { - /* Frame (Expanding with VBox) - Scroll Area (Expanding) - * Container (Expanding with VBox) - Children. - */ - setFrameStyle(QFrame::StyledPanel | QFrame::Plain); - setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); - - outerLayout = new QVBoxLayout(); - outerLayout->setContentsMargins(0, 0, 0, 0); - - scrollArea = new QScrollArea(); - scrollArea->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); - scrollArea->setWidgetResizable(true); - scrollArea->setFrameStyle(QFrame::Plain); - - containerLayout = new QVBoxLayout(); - containerLayout->setSpacing(10); - containerWidget = new QWidget(); - containerWidget->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); - QWidget* spacer = new QWidget(); - spacer->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); - containerLayout->addWidget(spacer); - containerWidget->setLayout(containerLayout); - - scrollArea->setWidget(containerWidget); - - outerLayout->addWidget(scrollArea); - - setLayout(outerLayout); -} - -void PDFTableWidget::loadFile(QString fileName) { - Poppler::Document* doc = Poppler::Document::load(fileName); - files.append(doc); - - PDFFileWidget* fileWidget = new PDFFileWidget(); - fileWidget->setAncestor(this); - fileWidget->setDocument(doc, fileName); - pdfJam.loadFile(fileName, files.size()-1, doc); - - fileWidgets.append(fileWidget); - - fileNames.append(fileName); - - containerLayout->insertWidget(containerLayout->count()-1, fileWidget); - connect(fileWidget, SIGNAL(fileRemoveButtonClicked(PDFFileWidget*)), this, - SLOT(fileRemoveButtonClicked(PDFFileWidget*))); -} - -void PDFTableWidget::registerPage(PDFPageWidget* child) { - /* Need new name? */ - QString name = QString("/home/pdfpage").append(QString::number(pageChilds.size())); - qDebug() << "Registering name:"; - qDebug() << name; - pageChilds[name] = child; - child->registerName(name); -} - -void PDFTableWidget::fileClicked(PDFFileWidget* sender, QMouseEvent* event) { - if(event->button() == Qt::LeftButton) { - if(event->modifiers() != Qt::LeftButton) { - for(int i = 0; i < selectedFiles.size(); i++) { - selectedFiles.at(i)->setSelected(false); - } - - selectedFiles.clear(); - - if(!sender->isSelected()) { - sender->setSelected(true); - selectedFiles.append(sender); - } - } else { - if(!sender->isSelected()) { - sender->setSelected(true); - selectedFiles.append(sender); - } else { - sender->setSelected(false); - selectedFiles.remove(selectedFiles.indexOf(sender)); - } - } - } -} - -void PDFTableWidget::fileRemoveButtonClicked(PDFFileWidget* sender) { - selectedFiles.remove(selectedFiles.indexOf(sender)); - - QVector pagesToRemove; - for(int i = 0; i < selectedPages.size(); i++) { - if(selectedPages.at(i)->getFather() == sender) { - pagesToRemove.append(i); - } - } - - for(int i = 0; i < pagesToRemove.size(); i++) { - selectedPages.remove(pagesToRemove.at(i)); - } - - /* Handle remove file here. */ -} - -void PDFTableWidget::pageClicked(PDFPageWidget* sender, QMouseEvent* event, QString path) { - if(event->button() == Qt::LeftButton) { - /* Handle selection. */ - if(selectedPages.size() > 0 && event->modifiers() != Qt::ControlModifier) { - /* Handle Drag. */ - QDrag* drag = new QDrag(this); - QMimeData* mimeData = new QMimeData; - - mimeData->setText(path); - drag->setMimeData(mimeData); - drag->setPixmap(QPixmap(":/img/copy.png")); - - 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, - QString pathFrom, QString pathTo) { - - moveSelectedPages(pathFrom, pathTo); -} - -void PDFTableWidget::moveSelectedPages(QString pathFrom, PDFPageWidget* page) { - moveSelectedPages(pathFrom, page->getName()); -} - -void PDFTableWidget::moveSelectedPages(QString pathFrom, QString pathTo) { - if(selectedPages.size() == 0) - return; - - bool accept = false; - for(int i = 0; i < selectedPages.size(); i++) - if(selectedPages.at(i)->getName() == pathFrom) - accept = true; - - 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);*/ - } -} - diff --git a/src/pdf_table_widget.h b/src/pdf_table_widget.h deleted file mode 100644 index 914f171..0000000 --- a/src/pdf_table_widget.h +++ /dev/null @@ -1,59 +0,0 @@ -#pragma once -#include -#include -#include - -#include "pdf_jam.h" -#include "pdf_page_widget.h" - -class QImage; -class QVBoxLayout; -class QString; -class QScrollArea; -class QMouseEvent; -class QPoint; -class PDFFileWidget; - -class PDFTableWidget : public QFrame { - Q_OBJECT -public: - PDFTableWidget(QWidget* parent = 0); - void loadFile(QString fileName); - void registerPage(PDFPageWidget* child); - -protected: - PDFJam pdfJam; - -private: - 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 fileRemoveButtonClicked(PDFFileWidget*); - void pageClicked(PDFPageWidget*, QMouseEvent*, QString); - void pageDropped(PDFPageWidget*, QDropEvent*, QString, QString); - - void fileClicked(PDFFileWidget*, QMouseEvent*); - -private: - QVector selectedPages; - QVector selectedFiles; - - /*bool operator()(PDFPageWidget* e1, PDFPageWidget* e2);*/ -public: - void moveSelectedPages(QString, QString); - void moveSelectedPages(QString, PDFPageWidget* page); -}; - diff --git a/src/thumbgen.cpp b/src/thumbgen.cpp deleted file mode 100644 index d66b975..0000000 --- a/src/thumbgen.cpp +++ /dev/null @@ -1,45 +0,0 @@ -#include -#include -#include "thumbgen.h" -#include "pdf_page_widget.h" - -ThumbGen::ThumbGen(void) { - -} - -double ThumbGen::calcDpi(Poppler::Page* pdfPage, QSize targetSize) { - double dpi; - QSizeF oriSize = pdfPage->pageSizeF(); - double oriDpi = 72; - - if(targetSize.width() > targetSize.height()) { - dpi = targetSize.height() / (float)oriSize.height()*72; - } else { - dpi = targetSize.width() / (float)oriSize.width()*72; - } - - return dpi; -} - -void ThumbGen::run(void) { - while(pWidgets.size() != 0) { - mutex.lock(); - PDFPageWidget* pw = pWidgets.first(); - pWidgets.pop_front(); - Poppler::Page* pp = pPages.first(); - pPages.pop_front(); - mutex.unlock(); - - double dpi = calcDpi(pp, pw->size()); - QImage pageImage = pp->renderToImage(dpi, dpi); - emit updateThumbnail(pageImage, pw); - } -} - -void ThumbGen::render(PDFPageWidget* pw, Poppler::Page* pp) { - mutex.lock(); - pWidgets.append(pw); - pPages.append(pp); - mutex.unlock(); -} -