diff --git a/.gitignore b/.gitignore index eca5bc34b59..a0e5fee741c 100644 --- a/.gitignore +++ b/.gitignore @@ -104,3 +104,6 @@ Stamp tmp Source Dependencies_* + +# vcpkg +vcpkg_installed/ diff --git a/BUILDING_ON_WINDOWS_WITH_VCPKG.md b/BUILDING_ON_WINDOWS_WITH_VCPKG.md new file mode 100644 index 00000000000..4bfac943dc5 --- /dev/null +++ b/BUILDING_ON_WINDOWS_WITH_VCPKG.md @@ -0,0 +1,35 @@ +# Building on Windows with vcpkg + +## Prerequisites + +1. Install [Visual Studio](https://visualstudio.microsoft.com/) with "Desktop development with C++" (~9.66 GB) +1. Install [CMake](https://cmake.org/) (~109 MB) +1. Install [git](https://git-scm.com/) (~264 MB) +1. Install [vcpkg](https://vcpkg.io/) (~80 MB) + - `git clone https://github.com/Microsoft/vcpkg.git` + - `cd .\vcpkg\` + - `.\bootstrap-vcpkg.bat` + - `.\vcpkg integrate install` + - `.\vcpkg integrate powershell` + - `cd ..` +1. Configure the environment for vcpkg + - `set VCPKG_DEFAULT_TRIPLET=x64-windows` + - [default](https://github.com/microsoft/vcpkg/blob/master/docs/users/triplets.md#additional-remarks) is `x86-windows` + - `set VCPKG_ROOT=C:\path\to\vcpkg\` + - `set PATH=%PATH%;%VCPKG_ROOT%` + +## Building + +1. Clone + - `git clone --recurse-submodules https://github.com/Chatterino/chatterino2.git` +1. Install dependencies (~21 GB) + - `cd .\chatterino2\` + - `vcpkg install` +1. Build + - `mkdir .\build\` + - `cd .\build\` + - (cmd) `cmake .. -DCMAKE_TOOLCHAIN_FILE=%VCPKG_ROOT%/scripts/buildsystems/vcpkg.cmake` + - (ps1) `cmake .. -DCMAKE_TOOLCHAIN_FILE="$env:VCPKG_ROOT/scripts/buildsystems/vcpkg.cmake"` + - `cmake --build . --parallel --config Release` +1. Run + - `.\bin\chatterino2.exe` diff --git a/CHANGELOG.md b/CHANGELOG.md index cc4499ccb6a..9c83a6d12b5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,7 +12,7 @@ - Minor: Sorted usernames in /vips message to be case-insensitive. (#3696) - Minor: Added option to open a user's chat in a new tab from the usercard profile picture context menu. (#3625) - Minor: Fixed tag parsing for consecutive escaped characters. (#3711) -- Minor: Prevent user from entering incorrect characters in Live Notifications channels list. (#3715) +- Minor: Prevent user from entering incorrect characters in Live Notifications channels list. (#3715, #3730) - Minor: Fixed automod caught message notice appearing twice for mods. (#3717) - Bugfix: Fixed live notifications for usernames containing uppercase characters. (#3646) - Bugfix: Fixed live notifications not getting updated for closed streams going offline. (#3678) diff --git a/CMakeLists.txt b/CMakeLists.txt index b2cd73c37d8..0c01861df14 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -59,6 +59,7 @@ find_package(Sanitizers) # Find boost on the system find_package(Boost REQUIRED) +find_package(Boost COMPONENTS random) # Find OpenSSL on the system find_package(OpenSSL REQUIRED) diff --git a/README.md b/README.md index 180d18e5392..29d1881dc51 100644 --- a/README.md +++ b/README.md @@ -36,6 +36,8 @@ git submodule update --init --recursive [Building on Windows](../master/BUILDING_ON_WINDOWS.md) +[Building on Windows with vcpkg](../master/BUILDING_ON_WINDOWS_WITH_VCPKG.md) + [Building on Linux](../master/BUILDING_ON_LINUX.md) [Building on Mac](../master/BUILDING_ON_MAC.md) diff --git a/chatterino.pro b/chatterino.pro index d12f8d4f1b0..be553f8e758 100644 --- a/chatterino.pro +++ b/chatterino.pro @@ -309,6 +309,7 @@ SOURCES += \ src/widgets/helper/NotebookTab.cpp \ src/widgets/helper/QColorPicker.cpp \ src/widgets/helper/RegExpItemDelegate.cpp \ + src/widgets/helper/TrimRegExpValidator.cpp \ src/widgets/helper/ResizingTextEdit.cpp \ src/widgets/helper/ScrollbarHighlight.cpp \ src/widgets/helper/SearchPopup.cpp \ @@ -596,6 +597,7 @@ HEADERS += \ src/widgets/helper/NotebookTab.hpp \ src/widgets/helper/QColorPicker.hpp \ src/widgets/helper/RegExpItemDelegate.hpp \ + src/widgets/helper/TrimRegExpValidator.hpp \ src/widgets/helper/ResizingTextEdit.hpp \ src/widgets/helper/ScrollbarHighlight.hpp \ src/widgets/helper/SearchPopup.hpp \ diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 8bf38341165..f6902ca1511 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -427,6 +427,8 @@ set(SOURCE_FILES widgets/helper/QColorPicker.hpp widgets/helper/RegExpItemDelegate.cpp widgets/helper/RegExpItemDelegate.hpp + widgets/helper/TrimRegExpValidator.cpp + widgets/helper/TrimRegExpValidator.hpp widgets/helper/ResizingTextEdit.cpp widgets/helper/ResizingTextEdit.hpp widgets/helper/ScrollbarHighlight.cpp @@ -654,7 +656,7 @@ if (WIN32) endif () if (MSVC) - target_compile_options(${LIBRARY_PROJECT} PUBLIC /EHsc) + target_compile_options(${LIBRARY_PROJECT} PUBLIC /EHsc /bigobj) endif () if (APPLE AND BUILD_APP) @@ -687,7 +689,7 @@ if (USE_CONAN AND TARGET CONAN_PKG::boost) else () target_link_libraries(${LIBRARY_PROJECT} PUBLIC - Boost::boost + ${Boost_LIBRARIES} ) endif () diff --git a/src/common/Env.cpp b/src/common/Env.cpp index 724c8d92a0c..ec278ea0fbc 100644 --- a/src/common/Env.cpp +++ b/src/common/Env.cpp @@ -54,9 +54,6 @@ Env::Env() , linkResolverUrl(readStringEnv( "CHATTERINO2_LINK_RESOLVER_URL", "https://braize.pajlada.com/chatterino/link_resolver/%1")) - , twitchEmoteSetResolverUrl(readStringEnv( - "CHATTERINO2_TWITCH_EMOTE_SET_RESOLVER_URL", - "https://braize.pajlada.com/chatterino/twitchemotes/set/%1/")) , twitchServerHost( readStringEnv("CHATTERINO2_TWITCH_SERVER_HOST", "irc.chat.twitch.tv")) , twitchServerPort(readPortEnv("CHATTERINO2_TWITCH_SERVER_PORT", 443)) diff --git a/src/common/Env.hpp b/src/common/Env.hpp index 6dc8077a9fa..b334e8e9625 100644 --- a/src/common/Env.hpp +++ b/src/common/Env.hpp @@ -13,7 +13,6 @@ class Env const QString recentMessagesApiUrl; const QString linkResolverUrl; - const QString twitchEmoteSetResolverUrl; const QString twitchServerHost; const uint16_t twitchServerPort; const bool twitchServerSecure; diff --git a/src/controllers/commands/CommandController.cpp b/src/controllers/commands/CommandController.cpp index 5fb7259362f..e4fe0f20e01 100644 --- a/src/controllers/commands/CommandController.cpp +++ b/src/controllers/commands/CommandController.cpp @@ -448,7 +448,6 @@ void CommandController::initialize(Settings &, Paths &paths) QStringList debugMessages{ "recentMessagesApiUrl: " + env.recentMessagesApiUrl, "linkResolverUrl: " + env.linkResolverUrl, - "twitchEmoteSetResolverUrl: " + env.twitchEmoteSetResolverUrl, "twitchServerHost: " + env.twitchServerHost, "twitchServerPort: " + QString::number(env.twitchServerPort), "twitchServerSecure: " + QString::number(env.twitchServerSecure), diff --git a/src/messages/SharedMessageBuilder.cpp b/src/messages/SharedMessageBuilder.cpp index fdcf9dcc43b..6b094849146 100644 --- a/src/messages/SharedMessageBuilder.cpp +++ b/src/messages/SharedMessageBuilder.cpp @@ -9,6 +9,7 @@ #include "singletons/Settings.hpp" #include "singletons/WindowManager.hpp" #include "util/Helpers.hpp" +#include "util/Qt.hpp" #include "util/StreamerMode.hpp" #include @@ -41,8 +42,7 @@ namespace { if (iterator == tags.end()) return QStringList{}; - return iterator.value().toString().split( - ',', QString::SplitBehavior::SkipEmptyParts); + return iterator.value().toString().split(',', Qt::SkipEmptyParts); } std::vector parseBadges(const QVariantMap &tags) diff --git a/src/providers/ffz/FfzBadges.hpp b/src/providers/ffz/FfzBadges.hpp index 64e88e7fb0d..846d3f976ff 100644 --- a/src/providers/ffz/FfzBadges.hpp +++ b/src/providers/ffz/FfzBadges.hpp @@ -9,6 +9,7 @@ #include #include #include +#include #include #include diff --git a/src/providers/twitch/TwitchMessageBuilder.cpp b/src/providers/twitch/TwitchMessageBuilder.cpp index d21910b0624..f6bb632eeb6 100644 --- a/src/providers/twitch/TwitchMessageBuilder.cpp +++ b/src/providers/twitch/TwitchMessageBuilder.cpp @@ -18,6 +18,7 @@ #include "singletons/WindowManager.hpp" #include "util/Helpers.hpp" #include "util/IrcHelpers.hpp" +#include "util/Qt.hpp" #include "widgets/Window.hpp" #include @@ -55,8 +56,7 @@ namespace { if (iterator == tags.end()) return QStringList{}; - return iterator.value().toString().split( - ',', QString::SplitBehavior::SkipEmptyParts); + return iterator.value().toString().split(',', Qt::SkipEmptyParts); } std::map parseBadgeInfos(const QVariantMap &tags) diff --git a/src/widgets/dialogs/EmotePopup.cpp b/src/widgets/dialogs/EmotePopup.cpp index 6dca92cbf70..8d466e0c08e 100644 --- a/src/widgets/dialogs/EmotePopup.cpp +++ b/src/widgets/dialogs/EmotePopup.cpp @@ -15,11 +15,11 @@ #include "widgets/Notebook.hpp" #include "widgets/Scrollbar.hpp" #include "widgets/helper/ChannelView.hpp" +#include "widgets/helper/TrimRegExpValidator.hpp" #include #include #include -#include #include namespace chatterino { @@ -166,7 +166,6 @@ EmotePopup::EmotePopup(QWidget *parent) QRegularExpression searchRegex("\\S*"); searchRegex.setPatternOptions(QRegularExpression::CaseInsensitiveOption); - QValidator *searchValidator = new QRegularExpressionValidator(searchRegex); layout->setMargin(0); layout->setSpacing(0); @@ -177,7 +176,7 @@ EmotePopup::EmotePopup(QWidget *parent) this->search_ = new QLineEdit(); this->search_->setPlaceholderText("Search all emotes..."); - this->search_->setValidator(searchValidator); + this->search_->setValidator(new TrimRegExpValidator(searchRegex)); this->search_->setClearButtonEnabled(true); this->search_->findChild()->setIcon( QPixmap(":/buttons/clearSearch.png")); diff --git a/src/widgets/dialogs/UserInfoPopup.hpp b/src/widgets/dialogs/UserInfoPopup.hpp index faf306e5033..1cb8c75c667 100644 --- a/src/widgets/dialogs/UserInfoPopup.hpp +++ b/src/widgets/dialogs/UserInfoPopup.hpp @@ -100,7 +100,6 @@ class UserInfoPopup final : public BaseWindow Label *noMessagesLabel = nullptr; ChannelView *latestMessages = nullptr; - QPushButton *refreshButton = nullptr; } ui_; class TimeoutWidget : public BaseWidget diff --git a/src/widgets/helper/RegExpItemDelegate.cpp b/src/widgets/helper/RegExpItemDelegate.cpp index d51eb52a22a..d5f05e5845d 100644 --- a/src/widgets/helper/RegExpItemDelegate.cpp +++ b/src/widgets/helper/RegExpItemDelegate.cpp @@ -1,5 +1,7 @@ #include "widgets/helper/RegExpItemDelegate.hpp" +#include "widgets/helper/TrimRegExpValidator.hpp" + #include namespace chatterino { @@ -16,8 +18,7 @@ QWidget *RegExpItemDelegate::createEditor(QWidget *parent, const QModelIndex &index) const { auto *editor = new QLineEdit(parent); - editor->setValidator( - new QRegularExpressionValidator(this->regexp_, editor)); + editor->setValidator(new TrimRegExpValidator(this->regexp_, editor)); return editor; } diff --git a/src/widgets/helper/TrimRegExpValidator.cpp b/src/widgets/helper/TrimRegExpValidator.cpp new file mode 100644 index 00000000000..4e0577f2724 --- /dev/null +++ b/src/widgets/helper/TrimRegExpValidator.cpp @@ -0,0 +1,17 @@ +#include "widgets/helper/TrimRegExpValidator.hpp" + +namespace chatterino { + +TrimRegExpValidator::TrimRegExpValidator(const QRegularExpression &re, + QObject *parent) + : QRegularExpressionValidator(re, parent) +{ +} + +QValidator::State TrimRegExpValidator::validate(QString &input, int &pos) const +{ + input = input.trimmed(); + return QRegularExpressionValidator::validate(input, pos); +} + +} // namespace chatterino diff --git a/src/widgets/helper/TrimRegExpValidator.hpp b/src/widgets/helper/TrimRegExpValidator.hpp new file mode 100644 index 00000000000..07223213942 --- /dev/null +++ b/src/widgets/helper/TrimRegExpValidator.hpp @@ -0,0 +1,19 @@ +#pragma once + +#include +#include + +namespace chatterino { + +class TrimRegExpValidator : public QRegularExpressionValidator +{ + Q_OBJECT + +public: + TrimRegExpValidator(const QRegularExpression &re, + QObject *parent = nullptr); + + QValidator::State validate(QString &input, int &pos) const override; +}; + +} // namespace chatterino diff --git a/src/widgets/splits/SplitContainer.hpp b/src/widgets/splits/SplitContainer.hpp index 077ac7c17eb..3923c48954b 100644 --- a/src/widgets/splits/SplitContainer.hpp +++ b/src/widgets/splits/SplitContainer.hpp @@ -14,6 +14,7 @@ #include #include #include +#include #include class QJsonObject; diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 9b1641d257e..017b72149ec 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -25,7 +25,7 @@ add_sanitizers(${PROJECT_NAME}) target_link_libraries(${PROJECT_NAME} PRIVATE chatterino-lib) -target_link_libraries(${PROJECT_NAME} PRIVATE gtest) +target_link_libraries(${PROJECT_NAME} PRIVATE ${GTEST_BOTH_LIBRARIES}) target_compile_definitions(${PROJECT_NAME} PRIVATE CHATTERINO_TEST diff --git a/vcpkg.json b/vcpkg.json new file mode 100644 index 00000000000..aea44f56ecb --- /dev/null +++ b/vcpkg.json @@ -0,0 +1,21 @@ +{ + "$schema": "https://raw.githubusercontent.com/microsoft/vcpkg/master/scripts/vcpkg.schema.json", + "name": "chatterino", + "version": "2.0.0", + "dependencies": [ + "benchmark", + "boost-asio", + "boost-foreach", + "boost-interprocess", + "boost-random", + "boost-variant", + "gtest", + "openssl", + "qt5-multimedia", + "qt5-tools" + ], + "builtin-baseline": "2ac61f87f69f0484b8044f95ab274038fbaf7bdd", + "overrides": [ + { "name": "openssl", "version-string": "1.1.1n" } + ] +}