diff --git a/src/singletons/Settings.hpp b/src/singletons/Settings.hpp index 6a17024d2..2dd350552 100644 --- a/src/singletons/Settings.hpp +++ b/src/singletons/Settings.hpp @@ -173,9 +173,9 @@ public: "qrc:/sounds/ping3.wav"}; BoolSetting notificationToast = {"/notifications/enableToast", false}; - QStringSetting openFromToast = { + IntSetting openFromToast = { "/notifications/openFromToast", - Toasts::findStringFromReaction(ToastReactions::openInBrowser)}; + static_cast(ToastReactions::OpenInBrowser)}; /// External tools // Streamlink diff --git a/src/singletons/Toasts.cpp b/src/singletons/Toasts.cpp index 2352cccd0..96a640a1d 100644 --- a/src/singletons/Toasts.cpp +++ b/src/singletons/Toasts.cpp @@ -28,16 +28,16 @@ namespace chatterino { std::map Toasts::reactionToString = { - {ToastReactions::openInBrowser, OPEN_IN_BROWSER}, - {ToastReactions::openInPlayer, OPEN_PLAYER_IN_BROWSER}, - {ToastReactions::openInStreamlink, OPEN_IN_STREAMLINK}, - {ToastReactions::dontOpen, DONT_OPEN}}; + {ToastReactions::OpenInBrowser, OPEN_IN_BROWSER}, + {ToastReactions::OpenInPlayer, OPEN_PLAYER_IN_BROWSER}, + {ToastReactions::OpenInStreamlink, OPEN_IN_STREAMLINK}, + {ToastReactions::DontOpen, DONT_OPEN}}; std::map Toasts::stringToReaction = { - {OPEN_IN_BROWSER, ToastReactions::openInBrowser}, - {OPEN_PLAYER_IN_BROWSER, ToastReactions::openInPlayer}, - {OPEN_IN_STREAMLINK, ToastReactions::openInStreamlink}, - {DONT_OPEN, ToastReactions::dontOpen}}; + {OPEN_IN_BROWSER, ToastReactions::OpenInBrowser}, + {OPEN_PLAYER_IN_BROWSER, ToastReactions::OpenInPlayer}, + {OPEN_IN_STREAMLINK, ToastReactions::OpenInStreamlink}, + {DONT_OPEN, ToastReactions::DontOpen}}; bool Toasts::isEnabled() { @@ -61,6 +61,13 @@ QString Toasts::findStringFromReaction(const ToastReactions &reaction) } } +QString Toasts::findStringFromReaction( + const pajlada::Settings::Setting &value) +{ + int i = static_cast(value); + return Toasts::findStringFromReaction(static_cast(i)); +} + ToastReactions Toasts::findReactionFromString(const QString &string) { auto iterator = Toasts::stringToReaction.find(string); @@ -70,7 +77,7 @@ ToastReactions Toasts::findReactionFromString(const QString &string) } else { - return ToastReactions::dontOpen; + return ToastReactions::DontOpen; } } void Toasts::sendChannelNotification(const QString &channelName, Platform p) @@ -125,23 +132,24 @@ public: void toastActivated() const { QString link; - switch (Toasts::findReactionFromString(getSettings()->openFromToast)) + switch (static_cast( + getSettings()->openFromToast.getValue())) { - case ToastReactions::openInBrowser: + case ToastReactions::OpenInBrowser: if (platform_ == Platform::Twitch) { link = "http://www.twitch.tv/" + channelName_; } QDesktopServices::openUrl(QUrl(link)); break; - case ToastReactions::openInPlayer: + case ToastReactions::OpenInPlayer: if (platform_ == Platform::Twitch) { link = "https://player.twitch.tv/?channel=" + channelName_; } QDesktopServices::openUrl(QUrl(link)); break; - case ToastReactions::openInStreamlink: + case ToastReactions::OpenInStreamlink: { openStreamlinkForChannel(channelName_); break; @@ -173,10 +181,11 @@ void Toasts::sendWindowsNotification(const QString &channelName, Platform p) std::wstring widestr = std::wstring(utf8_text.begin(), utf8_text.end()); templ.setTextField(widestr, WinToastLib::WinToastTemplate::FirstLine); - if (Toasts::findReactionFromString(getSettings()->openFromToast) != - ToastReactions::dontOpen) + if (static_cast(getSettings()->openFromToast.getValue()) != + ToastReactions::DontOpen) { - QString mode = getSettings()->openFromToast; + QString mode = + Toasts::findStringFromReaction(getSettings()->openFromToast); mode = mode.toLower(); templ.setTextField(L"Click here to " + mode.toStdWString(), diff --git a/src/singletons/Toasts.hpp b/src/singletons/Toasts.hpp index a7ea91861..a8a51e56b 100644 --- a/src/singletons/Toasts.hpp +++ b/src/singletons/Toasts.hpp @@ -8,10 +8,10 @@ namespace chatterino { enum class Platform : uint8_t; enum class ToastReactions { - openInBrowser, - openInPlayer, - openInStreamlink, - dontOpen + OpenInBrowser = 0, + OpenInPlayer = 1, + OpenInStreamlink = 2, + DontOpen = 3 }; class Toasts final : public Singleton @@ -19,6 +19,8 @@ class Toasts final : public Singleton public: void sendChannelNotification(const QString &channelName, Platform p); static QString findStringFromReaction(const ToastReactions &reaction); + static QString findStringFromReaction( + const pajlada::Settings::Setting &reaction); static ToastReactions findReactionFromString(const QString &string); static std::map reactionToString; static std::map stringToReaction; diff --git a/src/widgets/settingspages/NotificationPage.cpp b/src/widgets/settingspages/NotificationPage.cpp index 85aab7bb0..dfbc5574e 100644 --- a/src/widgets/settingspages/NotificationPage.cpp +++ b/src/widgets/settingspages/NotificationPage.cpp @@ -24,7 +24,6 @@ NotificationPage::NotificationPage() : SettingsPage("Notifications", ":/settings/notification2.svg") { LayoutCreator layoutCreator(this); - auto layout = layoutCreator.emplace().withoutMargin(); { auto tabs = layout.emplace(); @@ -46,17 +45,12 @@ NotificationPage::NotificationPage() ->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Preferred); + // implementation of custom combobox done + // because addComboBox only can handle strings-settings + // int setting for the ToastReaction is desired openIn - .append(this->createComboBox( - {Toasts::findStringFromReaction( - ToastReactions::openInBrowser), - Toasts::findStringFromReaction( - ToastReactions::openInPlayer), - Toasts::findStringFromReaction( - ToastReactions::openInStreamlink), - Toasts::findStringFromReaction( - ToastReactions::dontOpen)}, - getSettings()->openFromToast)) + .append(this->createToastReactionComboBox( + this->managedConnections_)) ->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Preferred); } @@ -140,4 +134,31 @@ NotificationPage::NotificationPage() } } } +QComboBox *NotificationPage::createToastReactionComboBox( + std::vector managedConnections) +{ + QComboBox *toastReactionOptions = new QComboBox(); + + for (int i = 0; i <= static_cast(ToastReactions::DontOpen); i++) + { + toastReactionOptions->insertItem( + i, Toasts::findStringFromReaction(static_cast(i))); + } + + // update when setting changes + pajlada::Settings::Setting setting = getSettings()->openFromToast; + setting.connect( + [toastReactionOptions](const int &index, auto) { + toastReactionOptions->setCurrentIndex(index); + }, + managedConnections); + + QObject::connect(toastReactionOptions, &QComboBox::currentTextChanged, + [setting](const QString &newValue) { + getSettings()->openFromToast.setValue(static_cast( + Toasts::findReactionFromString(newValue))); + }); + + return toastReactionOptions; +} } // namespace chatterino diff --git a/src/widgets/settingspages/NotificationPage.hpp b/src/widgets/settingspages/NotificationPage.hpp index d0e8c12a2..e70f58ad4 100644 --- a/src/widgets/settingspages/NotificationPage.hpp +++ b/src/widgets/settingspages/NotificationPage.hpp @@ -15,6 +15,8 @@ public: NotificationPage(); private: + QComboBox *createToastReactionComboBox( + std::vector managedConnections); }; } // namespace chatterino