From cf9560508c1f5a8ee098117d1f8158a33130db04 Mon Sep 17 00:00:00 2001 From: fourtf Date: Fri, 10 Aug 2018 19:00:14 +0200 Subject: [PATCH] improving code quality --- chatterino.pro | 3 +- src/BrowserExtension.cpp | 14 ++- src/RunGui.cpp | 52 +++++----- src/common/Channel.cpp | 47 ++++++++- src/common/Channel.hpp | 46 ++------- src/common/LinkParser.cpp | 96 +++++++++---------- src/common/LinkParser.hpp | 11 +-- src/common/LockedObject.hpp | 38 -------- src/common/NetworkManager.cpp | 4 +- src/common/NetworkManager.hpp | 2 +- src/common/NetworkRequest.cpp | 6 +- src/common/NetworkRequest.hpp | 2 - src/common/Property.hpp | 34 ------- .../highlights/HighlightBlacklistUser.hpp | 2 +- .../highlights/HighlightPhrase.hpp | 2 +- src/controllers/ignores/IgnorePhrase.hpp | 2 +- src/providers/twitch/TwitchChannel.cpp | 4 +- src/providers/twitch/TwitchChannel.hpp | 2 +- src/singletons/NativeMessaging.cpp | 2 +- src/singletons/Theme.hpp | 2 +- .../RapidJsonSerializeQString.hpp} | 0 src/util/RapidjsonHelpers.hpp | 2 +- src/widgets/splits/Split.hpp | 2 +- 23 files changed, 143 insertions(+), 232 deletions(-) delete mode 100644 src/common/LockedObject.hpp delete mode 100644 src/common/Property.hpp rename src/{common/SerializeCustom.hpp => util/RapidJsonSerializeQString.hpp} (100%) diff --git a/chatterino.pro b/chatterino.pro index c41cea5a9..76730ccda 100644 --- a/chatterino.pro +++ b/chatterino.pro @@ -258,7 +258,6 @@ HEADERS += \ src/common/Common.hpp \ src/common/CompletionModel.hpp \ src/common/FlagsEnum.hpp \ - src/common/LockedObject.hpp \ src/common/MutexValue.hpp \ src/common/NetworkCommon.hpp \ src/common/NetworkData.hpp \ @@ -271,7 +270,7 @@ HEADERS += \ src/common/NullablePtr.hpp \ src/common/Property.hpp \ src/common/ProviderId.hpp \ - src/common/SerializeCustom.hpp \ + src/uril/RapidJsonSerializeQString.hpp \ src/common/SignalVectorModel.hpp \ src/common/Version.hpp \ src/controllers/accounts/Account.hpp \ diff --git a/src/BrowserExtension.cpp b/src/BrowserExtension.cpp index 75a6ef26f..5275e0648 100644 --- a/src/BrowserExtension.cpp +++ b/src/BrowserExtension.cpp @@ -31,11 +31,9 @@ void runLoop(NativeMessagingClient &client) char size_c[4]; std::cin.read(size_c, 4); - if (std::cin.eof()) { - break; - } + if (std::cin.eof()) break; - uint32_t size = *reinterpret_cast(size_c); + auto size = *reinterpret_cast(size_c); #if 0 bool bigEndian = isBigEndian(); @@ -50,12 +48,12 @@ void runLoop(NativeMessagingClient &client) } #endif - std::unique_ptr b(new char[size + 1]); - std::cin.read(b.get(), size); - *(b.get() + size) = '\0'; + std::unique_ptr buffer(new char[size + 1]); + std::cin.read(buffer.get(), size); + *(buffer.get() + size) = '\0'; client.sendMessage( - QByteArray::fromRawData(b.get(), static_cast(size))); + QByteArray::fromRawData(buffer.get(), static_cast(size))); } } } // namespace diff --git a/src/RunGui.cpp b/src/RunGui.cpp index d6c4b0306..9fdcdb20c 100644 --- a/src/RunGui.cpp +++ b/src/RunGui.cpp @@ -27,35 +27,33 @@ void installCustomPalette() { // borrowed from // https://stackoverflow.com/questions/15035767/is-the-qt-5-dark-fusion-theme-available-for-windows - QPalette darkPalette = qApp->palette(); + auto dark = qApp->palette(); - darkPalette.setColor(QPalette::Window, QColor(22, 22, 22)); - darkPalette.setColor(QPalette::WindowText, Qt::white); - darkPalette.setColor(QPalette::Text, Qt::white); - darkPalette.setColor(QPalette::Disabled, QPalette::WindowText, - QColor(127, 127, 127)); - darkPalette.setColor(QPalette::Base, QColor("#333")); - darkPalette.setColor(QPalette::AlternateBase, QColor("#444")); - darkPalette.setColor(QPalette::ToolTipBase, Qt::white); - darkPalette.setColor(QPalette::ToolTipText, Qt::white); - darkPalette.setColor(QPalette::Disabled, QPalette::Text, - QColor(127, 127, 127)); - darkPalette.setColor(QPalette::Dark, QColor(35, 35, 35)); - darkPalette.setColor(QPalette::Shadow, QColor(20, 20, 20)); - darkPalette.setColor(QPalette::Button, QColor(70, 70, 70)); - darkPalette.setColor(QPalette::ButtonText, Qt::white); - darkPalette.setColor(QPalette::Disabled, QPalette::ButtonText, - QColor(127, 127, 127)); - darkPalette.setColor(QPalette::BrightText, Qt::red); - darkPalette.setColor(QPalette::Link, QColor(42, 130, 218)); - darkPalette.setColor(QPalette::Highlight, QColor(42, 130, 218)); - darkPalette.setColor(QPalette::Disabled, QPalette::Highlight, - QColor(80, 80, 80)); - darkPalette.setColor(QPalette::HighlightedText, Qt::white); - darkPalette.setColor(QPalette::Disabled, QPalette::HighlightedText, - QColor(127, 127, 127)); + dark.setColor(QPalette::Window, QColor(22, 22, 22)); + dark.setColor(QPalette::WindowText, Qt::white); + dark.setColor(QPalette::Text, Qt::white); + dark.setColor(QPalette::Disabled, QPalette::WindowText, + QColor(127, 127, 127)); + dark.setColor(QPalette::Base, QColor("#333")); + dark.setColor(QPalette::AlternateBase, QColor("#444")); + dark.setColor(QPalette::ToolTipBase, Qt::white); + dark.setColor(QPalette::ToolTipText, Qt::white); + dark.setColor(QPalette::Disabled, QPalette::Text, QColor(127, 127, 127)); + dark.setColor(QPalette::Dark, QColor(35, 35, 35)); + dark.setColor(QPalette::Shadow, QColor(20, 20, 20)); + dark.setColor(QPalette::Button, QColor(70, 70, 70)); + dark.setColor(QPalette::ButtonText, Qt::white); + dark.setColor(QPalette::Disabled, QPalette::ButtonText, + QColor(127, 127, 127)); + dark.setColor(QPalette::BrightText, Qt::red); + dark.setColor(QPalette::Link, QColor(42, 130, 218)); + dark.setColor(QPalette::Highlight, QColor(42, 130, 218)); + dark.setColor(QPalette::Disabled, QPalette::Highlight, QColor(80, 80, 80)); + dark.setColor(QPalette::HighlightedText, Qt::white); + dark.setColor(QPalette::Disabled, QPalette::HighlightedText, + QColor(127, 127, 127)); - qApp->setPalette(darkPalette); + qApp->setPalette(dark); } void initQt() diff --git a/src/common/Channel.cpp b/src/common/Channel.cpp index 3adcccd2f..d7f1659f4 100644 --- a/src/common/Channel.cpp +++ b/src/common/Channel.cpp @@ -18,6 +18,9 @@ namespace chatterino { +// +// Channel +// Channel::Channel(const QString &name, Type type) : completionModel(name) , name_(name) @@ -67,8 +70,7 @@ void Channel::addMessage(MessagePtr message) const QString &username = message->loginName; if (!username.isEmpty()) { - // TODO: Add recent chatters display name. This should maybe be a - // setting + // TODO: Add recent chatters display name this->addRecentChatter(message); } @@ -194,7 +196,6 @@ void Channel::replaceMessage(MessagePtr message, MessagePtr replacement) void Channel::addRecentChatter(const MessagePtr &message) { - // Do nothing by default } bool Channel::canSendMessage() const @@ -232,9 +233,45 @@ void Channel::onConnected() { } -std::weak_ptr Channel::weak_from_this() +// +// Indirect channel +// +IndirectChannel::Data::Data(ChannelPtr _channel, Channel::Type _type) + : channel(_channel) + , type(_type) { - return std::weak_ptr(this->shared_from_this()); +} + +IndirectChannel::IndirectChannel(ChannelPtr channel, Channel::Type type) + : data_(std::make_unique(channel, type)) +{ +} + +ChannelPtr IndirectChannel::get() +{ + return data_->channel; +} + +void IndirectChannel::reset(ChannelPtr channel) +{ + assert(this->data_->type != Channel::Type::Direct); + + this->data_->channel = channel; + this->data_->changed.invoke(); +} + +pajlada::Signals::NoArgSignal &IndirectChannel::getChannelChanged() +{ + return this->data_->changed; +} + +Channel::Type IndirectChannel::getType() +{ + if (this->data_->type == Channel::Type::Direct) { + return this->get()->getType(); + } else { + return this->data_->type; + } } } // namespace chatterino diff --git a/src/common/Channel.hpp b/src/common/Channel.hpp index 429123c5a..cb93c1694 100644 --- a/src/common/Channel.hpp +++ b/src/common/Channel.hpp @@ -4,7 +4,6 @@ #include "messages/Image.hpp" #include "messages/LimitedQueue.hpp" #include "messages/Message.hpp" -#include "util/ConcurrentMap.hpp" #include #include @@ -66,9 +65,6 @@ public: CompletionModel completionModel; - // pre c++17 polyfill - std::weak_ptr weak_from_this(); - protected: virtual void onConnected(); @@ -88,47 +84,17 @@ class IndirectChannel Channel::Type type; pajlada::Signals::NoArgSignal changed; - Data() = delete; - Data(ChannelPtr _channel, Channel::Type _type) - : channel(_channel) - , type(_type) - { - } + Data(ChannelPtr channel, Channel::Type type); }; public: IndirectChannel(ChannelPtr channel, - Channel::Type type = Channel::Type::Direct) - : data_(new Data(channel, type)) - { - } + Channel::Type type = Channel::Type::Direct); - ChannelPtr get() - { - return data_->channel; - } - - void update(ChannelPtr ptr) - { - assert(this->data_->type != Channel::Type::Direct); - - this->data_->channel = ptr; - this->data_->changed.invoke(); - } - - pajlada::Signals::NoArgSignal &getChannelChanged() - { - return this->data_->changed; - } - - Channel::Type getType() - { - if (this->data_->type == Channel::Type::Direct) { - return this->get()->getType(); - } else { - return this->data_->type; - } - } + ChannelPtr get(); + void reset(ChannelPtr channel); + pajlada::Signals::NoArgSignal &getChannelChanged(); + Channel::Type getType(); private: std::shared_ptr data_; diff --git a/src/common/LinkParser.cpp b/src/common/LinkParser.cpp index b4f63a156..a80c75641 100644 --- a/src/common/LinkParser.cpp +++ b/src/common/LinkParser.cpp @@ -5,69 +5,63 @@ #include #include +// ip 0.0.0.0 - 224.0.0.0 +#define IP \ + "(?:[1-9]\\d?|1\\d\\d|2[01]\\d|22[0-3])" \ + "(?:\\.(?:1?\\d{1,2}|2[0-4]\\d|25[0-5])){2}" \ + "(?:\\.(?:[1-9]\\d?|1\\d\\d|2[0-4]\\d|25[0-4]))" +#define PORT "(?::\\d{2,5})" +#define WEB_CHAR1 "[_a-z\\x{00a1}-\\x{ffff}0-9]" +#define WEB_CHAR2 "[a-z\\x{00a1}-\\x{ffff}0-9]" + +#define SPOTIFY_1 "(?:artist|album|track|user:[^:]+:playlist):[a-zA-Z0-9]+" +#define SPOTIFY_2 "user:[^:]+" +#define SPOTIFY_3 "search:(?:[-\\w$\\.+!*'(),]+|%[a-fA-F0-9]{2})+" +#define SPOTIFY_PARAMS "(?:" SPOTIFY_1 "|" SPOTIFY_2 "|" SPOTIFY_3 ")" +#define SPOTIFY_LINK "(?x-mi:(spotify:" SPOTIFY_PARAMS "))" + +#define WEB_PROTOCOL "(?:(?:https?|ftps?)://)?" +#define WEB_USER "(?:\\S+(?::\\S*)?@)?" +#define WEB_HOST "(?:(?:" WEB_CHAR1 "-*)*" WEB_CHAR2 "+)" +#define WEB_DOMAIN "(?:\\.(?:" WEB_CHAR2 "-*)*" WEB_CHAR2 "+)*" +#define WEB_TLD "(?:" + tldData + ")" +#define WEB_RESOURCE_PATH "(?:[/?#]\\S*)" +#define WEB_LINK \ + WEB_PROTOCOL WEB_USER "(?:" IP "|" WEB_HOST WEB_DOMAIN "\\." WEB_TLD PORT \ + "?" WEB_RESOURCE_PATH "?)" + +#define LINK "^(?:" SPOTIFY_LINK "|" WEB_LINK ")$" + namespace chatterino { LinkParser::LinkParser(const QString &unparsedString) { static QRegularExpression linkRegex = [] { static QRegularExpression newLineRegex("\r?\n"); - QFile tldFile(":/tlds.txt"); - tldFile.open(QFile::ReadOnly); + QFile file(":/tlds.txt"); + file.open(QFile::ReadOnly); + QTextStream tlds(&file); + tlds.setCodec("UTF-8"); - QTextStream t1(&tldFile); - t1.setCodec("UTF-8"); + // tldData gets injected into the LINK macro + auto tldData = tlds.readAll().replace(newLineRegex, "|"); + (void)tldData; - // Read the TLDs in and replace the newlines with pipes - QString tldData = t1.readAll().replace(newLineRegex, "|"); - - const QString hyperlinkRegExp = - "^" - // Identifier for spotify - "(?x-mi:(spotify:(?:" - "(?:artist|album|track|user:[^:]+:playlist):" - "[a-zA-Z0-9]+|user:[^:]+|search:" - "(?:[-\\w$\\.+!*'(),]+|%[a-fA-F0-9]{2})+)))" - // If nothing matches then just go on - "|" - "^" - // Identifier for http and ftp - "(?:(?:https?|ftps?)://)?" - // user:pass authentication - "(?:\\S+(?::\\S*)?@)?" - "(?:" - // IP address dotted notation octets - // excludes loopback network 0.0.0.0 - // excludes reserved space >= 224.0.0.0 - // excludes network & broacast addresses - // (first & last IP address of each class) - "(?:[1-9]\\d?|1\\d\\d|2[01]\\d|22[0-3])" - "(?:\\.(?:1?\\d{1,2}|2[0-4]\\d|25[0-5])){2}" - "(?:\\.(?:[1-9]\\d?|1\\d\\d|2[0-4]\\d|25[0-4]))" - "|" - // host name - "(?:(?:[_a-z\\x{00a1}-\\x{ffff}0-9]-*)*[a-z\\x{00a1}-\\x{ffff}0-9]+" - ")" - // domain name - "(?:\\.(?:[a-z\\x{00a1}-\\x{ffff}0-9]-*)*[a-z\\x{00a1}-\\x{ffff}0-" - "9]+)*" - // TLD identifier - //"(?:\\.(?:[a-z\\x{00a1}-\\x{ffff}]{2,}))" - "(?:[\\.](?:" + - tldData + - "))" - "\\.?" - ")" - // port number - "(?::\\d{2,5})?" - // resource path - "(?:[/?#]\\S*)?" - "$"; - - return QRegularExpression(hyperlinkRegExp, + return QRegularExpression(LINK, QRegularExpression::CaseInsensitiveOption); }(); this->match_ = linkRegex.match(unparsedString); } +bool LinkParser::hasMatch() const +{ + return this->match_.hasMatch(); +} + +QString LinkParser::getCaptured() const +{ + return this->match_.captured(); +} + } // namespace chatterino diff --git a/src/common/LinkParser.hpp b/src/common/LinkParser.hpp index 3a1ad6fab..2d56cbde0 100644 --- a/src/common/LinkParser.hpp +++ b/src/common/LinkParser.hpp @@ -10,15 +10,8 @@ class LinkParser public: explicit LinkParser(const QString &unparsedString); - bool hasMatch() const - { - return this->match_.hasMatch(); - } - - QString getCaptured() const - { - return this->match_.captured(); - } + bool hasMatch() const; + QString getCaptured() const; private: QRegularExpressionMatch match_; diff --git a/src/common/LockedObject.hpp b/src/common/LockedObject.hpp deleted file mode 100644 index 01ffe3b66..000000000 --- a/src/common/LockedObject.hpp +++ /dev/null @@ -1,38 +0,0 @@ -#pragma once - -#include - -namespace chatterino { - -template -class LockedObject -{ -public: - LockedObject &operator=(const LockedObject &other) - { - this->mutex_.lock(); - - this->data = other.getValue(); - - this->mutex_.unlock(); - - return *this; - } - - LockedObject &operator=(const Type &other) - { - this->mutex_.lock(); - - this->data = other; - - this->mutex_.unlock(); - - return *this; - } - -private: - Type value_; - std::mutex mutex_; -}; - -} // namespace chatterino diff --git a/src/common/NetworkManager.cpp b/src/common/NetworkManager.cpp index 5577afda5..1ff1bf635 100644 --- a/src/common/NetworkManager.cpp +++ b/src/common/NetworkManager.cpp @@ -5,11 +5,11 @@ namespace chatterino { QThread NetworkManager::workerThread; -QNetworkAccessManager NetworkManager::NaM; +QNetworkAccessManager NetworkManager::accessManager; void NetworkManager::init() { - NetworkManager::NaM.moveToThread(&NetworkManager::workerThread); + NetworkManager::accessManager.moveToThread(&NetworkManager::workerThread); NetworkManager::workerThread.start(); } diff --git a/src/common/NetworkManager.hpp b/src/common/NetworkManager.hpp index 0e59c0540..12c0c6a51 100644 --- a/src/common/NetworkManager.hpp +++ b/src/common/NetworkManager.hpp @@ -20,7 +20,7 @@ class NetworkManager : public QObject public: static QThread workerThread; - static QNetworkAccessManager NaM; + static QNetworkAccessManager accessManager; static void init(); static void deinit(); diff --git a/src/common/NetworkRequest.cpp b/src/common/NetworkRequest.cpp index 464061be4..f7a288206 100644 --- a/src/common/NetworkRequest.cpp +++ b/src/common/NetworkRequest.cpp @@ -186,14 +186,14 @@ void NetworkRequest::doRequest() auto reply = [&]() -> QNetworkReply * { switch (data->requestType_) { case NetworkRequestType::Get: - return NetworkManager::NaM.get(data->request_); + return NetworkManager::accessManager.get(data->request_); case NetworkRequestType::Put: - return NetworkManager::NaM.put(data->request_, + return NetworkManager::accessManager.put(data->request_, data->payload_); case NetworkRequestType::Delete: - return NetworkManager::NaM.deleteResource(data->request_); + return NetworkManager::accessManager.deleteResource(data->request_); default: return nullptr; diff --git a/src/common/NetworkRequest.hpp b/src/common/NetworkRequest.hpp index ea1361faf..09b2cccee 100644 --- a/src/common/NetworkRequest.hpp +++ b/src/common/NetworkRequest.hpp @@ -58,8 +58,6 @@ public: void execute(); private: - // Returns true if the file was successfully loaded from cache - // Returns false if the cache file either didn't exist, or it contained // "invalid" data "invalid" is specified by the onSuccess callback Outcome tryLoadCachedFile(); diff --git a/src/common/Property.hpp b/src/common/Property.hpp deleted file mode 100644 index 99d0efa48..000000000 --- a/src/common/Property.hpp +++ /dev/null @@ -1,34 +0,0 @@ -#pragma once - -#include "boost/noncopyable.hpp" - -namespace chatterino { - -template -class Property final : boost::noncopyable -{ -public: - Property() - { - } - - Property(const T &value) - : value_(value) - { - } - - T &operator=(const T &f) - { - return value_ = f; - } - - operator T const &() const - { - return value_; - } - -protected: - T value_; -}; - -} // namespace chatterino diff --git a/src/controllers/highlights/HighlightBlacklistUser.hpp b/src/controllers/highlights/HighlightBlacklistUser.hpp index 5376d9cf5..4ce8683d0 100644 --- a/src/controllers/highlights/HighlightBlacklistUser.hpp +++ b/src/controllers/highlights/HighlightBlacklistUser.hpp @@ -1,6 +1,6 @@ #pragma once -#include "common/SerializeCustom.hpp" +#include "util/RapidJsonSerializeQString.hpp" #include "util/RapidjsonHelpers.hpp" #include diff --git a/src/controllers/highlights/HighlightPhrase.hpp b/src/controllers/highlights/HighlightPhrase.hpp index 77cd5936b..91abaadce 100644 --- a/src/controllers/highlights/HighlightPhrase.hpp +++ b/src/controllers/highlights/HighlightPhrase.hpp @@ -1,6 +1,6 @@ #pragma once -#include "common/SerializeCustom.hpp" +#include "util/RapidJsonSerializeQString.hpp" #include "util/RapidjsonHelpers.hpp" #include diff --git a/src/controllers/ignores/IgnorePhrase.hpp b/src/controllers/ignores/IgnorePhrase.hpp index f42df8442..81eb83a87 100644 --- a/src/controllers/ignores/IgnorePhrase.hpp +++ b/src/controllers/ignores/IgnorePhrase.hpp @@ -1,6 +1,6 @@ #pragma once -#include "common/SerializeCustom.hpp" +#include "util/RapidJsonSerializeQString.hpp" #include "util/RapidjsonHelpers.hpp" #include diff --git a/src/providers/twitch/TwitchChannel.cpp b/src/providers/twitch/TwitchChannel.cpp index 57de91a5d..04b0f2666 100644 --- a/src/providers/twitch/TwitchChannel.cpp +++ b/src/providers/twitch/TwitchChannel.cpp @@ -250,12 +250,12 @@ void TwitchChannel::addPartedUser(const QString &user) QString TwitchChannel::getRoomId() const { - return this->roomID_.get(); + return *this->roomID_.access(); } void TwitchChannel::setRoomId(const QString &id) { - this->roomID_.set(id); + (*this->roomID_.access()) = id; this->roomIdChanged.invoke(); this->loadRecentMessages(); } diff --git a/src/providers/twitch/TwitchChannel.hpp b/src/providers/twitch/TwitchChannel.hpp index 320be3b36..5befb6700 100644 --- a/src/providers/twitch/TwitchChannel.hpp +++ b/src/providers/twitch/TwitchChannel.hpp @@ -134,7 +134,7 @@ private: const QString popoutPlayerUrl_; bool mod_ = false; - MutexValue roomID_; + UniqueAccess roomID_; UniqueAccess joinedUsers_; bool joinedUsersMergeQueued_ = false; diff --git a/src/singletons/NativeMessaging.cpp b/src/singletons/NativeMessaging.cpp index 4afea4714..cd80f8021 100644 --- a/src/singletons/NativeMessaging.cpp +++ b/src/singletons/NativeMessaging.cpp @@ -200,7 +200,7 @@ void NativeMessagingServer::ReceiverThread::handleMessage( if (_type == "twitch") { postToThread([=] { if (!name.isEmpty()) { - app->twitch.server->watchingChannel.update( + app->twitch.server->watchingChannel.reset( app->twitch.server->getOrAddChannel(name)); } diff --git a/src/singletons/Theme.hpp b/src/singletons/Theme.hpp index 47bb6c3ef..5ee6f6d58 100644 --- a/src/singletons/Theme.hpp +++ b/src/singletons/Theme.hpp @@ -1,7 +1,7 @@ #pragma once -#include "common/SerializeCustom.hpp" #include "common/Singleton.hpp" +#include "util/RapidJsonSerializeQString.hpp" #include #include diff --git a/src/common/SerializeCustom.hpp b/src/util/RapidJsonSerializeQString.hpp similarity index 100% rename from src/common/SerializeCustom.hpp rename to src/util/RapidJsonSerializeQString.hpp diff --git a/src/util/RapidjsonHelpers.hpp b/src/util/RapidjsonHelpers.hpp index db6db99f4..8dbfe07a2 100644 --- a/src/util/RapidjsonHelpers.hpp +++ b/src/util/RapidjsonHelpers.hpp @@ -1,6 +1,6 @@ #pragma once -#include "common/SerializeCustom.hpp" +#include "util/RapidJsonSerializeQString.hpp" #include #include diff --git a/src/widgets/splits/Split.hpp b/src/widgets/splits/Split.hpp index eafddf5c2..fc87307e7 100644 --- a/src/widgets/splits/Split.hpp +++ b/src/widgets/splits/Split.hpp @@ -2,11 +2,11 @@ #include "common/Channel.hpp" #include "common/NullablePtr.hpp" -#include "common/SerializeCustom.hpp" #include "messages/LimitedQueueSnapshot.hpp" #include "messages/MessageElement.hpp" #include "messages/layouts/MessageLayout.hpp" #include "messages/layouts/MessageLayoutElement.hpp" +#include "uril/RapidJsonSerializeQString.hpp" #include "widgets/BaseWidget.hpp" #include "widgets/helper/ChannelView.hpp" #include "widgets/helper/EffectLabel.hpp"