A simple Qt based browser with no bullshit that supports PKCS#11 tokens (such as the SuisseID).
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

135 lines
3.0 KiB

#ifndef __PDFDISPLAY_HPP__
#define __PDFDISPLAY_HPP__
#include <QtCore/QFile>
#include <QtGui/QApplication>
#include <QtGui/QImage>
#include <QtGui/QLabel>
#include <QtGui/QMouseEvent>
#include <QtGui/QPainter>
#include <QtGui/QPaintEvent>
#include <QtGui/QToolTip>
#include <QtGui/QWidget>
#include <QtCore/QDebug>
#include <poppler/qt4/poppler-qt4.h>
class PDFDisplay : public QWidget // picture display widget
{
public:
PDFDisplay( Poppler::Document *d, bool arthur )
{
showTextRects = false;
doc = d;
m_currentPage = 0;
if (arthur)
{
backendString = "Arthur";
doc->setRenderBackend(Poppler::Document::ArthurBackend);
}
else
{
backendString = "Splash";
doc->setRenderBackend(Poppler::Document::SplashBackend);
}
doc->setRenderHint(Poppler::Document::Antialiasing, true);
doc->setRenderHint(Poppler::Document::TextAntialiasing, true);
}
~PDFDisplay()
{
qDeleteAll(textRects);
delete doc;
}
void setShowTextRects(bool show)
{
showTextRects = show;
}
void display()
{
if (doc) {
Poppler::Page *page = doc->page(m_currentPage);
if (page) {
qDebug() << "Displaying page using" << backendString << "backend: " << m_currentPage;
QTime t = QTime::currentTime();
image = page->renderToImage();
qDebug() << "Rendering took" << t.msecsTo(QTime::currentTime()) << "msecs";
qDeleteAll(textRects);
if (showTextRects)
{
QPainter painter(&image);
painter.setPen(Qt::red);
textRects = page->textList();
for (auto tb(textRects.begin()); tb!=textRects.end(); ++tb)
painter.drawRect((*tb)->boundingBox());
}
else textRects.clear();
update();
delete page;
}
} else {
qWarning() << "doc not loaded";
}
}
protected:
void paintEvent( QPaintEvent * )
{
QPainter paint( this ); // paint widget
if (!image.isNull()) {
paint.drawImage(0, 0, image);
} else {
qWarning() << "null image";
}
}
void keyPressEvent( QKeyEvent *e )
{
if (e->key() == Qt::Key_Down)
{
if (m_currentPage + 1 < doc->numPages())
{
m_currentPage++;
display();
}
}
else if (e->key() == Qt::Key_Up)
{
if (m_currentPage > 0)
{
m_currentPage--;
display();
}
}
else if (e->key() == Qt::Key_Q)
{
exit(0);
}
}
void mousePressEvent( QMouseEvent *e )
{
int i = 0;
for (auto tb(textRects.begin()); tb!=textRects.end(); ++tb)
{
if ((*tb)->boundingBox().contains(e->pos()))
{
QString tt = QString("Text: \"%1\"\nIndex in text list: %2").arg((*tb)->text()).arg(i);
QToolTip::showText(e->globalPos(), tt, this);
break;
}
++i;
}
}
private:
int m_currentPage;
QImage image;
Poppler::Document *doc;
QString backendString;
bool showTextRects;
QList<Poppler::TextBox*> textRects;
};
#endif