HAL
settings_manager.cpp
Go to the documentation of this file.
6 #include <QDir>
7 #include <QApplication>
8 #include <QDesktopWidget>
9 #include <QRect>
10 
11 namespace hal
12 {
13  SettingsManager* SettingsManager:: inst = nullptr;
14 
16  {
17  if(!inst)
18  inst = new SettingsManager;
19 
20  return inst;
21  }
22 
23  SettingsManager::SettingsManager(QObject* parent)
24  : QObject(parent)
25  {
27  QDir defaultConfigDir(QString::fromStdString(utils::get_config_directory().string()));
28 
29  mUserSettingsFile = new QSettings(userConfigDir.absoluteFilePath("guisettings.ini"), QSettings::IniFormat);
30  mDefaultSettingsFile = new QSettings(defaultConfigDir.absoluteFilePath("guidefaults.ini"), QSettings::IniFormat);
31  }
32 
34  {
35  mSettingsList.append(item);
36 
37  QString tag = item->tag();
38  if (mDefaultSettingsFile->contains(tag))
39  item->setDefaultValue(mDefaultSettingsFile->value(tag));
40 
41  if (mUserSettingsFile->contains(tag))
42  item->restoreFromSettings(mUserSettingsFile->value(tag));
43 
45 
46  // qDebug() << "new setting " << item << " " << item->tag();
47  }
48 
50  {
51  SettingsItem* item = static_cast<SettingsItem*>(obj);
52  mSettingsList.removeAll(item);
53  }
54 
56  {
57  for(SettingsItem* item : mSettingsList)
58  if (item->value() != item->defaultValue())
59  mUserSettingsFile->setValue(item->tag(), item->value());
60  else
61  mUserSettingsFile->remove(item->tag());
62 
63  mUserSettingsFile->sync();
64  }
65 
67  {
68  return mDefaultSettingsFile->value(tag);
69  }
70 
72  {
73  return mUserSettingsFile->value(tag);
74  }
75 
77  {
78  return mUserSettingsFile->value("MainWindow/position", QPoint(0, 0)).toPoint();
79  }
80 
82  {
84  return mUserSettingsFile->value("MainWindow/size", rect.size()).toSize();
85  }
86 
88  {
89  mUserSettingsFile->setValue("MainWindow/position", pos);
90  mUserSettingsFile->setValue("MainWindow/size", size);
91  mUserSettingsFile->sync();
92  }
93 
94 
95  void SettingsManager::saveSplitterState(const QString& tag, const QSplitter* splitter)
96  {
97  QString token = QString("splitter/%1").arg(tag);
98  QStringList temp;
99  for (int val : splitter->sizes())
100  temp.append(QString::number(val));
101  mUserSettingsFile->setValue(token, temp.join(','));
102  }
103 
104  void SettingsManager::restoreSplitterState(const QString& tag, QSplitter* splitter) const
105  {
106  QString token = QString("splitter/%1").arg(tag);
107  if (!mUserSettingsFile->contains(token)) return;
108  QStringList temp = mUserSettingsFile->value(token).toString().split(',');
109  QList<int> sizes;
110  for (const QString& s : temp)
111  sizes.append(s.toInt());
112  splitter->setSizes(sizes);
113  }
114 
116  {
117  QString token = cw->name() + "/%1";
118  if (mUserSettingsFile->contains(token.arg("detachedPosition")))
119  {
120  cw->detach();
121  ContentFrame*cf = cw->detachedFrame();
122  if (cf) cf->setGeometry(QRect(mUserSettingsFile->value(token.arg("detachedPosition")).toPoint(),
123  mUserSettingsFile->value(token.arg("size")).toSize()));
124  }
125  }
126 
128  {
129  ContentWidgetPlacement retval;
130  QString token = cw->name() + "/%1";
131  retval.widget = cw;
132  retval.index = mUserSettingsFile->value(token.arg("index"), -1).toInt();
133  retval.visible = mUserSettingsFile->value(token.arg("visible"), true).toBool();
134  retval.anchorPos = ContentLayout::positionFromString(mUserSettingsFile->value(token.arg("anchor")).toString());
135  if (mUserSettingsFile->contains(token.arg("size")))
136  cw->setGeometry(QRect(QPoint(0,24),mUserSettingsFile->value("size").toSize()));
137  if (mUserSettingsFile->contains(token.arg("detachedPosition")))
138  retval.visible = false;
139  return retval;
140  }
141 
143  {
144  int index = 0;
145  for (const ContentWidget* cw : widgets)
146  {
147  QString token = cw->name() + "/%1";
148  mUserSettingsFile->setValue(token.arg("anchor"), ContentLayout::positionToString(anchorPos));
149  mUserSettingsFile->setValue(token.arg("index"), index++);
150  mUserSettingsFile->setValue(token.arg("visible"), cw->isVisible());
151  mUserSettingsFile->setValue(token.arg("size"), cw->size());
152  if (cw->detachedFrame())
153  mUserSettingsFile->setValue(token.arg("detachedPosition"), cw->detachedFrame()->pos());
154  else
155  mUserSettingsFile->remove(token.arg("detachedPosition"));
156  }
157  mUserSettingsFile->sync();
158  }
159 
161  {
162  LoggerSettings settings;
163  settings.infoSeverity = mUserSettingsFile->value("Logger/infoSeverity", QVariant(true)).toBool();
164  settings.debugSeverity = mUserSettingsFile->value("Logger/debugSeverity", QVariant(false)).toBool();
165  settings.warningSeverity = mUserSettingsFile->value("Logger/warningSeverity", QVariant(true)).toBool();
166  settings.errorSeverity = mUserSettingsFile->value("Logger/errorSeverity", QVariant(true)).toBool();
167 
168  return settings;
169  }
170 
172  {
173  mUserSettingsFile->setValue("Logger/infoSeverity", settings.infoSeverity);
174  mUserSettingsFile->setValue("Logger/debugSeverity", settings.debugSeverity);
175  mUserSettingsFile->setValue("Logger/warningSeverity", settings.warningSeverity);
176  mUserSettingsFile->setValue("Logger/errorSeverity", settings.errorSeverity);
177  mUserSettingsFile->sync();
178  }
179 }
Wraps the ContentWidget class.
Definition: content_frame.h:45
Abstract class for Widgets within HAL's ContentArea.
QString name() const
ContentFrame * detachedFrame() const
The interface for the logical part of a setting.
Definition: settings_item.h:46
virtual QString tag() const
virtual void restoreFromSettings(const QVariant &val)
virtual void setDefaultValue(const QVariant &dv)=0
Manages and persists the settings on the lowest level.
void saveLoggerSettings(const LoggerSettings &settings)
void widgetDetach(ContentWidget *cw) const
void registerSetting(SettingsItem *item)
void restoreSplitterState(const QString &tag, QSplitter *splitter) const
QVariant defaultValue(const QString &tag) const
void mainWindowSaveGeometry(const QPoint &pos, const QSize &size)
QVariant settingsValue(const QString &tag) const
void saveSplitterState(const QString &tag, const QSplitter *splitter)
void widgetsSaveGeometry(ContentLayout::Position anchorPos, QList< const ContentWidget * > &widgets)
LoggerSettings loggerSettings() const
QList< SettingsItem * > mSettingsList
void handleItemDestroyed(QObject *obj)
static SettingsManager * instance()
ContentWidgetPlacement widgetPlacement(ContentWidget *cw) const
QSize mainWindowSize() const
QPoint mainWindowPosition() const
Position positionFromString(const QString &s)
std::filesystem::path get_config_directory()
Definition: utils.cpp:164
std::filesystem::path get_user_config_directory()
Definition: utils.cpp:172
QDesktopWidget * desktop()
const QRect screenGeometry(const QWidget *widget) const const
void append(const T &value)
QMetaObject::Connection connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type)
void destroyed(QObject *obj)
QSize size() const const
bool contains(const QString &key) const const
void remove(const QString &key)
void setValue(const QString &key, const QVariant &value)
void sync()
QVariant value(const QString &key, const QVariant &defaultValue) const const
void setSizes(const QList< int > &list)
QList< int > sizes() const const
QStringList split(const QString &sep, QString::SplitBehavior behavior, Qt::CaseSensitivity cs) const const
QString arg(qlonglong a, int fieldWidth, int base, QChar fillChar) const const
QString fromStdString(const std::string &str)
QString number(int n, int base)
int size() const const
QString join(const QString &separator) const const
bool toBool() const const
int toInt(bool *ok) const const
QPoint toPoint() const const
QSize toSize() const const
QString toString() const const
void setGeometry(int x, int y, int w, int h)
ContentLayout::Position anchorPos