[education/rkward] rkward/misc: Unify output handing code in inline vs. standalone progress controls
Thomas Friedrichsmeier
null at kde.org
Sat Sep 27 14:05:06 BST 2025
Git commit 47ea93ca9e79919183f3974c1ded1671acde6c71 by Thomas Friedrichsmeier.
Committed on 27/09/2025 at 13:04.
Pushed by tfry into branch 'master'.
Unify output handing code in inline vs. standalone progress controls
M +40 -56 rkward/misc/rkprogresscontrol.cpp
M +0 -1 rkward/misc/rkprogresscontrol.h
https://invent.kde.org/education/rkward/-/commit/47ea93ca9e79919183f3974c1ded1671acde6c71
diff --git a/rkward/misc/rkprogresscontrol.cpp b/rkward/misc/rkprogresscontrol.cpp
index 2c4136dcb..70fe202ee 100644
--- a/rkward/misc/rkprogresscontrol.cpp
+++ b/rkward/misc/rkprogresscontrol.cpp
@@ -13,6 +13,7 @@ SPDX-License-Identifier: GPL-2.0-or-later
#include <QHBoxLayout>
#include <QScreen>
#include <QScrollBar>
+#include <QTextEdit>
#include <QTimer>
#include <QVBoxLayout>
@@ -34,23 +35,22 @@ class RKProgressControlDialog : public QDialog {
/** destructor. */
~RKProgressControlDialog();
+ QTextEdit *output_text;
+ QWidget *detailsbox;
+
public:
- void addOutput(const ROutput &output);
void finished();
void indicateError();
+ void toggleDetails();
protected:
void closeEvent(QCloseEvent *e) override;
- void scrollDown();
- void toggleDetails();
private:
/** Replace "Cancel" button text with "Close" (to be called, when underlying command has finished */
void setCloseTextToClose();
QLabel *error_indicator;
- QTextEdit *output_text;
- QWidget *detailsbox;
QDialogButtonBox *buttons;
QString output_button_text;
@@ -159,14 +159,41 @@ void RKProgressControl::done() {
}
}
+static void scrollDown(QTextEdit *log) {
+ QScrollBar *bar = log->verticalScrollBar();
+ if (bar) bar->setValue(bar->maximum());
+}
+
+static void addOutput(QTextEdit *log, const ROutput &output) {
+ RK_TRACE(MISC);
+
+ bool scroll_to_end = log->isVisible();
+ if (scroll_to_end) {
+ QScrollBar *bar = log->verticalScrollBar();
+ if (bar && (bar->value() < bar->maximum())) scroll_to_end = false;
+ }
+
+ if (output.type == ROutput::Output) {
+ log->setTextColor(RKStyle::viewScheme()->foreground(KColorScheme::NormalText).color());
+ } else {
+ log->setTextColor(RKStyle::viewScheme()->foreground(KColorScheme::NegativeText).color());
+ }
+
+ log->insertPlainText(output.output);
+
+ // if previously at end, auto-scroll
+ if (scroll_to_end) scrollDown(log);
+}
+
void RKProgressControl::createDialog() {
RK_TRACE(MISC);
dialog = new RKProgressControlDialog(text, caption, mode, modal);
connect(dialog, &QObject::destroyed, this, &RKProgressControl::dialogDestroyed);
if (is_done) done();
- for (int i = 0; i < output_log.count(); ++i) {
- dialog->addOutput(output_log[i]);
+ for (const auto &output : std::as_const(output_log)) {
+ addOutput(dialog->output_text, output);
+ if (output.type != ROutput::Output && !dialog->detailsbox->isVisible()) dialog->toggleDetails();
}
}
@@ -178,7 +205,10 @@ void RKProgressControl::newOutput(RCommand *, const ROutput &output) {
if (!dialog) createDialog();
dialog->raise();
}
- if (dialog) dialog->addOutput(output);
+ if (dialog) {
+ addOutput(dialog->output_text, output);
+ if (output.type != ROutput::Output && !dialog->detailsbox->isVisible()) dialog->toggleDetails();
+ }
}
QString RKProgressControl::fullCommandOutput() {
@@ -193,7 +223,6 @@ QString RKProgressControl::fullCommandOutput() {
//////////////////////////// RKProgressControlDialog ///////////////////////////////////////////7
#include <QPushButton>
-#include <QTextEdit>
#include <qlabel.h>
#include <qlayout.h>
@@ -271,34 +300,6 @@ void RKProgressControlDialog::indicateError() {
error_indicator->show();
}
-void RKProgressControlDialog::addOutput(const ROutput &output) {
- RK_TRACE(MISC);
-
- // scrolled all the way to the bottom?
- bool at_end = true;
- if (detailsbox->isVisible()) {
- QScrollBar *bar = output_text->verticalScrollBar();
- if (bar && (bar->value() < bar->maximum())) at_end = false;
- }
-
- if (output.type != last_output_type) {
- last_output_type = output.type;
- output_text->insertPlainText(QStringLiteral("\n"));
-
- if (output.type == ROutput::Output) {
- output_text->setTextColor(RKStyle::viewScheme()->foreground(KColorScheme::NormalText).color());
- } else {
- output_text->setTextColor(RKStyle::viewScheme()->foreground(KColorScheme::NegativeText).color());
- if (!detailsbox->isVisible()) toggleDetails();
- }
- }
-
- output_text->insertPlainText(output.output);
-
- // if previously at end, auto-scroll
- if (at_end && output_text->isVisible()) scrollDown();
-}
-
void RKProgressControlDialog::toggleDetails() {
RK_TRACE(MISC);
@@ -311,20 +312,13 @@ void RKProgressControlDialog::toggleDetails() {
if (h <= 0) h = detailsbox->sizeHint().height();
new_height += h;
detailsbox->show();
- scrollDown();
+ scrollDown(output_text);
}
layout()->activate();
resize(width(), new_height);
}
-void RKProgressControlDialog::scrollDown() {
- RK_TRACE(MISC);
-
- QScrollBar *bar = output_text->verticalScrollBar();
- if (bar) bar->setValue(bar->maximum());
-}
-
void RKProgressControlDialog::setCloseTextToClose() {
RK_TRACE(MISC);
@@ -434,20 +428,10 @@ void RKInlineProgressControl::addRCommand(RCommand *command) {
}
});
connect(command->notifier(), &RCommandNotifier::commandOutput, this, [this](RCommand *, const ROutput &o) {
- addOutput(o.output, o.type != ROutput::Output);
+ addOutput(output_display, o);
});
}
-void RKInlineProgressControl::addOutput(const QString &output, bool is_error_warning) {
- RK_TRACE(MISC);
- if (is_error_warning) {
- output_display->setTextColor(RKStyle::viewScheme()->foreground(KColorScheme::NegativeText).color());
- } else {
- output_display->setTextColor(RKStyle::viewScheme()->foreground(KColorScheme::NormalText).color());
- }
- output_display->insertPlainText(output);
-}
-
void RKInlineProgressControl::done() {
RK_TRACE(MISC);
if (autoclose && !any_failed) {
diff --git a/rkward/misc/rkprogresscontrol.h b/rkward/misc/rkprogresscontrol.h
index c72ff3ed2..eb30d1520 100644
--- a/rkward/misc/rkprogresscontrol.h
+++ b/rkward/misc/rkprogresscontrol.h
@@ -112,7 +112,6 @@ class RKInlineProgressControl : public QObject {
void setText(const QString &text);
private:
- void addOutput(const QString &output, bool is_error_warning);
void done();
void setCloseAction(const QString &label);
bool eventFilter(QObject *, QEvent *e) override;
More information about the rkward-tracker
mailing list