You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
306 lines
9.6 KiB
306 lines
9.6 KiB
/* |
|
This source file is part of Konsole, a terminal emulator. |
|
|
|
Copyright 2006-2008 by Robert Knight <robertknight@gmail.com> |
|
|
|
This program is free software; you can redistribute it and/or modify |
|
it under the terms of the GNU General Public License as published by |
|
the Free Software Foundation; either version 2 of the License, or |
|
(at your option) any later version. |
|
|
|
This program is distributed in the hope that it will be useful, |
|
but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
GNU General Public License for more details. |
|
|
|
You should have received a copy of the GNU General Public License |
|
along with this program; if not, write to the Free Software |
|
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA |
|
02110-1301 USA. |
|
*/ |
|
|
|
#ifndef PROFILEMANAGER_H |
|
#define PROFILEMANAGER_H |
|
|
|
// Qt |
|
#include <QKeySequence> |
|
#include <QHash> |
|
#include <QList> |
|
#include <QSet> |
|
#include <QStringList> |
|
#include <QVariant> |
|
#include <QStack> |
|
|
|
// Konsole |
|
#include "Profile.h" |
|
|
|
namespace Konsole { |
|
/** |
|
* Manages profiles which specify various settings for terminal sessions |
|
* and their displays. |
|
* |
|
* Profiles in the manager have a concept of favorite status, which can be used |
|
* by widgets and dialogs in the application decide which profiles to list and |
|
* how to display them. The favorite status of a profile can be altered using |
|
* setFavorite() and retrieved using isFavorite() |
|
*/ |
|
class KONSOLEPRIVATE_EXPORT ProfileManager : public QObject |
|
{ |
|
Q_OBJECT |
|
|
|
public: |
|
/** |
|
* Constructs a new profile manager and loads information about the available |
|
* profiles. |
|
*/ |
|
ProfileManager(); |
|
|
|
/** |
|
* Destroys the ProfileManager. |
|
*/ |
|
~ProfileManager() override; |
|
|
|
/** |
|
* Returns the profile manager instance. |
|
*/ |
|
static ProfileManager *instance(); |
|
|
|
/** |
|
* Returns a list of all available profiles |
|
* |
|
* Initially only the profile currently set as the default is loaded. |
|
* |
|
* Favorite profiles are loaded automatically when findFavorites() is called. |
|
* |
|
* When this method is called, it calls loadAllProfiles() internally to |
|
* ensure all available profiles are loaded and usable. |
|
*/ |
|
QList<Profile::Ptr> allProfiles(); |
|
|
|
/** |
|
* Returns a list of already loaded profiles |
|
*/ |
|
QList<Profile::Ptr> loadedProfiles() const; |
|
|
|
/** |
|
* Loads all available profiles. This involves reading each |
|
* profile configuration file from disk and parsing it. |
|
* Therefore it should only be done when necessary. |
|
*/ |
|
void loadAllProfiles(); |
|
|
|
/** |
|
* Loads a profile from the specified path and registers |
|
* it with the ProfileManager. |
|
* |
|
* @p path may be relative or absolute. The path may just be the |
|
* base name of the profile to load (eg. if the profile's full path |
|
* is "<konsole data dir>/My Profile.profile" then both |
|
* "konsole/My Profile.profile" , "My Profile.profile" and |
|
* "My Profile" will be accepted) |
|
* |
|
* @return Pointer to a profile which can be passed to |
|
* SessionManager::createSession() to create a new session using |
|
* this profile. |
|
*/ |
|
Profile::Ptr loadProfile(const QString &shortPath); |
|
|
|
/** |
|
* Searches for available profiles on-disk and returns a list |
|
* of paths of profiles which can be loaded. |
|
*/ |
|
QStringList availableProfilePaths() const; |
|
|
|
/** |
|
* Returns a list of names of all available profiles |
|
*/ |
|
QStringList availableProfileNames() const; |
|
|
|
/** |
|
* Registers a new type of session. |
|
* The favorite status of the session ( as returned by isFavorite() ) is set to false by default. |
|
*/ |
|
void addProfile(const Profile::Ptr &profile); |
|
|
|
/** |
|
* Deletes the configuration file used to store a profile. |
|
* The profile will continue to exist while sessions are still using it. The profile |
|
* will be marked as hidden (see Profile::setHidden() ) so that it does not show |
|
* up in profile lists and future changes to the profile are not stored to disk. |
|
* |
|
* Returns true if the profile was successfully deleted or false otherwise. |
|
*/ |
|
bool deleteProfile(Profile::Ptr profile); |
|
|
|
/** |
|
* Updates a @p profile with the changes specified in @p propertyMap. |
|
* |
|
* All sessions currently using the profile will be updated to reflect the new settings. |
|
* |
|
* After the profile is updated, the profileChanged() signal will be emitted. |
|
* |
|
* @param profile The profile to change |
|
* @param propertyMap A map between profile properties and values describing the changes |
|
* @param persistent If true, the changes are saved to the profile's configuration file, |
|
* set this to false if you want to preview possible changes to a profile but do not |
|
* wish to make them permanent. |
|
*/ |
|
void changeProfile(Profile::Ptr profile, QHash<Profile::Property, QVariant> propertyMap, |
|
bool persistent = true); |
|
|
|
/** |
|
* Sets the @p profile as the default profile for creating new sessions |
|
*/ |
|
void setDefaultProfile(const Profile::Ptr &profile); |
|
|
|
/** |
|
* Returns a Profile object describing the default profile |
|
*/ |
|
Profile::Ptr defaultProfile() const; |
|
|
|
/** |
|
* Returns a Profile object with hard-coded settings which is always available. |
|
* This can be used as a parent for new profiles which provides suitable default settings |
|
* for all properties. |
|
*/ |
|
Profile::Ptr fallbackProfile() const; |
|
|
|
/** |
|
* Specifies whether a profile should be included in the user's |
|
* list of favorite profiles. |
|
*/ |
|
void setFavorite(const Profile::Ptr &profile, bool favorite); |
|
|
|
/** |
|
* Returns the set of the user's favorite profiles. |
|
*/ |
|
QSet<Profile::Ptr> findFavorites(); |
|
|
|
QList<Profile::Ptr> sortedFavorites(); |
|
|
|
/** |
|
* Sorts the profile list by menuindex; those without an menuindex, sort by name. |
|
* The menuindex list is first and then the non-menuindex list. |
|
* |
|
* @param list The profile list to sort |
|
*/ |
|
void sortProfiles(QList<Profile::Ptr> &list); |
|
|
|
/** |
|
* Associates a shortcut with a particular profile. |
|
*/ |
|
void setShortcut(Profile::Ptr profile, const QKeySequence &keySequence); |
|
|
|
/** Returns the shortcut associated with a particular profile. */ |
|
QKeySequence shortcut(Profile::Ptr profile) const; |
|
|
|
Q_SIGNALS: |
|
|
|
/** Emitted when a profile is added to the manager. */ |
|
void profileAdded(const Profile::Ptr &ptr); |
|
/** Emitted when a profile is removed from the manager. */ |
|
void profileRemoved(const Profile::Ptr &ptr); |
|
/** Emitted when a profile's properties are modified. */ |
|
void profileChanged(const Profile::Ptr &ptr); |
|
|
|
/** |
|
* Emitted when the favorite status of a profile changes. |
|
* |
|
* @param profile The profile to change |
|
* @param favorite Specifies whether the profile is a favorite or not |
|
*/ |
|
void favoriteStatusChanged(const Profile::Ptr &profile, bool favorite); |
|
|
|
/** |
|
* Emitted when the shortcut for a profile is changed. |
|
* |
|
* @param profile The profile whose status was changed |
|
* @param newShortcut The new shortcut key sequence for the profile |
|
*/ |
|
void shortcutChanged(const Profile::Ptr &profile, const QKeySequence &newShortcut); |
|
|
|
public Q_SLOTS: |
|
/** Saves settings (favorites, shortcuts, default profile etc.) to disk. */ |
|
void saveSettings(); |
|
|
|
protected Q_SLOTS: |
|
|
|
private Q_SLOTS: |
|
|
|
private: |
|
Q_DISABLE_COPY(ProfileManager) |
|
|
|
// loads the mappings between shortcut key sequences and |
|
// profile paths |
|
void loadShortcuts(); |
|
// saves the mappings between shortcut key sequences and |
|
// profile paths |
|
void saveShortcuts(); |
|
|
|
//loads the set of favorite profiles |
|
void loadFavorites(); |
|
//saves the set of favorite profiles |
|
void saveFavorites(); |
|
|
|
// records which profile is set as the default profile |
|
// Note: it does not save the profile itself into disk. That is |
|
// what saveProfile() does. |
|
void saveDefaultProfile(); |
|
|
|
// saves a profile to a file |
|
// returns the path to which the profile was saved, which will |
|
// be the same as the path property of profile if valid or a newly generated path |
|
// otherwise |
|
QString saveProfile(const Profile::Ptr &profile); |
|
|
|
QSet<Profile::Ptr> _profiles; // list of all loaded profiles |
|
QSet<Profile::Ptr> _favorites; // list of favorite profiles |
|
|
|
Profile::Ptr _defaultProfile; |
|
Profile::Ptr _fallbackProfile; |
|
|
|
bool _loadedAllProfiles; // set to true after loadAllProfiles has been called |
|
bool _loadedFavorites; // set to true after loadFavorites has been called |
|
|
|
struct ShortcutData { |
|
Profile::Ptr profileKey; |
|
QString profilePath; |
|
}; |
|
QMap<QKeySequence, ShortcutData> _shortcuts; // shortcut keys -> profile path |
|
|
|
// finds out if it's a internal profile or an external one, |
|
// fixing the path to point to the correct location for the profile. |
|
QString normalizePath(const QString& path) const; |
|
}; |
|
|
|
/** |
|
* PopStackOnExit is a utility to remove all values from a QStack which are added during |
|
* the lifetime of a PopStackOnExit instance. |
|
* |
|
* When a PopStackOnExit instance is destroyed, elements are removed from the stack |
|
* until the stack count is reduced the value when the PopStackOnExit instance was created. |
|
*/ |
|
template<class T> |
|
class PopStackOnExit |
|
{ |
|
public: |
|
explicit PopStackOnExit(QStack<T> &stack) : _stack(stack), |
|
_count(stack.count()) |
|
{ |
|
} |
|
|
|
~PopStackOnExit() |
|
{ |
|
while (_stack.count() > _count) { |
|
_stack.pop(); |
|
} |
|
} |
|
|
|
private: |
|
Q_DISABLE_COPY(PopStackOnExit) |
|
|
|
QStack<T> &_stack; |
|
int _count; |
|
}; |
|
} |
|
#endif //PROFILEMANAGER_H
|
|
|