new settings page

This commit is contained in:
fourtf 2018-10-31 19:45:51 +01:00
parent a0b6e4bb76
commit 3c3be99177
23 changed files with 651 additions and 101 deletions

View file

@ -264,7 +264,9 @@ SOURCES += \
src/widgets/settingspages/AdvancedPage.cpp \
src/util/IncognitoBrowser.cpp \
src/widgets/splits/ClosedSplits.cpp \
src/providers/ffz/FfzModBadge.cpp
src/providers/ffz/FfzModBadge.cpp \
src/widgets/settingspages/GeneralPage.cpp \
src/util/FuzzyConvert.cpp
HEADERS += \
src/Application.hpp \
@ -468,7 +470,9 @@ HEADERS += \
src/widgets/settingspages/AdvancedPage.hpp \
src/util/IncognitoBrowser.hpp \
src/widgets/splits/ClosedSplits.hpp \
src/providers/ffz/FfzModBadge.hpp
src/providers/ffz/FfzModBadge.hpp \
src/widgets/settingspages/GeneralPage.hpp \
src/util/FuzzyConvert.hpp
RESOURCES += \
resources/resources.qrc \

View file

@ -6,3 +6,23 @@ QCheckBox::indicator {
width: <checkbox-size>px;
height: <checkbox-size>px;
}
QComboBox {
width: 100px;
}
chatterino--TitleLabel {
font-family: "Segoe UI light";
font-size: 24px;
color: #4FC3F7;
}
chatterino--TitleLabel2 {
font-family: "Segoe UI light";
font-size: 24px;
color: #bbb;
}
chatterino--DescriptionLabel {
color: #999;
}

View file

@ -237,7 +237,7 @@ void MessageLayout::updateBuffer(QPixmap *buffer, int /*messageIndex*/,
{
backgroundColor = app->themes->messages.backgrounds.subscription;
}
else if (getSettings()->alternateMessageBackground.getValue() &&
else if (getSettings()->alternateMessages.getValue() &&
this->flags.has(MessageLayoutFlag::AlternateBackground))
{
backgroundColor = app->themes->messages.backgrounds.alternate;

View file

@ -28,7 +28,7 @@ void LinkResolver::getLinkInfo(
if (statusCode == 200)
{
response = root.value("tooltip").toString();
if (getSettings()->enableUnshortLinks)
if (getSettings()->unshortLinks)
{
linkString = root.value("link").toString();
}

View file

@ -48,6 +48,7 @@ void FfzModBadge::loadCustomModBadge()
Url{url}};
this->badge_ = std::make_shared<Emote>(emote);
// getBadge.execute();
return Success;
});

View file

@ -474,12 +474,9 @@ void TwitchChannel::refreshLiveStatus()
QString url("https://api.twitch.tv/kraken/streams/" + roomID);
//<<<<<<< HEAD
// auto request = makeGetStreamRequest(roomID, QThread::currentThread());
//=======
auto request = NetworkRequest::twitchRequest(url);
request.setCaller(QThread::currentThread());
//>>>>>>> 9bfbdefd2f0972a738230d5b95a009f73b1dd933
request.onSuccess(
[this, weak = weakOf<Channel>(this)](auto result) -> Outcome {

View file

@ -25,7 +25,7 @@ public:
/// Appearance
BoolSetting showTimestamps = {"/appearance/messages/showTimestamps", true};
BoolSetting enableAnimationsWhenFocused = {
BoolSetting animationsWhenFocused = {
"/appearance/enableAnimationsWhenFocused", false};
QStringSetting timestampFormat = {"/appearance/messages/timestampFormat",
"h:mm"};
@ -48,26 +48,27 @@ public:
// {"/appearance/messages/collapseLongMessages", false};
IntSetting collpseMessagesMinLines = {
"/appearance/messages/collapseMessagesMinLines", 0};
BoolSetting alternateMessageBackground = {
BoolSetting alternateMessages = {
"/appearance/messages/alternateMessageBackground", false};
IntSetting uiScale = {"/appearance/uiScale", 0};
IntSetting boldScale = {"/appearance/boldScale", 57};
BoolSetting windowTopMost = {"/appearance/windowAlwaysOnTop", false};
BoolSetting showTabCloseButton = {"/appearance/showTabCloseButton", true};
BoolSetting showTabLive = {"/appearance/showTabLiveButton", false};
BoolSetting hidePreferencesButton = {"/appearance/hidePreferencesButton",
false};
BoolSetting hideUserButton = {"/appearance/hideUserButton", false};
BoolSetting enableSmoothScrolling = {"/appearance/smoothScrolling", true};
BoolSetting enableSmoothScrollingNewMessages = {
"/appearance/smoothScrollingNewMessages", false};
BoolSetting enableUsernameBold = {"/appearance/messages/boldUsernames",
false};
BoolSetting boldUsernames = {"/appearance/messages/boldUsernames", false};
// BoolSetting customizable splitheader
BoolSetting showViewerCount = {"/appearance/splitheader/showViewerCount",
BoolSetting headerViewerCount = {"/appearance/splitheader/showViewerCount",
false};
BoolSetting showTitle = {"/appearance/splitheader/showTitle", false};
BoolSetting showGame = {"/appearance/splitheader/showGame", false};
BoolSetting showUptime = {"/appearance/splitheader/showUptime", false};
BoolSetting headerStreamTitle = {"/appearance/splitheader/showTitle",
false};
BoolSetting headerGame = {"/appearance/splitheader/showGame", false};
BoolSetting headerUptime = {"/appearance/splitheader/showUptime", false};
FloatSetting customThemeMultiplier = {"/appearance/customThemeMultiplier",
-0.5f};
// BoolSetting useCustomWindowFrame = {"/appearance/useCustomWindowFrame",
@ -100,7 +101,7 @@ public:
IntSetting smallStreamerLimit = {
"/behaviour/autocompletion/smallStreamerLimit", 1000};
BoolSetting pauseChatHover = {"/behaviour/pauseChatHover", false};
BoolSetting pauseChatOnHover = {"/behaviour/pauseChatHover", false};
/// Commands
BoolSetting allowCommandsAtEnd = {"/commands/allowCommandsAtEnd", false};
@ -112,16 +113,16 @@ public:
BoolSetting enableBttvEmotes = {"/emotes/enableBTTVEmotes", true};
BoolSetting enableFfzEmotes = {"/emotes/enableFFZEmotes", true};
BoolSetting enableEmojis = {"/emotes/enableEmojis", true};
BoolSetting enableGifAnimations = {"/emotes/enableGifAnimations", true};
BoolSetting animateEmotes = {"/emotes/enableGifAnimations", true};
FloatSetting emoteScale = {"/emotes/scale", 1.f};
QStringSetting emojiSet = {"/emotes/emojiSet", "EmojiOne 2"};
/// Links
BoolSetting linksDoubleClickOnly = {"/links/doubleClickToOpen", false};
BoolSetting enableLinkInfoTooltip = {"/links/linkInfoTooltip", false};
BoolSetting enableUnshortLinks = {"/links/unshortLinks", false};
BoolSetting enableLowercaseLink = {"/links/linkLowercase", true};
BoolSetting linkInfoTooltip = {"/links/linkInfoTooltip", false};
BoolSetting unshortLinks = {"/links/unshortLinks", false};
BoolSetting lowercaseDomains = {"/links/linkLowercase", true};
/// Ignored phrases
QStringSetting ignoredPhraseReplace = {"/ignore/ignoredPhraseReplace",

View file

@ -28,7 +28,8 @@ namespace detail {
{
return -0.8;
}
else if (themeName == "Custom") {
else if (themeName == "Custom")
{
return getSettings()->customThemeMultiplier.getValue();
}
@ -214,7 +215,7 @@ void Theme::actuallyUpdate(double hue, double multiplier)
this->messages.textColors.system = QColor(140, 127, 127);
this->messages.backgrounds.regular = splits.background;
this->messages.backgrounds.alternate = getColor(0, sat, 0.93);
this->messages.backgrounds.alternate = getColor(0, sat, 0.95);
if (isLight_)
{

View file

@ -82,8 +82,8 @@ WindowManager::WindowManager()
this->wordFlagsListener_.addSetting(settings->enableEmojis);
this->wordFlagsListener_.addSetting(settings->enableFfzEmotes);
this->wordFlagsListener_.addSetting(settings->enableTwitchEmotes);
this->wordFlagsListener_.addSetting(settings->enableUsernameBold);
this->wordFlagsListener_.addSetting(settings->enableLowercaseLink);
this->wordFlagsListener_.addSetting(settings->boldUsernames);
this->wordFlagsListener_.addSetting(settings->lowercaseDomains);
this->wordFlagsListener_.cb = [this](auto) {
this->updateWordTypeMask(); //
};
@ -127,7 +127,7 @@ void WindowManager::updateWordTypeMask()
// bits
flags.set(MEF::BitsAmount);
flags.set(settings->enableGifAnimations ? MEF::BitsAnimated
flags.set(settings->animateEmotes ? MEF::BitsAnimated
: MEF::BitsStatic);
// badges
@ -147,9 +147,9 @@ void WindowManager::updateWordTypeMask()
// misc
flags.set(MEF::AlwaysShow);
flags.set(MEF::Collapsed);
flags.set(settings->enableUsernameBold ? MEF::BoldUsername
flags.set(settings->boldUsernames ? MEF::BoldUsername
: MEF::NonBoldUsername);
flags.set(settings->enableLowercaseLink ? MEF::LowercaseLink
flags.set(settings->lowercaseDomains ? MEF::LowercaseLink
: MEF::OriginalLink);
// update flags
@ -384,7 +384,7 @@ void WindowManager::initialize(Settings &settings, Paths &paths)
settings.timestampFormat.connect(
[this](auto, auto) { this->forceLayoutChannelViews(); });
settings.alternateMessageBackground.connect(
settings.alternateMessages.connect(
[this](auto, auto) { this->forceLayoutChannelViews(); });
settings.separateMessages.connect(
[this](auto, auto) { this->forceLayoutChannelViews(); });

View file

@ -10,7 +10,7 @@ void GIFTimer::initialize()
{
this->timer.setInterval(30);
getSettings()->enableGifAnimations.connect([this](bool enabled, auto) {
getSettings()->animateEmotes.connect([this](bool enabled, auto) {
if (enabled)
this->timer.start();
else
@ -18,7 +18,7 @@ void GIFTimer::initialize()
});
QObject::connect(&this->timer, &QTimer::timeout, [this] {
if (getSettings()->enableAnimationsWhenFocused &&
if (getSettings()->animationsWhenFocused &&
qApp->activeWindow() == nullptr)
return;

33
src/util/FuzzyConvert.cpp Normal file
View file

@ -0,0 +1,33 @@
#include "FuzzyConvert.hpp"
#include <QRegularExpression>
namespace chatterino {
int fuzzyToInt(const QString &str, int default_)
{
static auto intFinder = QRegularExpression("[0-9]+");
auto match = intFinder.match(str);
if (match.hasMatch())
{
return match.captured().toInt();
}
return default_;
}
float fuzzyToFloat(const QString &str, float default_)
{
static auto floatFinder = QRegularExpression("[0-9]+(\\.[0-9]+)?");
auto match = floatFinder.match(str);
if (match.hasMatch())
{
return match.captured().toFloat();
}
return default_;
}
} // namespace chatterino

10
src/util/FuzzyConvert.hpp Normal file
View file

@ -0,0 +1,10 @@
#pragma once
#include <QString>
namespace chatterino {
int fuzzyToInt(const QString &str, int default_);
float fuzzyToFloat(const QString &str, float default_);
} // namespace chatterino

View file

@ -19,43 +19,28 @@ static QString CreateUUID()
static QString createLink(const QString &url, bool file = false)
{
if (file)
{
return QString("<a href=\"file:///" + url +
"\"><span style=\"color: white;\">" + url +
"</span></a>");
}
return QString("<a href=\"" + url + "\"><span style=\"color: white;\">" +
url + "</span></a>");
return QString("<a href=\"") + (file ? "file:///" : "") + url + "\">" +
url + "</a>";
}
static QString createNamedLink(const QString &url, const QString &name,
bool file = false)
{
if (file)
{
return QString("<a href=\"file:///" + url +
"\"><span style=\"color: white;\">" + name +
"</span></a>");
}
return QString("<a href=\"" + url + "\"><span style=\"color: white;\">" +
name + "</span></a>");
return QString("<a href=\"") + (file ? "file:///" : "") + url + "\">" +
name + "</a>";
}
static QString shortenString(const QString &str, unsigned maxWidth = 50)
{
if (str.size() <= maxWidth)
auto shortened = QString(str);
if (str.size() > int(maxWidth))
{
return str;
shortened.resize(int(maxWidth));
shortened += "...";
}
QString shortenedStr = str;
shortenedStr.resize(47);
shortenedStr += "...";
return shortenedStr;
return shortened;
}
} // namespace chatterino

View file

@ -93,6 +93,13 @@ public:
return *this;
}
LayoutCreator<T> withoutSpacing()
{
this->item_->setSpacing(0);
return *this;
}
template <typename Q = T,
typename std::enable_if<std::is_base_of<QWidget, Q>::value,
int>::type = 0>

View file

@ -11,6 +11,7 @@
#include "widgets/settingspages/EmotesPage.hpp"
#include "widgets/settingspages/ExternalToolsPage.hpp"
#include "widgets/settingspages/FeelPage.hpp"
#include "widgets/settingspages/GeneralPage.hpp"
#include "widgets/settingspages/HighlightingPage.hpp"
#include "widgets/settingspages/IgnoresPage.hpp"
#include "widgets/settingspages/KeyboardSettingsPage.hpp"
@ -36,6 +37,8 @@ SettingsDialog::SettingsDialog()
this->overrideBackgroundColor_ = QColor("#282828");
this->themeChangedEvent();
this->resize(766, 600);
}
void SettingsDialog::initUi()
@ -43,12 +46,18 @@ void SettingsDialog::initUi()
LayoutCreator<SettingsDialog> layoutCreator(this);
// tab pages
layoutCreator.emplace<QWidget>()
layoutCreator.setLayoutType<QHBoxLayout>()
.withoutSpacing()
.emplace<QWidget>()
.assign(&this->ui_.tabContainerContainer)
.emplace<QVBoxLayout>()
.withoutMargin()
.assign(&this->ui_.tabContainer);
this->ui_.tabContainerContainer->layout()->setContentsMargins(8, 8, 0, 8);
this->layout()->setSpacing(0);
// right side layout
auto right = layoutCreator.emplace<QVBoxLayout>().withoutMargin();
{
@ -65,6 +74,8 @@ void SettingsDialog::initUi()
}
}
this->ui_.pageStack->setMargin(0);
// ---- misc
this->ui_.tabContainerContainer->setObjectName("tabWidget");
this->ui_.pageStack->setObjectName("pages");
@ -82,14 +93,19 @@ SettingsDialog *SettingsDialog::getHandle()
void SettingsDialog::addTabs()
{
this->ui_.tabContainer->setMargin(0);
this->ui_.tabContainer->setSpacing(0);
this->addTab(new AccountsPage);
this->addTab(new GeneralPage);
this->ui_.tabContainer->addSpacing(16);
this->addTab(new LookPage);
this->addTab(new FeelPage);
this->addTab(new AccountsPage);
// this->ui_.tabContainer->addSpacing(16);
// this->addTab(new LookPage);
// this->addTab(new FeelPage);
this->ui_.tabContainer->addSpacing(16);
@ -105,7 +121,7 @@ void SettingsDialog::addTabs()
this->addTab(this->ui_.moderationPage = new ModerationPage);
this->addTab(new NotificationPage);
// this->addTab(new SpecialChannelsPage);
this->addTab(new BrowserExtensionPage);
// this->addTab(new BrowserExtensionPage);
this->addTab(new ExternalToolsPage);
this->addTab(new AdvancedPage);
@ -139,7 +155,8 @@ void SettingsDialog::selectTab(SettingsDialogTab *tab)
}
tab->setSelected(true);
tab->setStyleSheet("background: #555; color: #FFF");
tab->setStyleSheet(
"background: #161616; color: #4FC3F7; border: 1px solid #111");
this->selectedTab_ = tab;
}
@ -201,7 +218,7 @@ void SettingsDialog::scaleChangedEvent(float newDpi)
this->setStyleSheet(styleSheet);
this->ui_.tabContainerContainer->setFixedWidth(int(200 * newDpi));
this->ui_.tabContainerContainer->setFixedWidth(int(150 * newDpi));
}
void SettingsDialog::themeChangedEvent()

View file

@ -927,7 +927,7 @@ void ChannelView::mouseMoveEvent(QMouseEvent *event)
return;
}
if (getSettings()->pauseChatHover.getValue())
if (getSettings()->pauseChatOnHover.getValue())
{
this->pause(CHAT_HOVER_PAUSE_DURATION);
}
@ -1117,7 +1117,7 @@ void ChannelView::mouseMoveEvent(QMouseEvent *event)
{
tooltipWidget->hide();
}
else if (isLinkValid && !getSettings()->enableLinkInfoTooltip)
else if (isLinkValid && !getSettings()->linkInfoTooltip)
{
tooltipWidget->hide();
}

View file

@ -39,6 +39,8 @@ NotebookTab::NotebookTab(Notebook *notebook)
getSettings()->showTabCloseButton.connect(
boost::bind(&NotebookTab::hideTabXChanged, this, _1),
this->managedConnections_);
getSettings()->showTabLive.connect([this](auto, auto) { this->update(); },
this->managedConnections_);
this->setMouseTracking(true);
@ -311,7 +313,7 @@ void NotebookTab::paintEvent(QPaintEvent *)
: (windowFocused ? colors.line.regular : colors.line.unfocused));
// draw live indicator
if (this->isLive_)
if (this->isLive_ && getSettings()->showTabLive)
{
painter.setPen(QColor(Qt::GlobalColor::red));
painter.setRenderHint(QPainter::Antialiasing);
@ -355,6 +357,8 @@ void NotebookTab::paintEvent(QPaintEvent *)
// draw close x
if (this->shouldDrawXButton())
{
painter.setRenderHint(QPainter::Antialiasing, false);
QRect xRect = this->getXRect();
if (!xRect.isNull())
{

View file

@ -44,18 +44,17 @@ FeelPage::FeelPage()
form->addRow("Pause chat:",
this->createCheckBox(PAUSE_HOVERING,
getSettings()->pauseChatHover));
getSettings()->pauseChatOnHover));
form->addRow("Mouse scroll speed:", this->createMouseScrollSlider());
form->addRow("Links:",
this->createCheckBox("Open links only on double click",
getSettings()->linksDoubleClickOnly));
form->addRow(
"", this->createCheckBox("Show link info in tooltips",
getSettings()->enableLinkInfoTooltip));
form->addRow("", this->createCheckBox("Show link info in tooltips",
getSettings()->linkInfoTooltip));
form->addRow(
"", this->createCheckBox("Auto unshort links (requires restart)",
getSettings()->enableUnshortLinks));
getSettings()->unshortLinks));
}
layout->addSpacing(16);

View file

@ -0,0 +1,327 @@
#include "GeneralPage.hpp"
#include <QFontDialog>
#include <QLabel>
#include <QScrollArea>
#include "Application.hpp"
#include "singletons/Fonts.hpp"
#include "singletons/Theme.hpp"
#include "singletons/WindowManager.hpp"
#include "util/FuzzyConvert.hpp"
#include "util/Helpers.hpp"
#include "widgets/helper/Line.hpp"
#define CHROME_EXTENSION_LINK \
"https://chrome.google.com/webstore/detail/chatterino-native-host/" \
"glknmaideaikkmemifbfkhnomoknepka"
#define FIREFOX_EXTENSION_LINK \
"https://addons.mozilla.org/en-US/firefox/addon/chatterino-native-host/"
namespace chatterino {
TitleLabel *SettingsLayout::addTitle(const QString &title)
{
auto label = new TitleLabel(title + ":");
if (this->count() != 0)
this->addSpacing(16);
this->addWidget(label);
return label;
}
TitleLabel2 *SettingsLayout::addTitle2(const QString &title)
{
auto label = new TitleLabel2(title);
this->addSpacing(16);
this->addWidget(label);
return label;
}
QCheckBox *SettingsLayout::addCheckbox(const QString &text,
BoolSetting &setting)
{
auto check = new QCheckBox(text);
// update when setting changes
setting.connect(
[check](const bool &value, auto) { check->setChecked(value); },
this->managedConnections_);
// update setting on toggle
QObject::connect(check, &QCheckBox::toggled, this,
[&setting](bool state) { setting = state; });
this->addWidget(check);
return check;
}
QComboBox *SettingsLayout::addDropdown(const QString &text,
const QStringList &list)
{
auto layout = new QHBoxLayout;
auto combo = new QComboBox;
combo->addItems(list);
layout->addWidget(new QLabel(text + ":"));
layout->addStretch(1);
layout->addWidget(combo);
this->addLayout(layout);
return combo;
}
QComboBox *SettingsLayout::addDropdown(
const QString &text, const QStringList &items,
pajlada::Settings::Setting<QString> &setting)
{
auto combo = this->addDropdown(text, items);
// update when setting changes
setting.connect(
[combo](const QString &value, auto) { combo->setCurrentText(value); },
this->managedConnections_);
QObject::connect(combo, &QComboBox::currentTextChanged,
[&setting](const QString &newValue) {
setting = newValue;
getApp()->windows->forceLayoutChannelViews();
});
return combo;
}
DescriptionLabel *SettingsLayout::addDescription(const QString &text)
{
auto label = new DescriptionLabel(text);
label->setTextInteractionFlags(Qt::TextBrowserInteraction |
Qt::LinksAccessibleByKeyboard);
label->setOpenExternalLinks(true);
label->setWordWrap(true);
this->addWidget(label);
return label;
}
void SettingsLayout::addSeperator()
{
this->addWidget(new Line(false));
}
GeneralPage::GeneralPage()
: SettingsPage("General", ":/settings/about.svg")
{
auto y = new QVBoxLayout;
auto scroll = new QScrollArea;
scroll->setWidgetResizable(true);
y->addWidget(scroll);
auto x = new QHBoxLayout;
auto layout = new SettingsLayout;
x->addStretch(1);
x->addLayout(layout, 0);
x->addStretch(1);
auto z = new QFrame;
z->setLayout(x);
scroll->setWidget(z);
this->setLayout(y);
this->initLayout(*layout);
layout->addStretch(1);
this->initExtra();
}
void GeneralPage::initLayout(SettingsLayout &layout)
{
auto &s = *getSettings();
layout.addTitle("Appearance");
layout.addDropdown("Theme", {"White", "Light", "Dark", "Black"},
getApp()->themes->themeName);
layout.addDropdown<std::string>(
"Font", {"Segoe UI", "Arial", "Choose..."},
getApp()->fonts->chatFontFamily,
[](auto val) { return QString::fromStdString(val); },
[this](auto args) { return this->getFont(args); });
layout.addDropdown<int>(
"Font size", {"9pt", "10pt", "12pt", "14pt", "16pt", "20pt"},
getApp()->fonts->chatFontSize,
[](auto val) { return QString::number(val) + "pt"; },
[](auto args) { return fuzzyToInt(args.value, 10); });
layout.addDropdown<int>(
"UI Scale",
{"0.5x", "0.6x", "0.7x", "0.8x", "0.9x", "Default", "1.2x", "1.4x",
"1.6x", "1.8x", "2x", "2.33x", "2.66x", "3x", "3.5x", "4x"},
s.uiScale, [](auto val) { return val + 5; },
[](auto args) { return args.index - 5; }, false);
layout.addCheckbox("Always on top", s.windowTopMost);
layout.addTitle("Interface");
layout.addDropdown<float>(
"Mouse scroll speed", {"0.5x", "0.75x", "Default", "1.5x", "2x"},
s.mouseScrollMultiplier,
[](auto val) {
if (val == 1)
return QString("Default");
else
return QString::number(val) + "x";
},
[](auto args) { return fuzzyToFloat(args.value, 1.f); });
layout.addCheckbox("Smooth scrolling", s.enableSmoothScrolling);
layout.addCheckbox("Smooth scrolling on new messages.",
s.enableSmoothScrollingNewMessages);
layout.addCheckbox("Pause chat while hovering", s.pauseChatOnHover);
layout.addCheckbox("Show tab close button", s.showTabCloseButton);
layout.addCheckbox("Show input when empty", s.showEmptyInput);
layout.addCheckbox("Show input message length", s.showMessageLength);
layout.addTitle("Messages");
layout.addCheckbox("Timestamps", s.showTimestamps);
layout.addDropdown("Timestamp format",
{"hh:mm", "h:mm", "hh:mm a", "h:mm a"},
s.timestampFormat);
layout.addDropdown<int>(
"Collapse messages",
{"Never", "Longer than 2 lines", "Longer than 3 lines",
"Longer than 4 lines", "Longer than 5 lines"},
s.collpseMessagesMinLines,
[](auto val) {
return val ? QString("After ") + QString::number(val) + " lines"
: QString("Never");
},
[](auto args) { return fuzzyToInt(args.value, 0); });
layout.addCheckbox("Seperate with lines", s.separateMessages);
layout.addCheckbox("Alternate background color", s.alternateMessages);
// layout.addCheckbox("Mark last message you read");
// layout.addDropdown("Last read message style", {"Default"});
layout.addTitle("Emotes");
layout.addDropdown<float>(
"Emote size", {"0.5x", "0.75x", "Default", "1.25", "1.5x", "2x"},
s.emoteScale,
[](auto val) {
if (val == 1)
return QString("Default");
else
return QString::number(val) + "x";
},
[](auto args) { return fuzzyToFloat(args.value, 1.f); });
layout.addCheckbox("Gif animations", s.animateEmotes);
layout.addCheckbox("Animate only when focused", s.animationsWhenFocused);
layout.addDropdown("Emoji set",
{"EmojiOne 2", "EmojiOne 3", "Twitter", "Facebook",
"Apple", "Google", "Messenger"});
layout.addTitle("Badges");
layout.addCheckbox("Show authority badges (staff, admin, turbo, etc)",
getSettings()->showBadgesGlobalAuthority);
layout.addCheckbox("Show channel badges (broadcaster, moderator)",
getSettings()->showBadgesChannelAuthority);
layout.addCheckbox("Show subscriber badges ",
getSettings()->showBadgesSubscription);
layout.addCheckbox("Show vanity badges (prime, bits, subgifter)",
getSettings()->showBadgesVanity);
layout.addCheckbox("Show chatterino badges",
getSettings()->showBadgesChatterino);
layout.addTitle("Header");
layout.addCheckbox("Show stream uptime", s.headerUptime);
layout.addCheckbox("Show stream viewer count", s.headerViewerCount);
layout.addCheckbox("Show stream category", s.headerGame);
layout.addCheckbox("Show stream title", s.headerStreamTitle);
layout.addTitle("Miscellaneous");
layout.addCheckbox("Show joined users (< 1000 chatters)", s.showJoins);
layout.addCheckbox("Show parted users (< 1000 chatters)", s.showParts);
layout.addDropdown("Boldness", {"Not implemented"});
layout.addCheckbox("Lowercase domains", s.lowercaseDomains);
layout.addCheckbox("Bold @usernames", s.boldUsernames);
layout.addCheckbox("Show link info when hovering", s.linkInfoTooltip);
layout.addCheckbox("Double click links to open", s.linksDoubleClickOnly);
layout.addCheckbox("Unshorten links", s.unshortLinks);
layout.addCheckbox("Show live indicator in tabs", s.showTabLive);
layout.addSpacing(16);
layout.addSeperator();
/*
layout.addTitle2("Cache");
layout.addDescription("Chatterino saves files on disk to speed up loading "
"times and reduce network usage.");
this->cachePath = layout.addDescription("%cachePath%");
layout.addDropdown("Cache directory", {"Automatic"});
*/
layout.addTitle2("Browser Integration");
layout.addDescription("The browser extension replaces the default "
"Twitch.tv chat with chatterino.");
layout.addDescription(
createNamedLink(CHROME_EXTENSION_LINK, "Download for Google Chrome"));
layout.addDescription(
createNamedLink(FIREFOX_EXTENSION_LINK, "Download for Firefox"));
/*
layout.addTitle2("Streamlink");
layout.addDescription("Streamlinks allows you to watch streams with "
"desktop media players like VLC.");
layout.addDescription(
createNamedLink("https://streamlink.github.io/", "Website") + " " +
createNamedLink("https://github.com/streamlink/streamlink/"
"releases/latest",
"Download"));
layout.addDropdown("Executable path", {"Automatic"});
layout.addDropdown("Preferred quality", {"Choose", "Source", "High",
"Medium", "Low", "Audio only"});
layout.addDropdown("Command line arguments", {"..."});
*/
}
void GeneralPage::initExtra()
{
/// update cache path
if (this->cachePath)
{
getSettings()->cachePath.connect(
[cachePath = this->cachePath](const auto &, auto) mutable {
QString newPath = getPaths()->cacheDirectory();
QString pathShortened = "Current location: <a href=\"file:///" +
newPath + "\">" +
shortenString(newPath, 50) + "</a>";
cachePath->setText(pathShortened);
cachePath->setToolTip(newPath);
});
}
}
std::string GeneralPage::getFont(const DropdownArgs &args) const
{
if (args.combobox->currentIndex() == args.combobox->count() - 1)
{
args.combobox->setCurrentIndex(0);
args.combobox->setEditText("Choosing...");
QFontDialog dialog(getApp()->fonts->getFont(FontStyle::ChatMedium, 1.));
dialog.setWindowFlag(Qt::WindowStaysOnTopHint);
auto ok = bool();
auto font = dialog.getFont(&ok);
if (ok)
return font.family().toStdString();
else
return args.combobox->itemText(0).toStdString();
}
return args.value.toStdString();
}
} // namespace chatterino

View file

@ -0,0 +1,152 @@
#pragma once
#include <QDebug>
#include <QLabel>
#include <QVBoxLayout>
#include "boost/variant.hpp"
#include "pajlada/signals/signal.hpp"
#include "singletons/Settings.hpp"
#include "widgets/settingspages/SettingsPage.hpp"
class QLabel;
class QCheckBox;
class QComboBox;
namespace chatterino {
class TitleLabel : public QLabel
{
Q_OBJECT
public:
TitleLabel(const QString &text)
: QLabel(text)
{
}
};
class TitleLabel2 : public QLabel
{
Q_OBJECT
public:
TitleLabel2(const QString &text)
: QLabel(text)
{
}
};
class DescriptionLabel : public QLabel
{
Q_OBJECT
public:
DescriptionLabel(const QString &text)
: QLabel(text)
{
}
};
struct DropdownArgs {
QString value;
int index;
QComboBox *combobox;
};
class SettingsLayout : public QVBoxLayout
{
Q_OBJECT
public:
TitleLabel *addTitle(const QString &text);
TitleLabel2 *addTitle2(const QString &text);
QCheckBox *addCheckbox(const QString &text, BoolSetting &setting);
QComboBox *addDropdown(const QString &text, const QStringList &items);
QComboBox *addDropdown(const QString &text, const QStringList &items,
pajlada::Settings::Setting<QString> &setting);
template <typename T>
QComboBox *addDropdown(
const QString &text, const QStringList &items,
pajlada::Settings::Setting<T> &setting,
std::function<boost::variant<int, QString>(T)> getValue,
std::function<T(DropdownArgs)> setValue, bool editable = true)
{
auto items2 = items;
auto selected = getValue(setting.getValue());
if (selected.which() == 1)
{
// QString
if (!editable && !items2.contains(boost::get<QString>(selected)))
items2.insert(0, boost::get<QString>(selected));
}
auto combo = this->addDropdown(text, items2);
if (editable)
combo->setEditable(true);
if (selected.which() == 0)
{
// int
auto value = boost::get<int>(selected);
if (value >= 0 && value < items2.size())
combo->setCurrentIndex(value);
}
else if (selected.which() == 1)
{
// QString
combo->setEditText(boost::get<QString>(selected));
}
setting.connect(
[getValue = std::move(getValue), combo](const T &value, auto) {
auto var = getValue(value);
if (var.which() == 0)
combo->setCurrentIndex(boost::get<int>(var));
else
{
combo->setCurrentText(boost::get<QString>(var));
combo->setEditText(boost::get<QString>(var));
}
},
this->managedConnections_);
QObject::connect(
combo,
QOverload<const QString &>::of(&QComboBox::currentIndexChanged),
// &QComboBox::editTextChanged,
[combo, &setting,
setValue = std::move(setValue)](const QString &newValue) {
setting = setValue(
DropdownArgs{newValue, combo->currentIndex(), combo});
getApp()->windows->forceLayoutChannelViews();
});
return combo;
}
DescriptionLabel *addDescription(const QString &text);
void addSeperator();
private:
std::vector<pajlada::Signals::ScopedConnection> managedConnections_;
};
class GeneralPage : public SettingsPage
{
Q_OBJECT
public:
GeneralPage();
private:
void initLayout(SettingsLayout &layout);
void initExtra();
std::string getFont(const DropdownArgs &args) const;
DescriptionLabel *cachePath{};
};
} // namespace chatterino

View file

@ -184,8 +184,8 @@ void LookPage::addMessageTab(LayoutCreator<QVBoxLayout> layout)
getSettings()->separateMessages));
// alternate
layout.append(this->createCheckBox(
"Alternate background", getSettings()->alternateMessageBackground));
layout.append(this->createCheckBox("Alternate background",
getSettings()->alternateMessages));
layout.append(
this->createCheckBox("Compact emotes", getSettings()->compactEmotes));
@ -204,14 +204,14 @@ void LookPage::addMessageTab(LayoutCreator<QVBoxLayout> layout)
// bold usernames
layout.append(this->createCheckBox("Bold mentions (@username)",
getSettings()->enableUsernameBold));
getSettings()->boldUsernames));
// --
layout.emplace<Line>(false);
// lowercase links
layout.append(this->createCheckBox("Lowercase domains",
getSettings()->enableLowercaseLink));
getSettings()->lowercaseDomains));
// collapsing
{
@ -249,22 +249,11 @@ void LookPage::addMessageTab(LayoutCreator<QVBoxLayout> layout)
void LookPage::addEmoteTab(LayoutCreator<QVBoxLayout> layout)
{
/*
emotes.append(
this->createCheckBox("Enable Twitch emotes",
getSettings()->enableTwitchEmotes));
emotes.append(this->createCheckBox("Enable BetterTTV emotes for Twitch",
getSettings()->enableBttvEmotes));
emotes.append(this->createCheckBox("Enable FrankerFaceZ emotes for Twitch",
getSettings()->enableFfzEmotes));
emotes.append(this->createCheckBox("Enable emojis",
getSettings()->enableEmojis));
*/
layout.append(
this->createCheckBox("Animations", getSettings()->enableGifAnimations));
this->createCheckBox("Animations", getSettings()->animateEmotes));
layout.append(
this->createCheckBox("Animations only when chatterino has focus",
getSettings()->enableAnimationsWhenFocused));
getSettings()->animationsWhenFocused));
auto scaleBox = layout.emplace<QHBoxLayout>().withoutMargin();
{
@ -315,11 +304,12 @@ void LookPage::addEmoteTab(LayoutCreator<QVBoxLayout> layout)
void LookPage::addSplitHeaderTab(LayoutCreator<QVBoxLayout> layout)
{
layout.append(
this->createCheckBox("Show uptime", getSettings()->showUptime));
this->createCheckBox("Show uptime", getSettings()->headerUptime));
layout.append(this->createCheckBox("Show viewer count",
getSettings()->showViewerCount));
layout.append(this->createCheckBox("Show game", getSettings()->showGame));
layout.append(this->createCheckBox("Show title", getSettings()->showTitle));
getSettings()->headerViewerCount));
layout.append(this->createCheckBox("Show game", getSettings()->headerGame));
layout.append(
this->createCheckBox("Show title", getSettings()->headerStreamTitle));
layout->addStretch(1);
}

View file

@ -12,8 +12,10 @@ namespace chatterino {
class SettingsDialogTab;
class SettingsPage : public QWidget
class SettingsPage : public QFrame
{
Q_OBJECT
public:
SettingsPage(const QString &name, const QString &iconResource);

View file

@ -102,13 +102,13 @@ namespace {
title += " (live)";
// description
if (settings.showUptime)
if (settings.headerUptime)
title += " - " + s.uptime;
if (settings.showViewerCount)
if (settings.headerViewerCount)
title += " - " + QString::number(s.viewerCount);
if (settings.showGame)
if (settings.headerGame)
title += " - " + s.game;
if (settings.showTitle)
if (settings.headerStreamTitle)
title += " - " + s.title;
return title;
@ -142,10 +142,10 @@ SplitHeader::SplitHeader(Split *_split)
[this] { this->updateModerationModeIcon(); });
auto _ = [this](const auto &, const auto &) { this->updateChannelText(); };
getSettings()->showViewerCount.connect(_, this->managedConnections_);
getSettings()->showTitle.connect(_, this->managedConnections_);
getSettings()->showGame.connect(_, this->managedConnections_);
getSettings()->showUptime.connect(_, this->managedConnections_);
getSettings()->headerViewerCount.connect(_, this->managedConnections_);
getSettings()->headerStreamTitle.connect(_, this->managedConnections_);
getSettings()->headerGame.connect(_, this->managedConnections_);
getSettings()->headerUptime.connect(_, this->managedConnections_);
}
void SplitHeader::initializeLayout()