summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAleks Kissinger <aleks0@gmail.com>2018-12-17 12:37:15 +0100
committerAleks Kissinger <aleks0@gmail.com>2018-12-17 12:37:15 +0100
commit6121b486e168334db70cbbe7a67afe56c0272748 (patch)
tree6e56022a7ae72eae7542ac4b420b10d2b37f4c08
parent2802488b5928ed1d9886e393d06938db0e825a32 (diff)
preview almost works
-rw-r--r--src/gui/latexprocess.cpp98
-rw-r--r--src/gui/latexprocess.h33
-rw-r--r--src/gui/mainmenu.cpp5
-rw-r--r--src/gui/mainmenu.h1
-rw-r--r--src/gui/mainmenu.ui9
-rw-r--r--src/gui/previewwindow.cpp37
-rw-r--r--src/gui/previewwindow.h6
-rw-r--r--src/gui/previewwindow.ui8
-rw-r--r--src/tikzit.cpp33
-rw-r--r--src/tikzit.h6
-rw-r--r--tex/sample/tikzit.sty2
-rw-r--r--tikzit.pro6
-rw-r--r--tikzit.qrc1
13 files changed, 231 insertions, 14 deletions
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 <QDebug>
+#include <QStandardPaths>
+#include <QTemporaryDir>
+
+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 <QObject>
+#include <QProcess>
+#include <QTemporaryDir>
+#include <QPlainTextEdit>
+
+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 @@
<addaction name="actionParse"/>
<addaction name="actionRevert"/>
<addaction name="actionJump_to_Selection"/>
+ <addaction name="actionRun_LaTeX"/>
</widget>
<widget class="QMenu" name="menuView">
<property name="title">
@@ -335,6 +336,14 @@
<string>About</string>
</property>
</action>
+ <action name="actionRun_LaTeX">
+ <property name="text">
+ <string>Run LaTeX</string>
+ </property>
+ <property name="shortcut">
+ <string>Ctrl+R</string>
+ </property>
+ </action>
<addaction name="menuFile"/>
<addaction name="menuEdit"/>
<addaction name="menuView"/>
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 <QLabel>
#include <QImage>
#include <QPixmap>
#include <QDebug>
-#include <QRegion>
#include <QSettings>
+#include <QTemporaryDir>
+#include <QFile>
+#include <QTextStream>
+#include <QStandardPaths>
#include <cmath>
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 <QDialog>
+#include <QPlainTextEdit>
#include <poppler/qt5/poppler-qt5.h>
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 @@
<rect>
<x>0</x>
<y>0</y>
- <width>400</width>
- <height>300</height>
+ <width>603</width>
+ <height>480</height>
</rect>
</property>
<property name="windowTitle">
@@ -40,8 +40,8 @@
<rect>
<x>0</x>
<y>0</y>
- <width>358</width>
- <height>233</height>
+ <width>561</width>
+ <height>413</height>
</rect>
</property>
<layout class="QVBoxLayout" name="verticalLayout_4">
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 <QFile>
#include <QFileDialog>
@@ -30,6 +31,7 @@
#include <QVersionNumber>
#include <QNetworkAccessManager>
+
// 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 <QObject>
#include <QVector>
@@ -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<QColor> _cols;
+ LatexProcess *_latex;
+ PreviewWindow *_preview;
};
extern Tikzit *tikzit;
diff --git a/tex/sample/tikzit.sty b/tex/sample/tikzit.sty
index b893a4a..9c51148 100644
--- a/tex/sample/tikzit.sty
+++ b/tex/sample/tikzit.sty
@@ -29,4 +29,4 @@
\pgfsetlayers{background,edgelayer,nodelayer,main}
\tikzstyle{none}=[inner sep=0mm]
\tikzstyle{every loop}=[]
-\tikzstyle{mark coordinate}=[inner sep=0pt,outer sep=0pt,minimum size=3pt,fill=black,circle] \ No newline at end of file
+\tikzstyle{mark coordinate}=[inner sep=0pt,outer sep=0pt,minimum size=3pt,fill=black,circle]
diff --git a/tikzit.pro b/tikzit.pro
index e1e07b4..82b4032 100644
--- a/tikzit.pro
+++ b/tikzit.pro
@@ -72,7 +72,8 @@ SOURCES += src/gui/mainwindow.cpp \
src/data/style.cpp \
src/gui/styleeditor.cpp \
src/data/stylelist.cpp \
- src/gui/previewwindow.cpp
+ src/gui/previewwindow.cpp \
+ src/gui/latexprocess.cpp
HEADERS += src/gui/mainwindow.h \
src/gui/toolpalette.h \
@@ -99,7 +100,8 @@ HEADERS += src/gui/mainwindow.h \
src/data/style.h \
src/gui/styleeditor.h \
src/data/stylelist.h \
- src/gui/previewwindow.h
+ src/gui/previewwindow.h \
+ src/gui/latexprocess.h
FORMS += src/gui/mainwindow.ui \
src/gui/propertypalette.ui \
diff --git a/tikzit.qrc b/tikzit.qrc
index 0484c2d..32bdfc8 100644
--- a/tikzit.qrc
+++ b/tikzit.qrc
@@ -8,6 +8,7 @@
<file>images/refresh.svg</file>
<file>images/tikzit.png</file>
<file>images/text-x-generic_with_pencil.svg</file>
+ <file>tex/sample/tikzit.sty</file>
</qresource>
<qresource prefix="/qt/etc">
<file>qt.conf</file>