Skip to content

Commit 2145695

Browse files
New dev module system (#5690)
* initial functional draft * add ugly name thing for now
1 parent d96a35d commit 2145695

File tree

10 files changed

+187
-28
lines changed

10 files changed

+187
-28
lines changed

Desktop/analysis/analyses.cpp

+1-2
Original file line numberDiff line numberDiff line change
@@ -298,8 +298,7 @@ void Analyses::removeAnalysesOfDynamicModule(Modules::DynamicModule * module)
298298

299299
void Analyses::refreshAnalysesOfDynamicModule(Modules::DynamicModule * module)
300300
{
301-
//Log::log() << "void Analyses::refreshAnalysesOfDynamicModule(" << module->toString() << ")" << std::endl;
302-
301+
Log::log() << "void Analyses::refreshAnalysesOfDynamicModule(" << module->toString() << ")" << std::endl;
303302

304303
for(auto & keyval : _analysisMap)
305304
if(keyval.second->dynamicModule() == module)

Desktop/components/JASP/Widgets/FileMenu/PrefsAdvanced.qml

+99-5
Original file line numberDiff line numberDiff line change
@@ -140,9 +140,6 @@ ScrollView
140140
KeyNavigation.tab: githubPatCustomToken
141141
}
142142

143-
144-
145-
146143
Item
147144
{
148145
id: githubPatCustomTokenItem
@@ -170,7 +167,7 @@ ScrollView
170167
text: preferencesModel.githubPatCustom
171168
onEditingFinished: preferencesModel.githubPatCustom = text
172169

173-
nextEl: generateMarkdown
170+
nextEl: directLibpathDevModEnabled
174171

175172
height: browseDeveloperFolderButton.height
176173
anchors
@@ -182,7 +179,7 @@ ScrollView
182179

183180
textInput.echoMode: TextInput.Password
184181

185-
KeyNavigation.tab: generateMarkdown
182+
KeyNavigation.tab: directLibpathDevModEnabled
186183
}
187184
}
188185

@@ -197,6 +194,103 @@ ScrollView
197194
KeyNavigation.tab: cleanModulesFolder
198195

199196
}
197+
198+
199+
CheckBox
200+
{
201+
id: directLibpathDevModEnabled
202+
label: qsTr("Enable direct libpath mode")
203+
checked: preferencesModel.directLibpathEnabled
204+
onCheckedChanged: preferencesModel.directLibpathEnabled = checked
205+
toolTip: qsTr("To use JASP Modules enable this option.")
206+
visible: preferencesModel.developerMode
207+
208+
KeyNavigation.tab: directLibpathFolder
209+
}
210+
211+
Item
212+
{
213+
id: directLibpath
214+
enabled: preferencesModel.directLibpathEnabled
215+
width: parent.width
216+
height: cranRepoUrl.height
217+
visible: preferencesModel.developerMode && preferencesModel.directLibpathEnabled
218+
219+
Label
220+
{
221+
id: directLibPathLabel
222+
text: qsTr("DevModule libpath:")
223+
224+
anchors
225+
{
226+
left: parent.left
227+
verticalCenter: parent.verticalCenter
228+
leftMargin: jaspTheme.subOptionOffset
229+
}
230+
}
231+
232+
PrefsTextInput
233+
{
234+
id: directLibpathFolder
235+
236+
text: preferencesModel.directLibpathFolder
237+
onEditingFinished: preferencesModel.directLibpathFolder = text
238+
239+
nextEl: moduleName
240+
241+
height: browseDeveloperFolderButton.height
242+
anchors
243+
{
244+
left: directLibPathLabel.right
245+
right: parent.right
246+
margins: jaspTheme.generalAnchorMargin
247+
}
248+
249+
KeyNavigation.tab: moduleName
250+
}
251+
}
252+
253+
Item {
254+
255+
id: directDevMod
256+
enabled: preferencesModel.directLibpathEnabled
257+
width: parent.width
258+
height: cranRepoUrl.height
259+
visible: preferencesModel.developerMode && preferencesModel.directLibpathEnabled
260+
261+
Label
262+
{
263+
id: directDevModName
264+
text: qsTr("Developer module name:")
265+
266+
anchors
267+
{
268+
left: parent.left
269+
verticalCenter: parent.verticalCenter
270+
leftMargin: jaspTheme.subOptionOffset
271+
}
272+
}
273+
274+
PrefsTextInput
275+
{
276+
id: moduleName
277+
278+
text: preferencesModel.directDevModName
279+
onEditingFinished: preferencesModel.directDevModName = text
280+
281+
nextEl: cleanModulesFolder
282+
283+
height: browseDeveloperFolderButton.height
284+
anchors
285+
{
286+
left: directDevModName.right
287+
right: parent.right
288+
margins: jaspTheme.generalAnchorMargin
289+
}
290+
291+
KeyNavigation.tab: cleanModulesFolder
292+
}
293+
}
200294

201295
RoundedButton
202296
{

Desktop/components/JASP/Widgets/ModulesMenu.qml

+1-1
Original file line numberDiff line numberDiff line change
@@ -219,7 +219,7 @@ FocusScope
219219
focus: currentIndex === -1
220220
activeFocusOnTab: false
221221

222-
readonly property bool folderSelected: preferencesModel.developerFolder != ""
222+
readonly property bool folderSelected: preferencesModel.developerFolder != "" || (preferencesModel.directLibpathEnabled && preferencesModel.directLibpathFolder != "")
223223
}
224224

225225
QTC.ToolSeparator

Desktop/gui/preferencesmodel.cpp.in

+16
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,10 @@ GET_PREF_FUNC_BOOL( checkUpdates, Settings::CHECK_UPDATES )
138138
GET_PREF_FUNC_INT( maxScaleLevels, Settings::MAX_SCALE_LEVELS )
139139
GET_PREF_FUNC_BOOL( pdfLandscape, Settings::PDF_LANDSCAPE )
140140
GET_PREF_FUNC_INT( pdfPageSize, Settings::PDF_PAGESIZE )
141+
GET_PREF_FUNC_BOOL( directLibpathEnabled, Settings::DIRECT_LIBPATH_ENABLED )
142+
GET_PREF_FUNC_STR( directLibpathFolder, Settings::DIRECT_LIBPATH_FOLDER )
143+
GET_PREF_FUNC_STR( directDevModName, Settings::DIRECT_DEVMOD_NAME )
144+
141145

142146
int PreferencesModel::maxEngines() const
143147
{
@@ -314,6 +318,9 @@ SET_PREF_FUNCTION( bool, setCheckUpdates, checkUpdates, checkUpdatesCha
314318
SET_PREF_FUNCTION( int, setMaxScaleLevels, maxScaleLevels, maxScaleLevelsChanged, Settings::MAX_SCALE_LEVELS )
315319
SET_PREF_FUNCTION( bool, setPdfLandscape, pdfLandscape, pdfLandscapeChanged, Settings::PDF_LANDSCAPE )
316320
SET_PREF_FUNCTION( int, setPdfPageSize, pdfPageSize, pdfPageSizeChanged, Settings::PDF_PAGESIZE )
321+
SET_PREF_FUNCTION( bool, setDirectLibpathEnabled, directLibpathEnabled, directLibpathEnabledChanged, Settings::DIRECT_LIBPATH_ENABLED )
322+
SET_PREF_FUNCTION( QString, setDirectDevModName, directDevModName, directDevModNameChanged, Settings::DIRECT_DEVMOD_NAME )
323+
317324

318325
void PreferencesModel::setGithubPatCustom(QString newPat)
319326
{
@@ -551,3 +558,12 @@ QStringList PreferencesModel::_splitValues(const QString &values) const
551558
return QStringList(orderedValues.begin(), orderedValues.end());
552559

553560
}
561+
562+
void PreferencesModel::setDirectLibpathFolder(QString libpath)
563+
{
564+
if (libpath != "")
565+
{
566+
Settings::setValue(Settings::DIRECT_LIBPATH_FOLDER, libpath);
567+
emit directLibpathFolderChanged();
568+
}
569+
}

Desktop/gui/preferencesmodel.h

+13-1
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,9 @@ class PreferencesModel : public PreferencesModelBase
2929
Q_PROPERTY(int defaultPPI READ defaultPPI WRITE setDefaultPPI NOTIFY defaultPPIChanged )
3030
Q_PROPERTY(bool developerMode READ developerMode WRITE setDeveloperMode NOTIFY developerModeChanged )
3131
Q_PROPERTY(QString developerFolder READ developerFolder WRITE setDeveloperFolder NOTIFY developerFolderChanged )
32+
Q_PROPERTY(bool directLibpathEnabled READ directLibpathEnabled WRITE setDirectLibpathEnabled NOTIFY directLibpathEnabledChanged )
33+
Q_PROPERTY(QString directLibpathFolder READ directLibpathFolder WRITE setDirectLibpathFolder NOTIFY directLibpathFolderChanged )
34+
Q_PROPERTY(QString directDevModName READ directDevModName WRITE setDirectDevModName NOTIFY directDevModNameChanged )
3235
Q_PROPERTY(int thresholdScale READ thresholdScale WRITE setThresholdScale NOTIFY thresholdScaleChanged )
3336
Q_PROPERTY(bool logToFile READ logToFile WRITE setLogToFile NOTIFY logToFileChanged )
3437
Q_PROPERTY(int logFilesMax READ logFilesMax WRITE setLogFilesMax NOTIFY logFilesMaxChanged )
@@ -146,7 +149,10 @@ class PreferencesModel : public PreferencesModelBase
146149
QVariantList pdfPageSizeModel() const { return _pdfPageSizeModel; }
147150
int pdfPageSize() const;
148151
bool pdfLandscape() const;
149-
152+
bool directLibpathEnabled() const;
153+
QString directLibpathFolder() const;
154+
QString directDevModName() const;
155+
150156
bool checkUpdatesAskUser() const;
151157
void setCheckUpdatesAskUser(bool newCheckUpdatesAskUser);
152158

@@ -213,6 +219,9 @@ public slots:
213219
void setMaxScaleLevels( int maxScaleLevels);
214220
void setPdfPageSize( int pdfPageSize);
215221
void setPdfLandscape( bool pdfLandscape);
222+
void setDirectLibpathEnabled( bool setDirectLibpathEnabled);
223+
void setDirectLibpathFolder( QString libpath);
224+
void setDirectDevModName( QString name);
216225

217226
signals:
218227
void fixedDecimalsChanged( bool fixedDecimals);
@@ -268,6 +277,9 @@ public slots:
268277
void maxScaleLevelsChanged( int maxScaleLevels);
269278
void pdfPageSizeChanged( int pdfPageSize);
270279
void pdfLandscapeChanged( bool pdfLandscape);
280+
void directLibpathEnabledChanged( bool directLibpathEnabled);
281+
void directLibpathFolderChanged();
282+
void directDevModNameChanged( QString name);
271283

272284
private slots:
273285
void dataLabelNAChangedSlot(QString label);

Desktop/modules/dynamicmodule.cpp

+19-2
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,24 @@ DynamicModule::DynamicModule(QObject * parent) : QObject(parent), _isDeveloperMo
100100
}
101101

102102

103+
///This constructor is meant specifically for the development module from a libpath *it*!
104+
DynamicModule::DynamicModule(QObject * parent, QString libpath) : QObject(parent), _isDeveloperMod(true), _isLibpathDevMod(true)
105+
{
106+
_modulePackage = fq(libpath + "/" + Settings::value(Settings::DIRECT_DEVMOD_NAME).toString() + "/");
107+
_moduleFolder = QFileInfo(libpath + "/");
108+
_name = extractPackageNameFromFolder(_modulePackage);
109+
110+
if(_name == "") _name = defaultDevelopmentModuleName();
111+
112+
Log::log() << "Development Module is constructed with name: '" << _name << "' and will intialized from libpath: " << _moduleFolder.absoluteFilePath().toStdString() << std::endl;
113+
114+
_developmentModuleName = _name;
115+
116+
loadDescriptionFromFolder(_modulePackage);
117+
setInstalled(true);
118+
}
119+
120+
103121
void DynamicModule::initialize()
104122
{
105123

@@ -112,7 +130,6 @@ void DynamicModule::initialize()
112130
// else if(!_moduleFolder.isWritable()) throw std::runtime_error(_moduleFolder.absolutePath().toStdString() + " is not writable!");
113131

114132
setInitialized(true);
115-
116133
auto checkForExistence = [&](std::string name, bool isFile = false)
117134
{
118135
QString modPath = _moduleFolder.absolutePath() + "/" + nameQ() + "/" + QString::fromStdString(name);
@@ -499,7 +516,7 @@ std::string DynamicModule::generateModuleUninstallingR()
499516
std::string DynamicModule::moduleInstFolder() const
500517
{
501518
//Because in a developer mod everything is loaded directly from the source folder we give an actual inst folder:
502-
if(_isDeveloperMod) return _modulePackage + "/inst";
519+
if(_isDeveloperMod && !_isLibpathDevMod) return _modulePackage + "/inst";
503520
//But after install this is in a R-library and therefore there is no more inst folder:
504521
else return moduleRLibrary().toStdString() + "/" + _name + "/";
505522
}

Desktop/modules/dynamicmodule.h

+6
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,10 @@ class DynamicModule : public QObject
7878
///This constructor is meant specifically for the development module and only *it*!
7979
explicit DynamicModule(QObject * parent);
8080

81+
///This constructor is meant specifically for development modules initialized form a libpaths
82+
explicit DynamicModule(QObject *parent, QString libpath);
83+
84+
8185
~DynamicModule() override
8286
{
8387
for(auto * entry : _menuEntries)
@@ -165,6 +169,7 @@ class DynamicModule : public QObject
165169
bool installing() const { return _installing; }
166170
bool initialized() const { return _initialized; }
167171
bool isBundled() const { return _bundled; }
172+
bool isLibpathDevMod() const { return _isLibpathDevMod; }
168173

169174
void initialize();
170175
void loadDescriptionQml(const QString & descriptionTxt, const QUrl & url);
@@ -242,6 +247,7 @@ public slots:
242247
bool _installing = false,
243248
_installed = false,
244249
_isDeveloperMod = false,
250+
_isLibpathDevMod = false,
245251
_initialized = false,
246252
_bundled = false,
247253
_isCommon = false,

Desktop/modules/dynamicmodules.cpp

+24-15
Original file line numberDiff line numberDiff line change
@@ -299,7 +299,7 @@ void DynamicModules::uninstallModule(const std::string & moduleName)
299299
unloadModule(moduleName);
300300
_modules[moduleName]->setInstalled(false);
301301

302-
if(_modules[moduleName]->isBundled())
302+
if(_modules[moduleName]->isBundled() || _modules[moduleName]->isLibpathDevMod())
303303
removeFolder = false;
304304

305305
for(int i=int(_moduleNames.size()) - 1; i>=0; i--)
@@ -530,27 +530,24 @@ void DynamicModules::uninstallJASPDeveloperModule()
530530

531531
void DynamicModules::installJASPDeveloperModule()
532532
{
533-
if(Settings::value(Settings::DEVELOPER_FOLDER).toString() == "")
533+
bool directLibpathEnabled = PreferencesModel::prefs()->directLibpathEnabled();
534+
QString modulePath = directLibpathEnabled ? PreferencesModel::prefs()->directLibpathFolder() : Settings::value(Settings::DEVELOPER_FOLDER).toString();
535+
if(modulePath == "")
534536
{
535537
MessageForwarder::showWarning(tr("Select a folder"), tr("To install a development module you need to select the folder you want to watch and load, you can do this under the filemenu, Preferences->Advanced."));
536538
return;
537539
}
538-
else if(!QDir(Settings::value(Settings::DEVELOPER_FOLDER).toString()).exists())
540+
else if(!QDir(modulePath).exists())
539541
{
540-
MessageForwarder::showWarning(tr("Select an exisiting folder"), tr("To install a development module you need to select and existing folder, you selected '$1' but it doesn't exist.").arg(Settings::value(Settings::DEVELOPER_FOLDER).toString()));
542+
MessageForwarder::showWarning(tr("Select an exisiting folder"), tr("To install a development module you need to select and existing folder, you selected '$1' but it doesn't exist.").arg(modulePath));
541543
return;
542544
}
543545

544546
setDevelopersModuleInstallButtonEnabled(false);
545547

546548
try
547549
{
548-
549-
_devModSourceDirectory = QDir(Settings::value(Settings::DEVELOPER_FOLDER).toString());
550-
551-
DynamicModule * devMod = new DynamicModule(this);
552-
553-
devMod->loadDescriptionFromFolder(fq(_devModSourceDirectory.absolutePath()));
550+
DynamicModule * devMod = directLibpathEnabled ? new DynamicModule(this, modulePath) : new DynamicModule(this);
554551

555552
std::string origin = devMod->modulePackage(),
556553
name = devMod->name(),
@@ -563,11 +560,14 @@ void DynamicModules::installJASPDeveloperModule()
563560
else if(_modules.count(name) > 0 && _modules[name] != devMod)
564561
replaceModule(devMod);
565562

566-
DynamicModule::developmentModuleFolderCreate();
567-
568563
_modules[name] = devMod;
569-
570-
registerForInstalling(name);
564+
if(directLibpathEnabled) {
565+
initializeModule(devMod);
566+
}
567+
else {
568+
DynamicModule::developmentModuleFolderCreate();
569+
registerForInstalling(name);
570+
}
571571
}
572572
catch(ModuleException & e)
573573
{
@@ -603,8 +603,14 @@ void DynamicModules::startWatchingDevelopersModule()
603603
if(dir == "icons") iconsFound = true;
604604
}
605605
}
606+
else if(entry.isDir() && entry.fileName().toLower() == "qml")
607+
qmlFound = true;
608+
else if(entry.isDir() && entry.fileName().toLower() == "icons")
609+
iconsFound = true;
606610
else if(entry.isDir() && entry.fileName().toUpper() == "R")
607611
rFound = true;
612+
else if(entry.isFile() && DynamicModule::isDescriptionFile(entry.fileName()))
613+
descFound = entry.fileName();
608614

609615
if(!(descFound != "" && rFound && qmlFound && iconsFound))
610616
{
@@ -756,7 +762,10 @@ void DynamicModules::regenerateDeveloperModuleRPackage()
756762
throw std::runtime_error("void DynamicModules::regenerateDeveloperModuleRPackage() called but the development module is not initialized...");
757763

758764
auto * devMod = _modules[developmentModuleName()];
759-
devMod->setStatus(moduleStatus::installModPkgNeeded);
765+
if(devMod->isLibpathDevMod())
766+
emit dynamicModuleChanged(devMod);
767+
else
768+
devMod->setStatus(moduleStatus::installModPkgNeeded);
760769
}
761770

762771
QString DynamicModules::moduleDirectoryQ(const QString & moduleName) const

Desktop/utilities/settings.cpp

+4-1
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,10 @@ const Settings::Setting Settings::Values[] = {
9595
{"checkUpdatesLastTime", -1 },
9696
{"maxScaleLevels", 100 },
9797
{"pdfLandscape", false },
98-
{"pdfPageSize", int(pdfPageSize::A4) }
98+
{"pdfPageSize", int(pdfPageSize::A4) },
99+
{"directLibpathEnabled", false },
100+
{"directLibpathFolder", "" },
101+
{"directDevModName", "" }
99102

100103
};
101104

0 commit comments

Comments
 (0)