Utilize templates for Settings class

Use boost2::signals for the valueChanged signal (a LOT less messy to
        deal with than qt signals)
Remove unused settings classes (BoolSetting, FloatSetting, IntSetting,
        StringSetting)

What's left: Implement the remaining signals
This commit is contained in:
Rasmus Karlsson
2017-01-22 23:00:35 +01:00
parent 84be4c9046
commit 5429e62e73
13 changed files with 189 additions and 512 deletions
-58
View File
@@ -1,58 +0,0 @@
#ifndef BOOLSETTING_H
#define BOOLSETTING_H
#include "settings/setting.h"
#include <QString>
namespace chatterino {
namespace settings {
class BoolSetting : public Setting
{
Q_OBJECT
public:
BoolSetting(const QString &name, bool defaultValue)
: Setting(name)
, value(defaultValue)
, defaultValue(defaultValue)
{
}
bool
get() const
{
return this->value;
}
void
set(bool value)
{
if (this->value != value) {
this->value = value;
emit valueChanged(value);
}
}
void
save(const QSettings &settings) override
{
}
void
load(const QSettings &settings) override
{
}
signals:
void valueChanged(bool value);
private:
bool value;
bool defaultValue;
};
}
}
#endif // BOOLSETTING_H
-58
View File
@@ -1,58 +0,0 @@
#ifndef REALSETTING_H
#define REALSETTING_H
#include "settings/setting.h"
#include <QString>
namespace chatterino {
namespace settings {
class FloatSetting : public Setting
{
Q_OBJECT
public:
FloatSetting(const QString &name, qreal defaultValue,
qreal minValue = std::numeric_limits<qreal>::min(),
qreal maxValue = std::numeric_limits<qreal>::max())
: Setting(name)
, value(defaultValue)
, defaultValue(defaultValue)
, minValue(minValue)
, maxValue(maxValue)
{
}
qreal
get() const
{
return this->value;
}
qreal
set(qreal value)
{
return (this->value = std::max(std::min(value, maxValue), minValue));
}
void
save(const QSettings &settings) override
{
}
void
load(const QSettings &settings) override
{
}
private:
qreal value;
qreal defaultValue;
qreal minValue;
qreal maxValue;
};
}
}
#endif // REALSETTING_H
-51
View File
@@ -1,51 +0,0 @@
#ifndef INTSETTING_H
#define INTSETTING_H
#include "settings/setting.h"
#include <QString>
namespace chatterino {
namespace settings {
class IntSetting : public Setting
{
Q_OBJECT
public:
IntSetting(const QString &name, int defaultValue)
: Setting(name)
, value(defaultValue)
, defaultValue(defaultValue)
{
}
int
get() const
{
return this->value;
}
int
set(int value)
{
return (this->value = value);
}
void
save(const QSettings &settings) override
{
}
void
load(const QSettings &settings) override
{
}
private:
int value;
int defaultValue;
};
}
}
#endif // INTSETTING_H
+50 -9
View File
@@ -3,22 +3,61 @@
#include <QSettings>
#include <QString>
#include <boost/signals2.hpp>
namespace chatterino {
namespace settings {
class Setting : public QObject
class BaseSetting
{
Q_OBJECT
public:
explicit Setting(const QString &name)
: name(name)
virtual void save(QSettings &settings) = 0;
virtual void load(const QSettings &settings) = 0;
};
template <typename T>
class Setting : public BaseSetting
{
public:
Setting(const QString &_name, const T &defaultValue)
: name(_name)
, value(defaultValue)
{
}
virtual void save(const QSettings &settings) = 0;
virtual void load(const QSettings &settings) = 0;
const T &
get() const
{
return this->value;
}
void
set(const T &newValue)
{
if (this->value != newValue) {
this->value = newValue;
this->valueChanged(newValue);
}
}
virtual void
save(QSettings &settings) final
{
settings.setValue(this->getName(), QVariant::fromValue(this->value));
}
virtual void
load(const QSettings &settings) final
{
QVariant newValue = settings.value(this->getName(), QVariant());
if (newValue.isValid()) {
assert(newValue.canConvert<T>());
this->value = newValue.value<T>();
}
}
boost::signals2::signal<void(const T &newValue)> valueChanged;
protected:
const QString &
@@ -29,8 +68,10 @@ protected:
private:
QString name;
T value;
};
}
}
} // namespace settings
} // namespace chatterino
#endif // SETTING_H
+48 -49
View File
@@ -6,13 +6,12 @@
namespace chatterino {
namespace settings {
Settings Settings::_;
Settings Settings::instance;
Settings::Settings()
: settings(
QStandardPaths::writableLocation(QStandardPaths::AppDataLocation),
QSettings::IniFormat)
, settingsItems()
, portable(false)
, wordTypeMask(messages::Word::Default)
, theme("", "dark")
@@ -43,62 +42,61 @@ Settings::Settings()
, windowTopMost("", true)
, hideTabX("", false)
{
settingsItems.reserve(25);
settingsItems.push_back(&theme);
settingsItems.push_back(&user);
settingsItems.push_back(&emoteScale);
settingsItems.push_back(&scaleEmotesByLineHeight);
settingsItems.push_back(&showTimestamps);
settingsItems.push_back(&showTimestampSeconds);
settingsItems.push_back(&showLastMessageIndicator);
settingsItems.push_back(&allowDouplicateMessages);
settingsItems.push_back(&linksDoubleClickOnly);
settingsItems.push_back(&hideEmptyInput);
settingsItems.push_back(&showMessageLength);
settingsItems.push_back(&seperateMessages);
settingsItems.push_back(&mentionUsersWithAt);
settingsItems.push_back(&allowCommandsAtEnd);
settingsItems.push_back(&enableHighlights);
settingsItems.push_back(&enableHighlightSound);
settingsItems.push_back(&enableHighlightTaskbar);
settingsItems.push_back(&customHighlightSound);
settingsItems.push_back(&enableTwitchEmotes);
settingsItems.push_back(&enableBttvEmotes);
settingsItems.push_back(&enableFfzEmotes);
settingsItems.push_back(&enableEmojis);
settingsItems.push_back(&enableGifAnimations);
settingsItems.push_back(&enableGifs);
settingsItems.push_back(&inlineWhispers);
settingsItems.push_back(&windowTopMost);
settingsItems.push_back(&hideTabX);
settingsItems.push_back(theme);
settingsItems.push_back(user);
settingsItems.push_back(emoteScale);
settingsItems.push_back(scaleEmotesByLineHeight);
settingsItems.push_back(showTimestamps);
settingsItems.push_back(showTimestampSeconds);
settingsItems.push_back(showLastMessageIndicator);
settingsItems.push_back(allowDouplicateMessages);
settingsItems.push_back(linksDoubleClickOnly);
settingsItems.push_back(hideEmptyInput);
settingsItems.push_back(showMessageLength);
settingsItems.push_back(seperateMessages);
settingsItems.push_back(mentionUsersWithAt);
settingsItems.push_back(allowCommandsAtEnd);
settingsItems.push_back(enableHighlights);
settingsItems.push_back(enableHighlightSound);
settingsItems.push_back(enableHighlightTaskbar);
settingsItems.push_back(customHighlightSound);
settingsItems.push_back(enableTwitchEmotes);
settingsItems.push_back(enableBttvEmotes);
settingsItems.push_back(enableFfzEmotes);
settingsItems.push_back(enableEmojis);
settingsItems.push_back(enableGifAnimations);
settingsItems.push_back(enableGifs);
settingsItems.push_back(inlineWhispers);
settingsItems.push_back(windowTopMost);
settingsItems.push_back(hideTabX);
QObject::connect(&showTimestamps, &BoolSetting::valueChanged, this,
&Settings::updateWordTypeMask);
QObject::connect(&showTimestampSeconds, &BoolSetting::valueChanged, this,
&Settings::updateWordTypeMask);
QObject::connect(&enableBttvEmotes, &BoolSetting::valueChanged, this,
&Settings::updateWordTypeMask);
QObject::connect(&enableEmojis, &BoolSetting::valueChanged, this,
&Settings::updateWordTypeMask);
QObject::connect(&enableFfzEmotes, &BoolSetting::valueChanged, this,
&Settings::updateWordTypeMask);
QObject::connect(&enableTwitchEmotes, &BoolSetting::valueChanged, this,
&Settings::updateWordTypeMask);
this->showTimestamps.valueChanged.connect(
[this](const auto &) { this->updateWordTypeMask(); });
this->showTimestampSeconds.valueChanged.connect(
[this](const auto &) { this->updateWordTypeMask(); });
this->enableBttvEmotes.valueChanged.connect(
[this](const auto &) { this->updateWordTypeMask(); });
this->enableEmojis.valueChanged.connect(
[this](const auto &) { this->updateWordTypeMask(); });
this->enableFfzEmotes.valueChanged.connect(
[this](const auto &) { this->updateWordTypeMask(); });
this->enableTwitchEmotes.valueChanged.connect(
[this](const auto &) { this->updateWordTypeMask(); });
}
void
Settings::save()
{
for (Setting *item : settingsItems) {
item->save(settings);
for (auto &item : settingsItems) {
item.get().save(settings);
}
}
void
Settings::load()
{
for (Setting *item : settingsItems) {
item->load(settings);
for (auto &item : settingsItems) {
item.get().load(settings);
}
}
@@ -109,7 +107,7 @@ Settings::isIgnoredEmote(const QString &)
}
void
Settings::updateWordTypeMask(bool)
Settings::updateWordTypeMask()
{
using namespace messages;
@@ -143,5 +141,6 @@ Settings::updateWordTypeMask(bool)
emit wordTypeMaskChanged();
// }
}
}
}
} // namespace settings
} // namespace chatterino
+34 -174
View File
@@ -2,10 +2,7 @@
#define APPSETTINGS_H
#include "messages/word.h"
#include "settings/boolsetting.h"
#include "settings/floatsetting.h"
#include "settings/setting.h"
#include "settings/stringsetting.h"
#include <QSettings>
@@ -20,7 +17,7 @@ public:
static Settings &
getInstance()
{
return _;
return instance;
}
void load();
@@ -52,12 +49,12 @@ signals:
private:
Settings();
static Settings _;
static Settings instance;
void updateWordTypeMask(bool);
void updateWordTypeMask();
QSettings settings;
std::vector<Setting *> settingsItems;
std::vector<std::reference_wrapper<BaseSetting>> settingsItems;
// template <class T>
// T
@@ -71,174 +68,37 @@ private:
messages::Word::Type wordTypeMask;
private:
StringSetting theme;
StringSetting user;
FloatSetting emoteScale;
BoolSetting scaleEmotesByLineHeight;
BoolSetting showTimestamps;
BoolSetting showTimestampSeconds;
BoolSetting showLastMessageIndicator;
BoolSetting allowDouplicateMessages;
BoolSetting linksDoubleClickOnly;
BoolSetting hideEmptyInput;
BoolSetting showMessageLength;
BoolSetting seperateMessages;
BoolSetting mentionUsersWithAt;
BoolSetting allowCommandsAtEnd;
BoolSetting enableHighlights;
BoolSetting enableHighlightSound;
BoolSetting enableHighlightTaskbar;
BoolSetting customHighlightSound;
BoolSetting enableTwitchEmotes;
BoolSetting enableBttvEmotes;
BoolSetting enableFfzEmotes;
BoolSetting enableEmojis;
BoolSetting enableGifAnimations;
BoolSetting enableGifs;
BoolSetting inlineWhispers;
BoolSetting windowTopMost;
BoolSetting hideTabX;
// settings
public:
StringSetting &
getTheme()
{
return this->theme;
}
StringSetting &
getUser()
{
return this->user;
}
FloatSetting &
getEmoteScale()
{
return this->emoteScale;
}
BoolSetting &
getScaleEmotesByLineHeight()
{
return this->scaleEmotesByLineHeight;
}
BoolSetting &
getShowTimestamps()
{
return this->showTimestamps;
}
BoolSetting &
getShowTimestampSeconds()
{
return this->showTimestampSeconds;
}
BoolSetting &
getShowLastMessageIndicator()
{
return this->showLastMessageIndicator;
}
BoolSetting &
getAllowDouplicateMessages()
{
return this->allowDouplicateMessages;
}
BoolSetting &
getLinksDoubleClickOnly()
{
return this->linksDoubleClickOnly;
}
BoolSetting &
getHideEmptyInput()
{
return this->hideEmptyInput;
}
BoolSetting &
getShowMessageLength()
{
return this->showMessageLength;
}
BoolSetting &
getSeperateMessages()
{
return this->seperateMessages;
}
BoolSetting &
getMentionUsersWithAt()
{
return this->mentionUsersWithAt;
}
BoolSetting &
getAllowCommandsAtEnd()
{
return this->allowCommandsAtEnd;
}
BoolSetting &
getEnableHighlights()
{
return this->enableHighlights;
}
BoolSetting &
getEnableHighlightSound()
{
return this->enableHighlightSound;
}
BoolSetting &
getEnableHighlightTaskbar()
{
return this->enableHighlightTaskbar;
}
BoolSetting &
getCustomHighlightSound()
{
return this->customHighlightSound;
}
BoolSetting &
getEnableTwitchEmotes()
{
return this->enableTwitchEmotes;
}
BoolSetting &
getEnableBttvEmotes()
{
return this->enableBttvEmotes;
}
BoolSetting &
getEnableFfzEmotes()
{
return this->enableFfzEmotes;
}
BoolSetting &
getEnableEmojis()
{
return this->enableEmojis;
}
BoolSetting &
getEnableGifAnimations()
{
return this->enableGifAnimations;
}
BoolSetting &
getEnableGifs()
{
return this->enableGifs;
}
BoolSetting &
getInlineWhispers()
{
return this->inlineWhispers;
}
BoolSetting &
getWindowTopMost()
{
return this->windowTopMost;
}
BoolSetting &
getHideTabX()
{
return this->hideTabX;
}
Setting<QString> theme;
Setting<QString> user;
Setting<float> emoteScale;
Setting<bool> scaleEmotesByLineHeight;
Setting<bool> showTimestamps;
Setting<bool> showTimestampSeconds;
Setting<bool> showLastMessageIndicator;
Setting<bool> allowDouplicateMessages;
Setting<bool> linksDoubleClickOnly;
Setting<bool> hideEmptyInput;
Setting<bool> showMessageLength;
Setting<bool> seperateMessages;
Setting<bool> mentionUsersWithAt;
Setting<bool> allowCommandsAtEnd;
Setting<bool> enableHighlights;
Setting<bool> enableHighlightSound;
Setting<bool> enableHighlightTaskbar;
Setting<bool> customHighlightSound;
Setting<bool> enableTwitchEmotes;
Setting<bool> enableBttvEmotes;
Setting<bool> enableFfzEmotes;
Setting<bool> enableEmojis;
Setting<bool> enableGifAnimations;
Setting<bool> enableGifs;
Setting<bool> inlineWhispers;
Setting<bool> windowTopMost;
Setting<bool> hideTabX;
};
}
}
} // namespace settings
} // namespace chatterino
#endif // APPSETTINGS_H
-61
View File
@@ -1,61 +0,0 @@
#ifndef STRINGSETTING_H
#define STRINGSETTING_H
#include "settings/setting.h"
#include <QString>
namespace chatterino {
namespace settings {
class StringSetting : public Setting
{
Q_OBJECT
public:
StringSetting(const QString &name, const QString &defaultValue)
: Setting(name)
, value(defaultValue)
, defaultValue(defaultValue)
{
}
const QString &
get() const
{
return this->value;
}
const QString &
set(const QString &value)
{
this->value = value;
QString tmp = value;
emit valueChanged(tmp);
return this->value;
}
void
save(const QSettings &settings) override
{
}
void
load(const QSettings &settings) override
{
}
signals:
void valueChanged(const QString &value);
private:
QString value;
QString defaultValue;
};
}
}
#endif // STRINGSETTING_H