diff --git a/Desktop/components/JASP/Widgets/FileMenu/PrefsUI.qml b/Desktop/components/JASP/Widgets/FileMenu/PrefsUI.qml index c098fce329..83d57d42f7 100644 --- a/Desktop/components/JASP/Widgets/FileMenu/PrefsUI.qml +++ b/Desktop/components/JASP/Widgets/FileMenu/PrefsUI.qml @@ -222,7 +222,35 @@ PrefsScrollView KeyNavigation.tab: uiScaleSpinBox } + } + + PrefsGroupRect + { + title: qsTr("Onboarding") + + CheckBox + { + id: showOnboardingCheckbox + label: qsTr("Show onboarding tour on next start") + checked: !preferencesModel.onboardingCompleted + onCheckedChanged: + { + preferencesModel.onboardingStep = 0 + preferencesModel.onboardingCompleted = !checked + } + toolTip: qsTr("Enable this to see the guided tour again the next time JASP starts.") + + KeyNavigation.tab: startTutorialButton + } + RoundedButton + { + id: startTutorialButton + text: qsTr("Start tutorial") + onClicked: mainWindowRoot.startTutorial() + activeFocusOnTab: true + KeyNavigation.tab: uiScaleSpinBox + } } PrefsGroupRect diff --git a/Desktop/components/JASP/Widgets/MainWindow.qml b/Desktop/components/JASP/Widgets/MainWindow.qml index ae30308ba7..5ba15952e8 100644 --- a/Desktop/components/JASP/Widgets/MainWindow.qml +++ b/Desktop/components/JASP/Widgets/MainWindow.qml @@ -55,6 +55,11 @@ Window mainWindow.closeWindows(); } + function startTutorial() + { + onboardingOverlay.start(preferencesModel.onboardingStep) + } + function toggleFullScreen() { mainWindowRoot.visibility = mainWindowRoot.visibility === Window.FullScreen ? Window.Windowed : Window.FullScreen; @@ -344,5 +349,47 @@ Window onClicked: mainWindow.toggleChat() } } + + Tutorial + { + id: onboardingOverlay + z: 1000 + + steps: + [ + { + target: ribbon, + title: qsTr("Data and Analysis Section"), + text: qsTr("This is the main entry point for the Data and Analysis menu."), + placement: "bottom" + }, + { + target: filemenu, + title: qsTr("File Menu and Preferences"), + text: qsTr("Clicking the hamburger button in the upper left corner opens/closes this file menu and preferences interface, used to open and save files, and to configure JASP global preferences."), + placement: "right", + onEnter: function() { fileMenuModel.visible = true; }, + onExit: function() { fileMenuModel.visible = false; } + }, + { + target: modulesMenu, + title: qsTr("Modules library"), + text: qsTr("This is where you can manage analytics modules. In the list on the far right of this area, you can enable/disable installed modules, and you can also manage all available modules from the online modules store on the left."), + placement: "left", + onEnter: function() { modulesMenu.opened = true; }, + onExit: function() { modulesMenu.opened = false; } + }, + { + target: chatToggleButton, + title: qsTr("AI Assistant"), + text: qsTr("Click the robot icon here or press Ctrl+J to bring up the AI chat panel.Detailed AI settings can be found in the preferences menu."), + placement: "top" + } + ] + } + + Component.onCompleted: + if (!preferencesModel.onboardingCompleted) + startTutorial() } diff --git a/Desktop/components/JASP/Widgets/Tutorial.qml b/Desktop/components/JASP/Widgets/Tutorial.qml new file mode 100644 index 0000000000..f251e1c00d --- /dev/null +++ b/Desktop/components/JASP/Widgets/Tutorial.qml @@ -0,0 +1,270 @@ +import QtQuick +import JASP.Controls +Item +{ + id: onboardingOverlay + + property var steps: [] + property int currentIndex: -1 + property bool active: false + + readonly property var currentStep: (currentIndex >= 0 && currentIndex < steps.length) ? steps[currentIndex] : null + readonly property bool lastStep: currentIndex === steps.length - 1 + + anchors.fill: parent + z: 1000 + visible: active && currentStep && currentStep.target && currentStep.target.width > 0 && currentStep.target.height > 0 + + + function start(fromStep) + { + if (steps.length === 0) + return; + + active = true; + _goToStep(fromStep !== undefined ? fromStep : 0); + } + + function _runStepCallback(index, callbackName) + { + if (index >= 0 && index < steps.length && steps[index][callbackName]) + steps[index][callbackName](); + } + + function _goToStep(index) + { + _runStepCallback(currentIndex, "onExit"); + currentIndex = index; + _runStepCallback(currentIndex, "onEnter"); + } + + function next() + { + if (lastStep) + finish(); + else + { + _goToStep(currentIndex + 1); + preferencesModel.onboardingStep = currentIndex; + } + } + + function previous() + { + if (currentIndex <= 0) + return; + _goToStep(currentIndex - 1); + preferencesModel.onboardingStep = currentIndex; + } + + function finish() + { + _runStepCallback(currentIndex, "onExit"); + active = false; + currentIndex = -1; + + preferencesModel.onboardingCompleted = true; + preferencesModel.onboardingStep = 0; + + } + + property rect targetRect: + { + if (!currentStep || !currentStep.target || currentStep.target.width <= 0 || currentStep.target.height <= 0) + return Qt.rect(0, 0, 0, 0); + + var t = currentStep.target; + var dummy = t.x + t.y + t.width + t.height + onboardingOverlay.width + onboardingOverlay.height; + var pt = t.mapToItem(onboardingOverlay, 0, 0); + + if (isNaN(pt.x) || isNaN(pt.y)) + return Qt.rect(0, 0, 0, 0); + + return Qt.rect(pt.x, pt.y, t.width, t.height); + } + + Rectangle + { + color: "#000000" + opacity: 0.8 + x: 0 + y: 0 + width: parent.width + height: Math.max(0, targetRect.y) + } + + Rectangle + { + color: "#000000" + opacity: 0.8 + x: 0 + y: Math.max(0, targetRect.y + targetRect.height) + width: parent.width + height: Math.max(0, parent.height - (targetRect.y + targetRect.height)) + } + + Rectangle + { + color: "#000000" + opacity: 0.8 + x: 0 + y: Math.max(0, targetRect.y) + width: Math.max(0, targetRect.x); height: Math.max(0, targetRect.height) + } + + Rectangle + { + color: "#000000" + opacity: 0.8 + x: Math.max(0, targetRect.x + targetRect.width) + y: Math.max(0, targetRect.y) + width: Math.max(0, parent.width - (targetRect.x + targetRect.width)) + height: Math.max(0, targetRect.height) + } + + Rectangle + { + x: targetRect.x + y: targetRect.y + width: targetRect.width + height: targetRect.height + color: jaspTheme.blue + opacity: 0.1 + + Behavior on x { enabled: preferencesModel.animationsOn; NumberAnimation { duration: 200 } } + Behavior on y { enabled: preferencesModel.animationsOn; NumberAnimation { duration: 200 } } + Behavior on width { enabled: preferencesModel.animationsOn; NumberAnimation { duration: 200 } } + Behavior on height { enabled: preferencesModel.animationsOn; NumberAnimation { duration: 200 } } + } + + Rectangle + { + x: targetRect.x - 4 + y: targetRect.y - 4 + width: Math.max(0, targetRect.width + 8) + height: Math.max(0, targetRect.height + 8) + radius: 4 + color: "transparent" + border.width: 2 + border.color: jaspTheme.blue + + Behavior on x { enabled: preferencesModel.animationsOn; NumberAnimation { duration: 200 } } + Behavior on y { enabled: preferencesModel.animationsOn; NumberAnimation { duration: 200 } } + Behavior on width { enabled: preferencesModel.animationsOn; NumberAnimation { duration: 200 } } + Behavior on height { enabled: preferencesModel.animationsOn; NumberAnimation { duration: 200 } } + } + + MouseArea { anchors.fill: parent } + + Rectangle + { + id: callout + width: 320 + height: calloutColumn.implicitHeight + 24 + radius: 6 + color: jaspTheme.white + border.width: 1 + border.color: jaspTheme.borderColor + + readonly property string placement: currentStep && currentStep.placement ? currentStep.placement : "bottom" + + x: + { + switch (placement) + { + case "right": return Math.min(targetRect.x + targetRect.width + 12, onboardingOverlay.width - width - 8); + case "left": return Math.max(8, targetRect.x - width - 12); + default: return Math.min(Math.max(targetRect.x, 8), onboardingOverlay.width - width - 8); + } + } + + y: + { + switch (placement) + { + case "left": + case "right": return Math.min(Math.max(targetRect.y, 8), onboardingOverlay.height - height - 8); + case "top": return Math.max(8, targetRect.y - height - 12); + default: + return (targetRect.y + targetRect.height + height + 12 <= onboardingOverlay.height) + ? targetRect.y + targetRect.height + 12 + : Math.max(8, targetRect.y - height - 12); + } + } + + + Behavior on x { enabled: preferencesModel.animationsOn; NumberAnimation { duration: 200 } } + Behavior on y { enabled: preferencesModel.animationsOn; NumberAnimation { duration: 200 } } + + Column + { + id: calloutColumn + anchors.fill: parent + anchors.margins: 12 + spacing: 8 + + Text + { + width: parent.width + text: qsTr("Getting Started") + font.bold: true + font.pixelSize: 16 + color: jaspTheme.textEnabled + wrapMode: Text.WordWrap + } + + Text + { + width: parent.width + text: currentStep ? currentStep.title : "" + font.bold: true + font.pixelSize: 14 + color: jaspTheme.textEnabled + wrapMode: Text.WordWrap + } + + Text + { + width: parent.width + text: currentStep ? currentStep.text : "" + font.pixelSize: 12 + color: jaspTheme.textEnabled + wrapMode: Text.WordWrap + } + + Text + { + text: "" + (onboardingOverlay.currentIndex + 1) + "/" + onboardingOverlay.steps.length + font.pixelSize: 11 + color: jaspTheme.textDisabled + } + + Row + { + width: parent.width + spacing: 8 + layoutDirection: Qt.RightToLeft + + Button + { + text: onboardingOverlay.lastStep ? qsTr("Finish") : qsTr("Next") + onClicked: onboardingOverlay.next() + } + + Button + { + visible: onboardingOverlay.currentIndex > 0 + text: qsTr("Previous") + onClicked: onboardingOverlay.previous() + } + + Button + { + text: qsTr("Skip the Tutorial") + onClicked: onboardingOverlay.finish() + visible: !onboardingOverlay.lastStep + } + } + } + } +} diff --git a/Desktop/gui/preferencesmodel.cpp b/Desktop/gui/preferencesmodel.cpp index c970c37300..7101a31cea 100644 --- a/Desktop/gui/preferencesmodel.cpp +++ b/Desktop/gui/preferencesmodel.cpp @@ -19,41 +19,41 @@ using namespace std; PreferencesModel::PreferencesModel(QObject *parent) : - PreferencesModelBase(parent) + PreferencesModelBase(parent) { connect(this, &PreferencesModel::useDefaultPPIChanged, this, &PreferencesModel::onUseDefaultPPIChanged ); connect(this, &PreferencesModel::defaultPPIChanged, this, &PreferencesModel::onDefaultPPIChanged ); - connect(this, &PreferencesModel::customPPIChanged, this, &PreferencesModel::onCustomPPIChanged ); - connect(this, &PreferencesModel::useDefaultPPIChanged, this, &PreferencesModel::plotPPIPropChanged ); - connect(this, &PreferencesModel::defaultPPIChanged, this, &PreferencesModel::plotPPIPropChanged ); - connect(this, &PreferencesModel::customPPIChanged, this, &PreferencesModel::plotPPIPropChanged ); - connect(this, &PreferencesModel::plotBackgroundChanged, this, &PreferencesModel::whiteBackgroundChanged ); - connect(this, &PreferencesModel::modulesRememberChanged, this, &PreferencesModel::resetRememberedModules ); - connect(this, &PreferencesModel::currentThemeReady, this, &PreferencesModel::currentJaspThemeChanged, Qt::QueuedConnection); - connect(this, &PreferencesModel::safeGraphicsChanged, this, &PreferencesModel::animationsOnChanged ); // So animationsOn *might* not be changed, but it doesnt matter - connect(this, &PreferencesModel::disableAnimationsChanged, this, &PreferencesModel::animationsOnChanged ); - connect(this, &PreferencesModel::dataLabelNAChanged, this, &PreferencesModel::dataLabelNAChangedSlot ); - connect(this, &PreferencesModel::guiQtTextRenderChanged, this, &PreferencesModel::onGuiQtTextRenderChanged, Qt::QueuedConnection); - connect(this, &PreferencesModel::developerModeChanged, this, [&](){ this->setEngineSandbox(!this->developerMode()); } ); - - connect(LanguageModel::lang(), &LanguageModel::currentLanguageChanged, this, &PreferencesModel::languageCodeChanged ); - - _loadDatabaseFont(); - - for(auto pdfPageSizeElt : pdfPageSizeToVector()) - { - QMap map = - { - std::make_pair("value", int(pdfPageSizeElt)), - std::make_pair("label", pdfPageSizeToQString(pdfPageSizeElt)), - }; - - _pdfPageSizeModel.append(map); - } - - dataLabelNAChangedSlot(dataLabelNA()); - - _aiPersonaModel = new AIPersonaModel(this); + connect(this, &PreferencesModel::customPPIChanged, this, &PreferencesModel::onCustomPPIChanged ); + connect(this, &PreferencesModel::useDefaultPPIChanged, this, &PreferencesModel::plotPPIPropChanged ); + connect(this, &PreferencesModel::defaultPPIChanged, this, &PreferencesModel::plotPPIPropChanged ); + connect(this, &PreferencesModel::customPPIChanged, this, &PreferencesModel::plotPPIPropChanged ); + connect(this, &PreferencesModel::plotBackgroundChanged, this, &PreferencesModel::whiteBackgroundChanged ); + connect(this, &PreferencesModel::modulesRememberChanged, this, &PreferencesModel::resetRememberedModules ); + connect(this, &PreferencesModel::currentThemeReady, this, &PreferencesModel::currentJaspThemeChanged, Qt::QueuedConnection); + connect(this, &PreferencesModel::safeGraphicsChanged, this, &PreferencesModel::animationsOnChanged ); // So animationsOn *might* not be changed, but it doesnt matter + connect(this, &PreferencesModel::disableAnimationsChanged, this, &PreferencesModel::animationsOnChanged ); + connect(this, &PreferencesModel::dataLabelNAChanged, this, &PreferencesModel::dataLabelNAChangedSlot ); + connect(this, &PreferencesModel::guiQtTextRenderChanged, this, &PreferencesModel::onGuiQtTextRenderChanged, Qt::QueuedConnection); + connect(this, &PreferencesModel::developerModeChanged, this, [&](){ this->setEngineSandbox(!this->developerMode()); } ); + + connect(LanguageModel::lang(), &LanguageModel::currentLanguageChanged, this, &PreferencesModel::languageCodeChanged ); + + _loadDatabaseFont(); + + for(auto pdfPageSizeElt : pdfPageSizeToVector()) + { + QMap map = + { + std::make_pair("value", int(pdfPageSizeElt)), + std::make_pair("label", pdfPageSizeToQString(pdfPageSizeElt)), + }; + + _pdfPageSizeModel.append(map); + } + + dataLabelNAChangedSlot(dataLabelNA()); + + _aiPersonaModel = new AIPersonaModel(this); } AIPersonaModel* PreferencesModel::aiPersonaModel() const { return _aiPersonaModel; } @@ -62,82 +62,82 @@ AIConfigModel* PreferencesModel::aiConfigModel() const { return AIConfigModel::c void PreferencesModel::browseSpreadsheetEditor() { - - QString filter = "File Description (*.*)"; - QString applicationfolder; + + QString filter = "File Description (*.*)"; + QString applicationfolder; #ifdef _WIN32 - applicationfolder = "c:\\Program Files"; + applicationfolder = "c:\\Program Files"; #elif __APPLE__ - applicationfolder = "/Applications"; + applicationfolder = "/Applications"; #else - applicationfolder = "/usr/bin"; + applicationfolder = "/usr/bin"; #endif - - QString filename = MessageForwarder::browseOpenFile(tr("Select a file..."), applicationfolder, filter); - - if (filename != "") - setCustomEditor(filename); - + + QString filename = MessageForwarder::browseOpenFile(tr("Select a file..."), applicationfolder, filter); + + if (filename != "") + setCustomEditor(filename); + } void PreferencesModel::browseDeveloperFolder() { - QString defaultfolder = developerFolder(); - if (defaultfolder.isEmpty()) - { + QString defaultfolder = developerFolder(); + if (defaultfolder.isEmpty()) + { #ifdef _WIN32 - defaultfolder = "c:\\"; + defaultfolder = "c:\\"; #else - defaultfolder = "~"; + defaultfolder = "~"; #endif - } - - QString folder = MessageForwarder::browseOpenFolder(tr("Select a folder..."), defaultfolder); - - if (!folder.isEmpty()) - setDeveloperFolder(folder); + } + + QString folder = MessageForwarder::browseOpenFolder(tr("Select a folder..."), defaultfolder); + + if (!folder.isEmpty()) + setDeveloperFolder(folder); } void PreferencesModel::browseDeveloperLibPathFolder() { - QString defaultfolder = directLibpathFolder(); - if (defaultfolder.isEmpty()) - { + QString defaultfolder = directLibpathFolder(); + if (defaultfolder.isEmpty()) + { #ifdef _WIN32 - defaultfolder = "c:\\"; + defaultfolder = "c:\\"; #else - defaultfolder = "~"; + defaultfolder = "~"; #endif - } - - QString folder = MessageForwarder::browseOpenFolder(tr("Select a R-library..."), defaultfolder); - - if (!folder.isEmpty()) - setDirectLibpathFolder(folder); + } + + QString folder = MessageForwarder::browseOpenFolder(tr("Select a R-library..."), defaultfolder); + + if (!folder.isEmpty()) + setDirectLibpathFolder(folder); } void PreferencesModel::browseConfigurationFile() { - QString defaultfolder = JASPConfiguration::getInstance()->getDefaultConfigurationPath(); - if (defaultfolder.isEmpty()) - { + QString defaultfolder = JASPConfiguration::getInstance()->getDefaultConfigurationPath(); + if (defaultfolder.isEmpty()) + { #ifdef _WIN32 - defaultfolder = "c:\\"; + defaultfolder = "c:\\"; #else - defaultfolder = "~"; + defaultfolder = "~"; #endif - } - - QString folder = MessageForwarder::browseOpenFile(tr("Select a file..."), defaultfolder, ""); - - if (!folder.isEmpty()) - { - setLocalConfigurationPATH(folder); - JASPConfiguration::getInstance()->processConfiguration(); - } - + } + + QString folder = MessageForwarder::browseOpenFile(tr("Select a file..."), defaultfolder, ""); + + if (!folder.isEmpty()) + { + setLocalConfigurationPATH(folder); + JASPConfiguration::getInstance()->processConfiguration(); + } + } @@ -208,11 +208,13 @@ GET_PREF_FUNC_BOOL( showInteractiveDefault, Settings::SHOW_INTERACTIVE_DEFAULT GET_PREF_FUNC_BOOL( autoSaveAtAll, Settings::AUTOSAVE_ON ) GET_PREF_FUNC_INT( autoSaveIntervalSec, Settings::AUTOSAVE_INTERVAL_SEC ) GET_PREF_FUNC_STR( aiCommonSystemPrompt, Settings::AI_COMMON_SYSTEM_PROMPT ) - GET_PREF_FUNC_BOOL( aiCommonSystemPromptUseCustom, Settings::AI_COMMON_SYSTEM_PROMPT_USE_CUSTOM ) - GET_PREF_FUNC_BOOL( aiAnnotationUseCustom, Settings::AI_ANNOTATION_USE_CUSTOM ) - GET_PREF_FUNC_STR( aiAnnotationPrompt, Settings::AI_ANNOTATION_PROMPT ) - GET_PREF_FUNC_STR( aiUserAvatar, Settings::AI_USER_AVATAR ) - GET_PREF_FUNC_BOOL( aiEnabled, Settings::AI_ENABLED ) +GET_PREF_FUNC_BOOL( aiCommonSystemPromptUseCustom, Settings::AI_COMMON_SYSTEM_PROMPT_USE_CUSTOM ) +GET_PREF_FUNC_BOOL( aiAnnotationUseCustom, Settings::AI_ANNOTATION_USE_CUSTOM ) +GET_PREF_FUNC_STR( aiAnnotationPrompt, Settings::AI_ANNOTATION_PROMPT ) +GET_PREF_FUNC_STR( aiUserAvatar, Settings::AI_USER_AVATAR ) +GET_PREF_FUNC_BOOL( aiEnabled, Settings::AI_ENABLED ) +GET_PREF_FUNC_BOOL( onboardingCompleted, Settings::ONBOARDING_COMPLETED ) +GET_PREF_FUNC_INT( onboardingStep, Settings::ONBOARDING_STEP ) GET_PREF_FUNC_BOOL( rpcServerEnabled, Settings::RPC_SERVER_ENABLED ) GET_PREF_FUNC_STR( rpcServerIp, Settings::RPC_SERVER_IP ) @@ -221,9 +223,9 @@ GET_PREF_FUNC_INT( rpcServerPort, Settings::RPC_SERVER_PORT ) bool PreferencesModel::engineSandbox() const { #ifdef _WIN32 - return Settings::value(Settings::ENGINE_SANDBOX).toBool(); + return Settings::value(Settings::ENGINE_SANDBOX).toBool(); #else - return false; + return false; #endif } @@ -231,150 +233,150 @@ bool PreferencesModel::engineSandbox() const int PreferencesModel::maxEngines() const { - int maxEngines = Settings::value(Settings::MAX_ENGINE_COUNT).toInt(); - - if(maxEnginesAdmin() > 0) return std::min(maxEngines, maxEnginesAdmin()); - else return maxEngines; - + int maxEngines = Settings::value(Settings::MAX_ENGINE_COUNT).toInt(); + + if(maxEnginesAdmin() > 0) return std::min(maxEngines, maxEnginesAdmin()); + else return maxEngines; + } QString PreferencesModel::githubPatCustom() const { - return decrypt(Settings::value(Settings::GITHUB_PAT_CUSTOM).toString()); + return decrypt(Settings::value(Settings::GITHUB_PAT_CUSTOM).toString()); } double PreferencesModel::uiScale() { - if (_uiScale < 0) - _uiScale = Settings::value(Settings::UI_SCALE).toDouble(); - return _uiScale; + if (_uiScale < 0) + _uiScale = Settings::value(Settings::UI_SCALE).toDouble(); + return _uiScale; } QStringList PreferencesModel::emptyValues() const { - return _splitValues(Settings::value(Settings::EMPTY_VALUES_LIST).toString()); + return _splitValues(Settings::value(Settings::EMPTY_VALUES_LIST).toString()); } QStringList PreferencesModel::modulesRemembered() const { - QStringList items = Settings::value(Settings::MODULES_REMEMBERED).toString().split("|"); - - return items; + QStringList items = Settings::value(Settings::MODULES_REMEMBERED).toString().split("|"); + + return items; } void PreferencesModel::moduleEnabledChanged(QString moduleName, bool enabled) { - QStringList list = modulesRemembered(); - - if(list.contains(moduleName) != enabled) - { - if(enabled) list.append(moduleName); - else list.removeAll(moduleName); - } - - setModulesRemembered(list); + QStringList list = modulesRemembered(); + + if(list.contains(moduleName) != enabled) + { + if(enabled) list.append(moduleName); + else list.removeAll(moduleName); + } + + setModulesRemembered(list); } QString PreferencesModel::languageCode() const { - return LanguageModel::lang()->currentLanguageCode(); + return LanguageModel::lang()->currentLanguageCode(); } bool PreferencesModel::useThousandSeparators() const { - return LanguageModel::lang()->useThousandSeps(); + return LanguageModel::lang()->useThousandSeps(); } const QLocale & PreferencesModel::localeQt() const { - return LanguageModel::lang()->currentLocale(); + return LanguageModel::lang()->currentLocale(); } QString PreferencesModel::githubPatResolved() const { - if(githubPatUseDefault()) - return QProcessEnvironment::systemEnvironment().value("GITHUB_PAT", GITHUB_PAT_DEFINED); - - return githubPatCustom(); + if(githubPatUseDefault()) + return QProcessEnvironment::systemEnvironment().value("GITHUB_PAT", GITHUB_PAT_DEFINED); + + return githubPatCustom(); } QString PreferencesModel::fixedDecimalsForJS() const { - if(!fixedDecimals()) - return "\"\""; - - return QString::fromStdString(std::to_string(numDecimals())); + if(!fixedDecimals()) + return "\"\""; + + return QString::fromStdString(std::to_string(numDecimals())); } void PreferencesModel::setFixedDecimals(bool newFixedDecimals) { - if (fixedDecimals() == newFixedDecimals) - return; - - Settings::setValue(Settings::FIXED_DECIMALS, newFixedDecimals); - - emit fixedDecimalsChanged(newFixedDecimals); - emit fixedDecimalsChangedString(fixedDecimalsForJS()); + if (fixedDecimals() == newFixedDecimals) + return; + + Settings::setValue(Settings::FIXED_DECIMALS, newFixedDecimals); + + emit fixedDecimalsChanged(newFixedDecimals); + emit fixedDecimalsChangedString(fixedDecimalsForJS()); } void PreferencesModel::setNumDecimals(int newNumDecimals) { - if (numDecimals() == newNumDecimals) - return; - - Settings::setValue(Settings::NUM_DECIMALS, newNumDecimals); - - emit numDecimalsChanged(newNumDecimals); - - if(fixedDecimals()) - emit fixedDecimalsChangedString(fixedDecimalsForJS()); + if (numDecimals() == newNumDecimals) + return; + + Settings::setValue(Settings::NUM_DECIMALS, newNumDecimals); + + emit numDecimalsChanged(newNumDecimals); + + if(fixedDecimals()) + emit fixedDecimalsChangedString(fixedDecimalsForJS()); } void PreferencesModel::onUseDefaultPPIChanged(bool ) { - if(customPPI() != defaultPPI()) - emit plotPPIChanged(plotPPI(), true); + if(customPPI() != defaultPPI()) + emit plotPPIChanged(plotPPI(), true); } void PreferencesModel::onCustomPPIChanged(int) { - if(!useDefaultPPI()) - emit plotPPIChanged(plotPPI(), true); + if(!useDefaultPPI()) + emit plotPPIChanged(plotPPI(), true); } void PreferencesModel::onDefaultPPIChanged(int) { - - if(useDefaultPPI()) - emit plotPPIChanged(plotPPI(), false); + + if(useDefaultPPI()) + emit plotPPIChanged(plotPPI(), false); } #define SET_PREF_FUNCTION(TYPE, FUNC_NAME, GET_FUNC, NOTIFY, SETTING) \ void PreferencesModel::FUNC_NAME(TYPE newVal) \ { \ - if(GET_FUNC() == newVal) return; \ - Settings::setValue(SETTING, newVal); \ - emit NOTIFY(newVal); \ + if(GET_FUNC() == newVal) return; \ + Settings::setValue(SETTING, newVal); \ + emit NOTIFY(newVal); \ } #define SET_PREF_FUNCTION_EMIT_NO_ARG(TYPE, FUNC_NAME, GET_FUNC, NOTIFY, SETTING) \ void PreferencesModel::FUNC_NAME(TYPE newVal) \ { \ - if(GET_FUNC() == newVal) return; \ - Settings::setValue(SETTING, newVal); \ - emit NOTIFY(); \ + if(GET_FUNC() == newVal) return; \ + Settings::setValue(SETTING, newVal); \ + emit NOTIFY(); \ } void PreferencesModel::setCurrentThemeName(QString _currentThemeName) { - if (currentThemeName() == _currentThemeName) return; - - Settings::setValue(Settings::THEME_NAME, _currentThemeName); - JaspTheme::setCurrentThemeFromName(_currentThemeName); - - emit currentThemeNameChanged(_currentThemeName); + if (currentThemeName() == _currentThemeName) return; + + Settings::setValue(Settings::THEME_NAME, _currentThemeName); + JaspTheme::setCurrentThemeFromName(_currentThemeName); + + emit currentThemeNameChanged(_currentThemeName); } SET_PREF_FUNCTION( bool, setExactPValues, exactPValues, exactPValuesChanged, Settings::EXACT_PVALUES ) @@ -429,11 +431,13 @@ SET_PREF_FUNCTION( bool, setShowInteractiveDefault, showInteractiveDefault SET_PREF_FUNCTION( bool, setAutoSaveAtAll, autoSaveAtAll, autoSaveAtAllChanged, Settings::AUTOSAVE_ON ) SET_PREF_FUNCTION( int, setAutoSaveIntervalSec, autoSaveIntervalSec, autoSaveIntervalSecChanged, Settings::AUTOSAVE_INTERVAL_SEC ) SET_PREF_FUNCTION( QString, setAiCommonSystemPrompt, aiCommonSystemPrompt, aiCommonSystemPromptChanged, Settings::AI_COMMON_SYSTEM_PROMPT ) - SET_PREF_FUNCTION( bool, setAiCommonSystemPromptUseCustom, aiCommonSystemPromptUseCustom, aiCommonSystemPromptUseCustomChanged, Settings::AI_COMMON_SYSTEM_PROMPT_USE_CUSTOM ) - SET_PREF_FUNCTION( bool, setAiAnnotationUseCustom, aiAnnotationUseCustom, aiAnnotationUseCustomChanged, Settings::AI_ANNOTATION_USE_CUSTOM ) - SET_PREF_FUNCTION( QString, setAiAnnotationPrompt, aiAnnotationPrompt, aiAnnotationPromptChanged, Settings::AI_ANNOTATION_PROMPT ) - SET_PREF_FUNCTION( QString, setAiUserAvatar, aiUserAvatar, aiUserAvatarChanged, Settings::AI_USER_AVATAR ) - SET_PREF_FUNCTION( bool, setAiEnabled, aiEnabled, aiEnabledChanged, Settings::AI_ENABLED ) +SET_PREF_FUNCTION( bool, setAiCommonSystemPromptUseCustom, aiCommonSystemPromptUseCustom, aiCommonSystemPromptUseCustomChanged, Settings::AI_COMMON_SYSTEM_PROMPT_USE_CUSTOM ) +SET_PREF_FUNCTION( bool, setAiAnnotationUseCustom, aiAnnotationUseCustom, aiAnnotationUseCustomChanged, Settings::AI_ANNOTATION_USE_CUSTOM ) +SET_PREF_FUNCTION( QString, setAiAnnotationPrompt, aiAnnotationPrompt, aiAnnotationPromptChanged, Settings::AI_ANNOTATION_PROMPT ) +SET_PREF_FUNCTION( QString, setAiUserAvatar, aiUserAvatar, aiUserAvatarChanged, Settings::AI_USER_AVATAR ) +SET_PREF_FUNCTION( bool, setAiEnabled, aiEnabled, aiEnabledChanged, Settings::AI_ENABLED ) +SET_PREF_FUNCTION( bool, setOnboardingCompleted, onboardingCompleted, onboardingCompletedChanged, Settings::ONBOARDING_COMPLETED ) +SET_PREF_FUNCTION( int, setOnboardingStep, onboardingStep, onboardingStepChanged, Settings::ONBOARDING_STEP ) SET_PREF_FUNCTION( bool, setRpcServerEnabled, rpcServerEnabled, rpcServerEnabledChanged, Settings::RPC_SERVER_ENABLED ) SET_PREF_FUNCTION( QString, setRpcServerIp, rpcServerIp, rpcServerIpChanged, Settings::RPC_SERVER_IP ) @@ -442,270 +446,270 @@ SET_PREF_FUNCTION( int, setRpcServerPort, rpcServerPort, rpcServerPortChan void PreferencesModel::resetAiDefaults() { - AIConfigModel::config()->resetToDefaults(); - _aiPersonaModel->resetAll(); - setAiCommonSystemPrompt(Settings::defaultValue(Settings::AI_COMMON_SYSTEM_PROMPT).toString()); - setAiCommonSystemPromptUseCustom(Settings::defaultValue(Settings::AI_COMMON_SYSTEM_PROMPT_USE_CUSTOM).toBool()); - setAiAnnotationUseCustom(Settings::defaultValue(Settings::AI_ANNOTATION_USE_CUSTOM).toBool()); - setAiAnnotationPrompt( Settings::defaultValue(Settings::AI_ANNOTATION_PROMPT).toString()); - setAiUserAvatar( Settings::defaultValue(Settings::AI_USER_AVATAR).toString()); - setRpcServerEnabled(Settings::defaultValue(Settings::RPC_SERVER_ENABLED).toBool()); - setAiEnabled( Settings::defaultValue(Settings::AI_ENABLED).toBool()); + AIConfigModel::config()->resetToDefaults(); + _aiPersonaModel->resetAll(); + setAiCommonSystemPrompt(Settings::defaultValue(Settings::AI_COMMON_SYSTEM_PROMPT).toString()); + setAiCommonSystemPromptUseCustom(Settings::defaultValue(Settings::AI_COMMON_SYSTEM_PROMPT_USE_CUSTOM).toBool()); + setAiAnnotationUseCustom(Settings::defaultValue(Settings::AI_ANNOTATION_USE_CUSTOM).toBool()); + setAiAnnotationPrompt( Settings::defaultValue(Settings::AI_ANNOTATION_PROMPT).toString()); + setAiUserAvatar( Settings::defaultValue(Settings::AI_USER_AVATAR).toString()); + setRpcServerEnabled(Settings::defaultValue(Settings::RPC_SERVER_ENABLED).toBool()); + setAiEnabled( Settings::defaultValue(Settings::AI_ENABLED).toBool()); } void PreferencesModel::setGithubPatCustom(QString newPat) { - if (githubPatCustom() == newPat) - return; - - Settings::setValue(Settings::GITHUB_PAT_CUSTOM, encrypt(newPat)); - - emit githubPatCustomChanged(); + if (githubPatCustom() == newPat) + return; + + Settings::setValue(Settings::GITHUB_PAT_CUSTOM, encrypt(newPat)); + + emit githubPatCustomChanged(); } void PreferencesModel::setWhiteBackground(bool newWhiteBackground) { - if (whiteBackground() == newWhiteBackground) - return; - - setPlotBackground(newWhiteBackground ? "white" : "transparent"); + if (whiteBackground() == newWhiteBackground) + return; + + setPlotBackground(newWhiteBackground ? "white" : "transparent"); } void PreferencesModel::setDefaultPPI(int defaultPPI) { - if (_defaultPPI == defaultPPI) - return; - - _defaultPPI = defaultPPI; - emit defaultPPIChanged(_defaultPPI); + if (_defaultPPI == defaultPPI) + return; + + _defaultPPI = defaultPPI; + emit defaultPPIChanged(_defaultPPI); } void PreferencesModel::setUiScale(double newUiScale) { - newUiScale = std::min(3.0, std::max(0.2, newUiScale)); - - if (std::abs(uiScale() - newUiScale) < 0.001) - return; - - Settings::setValue(Settings::UI_SCALE, newUiScale); - _uiScale = newUiScale; - - emit uiScaleChanged(); + newUiScale = std::min(3.0, std::max(0.2, newUiScale)); + + if (std::abs(uiScale() - newUiScale) < 0.001) + return; + + Settings::setValue(Settings::UI_SCALE, newUiScale); + _uiScale = newUiScale; + + emit uiScaleChanged(); } void PreferencesModel::setModulesRemembered(QStringList newModulesRemembered) { - if (modulesRemembered() == newModulesRemembered) - return; - - Settings::setValue(Settings::MODULES_REMEMBERED, newModulesRemembered.join('|')); - emit modulesRememberedChanged(); + if (modulesRemembered() == newModulesRemembered) + return; + + Settings::setValue(Settings::MODULES_REMEMBERED, newModulesRemembered.join('|')); + emit modulesRememberedChanged(); } void PreferencesModel::setSafeGraphics(bool newSafeGraphics) { - if (safeGraphics() == newSafeGraphics) - return; - - Settings::setValue(Settings::SAFE_GRAPHICS_MODE, newSafeGraphics); - emit modulesRememberChanged(newSafeGraphics); - - MessageForwarder::showWarning(tr("Safe Graphics mode changed"), tr("You've changed the Safe Graphics mode of JASP, for this option to take effect you need to restart JASP")); - - emit safeGraphicsChanged(newSafeGraphics); + if (safeGraphics() == newSafeGraphics) + return; + + Settings::setValue(Settings::SAFE_GRAPHICS_MODE, newSafeGraphics); + emit modulesRememberChanged(newSafeGraphics); + + MessageForwarder::showWarning(tr("Safe Graphics mode changed"), tr("You've changed the Safe Graphics mode of JASP, for this option to take effect you need to restart JASP")); + + emit safeGraphicsChanged(newSafeGraphics); } void PreferencesModel::zoomIn() { - setUiScale(uiScale() + 0.1); + setUiScale(uiScale() + 0.1); } void PreferencesModel::zoomOut() { - if (uiScale() >= 0.2) - setUiScale(uiScale() - 0.1); + if (uiScale() >= 0.2) + setUiScale(uiScale() - 0.1); } void PreferencesModel::zoomReset() { - setUiScale(1.0); + setUiScale(1.0); } void PreferencesModel::removeEmptyValue(QString value) { - QStringList currentValues = emptyValues(); - if(currentValues.contains(value)) - { - currentValues.removeAll(value); - _setEmptyValues(currentValues); - } + QStringList currentValues = emptyValues(); + if(currentValues.contains(value)) + { + currentValues.removeAll(value); + _setEmptyValues(currentValues); + } } void PreferencesModel::addEmptyValue(QString value) { - QStringList currentValues = emptyValues(); - if(!currentValues.contains(value)) - { - currentValues.append(value); - _setEmptyValues(currentValues); - } + QStringList currentValues = emptyValues(); + if(!currentValues.contains(value)) + { + currentValues.append(value); + _setEmptyValues(currentValues); + } } void PreferencesModel::resetEmptyValues() { - QStringList defaultValues = _splitValues(Settings::defaultEmptyValues); - _setEmptyValues(defaultValues); + QStringList defaultValues = _splitValues(Settings::defaultEmptyValues); + _setEmptyValues(defaultValues); } void PreferencesModel::setThresholdScale(int newThresholdScale) { - if (thresholdScale() == newThresholdScale) - return; - - Settings::setValue(Settings::THRESHOLD_SCALE, newThresholdScale); - emit thresholdScaleChanged(newThresholdScale); - + if (thresholdScale() == newThresholdScale) + return; + + Settings::setValue(Settings::THRESHOLD_SCALE, newThresholdScale); + emit thresholdScaleChanged(newThresholdScale); + } void PreferencesModel::_loadDatabaseFont() { - QFontDatabase fontDatabase; - - fontDatabase.addApplicationFont(":/fonts/FreeSans.ttf"); - fontDatabase.addApplicationFont(":/fonts/FiraCode-Retina.ttf"); - - _allFonts = _allCodeFonts = _allResultFonts = _allInterfaceFonts = fontDatabase.families(); - _allCodeFonts.removeAll(defaultCodeFont()); - _allResultFonts.removeAll(defaultResultFont()); - _allInterfaceFonts.removeAll(defaultInterfaceFont()); + QFontDatabase fontDatabase; + + fontDatabase.addApplicationFont(":/fonts/FreeSans.ttf"); + fontDatabase.addApplicationFont(":/fonts/FiraCode-Retina.ttf"); + + _allFonts = _allCodeFonts = _allResultFonts = _allInterfaceFonts = fontDatabase.families(); + _allCodeFonts.removeAll(defaultCodeFont()); + _allResultFonts.removeAll(defaultResultFont()); + _allInterfaceFonts.removeAll(defaultInterfaceFont()); } QString PreferencesModel::_checkFontList(QString fonts) const { - if (fonts.contains(",")) - // If it is a list of fonts. - // Select the first one which is available. - for (QString font : fonts.split(",")) - { - if (_allFonts.contains(font.remove('"'))) - return font; - } - - return fonts; + if (fonts.contains(",")) + // If it is a list of fonts. + // Select the first one which is available. + for (QString font : fonts.split(",")) + { + if (_allFonts.contains(font.remove('"'))) + return font; + } + + return fonts; } QString PreferencesModel::defaultResultFont() const { - return _checkFontList(Settings::defaultValue(Settings::RESULT_FONT).toString()); + return _checkFontList(Settings::defaultValue(Settings::RESULT_FONT).toString()); } QString PreferencesModel::resultFont(bool forWebEngine) const { - QString font = Settings::value(Settings::RESULT_FONT).toString(), - defaultFont = Settings::defaultValue(Settings::RESULT_FONT).toString(); - - if (font.isEmpty()) font = defaultFont; - - if (forWebEngine) - { - // for WebEngine, if the font is the default one (that is a list of fonts), then use directly this list. - // the css is then exacly the same as it used to be and we are sure that the user gets the same rendering. - // If the font starts with a dot, then it needs extra quote for the WebEngine. - if (font.startsWith(".")) - font = '"' + font + '"'; - } - else - font = _checkFontList(font); - - return font; + QString font = Settings::value(Settings::RESULT_FONT).toString(), + defaultFont = Settings::defaultValue(Settings::RESULT_FONT).toString(); + + if (font.isEmpty()) font = defaultFont; + + if (forWebEngine) + { + // for WebEngine, if the font is the default one (that is a list of fonts), then use directly this list. + // the css is then exacly the same as it used to be and we are sure that the user gets the same rendering. + // If the font starts with a dot, then it needs extra quote for the WebEngine. + if (font.startsWith(".")) + font = '"' + font + '"'; + } + else + font = _checkFontList(font); + + return font; } QString PreferencesModel::interfaceFont() const { - QString font = Settings::value(Settings::INTERFACE_FONT).toString(); - - if (font.isEmpty()) font = defaultInterfaceFont(); - - return font; + QString font = Settings::value(Settings::INTERFACE_FONT).toString(); + + if (font.isEmpty()) font = defaultInterfaceFont(); + + return font; } QString PreferencesModel::codeFont() const { - QString font = Settings::value(Settings::CODE_FONT).toString(); - - if (font.isEmpty()) font = defaultCodeFont(); - - return font; + QString font = Settings::value(Settings::CODE_FONT).toString(); + + if (font.isEmpty()) font = defaultCodeFont(); + + return font; } QString PreferencesModel::defaultInterfaceFont() const { - return Settings::defaultValue(Settings::INTERFACE_FONT).toString(); + return Settings::defaultValue(Settings::INTERFACE_FONT).toString(); } QString PreferencesModel::defaultCodeFont() const { - return Settings::defaultValue(Settings::CODE_FONT).toString(); + return Settings::defaultValue(Settings::CODE_FONT).toString(); } void PreferencesModel::resetRememberedModules(bool setToRemember) { - setModulesRemembered(!setToRemember ? QStringList({}) : RibbonModel::singleton()->getModulesEnabled()); + setModulesRemembered(!setToRemember ? QStringList({}) : RibbonModel::singleton()->getModulesEnabled()); } void PreferencesModel::dataLabelNAChangedSlot(QString dataLabelNA) { - EmptyValues::setDisplayString(fq(dataLabelNA)); + EmptyValues::setDisplayString(fq(dataLabelNA)); } void PreferencesModel::onGuiQtTextRenderChanged(bool newGuiQtTextRenderSetting) { - QQuickWindow::setTextRenderType(newGuiQtTextRenderSetting ? QQuickWindow::QtTextRendering : QQuickWindow::NativeTextRendering); - - MessageForwarder::showWarning(tr("Text rendering setting changed"), tr("The textrendering setting has been changed, this will only take full effect after JASP is restarted.")); + QQuickWindow::setTextRenderType(newGuiQtTextRenderSetting ? QQuickWindow::QtTextRendering : QQuickWindow::NativeTextRendering); + + MessageForwarder::showWarning(tr("Text rendering setting changed"), tr("The textrendering setting has been changed, this will only take full effect after JASP is restarted.")); } void PreferencesModel::currentThemeNameHandler() { - setCurrentThemeName(JaspTheme::currentTheme()->themeName()); + setCurrentThemeName(JaspTheme::currentTheme()->themeName()); } void PreferencesModel::_setEmptyValues(const QStringList& values) { - if (values != emptyValues()) - { - Settings::setValue(Settings::EMPTY_VALUES_LIST, values.join("|")); - emit emptyValuesChanged(); - } + if (values != emptyValues()) + { + Settings::setValue(Settings::EMPTY_VALUES_LIST, values.join("|")); + emit emptyValuesChanged(); + } } QStringList PreferencesModel::_splitValues(const QString &values) const { - QStringList items = values.split("|"); - std::set orderedValues; // use std::set to order the items - for (const QString& item : items) - orderedValues.insert(stripFirstAndLastChar(item,"\"")); - - return QStringList(orderedValues.begin(), orderedValues.end()); - + QStringList items = values.split("|"); + std::set orderedValues; // use std::set to order the items + for (const QString& item : items) + orderedValues.insert(stripFirstAndLastChar(item,"\"")); + + return QStringList(orderedValues.begin(), orderedValues.end()); + } void PreferencesModel::setDirectLibpathFolder(QString libpath) { - if (libpath != "") - { - Settings::setValue(Settings::DIRECT_LIBPATH_FOLDER, libpath); - emit directLibpathFolderChanged(); - } + if (libpath != "") + { + Settings::setValue(Settings::DIRECT_LIBPATH_FOLDER, libpath); + emit directLibpathFolderChanged(); + } } void PreferencesModel::setEngineSandbox(bool engineSandbox) { - if(engineSandbox != PreferencesModel::engineSandbox()) { - Settings::setValue(Settings::ENGINE_SANDBOX, engineSandbox); + if(engineSandbox != PreferencesModel::engineSandbox()) { + Settings::setValue(Settings::ENGINE_SANDBOX, engineSandbox); #ifdef _WIN32 - MessageForwarder::showWarning(tr("Engine Sandbox setting changed"), tr("The Engine Sandbox setting has been changed, this will only take full effect after JASP is restarted.")); + MessageForwarder::showWarning(tr("Engine Sandbox setting changed"), tr("The Engine Sandbox setting has been changed, this will only take full effect after JASP is restarted.")); #endif - emit engineSandboxChanged(engineSandbox); - } + emit engineSandboxChanged(engineSandbox); + } } diff --git a/Desktop/gui/preferencesmodel.h b/Desktop/gui/preferencesmodel.h index 35ea13f04b..a4a59b6490 100644 --- a/Desktop/gui/preferencesmodel.h +++ b/Desktop/gui/preferencesmodel.h @@ -15,392 +15,400 @@ class JaspTheme; /// Interface between QML and Settings, mostly templated functions to link through directly. class PreferencesModel : public PreferencesModelBase { - Q_OBJECT - - Q_PROPERTY(bool fixedDecimals READ fixedDecimals WRITE setFixedDecimals NOTIFY fixedDecimalsChanged ) - Q_PROPERTY(int numDecimals READ numDecimals WRITE setNumDecimals NOTIFY numDecimalsChanged ) - Q_PROPERTY(bool exactPValues READ exactPValues WRITE setExactPValues NOTIFY exactPValuesChanged ) - Q_PROPERTY(bool normalizedNotation READ normalizedNotation WRITE setNormalizedNotation NOTIFY normalizedNotationChanged ) - Q_PROPERTY(bool useDefaultEditor READ useDefaultEditor WRITE setUseDefaultEditor NOTIFY useDefaultEditorChanged ) - Q_PROPERTY(QString customEditor READ customEditor WRITE setCustomEditor NOTIFY customEditorChanged ) - Q_PROPERTY(bool useDefaultPPI READ useDefaultPPI WRITE setUseDefaultPPI NOTIFY useDefaultPPIChanged ) - Q_PROPERTY(int customPPI READ customPPI WRITE setCustomPPI NOTIFY customPPIChanged ) - Q_PROPERTY(bool whiteBackground READ whiteBackground WRITE setWhiteBackground NOTIFY whiteBackgroundChanged ) - Q_PROPERTY(QString plotBackground READ plotBackground WRITE setPlotBackground NOTIFY plotBackgroundChanged ) - Q_PROPERTY(double uiScale READ uiScale WRITE setUiScale NOTIFY uiScaleChanged ) - Q_PROPERTY(float ribbonBarHeightScale READ ribbonBarHeightScale WRITE setRibbonBarHeightScale NOTIFY ribbonBarHeightScaleChanged ) - Q_PROPERTY(int defaultPPI READ defaultPPI WRITE setDefaultPPI NOTIFY defaultPPIChanged ) - Q_PROPERTY(QString developerFolder READ developerFolder WRITE setDeveloperFolder NOTIFY developerFolderChanged ) - Q_PROPERTY(bool directLibpathEnabled READ directLibpathEnabled WRITE setDirectLibpathEnabled NOTIFY directLibpathEnabledChanged ) - Q_PROPERTY(QString directLibpathFolder READ directLibpathFolder WRITE setDirectLibpathFolder NOTIFY directLibpathFolderChanged ) - Q_PROPERTY(QString directDevModName READ directDevModName WRITE setDirectDevModName NOTIFY directDevModNameChanged ) - Q_PROPERTY(int thresholdScale READ thresholdScale WRITE setThresholdScale NOTIFY thresholdScaleChanged ) - Q_PROPERTY(bool logToFile READ logToFile WRITE setLogToFile NOTIFY logToFileChanged ) - Q_PROPERTY(int logFilesMax READ logFilesMax WRITE setLogFilesMax NOTIFY logFilesMaxChanged ) - Q_PROPERTY(int maxFlickVelocity READ maxFlickVelocity WRITE setMaxFlickVelocity NOTIFY maxFlickVelocityChanged ) - Q_PROPERTY(bool modulesRemember READ modulesRemember WRITE setModulesRemember NOTIFY modulesRememberChanged ) - Q_PROPERTY(QStringList modulesRemembered READ modulesRemembered WRITE setModulesRemembered NOTIFY modulesRememberedChanged ) - Q_PROPERTY(bool safeGraphics READ safeGraphics WRITE setSafeGraphics NOTIFY safeGraphicsChanged ) - Q_PROPERTY(QString cranRepoURL READ cranRepoURL WRITE setCranRepoURL NOTIFY cranRepoURLChanged ) - Q_PROPERTY(QString moduleLibraryURL READ moduleLibraryURL WRITE setModuleLibraryURL NOTIFY moduleLibraryURLChanged ) - Q_PROPERTY(bool githubPatUseDefault READ githubPatUseDefault WRITE setGithubPatUseDefault NOTIFY githubPatUseDefaultChanged ) - Q_PROPERTY(QString githubPatCustom READ githubPatCustom WRITE setGithubPatCustom NOTIFY githubPatCustomChanged ) - Q_PROPERTY(QString interfaceFont READ interfaceFont WRITE setInterfaceFont NOTIFY interfaceFontChanged ) - Q_PROPERTY(QString codeFont READ codeFont WRITE setCodeFont NOTIFY codeFontChanged ) - Q_PROPERTY(QString resultFont READ resultFont WRITE setResultFont NOTIFY resultFontChanged ) - Q_PROPERTY(QString currentThemeName READ currentThemeName WRITE setCurrentThemeName NOTIFY currentThemeNameChanged ) - Q_PROPERTY(bool useNativeFileDialog READ useNativeFileDialog WRITE setUseNativeFileDialog NOTIFY useNativeFileDialogChanged ) - Q_PROPERTY(bool disableAnimations READ disableAnimations WRITE setDisableAnimations NOTIFY disableAnimationsChanged ) - Q_PROPERTY(bool generateMarkdown READ generateMarkdown WRITE setGenerateMarkdown NOTIFY generateMarkdownChanged ) - Q_PROPERTY(QStringList emptyValues READ emptyValues NOTIFY emptyValuesChanged ) - Q_PROPERTY(int plotPPI READ plotPPI NOTIFY plotPPIPropChanged ) - Q_PROPERTY(QString languageCode READ languageCode NOTIFY languageCodeChanged ) - Q_PROPERTY(QStringList allCodeFonts READ allCodeFonts CONSTANT ) - Q_PROPERTY(QString defaultInterfaceFont READ defaultInterfaceFont CONSTANT ) - Q_PROPERTY(QString defaultCodeFont READ defaultCodeFont CONSTANT ) - Q_PROPERTY(QString defaultResultFont READ defaultResultFont CONSTANT ) - Q_PROPERTY(QStringList allInterfaceFonts READ allInterfaceFonts CONSTANT ) - Q_PROPERTY(QStringList allResultFonts READ allResultFonts CONSTANT ) - Q_PROPERTY(int maxEngines READ maxEngines WRITE setMaxEngines NOTIFY maxEnginesChanged ) - Q_PROPERTY(int maxEnginesAdmin READ maxEnginesAdmin NOTIFY maxEnginesAdminChanged ) - Q_PROPERTY(bool windowsNoBomNative READ windowsNoBomNative WRITE setWindowsNoBomNative NOTIFY windowsNoBomNativeChanged ) - Q_PROPERTY(int windowsChosenCodePage READ windowsChosenCodePage WRITE setWindowsChosenCodePage NOTIFY windowsChosenCodePageChanged ) - Q_PROPERTY(bool dbShowWarning READ dbShowWarning WRITE setDbShowWarning NOTIFY dbShowWarningChanged ) - Q_PROPERTY(QString dataLabelNA READ dataLabelNA WRITE setDataLabelNA NOTIFY dataLabelNAChanged ) - Q_PROPERTY(bool guiQtTextRender READ guiQtTextRender WRITE setGuiQtTextRender NOTIFY guiQtTextRenderChanged ) - Q_PROPERTY(bool reportingMode READ reportingMode WRITE setReportingMode NOTIFY reportingModeChanged ) - Q_PROPERTY(bool showAllROptions READ showAllROptions WRITE setShowAllROptions NOTIFY showAllROptionsChanged ) - Q_PROPERTY(bool showRSyntaxInResults READ showRSyntaxInResults WRITE setShowRSyntaxInResults NOTIFY showRSyntaxInResultsChanged ) - Q_PROPERTY(bool ALTNavModeActive READ ALTNavModeActive WRITE setALTNavModeActive NOTIFY ALTNavModeActiveChanged ) - Q_PROPERTY(bool orderByValueByDefault READ orderByValueByDefault WRITE setOrderByValueByDefault NOTIFY orderByValueByDefaultChanged ) - Q_PROPERTY(bool checkUpdatesAskUser READ checkUpdatesAskUser WRITE setCheckUpdatesAskUser NOTIFY checkUpdatesAskUserChanged ) - Q_PROPERTY(bool checkUpdates READ checkUpdates WRITE setCheckUpdates NOTIFY checkUpdatesChanged ) - Q_PROPERTY(int maxScaleLevels READ maxScaleLevels WRITE setMaxScaleLevels NOTIFY maxScaleLevelsChanged ) - Q_PROPERTY(QVariantList pdfPageSizeModel READ pdfPageSizeModel CONSTANT ) - Q_PROPERTY(int pdfPageSize READ pdfPageSize WRITE setPdfPageSize NOTIFY pdfPageSizeChanged ) - Q_PROPERTY(bool pdfLandscape READ pdfLandscape WRITE setPdfLandscape NOTIFY pdfLandscapeChanged ) - Q_PROPERTY(bool engineSandbox READ engineSandbox WRITE setEngineSandbox NOTIFY engineSandboxChanged ) - Q_PROPERTY(QString localConfigurationPATH READ localConfigurationPATH WRITE setLocalConfigurationPATH NOTIFY localConfigurationPATHChanged ) - Q_PROPERTY(bool remoteConfiguration READ remoteConfiguration WRITE setRemoteConfiguration NOTIFY remoteConfigurationChanged ) - Q_PROPERTY(QString remoteConfigurationURL READ remoteConfigurationURL WRITE setRemoteConfigurationURL NOTIFY remoteConfigurationURLChanged ) - Q_PROPERTY(bool useConfigurationFile READ useConfigurationFile WRITE setUseConfigurationFile NOTIFY useConfigurationFileChanged ) - Q_PROPERTY(bool startMaximized READ startMaximized WRITE setStartMaximized NOTIFY startMaximizedChanged ) - Q_PROPERTY(bool storeStateEtc READ storeStateEtc WRITE setStoreStateEtc NOTIFY storeStateEtcChanged ) - Q_PROPERTY(bool showInteractiveDefault READ showInteractiveDefault WRITE setShowInteractiveDefault NOTIFY showInteractiveDefaultChanged ) - Q_PROPERTY(int autoSaveIntervalSec READ autoSaveIntervalSec WRITE setAutoSaveIntervalSec NOTIFY autoSaveIntervalSecChanged ) - Q_PROPERTY(bool autoSaveAtAll READ autoSaveAtAll WRITE setAutoSaveAtAll NOTIFY autoSaveAtAllChanged ) - Q_PROPERTY(QString aiCommonSystemPrompt READ aiCommonSystemPrompt WRITE setAiCommonSystemPrompt NOTIFY aiCommonSystemPromptChanged ) - Q_PROPERTY(bool aiCommonSystemPromptUseCustom READ aiCommonSystemPromptUseCustom WRITE setAiCommonSystemPromptUseCustom NOTIFY aiCommonSystemPromptUseCustomChanged ) - Q_PROPERTY(bool aiEnabled READ aiEnabled WRITE setAiEnabled NOTIFY aiEnabledChanged ) - Q_PROPERTY(bool aiAnnotationUseCustom READ aiAnnotationUseCustom WRITE setAiAnnotationUseCustom NOTIFY aiAnnotationUseCustomChanged ) - Q_PROPERTY(QString aiAnnotationPrompt READ aiAnnotationPrompt WRITE setAiAnnotationPrompt NOTIFY aiAnnotationPromptChanged ) - Q_PROPERTY(QString aiUserAvatar READ aiUserAvatar WRITE setAiUserAvatar NOTIFY aiUserAvatarChanged ) - Q_PROPERTY(QObject* aiPersonaModel READ aiPersonaModel CONSTANT ) - Q_PROPERTY(QObject* aiConfigModel READ aiConfigModel CONSTANT ) - - Q_PROPERTY(bool rpcServerEnabled READ rpcServerEnabled WRITE setRpcServerEnabled NOTIFY rpcServerEnabledChanged ) - Q_PROPERTY(QString rpcServerIp READ rpcServerIp WRITE setRpcServerIp NOTIFY rpcServerIpChanged ) - Q_PROPERTY(int rpcServerPort READ rpcServerPort WRITE setRpcServerPort NOTIFY rpcServerPortChanged ) - - - - public: - explicit PreferencesModel(QObject *parent = 0); - - static PreferencesModel * prefs() { return qobject_cast(_singleton); } - - int customPPI() const; - int numDecimals() const; - int defaultPPI() const { return _defaultPPI; } - int plotPPI() const { return useDefaultPPI() ? defaultPPI() : customPPI(); } - bool fixedDecimals() const; - bool exactPValues() const; - bool normalizedNotation() const; - bool useDefaultEditor() const; - bool useDefaultPPI() const; - bool whiteBackground() const; - QString plotBackground() const; - double uiScale() override; - float ribbonBarHeightScale() const override; - QString customEditor() const; - QString developerFolder() const; - QString fixedDecimalsForJS() const; - QStringList emptyValues() const; - int thresholdScale() const; - bool logToFile() const; - int logFilesMax() const; - int maxFlickVelocity() const override; - bool modulesRemember() const; - QStringList modulesRemembered() const; - bool safeGraphics() const; - QString cranRepoURL() const; - QString moduleLibraryURL() const; - QString githubPatResolved() const; - QString githubPatCustom() const; - bool githubPatUseDefault() const; - QString interfaceFont() const; - QString codeFont() const; - QString resultFont(bool forWebEngine = false) const; - QString currentThemeName() const; - QString languageCode() const; - bool useThousandSeparators() const; - const QLocale & localeQt() const; - bool disableAnimations() const; - bool animationsOn() const override { return !disableAnimations() && !safeGraphics(); } - bool generateMarkdown() const; - QStringList allInterfaceFonts() const { return _allInterfaceFonts; } - QStringList allCodeFonts() const { return _allCodeFonts; } - QStringList allResultFonts() const { return _allResultFonts; } - QString defaultResultFont() const; - QString defaultInterfaceFont() const; - QString defaultCodeFont() const; - int maxEngines() const; - bool windowsNoBomNative() const; - int windowsChosenCodePage() const; - bool dbShowWarning() const; - QString dataLabelNA() const; - bool guiQtTextRender() const; - bool reportingMode() const; - bool showRSyntax() const override; - bool showAllROptions() const override; - bool showRSyntaxInResults() const; - void zoomIn(); - void zoomOut(); - void zoomReset(); - int maxEnginesAdmin() const; - bool developerMode() const override; - QString developerModeName() const override; - bool ALTNavModeActive() const override; + Q_OBJECT + + Q_PROPERTY(bool fixedDecimals READ fixedDecimals WRITE setFixedDecimals NOTIFY fixedDecimalsChanged ) + Q_PROPERTY(int numDecimals READ numDecimals WRITE setNumDecimals NOTIFY numDecimalsChanged ) + Q_PROPERTY(bool exactPValues READ exactPValues WRITE setExactPValues NOTIFY exactPValuesChanged ) + Q_PROPERTY(bool normalizedNotation READ normalizedNotation WRITE setNormalizedNotation NOTIFY normalizedNotationChanged ) + Q_PROPERTY(bool useDefaultEditor READ useDefaultEditor WRITE setUseDefaultEditor NOTIFY useDefaultEditorChanged ) + Q_PROPERTY(QString customEditor READ customEditor WRITE setCustomEditor NOTIFY customEditorChanged ) + Q_PROPERTY(bool useDefaultPPI READ useDefaultPPI WRITE setUseDefaultPPI NOTIFY useDefaultPPIChanged ) + Q_PROPERTY(int customPPI READ customPPI WRITE setCustomPPI NOTIFY customPPIChanged ) + Q_PROPERTY(bool whiteBackground READ whiteBackground WRITE setWhiteBackground NOTIFY whiteBackgroundChanged ) + Q_PROPERTY(QString plotBackground READ plotBackground WRITE setPlotBackground NOTIFY plotBackgroundChanged ) + Q_PROPERTY(double uiScale READ uiScale WRITE setUiScale NOTIFY uiScaleChanged ) + Q_PROPERTY(float ribbonBarHeightScale READ ribbonBarHeightScale WRITE setRibbonBarHeightScale NOTIFY ribbonBarHeightScaleChanged ) + Q_PROPERTY(int defaultPPI READ defaultPPI WRITE setDefaultPPI NOTIFY defaultPPIChanged ) + Q_PROPERTY(QString developerFolder READ developerFolder WRITE setDeveloperFolder NOTIFY developerFolderChanged ) + Q_PROPERTY(bool directLibpathEnabled READ directLibpathEnabled WRITE setDirectLibpathEnabled NOTIFY directLibpathEnabledChanged ) + Q_PROPERTY(QString directLibpathFolder READ directLibpathFolder WRITE setDirectLibpathFolder NOTIFY directLibpathFolderChanged ) + Q_PROPERTY(QString directDevModName READ directDevModName WRITE setDirectDevModName NOTIFY directDevModNameChanged ) + Q_PROPERTY(int thresholdScale READ thresholdScale WRITE setThresholdScale NOTIFY thresholdScaleChanged ) + Q_PROPERTY(bool logToFile READ logToFile WRITE setLogToFile NOTIFY logToFileChanged ) + Q_PROPERTY(int logFilesMax READ logFilesMax WRITE setLogFilesMax NOTIFY logFilesMaxChanged ) + Q_PROPERTY(int maxFlickVelocity READ maxFlickVelocity WRITE setMaxFlickVelocity NOTIFY maxFlickVelocityChanged ) + Q_PROPERTY(bool modulesRemember READ modulesRemember WRITE setModulesRemember NOTIFY modulesRememberChanged ) + Q_PROPERTY(QStringList modulesRemembered READ modulesRemembered WRITE setModulesRemembered NOTIFY modulesRememberedChanged ) + Q_PROPERTY(bool safeGraphics READ safeGraphics WRITE setSafeGraphics NOTIFY safeGraphicsChanged ) + Q_PROPERTY(QString cranRepoURL READ cranRepoURL WRITE setCranRepoURL NOTIFY cranRepoURLChanged ) + Q_PROPERTY(QString moduleLibraryURL READ moduleLibraryURL WRITE setModuleLibraryURL NOTIFY moduleLibraryURLChanged ) + Q_PROPERTY(bool githubPatUseDefault READ githubPatUseDefault WRITE setGithubPatUseDefault NOTIFY githubPatUseDefaultChanged ) + Q_PROPERTY(QString githubPatCustom READ githubPatCustom WRITE setGithubPatCustom NOTIFY githubPatCustomChanged ) + Q_PROPERTY(QString interfaceFont READ interfaceFont WRITE setInterfaceFont NOTIFY interfaceFontChanged ) + Q_PROPERTY(QString codeFont READ codeFont WRITE setCodeFont NOTIFY codeFontChanged ) + Q_PROPERTY(QString resultFont READ resultFont WRITE setResultFont NOTIFY resultFontChanged ) + Q_PROPERTY(QString currentThemeName READ currentThemeName WRITE setCurrentThemeName NOTIFY currentThemeNameChanged ) + Q_PROPERTY(bool useNativeFileDialog READ useNativeFileDialog WRITE setUseNativeFileDialog NOTIFY useNativeFileDialogChanged ) + Q_PROPERTY(bool disableAnimations READ disableAnimations WRITE setDisableAnimations NOTIFY disableAnimationsChanged ) + Q_PROPERTY(bool generateMarkdown READ generateMarkdown WRITE setGenerateMarkdown NOTIFY generateMarkdownChanged ) + Q_PROPERTY(QStringList emptyValues READ emptyValues NOTIFY emptyValuesChanged ) + Q_PROPERTY(int plotPPI READ plotPPI NOTIFY plotPPIPropChanged ) + Q_PROPERTY(QString languageCode READ languageCode NOTIFY languageCodeChanged ) + Q_PROPERTY(QStringList allCodeFonts READ allCodeFonts CONSTANT ) + Q_PROPERTY(QString defaultInterfaceFont READ defaultInterfaceFont CONSTANT ) + Q_PROPERTY(QString defaultCodeFont READ defaultCodeFont CONSTANT ) + Q_PROPERTY(QString defaultResultFont READ defaultResultFont CONSTANT ) + Q_PROPERTY(QStringList allInterfaceFonts READ allInterfaceFonts CONSTANT ) + Q_PROPERTY(QStringList allResultFonts READ allResultFonts CONSTANT ) + Q_PROPERTY(int maxEngines READ maxEngines WRITE setMaxEngines NOTIFY maxEnginesChanged ) + Q_PROPERTY(int maxEnginesAdmin READ maxEnginesAdmin NOTIFY maxEnginesAdminChanged ) + Q_PROPERTY(bool windowsNoBomNative READ windowsNoBomNative WRITE setWindowsNoBomNative NOTIFY windowsNoBomNativeChanged ) + Q_PROPERTY(int windowsChosenCodePage READ windowsChosenCodePage WRITE setWindowsChosenCodePage NOTIFY windowsChosenCodePageChanged ) + Q_PROPERTY(bool dbShowWarning READ dbShowWarning WRITE setDbShowWarning NOTIFY dbShowWarningChanged ) + Q_PROPERTY(QString dataLabelNA READ dataLabelNA WRITE setDataLabelNA NOTIFY dataLabelNAChanged ) + Q_PROPERTY(bool guiQtTextRender READ guiQtTextRender WRITE setGuiQtTextRender NOTIFY guiQtTextRenderChanged ) + Q_PROPERTY(bool reportingMode READ reportingMode WRITE setReportingMode NOTIFY reportingModeChanged ) + Q_PROPERTY(bool showAllROptions READ showAllROptions WRITE setShowAllROptions NOTIFY showAllROptionsChanged ) + Q_PROPERTY(bool showRSyntaxInResults READ showRSyntaxInResults WRITE setShowRSyntaxInResults NOTIFY showRSyntaxInResultsChanged ) + Q_PROPERTY(bool ALTNavModeActive READ ALTNavModeActive WRITE setALTNavModeActive NOTIFY ALTNavModeActiveChanged ) + Q_PROPERTY(bool orderByValueByDefault READ orderByValueByDefault WRITE setOrderByValueByDefault NOTIFY orderByValueByDefaultChanged ) + Q_PROPERTY(bool checkUpdatesAskUser READ checkUpdatesAskUser WRITE setCheckUpdatesAskUser NOTIFY checkUpdatesAskUserChanged ) + Q_PROPERTY(bool checkUpdates READ checkUpdates WRITE setCheckUpdates NOTIFY checkUpdatesChanged ) + Q_PROPERTY(int maxScaleLevels READ maxScaleLevels WRITE setMaxScaleLevels NOTIFY maxScaleLevelsChanged ) + Q_PROPERTY(QVariantList pdfPageSizeModel READ pdfPageSizeModel CONSTANT ) + Q_PROPERTY(int pdfPageSize READ pdfPageSize WRITE setPdfPageSize NOTIFY pdfPageSizeChanged ) + Q_PROPERTY(bool pdfLandscape READ pdfLandscape WRITE setPdfLandscape NOTIFY pdfLandscapeChanged ) + Q_PROPERTY(bool engineSandbox READ engineSandbox WRITE setEngineSandbox NOTIFY engineSandboxChanged ) + Q_PROPERTY(QString localConfigurationPATH READ localConfigurationPATH WRITE setLocalConfigurationPATH NOTIFY localConfigurationPATHChanged ) + Q_PROPERTY(bool remoteConfiguration READ remoteConfiguration WRITE setRemoteConfiguration NOTIFY remoteConfigurationChanged ) + Q_PROPERTY(QString remoteConfigurationURL READ remoteConfigurationURL WRITE setRemoteConfigurationURL NOTIFY remoteConfigurationURLChanged ) + Q_PROPERTY(bool useConfigurationFile READ useConfigurationFile WRITE setUseConfigurationFile NOTIFY useConfigurationFileChanged ) + Q_PROPERTY(bool startMaximized READ startMaximized WRITE setStartMaximized NOTIFY startMaximizedChanged ) + Q_PROPERTY(bool storeStateEtc READ storeStateEtc WRITE setStoreStateEtc NOTIFY storeStateEtcChanged ) + Q_PROPERTY(bool showInteractiveDefault READ showInteractiveDefault WRITE setShowInteractiveDefault NOTIFY showInteractiveDefaultChanged ) + Q_PROPERTY(int autoSaveIntervalSec READ autoSaveIntervalSec WRITE setAutoSaveIntervalSec NOTIFY autoSaveIntervalSecChanged ) + Q_PROPERTY(bool autoSaveAtAll READ autoSaveAtAll WRITE setAutoSaveAtAll NOTIFY autoSaveAtAllChanged ) + Q_PROPERTY(QString aiCommonSystemPrompt READ aiCommonSystemPrompt WRITE setAiCommonSystemPrompt NOTIFY aiCommonSystemPromptChanged ) + Q_PROPERTY(bool aiCommonSystemPromptUseCustom READ aiCommonSystemPromptUseCustom WRITE setAiCommonSystemPromptUseCustom NOTIFY aiCommonSystemPromptUseCustomChanged ) + Q_PROPERTY(bool aiEnabled READ aiEnabled WRITE setAiEnabled NOTIFY aiEnabledChanged ) + Q_PROPERTY(bool aiAnnotationUseCustom READ aiAnnotationUseCustom WRITE setAiAnnotationUseCustom NOTIFY aiAnnotationUseCustomChanged ) + Q_PROPERTY(QString aiAnnotationPrompt READ aiAnnotationPrompt WRITE setAiAnnotationPrompt NOTIFY aiAnnotationPromptChanged ) + Q_PROPERTY(QString aiUserAvatar READ aiUserAvatar WRITE setAiUserAvatar NOTIFY aiUserAvatarChanged ) + Q_PROPERTY(QObject* aiPersonaModel READ aiPersonaModel CONSTANT ) + Q_PROPERTY(QObject* aiConfigModel READ aiConfigModel CONSTANT ) + Q_PROPERTY(bool onboardingCompleted READ onboardingCompleted WRITE setOnboardingCompleted NOTIFY onboardingCompletedChanged ) + Q_PROPERTY(int onboardingStep READ onboardingStep WRITE setOnboardingStep NOTIFY onboardingStepChanged ) + + Q_PROPERTY(bool rpcServerEnabled READ rpcServerEnabled WRITE setRpcServerEnabled NOTIFY rpcServerEnabledChanged ) + Q_PROPERTY(QString rpcServerIp READ rpcServerIp WRITE setRpcServerIp NOTIFY rpcServerIpChanged ) + Q_PROPERTY(int rpcServerPort READ rpcServerPort WRITE setRpcServerPort NOTIFY rpcServerPortChanged ) + + + +public: + explicit PreferencesModel(QObject *parent = 0); + + static PreferencesModel * prefs() { return qobject_cast(_singleton); } + + int customPPI() const; + int numDecimals() const; + int defaultPPI() const { return _defaultPPI; } + int plotPPI() const { return useDefaultPPI() ? defaultPPI() : customPPI(); } + bool fixedDecimals() const; + bool exactPValues() const; + bool normalizedNotation() const; + bool useDefaultEditor() const; + bool useDefaultPPI() const; + bool whiteBackground() const; + QString plotBackground() const; + double uiScale() override; + float ribbonBarHeightScale() const override; + QString customEditor() const; + QString developerFolder() const; + QString fixedDecimalsForJS() const; + QStringList emptyValues() const; + int thresholdScale() const; + bool logToFile() const; + int logFilesMax() const; + int maxFlickVelocity() const override; + bool modulesRemember() const; + QStringList modulesRemembered() const; + bool safeGraphics() const; + QString cranRepoURL() const; + QString moduleLibraryURL() const; + QString githubPatResolved() const; + QString githubPatCustom() const; + bool githubPatUseDefault() const; + QString interfaceFont() const; + QString codeFont() const; + QString resultFont(bool forWebEngine = false) const; + QString currentThemeName() const; + QString languageCode() const; + bool useThousandSeparators() const; + const QLocale & localeQt() const; + bool disableAnimations() const; + bool animationsOn() const override { return !disableAnimations() && !safeGraphics(); } + bool generateMarkdown() const; + QStringList allInterfaceFonts() const { return _allInterfaceFonts; } + QStringList allCodeFonts() const { return _allCodeFonts; } + QStringList allResultFonts() const { return _allResultFonts; } + QString defaultResultFont() const; + QString defaultInterfaceFont() const; + QString defaultCodeFont() const; + int maxEngines() const; + bool windowsNoBomNative() const; + int windowsChosenCodePage() const; + bool dbShowWarning() const; + QString dataLabelNA() const; + bool guiQtTextRender() const; + bool reportingMode() const; + bool showRSyntax() const override; + bool showAllROptions() const override; + bool showRSyntaxInResults() const; + void zoomIn(); + void zoomOut(); + void zoomReset(); + int maxEnginesAdmin() const; + bool developerMode() const override; + QString developerModeName() const override; + bool ALTNavModeActive() const override; bool orderByValueByDefault() const; - int maxScaleLevels() const override; - QVariantList pdfPageSizeModel() const { return _pdfPageSizeModel; } - int pdfPageSize() const; - bool pdfLandscape() const; - bool directLibpathEnabled() const; - QString directLibpathFolder() const; - QString directDevModName() const; - - QString localConfigurationPATH() const; - QString remoteConfigurationURL() const; - bool remoteConfiguration() const; - bool useConfigurationFile() const; - bool checkUpdates() const; - bool startMaximized() const; - int autoSaveIntervalSec() const; - bool autoSaveAtAll() const; - bool checkUpdatesAskUser() const; - - void setCheckUpdatesAskUser( bool newCheckUpdatesAskUser); - void setCheckUpdates( bool newCheckUpdates); - void setStartMaximized( bool newStartMaximized); - void setAutoSaveIntervalSec( int newAutoSaveIntervalSec); - void setAutoSaveAtAll( bool newAutoSaveAtAll); - Q_INVOKABLE void resetAiDefaults(); - - bool storeStateEtc() const; - void setStoreStateEtc(bool newStoreStateEtc); - - bool showInteractiveDefault() const; - void setShowInteractiveDefault(bool newShowInteractiveDefault); - - AIPersonaModel* aiPersonaModel() const; - AIConfigModel* aiConfigModel() const; - - QString aiCommonSystemPrompt() const; - void setAiCommonSystemPrompt(QString newAiCommonSystemPrompt); - - bool aiCommonSystemPromptUseCustom() const; - void setAiCommonSystemPromptUseCustom(bool newAiCommonSystemPromptUseCustom); - - bool aiEnabled() const; - void setAiEnabled(bool newAiEnabled); - - bool aiAnnotationUseCustom() const; - void setAiAnnotationUseCustom(bool newAiAnnotationUseCustom); - - QString aiAnnotationPrompt() const; - void setAiAnnotationPrompt(QString newAiAnnotationPrompt); - - QString aiUserAvatar() const; - void setAiUserAvatar(QString newAiUserAvatar); - - bool rpcServerEnabled() const; - void setRpcServerEnabled(bool v); - QString rpcServerIp() const; - void setRpcServerIp(QString v); - int rpcServerPort() const; - void setRpcServerPort(int v); - - public slots: - bool engineSandbox() const; - bool useNativeFileDialog() const; - void setUiScale( double uiScale); - void setCustomPPI( int customPPI); - void setDefaultPPI( int defaultPPI); - void setNumDecimals( int numDecimals); - void setExactPValues( bool exactPValues); - void setNormalizedNotation( bool normalizedNotation); - void setRibbonBarHeightScale( float ribbonBarHeightScale); - void setCustomEditor( QString customEditor); - void setFixedDecimals( bool fixedDecimals); - void setUseDefaultPPI( bool useDefaultPPI); - void setDeveloperMode( bool developerMode) override; - void setWhiteBackground( bool whiteBackground); - void setPlotBackground( QString plotBackground); - void setDeveloperFolder( QString developerFolder); - void setUseDefaultEditor( bool useDefaultEditor); - void browseSpreadsheetEditor(); - void browseDeveloperFolder(); - void browseDeveloperLibPathFolder(); - void browseConfigurationFile(); - void removeEmptyValue( QString value); - void addEmptyValue( QString value); - void resetEmptyValues(); - void setThresholdScale( int thresholdScale); - void setLogToFile( bool logToFile); - void setLogFilesMax( int logFilesMax); - void setMaxFlickVelocity( int maxFlickVelocity); - void setModulesRemember( bool modulesRemember); - void setModulesRemembered( QStringList modulesRemembered); - void setSafeGraphics( bool safeGraphics); - void setCranRepoURL( QString cranRepoURL); - void setModuleLibraryURL( QString moduleLibraryURL); - void setGithubPatUseDefault( bool useDefault); - void setGithubPatCustom( QString pat); - void moduleEnabledChanged( QString moduleName, bool enabled); - void onUseDefaultPPIChanged( bool useDefault); - void onCustomPPIChanged( int); - void onDefaultPPIChanged( int); - void setCurrentThemeName( QString currentThemeName) override; - void setInterfaceFont( QString interfaceFont); - void setCodeFont( QString codeFont); - void setResultFont( QString resultFont); - void setUseNativeFileDialog( bool useNativeFileDialog); - void setDisableAnimations( bool disableAnimations); - void setGenerateMarkdown( bool generateMarkdown); - void resetRememberedModules( bool clear); - void setMaxEngines( int maxEngines); - void setWindowsNoBomNative( bool windowsNoBomNative); - void setWindowsChosenCodePage( int windowsChosenCodePage); - void setDbShowWarning( bool dbShowWarning); - void setDataLabelNA( QString dataLabelNA); - void setGuiQtTextRender( bool newGuiQtTextRender); - void onGuiQtTextRenderChanged( bool newGuiQtTextRenderSetting); - void setReportingMode( bool reportingMode); - void setShowRSyntax( bool showRSyntax) override; - void setShowAllROptions( bool showAllROptions) override; - void setShowRSyntaxInResults( bool showRSyntax); - void currentThemeNameHandler(); - void setALTNavModeActive( bool ALTNavModeActive); - void setOrderByValueByDefault( bool orderByValueByDefault); - void setMaxScaleLevels( int maxScaleLevels); - void setPdfPageSize( int pdfPageSize); - void setPdfLandscape( bool pdfLandscape); - void setDirectLibpathEnabled( bool setDirectLibpathEnabled); - void setDirectLibpathFolder( QString libpath); - void setDirectDevModName( QString name); - void setEngineSandbox( bool engineSandbox); - void setLocalConfigurationPATH( QString path); - void setRemoteConfiguration( bool enabled); - void setRemoteConfigurationURL( QString URL); - void setUseConfigurationFile( bool newUseConfigurationFile); - - - + int maxScaleLevels() const override; + QVariantList pdfPageSizeModel() const { return _pdfPageSizeModel; } + int pdfPageSize() const; + bool pdfLandscape() const; + bool directLibpathEnabled() const; + QString directLibpathFolder() const; + QString directDevModName() const; + + QString localConfigurationPATH() const; + QString remoteConfigurationURL() const; + bool remoteConfiguration() const; + bool useConfigurationFile() const; + bool checkUpdates() const; + bool startMaximized() const; + int autoSaveIntervalSec() const; + bool autoSaveAtAll() const; + bool checkUpdatesAskUser() const; + bool onboardingCompleted() const; + int onboardingStep() const; + + void setCheckUpdatesAskUser( bool newCheckUpdatesAskUser); + void setCheckUpdates( bool newCheckUpdates); + void setStartMaximized( bool newStartMaximized); + void setAutoSaveIntervalSec( int newAutoSaveIntervalSec); + void setAutoSaveAtAll( bool newAutoSaveAtAll); + Q_INVOKABLE void resetAiDefaults(); + + bool storeStateEtc() const; + void setStoreStateEtc(bool newStoreStateEtc); + + bool showInteractiveDefault() const; + void setShowInteractiveDefault(bool newShowInteractiveDefault); + + AIPersonaModel* aiPersonaModel() const; + AIConfigModel* aiConfigModel() const; + + QString aiCommonSystemPrompt() const; + void setAiCommonSystemPrompt(QString newAiCommonSystemPrompt); + + bool aiCommonSystemPromptUseCustom() const; + void setAiCommonSystemPromptUseCustom(bool newAiCommonSystemPromptUseCustom); + + bool aiEnabled() const; + void setAiEnabled(bool newAiEnabled); + + bool aiAnnotationUseCustom() const; + void setAiAnnotationUseCustom(bool newAiAnnotationUseCustom); + + QString aiAnnotationPrompt() const; + void setAiAnnotationPrompt(QString newAiAnnotationPrompt); + + QString aiUserAvatar() const; + void setAiUserAvatar(QString newAiUserAvatar); + + bool rpcServerEnabled() const; + void setRpcServerEnabled(bool v); + QString rpcServerIp() const; + void setRpcServerIp(QString v); + int rpcServerPort() const; + void setRpcServerPort(int v); + +public slots: + bool engineSandbox() const; + bool useNativeFileDialog() const; + void setUiScale( double uiScale); + void setCustomPPI( int customPPI); + void setDefaultPPI( int defaultPPI); + void setNumDecimals( int numDecimals); + void setExactPValues( bool exactPValues); + void setNormalizedNotation( bool normalizedNotation); + void setRibbonBarHeightScale( float ribbonBarHeightScale); + void setCustomEditor( QString customEditor); + void setFixedDecimals( bool fixedDecimals); + void setUseDefaultPPI( bool useDefaultPPI); + void setDeveloperMode( bool developerMode) override; + void setWhiteBackground( bool whiteBackground); + void setPlotBackground( QString plotBackground); + void setDeveloperFolder( QString developerFolder); + void setUseDefaultEditor( bool useDefaultEditor); + void browseSpreadsheetEditor(); + void browseDeveloperFolder(); + void browseDeveloperLibPathFolder(); + void browseConfigurationFile(); + void removeEmptyValue( QString value); + void addEmptyValue( QString value); + void resetEmptyValues(); + void setThresholdScale( int thresholdScale); + void setLogToFile( bool logToFile); + void setLogFilesMax( int logFilesMax); + void setMaxFlickVelocity( int maxFlickVelocity); + void setModulesRemember( bool modulesRemember); + void setModulesRemembered( QStringList modulesRemembered); + void setSafeGraphics( bool safeGraphics); + void setCranRepoURL( QString cranRepoURL); + void setModuleLibraryURL( QString moduleLibraryURL); + void setGithubPatUseDefault( bool useDefault); + void setGithubPatCustom( QString pat); + void moduleEnabledChanged( QString moduleName, bool enabled); + void onUseDefaultPPIChanged( bool useDefault); + void onCustomPPIChanged( int); + void onDefaultPPIChanged( int); + void setCurrentThemeName( QString currentThemeName) override; + void setInterfaceFont( QString interfaceFont); + void setCodeFont( QString codeFont); + void setResultFont( QString resultFont); + void setUseNativeFileDialog( bool useNativeFileDialog); + void setDisableAnimations( bool disableAnimations); + void setGenerateMarkdown( bool generateMarkdown); + void resetRememberedModules( bool clear); + void setMaxEngines( int maxEngines); + void setWindowsNoBomNative( bool windowsNoBomNative); + void setWindowsChosenCodePage( int windowsChosenCodePage); + void setDbShowWarning( bool dbShowWarning); + void setDataLabelNA( QString dataLabelNA); + void setGuiQtTextRender( bool newGuiQtTextRender); + void onGuiQtTextRenderChanged( bool newGuiQtTextRenderSetting); + void setReportingMode( bool reportingMode); + void setShowRSyntax( bool showRSyntax) override; + void setShowAllROptions( bool showAllROptions) override; + void setShowRSyntaxInResults( bool showRSyntax); + void currentThemeNameHandler(); + void setALTNavModeActive( bool ALTNavModeActive); + void setOrderByValueByDefault( bool orderByValueByDefault); + void setMaxScaleLevels( int maxScaleLevels); + void setPdfPageSize( int pdfPageSize); + void setPdfLandscape( bool pdfLandscape); + void setDirectLibpathEnabled( bool setDirectLibpathEnabled); + void setDirectLibpathFolder( QString libpath); + void setDirectDevModName( QString name); + void setEngineSandbox( bool engineSandbox); + void setLocalConfigurationPATH( QString path); + void setRemoteConfiguration( bool enabled); + void setRemoteConfigurationURL( QString URL); + void setUseConfigurationFile( bool newUseConfigurationFile); + void setOnboardingCompleted( bool newOnboardingCompleted); + void setOnboardingStep( int newOnboardingStep); + + + signals: - void fixedDecimalsChanged( bool fixedDecimals); - void fixedDecimalsChangedString( QString fixedDecimals); - void numDecimalsChanged( int numDecimals); - void exactPValuesChanged( bool exactPValues); - void normalizedNotationChanged( bool normalizedNotation); - void useDefaultEditorChanged( bool useDefaultEditor); - void customEditorChanged( QString customEditor); - void useDefaultPPIChanged( bool useDefaultPPI); - void whiteBackgroundChanged(); - void customPPIChanged( int customPPI); - void defaultPPIChanged( int defaultPPI); - void emptyValuesChanged(); - void developerFolderChanged( QString developerFolder); - void plotPPIChanged( int ppiForPlot, bool wasUserAction); - void plotBackgroundChanged( QString plotBackground); - void thresholdScaleChanged( int thresholdScale); - void logToFileChanged( bool logToFile); - void logFilesMaxChanged( int logFilesMax); - void modulesRememberChanged( bool modulesRemember); - void modulesRememberedChanged(); - void safeGraphicsChanged( bool safeGraphics); - void cranRepoURLChanged( QString cranRepoURL); - void moduleLibraryURLChanged( QString moduleLibraryURL); - void githubPatUseDefaultChanged( bool githubPatUseDefault); - void githubPatCustomChanged(); - void codeFontChanged( QString codeFont); - void resultFontChanged( QString resultFont); - void currentThemeNameChanged( QString currentThemeName); - void plotPPIPropChanged(); - void useNativeFileDialogChanged( bool useNativeFileDialog); - void disableAnimationsChanged( bool disableAnimations); - void generateMarkdownChanged( bool generateMarkdown); - void lcCtypeChanged(); - void restartAllEngines(); - void maxEnginesChanged( int maxEngines); - void windowsNoBomNativeChanged( bool windowsNoBomNative); - void windowsChosenCodePageChanged( int windowsChosenCodePage); - void dbShowWarningChanged( bool dbShowWarning); - void maxEnginesAdminChanged(); - void dataLabelNAChanged( QString dataLabelNA); - void guiQtTextRenderChanged( bool guiQtTextRender); - void reportingModeChanged( bool reportingMode); - void showRSyntaxInResultsChanged( bool showRSyntax); - void aboutToChangeEmptyValues( QStringList newValues); - void orderByValueByDefaultChanged( bool orderByValueByDefault); - void checkUpdatesAskUserChanged( bool checkAsk); - void checkUpdatesChanged( bool check); - void maxScaleLevelsChanged( int maxScaleLevels); - void pdfPageSizeChanged( int pdfPageSize); - void pdfLandscapeChanged( bool pdfLandscape); - void directLibpathEnabledChanged( bool directLibpathEnabled); - void directLibpathFolderChanged(); - void directDevModNameChanged( QString name); - void engineSandboxChanged( bool engineSandbox); - void localConfigurationPATHChanged( QString path); - void remoteConfigurationChanged( bool enabled); - void remoteConfigurationURLChanged( QString remoteConfigurationURL); - void useConfigurationFileChanged( bool enabled); - void startMaximizedChanged( bool startMaximized); - void storeStateEtcChanged( bool state); - void showInteractiveDefaultChanged( bool interactive); - void autoSaveIntervalSecChanged( int interval); - void autoSaveAtAllChanged( bool autoSave); - void aiCommonSystemPromptChanged( QString aiCommonSystemPrompt); - void aiCommonSystemPromptUseCustomChanged( bool aiCommonSystemPromptUseCustom); - void aiEnabledChanged( bool aiEnabled); - void aiAnnotationUseCustomChanged(bool aiAnnotationUseCustom); - void aiAnnotationPromptChanged( QString aiAnnotationPrompt); - void aiUserAvatarChanged( QString aiUserAvatar); - - void rpcServerEnabledChanged( bool rpcServerEnabled); - void rpcServerIpChanged( QString rpcServerIp); - void rpcServerPortChanged( int rpcServerPort); - - private slots: - void dataLabelNAChangedSlot(QString label); - + void fixedDecimalsChanged( bool fixedDecimals); + void fixedDecimalsChangedString( QString fixedDecimals); + void numDecimalsChanged( int numDecimals); + void exactPValuesChanged( bool exactPValues); + void normalizedNotationChanged( bool normalizedNotation); + void useDefaultEditorChanged( bool useDefaultEditor); + void customEditorChanged( QString customEditor); + void useDefaultPPIChanged( bool useDefaultPPI); + void whiteBackgroundChanged(); + void customPPIChanged( int customPPI); + void defaultPPIChanged( int defaultPPI); + void emptyValuesChanged(); + void developerFolderChanged( QString developerFolder); + void plotPPIChanged( int ppiForPlot, bool wasUserAction); + void plotBackgroundChanged( QString plotBackground); + void thresholdScaleChanged( int thresholdScale); + void logToFileChanged( bool logToFile); + void logFilesMaxChanged( int logFilesMax); + void modulesRememberChanged( bool modulesRemember); + void modulesRememberedChanged(); + void safeGraphicsChanged( bool safeGraphics); + void cranRepoURLChanged( QString cranRepoURL); + void moduleLibraryURLChanged( QString moduleLibraryURL); + void githubPatUseDefaultChanged( bool githubPatUseDefault); + void githubPatCustomChanged(); + void codeFontChanged( QString codeFont); + void resultFontChanged( QString resultFont); + void currentThemeNameChanged( QString currentThemeName); + void plotPPIPropChanged(); + void useNativeFileDialogChanged( bool useNativeFileDialog); + void disableAnimationsChanged( bool disableAnimations); + void generateMarkdownChanged( bool generateMarkdown); + void lcCtypeChanged(); + void restartAllEngines(); + void maxEnginesChanged( int maxEngines); + void windowsNoBomNativeChanged( bool windowsNoBomNative); + void windowsChosenCodePageChanged( int windowsChosenCodePage); + void dbShowWarningChanged( bool dbShowWarning); + void maxEnginesAdminChanged(); + void dataLabelNAChanged( QString dataLabelNA); + void guiQtTextRenderChanged( bool guiQtTextRender); + void reportingModeChanged( bool reportingMode); + void showRSyntaxInResultsChanged( bool showRSyntax); + void aboutToChangeEmptyValues( QStringList newValues); + void orderByValueByDefaultChanged( bool orderByValueByDefault); + void checkUpdatesAskUserChanged( bool checkAsk); + void checkUpdatesChanged( bool check); + void maxScaleLevelsChanged( int maxScaleLevels); + void pdfPageSizeChanged( int pdfPageSize); + void pdfLandscapeChanged( bool pdfLandscape); + void directLibpathEnabledChanged( bool directLibpathEnabled); + void directLibpathFolderChanged(); + void directDevModNameChanged( QString name); + void engineSandboxChanged( bool engineSandbox); + void localConfigurationPATHChanged( QString path); + void remoteConfigurationChanged( bool enabled); + void remoteConfigurationURLChanged( QString remoteConfigurationURL); + void useConfigurationFileChanged( bool enabled); + void startMaximizedChanged( bool startMaximized); + void storeStateEtcChanged( bool state); + void showInteractiveDefaultChanged( bool interactive); + void autoSaveIntervalSecChanged( int interval); + void autoSaveAtAllChanged( bool autoSave); + void aiCommonSystemPromptChanged( QString aiCommonSystemPrompt); + void aiCommonSystemPromptUseCustomChanged( bool aiCommonSystemPromptUseCustom); + void aiEnabledChanged( bool aiEnabled); + void aiAnnotationUseCustomChanged(bool aiAnnotationUseCustom); + void aiAnnotationPromptChanged( QString aiAnnotationPrompt); + void aiUserAvatarChanged( QString aiUserAvatar); + + void rpcServerEnabledChanged( bool rpcServerEnabled); + void rpcServerIpChanged( QString rpcServerIp); + void rpcServerPortChanged( int rpcServerPort); + void onboardingCompletedChanged( bool onboardingCompleted); + void onboardingStepChanged( int onboardingStep); + +private slots: + void dataLabelNAChangedSlot(QString label); + private: - int _defaultPPI = 192; - double _uiScale = -1; - QStringList _allFonts, - _allInterfaceFonts, - _allResultFonts, - _allCodeFonts; - QVariantList _pdfPageSizeModel; - bool _githubPatCustom, //Should be initialized on prefs construction - _autoSaveIntervalSec, - _autoSaveAtAll; - AIPersonaModel* _aiPersonaModel = nullptr; - void _loadDatabaseFont(); - QString _checkFontList(QString fonts) const; - QStringList _splitValues(const QString& values) const; - void _setEmptyValues(const QStringList& values); + int _defaultPPI = 192; + double _uiScale = -1; + QStringList _allFonts, + _allInterfaceFonts, + _allResultFonts, + _allCodeFonts; + QVariantList _pdfPageSizeModel; + bool _githubPatCustom, //Should be initialized on prefs construction + _autoSaveIntervalSec, + _autoSaveAtAll; + AIPersonaModel* _aiPersonaModel = nullptr; + void _loadDatabaseFont(); + QString _checkFontList(QString fonts) const; + QStringList _splitValues(const QString& values) const; + void _setEmptyValues(const QStringList& values); }; #endif // PREFERENCESDIALOG_H diff --git a/Desktop/utilities/settings.cpp b/Desktop/utilities/settings.cpp index 4c41dde91b..5347e18d62 100644 --- a/Desktop/utilities/settings.cpp +++ b/Desktop/utilities/settings.cpp @@ -156,6 +156,8 @@ const Settings::Setting Settings::Values[] = { {"rpcServerEnabled", false}, {"rpcServerIp", "127.0.0.1"}, {"rpcServerPort", 48164}, + {"onboardingCompleted", false}, + {"onboardingStep", 0}, }; QVariant Settings::value(Settings::Type key) { diff --git a/Desktop/utilities/settings.h b/Desktop/utilities/settings.h index 2c537a1baf..b1752e210b 100644 --- a/Desktop/utilities/settings.h +++ b/Desktop/utilities/settings.h @@ -111,6 +111,8 @@ class Settings { RPC_SERVER_ENABLED, RPC_SERVER_IP, RPC_SERVER_PORT, + ONBOARDING_COMPLETED, + ONBOARDING_STEP, }; static QVariant value(Settings::Type key);