Index: addons/katebuild-plugin/plugin_katebuild.h =================================================================== --- addons/katebuild-plugin/plugin_katebuild.h +++ addons/katebuild-plugin/plugin_katebuild.h @@ -130,7 +130,20 @@ bool checkLocal(const QUrl &dir); void clearBuildResults(); - void displayBuildResult(const QString &message, KTextEditor::Message::MessageType level); + /** + * Display a user information on the current active view. + * @parm message the text to show + * @parm type the message type + * @parm autoHideDelay the time the message will be shown. When 0 is the + * delay set to a sane default, when -1 is auto hide disabled + * @parm updateOnly when true will an already shown message text updated + * to @p message and the parameter @p type and @p autoHideDelay + * will be ignored. Should there no old message exist will a new + * message created with respect of all arguments + * + * @see KTextEditor::message + */ + void postMessage(const QString &message, KTextEditor::Message::MessageType type, int autoHideDelay = 0, bool updateOnly = false); KTextEditor::MainWindow *m_win; QWidget *m_toolView; @@ -142,6 +155,7 @@ QString m_stdOut; QString m_stdErr; QString m_currentlyBuildingTarget; + int m_hideViewOnSuccess = 0; // Hide view when > 0 bool m_buildCancelled; int m_displayModeBeforeBuild; QString m_make_dir; Index: addons/katebuild-plugin/plugin_katebuild.cpp =================================================================== --- addons/katebuild-plugin/plugin_katebuild.cpp +++ addons/katebuild-plugin/plugin_katebuild.cpp @@ -62,7 +62,8 @@ static const QString DefTargetName = QStringLiteral("all"); static const QString DefBuildCmd = QStringLiteral("make"); static const QString DefCleanCmd = QStringLiteral("make clean"); - +static const bool OnlyUpdateMessageText = true; +static const int NeverHide = 60 * 60 * 1000; // 1hour delay, quirk to avoid forced "Close" button /******************************************************************/ KateBuildPlugin::KateBuildPlugin(QObject *parent, const VariantList&): @@ -507,7 +508,6 @@ m_buildUi.u_tabWidget->setCurrentIndex(1); m_displayModeBeforeBuild = m_buildUi.displayModeSlider->value(); m_buildUi.displayModeSlider->setValue(0); - m_win->showToolView(m_toolView); // set working directory m_make_dir = dir; @@ -541,9 +541,6 @@ { if (m_proc.state() != QProcess::NotRunning) { m_buildCancelled = true; - QString msg = i18n("Building %1 cancelled", m_currentlyBuildingTarget); - m_buildUi.buildStatusLabel->setText(msg); - m_buildUi.buildStatusLabel2->setText(msg); m_proc.terminate(); return true; } @@ -576,6 +573,7 @@ void KateBuildView::slotBuildDefaultTarget() { QModelIndex defaultTarget = m_targetsUi->targetsModel.defaultTarget(m_targetsUi->targetsView->currentIndex()); m_targetsUi->targetsView->setCurrentIndex(defaultTarget); + m_hideViewOnSuccess = 2; buildCurrentTarget(); } @@ -599,17 +597,17 @@ /******************************************************************/ bool KateBuildView::buildCurrentTarget() { - if (m_proc.state() != QProcess::NotRunning) { - displayBuildResult(i18n("Already building..."), KTextEditor::Message::Warning); - return false; + if (m_proc.state() == QProcess::Running) { + m_win->showToolView(m_toolView); + return true; } QFileInfo docFInfo = docUrl().toLocalFile(); // docUrl() saves the current document QModelIndex ind = m_targetsUi->targetsView->currentIndex(); m_previousIndex = ind; if (!ind.isValid()) { - KMessageBox::sorry(nullptr, i18n("No target available for building.")); + postMessage(i18n("No target available for building."), KTextEditor::Message::Error); return false; } @@ -622,7 +620,7 @@ if (workDir.isEmpty()) { dir = docFInfo.absolutePath(); if (dir.isEmpty()) { - KMessageBox::sorry(nullptr, i18n("There is no local file or directory specified for building.")); + postMessage(i18n("There is no local file or directory specified for building."), KTextEditor::Message::Error); return false; } } @@ -641,29 +639,56 @@ buildCmd.replace(QStringLiteral("%f"), docFInfo.absoluteFilePath()); buildCmd.replace(QStringLiteral("%d"), docFInfo.absolutePath()); } + + --m_hideViewOnSuccess; m_filenameDetectorGccWorked = false; m_currentlyBuildingTarget = QStringLiteral("%1: %2").arg(targetSet).arg(cmdName); m_buildCancelled = false; QString msg = i18n("Building target %1 ...", m_currentlyBuildingTarget); m_buildUi.buildStatusLabel->setText(msg); m_buildUi.buildStatusLabel2->setText(msg); + postMessage(i18n("Building target..."), KTextEditor::Message::Information, NeverHide); + return startProcess(dir, buildCmd); } /******************************************************************/ -void KateBuildView::displayBuildResult(const QString &msg, KTextEditor::Message::MessageType level) +void KateBuildView::postMessage(const QString &msg, KTextEditor::Message::MessageType type, int autoHideDelay/* = 0*/, bool updateOnly/* = false*/) { KTextEditor::View *kv = m_win->activeView(); if (!kv) return; - delete m_infoMessage; - m_infoMessage = new KTextEditor::Message(xi18nc("@info", "Make Results:%1", msg), level); - m_infoMessage->setWordWrap(true); - m_infoMessage->setPosition(KTextEditor::Message::BottomInView); - m_infoMessage->setAutoHide(5000); - m_infoMessage->setAutoHideMode(KTextEditor::Message::Immediate); - m_infoMessage->setView(kv); - kv->document()->postMessage(m_infoMessage); + QString msgType; + switch (type) { + // TODO KF6 How about a function in KTextEditor::Message to get these translated message type names? + case KTextEditor::Message::Positive: + case KTextEditor::Message::Information: + msgType = i18n("Info"); + break; + case KTextEditor::Message::Warning: + msgType = i18n("Warning"); + break; + case KTextEditor::Message::Error: + msgType = i18n("Error"); + break; + } + + if (updateOnly && m_infoMessage) { + m_infoMessage->setText(xi18nc("@info", "Make %1%2", msgType, msg)); + + } else { + delete m_infoMessage; + // FIXME Add a minimum width to the message box, looks sometimes too titchy + // m_infoMessage->setMinimumWidth(123) will not work, it's only an QOject + // and attempts to add spaces failed + m_infoMessage = new KTextEditor::Message(xi18nc("@info", "Make %1%2", msgType, msg), type); + m_infoMessage->setWordWrap(true); + m_infoMessage->setPosition(KTextEditor::Message::BottomInView); + m_infoMessage->setAutoHide(autoHideDelay); + m_infoMessage->setAutoHideMode(KTextEditor::Message::Immediate); + m_infoMessage->setView(kv); + kv->document()->postMessage(m_infoMessage); + } } /******************************************************************/ @@ -691,7 +716,11 @@ m_win->showToolView(m_toolView); } - if (m_numErrors || m_numWarnings) { + if (m_buildCancelled) { + buildStatus = i18n("Building %1 cancelled", m_currentlyBuildingTarget); + postMessage(i18n("Build cancelled"), KTextEditor::Message::Information); + + } else if (m_numErrors || m_numWarnings) { QStringList msgs; if (m_numErrors) { msgs << i18np("Found one error.", "Found %1 errors.", m_numErrors); @@ -701,21 +730,21 @@ msgs << i18np("Found one warning.", "Found %1 warnings.", m_numWarnings); buildStatus = i18n("Building %1 had warnings.", m_currentlyBuildingTarget); } - displayBuildResult(msgs.join(QLatin1Char('\n')), m_numErrors ? KTextEditor::Message::Error : KTextEditor::Message::Warning); - } - else if (exitCode != 0) { - displayBuildResult(i18n("Build failed."), KTextEditor::Message::Warning); - } - else { - displayBuildResult(i18n("Build completed without problems."), KTextEditor::Message::Positive); - } + postMessage(msgs.join(QLatin1Char('\n')), m_numErrors ? KTextEditor::Message::Error : KTextEditor::Message::Warning); - if (!m_buildCancelled) { - m_buildUi.buildStatusLabel->setText(buildStatus); - m_buildUi.buildStatusLabel2->setText(buildStatus); - m_buildCancelled = false; + } else if (exitCode != 0) { + postMessage(i18n("Build failed."), KTextEditor::Message::Error); + + } else { + postMessage(i18n("Build completed without problems."), KTextEditor::Message::Positive); + if (m_hideViewOnSuccess > 0) { + m_win->hideToolView(m_toolView); + } } + m_buildUi.buildStatusLabel->setText(buildStatus); + m_buildUi.buildStatusLabel2->setText(buildStatus); + m_hideViewOnSuccess = 0; } @@ -729,6 +758,7 @@ l.remove(QLatin1Char('\r')); m_stdOut += l; + QRegularExpression regExp = QRegularExpression(QStringLiteral("^\\[\\s?([\\d\\%]+)\\]")); // handle one line at a time do { const int end = m_stdOut.indexOf(QLatin1Char('\n')); @@ -738,6 +768,12 @@ m_buildUi.plainTextEdit->appendPlainText(line); //qDebug() << line; + QRegularExpressionMatch match = regExp.match(line); + if (match.hasMatch()) { + postMessage(i18n("Building target...") + QStringLiteral("%1").arg(match.captured(1), 4, QLatin1Char('.')) + , KTextEditor::Message::Information, NeverHide, OnlyUpdateMessageText); + } + if (m_newDirDetector.match(line).hasMatch()) { //qDebug() << "Enter/Exit dir found"; int open = line.indexOf(QLatin1Char('`'));