From 5253ab3f85d62e6bf2b9d069697ca31dafca150f Mon Sep 17 00:00:00 2001 From: 23rd <23rd@vivaldi.net> Date: Fri, 24 Aug 2018 12:56:42 +0300 Subject: [PATCH 01/34] Added tooltip to links via BTTV API. --- chatterino.pro | 2 + src/providers/bttv/BttvTooltip.cpp | 39 +++++++++++++++++++ src/providers/bttv/BttvTooltip.hpp | 17 ++++++++ src/providers/twitch/TwitchMessageBuilder.cpp | 10 ++++- src/widgets/TooltipWidget.cpp | 5 +++ src/widgets/TooltipWidget.hpp | 1 + src/widgets/helper/ChannelView.cpp | 1 + src/widgets/splits/SplitHeader.cpp | 2 + 8 files changed, 76 insertions(+), 1 deletion(-) create mode 100644 src/providers/bttv/BttvTooltip.cpp create mode 100644 src/providers/bttv/BttvTooltip.hpp diff --git a/chatterino.pro b/chatterino.pro index 1c9cf8f11..ebe784deb 100644 --- a/chatterino.pro +++ b/chatterino.pro @@ -237,6 +237,7 @@ SOURCES += \ src/messages/Emote.cpp \ src/messages/ImageSet.cpp \ src/providers/bttv/BttvEmotes.cpp \ + src/providers/bttv/BttvTooltip.cpp \ src/providers/ffz/FfzEmotes.cpp \ src/autogenerated/ResourcesAutogen.cpp \ src/singletons/Badges.cpp \ @@ -433,6 +434,7 @@ HEADERS += \ src/messages/ImageSet.hpp \ src/common/Outcome.hpp \ src/providers/bttv/BttvEmotes.hpp \ + src/providers/bttv/BttvTooltip.hpp \ src/providers/ffz/FfzEmotes.hpp \ src/autogenerated/ResourcesAutogen.hpp \ src/singletons/Badges.hpp \ diff --git a/src/providers/bttv/BttvTooltip.cpp b/src/providers/bttv/BttvTooltip.cpp new file mode 100644 index 000000000..df3738411 --- /dev/null +++ b/src/providers/bttv/BttvTooltip.cpp @@ -0,0 +1,39 @@ +#include "providers/bttv/BttvTooltip.hpp" + +#include "common/Common.hpp" +#include "common/NetworkRequest.hpp" + +#include + +namespace chatterino { + +void BttvTooltip::getUrlTooltip(const QString url, + std::function successCallback) +{ + QString requestUrl("https://api.betterttv.net/2/link_resolver/" + + QUrl::toPercentEncoding(url, "", "/:")); + + NetworkRequest request(requestUrl); + request.setCaller(QThread::currentThread()); + request.setTimeout(30000); + request.onSuccess([successCallback](auto result) mutable -> Outcome { + auto root = result.parseJson(); + /* When tooltip is not a string, in this case, + onError runs before onSuccess, + so there is no point in doing "if" condition. */ + auto tooltip = root.value("tooltip").toString(); + successCallback(QUrl::fromPercentEncoding(tooltip.toUtf8())); + + return Success; + }); + + request.onError([successCallback](auto result) { + successCallback("No link info found"); + + return true; + }); + + request.execute(); +} + +} // namespace chatterino diff --git a/src/providers/bttv/BttvTooltip.hpp b/src/providers/bttv/BttvTooltip.hpp new file mode 100644 index 000000000..2c6b2597a --- /dev/null +++ b/src/providers/bttv/BttvTooltip.hpp @@ -0,0 +1,17 @@ +#pragma once + +#include +#include + +namespace chatterino { + +class BttvTooltip +{ +public: + static void getUrlTooltip(const QString url, + std::function callback); + +private: +}; + +} // namespace chatterino diff --git a/src/providers/twitch/TwitchMessageBuilder.cpp b/src/providers/twitch/TwitchMessageBuilder.cpp index b245c7664..b83bfd29d 100644 --- a/src/providers/twitch/TwitchMessageBuilder.cpp +++ b/src/providers/twitch/TwitchMessageBuilder.cpp @@ -8,6 +8,7 @@ #include "messages/Message.hpp" #include "providers/twitch/TwitchBadges.hpp" #include "providers/twitch/TwitchChannel.hpp" +#include "providers/bttv/BttvTooltip.hpp" #include "singletons/Emotes.hpp" #include "singletons/Resources.hpp" #include "singletons/Settings.hpp" @@ -268,12 +269,19 @@ void TwitchMessageBuilder::addTextOrEmoji(const QString &string_) link = Link(Link::Url, linkString); textColor = MessageColor(MessageColor::Link); - this->emplace(lowercaseLinkString, + auto linkMessageElement = this->emplace(lowercaseLinkString, MessageElementFlag::LowercaseLink, textColor) ->setLink(link); this->emplace(string, MessageElementFlag::OriginalLink, textColor) ->setLink(link); + + BttvTooltip::getUrlTooltip( + linkString, [linkMessageElement](QString tooltipText) { + if (!tooltipText.isEmpty()) { + linkMessageElement->setTooltip(tooltipText); + } + }); } // if (!linkString.isEmpty()) { diff --git a/src/widgets/TooltipWidget.cpp b/src/widgets/TooltipWidget.cpp index 084f729ac..5ee0b1daf 100644 --- a/src/widgets/TooltipWidget.cpp +++ b/src/widgets/TooltipWidget.cpp @@ -87,6 +87,11 @@ void TooltipWidget::setText(QString text) this->displayText_->setText(text); } +void TooltipWidget::setWordWrap(bool wrap) +{ + this->displayText_->setWordWrap(wrap); +} + void TooltipWidget::changeEvent(QEvent *) { // clear parents event diff --git a/src/widgets/TooltipWidget.hpp b/src/widgets/TooltipWidget.hpp index 7d8c95dc2..2228e5662 100644 --- a/src/widgets/TooltipWidget.hpp +++ b/src/widgets/TooltipWidget.hpp @@ -19,6 +19,7 @@ public: virtual ~TooltipWidget() override; void setText(QString text); + void setWordWrap(bool wrap); #ifdef USEWINSDK void raise(); diff --git a/src/widgets/helper/ChannelView.cpp b/src/widgets/helper/ChannelView.cpp index 2afc42e75..71c1408d7 100644 --- a/src/widgets/helper/ChannelView.cpp +++ b/src/widgets/helper/ChannelView.cpp @@ -866,6 +866,7 @@ void ChannelView::mouseMoveEvent(QMouseEvent *event) tooltipWidget->hide(); } else { tooltipWidget->moveTo(this, event->globalPos()); + tooltipWidget->setWordWrap(hoverLayoutElement->getLink().isValid()); tooltipWidget->setText(tooltip); tooltipWidget->adjustSize(); tooltipWidget->show(); diff --git a/src/widgets/splits/SplitHeader.cpp b/src/widgets/splits/SplitHeader.cpp index 611bbaace..42656fde0 100644 --- a/src/widgets/splits/SplitHeader.cpp +++ b/src/widgets/splits/SplitHeader.cpp @@ -458,6 +458,8 @@ void SplitHeader::enterEvent(QEvent *event) tooltip->moveTo(this, this->mapToGlobal(this->rect().bottomLeft()), false); tooltip->setText(this->tooltipText_); + tooltip->setWordWrap(false); + tooltip->adjustSize(); tooltip->show(); tooltip->raise(); } From f8c42918a6ac611cc59629968deff96acf8e8e13 Mon Sep 17 00:00:00 2001 From: 23rd <23rd@vivaldi.net> Date: Sat, 25 Aug 2018 20:49:50 +0300 Subject: [PATCH 02/34] Added option to turn off link info tooltips. --- src/singletons/Settings.hpp | 1 + src/widgets/helper/ChannelView.cpp | 2 ++ src/widgets/settingspages/FeelPage.cpp | 3 +++ 3 files changed, 6 insertions(+) diff --git a/src/singletons/Settings.hpp b/src/singletons/Settings.hpp index 472c2892a..ff9a87222 100644 --- a/src/singletons/Settings.hpp +++ b/src/singletons/Settings.hpp @@ -109,6 +109,7 @@ public: /// Links BoolSetting linksDoubleClickOnly = {"/links/doubleClickToOpen", false}; + BoolSetting enableLinkInfoTooltip = {"/links/linkInfoTooltip", false}; BoolSetting enableLowercaseLink = {"/links/linkLowercase", true}; /// Ingored Users diff --git a/src/widgets/helper/ChannelView.cpp b/src/widgets/helper/ChannelView.cpp index 71c1408d7..d714884ae 100644 --- a/src/widgets/helper/ChannelView.cpp +++ b/src/widgets/helper/ChannelView.cpp @@ -864,6 +864,8 @@ void ChannelView::mouseMoveEvent(QMouseEvent *event) if (tooltip.isEmpty()) { tooltipWidget->hide(); + } else if (hoverLayoutElement->getLink().isValid() && !getSettings()->enableLinkInfoTooltip) { + tooltipWidget->hide(); } else { tooltipWidget->moveTo(this, event->globalPos()); tooltipWidget->setWordWrap(hoverLayoutElement->getLink().isValid()); diff --git a/src/widgets/settingspages/FeelPage.cpp b/src/widgets/settingspages/FeelPage.cpp index 78b41c45d..b87a2d098 100644 --- a/src/widgets/settingspages/FeelPage.cpp +++ b/src/widgets/settingspages/FeelPage.cpp @@ -50,6 +50,9 @@ FeelPage::FeelPage() form->addRow("Links:", this->createCheckBox("Open links only on double click", getSettings()->linksDoubleClickOnly)); + form->addRow("", + this->createCheckBox("Show link info in tooltips", + getSettings()->enableLinkInfoTooltip)); } layout->addSpacing(16); From 539d8c20d2bd225b31922bd36ca672f5ab64f46b Mon Sep 17 00:00:00 2001 From: 23rd <23rd@vivaldi.net> Date: Sat, 25 Aug 2018 21:21:18 +0300 Subject: [PATCH 03/34] Put isValid() in variable. --- src/widgets/helper/ChannelView.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/widgets/helper/ChannelView.cpp b/src/widgets/helper/ChannelView.cpp index d714884ae..5b64245ba 100644 --- a/src/widgets/helper/ChannelView.cpp +++ b/src/widgets/helper/ChannelView.cpp @@ -861,14 +861,15 @@ void ChannelView::mouseMoveEvent(QMouseEvent *event) return; } const auto &tooltip = hoverLayoutElement->getCreator().getTooltip(); + bool isLinkValid = hoverLayoutElement->getLink().isValid(); if (tooltip.isEmpty()) { tooltipWidget->hide(); - } else if (hoverLayoutElement->getLink().isValid() && !getSettings()->enableLinkInfoTooltip) { + } else if (isLinkValid && !getSettings()->enableLinkInfoTooltip) { tooltipWidget->hide(); } else { tooltipWidget->moveTo(this, event->globalPos()); - tooltipWidget->setWordWrap(hoverLayoutElement->getLink().isValid()); + tooltipWidget->setWordWrap(isLinkValid); tooltipWidget->setText(tooltip); tooltipWidget->adjustSize(); tooltipWidget->show(); @@ -876,7 +877,7 @@ void ChannelView::mouseMoveEvent(QMouseEvent *event) } // check if word has a link - if (hoverLayoutElement->getLink().isValid()) { + if (isLinkValid) { this->setCursor(Qt::PointingHandCursor); } else { this->setCursor(Qt::ArrowCursor); From f4828b7d092f1949cbc4197ff13bee22e8bd97eb Mon Sep 17 00:00:00 2001 From: 23rd <23rd@vivaldi.net> Date: Sat, 25 Aug 2018 21:38:14 +0300 Subject: [PATCH 04/34] Rename everything. --- chatterino.pro | 4 ++-- src/providers/{bttv/BttvTooltip.cpp => LinkResolver.cpp} | 4 ++-- src/providers/{bttv/BttvTooltip.hpp => LinkResolver.hpp} | 4 ++-- src/providers/twitch/TwitchMessageBuilder.cpp | 4 ++-- 4 files changed, 8 insertions(+), 8 deletions(-) rename src/providers/{bttv/BttvTooltip.cpp => LinkResolver.cpp} (91%) rename src/providers/{bttv/BttvTooltip.hpp => LinkResolver.hpp} (74%) diff --git a/chatterino.pro b/chatterino.pro index ebe784deb..00b866a1b 100644 --- a/chatterino.pro +++ b/chatterino.pro @@ -237,7 +237,7 @@ SOURCES += \ src/messages/Emote.cpp \ src/messages/ImageSet.cpp \ src/providers/bttv/BttvEmotes.cpp \ - src/providers/bttv/BttvTooltip.cpp \ + src/providers/LinkResolver.cpp \ src/providers/ffz/FfzEmotes.cpp \ src/autogenerated/ResourcesAutogen.cpp \ src/singletons/Badges.cpp \ @@ -434,7 +434,7 @@ HEADERS += \ src/messages/ImageSet.hpp \ src/common/Outcome.hpp \ src/providers/bttv/BttvEmotes.hpp \ - src/providers/bttv/BttvTooltip.hpp \ + src/providers/LinkResolver.hpp \ src/providers/ffz/FfzEmotes.hpp \ src/autogenerated/ResourcesAutogen.hpp \ src/singletons/Badges.hpp \ diff --git a/src/providers/bttv/BttvTooltip.cpp b/src/providers/LinkResolver.cpp similarity index 91% rename from src/providers/bttv/BttvTooltip.cpp rename to src/providers/LinkResolver.cpp index df3738411..5ebad69e3 100644 --- a/src/providers/bttv/BttvTooltip.cpp +++ b/src/providers/LinkResolver.cpp @@ -1,4 +1,4 @@ -#include "providers/bttv/BttvTooltip.hpp" +#include "providers/LinkResolver.hpp" #include "common/Common.hpp" #include "common/NetworkRequest.hpp" @@ -7,7 +7,7 @@ namespace chatterino { -void BttvTooltip::getUrlTooltip(const QString url, +void LinkResolver::getLinkInfo(const QString url, std::function successCallback) { QString requestUrl("https://api.betterttv.net/2/link_resolver/" + diff --git a/src/providers/bttv/BttvTooltip.hpp b/src/providers/LinkResolver.hpp similarity index 74% rename from src/providers/bttv/BttvTooltip.hpp rename to src/providers/LinkResolver.hpp index 2c6b2597a..919109aaf 100644 --- a/src/providers/bttv/BttvTooltip.hpp +++ b/src/providers/LinkResolver.hpp @@ -5,10 +5,10 @@ namespace chatterino { -class BttvTooltip +class LinkResolver { public: - static void getUrlTooltip(const QString url, + static void getLinkInfo(const QString url, std::function callback); private: diff --git a/src/providers/twitch/TwitchMessageBuilder.cpp b/src/providers/twitch/TwitchMessageBuilder.cpp index b83bfd29d..d19d3252c 100644 --- a/src/providers/twitch/TwitchMessageBuilder.cpp +++ b/src/providers/twitch/TwitchMessageBuilder.cpp @@ -8,7 +8,7 @@ #include "messages/Message.hpp" #include "providers/twitch/TwitchBadges.hpp" #include "providers/twitch/TwitchChannel.hpp" -#include "providers/bttv/BttvTooltip.hpp" +#include "providers/LinkResolver.hpp" #include "singletons/Emotes.hpp" #include "singletons/Resources.hpp" #include "singletons/Settings.hpp" @@ -276,7 +276,7 @@ void TwitchMessageBuilder::addTextOrEmoji(const QString &string_) textColor) ->setLink(link); - BttvTooltip::getUrlTooltip( + LinkResolver::getLinkInfo( linkString, [linkMessageElement](QString tooltipText) { if (!tooltipText.isEmpty()) { linkMessageElement->setTooltip(tooltipText); From c7e21885822d8e0d23f4ee9635e823e9b62e28a7 Mon Sep 17 00:00:00 2001 From: 23rd <23rd@vivaldi.net> Date: Sat, 25 Aug 2018 21:47:25 +0300 Subject: [PATCH 05/34] Added tooltip to original link too. --- src/providers/twitch/TwitchMessageBuilder.cpp | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/providers/twitch/TwitchMessageBuilder.cpp b/src/providers/twitch/TwitchMessageBuilder.cpp index d19d3252c..042830432 100644 --- a/src/providers/twitch/TwitchMessageBuilder.cpp +++ b/src/providers/twitch/TwitchMessageBuilder.cpp @@ -269,17 +269,18 @@ void TwitchMessageBuilder::addTextOrEmoji(const QString &string_) link = Link(Link::Url, linkString); textColor = MessageColor(MessageColor::Link); - auto linkMessageElement = this->emplace(lowercaseLinkString, + auto linkMELowercase = this->emplace(lowercaseLinkString, MessageElementFlag::LowercaseLink, textColor) ->setLink(link); - this->emplace(string, MessageElementFlag::OriginalLink, - textColor) + auto linkMEOriginal = this->emplace(string, + MessageElementFlag::OriginalLink, textColor) ->setLink(link); LinkResolver::getLinkInfo( - linkString, [linkMessageElement](QString tooltipText) { + linkString, [linkMELowercase, linkMEOriginal](QString tooltipText) { if (!tooltipText.isEmpty()) { - linkMessageElement->setTooltip(tooltipText); + linkMELowercase->setTooltip(tooltipText); + linkMEOriginal->setTooltip(tooltipText); } }); } From cb500070f2937085d439fe1f6abc654a421bd545 Mon Sep 17 00:00:00 2001 From: 23rd <23rd@vivaldi.net> Date: Sun, 26 Aug 2018 15:41:46 +0300 Subject: [PATCH 06/34] Run away from BTTV API. --- src/providers/LinkResolver.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/providers/LinkResolver.cpp b/src/providers/LinkResolver.cpp index 5ebad69e3..697b6a7d7 100644 --- a/src/providers/LinkResolver.cpp +++ b/src/providers/LinkResolver.cpp @@ -10,7 +10,7 @@ namespace chatterino { void LinkResolver::getLinkInfo(const QString url, std::function successCallback) { - QString requestUrl("https://api.betterttv.net/2/link_resolver/" + + QString requestUrl("https://braize.pajlada.com/chatterino/link_resolver/" + QUrl::toPercentEncoding(url, "", "/:")); NetworkRequest request(requestUrl); From bf529d5503c06a1a0a7ca0a8fe6eb8617ac403d9 Mon Sep 17 00:00:00 2001 From: 23rd <23rd@vivaldi.net> Date: Sun, 26 Aug 2018 16:25:51 +0300 Subject: [PATCH 07/34] Rewritten check for incorrect link. --- src/providers/LinkResolver.cpp | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/providers/LinkResolver.cpp b/src/providers/LinkResolver.cpp index 697b6a7d7..d6917157d 100644 --- a/src/providers/LinkResolver.cpp +++ b/src/providers/LinkResolver.cpp @@ -18,11 +18,14 @@ void LinkResolver::getLinkInfo(const QString url, request.setTimeout(30000); request.onSuccess([successCallback](auto result) mutable -> Outcome { auto root = result.parseJson(); - /* When tooltip is not a string, in this case, - onError runs before onSuccess, - so there is no point in doing "if" condition. */ - auto tooltip = root.value("tooltip").toString(); - successCallback(QUrl::fromPercentEncoding(tooltip.toUtf8())); + auto statusCode = root.value("status").toInt(); + QString response = QString(); + if (statusCode == 200) { + response = root.value("tooltip").toString(); + } else { + response = root.value("message").toString(); + } + successCallback(QUrl::fromPercentEncoding(response.toUtf8())); return Success; }); From 0f2d6a4a227695d379d077086ed524b69f99e4f4 Mon Sep 17 00:00:00 2001 From: 23rd <23rd@vivaldi.net> Date: Mon, 27 Aug 2018 15:36:01 +0300 Subject: [PATCH 08/34] Added hotkey for Emote menu. --- .../settingspages/KeyboardSettingsPage.cpp | 2 ++ src/widgets/splits/SplitInput.cpp | 36 +++++++++++-------- src/widgets/splits/SplitInput.hpp | 1 + 3 files changed, 24 insertions(+), 15 deletions(-) diff --git a/src/widgets/settingspages/KeyboardSettingsPage.cpp b/src/widgets/settingspages/KeyboardSettingsPage.cpp index fb28ae877..e66a984bf 100644 --- a/src/widgets/settingspages/KeyboardSettingsPage.cpp +++ b/src/widgets/settingspages/KeyboardSettingsPage.cpp @@ -41,6 +41,8 @@ KeyboardSettingsPage::KeyboardSettingsPage() form->addRow(new QLabel("Ctrl + R"), new QLabel("Change channel")); form->addRow(new QLabel("Ctrl + F"), new QLabel("Search in current channel")); + form->addRow(new QLabel("Ctrl + E"), + new QLabel("Open Emote menu")); } } // namespace chatterino diff --git a/src/widgets/splits/SplitInput.cpp b/src/widgets/splits/SplitInput.cpp index d35acdf48..adf19ebcc 100644 --- a/src/widgets/splits/SplitInput.cpp +++ b/src/widgets/splits/SplitInput.cpp @@ -84,21 +84,7 @@ void SplitInput::initLayout() })); // open emote popup - QObject::connect(this->ui_.emoteButton, &EffectLabel::clicked, [this] { - if (!this->emotePopup_) { - this->emotePopup_ = std::make_unique(); - this->emotePopup_->linkClicked.connect([this](const Link &link) { - if (link.type == Link::InsertText) { - this->insertText(link.value + " "); - } - }); - } - - this->emotePopup_->resize(int(300 * this->emotePopup_->getScale()), - int(500 * this->emotePopup_->getScale())); - this->emotePopup_->loadChannel(this->split_->getChannel()); - this->emotePopup_->show(); - }); + QObject::connect(this->ui_.emoteButton, &EffectLabel::clicked, [=] { this->openEmotePopup(); }); // clear channelview selection when selecting in the input QObject::connect(this->ui_.textEdit, &QTextEdit::copyAvailable, @@ -159,6 +145,23 @@ void SplitInput::updateEmoteButton() this->ui_.emoteButton->setFixedHeight(int(18 * scale)); } +void SplitInput::openEmotePopup() +{ + if (!this->emotePopup_) { + this->emotePopup_ = std::make_unique(); + this->emotePopup_->linkClicked.connect([this](const Link &link) { + if (link.type == Link::InsertText) { + this->insertText(link.value + " "); + } + }); + } + + this->emotePopup_->resize(int(300 * this->emotePopup_->getScale()), + int(500 * this->emotePopup_->getScale())); + this->emotePopup_->loadChannel(this->split_->getChannel()); + this->emotePopup_->show(); +} + void SplitInput::installKeyPressedEvent() { auto app = getApp(); @@ -284,6 +287,9 @@ void SplitInput::installKeyPressedEvent() this->split_->copyToClipboard(); event->accept(); } + } else if (event->key() == Qt::Key_E && + event->modifiers() == Qt::ControlModifier) { + openEmotePopup(); } }); } diff --git a/src/widgets/splits/SplitInput.hpp b/src/widgets/splits/SplitInput.hpp index 6ad6f4f83..b26030b6b 100644 --- a/src/widgets/splits/SplitInput.hpp +++ b/src/widgets/splits/SplitInput.hpp @@ -43,6 +43,7 @@ private: void initLayout(); void installKeyPressedEvent(); void updateEmoteButton(); + void openEmotePopup(); Split *const split_; std::shared_ptr emotePopup_; From f6d0cc9e6bb0e171a1f52ddd3cca6527c263c7f9 Mon Sep 17 00:00:00 2001 From: 23rd <23rd@vivaldi.net> Date: Mon, 27 Aug 2018 21:12:38 +0300 Subject: [PATCH 09/34] Fixed down key in input field. --- src/widgets/splits/SplitInput.cpp | 34 +++++++++++++++++++++++++------ 1 file changed, 28 insertions(+), 6 deletions(-) diff --git a/src/widgets/splits/SplitInput.cpp b/src/widgets/splits/SplitInput.cpp index d35acdf48..ec548be7d 100644 --- a/src/widgets/splits/SplitInput.cpp +++ b/src/widgets/splits/SplitInput.cpp @@ -186,8 +186,7 @@ void SplitInput::installKeyPressedEvent() this->currMsg_ = QString(); this->ui_.textEdit->setText(QString()); this->prevIndex_ = 0; - } else if (this->ui_.textEdit->toPlainText() == - this->prevMsg_.at(this->prevMsg_.size() - 1)) { + } else if (message == this->prevMsg_.at(this->prevMsg_.size() - 1)) { this->prevMsg_.removeLast(); } this->prevIndex_ = this->prevMsg_.size(); @@ -227,6 +226,13 @@ void SplitInput::installKeyPressedEvent() page->selectNextSplit(SplitContainer::Below); } } else { + // If user did not write anything before then just do nothing. + if (this->prevMsg_.isEmpty()) { + return; + } + bool cursorToEnd = true; + QString message = ui_.textEdit->toPlainText(); + if (this->prevIndex_ != (this->prevMsg_.size() - 1) && this->prevIndex_ != this->prevMsg_.size()) { this->prevIndex_++; @@ -234,12 +240,28 @@ void SplitInput::installKeyPressedEvent() this->prevMsg_.at(this->prevIndex_)); } else { this->prevIndex_ = this->prevMsg_.size(); - this->ui_.textEdit->setText(this->currMsg_); + if (message == this->prevMsg_.at(this->prevIndex_ - 1)) { + // If user has just come from a message history + // Then simply get currMsg_. + this->ui_.textEdit->setText(this->currMsg_); + } else if (message != this->currMsg_) { + // If user is already in current message + // And type something new + // Then replace currMsg_ with new one. + this->currMsg_ = message; + } else { + // If user is already in current message + // And no changed text + // Then don't touch cursos. + cursorToEnd = false; + } } - QTextCursor cursor = this->ui_.textEdit->textCursor(); - cursor.movePosition(QTextCursor::End); - this->ui_.textEdit->setTextCursor(cursor); + if (cursorToEnd) { + QTextCursor cursor = this->ui_.textEdit->textCursor(); + cursor.movePosition(QTextCursor::End); + this->ui_.textEdit->setTextCursor(cursor); + } } } else if (event->key() == Qt::Key_Left) { if (event->modifiers() == Qt::AltModifier) { From bfe87b699a4e32c3285a43bc534c25004c0e0f7b Mon Sep 17 00:00:00 2001 From: 23rd <23rd@vivaldi.net> Date: Mon, 27 Aug 2018 21:22:53 +0300 Subject: [PATCH 10/34] Refactored cursorToEnd. --- src/widgets/splits/SplitInput.cpp | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/widgets/splits/SplitInput.cpp b/src/widgets/splits/SplitInput.cpp index ec548be7d..3502cb332 100644 --- a/src/widgets/splits/SplitInput.cpp +++ b/src/widgets/splits/SplitInput.cpp @@ -245,16 +245,14 @@ void SplitInput::installKeyPressedEvent() // Then simply get currMsg_. this->ui_.textEdit->setText(this->currMsg_); } else if (message != this->currMsg_) { - // If user is already in current message + // If user are already in current message // And type something new // Then replace currMsg_ with new one. this->currMsg_ = message; - } else { - // If user is already in current message - // And no changed text - // Then don't touch cursos. - cursorToEnd = false; } + // If user is already in current message + // Then don't touch cursos. + cursorToEnd = (message == this->prevMsg_.at(this->prevIndex_ - 1)); } if (cursorToEnd) { From c5d5825b5a21c76954b285546258ff0f431b8ba7 Mon Sep 17 00:00:00 2001 From: apa420 <17131426+apa420@users.noreply.github.com> Date: Wed, 29 Aug 2018 00:30:11 +0200 Subject: [PATCH 11/34] Added functionality of option of highlightsound on whisper (#692) Fixes #640 --- src/providers/twitch/TwitchMessageBuilder.cpp | 6 ++++++ src/singletons/Settings.hpp | 2 ++ src/widgets/settingspages/HighlightingPage.cpp | 2 ++ 3 files changed, 10 insertions(+) diff --git a/src/providers/twitch/TwitchMessageBuilder.cpp b/src/providers/twitch/TwitchMessageBuilder.cpp index a6647d88e..a5bf3a4d2 100644 --- a/src/providers/twitch/TwitchMessageBuilder.cpp +++ b/src/providers/twitch/TwitchMessageBuilder.cpp @@ -578,6 +578,12 @@ void TwitchMessageBuilder::parseHighlights(bool isPastMsg) 2500); } } + if (this->args.isReceivedWhisper && + getSettings()->highlightSoundOnWhisper) { + if (!hasFocus || getSettings()->highlightAlwaysPlaySound) { + player->play(); + } + } } } diff --git a/src/singletons/Settings.hpp b/src/singletons/Settings.hpp index 45b0d069a..861a0aec0 100644 --- a/src/singletons/Settings.hpp +++ b/src/singletons/Settings.hpp @@ -120,6 +120,8 @@ public: BoolSetting enableHighlightTaskbar = {"/highlighting/enableTaskbarFlashing", true}; BoolSetting customHighlightSound = {"/highlighting/useCustomSound", false}; + BoolSetting highlightSoundOnWhisper = { + "/highlighting/highlightSoundOnWhisper", false}; /// Logging BoolSetting enableLogging = {"/logging/enabled", false}; diff --git a/src/widgets/settingspages/HighlightingPage.cpp b/src/widgets/settingspages/HighlightingPage.cpp index be394b3c2..626bb65d0 100644 --- a/src/widgets/settingspages/HighlightingPage.cpp +++ b/src/widgets/settingspages/HighlightingPage.cpp @@ -149,6 +149,8 @@ HighlightingPage::HighlightingPage() layout.append(createCheckBox(ALWAYS_PLAY, getSettings()->highlightAlwaysPlaySound)); + layout.append(createCheckBox(("Notification on whisper"), + getSettings()->highlightSoundOnWhisper)); } // ---- misc From c3065db16d3fa676eaa4a0c76e760873a4e6fb8c Mon Sep 17 00:00:00 2001 From: apa420 Date: Wed, 29 Aug 2018 01:21:36 +0200 Subject: [PATCH 12/34] highlighting whispers works better and looks better --- src/common/SignalVectorModel.hpp | 5 +- src/controllers/highlights/HighlightModel.cpp | 53 +++++++++++++++---- src/controllers/highlights/HighlightModel.hpp | 4 +- src/providers/twitch/TwitchMessageBuilder.cpp | 25 +++++---- src/singletons/Settings.hpp | 19 ++++--- .../settingspages/HighlightingPage.cpp | 2 - 6 files changed, 75 insertions(+), 33 deletions(-) diff --git a/src/common/SignalVectorModel.hpp b/src/common/SignalVectorModel.hpp index 237727d0d..4a56913b4 100644 --- a/src/common/SignalVectorModel.hpp +++ b/src/common/SignalVectorModel.hpp @@ -124,7 +124,7 @@ public: rowItem.items[column]->setData(value, role); if (rowItem.isCustomRow) { - this->customRowSetData(rowItem.items, column, value, role); + this->customRowSetData(rowItem.items, column, value, role, row); } else { int vecRow = this->getVectorIndexFromModelIndex(row); this->vector_->removeItem(vecRow, this); @@ -230,7 +230,8 @@ protected: } virtual void customRowSetData(const std::vector &row, - int column, const QVariant &value, int role) + int column, const QVariant &value, int role, + int rowIndex) { } diff --git a/src/controllers/highlights/HighlightModel.cpp b/src/controllers/highlights/HighlightModel.cpp index 827e23a4a..0ba232b37 100644 --- a/src/controllers/highlights/HighlightModel.cpp +++ b/src/controllers/highlights/HighlightModel.cpp @@ -36,36 +36,67 @@ void HighlightModel::getRowFromItem(const HighlightPhrase &item, void HighlightModel::afterInit() { - std::vector row = this->createRow(); - setBoolItem(row[0], getSettings()->enableHighlightsSelf.getValue(), true, + std::vector usernameRow = this->createRow(); + setBoolItem(usernameRow[0], getSettings()->enableSelfHighlight.getValue(), + true, false); + usernameRow[0]->setData("Your username (automatic)", Qt::DisplayRole); + setBoolItem(usernameRow[1], + getSettings()->enableSelfHighlightTaskbar.getValue(), true, false); - row[0]->setData("Your username (automatic)", Qt::DisplayRole); - setBoolItem(row[1], getSettings()->enableHighlightTaskbar.getValue(), true, + setBoolItem(usernameRow[2], + getSettings()->enableSelfHighlightSound.getValue(), true, false); - setBoolItem(row[2], getSettings()->enableHighlightSound.getValue(), true, + usernameRow[3]->setFlags(0); + this->insertCustomRow(usernameRow, 0); + std::vector whisperRow = this->createRow(); + setBoolItem(whisperRow[0], getSettings()->enableWhisperHighlight.getValue(), + true, false); + whisperRow[0]->setData("Whispers", Qt::DisplayRole); + setBoolItem(whisperRow[1], + getSettings()->enableWhisperHighlightTaskbar.getValue(), true, false); - row[3]->setFlags(0); - this->insertCustomRow(row, 0); + setBoolItem(whisperRow[2], + getSettings()->enableWhisperHighlightSound.getValue(), true, + false); + whisperRow[3]->setFlags(0); + this->insertCustomRow(whisperRow, 1); } void HighlightModel::customRowSetData(const std::vector &row, int column, const QVariant &value, - int role) + int role, int rowIndex) { switch (column) { case 0: { if (role == Qt::CheckStateRole) { - getSettings()->enableHighlightsSelf.setValue(value.toBool()); + if (rowIndex == 0) { + getSettings()->enableSelfHighlight.setValue(value.toBool()); + } else if (rowIndex == 1) { + getSettings()->enableWhisperHighlight.setValue( + value.toBool()); + } } } break; case 1: { if (role == Qt::CheckStateRole) { - getSettings()->enableHighlightTaskbar.setValue(value.toBool()); + if (rowIndex == 0) { + getSettings()->enableSelfHighlightTaskbar.setValue( + value.toBool()); + } else if (rowIndex == 1) { + getSettings()->enableWhisperHighlightTaskbar.setValue( + value.toBool()); + } } } break; case 2: { if (role == Qt::CheckStateRole) { - getSettings()->enableHighlightSound.setValue(value.toBool()); + if (rowIndex == 0) { + getSettings()->enableSelfHighlightSound.setValue( + value.toBool()); + } else if (rowIndex == 1) { + getSettings()->enableWhisperHighlightSound.setValue( + value.toBool()); + } } } break; case 3: { diff --git a/src/controllers/highlights/HighlightModel.hpp b/src/controllers/highlights/HighlightModel.hpp index b42246167..563706246 100644 --- a/src/controllers/highlights/HighlightModel.hpp +++ b/src/controllers/highlights/HighlightModel.hpp @@ -26,8 +26,8 @@ protected: virtual void afterInit() override; virtual void customRowSetData(const std::vector &row, - int column, const QVariant &value, - int role) override; + int column, const QVariant &value, int role, + int rowIndex) override; friend class HighlightController; }; diff --git a/src/providers/twitch/TwitchMessageBuilder.cpp b/src/providers/twitch/TwitchMessageBuilder.cpp index a5bf3a4d2..73415811a 100644 --- a/src/providers/twitch/TwitchMessageBuilder.cpp +++ b/src/providers/twitch/TwitchMessageBuilder.cpp @@ -507,10 +507,10 @@ void TwitchMessageBuilder::parseHighlights(bool isPastMsg) std::vector userHighlights = app->highlights->highlightedUsers.getVector(); - if (getSettings()->enableHighlightsSelf && currentUsername.size() > 0) { + if (getSettings()->enableSelfHighlight && currentUsername.size() > 0) { HighlightPhrase selfHighlight( - currentUsername, getSettings()->enableHighlightTaskbar, - getSettings()->enableHighlightSound, false); + currentUsername, getSettings()->enableSelfHighlightTaskbar, + getSettings()->enableSelfHighlightSound, false); activeHighlights.emplace_back(std::move(selfHighlight)); } @@ -564,6 +564,19 @@ void TwitchMessageBuilder::parseHighlights(bool isPastMsg) } } } + if (this->args.isReceivedWhisper) { + if (getSettings()->enableWhisperHighlight) { + log("Highlight because it's a whisper", + this->args.isReceivedWhisper); + doHighlight = true; + } + if (getSettings()->enableWhisperHighlightTaskbar) { + doAlert = true; + } + if (getSettings()->enableSelfHighlightSound) { + playSound = true; + } + } this->message().flags.set(MessageFlag::Highlighted, doHighlight); @@ -578,12 +591,6 @@ void TwitchMessageBuilder::parseHighlights(bool isPastMsg) 2500); } } - if (this->args.isReceivedWhisper && - getSettings()->highlightSoundOnWhisper) { - if (!hasFocus || getSettings()->highlightAlwaysPlaySound) { - player->play(); - } - } } } diff --git a/src/singletons/Settings.hpp b/src/singletons/Settings.hpp index 861a0aec0..bb43b48cf 100644 --- a/src/singletons/Settings.hpp +++ b/src/singletons/Settings.hpp @@ -114,14 +114,19 @@ public: /// Highlighting // BoolSetting enableHighlights = {"/highlighting/enabled", true}; - BoolSetting enableHighlightsSelf = {"/highlighting/nameIsHighlightKeyword", - true}; - BoolSetting enableHighlightSound = {"/highlighting/enableSound", true}; - BoolSetting enableHighlightTaskbar = {"/highlighting/enableTaskbarFlashing", - true}; BoolSetting customHighlightSound = {"/highlighting/useCustomSound", false}; - BoolSetting highlightSoundOnWhisper = { - "/highlighting/highlightSoundOnWhisper", false}; + BoolSetting enableSelfHighlight = { + "/highlighting/selfHighlight/nameIsHighlightKeyword", true}; + BoolSetting enableSelfHighlightSound = { + "/highlighting/selfHighlight/enableSound", true}; + BoolSetting enableSelfHighlightTaskbar = { + "/highlighting/selfHighlight/enableTaskbarFlashing", true}; + BoolSetting enableWhisperHighlight = { + "/highlighting/whisperHighlight/whispersHighlighted", true}; + BoolSetting enableWhisperHighlightSound = { + "/highlighting/whisperHighlight/enableSound", false}; + BoolSetting enableWhisperHighlightTaskbar = { + "/highlighting/whisperHighlight/enableTaskbarFlashing", false}; /// Logging BoolSetting enableLogging = {"/logging/enabled", false}; diff --git a/src/widgets/settingspages/HighlightingPage.cpp b/src/widgets/settingspages/HighlightingPage.cpp index 626bb65d0..be394b3c2 100644 --- a/src/widgets/settingspages/HighlightingPage.cpp +++ b/src/widgets/settingspages/HighlightingPage.cpp @@ -149,8 +149,6 @@ HighlightingPage::HighlightingPage() layout.append(createCheckBox(ALWAYS_PLAY, getSettings()->highlightAlwaysPlaySound)); - layout.append(createCheckBox(("Notification on whisper"), - getSettings()->highlightSoundOnWhisper)); } // ---- misc From 235f9eebf1559c476cd3c08213dc806f9bd67d28 Mon Sep 17 00:00:00 2001 From: 23rd <23rd@vivaldi.net> Date: Wed, 29 Aug 2018 02:22:57 +0300 Subject: [PATCH 13/34] Added 'this'. --- src/widgets/splits/SplitInput.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/widgets/splits/SplitInput.cpp b/src/widgets/splits/SplitInput.cpp index adf19ebcc..8c61dcd68 100644 --- a/src/widgets/splits/SplitInput.cpp +++ b/src/widgets/splits/SplitInput.cpp @@ -289,7 +289,7 @@ void SplitInput::installKeyPressedEvent() } } else if (event->key() == Qt::Key_E && event->modifiers() == Qt::ControlModifier) { - openEmotePopup(); + this->openEmotePopup(); } }); } From a36a2a2939c136120e1015fdbc0fc1d48baa7666 Mon Sep 17 00:00:00 2001 From: apa420 Date: Wed, 29 Aug 2018 01:24:35 +0200 Subject: [PATCH 14/34] fixed issue with having the wrong variable --- src/providers/twitch/TwitchMessageBuilder.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/providers/twitch/TwitchMessageBuilder.cpp b/src/providers/twitch/TwitchMessageBuilder.cpp index 73415811a..94967b8da 100644 --- a/src/providers/twitch/TwitchMessageBuilder.cpp +++ b/src/providers/twitch/TwitchMessageBuilder.cpp @@ -573,7 +573,7 @@ void TwitchMessageBuilder::parseHighlights(bool isPastMsg) if (getSettings()->enableWhisperHighlightTaskbar) { doAlert = true; } - if (getSettings()->enableSelfHighlightSound) { + if (getSettings()->enableWhisperHighlightSound) { playSound = true; } } From 9a0205bdc93ad8a2bf2ffb751b945fc33d6d083b Mon Sep 17 00:00:00 2001 From: apa420 Date: Wed, 29 Aug 2018 01:37:57 +0200 Subject: [PATCH 15/34] did request --- src/providers/twitch/TwitchMessageBuilder.cpp | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/src/providers/twitch/TwitchMessageBuilder.cpp b/src/providers/twitch/TwitchMessageBuilder.cpp index 94967b8da..5bfc77254 100644 --- a/src/providers/twitch/TwitchMessageBuilder.cpp +++ b/src/providers/twitch/TwitchMessageBuilder.cpp @@ -564,12 +564,8 @@ void TwitchMessageBuilder::parseHighlights(bool isPastMsg) } } } - if (this->args.isReceivedWhisper) { - if (getSettings()->enableWhisperHighlight) { - log("Highlight because it's a whisper", - this->args.isReceivedWhisper); - doHighlight = true; - } + if (this->args.isReceivedWhisper && + getSettings()->enableWhisperHighlight) { if (getSettings()->enableWhisperHighlightTaskbar) { doAlert = true; } From 83737996ae9d0018b442eba079832da5d74d0f7b Mon Sep 17 00:00:00 2001 From: apa420 Date: Thu, 30 Aug 2018 20:18:38 +0200 Subject: [PATCH 16/34] Fixed /mentions --- src/providers/twitch/IrcMessageHandler.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/providers/twitch/IrcMessageHandler.cpp b/src/providers/twitch/IrcMessageHandler.cpp index 9aabbc91d..467d5a59c 100644 --- a/src/providers/twitch/IrcMessageHandler.cpp +++ b/src/providers/twitch/IrcMessageHandler.cpp @@ -66,8 +66,8 @@ void IrcMessageHandler::addMessage(Communi::IrcMessage *_message, builder->flags.unset(MessageFlag::Highlighted); } - auto highlighted = builder->flags.has(MessageFlag::Highlighted); auto msg = builder.build(); + auto highlighted = msg->flags.has(MessageFlag::Highlighted); if (!isSub) { if (highlighted) { From 08b4179a445e3ce74f9f5346e40413df4d8afe33 Mon Sep 17 00:00:00 2001 From: Rasmus Karlsson Date: Sat, 1 Sep 2018 12:19:15 +0000 Subject: [PATCH 17/34] Add back "clear messages" in split functionality --- src/widgets/splits/SplitHeader.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/widgets/splits/SplitHeader.cpp b/src/widgets/splits/SplitHeader.cpp index 42656fde0..0f8b08612 100644 --- a/src/widgets/splits/SplitHeader.cpp +++ b/src/widgets/splits/SplitHeader.cpp @@ -207,7 +207,7 @@ std::unique_ptr SplitHeader::createMainMenu() menu->addSeparator(); menu->addAction("Reload channel emotes", this, SLOT(reloadChannelEmotes())); menu->addAction("Reconnect", this, SLOT(reconnect())); - // menu->addAction("Clear messages", this->split_, &Split::doClearChat); + menu->addAction("Clear messages", this->split_, &Split::clear); // menu->addSeparator(); // menu->addAction("Show changelog", this, SLOT(menuShowChangelog())); From afeb7e719bed2fa27761c5b584d3fee2a2a97e2f Mon Sep 17 00:00:00 2001 From: Rasmus Karlsson Date: Sat, 1 Sep 2018 12:32:39 +0000 Subject: [PATCH 18/34] Fix /r not working --- src/providers/twitch/IrcMessageHandler.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/providers/twitch/IrcMessageHandler.cpp b/src/providers/twitch/IrcMessageHandler.cpp index 467d5a59c..3ee2a57b6 100644 --- a/src/providers/twitch/IrcMessageHandler.cpp +++ b/src/providers/twitch/IrcMessageHandler.cpp @@ -221,10 +221,10 @@ void IrcMessageHandler::handleWhisperMessage(Communi::IrcMessage *message) false); if (!builder.isIgnored()) { - app->twitch.server->lastUserThatWhisperedMe.set(builder.userName); - MessagePtr _message = builder.build(); + app->twitch.server->lastUserThatWhisperedMe.set(builder.userName); + if (_message->flags.has(MessageFlag::Highlighted)) { app->twitch.server->mentionsChannel->addMessage(_message); } From d16307a4842e6fa43d39d7d4bd8e2ad0691b856b Mon Sep 17 00:00:00 2001 From: Rasmus Karlsson Date: Sat, 1 Sep 2018 12:33:27 +0000 Subject: [PATCH 19/34] reformat --- src/providers/twitch/TwitchMessageBuilder.cpp | 17 ++++++++++------- src/widgets/splits/SplitInput.cpp | 14 +++++++++----- 2 files changed, 19 insertions(+), 12 deletions(-) diff --git a/src/providers/twitch/TwitchMessageBuilder.cpp b/src/providers/twitch/TwitchMessageBuilder.cpp index e470f69c5..949b253c5 100644 --- a/src/providers/twitch/TwitchMessageBuilder.cpp +++ b/src/providers/twitch/TwitchMessageBuilder.cpp @@ -6,9 +6,9 @@ #include "controllers/ignores/IgnoreController.hpp" #include "debug/Log.hpp" #include "messages/Message.hpp" +#include "providers/LinkResolver.hpp" #include "providers/twitch/TwitchBadges.hpp" #include "providers/twitch/TwitchChannel.hpp" -#include "providers/LinkResolver.hpp" #include "singletons/Emotes.hpp" #include "singletons/Resources.hpp" #include "singletons/Settings.hpp" @@ -269,12 +269,15 @@ void TwitchMessageBuilder::addTextOrEmoji(const QString &string_) link = Link(Link::Url, linkString); textColor = MessageColor(MessageColor::Link); - auto linkMELowercase = this->emplace(lowercaseLinkString, - MessageElementFlag::LowercaseLink, textColor) - ->setLink(link); - auto linkMEOriginal = this->emplace(string, - MessageElementFlag::OriginalLink, textColor) - ->setLink(link); + auto linkMELowercase = + this->emplace(lowercaseLinkString, + MessageElementFlag::LowercaseLink, + textColor) + ->setLink(link); + auto linkMEOriginal = + this->emplace(string, MessageElementFlag::OriginalLink, + textColor) + ->setLink(link); LinkResolver::getLinkInfo( linkString, [linkMELowercase, linkMEOriginal](QString tooltipText) { diff --git a/src/widgets/splits/SplitInput.cpp b/src/widgets/splits/SplitInput.cpp index 6d84c0b7e..2f0606ae3 100644 --- a/src/widgets/splits/SplitInput.cpp +++ b/src/widgets/splits/SplitInput.cpp @@ -84,7 +84,8 @@ void SplitInput::initLayout() })); // open emote popup - QObject::connect(this->ui_.emoteButton, &EffectLabel::clicked, [=] { this->openEmotePopup(); }); + QObject::connect(this->ui_.emoteButton, &EffectLabel::clicked, + [=] { this->openEmotePopup(); }); // clear channelview selection when selecting in the input QObject::connect(this->ui_.textEdit, &QTextEdit::copyAvailable, @@ -180,7 +181,8 @@ void SplitInput::installKeyPressedEvent() c->sendMessage(sendMessage); // don't add duplicate messages and empty message to message history - if ((this->prevMsg_.isEmpty() || !this->prevMsg_.endsWith(message)) && + if ((this->prevMsg_.isEmpty() || + !this->prevMsg_.endsWith(message)) && !message.trimmed().isEmpty()) this->prevMsg_.append(message); @@ -189,7 +191,8 @@ void SplitInput::installKeyPressedEvent() this->currMsg_ = QString(); this->ui_.textEdit->setText(QString()); this->prevIndex_ = 0; - } else if (message == this->prevMsg_.at(this->prevMsg_.size() - 1)) { + } else if (message == + this->prevMsg_.at(this->prevMsg_.size() - 1)) { this->prevMsg_.removeLast(); } this->prevIndex_ = this->prevMsg_.size(); @@ -248,14 +251,15 @@ void SplitInput::installKeyPressedEvent() // Then simply get currMsg_. this->ui_.textEdit->setText(this->currMsg_); } else if (message != this->currMsg_) { - // If user are already in current message + // If user are already in current message // And type something new // Then replace currMsg_ with new one. this->currMsg_ = message; } // If user is already in current message // Then don't touch cursos. - cursorToEnd = (message == this->prevMsg_.at(this->prevIndex_ - 1)); + cursorToEnd = + (message == this->prevMsg_.at(this->prevIndex_ - 1)); } if (cursorToEnd) { From 4752a3a4d48764f43b7c71cf45aee8903aa4162b Mon Sep 17 00:00:00 2001 From: Rasmus Karlsson Date: Sat, 1 Sep 2018 12:47:02 +0000 Subject: [PATCH 20/34] Mark image as empty if network request fails --- src/messages/Image.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/messages/Image.cpp b/src/messages/Image.cpp index e6dcfbc8b..01edc9526 100644 --- a/src/messages/Image.cpp +++ b/src/messages/Image.cpp @@ -310,6 +310,14 @@ void Image::load() return Success; }); + req.onError([that = this, weak = weakOf(this)](auto result) -> bool { + auto shared = weak.lock(); + if (!shared) return false; + + shared->empty_ = true; + + return true; + }); req.execute(); } From eb04e1c3dfac604ecc2846b9011e1138f7349a51 Mon Sep 17 00:00:00 2001 From: Rasmus Karlsson Date: Sat, 1 Sep 2018 13:03:17 +0000 Subject: [PATCH 21/34] Fix channel badges not scaling properly --- src/providers/twitch/TwitchChannel.cpp | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/src/providers/twitch/TwitchChannel.cpp b/src/providers/twitch/TwitchChannel.cpp index d6c55d224..afc2ad366 100644 --- a/src/providers/twitch/TwitchChannel.cpp +++ b/src/providers/twitch/TwitchChannel.cpp @@ -600,12 +600,13 @@ void TwitchChannel::refreshBadges() auto jsonVersion = jsonVersion_->toObject(); auto emote = std::make_shared(Emote{ EmoteName{}, - ImageSet{Image::fromUrl( - {jsonVersion["image_url_1x"].toString()}), - Image::fromUrl( - {jsonVersion["image_url_2x"].toString()}), - Image::fromUrl( - {jsonVersion["image_url_4x"].toString()})}, + ImageSet{ + Image::fromUrl({jsonVersion["image_url_1x"].toString()}, + 1), + Image::fromUrl({jsonVersion["image_url_2x"].toString()}, + .5), + Image::fromUrl({jsonVersion["image_url_4x"].toString()}, + .25)}, Tooltip{jsonRoot["description"].toString()}, Url{jsonVersion["clickURL"].toString()}}); From a7487ab43e47b6fd3431e59c824d9050709ea5c4 Mon Sep 17 00:00:00 2001 From: Rasmus Karlsson Date: Sat, 1 Sep 2018 13:43:17 +0000 Subject: [PATCH 22/34] Temporary fix for timeouts not graying out messages properly Fix #669 --- src/common/Channel.cpp | 3 ++- src/messages/Message.hpp | 8 +++++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/src/common/Channel.cpp b/src/common/Channel.cpp index f9ac3ac50..ac1d6ea56 100644 --- a/src/common/Channel.cpp +++ b/src/common/Channel.cpp @@ -143,7 +143,8 @@ void Channel::addOrReplaceTimeout(MessagePtr message) if (s->flags.hasNone({MessageFlag::Timeout, MessageFlag::Untimeout}) && s->loginName == message->timeoutUser) { // FOURTF: disabled for now - // s->flags.EnableFlag(MessageFlag::Disabled); + // PAJLADA: Shitty solution described in Message.hpp + s->flags.set(MessageFlag::Disabled); } } diff --git a/src/messages/Message.hpp b/src/messages/Message.hpp index 7aacc47e5..5fb50f61c 100644 --- a/src/messages/Message.hpp +++ b/src/messages/Message.hpp @@ -33,7 +33,13 @@ struct Message : boost::noncopyable { Message(); ~Message(); - MessageFlags flags; + // Making this a mutable means that we can update a messages flags, + // while still keeping Message constant. This means that a message's flag + // can be updated without the renderer being made aware, which might be bad. + // This is a temporary effort until we can figure out what the right + // const-correct way to deal with this is. + // This might bring race conditions with it + mutable MessageFlags flags; QTime parseTime; QString id; QString searchText; From d0ea0f24780a176bfb529e6f50533732b02ae274 Mon Sep 17 00:00:00 2001 From: 23rd <23rd@vivaldi.net> Date: Sun, 2 Sep 2018 03:02:12 +0300 Subject: [PATCH 23/34] Clear highlights scrollbar with messages. --- src/widgets/Scrollbar.cpp | 5 +++++ src/widgets/Scrollbar.hpp | 1 + src/widgets/helper/ChannelView.cpp | 1 + 3 files changed, 7 insertions(+) diff --git a/src/widgets/Scrollbar.cpp b/src/widgets/Scrollbar.cpp index 879aa9af2..e412d9e25 100644 --- a/src/widgets/Scrollbar.cpp +++ b/src/widgets/Scrollbar.cpp @@ -55,6 +55,11 @@ void Scrollbar::unpauseHighlights() this->highlightsPaused_ = false; } +void Scrollbar::clearHighlights() +{ + this->highlights_.clear(); +} + LimitedQueueSnapshot Scrollbar::getHighlightSnapshot() { if (!this->highlightsPaused_) { diff --git a/src/widgets/Scrollbar.hpp b/src/widgets/Scrollbar.hpp index 114a1dfe6..09cbeb2c5 100644 --- a/src/widgets/Scrollbar.hpp +++ b/src/widgets/Scrollbar.hpp @@ -27,6 +27,7 @@ public: void pauseHighlights(); void unpauseHighlights(); + void clearHighlights(); void scrollToBottom(bool animate = false); bool isAtBottom() const; diff --git a/src/widgets/helper/ChannelView.cpp b/src/widgets/helper/ChannelView.cpp index 554d00bf2..d300e3e02 100644 --- a/src/widgets/helper/ChannelView.cpp +++ b/src/widgets/helper/ChannelView.cpp @@ -304,6 +304,7 @@ void ChannelView::clearMessages() { // Clear all stored messages in this chat widget this->messages.clear(); + this->scrollBar_->clearHighlights(); // Layout chat widget messages, and force an update regardless if there are // no messages From 3f4e9cdf915f483b602146e630ffacaea1be51e2 Mon Sep 17 00:00:00 2001 From: fourtf Date: Tue, 4 Sep 2018 20:09:06 +0200 Subject: [PATCH 24/34] added text for empty categories in emote popup --- src/widgets/dialogs/EmotePopup.cpp | 26 +++++++++++++++++++++----- src/widgets/splits/SplitHeader.cpp | 4 ++-- 2 files changed, 23 insertions(+), 7 deletions(-) diff --git a/src/widgets/dialogs/EmotePopup.cpp b/src/widgets/dialogs/EmotePopup.cpp index 2fe6bb28a..e04595702 100644 --- a/src/widgets/dialogs/EmotePopup.cpp +++ b/src/widgets/dialogs/EmotePopup.cpp @@ -29,11 +29,17 @@ namespace { builder->flags.set(MessageFlag::Centered); builder->flags.set(MessageFlag::DisableCompactEmotes); - for (const auto &emote : map) { - builder - .emplace(emote.second, - MessageElementFlag::AlwaysShow) - ->setLink(Link(Link::InsertText, emote.first.string)); + if (!map.empty()) { + for (const auto &emote : map) { + builder + .emplace(emote.second, + MessageElementFlag::AlwaysShow) + ->setLink(Link(Link::InsertText, emote.first.string)); + } + } else { + builder.emplace("no emotes available", + MessageElementFlag::Text, + MessageColor::System); } return builder.release(); @@ -139,6 +145,16 @@ void EmotePopup::loadChannel(ChannelPtr _channel) this->globalEmotesView_->setChannel(globalChannel); this->subEmotesView_->setChannel(subChannel); this->channelEmotesView_->setChannel(channelChannel); + + if (subChannel->getMessageSnapshot().getLength() == 0) { + MessageBuilder builder; + builder->flags.set(MessageFlag::Centered); + builder->flags.set(MessageFlag::DisableCompactEmotes); + builder.emplace("no subscription emotes available", + MessageElementFlag::Text, + MessageColor::System); + subChannel->addMessage(builder.release()); + } } void EmotePopup::loadEmojis() diff --git a/src/widgets/splits/SplitHeader.cpp b/src/widgets/splits/SplitHeader.cpp index 0f8b08612..53f64e50e 100644 --- a/src/widgets/splits/SplitHeader.cpp +++ b/src/widgets/splits/SplitHeader.cpp @@ -173,9 +173,9 @@ void SplitHeader::initializeLayout() std::unique_ptr SplitHeader::createMainMenu() { auto menu = std::make_unique(); - menu->addAction("New split", this->split_, &Split::addSibling, + menu->addAction("Add new", this->split_, &Split::addSibling, QKeySequence("Ctrl+T")); - menu->addAction("Close split", this->split_, &Split::deleteFromContainer, + menu->addAction("Close", this->split_, &Split::deleteFromContainer, QKeySequence("Ctrl+W")); menu->addAction("Change channel", this->split_, &Split::changeChannel, QKeySequence("Ctrl+R")); From 1d682c4a933dc246d42a84b84a70d438fc156141 Mon Sep 17 00:00:00 2001 From: fourtf Date: Tue, 4 Sep 2018 21:39:54 +0200 Subject: [PATCH 25/34] added add split button --- .gitignore | 2 + .../_generate_resources.cpython-36.pyc | Bin 622 -> 0 bytes resources/buttons/addSplitDark.png | Bin 0 -> 231 bytes resources/resources_autogenerated.qrc | 97 +++++++++--------- src/autogenerated/ResourcesAutogen.cpp | 1 + src/autogenerated/ResourcesAutogen.hpp | 4 +- src/widgets/Notebook.hpp | 6 +- src/widgets/dialogs/EmotePopup.cpp | 2 +- src/widgets/helper/Button.cpp | 14 ++- src/widgets/helper/Button.hpp | 4 + src/widgets/settingspages/LookPage.cpp | 8 +- src/widgets/splits/Split.cpp | 6 ++ src/widgets/splits/Split.hpp | 8 +- src/widgets/splits/SplitContainer.cpp | 25 +++++ src/widgets/splits/SplitContainer.hpp | 2 + src/widgets/splits/SplitHeader.cpp | 81 +++++++++------ src/widgets/splits/SplitHeader.hpp | 5 +- 17 files changed, 169 insertions(+), 96 deletions(-) delete mode 100644 resources/__pycache__/_generate_resources.cpython-36.pyc create mode 100644 resources/buttons/addSplitDark.png diff --git a/.gitignore b/.gitignore index 3c6ec6855..3d5ecc2b5 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,5 @@ +__pycache__/ + # C++ objects and libs *.slo diff --git a/resources/__pycache__/_generate_resources.cpython-36.pyc b/resources/__pycache__/_generate_resources.cpython-36.pyc deleted file mode 100644 index dfaf6af51e47da0c049a7c2115f8105a43375046..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 622 zcmah{yH3L}6m{FA1&c~7Y*1NYX(UujWh)_~Dl>wXDGZf~ohBlQO&(H7)lc9<_y@kE zD?h-@gi9K?0|HAv^1bKC=U!i*x7+aSojiQj0QdkqOUB?z?(|p!1rDG!r$*~eoi>~X z)f|oLj!v5sV77{mH6D#@h>-Q1u$1SC%aBNz7tAjWY}mz-WU!)aXyLWKcs&hbH_RzR z*4=F|kBG3LN*OMXA|B&O5YIxE@wn#;VL%v@h^2x^2iGTA#*!fBXaS)ck~Br*jeXij z10?dtFmRE&LCVV1K$ePjv|aN8!lJX3xI_qJ^qWa>zpYK#4D*c7*nhPtd4Dk2p1USo zz~W^2m+6h!TpcD=Q&XQ2%97oT$GLoiRl8&=K^0bPITOWh!jgRhNlT9S2fl{b=Mlr6 zoMGnSYnDD`T;T0X_pvGlPi5mQAsL&hTu;2L_N<80JY;rb{d=GUP16oEUEA06ZwVd9 AfdBvi diff --git a/resources/buttons/addSplitDark.png b/resources/buttons/addSplitDark.png new file mode 100644 index 0000000000000000000000000000000000000000..c6cd6707a0f48822655d772e187d0bad5e03af1f GIT binary patch literal 231 zcmeAS@N?(olHy`uVBq!ia0vp^8bIv8!2~3qTQA}TQY`6?zK#qG8~eHcB(eheoCO|{ z#S9FxH6YB${zKs;P*AeOHKHUqKdq!Zu_%?HATcwqL@zJ3M8QPQK+nkVqeA9XprRB{ z7srqY_qS&^@-`R - pajaDank.png - icon.png - emojidata.txt + chatterino2.icns contributors.txt - error.png emoji.json + emojidata.txt + error.png icon.ico + icon.png + pajaDank.png tlds.txt - chatterino2.icns - qss/settings.qss - __pycache__/_generate_resources.cpython-36.pyc - licenses/fmt_bsd2.txt - licenses/openssl.txt - licenses/pajlada_settings.txt - licenses/qt_lgpl-3.0.txt - licenses/pajlada_signals.txt - licenses/rapidjson.txt - licenses/websocketpp.txt - licenses/boost_boost.txt - licenses/libcommuni_BSD3.txt - settings/aboutlogo.png - settings/behave.svg - settings/accounts.svg - settings/about.svg - settings/notifications.svg - settings/commands.svg - settings/theme.svg - split/up.png - split/left.png - split/move.png - split/right.png - split/down.png - buttons/unban.png - buttons/menuDark.png - buttons/mod.png - buttons/emote.svg - buttons/modModeEnabled2.png + avatars/fourtf.png + avatars/pajlada.png + buttons/addSplitDark.png buttons/ban.png - buttons/unmod.png + buttons/banRed.png + buttons/emote.svg buttons/emoteDark.svg - buttons/updateError.png + buttons/menuDark.png + buttons/menuLight.png + buttons/mod.png buttons/modModeDisabled.png buttons/modModeDisabled2.png buttons/modModeEnabled.png - buttons/menuLight.png - buttons/update.png + buttons/modModeEnabled2.png buttons/timeout.png - buttons/banRed.png + buttons/unban.png + buttons/unmod.png + buttons/update.png + buttons/updateError.png + licenses/boost_boost.txt + licenses/emoji-data-source.txt + licenses/fmt_bsd2.txt + licenses/libcommuni_BSD3.txt + licenses/openssl.txt + licenses/pajlada_settings.txt + licenses/pajlada_signals.txt + licenses/qt_lgpl-3.0.txt + licenses/rapidjson.txt + licenses/websocketpp.txt + qss/settings.qss + settings/about.svg + settings/aboutlogo.png + settings/accounts.svg + settings/behave.svg + settings/commands.svg + settings/emote.svg + settings/notifications.svg + settings/theme.svg sounds/ping2.wav - twitch/prime.png - twitch/verified.png + split/down.png + split/left.png + split/move.png + split/right.png + split/up.png twitch/admin.png + twitch/broadcaster.png + twitch/cheer1.png + twitch/globalmod.png + twitch/moderator.png + twitch/prime.png + twitch/staff.png twitch/subscriber.png twitch/turbo.png - twitch/moderator.png - twitch/globalmod.png - twitch/cheer1.png - twitch/broadcaster.png - twitch/staff.png - avatars/fourtf.png - avatars/pajlada.png + twitch/verified.png + __pycache__/_generate_resources.cpython-36.pyc \ No newline at end of file diff --git a/src/autogenerated/ResourcesAutogen.cpp b/src/autogenerated/ResourcesAutogen.cpp index c5035f2e6..9d67608e8 100644 --- a/src/autogenerated/ResourcesAutogen.cpp +++ b/src/autogenerated/ResourcesAutogen.cpp @@ -6,6 +6,7 @@ Resources2::Resources2() { this->avatars.fourtf = QPixmap(":/avatars/fourtf.png"); this->avatars.pajlada = QPixmap(":/avatars/pajlada.png"); + this->buttons.addSplitDark = QPixmap(":/buttons/addSplitDark.png"); this->buttons.ban = QPixmap(":/buttons/ban.png"); this->buttons.banRed = QPixmap(":/buttons/banRed.png"); this->buttons.menuDark = QPixmap(":/buttons/menuDark.png"); diff --git a/src/autogenerated/ResourcesAutogen.hpp b/src/autogenerated/ResourcesAutogen.hpp index c6adb3576..4a6f9fc4b 100644 --- a/src/autogenerated/ResourcesAutogen.hpp +++ b/src/autogenerated/ResourcesAutogen.hpp @@ -3,8 +3,7 @@ namespace chatterino { -class Resources2 : public Singleton -{ +class Resources2 : public Singleton { public: Resources2(); @@ -13,6 +12,7 @@ public: QPixmap pajlada; } avatars; struct { + QPixmap addSplitDark; QPixmap ban; QPixmap banRed; QPixmap menuDark; diff --git a/src/widgets/Notebook.hpp b/src/widgets/Notebook.hpp index 022c075a2..b0cb22c9d 100644 --- a/src/widgets/Notebook.hpp +++ b/src/widgets/Notebook.hpp @@ -61,9 +61,9 @@ protected: private: struct Item { - NotebookTab *tab; - QWidget *page; - QWidget *selectedWidget = nullptr; + NotebookTab *tab{}; + QWidget *page{}; + QWidget *selectedWidget{}; }; bool containsPage(QWidget *page); diff --git a/src/widgets/dialogs/EmotePopup.cpp b/src/widgets/dialogs/EmotePopup.cpp index e04595702..0f3375121 100644 --- a/src/widgets/dialogs/EmotePopup.cpp +++ b/src/widgets/dialogs/EmotePopup.cpp @@ -112,7 +112,7 @@ void EmotePopup::loadChannel(ChannelPtr _channel) { BenchmarkGuard guard("loadChannel"); - this->setWindowTitle("Emotes from " + _channel->getName()); + this->setWindowTitle("Emotes in #" + _channel->getName()); auto twitchChannel = dynamic_cast(_channel.get()); if (twitchChannel == nullptr) return; diff --git a/src/widgets/helper/Button.cpp b/src/widgets/helper/Button.cpp index 2e035c02c..948fbc6d2 100644 --- a/src/widgets/helper/Button.cpp +++ b/src/widgets/helper/Button.cpp @@ -62,6 +62,18 @@ bool Button::getEnable() const return this->enabled_; } +void Button::setEnableMargin(bool value) +{ + this->enableMargin_ = value; + + this->update(); +} + +bool Button::getEnableMargin() const +{ + return this->enableMargin_; +} + qreal Button::getCurrentDimAmount() const { return this->dimPixmap_ && !this->mouseOver_ ? 0.7 : 1; @@ -105,7 +117,7 @@ void Button::paintEvent(QPaintEvent *) } QRect rect = this->rect(); - int s = int(6 * this->getScale()); + int s = this->enableMargin_ ? int(6 * this->getScale()) : 0; rect.moveLeft(s); rect.setRight(rect.right() - s - s); diff --git a/src/widgets/helper/Button.hpp b/src/widgets/helper/Button.hpp index e75385bcd..b7d3bffa2 100644 --- a/src/widgets/helper/Button.hpp +++ b/src/widgets/helper/Button.hpp @@ -41,6 +41,9 @@ public: void setEnable(bool value); bool getEnable() const; + void setEnableMargin(bool value); + bool getEnableMargin() const; + void setBorderColor(const QColor &color); const QColor &getBorderColor() const; @@ -73,6 +76,7 @@ private: QColor borderColor_{}; QPixmap pixmap_{}; bool dimPixmap_{true}; + bool enableMargin_{true}; QPoint mousePos_{}; double hoverMultiplier_{0.0}; QTimer effectTimer_{}; diff --git a/src/widgets/settingspages/LookPage.cpp b/src/widgets/settingspages/LookPage.cpp index eb2a9ff1c..f153fc876 100644 --- a/src/widgets/settingspages/LookPage.cpp +++ b/src/widgets/settingspages/LookPage.cpp @@ -270,12 +270,12 @@ void LookPage::addEmoteTab(LayoutCreator layout) void LookPage::addSplitHeaderTab(LayoutCreator layout) { - layout.append(this->createCheckBox("Show viewer count", - getSettings()->showViewerCount)); - layout.append(this->createCheckBox("Show title", getSettings()->showTitle)); - layout.append(this->createCheckBox("Show game", getSettings()->showGame)); layout.append( this->createCheckBox("Show uptime", getSettings()->showUptime)); + 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)); layout->addStretch(1); } diff --git a/src/widgets/splits/Split.cpp b/src/widgets/splits/Split.cpp index 01a2faaad..856e8ffd7 100644 --- a/src/widgets/splits/Split.cpp +++ b/src/widgets/splits/Split.cpp @@ -363,6 +363,12 @@ void Split::handleModifiers(Qt::KeyboardModifiers modifiers) } } +void Split::setIsTopRightSplit(bool value) +{ + this->isTopRightSplit_ = value; + this->header_->setAddButtonVisible(value); +} + /// Slots void Split::addSibling() { diff --git a/src/widgets/splits/Split.hpp b/src/widgets/splits/Split.hpp index 8c4ebf84a..6b7e6d057 100644 --- a/src/widgets/splits/Split.hpp +++ b/src/widgets/splits/Split.hpp @@ -65,6 +65,7 @@ public: void layoutMessages(); void updateGifEmotes(); void updateLastReadMessage(); + void setIsTopRightSplit(bool value); void drag(); @@ -106,10 +107,11 @@ private: NullablePtr selectChannelDialog_; - bool moderationMode_ = false; + bool moderationMode_{}; + bool isTopRightSplit_{}; - bool isMouseOver_ = false; - bool isDragging_ = false; + bool isMouseOver_{}; + bool isDragging_{}; pajlada::Signals::Connection channelIDChangedConnection_; pajlada::Signals::Connection usermodeChangedConnection_; diff --git a/src/widgets/splits/SplitContainer.cpp b/src/widgets/splits/SplitContainer.cpp index cac6f2dfb..25e932207 100644 --- a/src/widgets/splits/SplitContainer.cpp +++ b/src/widgets/splits/SplitContainer.cpp @@ -310,8 +310,33 @@ void SplitContainer::focusSplitRecursive(Node *node, Direction direction) } } +Split *SplitContainer::getTopRightSplit(Node &node) +{ + switch (node.getType()) { + case Node::_Split: + return node.getSplit(); + case Node::VerticalContainer: + if (!node.getChildren().empty()) + return getTopRightSplit(*node.getChildren().front()); + break; + case Node::HorizontalContainer: + if (!node.getChildren().empty()) + return getTopRightSplit(*node.getChildren().back()); + break; + default:; + } + return nullptr; +} + void SplitContainer::layout() { + // update top right split + auto topRight = this->getTopRightSplit(this->baseNode_); + if (this->topRight_) this->topRight_->setIsTopRightSplit(false); + this->topRight_ = topRight; + if (topRight) this->topRight_->setIsTopRightSplit(true); + + // layout this->baseNode_.geometry_ = this->rect().adjusted(-1, -1, 0, 0); std::vector _dropRects; diff --git a/src/widgets/splits/SplitContainer.hpp b/src/widgets/splits/SplitContainer.hpp index 1f0a2e701..1f90e99aa 100644 --- a/src/widgets/splits/SplitContainer.hpp +++ b/src/widgets/splits/SplitContainer.hpp @@ -219,6 +219,7 @@ private: void addSplit(Split *split); void decodeNodeRecusively(QJsonObject &obj, Node *node); + Split *getTopRightSplit(Node &node); struct DropRegion { QRect rect; @@ -239,6 +240,7 @@ private: Node baseNode_; Split *selected_; + Split *topRight_{}; NotebookTab *tab_; std::vector splits_; diff --git a/src/widgets/splits/SplitHeader.cpp b/src/widgets/splits/SplitHeader.cpp index 53f64e50e..ab90a39d4 100644 --- a/src/widgets/splits/SplitHeader.cpp +++ b/src/widgets/splits/SplitHeader.cpp @@ -92,11 +92,11 @@ namespace { title += " (live)"; // description + if (settings.showUptime) title += " - " + s.uptime; if (settings.showViewerCount) title += " - " + QString::number(s.viewerCount); - if (settings.showTitle) title += " - " + s.title; if (settings.showGame) title += " - " + s.game; - if (settings.showUptime) title += " - " + s.uptime; + if (settings.showTitle) title += " - " + s.title; return title; } @@ -137,33 +137,42 @@ SplitHeader::SplitHeader(Split *_split) void SplitHeader::initializeLayout() { - auto layout = makeLayout( - {// title - this->titleLabel = makeWidget