hpdf/src/PDFFileWidget.cpp
2014-12-22 11:06:01 +00:00

233 lines
7.2 KiB
C++

#include <QtGlobal>
#include <QtWidgets>
#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();
}