From c93f003ce683fca7896cbbadb6375b929d22fe6d Mon Sep 17 00:00:00 2001 From: Aleks Kissinger Date: Sat, 22 Dec 2018 18:06:26 +0100 Subject: latex running feedback and better search for pdflatex --- src/gui/latexprocess.cpp | 30 +++++++++++++++++++++++++++--- src/gui/previewwindow.cpp | 41 +++++++++++++++++++++++++++++++++++++++-- src/gui/previewwindow.h | 11 ++++++++++- src/gui/previewwindow.ui | 34 ++++++++++++++++++++++++++++++++-- src/tikzit.cpp | 18 +++++++++--------- 5 files changed, 117 insertions(+), 17 deletions(-) (limited to 'src') diff --git a/src/gui/latexprocess.cpp b/src/gui/latexprocess.cpp index 20b22a4..82c1c5b 100644 --- a/src/gui/latexprocess.cpp +++ b/src/gui/latexprocess.cpp @@ -4,6 +4,7 @@ #include #include #include +#include LatexProcess::LatexProcess(PreviewWindow *preview, QObject *parent) : QObject(parent) { @@ -23,6 +24,7 @@ LatexProcess::LatexProcess(PreviewWindow *preview, QObject *parent) : QObject(pa void LatexProcess::makePreview(QString tikz) { + _preview->setStatus(PreviewWindow::Running); _output->clear(); if (!_workingDir.isValid()) { @@ -38,8 +40,28 @@ void LatexProcess::makePreview(QString tikz) QString pdflatex = QStandardPaths::findExecutable("pdflatex"); if (pdflatex.isEmpty()) { - _output->appendPlainText("pdflatex NOT FOUND, ABORTING.\n"); - return; + // if pdflatex is not in PATH, we are probably on mac or windows, so try common + // install directories. + _output->appendPlainText("NOT FOUND IN PATH, TRYING:"); + + QStringList texDirs; + // common macOS tex directories: + texDirs << "/Library/TeX/texbin"; + texDirs << "/usr/texbin"; + texDirs << "/usr/local/bin"; + texDirs << "/sw/bin"; + + // common windows tex directories + texDirs << "C:\\Program Files\\MiKTeX 2.9\\miktex\\bin"; + texDirs << "C:\\Program Files\\MiKTeX 2.9\\miktex\\bin\\x64"; + + _output->appendPlainText(texDirs.join(":")); + pdflatex = QStandardPaths::findExecutable("pdflatex", texDirs); + + if (pdflatex.isEmpty()) { + _output->appendPlainText("pdflatex NOT FOUND, ABORTING.\n"); + return; + } } _output->appendPlainText("FOUND: " + pdflatex + "\n"); @@ -66,7 +88,7 @@ void LatexProcess::makePreview(QString tikz) tex << "\n\n\\end{document}\n"; f.close(); - _proc->start(pdflatex, QStringList() << "preview.tex"); + _proc->start(pdflatex, QStringList() << "-interaction=nonstopmode" << "preview.tex"); } @@ -90,9 +112,11 @@ void LatexProcess::finished(int exitCode) QString pdf = _workingDir.path() + "/preview.pdf"; _output->appendPlainText("\n\nSUCCESSFULLY GENERATED: " + pdf + "\n"); _preview->setPdf(pdf); + _preview->setStatus(PreviewWindow::Success); emit previewFinished(); } else { _output->appendPlainText("\n\npdflatex RETURNED AN ERROR\n"); + _preview->setStatus(PreviewWindow::Failed); emit previewFinished(); } } diff --git a/src/gui/previewwindow.cpp b/src/gui/previewwindow.cpp index 724a951..726ec8a 100644 --- a/src/gui/previewwindow.cpp +++ b/src/gui/previewwindow.cpp @@ -15,6 +15,7 @@ #include #include #include +#include PreviewWindow::PreviewWindow(QWidget *parent) : QDialog(parent), @@ -31,10 +32,15 @@ PreviewWindow::PreviewWindow(QWidget *parent) : _doc = nullptr; _page = nullptr; - //setPdf("/home/aleks/ak-algebras.pdf"); - //qDebug() << "preview dir:" << preparePreview("foo"); + _loader = new QLabel(this); + _loader->setMinimumSize(QSize(16,16)); + _loader->setMaximumSize(QSize(16,16)); + ui->tabWidget->tabBar()->setTabButton(1, QTabBar::RightSide, _loader); + connect(ui->tabWidget, SIGNAL(currentChanged(int)), + this, SLOT(render())); + render(); } @@ -76,6 +82,37 @@ QPlainTextEdit *PreviewWindow::outputTextEdit() return ui->output; } +void PreviewWindow::setStatus(PreviewWindow::Status status) +{ + QMovie *oldMovie = _loader->movie(); + if (status == PreviewWindow::Running) { + // loader.gif and loader@2x.gif derived from: + // https://commons.wikimedia.org/wiki/Throbbers#/media/File:Linux_Ubuntu_Loader.gif + // licensed GNU Free Documentation License v1.2 + QMovie *movie = new QMovie( + (devicePixelRatioF() > 1.0) ? ":images/loader@2x.gif" : ":images/loader.gif", + QByteArray(), _loader); + _loader->setPixmap(QPixmap()); + _loader->setMovie(movie); + movie->start(); + } else if (status == PreviewWindow::Success) { + _loader->setMovie(nullptr); + QPixmap accept(":images/dialog-accept.svg"); + accept.setDevicePixelRatio(devicePixelRatio()); + _loader->setPixmap(accept); + } else if (status == PreviewWindow::Failed) { + _loader->setMovie(nullptr); + QPixmap error(":images/dialog-error.svg"); + error.setDevicePixelRatio(devicePixelRatio()); + _loader->setPixmap(error); + } + + if (oldMovie != nullptr) oldMovie->deleteLater(); + + + _loader->repaint(); +} + void PreviewWindow::closeEvent(QCloseEvent *e) { QSettings settings("tikzit", "tikzit"); settings.setValue("geometry-preview", saveGeometry()); diff --git a/src/gui/previewwindow.h b/src/gui/previewwindow.h index c850ce9..a937263 100644 --- a/src/gui/previewwindow.h +++ b/src/gui/previewwindow.h @@ -1,7 +1,9 @@ #ifndef PREVIEWWINDOW_H #define PREVIEWWINDOW_H + #include +#include #include #include @@ -14,11 +16,18 @@ class PreviewWindow : public QDialog Q_OBJECT public: + enum Status { + Running, Success, Failed + }; explicit PreviewWindow(QWidget *parent = nullptr); ~PreviewWindow(); void setPdf(QString file); QString preparePreview(QString tikz); QPlainTextEdit *outputTextEdit(); + void setStatus(Status status); + +public slots: + void render(); protected: void resizeEvent(QResizeEvent *e); @@ -27,9 +36,9 @@ protected: private: Ui::PreviewWindow *ui; - void render(); Poppler::Document *_doc; Poppler::Page *_page; + QLabel *_loader; }; #endif // PREVIEWWINDOW_H diff --git a/src/gui/previewwindow.ui b/src/gui/previewwindow.ui index 394fc41..7da886a 100644 --- a/src/gui/previewwindow.ui +++ b/src/gui/previewwindow.ui @@ -14,16 +14,46 @@ Preview + + 3 + + + 3 + + + 3 + + + 3 + 0 + + false + + + false + PDF + + 0 + + + 0 + + + 0 + + + 0 + @@ -40,8 +70,8 @@ 0 0 - 561 - 413 + 591 + 448 diff --git a/src/tikzit.cpp b/src/tikzit.cpp index 39a2924..e12053b 100644 --- a/src/tikzit.cpp +++ b/src/tikzit.cpp @@ -31,14 +31,13 @@ #include #include - // application-level instance of Tikzit Tikzit *tikzit; // font to use for node labels QFont Tikzit::LABEL_FONT("Courrier", 9); -Tikzit::Tikzit() : _styleFile("[no styles]"), _activeWindow(0) +Tikzit::Tikzit() : _styleFile("[no styles]"), _activeWindow(nullptr) { } @@ -116,7 +115,7 @@ void Tikzit::init() QVariant check = settings.value("check-for-updates"); if (check.isNull()) { - int resp = QMessageBox::question(0, + int resp = QMessageBox::question(nullptr, tr("Check for updates"), tr("Would you like TikZiT to check for updates automatically?" " (You can always change this later in the Help menu.)"), @@ -213,7 +212,7 @@ void Tikzit::newTikzStyles() w->tikzScene()->reloadStyles(); } } else { - QMessageBox::warning(0, + QMessageBox::warning(nullptr, "Could not write to style file.", "Could not write to: '" + fileName + "'. Check file permissions or choose a new location."); } @@ -252,7 +251,7 @@ void Tikzit::removeWindow(MainWindow *w) _windows.removeAll(w); if (_activeWindow == w) { if (_windows.isEmpty()) { - _activeWindow = 0; + _activeWindow = nullptr; // TODO: check if we should quit when last window closed quit(); } else _activeWindow = _windows[0]; @@ -262,7 +261,7 @@ void Tikzit::removeWindow(MainWindow *w) void Tikzit::open() { QSettings settings("tikzit", "tikzit"); - QString fileName = QFileDialog::getOpenFileName(0, + QString fileName = QFileDialog::getOpenFileName(nullptr, tr("Open File"), settings.value("previous-file-path").toString(), tr("TiKZ Files (*.tikz)"), @@ -293,7 +292,7 @@ void Tikzit::open(QString fileName) void Tikzit::openTikzStyles() { QSettings settings("tikzit", "tikzit"); - QString fileName = QFileDialog::getOpenFileName(0, + QString fileName = QFileDialog::getOpenFileName(nullptr, tr("Open File"), settings.value("previous-tikzstyles-path").toString(), tr("TiKZ Style Files (*.tikzstyles)"), @@ -326,7 +325,7 @@ bool Tikzit::loadStyles(QString fileName) } return true; } else { - QMessageBox::warning(0, + QMessageBox::warning(nullptr, "Bad style file.", "Bad style file: '" + fileName + "'. Check the file is properly formatted and try to load it again."); return false; @@ -334,7 +333,8 @@ bool Tikzit::loadStyles(QString fileName) } else { //settings.setValue("previous-tikzstyles-file", ""); - QMessageBox::warning(0, "Style file not found.", "Could not open style file: '" + fileName + "'."); + QMessageBox::warning(nullptr, + "Style file not found.", "Could not open style file: '" + fileName + "'."); return false; } } -- cgit v1.2.3