[education/rkward] rkward/windows: Properly re-build preview selector widgets as needed
Thomas Friedrichsmeier
null at kde.org
Mon Jan 12 19:55:45 GMT 2026
Git commit f426eca2aa7280a1cd6ea24fdd0807661458c4f0 by Thomas Friedrichsmeier.
Committed on 12/01/2026 at 19:55.
Pushed by tfry into branch 'master'.
Properly re-build preview selector widgets as needed
M +48 -14 rkward/windows/rkcommandeditorwindow.cpp
https://invent.kde.org/education/rkward/-/commit/f426eca2aa7280a1cd6ea24fdd0807661458c4f0
diff --git a/rkward/windows/rkcommandeditorwindow.cpp b/rkward/windows/rkcommandeditorwindow.cpp
index 79deb58b9..cecfc2344 100644
--- a/rkward/windows/rkcommandeditorwindow.cpp
+++ b/rkward/windows/rkcommandeditorwindow.cpp
@@ -25,6 +25,7 @@ SPDX-License-Identifier: GPL-2.0-or-later
#include <QKeyEvent>
#include <QLabel>
#include <QMenu>
+#include <QObjectCleanupHandler>
#include <QSplitter>
#include <QTemporaryDir>
#include <QTemporaryFile>
@@ -134,13 +135,43 @@ class RKPreviewMode {
class RKPreviewModeSelector : public QWidgetAction {
public:
- RKPreviewModeSelector(RKCommandEditorWindow *win) : QWidgetAction(win), win(win) {};
+ RKPreviewModeSelector(RKCommandEditorWindow *win) : QWidgetAction(win), win(win), container(nullptr) {};
+ static void invalidateAll() {
+ allforms.clear();
+ // TODO: To be 100% correct, we'd have to follow up with a rebuild of any currently visible selector widgets.
+ // The most likely place to hit this would be while previewing a script that registers a user preview mode.
+ }
private:
RKCommandEditorWindow *win;
QWidget *createWidget(QWidget *parent) override {
- auto form = new QWidget(parent);
+ RK_TRACE(COMMANDEDITOR);
+ RK_ASSERT(parent);
+
+ container = new QWidget(parent);
+ new QHBoxLayout(container);
+ container->installEventFilter(this);
+ createMainWin(container);
+ return container;
+ }
+
+ bool eventFilter(QObject *, QEvent *event) override {
+ if (event->type() != QEvent::Show) return false;
+ if (!form) createMainWin(container);
+ return false;
+ }
+
+ QWidget *container;
+ QPointer<QWidget> form;
+ static QObjectCleanupHandler allforms;
+
+ void createMainWin(QWidget *parent) {
+ RK_TRACE(COMMANDEDITOR);
+
+ form = new QWidget(parent);
+ allforms.add(form);
+ parent->layout()->addWidget(form);
auto h = new QHBoxLayout(form);
auto l = new QVBoxLayout();
h->addLayout(l);
@@ -195,25 +226,28 @@ class RKPreviewModeSelector : public QWidgetAction {
l->addStretch();
r->addStretch();
- connect(preview_mode_button_group, &QButtonGroup::buttonToggled, this, [parent, this]() {
+ auto updateSize = [this]() {
// Menu needs some help resizing depending on available options.
// see also https://stackoverflow.com/questions/42122985/how-to-resize-a-qlabel-displayed-by-a-qwidgetaction-after-changing-its-text
- auto olds = parent->size();
+ auto p = container->parentWidget();
+ ;
+ auto olds = container->size();
QActionEvent e(QEvent::ActionChanged, this);
- qApp->sendEvent(parent, &e);
- if (olds.expandedTo(parent->size()) != olds && parent->isVisible()) {
- parent->blockSignals(true);
- parent->hide();
- parent->show();
- parent->blockSignals(false);
+ qApp->sendEvent(p, &e);
+ if (olds.expandedTo(p->size()) != olds && p->isVisible()) {
+ p->blockSignals(true);
+ p->hide();
+ p->show();
+ p->blockSignals(false);
}
win->triggerPreview(0);
- });
-
- return form;
+ };
+ connect(preview_mode_button_group, &QButtonGroup::buttonToggled, this, updateSize);
+ updateSize();
}
};
+QObjectCleanupHandler RKPreviewModeSelector::allforms;
class RKScriptPreviewIO {
QUrl url;
@@ -792,7 +826,7 @@ void RKCommandEditorWindow::registerUserPreviewMode(const QString &id, const QSt
return true;
};
user_preview_modes.insert(id, m);
- // TODO udate/notify existing selector widgets
+ RKPreviewModeSelector::invalidateAll();
}
// static
More information about the rkward-tracker
mailing list