mirror-chatterino2/src/singletons/Settings.cpp

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

279 lines
6.9 KiB
C++
Raw Normal View History

2018-06-28 19:46:45 +02:00
#include "singletons/Settings.hpp"
#include "Application.hpp"
#include "controllers/filters/FilterRecord.hpp"
#include "controllers/highlights/HighlightBadge.hpp"
#include "controllers/highlights/HighlightBlacklistUser.hpp"
#include "controllers/highlights/HighlightPhrase.hpp"
#include "controllers/ignores/IgnorePhrase.hpp"
#include "controllers/moderationactions/ModerationAction.hpp"
#include "controllers/nicknames/Nickname.hpp"
#include "util/Clamp.hpp"
#include "util/PersistSignalVector.hpp"
#include "util/WindowsHelper.hpp"
2017-04-12 17:46:44 +02:00
#include <pajlada/signals/scoped-connection.hpp>
namespace {
using namespace chatterino;
template <typename T>
void initializeSignalVector(pajlada::Signals::SignalHolder &signalHolder,
ChatterinoSetting<std::vector<T>> &setting,
SignalVector<T> &vec)
{
// Fill the SignalVector up with initial values
for (auto &&item : setting.getValue())
{
vec.append(item);
}
// Set up a signal to
signalHolder.managedConnect(vec.delayedItemsChanged, [&] {
setting.setValue(vec.raw());
});
}
} // namespace
2017-04-14 17:52:22 +02:00
namespace chatterino {
2017-04-12 17:46:44 +02:00
std::vector<std::weak_ptr<pajlada::Settings::SettingData>> _settings;
void _actuallyRegisterSetting(
std::weak_ptr<pajlada::Settings::SettingData> setting)
{
_settings.push_back(std::move(setting));
}
bool Settings::isHighlightedUser(const QString &username)
{
2020-08-22 11:45:18 +02:00
auto items = this->highlightedUsers.readOnly();
for (const auto &highlightedUser : *items)
{
if (highlightedUser.isMatch(username))
return true;
}
return false;
}
bool Settings::isBlacklistedUser(const QString &username)
{
auto items = this->blacklistedUsers.readOnly();
for (const auto &blacklistedUser : *items)
{
if (blacklistedUser.isMatch(username))
return true;
}
return false;
}
bool Settings::isMutedChannel(const QString &channelName)
2020-02-23 23:07:28 +01:00
{
2020-08-22 11:45:18 +02:00
auto items = this->mutedChannels.readOnly();
for (const auto &channel : *items)
2020-02-23 23:07:28 +01:00
{
if (channelName.toLower() == channel.toLower())
{
return true;
}
}
return false;
}
boost::optional<QString> Settings::matchNickname(const QString &usernameText)
{
auto nicknames = this->nicknames.readOnly();
for (const auto &nickname : *nicknames)
{
if (auto nicknameText = nickname.match(usernameText))
{
return nicknameText;
}
}
return boost::none;
}
void Settings::mute(const QString &channelName)
2020-02-23 23:07:28 +01:00
{
mutedChannels.append(channelName);
}
void Settings::unmute(const QString &channelName)
2020-02-23 23:07:28 +01:00
{
for (std::vector<int>::size_type i = 0; i != mutedChannels.raw().size();
i++)
{
if (mutedChannels.raw()[i].toLower() == channelName.toLower())
{
mutedChannels.removeAt(i);
i--;
}
}
}
bool Settings::toggleMutedChannel(const QString &channelName)
2020-02-23 23:07:28 +01:00
{
if (this->isMutedChannel(channelName))
{
unmute(channelName);
return false;
}
else
{
mute(channelName);
return true;
}
}
Settings *Settings::instance_ = nullptr;
2018-08-02 14:23:27 +02:00
2018-11-25 15:02:48 +01:00
Settings::Settings(const QString &settingsDirectory)
{
QString settingsPath = settingsDirectory + "/settings.json";
// get global instance of the settings library
auto settingsInstance = pajlada::Settings::SettingManager::getInstance();
settingsInstance->load(qPrintable(settingsPath));
settingsInstance->setBackupEnabled(true);
settingsInstance->setBackupSlots(9);
settingsInstance->saveMethod =
pajlada::Settings::SettingManager::SaveMethod::SaveOnExit;
initializeSignalVector(this->signalHolder, this->highlightedMessagesSetting,
this->highlightedMessages);
initializeSignalVector(this->signalHolder, this->highlightedUsersSetting,
this->highlightedUsers);
initializeSignalVector(this->signalHolder, this->highlightedBadgesSetting,
this->highlightedBadges);
initializeSignalVector(this->signalHolder, this->blacklistedUsersSetting,
this->blacklistedUsers);
initializeSignalVector(this->signalHolder, this->ignoredMessagesSetting,
this->ignoredMessages);
initializeSignalVector(this->signalHolder, this->mutedChannelsSetting,
this->mutedChannels);
initializeSignalVector(this->signalHolder, this->filterRecordsSetting,
this->filterRecords);
initializeSignalVector(this->signalHolder, this->nicknamesSetting,
this->nicknames);
initializeSignalVector(this->signalHolder, this->moderationActionsSetting,
this->moderationActions);
initializeSignalVector(this->signalHolder, this->loggedChannelsSetting,
this->loggedChannels);
instance_ = this;
#ifdef USEWINSDK
this->autorun = isRegisteredForStartup();
this->autorun.connect(
[](bool autorun) {
setRegisteredForStartup(autorun);
},
false);
#endif
this->enableStreamerMode.connect(
[]() {
getApp()->streamerModeChanged.invoke();
},
false);
2017-04-12 17:46:44 +02:00
}
Settings::~Settings() = default;
void Settings::saveSnapshot()
{
rapidjson::Document *d = new rapidjson::Document(rapidjson::kObjectType);
rapidjson::Document::AllocatorType &a = d->GetAllocator();
for (const auto &weakSetting : _settings)
{
auto setting = weakSetting.lock();
if (!setting)
{
continue;
}
rapidjson::Value key(setting->getPath().c_str(), a);
auto curVal = setting->unmarshalJSON();
if (curVal == nullptr)
{
continue;
}
rapidjson::Value val;
val.CopyFrom(*curVal, a);
d->AddMember(key.Move(), val.Move(), a);
}
// log("Snapshot state: {}", rj::stringify(*d));
this->snapshot_.reset(d);
}
void Settings::restoreSnapshot()
{
if (!this->snapshot_)
{
return;
}
const auto &snapshot = *(this->snapshot_.get());
if (!snapshot.IsObject())
{
return;
}
for (const auto &weakSetting : _settings)
{
auto setting = weakSetting.lock();
if (!setting)
{
continue;
}
const char *path = setting->getPath().c_str();
if (!snapshot.HasMember(path))
{
continue;
}
setting->marshalJSON(snapshot[path]);
}
}
float Settings::getClampedUiScale() const
{
return clamp<float>(this->uiScale.getValue(), 0.2f, 10);
}
void Settings::setClampedUiScale(float value)
{
this->uiScale.setValue(clamp<float>(value, 0.2f, 10));
}
Settings &Settings::instance()
{
assert(instance_ != nullptr);
return *instance_;
}
2018-06-28 19:51:07 +02:00
Settings *getSettings()
2018-01-17 14:14:31 +01:00
{
return &Settings::instance();
2018-01-17 14:14:31 +01:00
}
2018-01-23 21:33:49 +01:00
2017-04-14 17:52:22 +02:00
} // namespace chatterino