X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Ffrontends%2Fqt4%2FGuiProgress.cpp;h=a21baf338c3042426f2429c4dc2c5bdbd989cab4;hb=82cade48776705e0b1dd39369447ddbd82f23d53;hp=d9109b1c50c394917f6eff2ff99eacc900ddc8d3;hpb=41681e71850d9efde66182b552a28fb9dfff6873;p=lyx.git diff --git a/src/frontends/qt4/GuiProgress.cpp b/src/frontends/qt4/GuiProgress.cpp index d9109b1c50..a21baf338c 100644 --- a/src/frontends/qt4/GuiProgress.cpp +++ b/src/frontends/qt4/GuiProgress.cpp @@ -4,7 +4,8 @@ * This file is part of LyX, the document processor. * Licence details can be found in the file COPYING. * - * \author Peter Kümmel + * \author Peter Kümmel + * \author Pavel Sanda * * Full author contact details are available in file CREDITS. */ @@ -12,55 +13,213 @@ #include #include "GuiProgress.h" +#include "ui_ToggleWarningUi.h" #include "qt_helpers.h" +#include "frontends/alert.h" + +#include "support/debug.h" #include "support/Systemcall.h" #include +#include +#include +#include namespace lyx { namespace frontend { -GuiProgress::GuiProgress(GuiView & parent, Qt::DockWidgetArea area, - Qt::WindowFlags flags) : DockView(parent, "latex-progress", area, flags) +// This dialog is only a fallback for Qt < 5.2, which does not feature +// QMessageBox::setCheckBox() yet. Note that it has issues with line +// breaking and size, in particular with html. +#if QT_VERSION < 0x050200 +class GuiToggleWarningDialog : public QDialog, public Ui::ToggleWarningUi +{ +public: + GuiToggleWarningDialog(QWidget * parent) : QDialog(parent) + { + Ui::ToggleWarningUi::setupUi(this); + QDialog::setModal(true); + } +}; +#endif + + +GuiProgress::GuiProgress() +{ + connect(this, SIGNAL(processStarted(QString const &)), SLOT(doProcessStarted(QString const &))); + connect(this, SIGNAL(processFinished(QString const &)), SLOT(doProcessFinished(QString const &))); + connect(this, SIGNAL(appendMessage(QString const &)), SLOT(doAppendMessage(QString const &))); + connect(this, SIGNAL(appendError(QString const &)), SLOT(doAppendError(QString const &))); + connect(this, SIGNAL(clearMessages()), SLOT(doClearMessages())); + + // Alert interface + connect(this, SIGNAL(warning(QString const &, QString const &)), + SLOT(doWarning(QString const &, QString const &))); + connect(this, SIGNAL(toggleWarning(QString const &, QString const &, QString const &)), + SLOT(doToggleWarning(QString const &, QString const &, QString const &))); + connect(this, SIGNAL(error(QString const &, QString const &, QString const &)), + SLOT(doError(QString const &, QString const &, QString const &))); + connect(this, SIGNAL(information(QString const &, QString const &)), + SLOT(doInformation(QString const &, QString const &))); + connect(this, SIGNAL(triggerFlush()), + SLOT(startFlushing())); + + flushDelay_.setInterval(200); + flushDelay_.setSingleShot(true); + connect(&flushDelay_, SIGNAL(timeout()), this, SLOT(updateWithLyXErr())); +} + + +int GuiProgress::prompt(docstring const & title, docstring const & question, + int default_button, int cancel_button, + docstring const & b1, docstring const & b2) +{ + return Alert::prompt(title, question, default_button, cancel_button, b1, b2); +} + + +QString GuiProgress::currentTime() +{ + return QTime::currentTime().toString("hh:mm:ss.zzz"); +} + + +void GuiProgress::doProcessStarted(QString const & cmd) { - setWindowTitle(qt_("LaTeX Progress")); - setWidget(&text_edit); - support::Systemcall::registerProgressInterface(this); + appendText(currentTime() + ": <" + cmd + "> started"); } -void GuiProgress::appendMessage(QString const & msg) +void GuiProgress::doProcessFinished(QString const & cmd) { - text_edit.append(msg); - // QEventLoop::ExcludeUserInputEvents: - // don't allow user inputs while processing a document - // if we allow it, we open will Pandora's Box of multithreading - QApplication::processEvents(QEventLoop::ExcludeUserInputEvents); + appendText(currentTime() + ": <" + cmd + "> done"); } -void GuiProgress::clearMessages() +void GuiProgress::doAppendMessage(QString const & msg) { - text_edit.clear(); + appendText(msg); } -Dialog * createGuiProgress(GuiView & lv) +void GuiProgress::doAppendError(QString const & msg) { - GuiView & guiview = static_cast(lv); -#ifdef Q_WS_MACX - // TODO where to show up on the Mac? - //return new GuiProgress(guiview, Qt::RightDockWidgetArea, Qt::Drawer); + appendText(msg); +} + + +void GuiProgress::doClearMessages() +{ + clearMessageText(); +} + + +void GuiProgress::startFlushing() +{ + flushDelay_.start(); +} + + +void GuiProgress::lyxerrFlush() +{ + triggerFlush(); +} + + +void GuiProgress::updateWithLyXErr() +{ + appendLyXErrMessage(toqstr(lyxerr_stream_.str())); + lyxerr_stream_.str(""); +} + + +void GuiProgress::lyxerrConnect() +{ + lyxerr.setSecondStream(&lyxerr_stream_); +} + + +void GuiProgress::lyxerrDisconnect() +{ + lyxerr.setSecondStream(0); +} + + +GuiProgress::~GuiProgress() +{ + lyxerrDisconnect(); +} + + +void GuiProgress::appendText(QString const & text) +{ + if (!text.isEmpty()) + updateStatusBarMessage(text); +} + + +void GuiProgress::doWarning(QString const & title, QString const & message) +{ + QMessageBox::warning(qApp->focusWidget(), title, message); +} + + +void GuiProgress::doToggleWarning(QString const & title, QString const & msg, QString const & formatted) +{ + QSettings settings; + if (settings.value("hidden_warnings/" + msg, false).toBool()) + return; + +// Qt < 5.2 does not feature QMessageBox::setCheckBox() yet, +// so we roll our own dialog. +#if QT_VERSION < 0x050200 + GuiToggleWarningDialog * dlg = + new GuiToggleWarningDialog(qApp->focusWidget()); + + dlg->setWindowTitle(title); + dlg->messageLA->setText(formatted); + dlg->dontShowAgainCB->setChecked(false); + + if (dlg->exec() == QDialog::Accepted) + if (dlg->dontShowAgainCB->isChecked()) + settings.setValue("hidden_warnings/" + + msg, true); #else - return new GuiProgress(guiview, Qt::BottomDockWidgetArea); + QCheckBox * dontShowAgainCB = new QCheckBox(); + dontShowAgainCB->setText(qt_("&Do not show this warning again!")); + dontShowAgainCB->setToolTip(qt_("If you check this, LyX will not warn you again in the given case.")); + QMessageBox box(QMessageBox::Warning, title, formatted, + QMessageBox::Ok, qApp->focusWidget()); + box.setCheckBox(dontShowAgainCB); + if (box.exec() == QMessageBox::Ok) + if (dontShowAgainCB->isChecked()) + settings.setValue("hidden_warnings/" + + msg, true); #endif } + +void GuiProgress::doError(QString const & title, QString const & message, QString const & details) +{ + QMessageBox box(QMessageBox::Critical, title, message, QMessageBox::Ok, qApp->focusWidget()); + if (!details.isEmpty()) { + box.setDetailedText(details); + } + box.exec(); +} + + +void GuiProgress::doInformation(QString const & title, QString const & message) +{ + QMessageBox::information(qApp->focusWidget(), title, message); +} + + } // namespace frontend } // namespace lyx - +#include "moc_GuiProgress.cpp"