mirror of
https://github.com/Chatterino/chatterino2.git
synced 2024-11-13 19:49:51 +01:00
Changed Streamer Mode settings (#2001)
There's now a new (yet another, sigh) section in Settings -> General, which lets you set streamer mode to 'enable/disable/detect obs' and there are also separate settings for each of the things that streamer mode covers. I just have to add ping sounds and PR is ready to be merged :) * Show "Streamer Mode" image as link thumbnails if applicable * Moved hideViewerCountAndDuration to streamerMode settings Set it to false by default (just how it used to be under /misc settings, also reworked live tooltip to be a bit prettier and say "<Streamer Mode>" in gray instead of "Live with <hidden> for <hidden> viewers"
This commit is contained in:
parent
56828f2d81
commit
2232c6d925
|
@ -2,7 +2,8 @@
|
||||||
|
|
||||||
## Unversioned
|
## Unversioned
|
||||||
|
|
||||||
- Minor: Made the current channels emotes appear at the top of the emote picker popup.
|
- Major: Added Streamer Mode configuration (under `Settings -> General`), where you can select which features of Chatterino should behave differently when you are in Streamer Mode. (#2001)
|
||||||
|
- Minor: Made the current channels emotes appear at the top of the emote picker popup. (#2057)
|
||||||
- Minor: Added viewer list button to twitch channel header. (#1978)
|
- Minor: Added viewer list button to twitch channel header. (#1978)
|
||||||
- Minor: Added followage and subage information to usercard. (#2023)
|
- Minor: Added followage and subage information to usercard. (#2023)
|
||||||
- Minor: Added an option to only open channels specified in command line with `-c` parameter. You can also use `--help` to display short help message (#1940)
|
- Minor: Added an option to only open channels specified in command line with `-c` parameter. You can also use `--help` to display short help message (#1940)
|
||||||
|
|
|
@ -7,6 +7,7 @@
|
||||||
#include "providers/twitch/TwitchCommon.hpp"
|
#include "providers/twitch/TwitchCommon.hpp"
|
||||||
#include "singletons/Settings.hpp"
|
#include "singletons/Settings.hpp"
|
||||||
#include "singletons/WindowManager.hpp"
|
#include "singletons/WindowManager.hpp"
|
||||||
|
#include "util/StreamerMode.hpp"
|
||||||
|
|
||||||
namespace chatterino {
|
namespace chatterino {
|
||||||
|
|
||||||
|
@ -365,6 +366,12 @@ void SharedMessageBuilder::triggerHighlights()
|
||||||
{
|
{
|
||||||
static QUrl currentPlayerUrl;
|
static QUrl currentPlayerUrl;
|
||||||
|
|
||||||
|
if (isInStreamerMode() && getSettings()->streamerModeMuteMentions)
|
||||||
|
{
|
||||||
|
// We are in streamer mode with muting mention sounds enabled. Do nothing.
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (getCSettings().isMutedChannel(this->channel->getName()))
|
if (getCSettings().isMutedChannel(this->channel->getName()))
|
||||||
{
|
{
|
||||||
// Do nothing. Pings are muted in this channel.
|
// Do nothing. Pings are muted in this channel.
|
||||||
|
|
|
@ -32,12 +32,11 @@ void LinkResolver::getLinkInfo(
|
||||||
auto statusCode = root.value("status").toInt();
|
auto statusCode = root.value("status").toInt();
|
||||||
QString response = QString();
|
QString response = QString();
|
||||||
QString linkString = url;
|
QString linkString = url;
|
||||||
ImagePtr thumbnail = nullptr;
|
ImagePtr thumbnail =
|
||||||
|
Image::fromUrl({root.value("thumbnail").toString()});
|
||||||
if (statusCode == 200)
|
if (statusCode == 200)
|
||||||
{
|
{
|
||||||
response = root.value("tooltip").toString();
|
response = root.value("tooltip").toString();
|
||||||
thumbnail =
|
|
||||||
Image::fromUrl({root.value("thumbnail").toString()});
|
|
||||||
if (getSettings()->unshortLinks)
|
if (getSettings()->unshortLinks)
|
||||||
{
|
{
|
||||||
linkString = root.value("link").toString();
|
linkString = root.value("link").toString();
|
||||||
|
|
|
@ -9,6 +9,7 @@
|
||||||
#include "controllers/highlights/HighlightPhrase.hpp"
|
#include "controllers/highlights/HighlightPhrase.hpp"
|
||||||
#include "controllers/moderationactions/ModerationAction.hpp"
|
#include "controllers/moderationactions/ModerationAction.hpp"
|
||||||
#include "singletons/Toasts.hpp"
|
#include "singletons/Toasts.hpp"
|
||||||
|
#include "util/StreamerMode.hpp"
|
||||||
#include "widgets/Notebook.hpp"
|
#include "widgets/Notebook.hpp"
|
||||||
|
|
||||||
using TimeoutButton = std::pair<QString, int>;
|
using TimeoutButton = std::pair<QString, int>;
|
||||||
|
@ -177,7 +178,18 @@ public:
|
||||||
BoolSetting unshortLinks = {"/links/unshortLinks", false};
|
BoolSetting unshortLinks = {"/links/unshortLinks", false};
|
||||||
BoolSetting lowercaseDomains = {"/links/linkLowercase", true};
|
BoolSetting lowercaseDomains = {"/links/linkLowercase", true};
|
||||||
|
|
||||||
/// Ignored phrases
|
/// Streamer Mode
|
||||||
|
EnumSetting<StreamerModeSetting> enableStreamerMode = {
|
||||||
|
"/streamerMode/enabled", StreamerModeSetting::DetectObs};
|
||||||
|
BoolSetting streamerModeHideUsercardAvatars = {
|
||||||
|
"/streamerMode/hideUsercardAvatars", true};
|
||||||
|
BoolSetting streamerModeHideLinkThumbnails = {
|
||||||
|
"/streamerMode/hideLinkThumbnails", true};
|
||||||
|
BoolSetting streamerModeHideViewerCountAndDuration = {
|
||||||
|
"/streamerMode/hideViewerCountAndDuration", false};
|
||||||
|
BoolSetting streamerModeMuteMentions = {"/streamerMode/muteMentions", true};
|
||||||
|
|
||||||
|
/// Ignored Phrases
|
||||||
QStringSetting ignoredPhraseReplace = {"/ignore/ignoredPhraseReplace",
|
QStringSetting ignoredPhraseReplace = {"/ignore/ignoredPhraseReplace",
|
||||||
"***"};
|
"***"};
|
||||||
|
|
||||||
|
@ -314,8 +326,6 @@ public:
|
||||||
BoolSetting restartOnCrash = {"/misc/restartOnCrash", false};
|
BoolSetting restartOnCrash = {"/misc/restartOnCrash", false};
|
||||||
BoolSetting attachExtensionToAnyProcess = {
|
BoolSetting attachExtensionToAnyProcess = {
|
||||||
"/misc/attachExtensionToAnyProcess", false};
|
"/misc/attachExtensionToAnyProcess", false};
|
||||||
BoolSetting hideViewerCountAndDuration = {
|
|
||||||
"/misc/hideViewerCountAndDuration", false};
|
|
||||||
BoolSetting askOnImageUpload = {"/misc/askOnImageUpload", true};
|
BoolSetting askOnImageUpload = {"/misc/askOnImageUpload", true};
|
||||||
|
|
||||||
/// Debug
|
/// Debug
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
#include "StreamerMode.hpp"
|
#include "StreamerMode.hpp"
|
||||||
|
|
||||||
|
#include "singletons/Settings.hpp"
|
||||||
|
|
||||||
#ifdef USEWINSDK
|
#ifdef USEWINSDK
|
||||||
# include <Windows.h>
|
# include <Windows.h>
|
||||||
|
|
||||||
|
@ -24,9 +26,19 @@ const QStringList &broadcastingBinaries()
|
||||||
|
|
||||||
bool isInStreamerMode()
|
bool isInStreamerMode()
|
||||||
{
|
{
|
||||||
#ifdef USEWINSDK
|
switch (getSettings()->enableStreamerMode.getEnum())
|
||||||
if (IsWindowsVistaOrGreater())
|
|
||||||
{
|
{
|
||||||
|
case StreamerModeSetting::Enabled:
|
||||||
|
return true;
|
||||||
|
case StreamerModeSetting::Disabled:
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef USEWINSDK
|
||||||
|
if (!IsWindowsVistaOrGreater())
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
static bool cache = false;
|
static bool cache = false;
|
||||||
static QDateTime time = QDateTime();
|
static QDateTime time = QDateTime();
|
||||||
|
|
||||||
|
@ -59,12 +71,12 @@ bool isInStreamerMode()
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pWPIs)
|
if (pWPIs)
|
||||||
|
{
|
||||||
WTSFreeMemory(pWPIs);
|
WTSFreeMemory(pWPIs);
|
||||||
|
}
|
||||||
|
|
||||||
cache = false;
|
cache = false;
|
||||||
}
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -2,6 +2,8 @@
|
||||||
|
|
||||||
namespace chatterino {
|
namespace chatterino {
|
||||||
|
|
||||||
|
enum StreamerModeSetting { Disabled = 0, Enabled = 1, DetectObs = 2 };
|
||||||
|
|
||||||
const QStringList &broadcastingBinaries();
|
const QStringList &broadcastingBinaries();
|
||||||
bool isInStreamerMode();
|
bool isInStreamerMode();
|
||||||
|
|
||||||
|
|
|
@ -586,7 +586,8 @@ void UserInfoPopup::updateUserData()
|
||||||
[] {
|
[] {
|
||||||
// failure
|
// failure
|
||||||
});
|
});
|
||||||
if (isInStreamerMode())
|
if (isInStreamerMode() &&
|
||||||
|
getSettings()->streamerModeHideUsercardAvatars)
|
||||||
{
|
{
|
||||||
this->ui_.avatarButton->setPixmap(getResources().streamerMode);
|
this->ui_.avatarButton->setPixmap(getResources().streamerMode);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1314,13 +1314,21 @@ void ChannelView::mouseMoveEvent(QMouseEvent *event)
|
||||||
{
|
{
|
||||||
auto element = &hoverLayoutElement->getCreator();
|
auto element = &hoverLayoutElement->getCreator();
|
||||||
auto thumbnailSize = getSettings()->thumbnailSize;
|
auto thumbnailSize = getSettings()->thumbnailSize;
|
||||||
if (thumbnailSize == 0 || isInStreamerMode())
|
if (!thumbnailSize)
|
||||||
{
|
{
|
||||||
tooltipPreviewImage.setImage(nullptr);
|
tooltipPreviewImage.setImage(nullptr);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
tooltipPreviewImage.setImage(element->getThumbnail());
|
const auto isHideLink =
|
||||||
|
isInStreamerMode() &&
|
||||||
|
getSettings()->streamerModeHideLinkThumbnails &&
|
||||||
|
(!element->getThumbnail()->url().string.isEmpty());
|
||||||
|
auto thumb =
|
||||||
|
isHideLink ? Image::fromPixmap(getResources().streamerMode)
|
||||||
|
: element->getThumbnail();
|
||||||
|
tooltipPreviewImage.setImage(std::move(thumb));
|
||||||
|
|
||||||
if (element->getThumbnailType() ==
|
if (element->getThumbnailType() ==
|
||||||
MessageElement::ThumbnailType::Link_Thumbnail)
|
MessageElement::ThumbnailType::Link_Thumbnail)
|
||||||
{
|
{
|
||||||
|
|
|
@ -13,6 +13,7 @@
|
||||||
#include "util/FuzzyConvert.hpp"
|
#include "util/FuzzyConvert.hpp"
|
||||||
#include "util/Helpers.hpp"
|
#include "util/Helpers.hpp"
|
||||||
#include "util/IncognitoBrowser.hpp"
|
#include "util/IncognitoBrowser.hpp"
|
||||||
|
#include "util/StreamerMode.hpp"
|
||||||
#include "widgets/BaseWindow.hpp"
|
#include "widgets/BaseWindow.hpp"
|
||||||
#include "widgets/dialogs/ColorPickerDialog.hpp"
|
#include "widgets/dialogs/ColorPickerDialog.hpp"
|
||||||
#include "widgets/helper/ColorButton.hpp"
|
#include "widgets/helper/ColorButton.hpp"
|
||||||
|
@ -529,6 +530,31 @@ void GeneralPage::initLayout(SettingsLayout &layout)
|
||||||
return fuzzyToInt(args.value, 0);
|
return fuzzyToInt(args.value, 0);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
layout.addTitle("Streamer Mode");
|
||||||
|
layout.addDescription(
|
||||||
|
"Chatterino can automatically change behavior if it "
|
||||||
|
"detects that \"OBS Studio\" is running.\nSelect which "
|
||||||
|
"things you want to change while streaming");
|
||||||
|
|
||||||
|
ComboBox *dankDropdown =
|
||||||
|
layout.addDropdown<std::underlying_type<StreamerModeSetting>::type>(
|
||||||
|
"Enable Streamer Mode", {"No", "Yes", "Detect OBS (Windows only)"},
|
||||||
|
s.enableStreamerMode, [](int value) { return value; },
|
||||||
|
[](DropdownArgs args) {
|
||||||
|
return static_cast<StreamerModeSetting>(args.index);
|
||||||
|
},
|
||||||
|
false);
|
||||||
|
dankDropdown->setMinimumWidth(dankDropdown->minimumSizeHint().width() + 10);
|
||||||
|
|
||||||
|
layout.addCheckbox("Hide usercard avatars",
|
||||||
|
s.streamerModeHideUsercardAvatars);
|
||||||
|
layout.addCheckbox("Hide link thumbnails",
|
||||||
|
s.streamerModeHideLinkThumbnails);
|
||||||
|
layout.addCheckbox(
|
||||||
|
"Hide viewer count and stream length while hovering over split header",
|
||||||
|
s.streamerModeHideViewerCountAndDuration);
|
||||||
|
layout.addCheckbox("Mute mention sounds", s.streamerModeMuteMentions);
|
||||||
|
|
||||||
layout.addTitle("Emotes");
|
layout.addTitle("Emotes");
|
||||||
layout.addCheckbox("Enable", s.enableEmoteImages);
|
layout.addCheckbox("Enable", s.enableEmoteImages);
|
||||||
layout.addCheckbox("Animate", s.animateEmotes);
|
layout.addCheckbox("Animate", s.animateEmotes);
|
||||||
|
@ -732,9 +758,6 @@ void GeneralPage::initLayout(SettingsLayout &layout)
|
||||||
s.enableExperimentalIrc);
|
s.enableExperimentalIrc);
|
||||||
layout.addCheckbox("Show unhandled IRC messages",
|
layout.addCheckbox("Show unhandled IRC messages",
|
||||||
s.showUnhandledIrcMessages);
|
s.showUnhandledIrcMessages);
|
||||||
layout.addCheckbox(
|
|
||||||
"Hide viewercount and stream length while hovering the split",
|
|
||||||
s.hideViewerCountAndDuration);
|
|
||||||
layout.addDropdown<int>(
|
layout.addDropdown<int>(
|
||||||
"Stack timeouts", {"Stack", "Stack until timeout", "Don't stack"},
|
"Stack timeouts", {"Stack", "Stack until timeout", "Don't stack"},
|
||||||
s.timeoutStackStyle, [](int index) { return index; },
|
s.timeoutStackStyle, [](int index) { return index; },
|
||||||
|
|
|
@ -12,6 +12,7 @@
|
||||||
#include "singletons/WindowManager.hpp"
|
#include "singletons/WindowManager.hpp"
|
||||||
#include "util/LayoutCreator.hpp"
|
#include "util/LayoutCreator.hpp"
|
||||||
#include "util/LayoutHelper.hpp"
|
#include "util/LayoutHelper.hpp"
|
||||||
|
#include "util/StreamerMode.hpp"
|
||||||
#include "widgets/Label.hpp"
|
#include "widgets/Label.hpp"
|
||||||
#include "widgets/TooltipWidget.hpp"
|
#include "widgets/TooltipWidget.hpp"
|
||||||
#include "widgets/dialogs/SettingsDialog.hpp"
|
#include "widgets/dialogs/SettingsDialog.hpp"
|
||||||
|
@ -86,30 +87,64 @@ namespace {
|
||||||
}
|
}
|
||||||
auto formatTooltip(const TwitchChannel::StreamStatus &s, QString thumbnail)
|
auto formatTooltip(const TwitchChannel::StreamStatus &s, QString thumbnail)
|
||||||
{
|
{
|
||||||
return QString("<style>.center { text-align: center; }</style> \
|
auto title = [&s]() -> QString {
|
||||||
<p class=\"center\">%1%2%3%4%5%6 for %7 with %8 viewers</p>")
|
if (s.title.isEmpty())
|
||||||
.arg(s.title.toHtmlEscaped())
|
{
|
||||||
.arg(s.title.isEmpty() ? QString() : "<br><br>")
|
return QStringLiteral("");
|
||||||
.arg(getSettings()->thumbnailSizeStream.getValue() > 0
|
}
|
||||||
? ((thumbnail.isEmpty()
|
|
||||||
? "Couldn't fetch thumbnail"
|
return s.title.toHtmlEscaped() + "<br><br>";
|
||||||
: "<img src=\"data:image/jpg;base64, " +
|
}();
|
||||||
thumbnail + "\"/>") +
|
|
||||||
"<br>")
|
auto tooltip = [&thumbnail]() -> QString {
|
||||||
: QString())
|
if (getSettings()->thumbnailSizeStream.getValue() == 0)
|
||||||
.arg(s.game.toHtmlEscaped())
|
{
|
||||||
.arg(s.game.isEmpty() ? QString() : "<br>")
|
return QStringLiteral("");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (thumbnail.isEmpty())
|
||||||
|
{
|
||||||
|
return QStringLiteral("Couldn't fetch thumbnail<br>");
|
||||||
|
}
|
||||||
|
|
||||||
|
return "<img src=\"data:image/jpg;base64, " + thumbnail + "\"><br>";
|
||||||
|
}();
|
||||||
|
|
||||||
|
auto game = [&s]() -> QString {
|
||||||
|
if (s.game.isEmpty())
|
||||||
|
{
|
||||||
|
return QStringLiteral("");
|
||||||
|
}
|
||||||
|
|
||||||
|
return s.game.toHtmlEscaped() + "<br>";
|
||||||
|
}();
|
||||||
|
|
||||||
|
auto extraStreamData = [&s]() -> QString {
|
||||||
|
if (isInStreamerMode() &&
|
||||||
|
getSettings()->streamerModeHideViewerCountAndDuration)
|
||||||
|
{
|
||||||
|
return QStringLiteral(
|
||||||
|
"<span style=\"color: #808892;\"><Streamer "
|
||||||
|
"Mode></span>");
|
||||||
|
}
|
||||||
|
|
||||||
|
return QString("%1 for %2 with %3 viewers")
|
||||||
.arg(s.rerun ? "Vod-casting" : "Live")
|
.arg(s.rerun ? "Vod-casting" : "Live")
|
||||||
.arg(getSettings()->hideViewerCountAndDuration ? "<Hidden>"
|
.arg(s.uptime)
|
||||||
: s.uptime)
|
.arg(QString::number(s.viewerCount));
|
||||||
.arg(getSettings()->hideViewerCountAndDuration
|
}();
|
||||||
? "<Hidden>"
|
|
||||||
: QString::number(s.viewerCount));
|
return QString("<p style=\"text-align: center;\">" + //
|
||||||
|
title + //
|
||||||
|
tooltip + //
|
||||||
|
game + //
|
||||||
|
extraStreamData + //
|
||||||
|
"</p>" //
|
||||||
|
);
|
||||||
}
|
}
|
||||||
auto formatOfflineTooltip(const TwitchChannel::StreamStatus &s)
|
auto formatOfflineTooltip(const TwitchChannel::StreamStatus &s)
|
||||||
{
|
{
|
||||||
return QString("<style>.center { text-align: center; }</style> \
|
return QString("<p style=\"text-align: center;\">Offline<br>%1</p>")
|
||||||
<p class=\"center\">Offline<br>%1</p>")
|
|
||||||
.arg(s.title.toHtmlEscaped());
|
.arg(s.title.toHtmlEscaped());
|
||||||
}
|
}
|
||||||
auto formatTitle(const TwitchChannel::StreamStatus &s, Settings &settings)
|
auto formatTitle(const TwitchChannel::StreamStatus &s, Settings &settings)
|
||||||
|
|
Loading…
Reference in a new issue