29#include <QStandardPaths>
33#include "moc_qgsuserprofilemanager.cpp"
35using namespace Qt::StringLiterals;
50 return basePath + QDir::separator() +
"profiles";
55 const QString profileName = defaultProfile.isEmpty() ?
defaultProfileName() : defaultProfile;
62 std::unique_ptr< QgsUserProfile > profile =
profileForName( profileName );
64 profile->initSettings();
71 mRootProfilePath = rootProfileLocation;
76 mSettings = std::make_unique<QSettings>( settingsFile(), QSettings::IniFormat );
81 mWatchProfiles = enabled;
82 if ( mWatchProfiles && !mRootProfilePath.isEmpty() && QDir( mRootProfilePath ).exists() )
84 mWatcher = std::make_unique<QFileSystemWatcher>();
85 mWatcher->addPath( mRootProfilePath );
86 connect( mWatcher.get(), &QFileSystemWatcher::directoryChanged,
this, [
this] { emit profilesChanged(); } );
96 return static_cast< bool >( mWatcher.get() );
101 return !mRootProfilePath.isEmpty();
106 const QString defaultName = u
"default"_s;
115 return mSettings->value( u
"/core/defaultProfile"_s, defaultName ).toString();
120 mSettings->setValue( u
"/core/defaultProfile"_s, name );
131 return mSettings->value( u
"/core/lastProfile"_s, QString() ).toString();
136 mSettings->setValue( u
"/core/lastProfile"_s,
userProfile()->name() );
147 mSettings->setValue( u
"/core/selectionPolicy"_s,
static_cast< int >( policy ) );
153 return QDir( mRootProfilePath ).entryList( QDir::Dirs | QDir::NoDotAndDotDot );
163 const QString profilePath = mRootProfilePath + QDir::separator() + name;
164 return std::make_unique< QgsUserProfile >( profilePath );
173 const QDir folder( mRootProfilePath + QDir::separator() + name );
174 if ( !folder.exists() )
176 if ( !QDir().mkpath( folder.absolutePath() ) )
178 error.
append( tr(
"Cannot write '%1'" ).arg( folder.absolutePath() ) );
183 QFile qgisPrivateDbFile( folder.absolutePath() + QDir::separator() +
"qgis.db" );
186 if ( !qgisPrivateDbFile.exists() )
190 QFile masterFile( qgisMasterDbFileName );
193 if ( !masterFile.copy( qgisPrivateDbFile.fileName() ) )
195 error.
append( tr(
"Could not copy master database to %1" ).arg( qgisPrivateDbFile.fileName() ) );
201 const QFile::Permissions perms = QFile( qgisPrivateDbFile.fileName() ).permissions();
202 if ( !( perms & QFile::WriteOwner ) )
204 if ( !qgisPrivateDbFile.setPermissions( perms | QFile::WriteOwner ) )
206 error.
append( tr(
"Can not make '%1' user writable" ).arg( qgisPrivateDbFile.fileName() ) );
223 QDir folder( mRootProfilePath + QDir::separator() + name );
226 const bool deleted = folder.removeRecursively();
229 error.
append( ( tr(
"Unable to fully delete user profile folder" ) ) );
238QString QgsUserProfileManager::settingsFile()
const
240 return mRootProfilePath + QDir::separator() +
"profiles.ini";
245 return mSettings.get();
250 return mUserProfile.get();
255#if QT_CONFIG( process )
256 const QString path = QDir::toNativeSeparators( QCoreApplication::applicationFilePath() );
257 QStringList arguments;
258 arguments << QCoreApplication::arguments();
262 arguments.removeFirst();
263 arguments << u
"--profile"_s << name;
264 QgsDebugMsgLevel( u
"Starting instance from %1 with %2"_s.arg( path ).arg( arguments.join(
" " ) ), 2 );
265 QProcess::startDetached( path, arguments, QDir::toNativeSeparators( QCoreApplication::applicationDirPath() ) );
268 Q_ASSERT(
"Starting the user profile is not supported on the platform" );
UserProfileSelectionPolicy
User profile selection policy.
static QString qgisMasterDatabaseFilePath()
Returns the path to the master qgis.db file.
A container for error messages.
bool isEmpty() const
Test if no error is set.
void append(const QString &message, const QString &tag)
Append new error message.
A boolean settings entry.
static QgsSettingsTreeNode * sTreeProfile
std::unique_ptr< QgsUserProfile > profileForName(const QString &name) const
Returns the profile found for a given name.
std::unique_ptr< QgsUserProfile > getProfile(const QString &defaultProfile="default", bool createNew=true, bool initSettings=true)
Returns the profile from the given root profile location.
void setRootLocation(const QString &rootProfileLocation)
Set the root profile location for the profile manager.
static const QgsSettingsEntryString * settingsDefaultProfile
QgsError createUserProfile(const QString &name)
Create a user profile given by the name.
void setActiveUserProfile(const QString &profile)
Sets the active profile in the manager.
bool profileExists(const QString &name) const
Check if a profile exists.
QgsUserProfile * userProfile()
The currently active user profile.
void setDefaultProfileName(const QString &name)
Sets the default profile name.
void setDefaultFromActive()
Set the default profile name from the current active profile.
QStringList allProfiles() const
Returns a list of all found profile names.
bool rootLocationIsSet() const
Check if the root location has been set for the manager.
QgsError deleteProfile(const QString &name)
Deletes a profile from the root profiles folder.
QSettings * settings()
Returns the settings for the profile manager.
static QString resolveProfilesFolder(const QString &basePath=QString())
Resolves the profiles folder for the given path.
void setUserProfileSelectionPolicy(Qgis::UserProfileSelectionPolicy policy)
Sets the user profile selection policy.
static const QgsSettingsEntryBool * settingsOverrideLocalProfile
void setNewProfileNotificationEnabled(bool enabled)
Sets whether the manager should watch for the creation of new user profiles and emit the profilesChan...
QString defaultProfileName() const
Returns the name of the default profile that has been set in .default.
QgsUserProfileManager(const QString &rootLocation=QString(), QObject *parent=nullptr)
User profile manager used to manage user profiles for the instance of QGIS.
Qgis::UserProfileSelectionPolicy userProfileSelectionPolicy() const
Returns the user profile selection policy.
void profilesChanged()
Emitted when the list of profiles is changed.
QString lastProfileName() const
Returns the name of the most recently closed profile.
void updateLastProfileName()
Updates the last closed profile name.
QString rootLocation() const
Returns the path to the root profiles location.
void loadUserProfile(const QString &name)
Starts a new instance of QGIS for the given profile.
bool isNewProfileNotificationEnabled() const
Returns whether the manager is watching for the creation of new user profiles and emitting the profil...
User profile contains information about the user profile folders on the machine.
#define QgsDebugMsgLevel(str, level)