]> git.lyx.org Git - lyx.git/blobdiff - src/frontends/qt4/GuiProgress.cpp
Set a maximum value to zoom level
[lyx.git] / src / frontends / qt4 / GuiProgress.cpp
index b421616ab4d329543cd86f0304ead46382b81368..a21baf338c3042426f2429c4dc2c5bdbd989cab4 100644 (file)
@@ -5,6 +5,7 @@
  * Licence details can be found in the file COPYING.
  *
  * \author Peter Kümmel
+ * \author Pavel Sanda
  *
  * Full author contact details are available in file CREDITS.
  */
 #include <config.h>
 
 #include "GuiProgress.h"
+#include "ui_ToggleWarningUi.h"
 
 #include "qt_helpers.h"
 
+#include "frontends/alert.h"
+
+#include "support/debug.h"
 #include "support/Systemcall.h"
 
 #include <QApplication>
-#include <QDebug>
+#include <QTime>
+#include <QMessageBox>
+#include <QSettings>
 
 
 namespace lyx {
 namespace frontend {
 
 
-
-GuiProgress::GuiProgress(GuiView & parent, Qt::DockWidgetArea area, 
-       Qt::WindowFlags flags) : DockView(parent, "progress", "External tools", 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
 {
-       setWindowTitle(qt_("Tool monitoring"));
-       setWidget(&text_edit);
-       text_edit.setReadOnly(true);
+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)
 {
-       appendText("Process started : " + cmd + "\n");
+       appendText(currentTime() + ": <" + cmd + "> started");
 }
 
 
 void GuiProgress::doProcessFinished(QString const & cmd)
 {
-       appendText("Process finished: " + cmd + "\n");
+       appendText(currentTime() + ": <" + cmd + "> done");
 }
 
 
 void GuiProgress::doAppendMessage(QString const & msg)
 {
-       // No good messages from the processes
-       //appendText(msg);
+       appendText(msg);
 }
 
 
@@ -68,44 +114,112 @@ void GuiProgress::doAppendError(QString const & msg)
 
 void GuiProgress::doClearMessages()
 {
-       text_edit.clear();
+       clearMessageText();
 }
 
 
-void GuiProgress::appendText(QString const & text)
+void GuiProgress::startFlushing()
 {
-       text_edit.insertPlainText(text);
-       text_edit.ensureCursorVisible();
+       flushDelay_.start();
 }
 
 
-void GuiProgress::showEvent(QShowEvent*)
+void GuiProgress::lyxerrFlush()
 {
-       support::ProgressInterface::setInstance(this);
+       triggerFlush();
 }
 
 
-void GuiProgress::hideEvent(QHideEvent*)
+void GuiProgress::updateWithLyXErr()
 {
-       support::ProgressInterface::setInstance(0);
+       appendLyXErrMessage(toqstr(lyxerr_stream_.str()));
+       lyxerr_stream_.str("");
 }
 
 
+void GuiProgress::lyxerrConnect()
+{
+       lyxerr.setSecondStream(&lyxerr_stream_);
+}
+
 
-Dialog * createGuiProgress(GuiView & lv)
+void GuiProgress::lyxerrDisconnect()
 {
-       GuiView & guiview = static_cast<GuiView &>(lv);
-#ifdef Q_WS_MACX
-       // TODO where to show up on the Mac?
-       //return new GuiProgress(guiview, Qt::RightDockWidgetArea, Qt::Drawer);
+       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"
\ No newline at end of file
+#include "moc_GuiProgress.cpp"