summaryrefslogtreecommitdiff
path: root/src/gui/previewwindow.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/gui/previewwindow.cpp')
-rw-r--r--src/gui/previewwindow.cpp122
1 files changed, 122 insertions, 0 deletions
diff --git a/src/gui/previewwindow.cpp b/src/gui/previewwindow.cpp
new file mode 100644
index 0000000..724a951
--- /dev/null
+++ b/src/gui/previewwindow.cpp
@@ -0,0 +1,122 @@
+#include "previewwindow.h"
+#include "ui_previewwindow.h"
+
+#include "tikzit.h"
+#include "latexprocess.h"
+
+#include <QLabel>
+#include <QImage>
+#include <QPixmap>
+#include <QDebug>
+#include <QSettings>
+#include <QTemporaryDir>
+#include <QFile>
+#include <QTextStream>
+#include <QStandardPaths>
+#include <QMessageBox>
+#include <cmath>
+
+PreviewWindow::PreviewWindow(QWidget *parent) :
+ QDialog(parent),
+ ui(new Ui::PreviewWindow)
+{
+ QSettings settings("tikzit", "tikzit");
+ ui->setupUi(this);
+
+ QVariant geom = settings.value("geometry-preview");
+
+ if (geom.isValid()) {
+ restoreGeometry(geom.toByteArray());
+ }
+
+ _doc = nullptr;
+ _page = nullptr;
+ //setPdf("/home/aleks/ak-algebras.pdf");
+
+ //qDebug() << "preview dir:" << preparePreview("foo");
+
+ render();
+}
+
+PreviewWindow::~PreviewWindow()
+{
+ delete ui;
+}
+
+void PreviewWindow::setPdf(QString file)
+{
+ Poppler::Document *oldDoc = _doc;
+
+ // use loadFromData to avoid holding a lock on the PDF file in windows
+ QFile f(file);
+ f.open(QFile::ReadOnly);
+ QByteArray data = f.readAll();
+ f.close();
+ Poppler::Document *newDoc = Poppler::Document::loadFromData(data);
+
+ if (!newDoc) {
+ QMessageBox::warning(nullptr,
+ "Could not read PDF",
+ "Could not read: '" + file + "'.");
+ return;
+ }
+
+ _doc = newDoc;
+ _doc->setRenderHint(Poppler::Document::Antialiasing);
+ _doc->setRenderHint(Poppler::Document::TextAntialiasing);
+ _doc->setRenderHint(Poppler::Document::TextHinting );
+ _page = _doc->page(0);
+ render();
+
+ if (oldDoc != nullptr) delete oldDoc;
+}
+
+QPlainTextEdit *PreviewWindow::outputTextEdit()
+{
+ return ui->output;
+}
+
+void PreviewWindow::closeEvent(QCloseEvent *e) {
+ QSettings settings("tikzit", "tikzit");
+ settings.setValue("geometry-preview", saveGeometry());
+ QDialog::closeEvent(e);
+}
+
+void PreviewWindow::resizeEvent(QResizeEvent *e) {
+ render();
+ QDialog::resizeEvent(e);
+}
+
+void PreviewWindow::showEvent(QShowEvent *e) {
+ render();
+ QDialog::showEvent(e);
+}
+
+void PreviewWindow::render() {
+ if (_page == nullptr) return;
+
+ QSizeF size = _page->pageSizeF();
+
+ qreal ratio = devicePixelRatioF();
+ QRect rect = ui->scrollArea->visibleRegion().boundingRect();
+ int w = static_cast<int>(ratio * (rect.width() - 20));
+ int h = static_cast<int>(ratio * (rect.height() - 20));
+ qreal scale = fmin(static_cast<qreal>(w) / size.width(),
+ static_cast<qreal>(h) / size.height());
+
+
+ int dpi = static_cast<int>(scale * 72.0);
+ int w1 = static_cast<int>(scale * size.width());
+ int h1 = static_cast<int>(scale * size.height());
+
+ // qDebug() << "visible width:" << w;
+ // qDebug() << "visible height:" << h;
+ // qDebug() << "doc width:" << size.width();
+ // qDebug() << "doc height:" << size.height();
+ // qDebug() << "scale:" << scale;
+ // qDebug() << "dpi:" << dpi;
+
+ QPixmap pm = QPixmap::fromImage(_page->renderToImage(dpi, dpi, (w1 - w)/2, (h1 - h)/2, w, h));
+ pm.setDevicePixelRatio(ratio);
+ ui->pdf->setPixmap(pm);
+}