[education/rkward] rkward/windows: Allow to use RMarkDown preview mode on any markdown document

Thomas Friedrichsmeier null at kde.org
Fri Sep 19 14:44:57 BST 2025


Git commit 7b6722f2b6799667b7bdb336e44ec5eee0f78ce4 by Thomas Friedrichsmeier.
Committed on 19/09/2025 at 13:44.
Pushed by tfry into branch 'master'.

Allow to use RMarkDown preview mode on any markdown document

M  +26   -13   rkward/windows/rkcommandeditorwindow.cpp

https://invent.kde.org/education/rkward/-/commit/7b6722f2b6799667b7bdb336e44ec5eee0f78ce4

diff --git a/rkward/windows/rkcommandeditorwindow.cpp b/rkward/windows/rkcommandeditorwindow.cpp
index 85474782f..2fb9ad71e 100644
--- a/rkward/windows/rkcommandeditorwindow.cpp
+++ b/rkward/windows/rkcommandeditorwindow.cpp
@@ -555,12 +555,10 @@ static RKCommandHighlighter::HighlightingMode documentHighlightingMode(KTextEdit
 
 class RKPreviewMode : public QRadioButton {
   public:
-	RKPreviewMode(KTextEditor::Document *doc, const QString &label, const QIcon &icon, const QString &input_ext, RKCommandHighlighter::HighlightingMode mode) : QRadioButton(label),
-	                                                                                                                                                            input_ext(input_ext),
-	                                                                                                                                                            valid_mode(mode) {
+	RKPreviewMode(KTextEditor::Document *doc, const QString &label, const QIcon &icon, const QString &input_ext) : QRadioButton(label),
+	                                                                                                               input_ext(input_ext),
+	                                                                                                               doc(doc) {
 		setIcon(icon);
-		connect(doc, &KTextEditor::Document::highlightingModeChanged, this, [this, doc] { checkApplicable(doc); });
-		checkApplicable(doc);
 		connect(this, &QRadioButton::toggled, this, [this]() {
 			for (const auto a : std::as_const(options)) {
 				a->setVisible(isChecked());
@@ -568,9 +566,11 @@ class RKPreviewMode : public QRadioButton {
 		});
 	};
 
-	void checkApplicable(KTextEditor::Document *doc) {
-		setEnabled((valid_mode == RKCommandHighlighter::AutomaticOrOther) || (documentHighlightingMode(doc) == valid_mode));
-	};
+	void setValidity(const std::function<bool(KTextEditor::Document *)> _validator) {
+		validator = _validator;
+		connect(doc, &KTextEditor::Document::highlightingModeChanged, this, [this] { setEnabled(validator(doc)); });
+		setEnabled(validator(doc));
+	}
 
 	QString preview_label;
 	std::function<QString(const QString &, const QString &, const QString &)> command;
@@ -579,8 +579,9 @@ class RKPreviewMode : public QRadioButton {
 		return option;
 	};
 	QString input_ext;
-	RKCommandHighlighter::HighlightingMode valid_mode;
+	KTextEditor::Document *doc;
 	QList<QWidget *> options;
+	std::function<bool(KTextEditor::Document *)> validator;
 };
 
 class RKScriptPreviewIO {
@@ -707,6 +708,14 @@ QString RmarkDownRender(const QString &infile, const QString &outdir, const QStr
 void RKCommandEditorWindow::initPreviewModes(KActionMenu *menu) {
 	RK_TRACE(COMMANDEDITOR);
 
+	const auto valid_for_any_markdown = [](KTextEditor::Document *doc) -> bool {
+		if (documentHighlightingMode(doc) == RKCommandHighlighter::RMarkdown) return true;
+		return doc->highlightingMode().toLower().contains(u"markdown"_s);
+	};
+	const auto valid_for_r_script = [](KTextEditor::Document *doc) -> bool {
+		return (documentHighlightingMode(doc) == RKCommandHighlighter::RScript);
+	};
+
 	// Must define this one first, as doRenderPreview() may trigger during setup of the further actions!
 	action_no_preview = new QRadioButton(i18n("No preview"), this);
 	action_no_preview->setIcon(RKStandardIcons::getIcon(RKStandardIcons::ActionDelete));
@@ -714,7 +723,8 @@ void RKCommandEditorWindow::initPreviewModes(KActionMenu *menu) {
 	action_no_preview->setChecked(true);
 	preview_modes->addButton(action_no_preview);
 
-	auto markdown = new RKPreviewMode(m_doc, i18n("R Markdown"), QIcon::fromTheme(u"preview_math"_s), u".Rmd"_s, RKCommandHighlighter::RMarkdown);
+	auto markdown = new RKPreviewMode(m_doc, i18n("R Markdown"), QIcon::fromTheme(u"preview_math"_s), u".Rmd"_s);
+	markdown->setValidity(valid_for_any_markdown);
 	markdown->preview_label = i18n("Preview of rendered R Markdown");
 	markdown->setToolTip(i18n("Preview the script as rendered from RMarkdown format (.Rmd)"));
 	enum _RenderMode { HTML,
@@ -733,7 +743,8 @@ void RKCommandEditorWindow::initPreviewModes(KActionMenu *menu) {
 	};
 	preview_modes->addButton(markdown);
 
-	auto rkoutput = new RKPreviewMode(m_doc, i18n("RKWard Output"), RKStandardIcons::getIcon(RKStandardIcons::WindowOutput), u".R"_s, RKCommandHighlighter::RScript);
+	auto rkoutput = new RKPreviewMode(m_doc, i18n("RKWard Output"), RKStandardIcons::getIcon(RKStandardIcons::WindowOutput), u".R"_s);
+	rkoutput->setValidity(valid_for_r_script);
 	rkoutput->preview_label = i18n("Preview of generated RKWard output");
 	rkoutput->setToolTip(i18n("Preview any output to the RKWard Output Window. This preview will be empty, if there is no call to <i>rk.print()</i> or other RKWard output commands."));
 	rkoutput->command = [](const QString &infile, const QString &outdir, const QString & /*preview_id*/) {
@@ -746,7 +757,8 @@ void RKCommandEditorWindow::initPreviewModes(KActionMenu *menu) {
 	};
 	preview_modes->addButton(rkoutput);
 
-	auto rkconsole = new RKPreviewMode(m_doc, i18n("R Console"), RKStandardIcons::getIcon(RKStandardIcons::WindowConsole), u".R"_s, RKCommandHighlighter::RScript);
+	auto rkconsole = new RKPreviewMode(m_doc, i18n("R Console"), RKStandardIcons::getIcon(RKStandardIcons::WindowConsole), u".R"_s);
+	rkconsole->setValidity(valid_for_r_script);
 	rkconsole->preview_label = i18n("Preview of script running in interactive R Console");
 	rkconsole->setToolTip(i18n("Preview the script as if it was run in the interactive R Console"));
 	enum _ConsoleOpts { Global,
@@ -781,7 +793,8 @@ void RKCommandEditorWindow::initPreviewModes(KActionMenu *menu) {
 	};
 	preview_modes->addButton(rkconsole);
 
-	auto plot = new RKPreviewMode(m_doc, i18n("Plot"), RKStandardIcons::getIcon(RKStandardIcons::WindowX11), u".R"_s, RKCommandHighlighter::RScript);
+	auto plot = new RKPreviewMode(m_doc, i18n("Plot"), RKStandardIcons::getIcon(RKStandardIcons::WindowX11), u".R"_s);
+	plot->setValidity(valid_for_r_script);
 	plot->preview_label = i18n("Preview of generated plot");
 	plot->setToolTip(i18n("Preview any onscreen graphics produced by running this script. This preview will be empty, if there is no call to <i>plot()</i> or other graphics commands."));
 	plot->command = [](const QString &infile, const QString & /*outdir*/, const QString &preview_id) {


More information about the rkward-tracker mailing list