From 6121b486e168334db70cbbe7a67afe56c0272748 Mon Sep 17 00:00:00 2001 From: Aleks Kissinger Date: Mon, 17 Dec 2018 12:37:15 +0100 Subject: preview almost works --- src/gui/latexprocess.cpp | 98 +++++++++++++++++++++++++++++++++++++++++++++++ src/gui/latexprocess.h | 33 ++++++++++++++++ src/gui/mainmenu.cpp | 5 +++ src/gui/mainmenu.h | 1 + src/gui/mainmenu.ui | 9 +++++ src/gui/previewwindow.cpp | 37 +++++++++++++++--- src/gui/previewwindow.h | 6 +++ src/gui/previewwindow.ui | 8 ++-- src/tikzit.cpp | 33 +++++++++++++++- src/tikzit.h | 6 +++ 10 files changed, 225 insertions(+), 11 deletions(-) create mode 100644 src/gui/latexprocess.cpp create mode 100644 src/gui/latexprocess.h (limited to 'src') diff --git a/src/gui/latexprocess.cpp b/src/gui/latexprocess.cpp new file mode 100644 index 0000000..f81e883 --- /dev/null +++ b/src/gui/latexprocess.cpp @@ -0,0 +1,98 @@ +#include "latexprocess.h" +#include "tikzit.h" + +#include +#include +#include + +LatexProcess::LatexProcess(PreviewWindow *preview, QObject *parent) : QObject(parent) +{ + _preview = preview; + _output = preview->outputTextEdit(); + + _proc = new QProcess(this); + _proc->setProcessChannelMode(QProcess::MergedChannels); + _proc->setWorkingDirectory(_workingDir.path()); + + connect(_proc, SIGNAL(readyReadStandardOutput()), this, SLOT(readyReadStandardOutput())); + connect(_proc, SIGNAL(finished(int)), this, SLOT(finished(int))); + + // for debug purposes + _workingDir.setAutoRemove(false); +} + +void LatexProcess::makePreview(QString tikz) +{ + _output->clear(); + + if (!_workingDir.isValid()) { + _output->appendPlainText("COULD NOT WRITE TO TEMP DIR: " + _workingDir.path() + "\n"); + return; + } + + _output->appendPlainText("USING TEMP DIR: " + _workingDir.path() + "\n"); + _output->appendPlainText("SEARCHING FOR pdflatex IN:"); + _output->appendPlainText(qgetenv("PATH")); + _output->appendPlainText("\n"); + + + QString pdflatex = QStandardPaths::findExecutable("pdflatex"); + if (pdflatex.isEmpty()) { + _output->appendPlainText("pdflatex NOT FOUND, ABORTING.\n"); + return; + } + + _output->appendPlainText("FOUND: " + pdflatex + "\n"); + + // copy active *.tikzstyles file to preview dir + if (!tikzit->styleFile().isEmpty() && QFile::exists(tikzit->styleFilePath())) { + QFile::copy(tikzit->styleFilePath(), _workingDir.path() + "/" + tikzit->styleFile()); + } + + // copy tikzit.sty to preview dir + QFile::copy(":/tex/sample/tikzit.sty", _workingDir.path() + "/tikzit.sty"); + + // write out the file containing the tikz picture + QFile f(_workingDir.path() + "/preview.tex"); + f.open(QIODevice::WriteOnly); + QTextStream tex(&f); + tex << "\\documentclass{article}\n"; + tex << "\\usepackage[active,tightpage]{preview}\n"; + tex << "\\PreviewEnvironment{tikzpicture}\n"; + tex << "\\usepackage{tikzit}\n"; + tex << "\\input{" + tikzit->styleFile() + "}\n"; + tex << "\\begin{document}\n\n"; + tex << tikz; + tex << "\n\n\\end{document}\n"; + + f.close(); + _proc->start(pdflatex, QStringList() << "preview.tex"); + +} + +void LatexProcess::kill() +{ + if (_proc->state() == QProcess::Running) _proc->kill(); +} + +void LatexProcess::readyReadStandardOutput() +{ + QByteArray s = _proc->readAllStandardOutput(); + _output->appendPlainText(s); +} + +void LatexProcess::finished(int exitCode) +{ + QByteArray s = _proc->readAllStandardOutput(); + _output->appendPlainText(s); + + if (exitCode == 0) { + QString pdf = _workingDir.path() + "/preview.pdf"; + _output->appendPlainText("\n\nSUCCESSFULLY GENERATED: " + pdf + "\n"); + //_preview->setPdf(pdf); + emit previewFinished(); + } else { + _output->appendPlainText("\n\npdflatex RETURNED AN ERROR\n"); + emit previewFinished(); + } +} diff --git a/src/gui/latexprocess.h b/src/gui/latexprocess.h new file mode 100644 index 0000000..dc815f2 --- /dev/null +++ b/src/gui/latexprocess.h @@ -0,0 +1,33 @@ +#ifndef LATEXPROCESS_H +#define LATEXPROCESS_H + +#include "previewwindow.h" + +#include +#include +#include +#include + +class LatexProcess : public QObject +{ + Q_OBJECT +public: + explicit LatexProcess(PreviewWindow *preview, QObject *parent = nullptr); + void makePreview(QString tikz); + void kill(); + +private: + QTemporaryDir _workingDir; + PreviewWindow *_preview; + QPlainTextEdit *_output; + QProcess *_proc; + +public slots: + void readyReadStandardOutput(); + void finished(int exitCode); + +signals: + void previewFinished(); +}; + +#endif // LATEXPROCESS_H diff --git a/src/gui/mainmenu.cpp b/src/gui/mainmenu.cpp index 8166c59..ab1b898 100644 --- a/src/gui/mainmenu.cpp +++ b/src/gui/mainmenu.cpp @@ -228,6 +228,11 @@ void MainMenu::on_actionJump_to_Selection_triggered() } } +void MainMenu::on_actionRun_LaTeX_triggered() +{ + tikzit->makePreview(); +} + // View void MainMenu::on_actionZoom_In_triggered() diff --git a/src/gui/mainmenu.h b/src/gui/mainmenu.h index c14a284..e1477b4 100644 --- a/src/gui/mainmenu.h +++ b/src/gui/mainmenu.h @@ -67,6 +67,7 @@ public slots: void on_actionParse_triggered(); void on_actionRevert_triggered(); void on_actionJump_to_Selection_triggered(); + void on_actionRun_LaTeX_triggered(); // View void on_actionZoom_In_triggered(); diff --git a/src/gui/mainmenu.ui b/src/gui/mainmenu.ui index 0481c1d..58a2ff0 100644 --- a/src/gui/mainmenu.ui +++ b/src/gui/mainmenu.ui @@ -74,6 +74,7 @@ + @@ -335,6 +336,14 @@ About + + + Run LaTeX + + + Ctrl+R + + diff --git a/src/gui/previewwindow.cpp b/src/gui/previewwindow.cpp index bca28e3..0a37e1b 100644 --- a/src/gui/previewwindow.cpp +++ b/src/gui/previewwindow.cpp @@ -1,12 +1,18 @@ #include "previewwindow.h" #include "ui_previewwindow.h" +#include "tikzit.h" +#include "latexprocess.h" + #include #include #include #include -#include #include +#include +#include +#include +#include #include PreviewWindow::PreviewWindow(QWidget *parent) : @@ -22,23 +28,42 @@ PreviewWindow::PreviewWindow(QWidget *parent) : restoreGeometry(geom.toByteArray()); } - _doc = Poppler::Document::load("/home/aleks/ak-algebras.pdf"); + _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; + _doc = Poppler::Document::load(file); _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; } -PreviewWindow::~PreviewWindow() +QPlainTextEdit *PreviewWindow::outputTextEdit() { - delete ui; + 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) { @@ -52,6 +77,8 @@ void PreviewWindow::showEvent(QShowEvent *e) { } void PreviewWindow::render() { + if (_page == nullptr) return; + QSizeF size = _page->pageSizeF(); QRect rect = ui->scrollArea->visibleRegion().boundingRect(); diff --git a/src/gui/previewwindow.h b/src/gui/previewwindow.h index f2366d6..c850ce9 100644 --- a/src/gui/previewwindow.h +++ b/src/gui/previewwindow.h @@ -2,6 +2,7 @@ #define PREVIEWWINDOW_H #include +#include #include namespace Ui { @@ -15,6 +16,11 @@ class PreviewWindow : public QDialog public: explicit PreviewWindow(QWidget *parent = nullptr); ~PreviewWindow(); + void setPdf(QString file); + QString preparePreview(QString tikz); + QPlainTextEdit *outputTextEdit(); + +protected: void resizeEvent(QResizeEvent *e); void showEvent(QShowEvent *e); void closeEvent(QCloseEvent *e); diff --git a/src/gui/previewwindow.ui b/src/gui/previewwindow.ui index 6bb993a..394fc41 100644 --- a/src/gui/previewwindow.ui +++ b/src/gui/previewwindow.ui @@ -6,8 +6,8 @@ 0 0 - 400 - 300 + 603 + 480 @@ -40,8 +40,8 @@ 0 0 - 358 - 233 + 561 + 413 diff --git a/src/tikzit.cpp b/src/tikzit.cpp index d69f4a8..5f74d0b 100644 --- a/src/tikzit.cpp +++ b/src/tikzit.cpp @@ -20,6 +20,7 @@ #include "tikzassembler.h" #include "tikzstyles.h" #include "previewwindow.h" +#include "latexprocess.h" #include #include @@ -30,6 +31,7 @@ #include #include + // application-level instance of Tikzit Tikzit *tikzit; @@ -107,6 +109,8 @@ void Tikzit::init() _windows << new MainWindow(); _windows[0]->show(); + _styleFile = ""; + _styleFilePath = ""; QString styleFile = settings.value("previous-tikzstyles-file").toString(); if (!styleFile.isEmpty()) loadStyles(styleFile); @@ -128,8 +132,8 @@ void Tikzit::init() checkForUpdates(); } - PreviewWindow *preview = new PreviewWindow(); - preview->show(); + _preview = new PreviewWindow(); + _latex = nullptr; } //QMenuBar *Tikzit::mainMenu() const @@ -415,6 +419,31 @@ void Tikzit::updateReply(QNetworkReply *reply) } } +void Tikzit::makePreview() +{ + if (activeWindow()) { + LatexProcess *oldProc = _latex; + _latex = new LatexProcess(_preview, this); + if (oldProc != nullptr) { + oldProc->kill(); + oldProc->deleteLater(); + } + + connect(_latex, SIGNAL(previewFinished()), this, SLOT(cleanupLatex())); + _latex->makePreview(activeWindow()->tikzSource()); + _preview->show(); + } +} + +void Tikzit::cleanupLatex() +{ + LatexProcess *oldProc = _latex; + _latex = nullptr; + if (oldProc != nullptr) { + oldProc->deleteLater(); + } +} + //StylePalette *Tikzit::stylePalette() const //{ // return _stylePalette; diff --git a/src/tikzit.h b/src/tikzit.h index 5fed22c..3d4847d 100644 --- a/src/tikzit.h +++ b/src/tikzit.h @@ -60,6 +60,8 @@ #include "propertypalette.h" #include "stylepalette.h" #include "tikzstyles.h" +#include "latexprocess.h" +#include "previewwindow.h" #include #include @@ -137,6 +139,8 @@ public slots: void setCheckForUpdates(bool check); void checkForUpdates(); void updateReply(QNetworkReply *reply); + void makePreview(); + void cleanupLatex(); private: // void createMenu(); @@ -153,6 +157,8 @@ private: StyleEditor *_styleEditor; QStringList _colNames; QVector _cols; + LatexProcess *_latex; + PreviewWindow *_preview; }; extern Tikzit *tikzit; -- cgit v1.2.3