[rkward] rkward: Add dialog to prompt about what to do with unversioned legacy library location.

Thomas Friedrichsmeier null at kde.org
Sun May 6 06:40:30 UTC 2018


Git commit a55e9871be6ed4a025b0fd0b342493f397a9cf47 by Thomas Friedrichsmeier.
Committed on 06/05/2018 at 06:39.
Pushed by tfry into branch 'master'.

Add dialog to prompt about what to do with unversioned legacy library location.

This is designed so it can eventually be extended to a "first run wizard" performing
several checks for a new version / fresh install.

M  +5    -0    rkward/rbackend/rkrinterface.cpp
M  +1    -1    rkward/rkward.cpp
M  +36   -21   rkward/settings/rksettings.cpp
M  +4    -2    rkward/settings/rksettings.h
M  +22   -4    rkward/settings/rksettingsmodule.h
M  +4    -4    rkward/settings/rksettingsmodulecommandeditor.h
M  +4    -4    rkward/settings/rksettingsmoduleconsole.h
M  +5    -5    rkward/settings/rksettingsmoduledebug.h
M  +4    -3    rkward/settings/rksettingsmodulegeneral.h
M  +3    -2    rkward/settings/rksettingsmodulegraphics.h
M  +2    -2    rkward/settings/rksettingsmoduleobjectbrowser.h
M  +5    -4    rkward/settings/rksettingsmoduleoutput.h
M  +5    -4    rkward/settings/rksettingsmoduleplugins.h
M  +60   -0    rkward/settings/rksettingsmoduler.cpp
M  +7    -5    rkward/settings/rksettingsmoduler.h
M  +4    -4    rkward/settings/rksettingsmodulewatch.h

https://commits.kde.org/rkward/a55e9871be6ed4a025b0fd0b342493f397a9cf47

diff --git a/rkward/rbackend/rkrinterface.cpp b/rkward/rbackend/rkrinterface.cpp
index 51a9c3be..39de8a93 100644
--- a/rkward/rbackend/rkrinterface.cpp
+++ b/rkward/rbackend/rkrinterface.cpp
@@ -70,6 +70,7 @@
 #define SET_RUNTIME_OPTS 3
 #define STARTUP_PHASE2_COMPLETE 4
 #define GET_R_VERSION 5
+#define RSTARTUP_COMPLETE 6
 
 // statics
 double RInterface::na_real;
@@ -102,6 +103,8 @@ RInterface::RInterface () {
 	/////// Further initialization commands, which do not necessarily have to run before everything else can be queued, here. ///////
 	// NOTE: will receive the list as a call plain generic request from the backend ("updateInstalledPackagesList")
 	issueCommand (".rk.get.installed.packages()", RCommand::App | RCommand::Sync);
+
+	issueCommand (new RCommand (QString (), RCommand::App | RCommand::Sync | RCommand::EmptyCommand, QString (), this, RSTARTUP_COMPLETE));
 }
 
 void RInterface::issueCommand (const QString &command, int type, const QString &rk_equiv, RCommandReceiver *receiver, int flags, RCommandChain *chain) {
@@ -342,6 +345,8 @@ void RInterface::rCommandDone (RCommand *command) {
 		}
 
 		startup_errors.clear ();
+	} else if (command->getFlags () == RSTARTUP_COMPLETE) {
+		RKSettings::validateSettingsInteractive ();
 	}
 }
 
diff --git a/rkward/rkward.cpp b/rkward/rkward.cpp
index 70db44d9..e76b3937 100644
--- a/rkward/rkward.cpp
+++ b/rkward/rkward.cpp
@@ -2,7 +2,7 @@
                           rkward.cpp  -  description
                              -------------------
     begin                : Tue Oct 29 20:06:08 CET 2002
-    copyright            : (C) 2002-2013 by Thomas Friedrichsmeier 
+    copyright            : (C) 2002-2018 by Thomas Friedrichsmeier
     email                : thomas.friedrichsmeier at kdemail.net
  ***************************************************************************/
 
diff --git a/rkward/settings/rksettings.cpp b/rkward/settings/rksettings.cpp
index 33579728..8f85cc37 100644
--- a/rkward/settings/rksettings.cpp
+++ b/rkward/settings/rksettings.cpp
@@ -2,7 +2,7 @@
                           rksettings  -  description
                              -------------------
     begin                : Wed Jul 28 2004
-    copyright            : (C) 2004-2013 by Thomas Friedrichsmeier
+    copyright            : (C) 2004-2018 by Thomas Friedrichsmeier
     email                : thomas.friedrichsmeier at kdemail.net
  ***************************************************************************/
 
@@ -175,34 +175,49 @@ void RKSettings::enableApply () {
 	button (QDialogButtonBox::Apply)->setEnabled (true);
 }
 
+#define FOREACH_SETTINGS_MODULE(X)           \
+	RKSettingsModuleGeneral::X;  /* always handle this first (esp., when loading settings), as it contains the base path for rkward files */ \
+	RKSettingsModulePlugins::X;          \
+	RKSettingsModuleR::X;                \
+	RKSettingsModuleRPackages::X;        \
+	RKSettingsModuleOutput::X;           \
+	RKSettingsModuleGraphics::X;         \
+	RKSettingsModuleWatch::X;            \
+	RKSettingsModuleConsole::X;          \
+	RKSettingsModuleCommandEditor::X;    \
+	RKSettingsModuleObjectBrowser::X;
+
 void RKSettings::loadSettings (KConfig *config) {
 	RK_TRACE (SETTINGS);
 
-	RKSettingsModuleGeneral::loadSettings(config);		// alway load this first, as it contains the base path for rkward files
-	RKSettingsModulePlugins::loadSettings(config);
-	RKSettingsModuleR::loadSettings(config);
-	RKSettingsModuleRPackages::loadSettings(config);
-	RKSettingsModuleOutput::loadSettings(config);
-	RKSettingsModuleGraphics::loadSettings(config);
-	RKSettingsModuleWatch::loadSettings(config);
-	RKSettingsModuleConsole::loadSettings(config);
-	RKSettingsModuleCommandEditor::loadSettings(config);
-	RKSettingsModuleObjectBrowser::loadSettings(config);
+	FOREACH_SETTINGS_MODULE(loadSettings(config));
 }
 
 void RKSettings::saveSettings (KConfig *config) {
 	RK_TRACE (SETTINGS);
 
-	RKSettingsModuleGeneral::saveSettings(config);
-	RKSettingsModulePlugins::saveSettings(config);
-	RKSettingsModuleR::saveSettings(config);
-	RKSettingsModuleRPackages::saveSettings(config);
-	RKSettingsModuleOutput::saveSettings(config);
-	RKSettingsModuleGraphics::saveSettings(config);
-	RKSettingsModuleWatch::saveSettings(config);
-	RKSettingsModuleConsole::saveSettings(config);
-	RKSettingsModuleCommandEditor::saveSettings(config);
-	RKSettingsModuleObjectBrowser::saveSettings(config);
+	FOREACH_SETTINGS_MODULE(saveSettings(config));
+}
+
+#include <KAssistantDialog>
+void RKSettings::validateSettingsInteractive () {
+	RK_TRACE (SETTINGS);
+
+	QList<RKSettingsWizardPage*> interaction_pages;
+	FOREACH_SETTINGS_MODULE(validateSettingsInteractive(&interaction_pages));
+	if (!interaction_pages.isEmpty ()) {
+		KAssistantDialog dialog ((QWidget*) 0);
+		for (int i = 0; i < interaction_pages.size (); ++i) {
+			dialog.addPage (interaction_pages[i], interaction_pages[i]->windowTitle ());
+		}
+		QPushButton *help_button = dialog.button (QDialogButtonBox::Help);
+		if (help_button) help_button->hide ();
+		if (dialog.exec () == QDialog::Accepted) {
+			for (int i = 0; i < interaction_pages.size (); ++i) {
+				interaction_pages[i]->apply ();
+			}
+		}
+	}
 }
 
 //############ END RKSettings ##################
diff --git a/rkward/settings/rksettings.h b/rkward/settings/rksettings.h
index 80980a0a..d7fba4db 100644
--- a/rkward/settings/rksettings.h
+++ b/rkward/settings/rksettings.h
@@ -2,7 +2,7 @@
                           rksettings  -  description
                              -------------------
     begin                : Wed Jul 28 2004
-    copyright            : (C) 2004, 2007 by Thomas Friedrichsmeier
+    copyright            : (C) 2004-2018 by Thomas Friedrichsmeier
     email                : thomas.friedrichsmeier at kdemail.net
  ***************************************************************************/
 
@@ -55,7 +55,9 @@ public:
 
 	static void loadSettings (KConfig *config);
 	static void saveSettings (KConfig *config);
-	
+	/** Perform any settings validation that may need user interaction (and should happen after a GUI is available, and R has started up) */
+	static void validateSettingsInteractive ();
+
 	void enableApply ();
 	
 	static RKSettingsTracker* tracker () { return settings_tracker; };
diff --git a/rkward/settings/rksettingsmodule.h b/rkward/settings/rksettingsmodule.h
index 1cd28d6c..c9d35d48 100644
--- a/rkward/settings/rksettingsmodule.h
+++ b/rkward/settings/rksettingsmodule.h
@@ -2,7 +2,7 @@
                           rksettingsmodule  -  description
                              -------------------
     begin                : Wed Jul 28 2004
-    copyright            : (C) 2004, 2007 by Thomas Friedrichsmeier
+    copyright            : (C) 2004-2018 by Thomas Friedrichsmeier
     email                : thomas.friedrichsmeier at kdemail.net
  ***************************************************************************/
 
@@ -32,9 +32,8 @@ Base class for settings modules. Provides some pure virtual calls.
 */
 class RKSettingsModule : public QWidget {
 public:
-    RKSettingsModule (RKSettings *gui, QWidget *parent);
-
-    virtual ~RKSettingsModule ();
+	RKSettingsModule (RKSettings *gui, QWidget *parent);
+	virtual ~RKSettingsModule ();
 
 	bool hasChanges () { return changed; };
 	virtual void applyChanges () = 0;
@@ -56,4 +55,23 @@ friend class RKSettings;
 	static RCommandChain *chain;
 };
 
+#include <functional>
+/** Simple helper class to formalize the API of widgets used for the interactive validation of settings.
+ *  (For quering about settings that may need adjusting on startup. Possibly to be expanded to a "first-run-wizard", in the future). */
+class RKSettingsWizardPage : public QWidget {
+public:
+	RKSettingsWizardPage (QWidget* parent=0) : QWidget (parent) {
+		apply_callback = 0;
+	}
+	~RKSettingsWizardPage () {};
+	void apply () {
+		if (apply_callback) apply_callback();
+	}
+	void setApplyCallback (std::function<void()> callback) {
+		apply_callback = callback;
+	};
+private:
+	std::function<void()> apply_callback;
+};
+
 #endif
diff --git a/rkward/settings/rksettingsmodulecommandeditor.h b/rkward/settings/rksettingsmodulecommandeditor.h
index 295e0c8a..bed059df 100644
--- a/rkward/settings/rksettingsmodulecommandeditor.h
+++ b/rkward/settings/rksettingsmodulecommandeditor.h
@@ -2,7 +2,7 @@
                           rksettingsmodulecommandeditor  -  description
                              -------------------
     begin                : Tue Oct 23 2007
-    copyright            : (C) 2007, 2010, 2011 by Thomas Friedrichsmeier
+    copyright            : (C) 2007-2018 by Thomas Friedrichsmeier
     email                : thomas.friedrichsmeier at kdemail.net
  ***************************************************************************/
 
@@ -33,15 +33,15 @@ class RKSettingsModuleCommandEditor : public RKSettingsModule {
 	Q_OBJECT
 public:
 	RKSettingsModuleCommandEditor (RKSettings *gui, QWidget *parent);
-
 	~RKSettingsModuleCommandEditor ();
 	
 	void applyChanges () override;
 	void save (KConfig *config) override;
-	
+
 	static void saveSettings (KConfig *config);
 	static void loadSettings (KConfig *config);
-	
+	static void validateSettingsInteractive (QList<RKSettingsWizardPage*>*) {};
+
 	QString caption () override;
 
 /// min number of character to try code completion
diff --git a/rkward/settings/rksettingsmoduleconsole.h b/rkward/settings/rksettingsmoduleconsole.h
index c0d4b23b..e202f47a 100644
--- a/rkward/settings/rksettingsmoduleconsole.h
+++ b/rkward/settings/rksettingsmoduleconsole.h
@@ -2,7 +2,7 @@
                           rksettingsmoduleconsole  -  description
                              -------------------
     begin                : Sun Oct 16 2005
-    copyright            : (C) 2005, 2006, 2007, 2009 by Thomas Friedrichsmeier
+    copyright            : (C) 2005-2018 by Thomas Friedrichsmeier
     email                : thomas.friedrichsmeier at kdemail.net
  ***************************************************************************/
 
@@ -34,12 +34,12 @@ class RKSettingsModuleConsole : public RKSettingsModule {
 Q_OBJECT
 public:
 	RKSettingsModuleConsole (RKSettings *gui, QWidget *parent);
-
 	~RKSettingsModuleConsole ();
-	
+
 	static void saveSettings (KConfig *config);
 	static void loadSettings (KConfig *config);
-	
+	static void validateSettingsInteractive (QList<RKSettingsWizardPage*>*) {};
+
 	void applyChanges () override;
 	void save (KConfig *config) override;
 
diff --git a/rkward/settings/rksettingsmoduledebug.h b/rkward/settings/rksettingsmoduledebug.h
index 92a3d6aa..6e532fc9 100644
--- a/rkward/settings/rksettingsmoduledebug.h
+++ b/rkward/settings/rksettingsmoduledebug.h
@@ -2,7 +2,7 @@
                           rksettingsmoduledebug -  description
                              -------------------
     begin                : Tue Oct 23 2007
-    copyright            : (C) 2007, 2009, 2017 by Thomas Friedrichsmeier
+    copyright            : (C) 2007-2018 by Thomas Friedrichsmeier
     email                : thomas.friedrichsmeier at kdemail.net
  ***************************************************************************/
 
@@ -32,15 +32,15 @@ class RKSettingsModuleDebug : public RKSettingsModule {
 	Q_OBJECT
 public:
 	RKSettingsModuleDebug (RKSettings *gui, QWidget *parent);
-
 	~RKSettingsModuleDebug ();
-	
+
 	void applyChanges () override;
 	void save (KConfig *config) override;
-	
+
 	static void saveSettings (KConfig *config);
 	static void loadSettings (KConfig *config);
-	
+	static void validateSettingsInteractive (QList<RKSettingsWizardPage*>*) {};
+
 	QString caption () override;
 
 	// static members are declared in debug.h and defined in main.cpp
diff --git a/rkward/settings/rksettingsmodulegeneral.h b/rkward/settings/rksettingsmodulegeneral.h
index a03af183..1b038af9 100644
--- a/rkward/settings/rksettingsmodulegeneral.h
+++ b/rkward/settings/rksettingsmodulegeneral.h
@@ -33,7 +33,6 @@ class RKSettingsModuleGeneral : public RKSettingsModule {
 	Q_OBJECT
 public:
 	RKSettingsModuleGeneral (RKSettings *gui, QWidget *parent);
-
 	~RKSettingsModuleGeneral ();
 
 	enum WorkplaceSaveMode {	// don't change the int values of this enum, or you'll ruin users saved settings. Append new values at the end
@@ -57,10 +56,11 @@ public:
 
 	void applyChanges () override;
 	void save (KConfig *config) override;
-	
+
 	static void saveSettings (KConfig *config);
 	static void loadSettings (KConfig *config);
-	
+	static void validateSettingsInteractive (QList<RKSettingsWizardPage*>*) {};
+
 	QString caption () override;
 
 /// returns the directory-name where the logfiles should reside
@@ -95,6 +95,7 @@ public:
 		RKWardConfig_0_6_1,
 		RKWardConfig_0_6_3,
 		RKWardConfig_0_6_4,
+		RKWardConfig_0_7_1,
 		RKWardConfig_Next,		/**< add new configuration versions above / before this entry */
 		RKWardConfig_Latest = RKWardConfig_Next - 1
 	};
diff --git a/rkward/settings/rksettingsmodulegraphics.h b/rkward/settings/rksettingsmodulegraphics.h
index 976e0656..59bb317a 100644
--- a/rkward/settings/rksettingsmodulegraphics.h
+++ b/rkward/settings/rksettingsmodulegraphics.h
@@ -2,7 +2,7 @@
                           rksettingsmodulegraphics  -  description
                              -------------------
     begin                : Mon Sep 13 2010
-    copyright            : (C) 2010, 2013 by Thomas Friedrichsmeier
+    copyright            : (C) 2010-2018 by Thomas Friedrichsmeier
     email                : thomas.friedrichsmeier at kdemail.net
  ***************************************************************************/
 
@@ -49,7 +49,8 @@ public:
 
 	static void saveSettings (KConfig *config);
 	static void loadSettings (KConfig *config);
-	
+	static void validateSettingsInteractive (QList<RKSettingsWizardPage*>*) {};
+
 	QString caption () override;
 	QUrl helpURL () override { return QUrl ("rkward://page/rkward_plot_history#scd_settings"); };
 
diff --git a/rkward/settings/rksettingsmoduleobjectbrowser.h b/rkward/settings/rksettingsmoduleobjectbrowser.h
index 833e77c6..84f902c6 100644
--- a/rkward/settings/rksettingsmoduleobjectbrowser.h
+++ b/rkward/settings/rksettingsmoduleobjectbrowser.h
@@ -2,7 +2,7 @@
                           rksettingsmodule  -  description
                              -------------------
     begin                : Fri Apr 22 2005
-    copyright            : (C) 2005, 2015 by Thomas Friedrichsmeier
+    copyright            : (C) 2005-2018 by Thomas Friedrichsmeier
     email                : thomas.friedrichsmeier at kdemail.net
  ***************************************************************************/
 
@@ -33,7 +33,6 @@ class RKSettingsModuleObjectBrowser : public RKSettingsModule {
 	Q_OBJECT
 public:
 	RKSettingsModuleObjectBrowser (RKSettings *gui, QWidget *parent);
-
 	~RKSettingsModuleObjectBrowser ();
 
 /** applies current settings in this RKSettingsModule. This will only be called, if hasChanges () is true */
@@ -47,6 +46,7 @@ public:
 
 	static void saveSettings (KConfig *config);
 	static void loadSettings (KConfig *config);
+	static void validateSettingsInteractive (QList<RKSettingsWizardPage*>*) {};
 
 	static bool isDefaultForWorkspace (RKObjectListViewSettings::PersistentSettings setting) { return workspace_settings[setting]; };
 	static bool isDefaultForVarselector (RKObjectListViewSettings::PersistentSettings setting) { return varselector_settings[setting]; };
diff --git a/rkward/settings/rksettingsmoduleoutput.h b/rkward/settings/rksettingsmoduleoutput.h
index 42dd9976..1858835f 100644
--- a/rkward/settings/rksettingsmoduleoutput.h
+++ b/rkward/settings/rksettingsmoduleoutput.h
@@ -2,7 +2,7 @@
                           rksettingsmoduleoutput  -  description
                              -------------------
     begin                : Fri Jul 30 2004
-    copyright            : (C) 2004, 2010, 2011 by Thomas Friedrichsmeier
+    copyright            : (C) 2004-2018 by Thomas Friedrichsmeier
     email                : thomas.friedrichsmeier at kdemail.net
  ***************************************************************************/
 
@@ -76,16 +76,17 @@ class RKSettingsModuleOutput : public RKSettingsModule {
 public:
 	RKSettingsModuleOutput (RKSettings *gui, QWidget *parent);
 	~RKSettingsModuleOutput ();
-	
+
 	void applyChanges () override;
 	void save (KConfig *config) override;
 
 /** generate the commands needed to set the R run time options */
 	static QStringList makeRRunTimeOptionCommands ();
-	
+
 	static void saveSettings (KConfig *config);
 	static void loadSettings (KConfig *config);
-	
+	static void validateSettingsInteractive (QList<RKSettingsWizardPage*>*) {};
+
 	QString caption () override;
 	
 	static bool autoShow () { return auto_show; };
diff --git a/rkward/settings/rksettingsmoduleplugins.h b/rkward/settings/rksettingsmoduleplugins.h
index 9f965e60..5c0470f0 100644
--- a/rkward/settings/rksettingsmoduleplugins.h
+++ b/rkward/settings/rksettingsmoduleplugins.h
@@ -2,7 +2,7 @@
                           rksettingsmoduleplugins  -  description
                              -------------------
     begin                : Wed Jul 28 2004
-    copyright            : (C) 2004-2016 by Thomas Friedrichsmeier
+    copyright            : (C) 2004-2018 by Thomas Friedrichsmeier
     email                : thomas.friedrichsmeier at kdemail.net
  ***************************************************************************/
 
@@ -41,12 +41,13 @@ public:
 
 	void applyChanges () override;
 	void save (KConfig *config) override;
-	
+
 	enum PluginPrefs { PreferDialog=0, PreferRecommended=1, PreferWizard=2 };
-	
+
 	static void saveSettings (KConfig *config);
 	static void loadSettings (KConfig *config);
-	
+	static void validateSettingsInteractive (QList<RKSettingsWizardPage*>*) {};
+
 	QString caption () override;
 
 	/** @returns a list of active plugin maps */
diff --git a/rkward/settings/rksettingsmoduler.cpp b/rkward/settings/rksettingsmoduler.cpp
index 33abd0af..cc9edfed 100644
--- a/rkward/settings/rksettingsmoduler.cpp
+++ b/rkward/settings/rksettingsmoduler.cpp
@@ -630,3 +630,63 @@ void RKSettingsModuleRPackages::loadSettings (KConfig *config) {
 #endif
 }
 
+#include <QGroupBox>
+#include <QRadioButton>
+
+void RKSettingsModuleRPackages::validateSettingsInteractive (QList<RKSettingsWizardPage*>* pages) {
+	RK_TRACE (SETTINGS);
+
+	if (RKSettingsModuleGeneral::storedConfigVersion () < RKSettingsModuleGeneral::RKWardConfig_0_7_1) {
+		QString legacy_libloc = QDir (RKSettingsModuleGeneral::filesPath ()).absoluteFilePath ("library");
+		if (liblocs.contains (legacy_libloc)) {
+			RKSettingsWizardPage *page = new RKSettingsWizardPage ();
+			page->setWindowTitle (i18n ("Unversioned library location"));
+			QVBoxLayout *layout = new QVBoxLayout (page);
+			QLabel *label = new QLabel (i18n ("The configured library locations (where R packages will be installed on this system) contains the directory '%1', "
+			                                  "which was suggested as a default library location in earlier versions of RKWard. Use of this directory is no longer "
+			                                  "recommended, as it is not accessible R sessions outside of RKWard (unless configured, explicitly). Also due to the lack "
+			                                  "of an R version number in the directory name, it offers no protection against using packages built for an incompatible "
+			                                  "version of R.", legacy_libloc));
+			label->setWordWrap (true);
+			layout->addWidget (label);
+			// D'uh. QRadioButton supports neither wordwrap nor formatting. Why?
+			QGroupBox *group = new QGroupBox (i18n ("What do you want to do?"));
+			QRadioButton *removebutton = new QRadioButton ();
+			QLabel *removelabel = new QLabel (i18n ("<b>Remove</b> this location from the configuration (it will not be deleted on disk). You will have to "
+			                                        "re-install any packages that you want to keep."));
+			removelabel->setWordWrap (true);
+			QRadioButton *renamebutton = new QRadioButton ();
+			QLabel *renamelabel = new QLabel (i18n ("<b>Rename</b> this location to include the version number of the currently running R. Packages will continue "
+			                                        "to work (if they are compatible with this version of R)."));
+			renamelabel->setWordWrap (true);
+			QRadioButton *keepbutton = new QRadioButton ();
+			QLabel *keeplabel = new QLabel (i18n ("<b>Keep</b> this location (do not change anything)."));
+			keeplabel->setWordWrap (true);
+			QGridLayout *group_layout = new QGridLayout (group);
+			group_layout->addWidget (removebutton, 0, 0);
+			group_layout->addWidget (removelabel, 0, 1);
+			group_layout->addWidget (renamebutton, 1, 0);
+			group_layout->addWidget (renamelabel, 1, 1);
+			group_layout->addWidget (keepbutton, 2, 0);
+			group_layout->addWidget (keeplabel, 2, 1);
+			group_layout->setColumnStretch (1, 1);
+			renamebutton->setChecked (true);
+			layout->addWidget (group);
+
+			page->setApplyCallback([keepbutton, renamebutton, legacy_libloc, &liblocs]() {
+				if (keepbutton->isChecked ()) return;
+
+				liblocs.removeAll (legacy_libloc);
+				if (renamebutton->isChecked ()) {
+					QString new_loc = legacy_libloc + '/' + RKSessionVars::RVersion (true);
+					RKGlobals::rInterface ()->issueCommand (QString ("file.rename(%1, %2)\n").arg (RObject::rQuote (legacy_libloc)).arg (RObject::rQuote (new_loc)), RCommand::App);
+					liblocs.prepend (legacy_libloc + QStringLiteral ("/%v"));
+				}
+
+				RKGlobals::rInterface ()->issueCommand (libLocsCommand(), RCommand::App);
+			});
+
+			pages->append (page);
+		}
+	}
+}
diff --git a/rkward/settings/rksettingsmoduler.h b/rkward/settings/rksettingsmoduler.h
index 224a442a..d3db9c16 100644
--- a/rkward/settings/rksettingsmoduler.h
+++ b/rkward/settings/rksettingsmoduler.h
@@ -39,13 +39,14 @@ class RKSettingsModuleR : public RKSettingsModule {
 public:
 	RKSettingsModuleR (RKSettings *gui, QWidget *parent);
 	~RKSettingsModuleR ();
-	
+
 	void applyChanges () override;
 	void save (KConfig *config) override;
-	
+
 	static void saveSettings (KConfig *config);
 	static void loadSettings (KConfig *config);
-	
+	static void validateSettingsInteractive (QList<RKSettingsWizardPage*>*) {};
+
 	QString caption () override;
 	
 /** generate the commands needed to set the R run time options */
@@ -106,12 +107,13 @@ class RKSettingsModuleRPackages : public RKSettingsModule, public RCommandReceiv
 public:
 	RKSettingsModuleRPackages (RKSettings *gui, QWidget *parent);
 	~RKSettingsModuleRPackages ();
-	
+
 	void applyChanges () override;
 	void save (KConfig *config) override;
-	
+
 	static void saveSettings (KConfig *config);
 	static void loadSettings (KConfig *config);
+	static void validateSettingsInteractive (QList<RKSettingsWizardPage*>*);
 
 /** generate the commands needed to set the R run time options */
 	static QStringList makeRRunTimeOptionCommands ();
diff --git a/rkward/settings/rksettingsmodulewatch.h b/rkward/settings/rksettingsmodulewatch.h
index 956c08ea..33603000 100644
--- a/rkward/settings/rksettingsmodulewatch.h
+++ b/rkward/settings/rksettingsmodulewatch.h
@@ -2,7 +2,7 @@
                           rksettingsmodulewatch  -  description
                              -------------------
     begin                : Thu Aug 26 2004
-    copyright            : (C) 2004 by Thomas Friedrichsmeier
+    copyright            : (C) 2004-2018 by Thomas Friedrichsmeier
     email                : thomas.friedrichsmeier at kdemail.net
  ***************************************************************************/
 
@@ -34,12 +34,12 @@ class RKSettingsModuleWatch : public RKSettingsModule
 Q_OBJECT
 public:
 	RKSettingsModuleWatch (RKSettings *gui, QWidget *parent);
-
 	~RKSettingsModuleWatch ();
-	
+
 	static void saveSettings (KConfig *config);
 	static void loadSettings (KConfig *config);
-	
+	static void validateSettingsInteractive (QList<RKSettingsWizardPage*>*) {};
+
 	void applyChanges () override;
 	void save (KConfig *config) override;
 	void validateGUI ();



More information about the rkward-tracker mailing list