From dc9f1b96eb2fc0d18f94191d3b71b3bb621a5fc7 Mon Sep 17 00:00:00 2001 From: Rasmus Karlsson Date: Thu, 4 Jan 2018 00:11:00 +0100 Subject: [PATCH 1/5] update settings library version --- lib/settings | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/settings b/lib/settings index 75aca0343..2fa3adf42 160000 --- a/lib/settings +++ b/lib/settings @@ -1 +1 @@ -Subproject commit 75aca034359fc0e2145908beb459267e8be3d7ca +Subproject commit 2fa3adf42da988dc2a34b9b625654aa08e906d4f From df733282be16a7af96bd0984da846a29afba522a Mon Sep 17 00:00:00 2001 From: Rasmus Karlsson Date: Thu, 4 Jan 2018 01:52:37 +0100 Subject: [PATCH 2/5] Move highlight phrases to new settings system Add a setting serialize/deserializer for QString Add constructor to ChatterinoSetting that doesn't take a default value --- chatterino.pro | 4 +- src/application.cpp | 2 - src/messages/highlightphrase.hpp | 78 ++++++++++ src/singletons/helper/chatterinosetting.hpp | 6 + src/singletons/settingsmanager.cpp | 53 +------ src/singletons/settingsmanager.hpp | 11 +- src/twitch/twitchmessagebuilder.cpp | 35 ++--- src/util/serialize-custom.hpp | 32 ++++ src/widgets/settingsdialog.cpp | 161 ++++++++++++++------ 9 files changed, 252 insertions(+), 130 deletions(-) create mode 100644 src/messages/highlightphrase.hpp create mode 100644 src/util/serialize-custom.hpp diff --git a/chatterino.pro b/chatterino.pro index b551c9d06..694a3a390 100644 --- a/chatterino.pro +++ b/chatterino.pro @@ -195,7 +195,9 @@ HEADERS += \ src/singletons/helper/chatterinosetting.hpp \ src/singletons/resourcemanager.hpp \ src/util/emotemap.hpp \ - src/singletons/helper/ircmessagehandler.hpp + src/singletons/helper/ircmessagehandler.hpp \ + src/util/serialize-custom.hpp \ + src/messages/highlightphrase.hpp PRECOMPILED_HEADER = diff --git a/src/application.cpp b/src/application.cpp index 4a3dde62e..5c1e91acb 100644 --- a/src/application.cpp +++ b/src/application.cpp @@ -34,8 +34,6 @@ Application::Application() Application::~Application() { this->save(); - - chatterino::singletons::SettingManager::getInstance().save(); } int Application::run(QApplication &qtApp) diff --git a/src/messages/highlightphrase.hpp b/src/messages/highlightphrase.hpp new file mode 100644 index 000000000..f5ea0f29b --- /dev/null +++ b/src/messages/highlightphrase.hpp @@ -0,0 +1,78 @@ +#pragma once + +#include "util/serialize-custom.hpp" + +#include +#include + +namespace chatterino { +namespace messages { + +struct HighlightPhrase { + QString key; + bool sound; + bool alert; + + bool operator==(const HighlightPhrase &rhs) const + { + return std::tie(this->key, this->sound, this->alert) == + std::tie(rhs.key, rhs.sound, rhs.alert); + } +}; +} // namespace messages +} // namespace chatterino + +namespace pajlada { +namespace Settings { + +template <> +struct Serialize { + static rapidjson::Value get(const chatterino::messages::HighlightPhrase &value, + rapidjson::Document::AllocatorType &a) + { + rapidjson::Value ret(rapidjson::kObjectType); + + AddMember(ret, "key", value.key, a); + AddMember(ret, "alert", value.alert, a); + AddMember(ret, "sound", value.sound, a); + + return ret; + } +}; + +template <> +struct Deserialize { + static chatterino::messages::HighlightPhrase get(const rapidjson::Value &value) + { + chatterino::messages::HighlightPhrase ret; + if (!value.IsObject()) { + return ret; + } + + if (value.HasMember("key")) { + const rapidjson::Value &key = value["key"]; + if (key.IsString()) { + ret.key = key.GetString(); + } + } + + if (value.HasMember("alert")) { + const rapidjson::Value &alert = value["alert"]; + if (alert.IsBool()) { + ret.alert = alert.GetBool(); + } + } + + if (value.HasMember("sound")) { + const rapidjson::Value &sound = value["sound"]; + if (sound.IsBool()) { + ret.sound = sound.GetBool(); + } + } + + return ret; + } +}; + +} // namespace Settings +} // namespace pajlada diff --git a/src/singletons/helper/chatterinosetting.hpp b/src/singletons/helper/chatterinosetting.hpp index 05d28d53b..54f864339 100644 --- a/src/singletons/helper/chatterinosetting.hpp +++ b/src/singletons/helper/chatterinosetting.hpp @@ -8,6 +8,12 @@ template class ChatterinoSetting : public pajlada::Settings::Setting { public: + ChatterinoSetting(const std::string &_path) + : pajlada::Settings::Setting(_path) + { + _registerSetting(this->data); + } + ChatterinoSetting(const std::string &_path, const Type &_defaultValue) : pajlada::Settings::Setting(_path, _defaultValue) { diff --git a/src/singletons/settingsmanager.cpp b/src/singletons/settingsmanager.cpp index 86d591f6c..75cab0012 100644 --- a/src/singletons/settingsmanager.cpp +++ b/src/singletons/settingsmanager.cpp @@ -22,8 +22,6 @@ SettingManager::SettingManager() , preferredQuality("/behaviour/streamlink/quality", "Choose") , emoteScale(this->settingsItems, "emoteScale", 1.0) , pathHighlightSound(this->settingsItems, "pathHighlightSound", "qrc:/sounds/ping2.wav") - , highlightProperties(this->settingsItems, "highlightProperties", - QMap>()) , highlightUserBlacklist(this->settingsItems, "highlightUserBlacklist", "") , snapshot(nullptr) , settings(Path::getAppdataPath() + "settings.ini", QSettings::IniFormat) @@ -40,49 +38,6 @@ SettingManager::SettingManager() }; } -void SettingManager::save() -{ - for (auto &item : this->settingsItems) { - if (item.get().getName() != "highlightProperties") { - this->settings.setValue(item.get().getName(), item.get().getVariant()); - } else { - this->settings.beginGroup("Highlights"); - QStringList list = highlightProperties.get().keys(); - list.removeAll(""); - this->settings.remove(""); - for (auto string : list) { - this->settings.beginGroup(string); - this->settings.setValue("highlightSound", - highlightProperties.get().value(string).first); - this->settings.setValue("highlightTask", - highlightProperties.get().value(string).second); - this->settings.endGroup(); - } - this->settings.endGroup(); - } - } -} - -void SettingManager::load() -{ - for (auto &item : this->settingsItems) { - if (item.get().getName() != "highlightProperties") { - item.get().setVariant(this->settings.value(item.get().getName())); - } else { - this->settings.beginGroup("Highlights"); - QStringList list = this->settings.childGroups(); - for (auto string : list) { - this->settings.beginGroup(string); - highlightProperties.insertMap(string, - this->settings.value("highlightSound").toBool(), - this->settings.value("highlightTask").toBool()); - this->settings.endGroup(); - } - this->settings.endGroup(); - } - } -} - Word::Flags SettingManager::getWordTypeMask() { return this->wordTypeMask; @@ -98,6 +53,12 @@ QSettings &SettingManager::getQSettings() return this->settings; } +void SettingManager::load() +{ + // Just to make sure the singleton is initialized + debug::Log("."); +} + void SettingManager::updateWordTypeMask() { uint32_t newMaskUint = Word::Text; @@ -184,5 +145,5 @@ void SettingManager::recallSnapshot() } } +} // namespace singletons } // namespace chatterino -} diff --git a/src/singletons/settingsmanager.hpp b/src/singletons/settingsmanager.hpp index 57e19a341..f381f4bf0 100644 --- a/src/singletons/settingsmanager.hpp +++ b/src/singletons/settingsmanager.hpp @@ -1,5 +1,6 @@ #pragma once +#include "messages/highlightphrase.hpp" #include "messages/word.hpp" #include "setting.hpp" #include "singletons/helper/chatterinosetting.hpp" @@ -21,13 +22,12 @@ class SettingManager : public QObject using FloatSetting = ChatterinoSetting; public: - void load(); - void save(); - messages::Word::Flags getWordTypeMask(); bool isIgnoredEmote(const QString &emote); QSettings &getQSettings(); + void load(); + /// Appearance BoolSetting showTimestamps = {"/appearance/messages/showTimestamps", true}; BoolSetting showTimestampSeconds = {"/appearance/messages/showTimestampSeconds", true}; @@ -73,9 +73,10 @@ public: pajlada::Settings::Setting preferredQuality; Setting emoteScale; + ChatterinoSetting> highlightProperties = { + "/highlighting/highlights"}; Setting pathHighlightSound; - Setting>> highlightProperties; Setting highlightUserBlacklist; BoolSetting highlightAlwaysPlaySound = {"/highlighting/alwaysPlaySound", false}; @@ -107,5 +108,5 @@ private: pajlada::Settings::SettingListener wordMaskListener; }; +} // namespace singletons } // namespace chatterino -} diff --git a/src/twitch/twitchmessagebuilder.cpp b/src/twitch/twitchmessagebuilder.cpp index 21da5a8f5..852aeba1a 100644 --- a/src/twitch/twitchmessagebuilder.cpp +++ b/src/twitch/twitchmessagebuilder.cpp @@ -407,35 +407,18 @@ void TwitchMessageBuilder::parseHighlights() currentPlayerUrl = highlightSoundUrl; } - struct Highlight { - Highlight(const QString &_target, bool _sound, bool _alert) - : target(_target) - , sound(_sound) - , alert(_alert) - { - } - - QString target; - bool sound; - bool alert; - }; - QStringList blackList = settings.highlightUserBlacklist.get().split("\n", QString::SkipEmptyParts); // TODO: This vector should only be rebuilt upon highlights being changed - std::vector activeHighlights; + auto activeHighlights = settings.highlightProperties.getValue(); if (settings.enableHighlightsSelf && currentUsername.size() > 0) { - activeHighlights.emplace_back(currentUsername, settings.enableHighlightSound, - settings.enableHighlightTaskbar); - } - - const auto &highlightProperties = settings.highlightProperties.get(); - - for (auto it = highlightProperties.begin(); it != highlightProperties.end(); ++it) { - auto properties = it.value(); - activeHighlights.emplace_back(it.key(), properties.first, properties.second); + messages::HighlightPhrase selfHighlight; + selfHighlight.key = currentUsername; + selfHighlight.sound = settings.enableHighlightSound; + selfHighlight.alert = settings.enableHighlightTaskbar; + activeHighlights.emplace_back(std::move(selfHighlight)); } bool doHighlight = false; @@ -445,10 +428,10 @@ void TwitchMessageBuilder::parseHighlights() bool hasFocus = (QApplication::focusWidget() != nullptr); if (!blackList.contains(this->ircMessage->nick(), Qt::CaseInsensitive)) { - for (const Highlight &highlight : activeHighlights) { - if (this->originalMessage.contains(highlight.target, Qt::CaseInsensitive)) { + for (const messages::HighlightPhrase &highlight : activeHighlights) { + if (this->originalMessage.contains(highlight.key, Qt::CaseInsensitive)) { debug::Log("Highlight because {} contains {}", this->originalMessage, - highlight.target); + highlight.key); doHighlight = true; if (highlight.sound) { diff --git a/src/util/serialize-custom.hpp b/src/util/serialize-custom.hpp new file mode 100644 index 000000000..bd42bc18c --- /dev/null +++ b/src/util/serialize-custom.hpp @@ -0,0 +1,32 @@ +#pragma once + +#include +#include + +namespace pajlada { +namespace Settings { + +template <> +struct Serialize { + static rapidjson::Value get(const QString &value, rapidjson::Document::AllocatorType &a) + { + rapidjson::Value ret(qPrintable(value), a); + + return ret; + } +}; + +template <> +struct Deserialize { + static QString get(const rapidjson::Value &value) + { + if (!value.IsString()) { + throw std::runtime_error("Deserialized rapidjson::Value is not a string"); + } + + return value.GetString(); + } +}; + +} // namespace Settings +} // namespace pajlada diff --git a/src/widgets/settingsdialog.cpp b/src/widgets/settingsdialog.cpp index 3132dc18f..fc4aa2b72 100644 --- a/src/widgets/settingsdialog.cpp +++ b/src/widgets/settingsdialog.cpp @@ -418,8 +418,10 @@ QVBoxLayout *SettingsDialog::createHighlightingTab() auto highlights = new QListWidget(); auto highlightUserBlacklist = new QTextEdit(); globalHighlights = highlights; - QStringList items = settings.highlightProperties.get().keys(); - highlights->addItems(items); + const auto highlightProperties = settings.highlightProperties.getValue(); + for (const auto &highlightProperty : highlightProperties) { + highlights->addItem(highlightProperty.key); + } highlightUserBlacklist->setText(settings.highlightUserBlacklist.getnonConst()); auto highlightTab = new QTabWidget(); auto customSound = new QHBoxLayout(); @@ -450,6 +452,7 @@ QVBoxLayout *SettingsDialog::createHighlightingTab() auto editBtn = new QPushButton("Edit"); auto delBtn = new QPushButton("Remove"); + // Open "Add new highlight" dialog QObject::connect(addBtn, &QPushButton::clicked, this, [highlights, this, &settings] { auto show = new QWidget(); auto box = new QBoxLayout(QBoxLayout::TopToBottom); @@ -460,11 +463,23 @@ QVBoxLayout *SettingsDialog::createHighlightingTab() auto sound = new QCheckBox("Play sound"); auto task = new QCheckBox("Flash taskbar"); + // Save highlight QObject::connect(add, &QPushButton::clicked, this, [=, &settings] { if (edit->text().length()) { - highlights->addItem(edit->text()); - settings.highlightProperties.insertMap(edit->text(), sound->isChecked(), - task->isChecked()); + QString highlightKey = edit->text(); + highlights->addItem(highlightKey); + + auto properties = settings.highlightProperties.getValue(); + + messages::HighlightPhrase newHighlightProperty; + newHighlightProperty.key = highlightKey; + newHighlightProperty.sound = sound->isChecked(); + newHighlightProperty.alert = task->isChecked(); + + properties.push_back(newHighlightProperty); + + settings.highlightProperties = properties; + show->close(); } }); @@ -475,50 +490,103 @@ QVBoxLayout *SettingsDialog::createHighlightingTab() show->setLayout(box); show->show(); }); + + // Open "Edit selected highlight" dialog QObject::connect(editBtn, &QPushButton::clicked, this, [highlights, this, &settings] { - if (!highlights->selectedItems().isEmpty()) { - auto show = new QWidget(); - auto box = new QBoxLayout(QBoxLayout::TopToBottom); - - auto edit = new QLineEdit(); - edit->setText(highlights->selectedItems().first()->text()); - auto add = new QPushButton("Apply"); - - auto sound = new QCheckBox("Play sound"); - auto task = new QCheckBox("Flash taskbar"); - - QObject::connect(add, &QPushButton::clicked, this, [=, &settings] { - if (edit->text().length()) { - settings.highlightProperties.getnonConst().remove( - highlights->selectedItems().first()->text()); - delete highlights->selectedItems().first(); - highlights->addItem(edit->text()); - settings.highlightProperties.insertMap(edit->text(), sound->isChecked(), - task->isChecked()); - show->close(); - } - }); - box->addWidget(edit); - box->addWidget(add); - box->addWidget(sound); - sound->setChecked(settings.highlightProperties.get() - .value(highlights->selectedItems().first()->text()) - .first); - box->addWidget(task); - task->setChecked(settings.highlightProperties.get() - .value(highlights->selectedItems().first()->text()) - .second); - show->setLayout(box); - show->show(); + if (highlights->selectedItems().isEmpty()) { + // No item selected + return; } + + QListWidgetItem *selectedHighlight = highlights->selectedItems().first(); + QString highlightKey = selectedHighlight->text(); + auto properties = settings.highlightProperties.getValue(); + auto highlightIt = std::find_if(properties.begin(), properties.end(), + [highlightKey](const auto &highlight) { + return highlight.key == highlightKey; // + }); + + if (highlightIt == properties.end()) { + debug::Log("Unable to find highlight key {} in highlight properties. " + "This is weird", + highlightKey); + return; + } + + messages::HighlightPhrase &selectedSetting = *highlightIt; + auto show = new QWidget(); + auto box = new QBoxLayout(QBoxLayout::TopToBottom); + + auto edit = new QLineEdit(highlightKey); + auto apply = new QPushButton("Apply"); + + auto sound = new QCheckBox("Play sound"); + sound->setChecked(selectedSetting.sound); + auto task = new QCheckBox("Flash taskbar"); + task->setChecked(selectedSetting.alert); + + // Apply edited changes + QObject::connect(apply, &QPushButton::clicked, this, [=, &settings] { + QString newHighlightKey = edit->text(); + + if (newHighlightKey.length() == 0) { + return; + } + + auto properties = settings.highlightProperties.getValue(); + auto highlightIt = + std::find_if(properties.begin(), properties.end(), [=](const auto &highlight) { + return highlight.key == highlightKey; // + }); + + if (highlightIt == properties.end()) { + debug::Log("Unable to find highlight key {} in highlight properties. " + "This is weird", + highlightKey); + return; + } + auto &highlightProperty = *highlightIt; + highlightProperty.key = newHighlightKey; + highlightProperty.sound = sound->isCheckable(); + highlightProperty.alert = task->isCheckable(); + + settings.highlightProperties = properties; + + selectedHighlight->setText(newHighlightKey); + + show->close(); + }); + + box->addWidget(edit); + box->addWidget(apply); + box->addWidget(sound); + box->addWidget(task); + show->setLayout(box); + show->show(); }); + + // Delete selected highlight QObject::connect(delBtn, &QPushButton::clicked, this, [highlights, &settings] { - if (!highlights->selectedItems().isEmpty()) { - settings.highlightProperties.getnonConst().remove( - highlights->selectedItems().first()->text()); - delete highlights->selectedItems().first(); + if (highlights->selectedItems().isEmpty()) { + // No highlight selected + return; } + + QListWidgetItem *selectedHighlight = highlights->selectedItems().first(); + QString highlightKey = selectedHighlight->text(); + + auto properties = settings.highlightProperties.getValue(); + properties.erase(std::remove_if(properties.begin(), properties.end(), + [highlightKey](const auto &highlight) { + return highlight.key == highlightKey; // + }), + properties.end()); + + settings.highlightProperties = properties; + + delete selectedHighlight; }); + layout->addLayout(soundForm); layout->addWidget( createCheckbox("Always play highlight sound (Even if Chatterino is focused)", @@ -765,13 +833,6 @@ void SettingsDialog::cancelButtonClicked() settings.recallSnapshot(); - QStringList list = settings.highlightProperties.get().keys(); - list.removeDuplicates(); - while (globalHighlights->count() > 0) { - delete globalHighlights->takeItem(0); - } - globalHighlights->addItems(list); - this->close(); } From 9044700ec6b85032ae200f34fe16aafc73cfffcf Mon Sep 17 00:00:00 2001 From: Rasmus Karlsson Date: Thu, 4 Jan 2018 02:19:35 +0100 Subject: [PATCH 3/5] Convert remaining settings to the new settings system --- chatterino.pro | 2 - src/messages/word.cpp | 2 +- src/messages/word.hpp | 6 +- src/setting.hpp | 85 ----------------------------- src/settingssnapshot.hpp | 38 ------------- src/singletons/settingsmanager.cpp | 13 +---- src/singletons/settingsmanager.hpp | 19 +++---- src/twitch/twitchmessagebuilder.cpp | 4 +- src/widgets/accountpopup.cpp | 11 ++-- src/widgets/accountpopup.hpp | 2 +- src/widgets/settingsdialog.cpp | 25 ++------- src/widgets/settingsdialog.hpp | 1 - 12 files changed, 27 insertions(+), 181 deletions(-) delete mode 100644 src/setting.hpp delete mode 100644 src/settingssnapshot.hpp diff --git a/chatterino.pro b/chatterino.pro index 694a3a390..588370ad6 100644 --- a/chatterino.pro +++ b/chatterino.pro @@ -126,7 +126,6 @@ HEADERS += \ src/messages/message.hpp \ src/messages/word.hpp \ src/messages/wordpart.hpp \ - src/setting.hpp \ src/twitch/emotevalue.hpp \ src/widgets/notebook.hpp \ src/widgets/helper/notebookbutton.hpp \ @@ -138,7 +137,6 @@ HEADERS += \ src/widgets/helper/signallabel.hpp \ src/widgets/textinputdialog.hpp \ src/widgets/helper/resizingtextedit.hpp \ - src/settingssnapshot.hpp \ src/messages/limitedqueue.hpp \ src/messages/limitedqueuesnapshot.hpp \ src/messages/messageref.hpp \ diff --git a/src/messages/word.cpp b/src/messages/word.cpp index bc38adc8c..e5f0f5ee9 100644 --- a/src/messages/word.cpp +++ b/src/messages/word.cpp @@ -67,7 +67,7 @@ QSize Word::getSize(float scale) const const int mediumTextLineHeight = singletons::FontManager::getInstance().getFontMetrics(this->font, scale).height(); const qreal emoteScale = - singletons::SettingManager::getInstance().emoteScale.get() * scale; + singletons::SettingManager::getInstance().emoteScale.getValue() * scale; const bool scaleEmotesByLineHeight = singletons::SettingManager::getInstance().scaleEmotesByLineHeight; diff --git a/src/messages/word.hpp b/src/messages/word.hpp index 0aa796a6f..592e0896a 100644 --- a/src/messages/word.hpp +++ b/src/messages/word.hpp @@ -1,9 +1,9 @@ #pragma once -#include "singletons/fontmanager.hpp" #include "messages/lazyloadedimage.hpp" #include "messages/link.hpp" #include "messages/messagecolor.hpp" +#include "singletons/fontmanager.hpp" //#include "wordflags.hpp" #include @@ -96,8 +96,8 @@ public: explicit Word(LazyLoadedImage *_image, Flags getFlags, const QString ©text, const QString &tooltip, const Link &getLink = Link()); explicit Word(const QString &_text, Flags getFlags, const MessageColor &textColor, - singletons::FontManager::Type font, const QString ©text, const QString &tooltip, - const Link &getLink = Link()); + singletons::FontManager::Type font, const QString ©text, + const QString &tooltip, const Link &getLink = Link()); bool isImage() const; bool isText() const; diff --git a/src/setting.hpp b/src/setting.hpp deleted file mode 100644 index 781367a19..000000000 --- a/src/setting.hpp +++ /dev/null @@ -1,85 +0,0 @@ -#pragma once - -#include -#include -#include - -namespace chatterino { - -class BaseSetting -{ -public: - BaseSetting(const QString &_name) - : name(_name) - { - } - - virtual QVariant getVariant() = 0; - virtual void setVariant(QVariant value) = 0; - - const QString &getName() const - { - return this->name; - } - -private: - QString name; -}; - -template -class Setting : public BaseSetting -{ -public: - Setting(std::vector> &settingItems, const QString &_name, - const T &defaultValue) - : BaseSetting(_name) - , value(defaultValue) - { - settingItems.push_back(*this); - } - - const T &get() const - { - return this->value; - } - - T &getnonConst() - { - return this->value; - } - - void set(const T &newValue) - { - if (this->value != newValue) { - this->value = newValue; - - valueChanged(newValue); - } - } - - virtual QVariant getVariant() final - { - return QVariant::fromValue(this->value); - } - - virtual void setVariant(QVariant newValue) final - { - if (newValue.isValid()) { - assert(newValue.canConvert()); - set(newValue.value()); - } - } - - void insertMap(QString id, bool sound, bool task) - { - QPair pair(sound, task); - this->value.insert(id, pair); - } - - boost::signals2::signal valueChanged; - -private: - T value; -}; - -} // namespace chatterino diff --git a/src/settingssnapshot.hpp b/src/settingssnapshot.hpp deleted file mode 100644 index 96a058ba7..000000000 --- a/src/settingssnapshot.hpp +++ /dev/null @@ -1,38 +0,0 @@ -#pragma once - -#include "setting.hpp" - -namespace chatterino { - -struct SettingsSnapshot { -public: - SettingsSnapshot() - { - } - - void addItem(std::reference_wrapper setting, const QVariant &value) - { - this->items.push_back( - std::pair, QVariant>(setting.get(), value)); - } - - void addMapItem(QString string, QPair pair) - { - QMap> map; - this->mapItems.insert(string, pair); - } - - void apply() - { - for (auto &item : this->items) { - item.first.get().setVariant(item.second); - } - } - - QMap> mapItems; - -private: - std::vector, QVariant>> items; -}; - -} // namespace chatterino diff --git a/src/singletons/settingsmanager.cpp b/src/singletons/settingsmanager.cpp index 75cab0012..b5f939e7b 100644 --- a/src/singletons/settingsmanager.cpp +++ b/src/singletons/settingsmanager.cpp @@ -18,13 +18,7 @@ void _registerSetting(std::weak_ptr setting) } SettingManager::SettingManager() - : streamlinkPath("/behaviour/streamlink/path", "") - , preferredQuality("/behaviour/streamlink/quality", "Choose") - , emoteScale(this->settingsItems, "emoteScale", 1.0) - , pathHighlightSound(this->settingsItems, "pathHighlightSound", "qrc:/sounds/ping2.wav") - , highlightUserBlacklist(this->settingsItems, "highlightUserBlacklist", "") - , snapshot(nullptr) - , settings(Path::getAppdataPath() + "settings.ini", QSettings::IniFormat) + : snapshot(nullptr) { this->wordMaskListener.addSetting(this->showTimestamps); this->wordMaskListener.addSetting(this->showTimestampSeconds); @@ -48,11 +42,6 @@ bool SettingManager::isIgnoredEmote(const QString &) return false; } -QSettings &SettingManager::getQSettings() -{ - return this->settings; -} - void SettingManager::load() { // Just to make sure the singleton is initialized diff --git a/src/singletons/settingsmanager.hpp b/src/singletons/settingsmanager.hpp index f381f4bf0..7120469cb 100644 --- a/src/singletons/settingsmanager.hpp +++ b/src/singletons/settingsmanager.hpp @@ -2,10 +2,8 @@ #include "messages/highlightphrase.hpp" #include "messages/word.hpp" -#include "setting.hpp" #include "singletons/helper/chatterinosetting.hpp" -#include #include #include @@ -20,11 +18,12 @@ class SettingManager : public QObject using BoolSetting = ChatterinoSetting; using FloatSetting = ChatterinoSetting; + using StringSetting = ChatterinoSetting; + using QStringSetting = ChatterinoSetting; public: messages::Word::Flags getWordTypeMask(); bool isIgnoredEmote(const QString &emote); - QSettings &getQSettings(); void load(); @@ -47,6 +46,8 @@ public: BoolSetting allowDuplicateMessages = {"/behaviour/allowDuplicateMessages", true}; BoolSetting mentionUsersWithAt = {"/behaviour/mentionUsersWithAt", false}; FloatSetting mouseScrollMultiplier = {"/behaviour/mouseScrollMultiplier", 1.0}; + StringSetting streamlinkPath = {"/behaviour/streamlink/path", ""}; + StringSetting preferredQuality = {"/behaviour/streamlink/quality", "Choose"}; /// Commands BoolSetting allowCommandsAtEnd = {"/commands/allowCommandsAtEnd", false}; @@ -58,6 +59,7 @@ public: BoolSetting enableFfzEmotes = {"/emotes/enableFFZEmotes", true}; BoolSetting enableEmojis = {"/emotes/enableEmojis", true}; BoolSetting enableGifAnimations = {"/emotes/enableGifAnimations", true}; + FloatSetting emoteScale = {"/emotes/scale", 1.f}; /// Links BoolSetting linksDoubleClickOnly = {"/links/doubleClickToOpen", false}; @@ -69,15 +71,12 @@ public: BoolSetting enableHighlightTaskbar = {"/highlighting/enableTaskbarFlashing", true}; BoolSetting customHighlightSound = {"/highlighting/useCustomSound", false}; - pajlada::Settings::Setting streamlinkPath; - pajlada::Settings::Setting preferredQuality; - - Setting emoteScale; ChatterinoSetting> highlightProperties = { "/highlighting/highlights"}; - Setting pathHighlightSound; - Setting highlightUserBlacklist; + QStringSetting pathHighlightSound = {"/highlighting/highlightSoundPath", + "qrc:/sounds/ping2.wav"}; + QStringSetting highlightUserBlacklist = {"/highlighting/blacklistedUsers", ""}; BoolSetting highlightAlwaysPlaySound = {"/highlighting/alwaysPlaySound", false}; @@ -101,8 +100,6 @@ private: SettingManager(); - QSettings settings; - std::vector> settingsItems; messages::Word::Flags wordTypeMask = messages::Word::Default; pajlada::Settings::SettingListener wordMaskListener; diff --git a/src/twitch/twitchmessagebuilder.cpp b/src/twitch/twitchmessagebuilder.cpp index 852aeba1a..5ea5793a7 100644 --- a/src/twitch/twitchmessagebuilder.cpp +++ b/src/twitch/twitchmessagebuilder.cpp @@ -396,7 +396,7 @@ void TwitchMessageBuilder::parseHighlights() // update the media player url if necessary QUrl highlightSoundUrl; if (settings.customHighlightSound) { - highlightSoundUrl = QUrl(settings.pathHighlightSound.get()); + highlightSoundUrl = QUrl(settings.pathHighlightSound.getValue()); } else { highlightSoundUrl = QUrl("qrc:/sounds/ping2.wav"); } @@ -408,7 +408,7 @@ void TwitchMessageBuilder::parseHighlights() } QStringList blackList = - settings.highlightUserBlacklist.get().split("\n", QString::SkipEmptyParts); + settings.highlightUserBlacklist.getValue().split("\n", QString::SkipEmptyParts); // TODO: This vector should only be rebuilt upon highlights being changed auto activeHighlights = settings.highlightProperties.getValue(); diff --git a/src/widgets/accountpopup.cpp b/src/widgets/accountpopup.cpp index 171c8b6b8..9c87f06ca 100644 --- a/src/widgets/accountpopup.cpp +++ b/src/widgets/accountpopup.cpp @@ -95,18 +95,18 @@ AccountPopupWidget::AccountPopupWidget(std::shared_ptr _channel) }); QObject::connect(this->ui->disableHighlights, &QPushButton::clicked, this, [=, &settings]() { - QString str = settings.highlightUserBlacklist.getnonConst(); + QString str = settings.highlightUserBlacklist; str.append(this->ui->lblUsername->text() + "\n"); - settings.highlightUserBlacklist.set(str); + settings.highlightUserBlacklist = str; this->ui->disableHighlights->hide(); this->ui->enableHighlights->show(); }); QObject::connect(this->ui->enableHighlights, &QPushButton::clicked, this, [=, &settings]() { - QString str = settings.highlightUserBlacklist.getnonConst(); + QString str = settings.highlightUserBlacklist; QStringList list = str.split("\n"); list.removeAll(this->ui->lblUsername->text()); - settings.highlightUserBlacklist.set(list.join("\n")); + settings.highlightUserBlacklist = list.join("\n"); this->ui->enableHighlights->hide(); this->ui->disableHighlights->show(); }); @@ -267,8 +267,7 @@ void AccountPopupWidget::showEvent(QShowEvent *) this->updateButtons(this->ui->ownerLayout, false); } - QString blacklisted = - singletons::SettingManager::getInstance().highlightUserBlacklist.getnonConst(); + QString blacklisted = singletons::SettingManager::getInstance().highlightUserBlacklist; QStringList list = blacklisted.split("\n", QString::SkipEmptyParts); if (list.contains(this->ui->lblUsername->text(), Qt::CaseInsensitive)) { this->ui->disableHighlights->hide(); diff --git a/src/widgets/accountpopup.hpp b/src/widgets/accountpopup.hpp index 7e65979df..ee34da7f5 100644 --- a/src/widgets/accountpopup.hpp +++ b/src/widgets/accountpopup.hpp @@ -1,8 +1,8 @@ #pragma once #include "basewidget.hpp" -#include "util/concurrentmap.hpp" #include "twitch/twitchchannel.hpp" +#include "util/concurrentmap.hpp" #include #include diff --git a/src/widgets/settingsdialog.cpp b/src/widgets/settingsdialog.cpp index fc4aa2b72..5032ed5bf 100644 --- a/src/widgets/settingsdialog.cpp +++ b/src/widgets/settingsdialog.cpp @@ -422,7 +422,7 @@ QVBoxLayout *SettingsDialog::createHighlightingTab() for (const auto &highlightProperty : highlightProperties) { highlights->addItem(highlightProperty.key); } - highlightUserBlacklist->setText(settings.highlightUserBlacklist.getnonConst()); + highlightUserBlacklist->setText(settings.highlightUserBlacklist); auto highlightTab = new QTabWidget(); auto customSound = new QHBoxLayout(); auto soundForm = new QFormLayout(); @@ -439,7 +439,7 @@ QVBoxLayout *SettingsDialog::createHighlightingTab() QObject::connect(selectBtn, &QPushButton::clicked, this, [&settings, this] { auto fileName = QFileDialog::getOpenFileName(this, tr("Open Sound"), "", tr("Audio Files (*.mp3 *.wav)")); - settings.pathHighlightSound.set(fileName); + settings.pathHighlightSound = fileName; }); customSound->addWidget(selectBtn); } @@ -617,11 +617,12 @@ QVBoxLayout *SettingsDialog::createHighlightingTab() QStringList list = highlightUserBlacklist->toPlainText().split("\n", QString::SkipEmptyParts); list.removeDuplicates(); - settings.highlightUserBlacklist.set(list.join("\n") + "\n"); + settings.highlightUserBlacklist = list.join("\n") + "\n"; }); - settings.highlightUserBlacklist.valueChanged.connect( - [=](const QString &str) { highlightUserBlacklist->setPlainText(str); }); + settings.highlightUserBlacklist.connect([=](const QString &str, auto) { + highlightUserBlacklist->setPlainText(str); // + }); return layout; } @@ -739,20 +740,6 @@ QVBoxLayout *SettingsDialog::createTabLayout() return layout; } -QCheckBox *SettingsDialog::createCheckbox(const QString &title, Setting &setting) -{ - auto checkbox = new QCheckBox(title); - - // Set checkbox initial state - checkbox->setChecked(setting.get()); - - QObject::connect(checkbox, &QCheckBox::toggled, this, [&setting](bool state) { - setting.set(state); // - }); - - return checkbox; -} - QCheckBox *SettingsDialog::createCheckbox(const QString &title, pajlada::Settings::Setting &setting) { diff --git a/src/widgets/settingsdialog.hpp b/src/widgets/settingsdialog.hpp index 2c1654798..2e1092f02 100644 --- a/src/widgets/settingsdialog.hpp +++ b/src/widgets/settingsdialog.hpp @@ -88,7 +88,6 @@ private: /// Widget creation helpers QVBoxLayout *createTabLayout(); - QCheckBox *createCheckbox(const QString &title, Setting &setting); QCheckBox *createCheckbox(const QString &title, pajlada::Settings::Setting &setting); QHBoxLayout *createCombobox(const QString &title, pajlada::Settings::Setting &setting, QStringList items, From 96fa242e65995bb71ffc3fe338797572dee07811 Mon Sep 17 00:00:00 2001 From: Rasmus Karlsson Date: Thu, 4 Jan 2018 02:30:51 +0100 Subject: [PATCH 4/5] update linux installation instructions --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index e032bbd39..90420f0a0 100644 --- a/README.md +++ b/README.md @@ -34,7 +34,7 @@ Building using MSYS2 can be quite easier process. Check out MSYS2 at [msys2.org] #### Ubuntu 16.04.2 LTS *most likely works the same for other Debian-like distros* 1. install QT Creator `sudo apt-get install qtcreator qtmultimedia5-dev` -2. install boost-dev `sudo apt-get install libboost-all-dev` +2. install boost-dev `sudo apt-get install libboost-dev` 3. copy `include/rapidjson` from [rapidjson](https://github.com/miloyip/rapidjson/releases/latest) into the chatterino directory so that the file `/rapidjson/document.h` exists 4. open `chatterino.pro` with QT Creator and build From 27dacdde36da044e613f659cfcc62eb2a4b70c23 Mon Sep 17 00:00:00 2001 From: Rasmus Karlsson Date: Thu, 4 Jan 2018 02:32:24 +0100 Subject: [PATCH 5/5] Disable empty-string sending Fixes #191 --- src/singletons/ircmanager.cpp | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/singletons/ircmanager.cpp b/src/singletons/ircmanager.cpp index e25cb3c76..ad2d03960 100644 --- a/src/singletons/ircmanager.cpp +++ b/src/singletons/ircmanager.cpp @@ -200,14 +200,19 @@ void IrcManager::disconnect() void IrcManager::sendMessage(const QString &channelName, QString message) { + QString trimmedMessage = message.trimmed(); + if (trimmedMessage.isEmpty()) { + return; + } + this->connectionMutex.lock(); static int i = 0; if (this->writeConnection) { if (singletons::SettingManager::getInstance().allowDuplicateMessages && (++i % 2) == 0) { - message.append(this->messageSuffix); + trimmedMessage.append(this->messageSuffix); } - this->writeConnection->sendRaw("PRIVMSG #" + channelName + " :" + message); + this->writeConnection->sendRaw("PRIVMSG #" + channelName + " :" + trimmedMessage); } this->connectionMutex.unlock(); @@ -399,5 +404,5 @@ Communi::IrcConnection *IrcManager::getReadConnection() return this->readConnection.get(); } +} // namespace singletons } // namespace chatterino -}