diff --git a/app/appsettings.cpp b/app/appsettings.cpp index 34c12d008..e05f3214f 100644 --- a/app/appsettings.cpp +++ b/app/appsettings.cpp @@ -19,21 +19,23 @@ AppSettings::AppSettings( QObject *parent ): QObject( parent ) { QSettings settings; settings.beginGroup( CoreUtils::QSETTINGS_APP_GROUP_NAME ); - const QString path = settings.value( "defaultProject", "" ).toString(); - const QString layer = settings.value( "defaultLayer/" + path, "" ).toString(); - const double gpsTolerance = settings.value( "gpsTolerance", 10 ).toDouble(); - const int lineRecordingInterval = settings.value( "lineRecordingInterval", 3 ).toInt(); - int streamingIntervalType = settings.value( "intervalType", 0 ).toInt(); + const QString path = settings.value( QStringLiteral( "defaultProject" ), "" ).toString(); + const QString layer = settings.value( QStringLiteral( "defaultLayer/" ) + path, "" ).toString(); + const double gpsTolerance = settings.value( QStringLiteral( "gpsTolerance" ), 10 ).toDouble(); + const int lineRecordingInterval = settings.value( QStringLiteral( "lineRecordingInterval" ), 3 ).toInt(); + int streamingIntervalType = settings.value( QStringLiteral( "intervalType" ), 0 ).toInt(); const StreamingIntervalType::IntervalType intervalType = static_cast( streamingIntervalType ); - const bool reuseLastEnteredValues = settings.value( "reuseLastEnteredValues", false ).toBool(); + const bool reuseLastEnteredValues = settings.value( QStringLiteral( "reuseLastEnteredValues" ), false ).toBool(); const QString savedAppVersion = settings.value( QStringLiteral( "appVersion" ), QString() ).toString(); const QString activeProviderId = settings.value( QStringLiteral( "activePositionProviderId" ) ).toString(); const bool autosync = settings.value( QStringLiteral( "autosyncAllowed" ), false ).toBool(); - const double gpsHeight = settings.value( "gpsHeight", 0 ).toDouble(); + const double gpsHeight = settings.value( QStringLiteral( "gpsHeight" ), 0 ).toDouble(); const QString ignoreMigrateVersion = settings.value( QStringLiteral( "ignoreMigrateVersion" ) ).toString(); const bool autolockPosition = settings.value( QStringLiteral( "autolockPosition" ), true ).toBool(); - int hapticsTypeInt = settings.value( "hapticsType", 0 ).toInt(); + int hapticsTypeInt = settings.value( QStringLiteral( "hapticsType" ), 0 ).toInt(); const HapticsType hapticsType = static_cast( hapticsTypeInt ); + int startupBehaviorInt = settings.value( QStringLiteral( "startupBehavior" ), 0 ).toInt(); + const StartupBehavior startupBehavior = static_cast( startupBehaviorInt ); settings.endGroup(); @@ -51,6 +53,7 @@ AppSettings::AppSettings( QObject *parent ): QObject( parent ) setIgnoreMigrateVersion( ignoreMigrateVersion ); setAutolockPosition( autolockPosition ); setHapticsType( hapticsType ); + setStartupBehavior( startupBehavior ); } QString AppSettings::defaultLayer() const @@ -62,7 +65,7 @@ void AppSettings::setDefaultLayer( const QString &value ) { if ( defaultLayer() != value ) { - setValue( "defaultLayer/" + mActiveProject, value ); + setValue( QStringLiteral( "defaultLayer/" ) + mActiveProject, value ); mDefaultLayers.insert( mActiveProject, value ); emit defaultLayerChanged(); } @@ -316,6 +319,21 @@ void AppSettings::setHapticsType( const HapticsType hapticsType ) emit hapticsTypeChanged( hapticsType ); } +AppSettings::StartupBehavior AppSettings::startupBehavior() const +{ + return mStartupBehavior; +} + +void AppSettings::setStartupBehavior( const StartupBehavior startupBehavior ) +{ + if ( mStartupBehavior == startupBehavior ) + return; + + setValue( QStringLiteral( "startupBehavior" ), startupBehavior ); + mStartupBehavior = startupBehavior; + emit startupBehaviorChanged( startupBehavior ); +} + double AppSettings::gpsAntennaHeight() const { return std::round( mGpsAntennaHeight / 0.001 ) * 0.001; diff --git a/app/appsettings.h b/app/appsettings.h index a684e416c..2812a601f 100644 --- a/app/appsettings.h +++ b/app/appsettings.h @@ -38,6 +38,7 @@ class AppSettings: public QObject Q_PROPERTY( bool autolockPosition READ autolockPosition WRITE setAutolockPosition NOTIFY autolockPositionChanged ) Q_PROPERTY( QList windowPosition READ windowPosition WRITE setWindowPosition NOTIFY windowPositionChanged ) Q_PROPERTY( HapticsType hapticsType READ hapticsType WRITE setHapticsType NOTIFY hapticsTypeChanged ) + Q_PROPERTY( StartupBehavior startupBehavior READ startupBehavior WRITE setStartupBehavior NOTIFY startupBehaviorChanged ) public: // enum of haptic modes we support @@ -55,6 +56,14 @@ class AppSettings: public QObject }; Q_ENUM( HapticsType ) + // enum of options for what should open when the app starts + enum StartupBehavior + { + StartupRecentProject = 0, + StartupProjectHome + }; + Q_ENUM( StartupBehavior ) + explicit AppSettings( QObject *parent = nullptr ); QString defaultProject() const; @@ -110,6 +119,9 @@ class AppSettings: public QObject HapticsType hapticsType() const; void setHapticsType( HapticsType hapticsType ); + StartupBehavior startupBehavior() const; + void setStartupBehavior( StartupBehavior startupBehavior ); + public slots: void setReuseLastEnteredValues( bool reuseLastEnteredValues ); @@ -129,6 +141,7 @@ class AppSettings: public QObject void autosyncAllowedChanged( bool autosyncAllowed ); void autolockPositionChanged( bool autolockPosition ); void hapticsTypeChanged( HapticsType hapticsType ); + void startupBehaviorChanged( StartupBehavior startupBehavior ); void ignoreMigrateVersionChanged(); @@ -169,6 +182,7 @@ class AppSettings: public QObject QString mIgnoreMigrateVersion; HapticsType mHapticsType; + StartupBehavior mStartupBehavior; }; #endif // APPSETTINGS_H diff --git a/app/qml/main.qml b/app/qml/main.qml index f1f75837a..340f88280 100644 --- a/app/qml/main.qml +++ b/app/qml/main.qml @@ -119,7 +119,10 @@ ApplicationWindow { Component.onCompleted: { // load default project - if ( AppSettings.defaultProject ) { + if ( AppSettings.startupBehavior === AppSettings.StartupProjectHome || !AppSettings.defaultProject ) { + stateManager.state = "projects" + } + else { let path = AppSettings.defaultProject if ( __localProjectsManager.projectIsValid( path ) && __activeProject.load( path ) ) { @@ -131,9 +134,6 @@ ApplicationWindow { stateManager.state = "projects" } } - else { - stateManager.state = "projects" - } // Catch back button click (if no other component catched it so far) // to prevent QT from quitting the APP immediately diff --git a/app/qml/settings/MMSettingsPage.qml b/app/qml/settings/MMSettingsPage.qml index 26435fddc..833405f51 100644 --- a/app/qml/settings/MMSettingsPage.qml +++ b/app/qml/settings/MMSettingsPage.qml @@ -9,6 +9,7 @@ import QtQuick import QtQuick.Controls +import QtQml.Models import mm 1.0 as MM import MMInput @@ -37,6 +38,13 @@ MMPage { } } + ListModel { + id: startupBehaviorModel + + ListElement { text: qsTr("Recent project"); description: qsTr("Jump back into your last project") } // AppSettings.StartupRecentProject + ListElement { text: qsTr("Project home"); description: qsTr("See all your downloaded projects") } // AppSettings.StartupProjectHome + } + pageBottomMarginPolicy: MMPage.BottomMarginPolicy.PaintBehindSystemBar pageContent: MMScrollView { @@ -216,6 +224,22 @@ MMPage { Item { width: 1; height: 1 } + MMSettingsComponents.MMSettingsDropdown { + width: parent.width + + title: qsTr("Startup behaviour") + description: qsTr("Choose what opens when you launch the app") + + currentIndex: AppSettings.startupBehavior + + model: startupBehaviorModel + value: model.get(currentIndex).text + + onCurrentIndexChanged: AppSettings.startupBehavior = currentIndex + } + + MMLine {} + MMSettingsComponents.MMSettingsItem { width: parent.width title: qsTr("About") diff --git a/app/qml/settings/components/MMSettingsDropdown.qml b/app/qml/settings/components/MMSettingsDropdown.qml index d5030515c..d60dc695a 100644 --- a/app/qml/settings/components/MMSettingsDropdown.qml +++ b/app/qml/settings/components/MMSettingsDropdown.qml @@ -17,6 +17,7 @@ MMSettingsItem { property var model property int currentIndex: -1 + property string drawerTitle: title onClicked: { if(root.model?.count > 0) { @@ -37,12 +38,13 @@ MMSettingsItem { MMComponents.MMListDrawer { - drawerHeader.title: root.title + drawerHeader.title: root.drawerTitle list.model: root.model list.delegate: MMComponents.MMListDelegate { text: model.text + secondaryText: model.description ?? "" rightContent: MMComponents.MMIcon { source: __style.doneCircleIcon