mirror-chatterino2/src/widgets/helper/splitheader.cpp

302 lines
9.5 KiB
C++
Raw Normal View History

2017-11-12 17:21:50 +01:00
#include "widgets/helper/splitheader.hpp"
#include "application.hpp"
2018-02-05 15:11:50 +01:00
#include "providers/twitch/twitchchannel.hpp"
#include "providers/twitch/twitchserver.hpp"
2018-01-17 16:52:51 +01:00
#include "singletons/resourcemanager.hpp"
2017-12-31 00:50:07 +01:00
#include "singletons/thememanager.hpp"
2018-01-13 04:05:38 +01:00
#include "util/layoutcreator.hpp"
2017-09-15 17:23:49 +02:00
#include "util/urlfetch.hpp"
2018-01-27 21:13:22 +01:00
#include "widgets/helper/label.hpp"
2017-11-12 17:21:50 +01:00
#include "widgets/split.hpp"
#include "widgets/splitcontainer.hpp"
#include "widgets/tooltipwidget.hpp"
2017-01-01 02:30:42 +01:00
2017-01-15 16:38:30 +01:00
#include <QByteArray>
#include <QDrag>
#include <QMimeData>
#include <QPainter>
2018-01-19 14:48:17 +01:00
#ifdef USEWEBENGINE
#include "widgets/streamview.hpp"
#endif
2018-02-05 15:11:50 +01:00
using namespace chatterino::providers::twitch;
2017-04-14 17:52:22 +02:00
namespace chatterino {
namespace widgets {
2017-01-18 21:30:23 +01:00
2018-01-13 04:05:38 +01:00
SplitHeader::SplitHeader(Split *_split)
: BaseWidget(_split)
, split(_split)
2017-01-01 02:30:42 +01:00
{
auto app = getApp();
this->setMouseTracking(true);
2018-01-13 04:05:38 +01:00
util::LayoutCreator<SplitHeader> layoutCreator(this);
auto layout = layoutCreator.emplace<QHBoxLayout>().withoutMargin();
{
// dropdown label
2018-01-17 16:52:51 +01:00
auto dropdown = layout.emplace<RippleEffectButton>(this).assign(&this->dropdownButton);
2018-01-13 04:05:38 +01:00
dropdown->setMouseTracking(true);
dropdown->setPixmap(app->resources->splitHeaderContext->getPixmap());
2018-01-13 04:05:38 +01:00
this->addDropdownItems(dropdown.getElement());
2018-01-17 16:52:51 +01:00
QObject::connect(dropdown.getElement(), &RippleEffectButton::clicked, this, [this] {
2018-01-13 04:05:38 +01:00
QTimer::singleShot(80, [&] {
this->dropdownMenu.move(
2018-01-17 16:52:51 +01:00
this->dropdownButton->mapToGlobal(QPoint(0, this->dropdownButton->height())));
2018-01-13 04:05:38 +01:00
this->dropdownMenu.show();
});
});
2018-01-14 22:24:21 +01:00
layout->addStretch(1);
2018-01-13 04:05:38 +01:00
// channel name label
2018-01-27 21:13:22 +01:00
// auto title = layout.emplace<Label>(this).assign(&this->titleLabel);
2018-01-13 04:05:38 +01:00
auto title = layout.emplace<SignalLabel>().assign(&this->titleLabel);
2018-01-27 21:13:22 +01:00
title->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred);
2018-01-13 04:05:38 +01:00
title->setMouseTracking(true);
QObject::connect(this->titleLabel, &SignalLabel::mouseDoubleClick, this,
&SplitHeader::mouseDoubleClickEvent);
QObject::connect(this->titleLabel, &SignalLabel::mouseMove, this,
&SplitHeader::mouseMoveEvent);
2018-01-13 04:05:38 +01:00
2018-01-14 22:24:21 +01:00
layout->addStretch(1);
2018-01-13 04:05:38 +01:00
// moderation mode
2018-01-17 16:52:51 +01:00
auto moderator = layout.emplace<RippleEffectButton>(this).assign(&this->moderationButton);
QObject::connect(moderator.getElement(), &RippleEffectButton::clicked, this, [this] {
this->split->setModerationMode(!this->split->getModerationMode());
});
this->updateModerationModeIcon();
2018-01-13 04:05:38 +01:00
}
// ---- misc
this->layout()->setMargin(0);
2018-01-25 21:11:14 +01:00
this->scaleChangedEvent(this->getScale());
2017-06-11 09:11:55 +02:00
this->updateChannelText();
2017-01-15 16:38:30 +01:00
this->initializeChannelSignals();
2018-01-13 04:05:38 +01:00
this->split->channelChanged.connect([this]() {
this->initializeChannelSignals(); //
});
}
2018-01-13 04:05:38 +01:00
SplitHeader::~SplitHeader()
{
this->onlineStatusChangedConnection.disconnect();
}
2018-01-17 16:52:51 +01:00
void SplitHeader::addDropdownItems(RippleEffectButton *label)
2018-01-13 04:05:38 +01:00
{
// clang-format off
this->dropdownMenu.addAction("Add new split", this->split, &Split::doAddSplit, QKeySequence(tr("Ctrl+T")));
this->dropdownMenu.addAction("Close split", this->split, &Split::doCloseSplit, QKeySequence(tr("Ctrl+W")));
// this->dropdownMenu.addAction("Move split", this, SLOT(menuMoveSplit()));
2018-01-13 04:05:38 +01:00
this->dropdownMenu.addAction("Popup", this->split, &Split::doPopup);
this->dropdownMenu.addAction("Open viewer list", this->split, &Split::doOpenViewerList);
this->dropdownMenu.addSeparator();
2018-01-19 14:48:17 +01:00
#ifdef USEWEBENGINE
this->dropdownMenu.addAction("Start watching", this, [this]{
ChannelPtr _channel = this->split->getChannel();
2018-02-05 15:11:50 +01:00
TwitchChannel *tc = dynamic_cast<TwitchChannel *>(_channel.get());
2018-01-19 14:48:17 +01:00
if (tc != nullptr) {
StreamView *view = new StreamView(_channel, "https://player.twitch.tv/?channel=" + tc->name);
view->setAttribute(Qt::WA_DeleteOnClose, true);
view->show();
}
});
#endif
2018-01-13 04:05:38 +01:00
this->dropdownMenu.addAction("Change channel", this->split, &Split::doChangeChannel, QKeySequence(tr("Ctrl+R")));
this->dropdownMenu.addAction("Clear chat", this->split, &Split::doClearChat);
this->dropdownMenu.addAction("Open in web browser", this->split, &Split::doOpenChannel);
2018-01-19 14:48:17 +01:00
#ifndef USEWEBENGINE
2018-01-17 03:18:47 +01:00
this->dropdownMenu.addAction("Open web player", this->split, &Split::doOpenPopupPlayer);
2018-01-19 14:48:17 +01:00
#endif
2018-01-13 04:05:38 +01:00
this->dropdownMenu.addAction("Open in Streamlink", this->split, &Split::doOpenStreamlink);
this->dropdownMenu.addSeparator();
this->dropdownMenu.addAction("Reload channel emotes", this, SLOT(menuReloadChannelEmotes()));
this->dropdownMenu.addAction("Manual reconnect", this, SLOT(menuManualReconnect()));
this->dropdownMenu.addSeparator();
this->dropdownMenu.addAction("Show changelog", this, SLOT(menuShowChangelog()));
// clang-format on
}
2017-11-12 17:21:50 +01:00
void SplitHeader::initializeChannelSignals()
{
// Disconnect any previous signal first
this->onlineStatusChangedConnection.disconnect();
2018-01-13 04:05:38 +01:00
auto channel = this->split->getChannel();
2018-02-05 15:11:50 +01:00
TwitchChannel *twitchChannel = dynamic_cast<TwitchChannel *>(channel.get());
if (twitchChannel) {
this->managedConnections.emplace_back(twitchChannel->updateLiveInfo.connect([this]() {
this->updateChannelText(); //
}));
}
2017-01-15 16:38:30 +01:00
}
2018-01-25 21:11:14 +01:00
void SplitHeader::scaleChangedEvent(float scale)
2017-09-22 00:50:43 +02:00
{
2018-01-25 21:11:14 +01:00
int w = 28 * scale;
2018-01-13 04:05:38 +01:00
this->setFixedHeight(w);
2018-01-17 16:52:51 +01:00
this->dropdownButton->setFixedWidth(w);
this->moderationButton->setFixedWidth(w);
2018-01-27 21:13:22 +01:00
// this->titleLabel->setFont(
// singletons::FontManager::getInstance().getFont(FontStyle::Medium, scale));
2017-09-22 00:50:43 +02:00
}
2017-11-12 17:21:50 +01:00
void SplitHeader::updateChannelText()
2017-01-17 00:15:44 +01:00
{
auto indirectChannel = this->split->getIndirectChannel();
2018-04-20 19:54:45 +02:00
auto channel = this->split->getChannel();
QString title = channel->name;
if (indirectChannel.getType() == Channel::TwitchWatching) {
title = "watching: " + (title.isEmpty() ? "none" : title);
}
TwitchChannel *twitchChannel = dynamic_cast<TwitchChannel *>(channel.get());
2017-09-22 00:50:43 +02:00
if (twitchChannel != nullptr) {
const auto &streamStatus = twitchChannel->GetStreamStatus();
if (streamStatus.live) {
this->isLive = true;
this->tooltip = "<style>.center { text-align: center; }</style>"
"<p class = \"center\">" +
streamStatus.title + "<br><br>" + streamStatus.game + "<br>" +
(streamStatus.rerun ? "Vod-casting" : "Live") + " for " +
streamStatus.uptime + " with " +
QString::number(streamStatus.viewerCount) +
2018-01-13 04:05:38 +01:00
" viewers"
"</p>";
if (streamStatus.rerun) {
title += " (rerun)";
} else {
title += " (live)";
}
}
}
if (title.isEmpty()) {
title = "<empty>";
}
this->isLive = false;
this->titleLabel->setText(title);
this->tooltip = "";
2017-01-17 00:15:44 +01:00
}
2018-01-17 16:52:51 +01:00
void SplitHeader::updateModerationModeIcon()
{
auto app = getApp();
2018-01-17 16:52:51 +01:00
this->moderationButton->setPixmap(this->split->getModerationMode()
? app->resources->moderationmode_enabled->getPixmap()
: app->resources->moderationmode_disabled->getPixmap());
2018-01-17 17:17:26 +01:00
2018-01-17 18:36:12 +01:00
bool modButtonVisible = false;
ChannelPtr channel = this->split->getChannel();
2018-01-17 18:36:12 +01:00
2018-02-05 15:11:50 +01:00
TwitchChannel *tc = dynamic_cast<TwitchChannel *>(channel.get());
2018-01-17 18:36:12 +01:00
if (tc != nullptr && tc->hasModRights()) {
modButtonVisible = true;
}
this->moderationButton->setVisible(modButtonVisible);
2018-01-17 16:52:51 +01:00
}
2017-11-12 17:21:50 +01:00
void SplitHeader::paintEvent(QPaintEvent *)
2017-01-01 02:30:42 +01:00
{
QPainter painter(this);
painter.fillRect(rect(), this->themeManager->splits.header.background);
painter.setPen(this->themeManager->splits.header.border);
2017-01-01 02:30:42 +01:00
painter.drawRect(0, 0, width() - 1, height() - 1);
}
2017-11-12 17:21:50 +01:00
void SplitHeader::mousePressEvent(QMouseEvent *event)
2017-01-01 02:30:42 +01:00
{
2017-06-11 09:11:55 +02:00
this->dragging = true;
2017-01-01 02:30:42 +01:00
2017-06-11 09:11:55 +02:00
this->dragStart = event->pos();
2017-01-01 02:30:42 +01:00
}
2017-11-12 17:21:50 +01:00
void SplitHeader::mouseMoveEvent(QMouseEvent *event)
2017-01-01 02:30:42 +01:00
{
if (!this->dragging && this->isLive) {
auto tooltipWidget = TooltipWidget::getInstance();
tooltipWidget->moveTo(this, event->globalPos());
tooltipWidget->setText(tooltip);
tooltipWidget->show();
}
2018-05-10 19:50:31 +02:00
// if (this->dragging) {
// if (std::abs(this->dragStart.x() - event->pos().x()) > 12 ||
// std::abs(this->dragStart.y() - event->pos().y()) > 12) {
// this->split->drag();
// this->dragging = false;
// }
// }
2017-01-01 02:30:42 +01:00
}
void SplitHeader::leaveEvent(QEvent *event)
{
TooltipWidget::getInstance()->hide();
BaseWidget::leaveEvent(event);
}
2017-11-12 17:21:50 +01:00
void SplitHeader::mouseDoubleClickEvent(QMouseEvent *event)
2017-01-17 00:15:44 +01:00
{
if (event->button() == Qt::LeftButton) {
2018-01-13 04:05:38 +01:00
this->split->doChangeChannel();
2017-01-17 00:15:44 +01:00
}
}
2017-11-12 17:21:50 +01:00
void SplitHeader::rightButtonClicked()
2017-01-15 16:38:30 +01:00
{
}
2018-01-25 20:49:49 +01:00
void SplitHeader::themeRefreshEvent()
{
QPalette palette;
palette.setColor(QPalette::Foreground, this->themeManager->splits.header.text);
2018-01-17 16:52:51 +01:00
// this->dropdownButton->setPalette(palette);
2018-01-13 04:05:38 +01:00
this->titleLabel->setPalette(palette);
2018-01-17 16:52:51 +01:00
// this->moderationLabel->setPalette(palette);
}
2017-11-12 17:21:50 +01:00
void SplitHeader::menuMoveSplit()
2017-01-15 16:38:30 +01:00
{
}
2017-11-12 17:21:50 +01:00
void SplitHeader::menuReloadChannelEmotes()
2017-01-15 16:38:30 +01:00
{
}
2017-11-12 17:21:50 +01:00
void SplitHeader::menuManualReconnect()
2017-01-15 16:38:30 +01:00
{
auto app = getApp();
2018-02-05 15:11:50 +01:00
// fourtf: connection
app->twitch.server->connect();
2017-01-15 16:38:30 +01:00
}
2017-11-12 17:21:50 +01:00
void SplitHeader::menuShowChangelog()
2017-01-15 16:38:30 +01:00
{
}
} // namespace widgets
} // namespace chatterino