WSJT-X/MultiSettings.hpp
Bill Somerville ff6e5c7d9b Allow for ampersand characters in configuration names
Ampersand characters  have special significance in  action names, they
indicate the following character is an accelerator. This change allows
single   ampersand  characters   but   filters  them   out  from   the
MultiSettings::configuration_name_changed  signal.  Double  ampersands
may be used to escape a single ampersand.

git-svn-id: svn+ssh://svn.code.sf.net/p/wsjt/wsjt/branches/wsjtx@7338 ab8295b8-cf94-4d9e-aec4-7959e3be5d79
2016-11-27 01:34:35 +00:00

102 lines
3.1 KiB
C++

#ifndef MULTISETTINGS_HPP__
#define MULTISETTINGS_HPP__
#include <QObject>
#include <QVariant>
#include "pimpl_h.hpp"
class QSettings;
class QMainWindow;
class QMenu;
class QString;
//
// MultiSettings - Manage multiple configuration names
//
// Responsibilities:
//
// MultiSettings allows a Qt application to be run with alternative
// settings as stored in a QSettings INI style file. As far as the
// application is concerned it uses the QSettings instance returned
// by the MultiSettings::settings() method as if it were the one and
// only QSettings object. The alternative settings are stored as
// QSettings groups which are children of a root level group called
// MultiSettings. The current settings are themselves stored at the
// root so the QSettings group name MultiSettings is reserved. Also
// at the root level a key called CurrentMultiSettingsConfiguration
// is reserved to store the current configuration name.
//
//
// Example Usage:
//
// #include <QApplication>
// #include "MultiSettings.hpp"
// #include "MyMainWindow.hpp"
//
// int main (int argc, char * argv[]) {
// QApplication a {argc, argv};
// MultiSettings multi_settings;
// int result;
// do {
// MyMainWindow main_window {&multi_settings};
// main_window.show ();
// result = a.exec ();
// } while (!result && !multi_settings.exit ());
// return result;
// }
//
// In the main window call MultiSettings::create_menu_actions() to
// populate an existing QMenu widget with the configuration switching
// and maintenance actions. This would normally be done in the main
// window class constructor:
//
// MyMainWindow::MyMainWindow (MultiSettings * multi_settings) {
// QSettings * settings {multi_settings->settings ()};
// // ...
// multi_settings->create_menu_actions (this, ui->configurations_menu);
// // ...
// }
//
class MultiSettings
: public QObject
{
Q_OBJECT
public:
explicit MultiSettings ();
MultiSettings (MultiSettings const&) = delete;
MultiSettings& operator = (MultiSettings const&) = delete;
~MultiSettings ();
// Add multiple configurations navigation and maintenance actions to
// a provided menu. The provided main window object instance will
// have its close() function called when a "Switch To" configuration
// action is triggered.
void create_menu_actions (QMainWindow *, QMenu *);
// Access to the QSettings object instance.
QSettings * settings ();
// Access to values in a common section
QVariant common_value (QString const& key, QVariant const& default_value = QVariant {}) const;
void set_common_value (QString const& key, QVariant const& value);
void remove_common_value (QString const& key);
// Call this to determine if the application is terminating, if it
// returns false then the application main window should be
// recreated, shown and the application exec() function called
// again.
bool exit ();
// emitted when the name of the current configuration changes
Q_SIGNAL void configurationNameChanged (QString name) const;
private:
class impl;
pimpl<impl> m_;
};
#endif