hpdf/src/pdf_file_widget.cpp

165 lines
4.6 KiB
C++

#include <QtWidgets>
#include <QtGlobal>
#include "pdf_file_widget.h"
#include "pdf_page_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 6
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 + 22);
}
void PagesContainerWidget::addPageWidget(PDFPageWidget* pageWidget) {
pageWidgets.append(pageWidget);
mainLayout->addWidget(pageWidget);
adjustSize();
}
void PagesContainerWidget::dragEnterEvent(QDragEnterEvent* event) {
event->acceptProposedAction();
}
void PagesContainerWidget::dropEvent(QDropEvent* event) {
event->acceptProposedAction();
}
void PagesContainerWidget::mousePressEvent(QMouseEvent* event) {
if(event->button() == Qt::LeftButton) {
int draggedChild = (findPageContainingClickEvent(event->pos()));
QDrag* drag = new QDrag(this);
QMimeData* mimeData = new QMimeData;
mimeData->setText(QString::number(draggedChild));
drag->setMimeData(mimeData);
drag->setPixmap(QPixmap(":/img/copy.png"));
Qt::DropAction dropAction = drag->exec();
}
}
int PagesContainerWidget::findPageContainingClickEvent(QPoint pos) {
for(int i = 0; i < getPagesCount(); i++)
if(pageWidgets[i]->geometry().contains(pos))
return i;
return getPagesCount()-1;
}
int PagesContainerWidget::findPageWidgetInLayout(PDFPageWidget* pageWidget) {
for(int i = 0; i < getPagesCount(); i++)
if(mainLayout->itemAt(i)->widget() == pageWidget)
return i;
return getPagesCount()-1;
}
PDFFileWidget::PDFFileWidget(QWidget* parent) {
setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
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(collapsedButtonClick()));
topLayout->addWidget(collapseButton, 0, 0);
fileNameLabel = new QLabel();
topLayout->addWidget(fileNameLabel, 0, 1);
pagesContainerWidget = new PagesContainerWidget();
scrollArea = new QScrollArea();
scrollArea->setWidget(pagesContainerWidget);
topLayout->addWidget(scrollArea, 1, 0, 1, 5);
setLayout(topLayout);
setCollapsed(false);
connect(&tgen, SIGNAL(updateThumbnail(QImage,PDFPageWidget*)), this,
SLOT(updateThumbnail(QImage,PDFPageWidget*)));
}
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::collapsedButtonClick(void) {
setCollapsed(!collapsed);
}
void PDFFileWidget::pageClickedHandler(QMouseEvent*, QImage) {
}
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);
/* Process event. */
/*qApp->processEvents();*/
}
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));
return pos;
}
void PDFFileWidget::insertChildAt(PDFPageWidget* child, int pos) {
child->setFather(this);
pagesContainerWidget->mainLayout->insertWidget(pos, child);
pagesContainerWidget->pageWidgets.insert(pos, child);
}