mirror of
https://github.com/Chatterino/chatterino2.git
synced 2024-11-21 22:24:07 +01:00
added toggle for moderation mode
This commit is contained in:
parent
01efa1f447
commit
e694214243
17 changed files with 136 additions and 83 deletions
BIN
resources/images/moderatormode_disabled.png
Normal file
BIN
resources/images/moderatormode_disabled.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 17 KiB |
BIN
resources/images/moderatormode_enabled.png
Normal file
BIN
resources/images/moderatormode_enabled.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 2.7 KiB |
|
@ -44,6 +44,8 @@
|
||||||
<file>images/commands.svg</file>
|
<file>images/commands.svg</file>
|
||||||
<file>images/aboutlogo.png</file>
|
<file>images/aboutlogo.png</file>
|
||||||
<file>images/about.svg</file>
|
<file>images/about.svg</file>
|
||||||
|
<file>images/moderatormode_disabled.png</file>
|
||||||
|
<file>images/moderatormode_enabled.png</file>
|
||||||
</qresource>
|
</qresource>
|
||||||
<qresource prefix="/qt/etc">
|
<qresource prefix="/qt/etc">
|
||||||
<file>qt.conf</file>
|
<file>qt.conf</file>
|
||||||
|
|
|
@ -61,7 +61,7 @@ void MessageLayout::removeFlags(Flags _flags)
|
||||||
|
|
||||||
// Layout
|
// Layout
|
||||||
// return true if redraw is required
|
// return true if redraw is required
|
||||||
bool MessageLayout::layout(int width, float scale)
|
bool MessageLayout::layout(int width, float scale, MessageElement::Flags flags)
|
||||||
{
|
{
|
||||||
auto &emoteManager = singletons::EmoteManager::getInstance();
|
auto &emoteManager = singletons::EmoteManager::getInstance();
|
||||||
|
|
||||||
|
@ -114,20 +114,20 @@ bool MessageLayout::layout(int width, float scale)
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
this->actuallyLayout(width);
|
this->actuallyLayout(width, flags);
|
||||||
this->invalidateBuffer();
|
this->invalidateBuffer();
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void MessageLayout::actuallyLayout(int width)
|
void MessageLayout::actuallyLayout(int width, MessageElement::Flags flags)
|
||||||
{
|
{
|
||||||
this->container.clear();
|
this->container.clear();
|
||||||
this->container.width = width;
|
this->container.width = width;
|
||||||
this->container.scale = this->scale;
|
this->container.scale = this->scale;
|
||||||
|
|
||||||
for (const std::unique_ptr<MessageElement> &element : this->message->getElements()) {
|
for (const std::unique_ptr<MessageElement> &element : this->message->getElements()) {
|
||||||
element->addToContainer(this->container, MessageElement::Default);
|
element->addToContainer(this->container, flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (this->height != this->container.getHeight()) {
|
if (this->height != this->container.getHeight()) {
|
||||||
|
|
|
@ -38,7 +38,7 @@ public:
|
||||||
void removeFlags(Flags flags);
|
void removeFlags(Flags flags);
|
||||||
|
|
||||||
// Layout
|
// Layout
|
||||||
bool layout(int width, float scale);
|
bool layout(int width, float scale, MessageElement::Flags flags);
|
||||||
|
|
||||||
// Painting
|
// Painting
|
||||||
void paint(QPainter &painter, int y, int messageIndex, Selection &selection);
|
void paint(QPainter &painter, int y, int messageIndex, Selection &selection);
|
||||||
|
@ -75,7 +75,7 @@ private:
|
||||||
int collapsedHeight = 32;
|
int collapsedHeight = 32;
|
||||||
|
|
||||||
// methods
|
// methods
|
||||||
void actuallyLayout(int width);
|
void actuallyLayout(int width, MessageElement::Flags flags);
|
||||||
void updateBuffer(QPixmap *pixmap, int messageIndex, Selection &selection);
|
void updateBuffer(QPixmap *pixmap, int messageIndex, Selection &selection);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -68,10 +68,6 @@ void ImageElement::addToContainer(MessageLayoutContainer &container, MessageElem
|
||||||
(new ImageLayoutElement(*this, this->image, size))->setLink(this->getLink()));
|
(new ImageLayoutElement(*this, this->image, size))->setLink(this->getLink()));
|
||||||
}
|
}
|
||||||
|
|
||||||
void ImageElement::update(UpdateFlags _flags)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
// EMOTE
|
// EMOTE
|
||||||
EmoteElement::EmoteElement(const util::EmoteData &_data, MessageElement::Flags flags)
|
EmoteElement::EmoteElement(const util::EmoteData &_data, MessageElement::Flags flags)
|
||||||
: MessageElement(flags)
|
: MessageElement(flags)
|
||||||
|
@ -106,10 +102,6 @@ void EmoteElement::addToContainer(MessageLayoutContainer &container, MessageElem
|
||||||
container.addElement((new ImageLayoutElement(*this, _image, size))->setLink(this->getLink()));
|
container.addElement((new ImageLayoutElement(*this, _image, size))->setLink(this->getLink()));
|
||||||
}
|
}
|
||||||
|
|
||||||
void EmoteElement::update(UpdateFlags _flags)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
// TEXT
|
// TEXT
|
||||||
TextElement::TextElement(const QString &text, MessageElement::Flags flags,
|
TextElement::TextElement(const QString &text, MessageElement::Flags flags,
|
||||||
const MessageColor &_color, FontStyle _style)
|
const MessageColor &_color, FontStyle _style)
|
||||||
|
@ -195,15 +187,6 @@ void TextElement::addToContainer(MessageLayoutContainer &container, MessageEleme
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void TextElement::update(UpdateFlags _flags)
|
|
||||||
{
|
|
||||||
if (_flags & UpdateFlags::Update_Text) {
|
|
||||||
for (Word &word : this->words) {
|
|
||||||
word.width = -1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// TIMESTAMP
|
// TIMESTAMP
|
||||||
TimestampElement::TimestampElement()
|
TimestampElement::TimestampElement()
|
||||||
: TimestampElement(QTime::currentTime())
|
: TimestampElement(QTime::currentTime())
|
||||||
|
@ -235,11 +218,6 @@ void TimestampElement::addToContainer(MessageLayoutContainer &container,
|
||||||
this->element->addToContainer(container, _flags);
|
this->element->addToContainer(container, _flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
void TimestampElement::update(UpdateFlags _flags)
|
|
||||||
{
|
|
||||||
this->element->update(_flags);
|
|
||||||
}
|
|
||||||
|
|
||||||
TextElement *TimestampElement::formatTime(const QTime &time)
|
TextElement *TimestampElement::formatTime(const QTime &time)
|
||||||
{
|
{
|
||||||
QString format = time.toString(singletons::SettingManager::getInstance().timestampFormat);
|
QString format = time.toString(singletons::SettingManager::getInstance().timestampFormat);
|
||||||
|
@ -256,23 +234,24 @@ TwitchModerationElement::TwitchModerationElement()
|
||||||
void TwitchModerationElement::addToContainer(MessageLayoutContainer &container,
|
void TwitchModerationElement::addToContainer(MessageLayoutContainer &container,
|
||||||
MessageElement::Flags _flags)
|
MessageElement::Flags _flags)
|
||||||
{
|
{
|
||||||
QSize size((int)(container.scale * 16), (int)(container.scale * 16));
|
qDebug() << _flags;
|
||||||
|
|
||||||
for (const singletons::ModerationAction &m :
|
if (_flags & MessageElement::ModeratorTools) {
|
||||||
singletons::SettingManager::getInstance().getModerationActions()) {
|
QSize size((int)(container.scale * 16), (int)(container.scale * 16));
|
||||||
if (m.isImage()) {
|
|
||||||
container.addElement((new ImageLayoutElement(*this, m.getImage(), size))
|
for (const singletons::ModerationAction &m :
|
||||||
->setLink(Link(Link::UserAction, m.getAction())));
|
singletons::SettingManager::getInstance().getModerationActions()) {
|
||||||
} else {
|
if (m.isImage()) {
|
||||||
container.addElement((new TextIconLayoutElement(*this, m.getLine1(), m.getLine2(),
|
container.addElement((new ImageLayoutElement(*this, m.getImage(), size))
|
||||||
container.scale, size))
|
->setLink(Link(Link::UserAction, m.getAction())));
|
||||||
->setLink(Link(Link::UserAction, m.getAction())));
|
} else {
|
||||||
|
container.addElement((new TextIconLayoutElement(*this, m.getLine1(), m.getLine2(),
|
||||||
|
container.scale, size))
|
||||||
|
->setLink(Link(Link::UserAction, m.getAction())));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void TwitchModerationElement::update(UpdateFlags _flags)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
} // namespace messages
|
} // namespace messages
|
||||||
} // namespace chatterino
|
} // namespace chatterino
|
||||||
|
|
|
@ -122,7 +122,6 @@ public:
|
||||||
Flags getFlags() const;
|
Flags getFlags() const;
|
||||||
|
|
||||||
virtual void addToContainer(MessageLayoutContainer &container, MessageElement::Flags flags) = 0;
|
virtual void addToContainer(MessageLayoutContainer &container, MessageElement::Flags flags) = 0;
|
||||||
virtual void update(UpdateFlags flags) = 0;
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
MessageElement(Flags flags);
|
MessageElement(Flags flags);
|
||||||
|
@ -144,7 +143,6 @@ public:
|
||||||
|
|
||||||
virtual void addToContainer(MessageLayoutContainer &container,
|
virtual void addToContainer(MessageLayoutContainer &container,
|
||||||
MessageElement::Flags flags) override;
|
MessageElement::Flags flags) override;
|
||||||
virtual void update(UpdateFlags flags) override;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
// contains emote data and will pick the emote based on :
|
// contains emote data and will pick the emote based on :
|
||||||
|
@ -159,7 +157,6 @@ public:
|
||||||
|
|
||||||
virtual void addToContainer(MessageLayoutContainer &container,
|
virtual void addToContainer(MessageLayoutContainer &container,
|
||||||
MessageElement::Flags flags) override;
|
MessageElement::Flags flags) override;
|
||||||
virtual void update(UpdateFlags flags) override;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
// contains a text, it will split it into words
|
// contains a text, it will split it into words
|
||||||
|
@ -181,7 +178,6 @@ public:
|
||||||
|
|
||||||
virtual void addToContainer(MessageLayoutContainer &container,
|
virtual void addToContainer(MessageLayoutContainer &container,
|
||||||
MessageElement::Flags flags) override;
|
MessageElement::Flags flags) override;
|
||||||
virtual void update(UpdateFlags flags);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
// contains a text, formated depending on the preferences
|
// contains a text, formated depending on the preferences
|
||||||
|
@ -198,7 +194,6 @@ public:
|
||||||
|
|
||||||
virtual void addToContainer(MessageLayoutContainer &container,
|
virtual void addToContainer(MessageLayoutContainer &container,
|
||||||
MessageElement::Flags flags) override;
|
MessageElement::Flags flags) override;
|
||||||
virtual void update(UpdateFlags flags);
|
|
||||||
|
|
||||||
TextElement *formatTime(const QTime &time);
|
TextElement *formatTime(const QTime &time);
|
||||||
};
|
};
|
||||||
|
@ -212,7 +207,6 @@ public:
|
||||||
|
|
||||||
virtual void addToContainer(MessageLayoutContainer &container,
|
virtual void addToContainer(MessageLayoutContainer &container,
|
||||||
MessageElement::Flags flags) override;
|
MessageElement::Flags flags) override;
|
||||||
virtual void update(UpdateFlags flags);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
// adds bits as text, static image or animated image
|
// adds bits as text, static image or animated image
|
||||||
|
|
|
@ -265,7 +265,6 @@ inline void ParseCheermoteSets(std::vector<ResourceManager::JSONCheermoteSet> &s
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
||||||
ResourceManager::ResourceManager()
|
ResourceManager::ResourceManager()
|
||||||
: badgeStaff(lli(":/images/staff_bg.png"))
|
: badgeStaff(lli(":/images/staff_bg.png"))
|
||||||
, badgeAdmin(lli(":/images/admin_bg.png"))
|
, badgeAdmin(lli(":/images/admin_bg.png"))
|
||||||
|
@ -285,6 +284,9 @@ ResourceManager::ResourceManager()
|
||||||
, cheerBadge1(lli(":/images/cheer1"))
|
, cheerBadge1(lli(":/images/cheer1"))
|
||||||
, buttonBan(lli(":/images/button_ban.png", 0.25))
|
, buttonBan(lli(":/images/button_ban.png", 0.25))
|
||||||
, buttonTimeout(lli(":/images/button_timeout.png", 0.25))
|
, buttonTimeout(lli(":/images/button_timeout.png", 0.25))
|
||||||
|
, moderationmode_enabled(lli(":/images/moderatormode_enabled"))
|
||||||
|
, moderationmode_disabled(lli(":/images/moderatormode_disabled"))
|
||||||
|
, splitHeaderContext(lli(":/images/tool_moreCollapser_off16.png"))
|
||||||
{
|
{
|
||||||
this->loadDynamicTwitchBadges();
|
this->loadDynamicTwitchBadges();
|
||||||
|
|
||||||
|
|
|
@ -36,6 +36,11 @@ public:
|
||||||
messages::Image *cheerBadge100;
|
messages::Image *cheerBadge100;
|
||||||
messages::Image *cheerBadge1;
|
messages::Image *cheerBadge1;
|
||||||
|
|
||||||
|
messages::Image *moderationmode_enabled;
|
||||||
|
messages::Image *moderationmode_disabled;
|
||||||
|
|
||||||
|
messages::Image *splitHeaderContext;
|
||||||
|
|
||||||
std::map<std::string, messages::Image *> cheerBadges;
|
std::map<std::string, messages::Image *> cheerBadges;
|
||||||
|
|
||||||
struct BadgeVersion {
|
struct BadgeVersion {
|
||||||
|
|
|
@ -153,6 +153,8 @@ void ChannelView::actuallyLayoutMessages()
|
||||||
// (this->scrollBar.isVisible() ? width() - this->scrollBar.width() : width()) - 4;
|
// (this->scrollBar.isVisible() ? width() - this->scrollBar.width() : width()) - 4;
|
||||||
int layoutWidth = LAYOUT_WIDTH;
|
int layoutWidth = LAYOUT_WIDTH;
|
||||||
|
|
||||||
|
MessageElement::Flags flags = this->getFlags();
|
||||||
|
|
||||||
// layout the visible messages in the view
|
// layout the visible messages in the view
|
||||||
if (messagesSnapshot.getLength() > start) {
|
if (messagesSnapshot.getLength() > start) {
|
||||||
int y =
|
int y =
|
||||||
|
@ -161,7 +163,7 @@ void ChannelView::actuallyLayoutMessages()
|
||||||
for (size_t i = start; i < messagesSnapshot.getLength(); ++i) {
|
for (size_t i = start; i < messagesSnapshot.getLength(); ++i) {
|
||||||
auto message = messagesSnapshot[i];
|
auto message = messagesSnapshot[i];
|
||||||
|
|
||||||
redrawRequired |= message->layout(layoutWidth, this->getDpiMultiplier());
|
redrawRequired |= message->layout(layoutWidth, this->getDpiMultiplier(), flags);
|
||||||
|
|
||||||
y += message->getHeight();
|
y += message->getHeight();
|
||||||
|
|
||||||
|
@ -177,7 +179,7 @@ void ChannelView::actuallyLayoutMessages()
|
||||||
for (int i = (int)messagesSnapshot.getLength() - 1; i >= 0; i--) {
|
for (int i = (int)messagesSnapshot.getLength() - 1; i >= 0; i--) {
|
||||||
auto *message = messagesSnapshot[i].get();
|
auto *message = messagesSnapshot[i].get();
|
||||||
|
|
||||||
message->layout(layoutWidth, this->getDpiMultiplier());
|
message->layout(layoutWidth, this->getDpiMultiplier(), flags);
|
||||||
|
|
||||||
h -= message->getHeight();
|
h -= message->getHeight();
|
||||||
|
|
||||||
|
@ -432,6 +434,21 @@ void ChannelView::setSelection(const SelectionItem &start, const SelectionItem &
|
||||||
// << max.charIndex;
|
// << max.charIndex;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
messages::MessageElement::Flags ChannelView::getFlags() const
|
||||||
|
{
|
||||||
|
MessageElement::Flags flags = MessageElement::Default;
|
||||||
|
|
||||||
|
Split *split = dynamic_cast<Split *>(this->parentWidget());
|
||||||
|
|
||||||
|
if (split != nullptr) {
|
||||||
|
if (split->getModerationMode()) {
|
||||||
|
flags = (MessageElement::Flags)(flags | MessageElement::ModeratorTools);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return flags;
|
||||||
|
}
|
||||||
|
|
||||||
void ChannelView::paintEvent(QPaintEvent * /*event*/)
|
void ChannelView::paintEvent(QPaintEvent * /*event*/)
|
||||||
{
|
{
|
||||||
// BENCH(timer);
|
// BENCH(timer);
|
||||||
|
@ -536,7 +553,8 @@ void ChannelView::wheelEvent(QWheelEvent *event)
|
||||||
if (i == 0) {
|
if (i == 0) {
|
||||||
desired = 0;
|
desired = 0;
|
||||||
} else {
|
} else {
|
||||||
snapshot[i - 1]->layout(LAYOUT_WIDTH, this->getDpiMultiplier());
|
snapshot[i - 1]->layout(LAYOUT_WIDTH, this->getDpiMultiplier(),
|
||||||
|
this->getFlags());
|
||||||
scrollFactor = 1;
|
scrollFactor = 1;
|
||||||
currentScrollLeft = snapshot[i - 1]->getHeight();
|
currentScrollLeft = snapshot[i - 1]->getHeight();
|
||||||
}
|
}
|
||||||
|
@ -558,7 +576,8 @@ void ChannelView::wheelEvent(QWheelEvent *event)
|
||||||
if (i == snapshotLength - 1) {
|
if (i == snapshotLength - 1) {
|
||||||
desired = snapshot.getLength();
|
desired = snapshot.getLength();
|
||||||
} else {
|
} else {
|
||||||
snapshot[i + 1]->layout(LAYOUT_WIDTH, this->getDpiMultiplier());
|
snapshot[i + 1]->layout(LAYOUT_WIDTH, this->getDpiMultiplier(),
|
||||||
|
this->getFlags());
|
||||||
|
|
||||||
scrollFactor = 1;
|
scrollFactor = 1;
|
||||||
currentScrollLeft = snapshot[i + 1]->getHeight();
|
currentScrollLeft = snapshot[i + 1]->getHeight();
|
||||||
|
|
|
@ -29,7 +29,7 @@ class ChannelView : public BaseWidget
|
||||||
|
|
||||||
public:
|
public:
|
||||||
explicit ChannelView(BaseWidget *parent = 0);
|
explicit ChannelView(BaseWidget *parent = 0);
|
||||||
~ChannelView();
|
virtual ~ChannelView();
|
||||||
|
|
||||||
void queueUpdate();
|
void queueUpdate();
|
||||||
Scrollbar &getScrollBar();
|
Scrollbar &getScrollBar();
|
||||||
|
@ -80,6 +80,7 @@ private:
|
||||||
|
|
||||||
void drawMessages(QPainter &painter);
|
void drawMessages(QPainter &painter);
|
||||||
void setSelection(const messages::SelectionItem &start, const messages::SelectionItem &end);
|
void setSelection(const messages::SelectionItem &start, const messages::SelectionItem &end);
|
||||||
|
messages::MessageElement::Flags getFlags() const;
|
||||||
|
|
||||||
SharedChannel channel;
|
SharedChannel channel;
|
||||||
|
|
||||||
|
|
|
@ -10,7 +10,7 @@ namespace widgets {
|
||||||
|
|
||||||
RippleEffectButton::RippleEffectButton(BaseWidget *parent)
|
RippleEffectButton::RippleEffectButton(BaseWidget *parent)
|
||||||
: BaseWidget(parent)
|
: BaseWidget(parent)
|
||||||
|
, pixmap(nullptr)
|
||||||
{
|
{
|
||||||
connect(&effectTimer, &QTimer::timeout, this, &RippleEffectButton::onMouseEffectTimeout);
|
connect(&effectTimer, &QTimer::timeout, this, &RippleEffectButton::onMouseEffectTimeout);
|
||||||
|
|
||||||
|
@ -23,11 +23,36 @@ void RippleEffectButton::setMouseEffectColor(boost::optional<QColor> color)
|
||||||
this->mouseEffectColor = color;
|
this->mouseEffectColor = color;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void RippleEffectButton::setPixmap(const QPixmap *_pixmap)
|
||||||
|
{
|
||||||
|
this->pixmap = const_cast<QPixmap *>(_pixmap);
|
||||||
|
this->update();
|
||||||
|
}
|
||||||
|
|
||||||
|
const QPixmap *RippleEffectButton::getPixmap() const
|
||||||
|
{
|
||||||
|
return this->pixmap;
|
||||||
|
}
|
||||||
|
|
||||||
void RippleEffectButton::paintEvent(QPaintEvent *)
|
void RippleEffectButton::paintEvent(QPaintEvent *)
|
||||||
{
|
{
|
||||||
QPainter painter(this);
|
QPainter painter(this);
|
||||||
|
|
||||||
|
painter.setRenderHint(QPainter::SmoothPixmapTransform);
|
||||||
|
|
||||||
this->fancyPaint(painter);
|
this->fancyPaint(painter);
|
||||||
|
|
||||||
|
if (this->pixmap != nullptr) {
|
||||||
|
QRect rect = this->rect();
|
||||||
|
int xD = 6 * this->getDpiMultiplier();
|
||||||
|
|
||||||
|
rect.moveLeft(xD);
|
||||||
|
rect.setRight(rect.right() - xD - xD);
|
||||||
|
rect.moveTop(xD);
|
||||||
|
rect.setBottom(rect.bottom() - xD - xD);
|
||||||
|
|
||||||
|
painter.drawPixmap(rect, *this->pixmap);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void RippleEffectButton::fancyPaint(QPainter &painter)
|
void RippleEffectButton::fancyPaint(QPainter &painter)
|
||||||
|
|
|
@ -31,6 +31,8 @@ public:
|
||||||
RippleEffectButton(BaseWidget *parent);
|
RippleEffectButton(BaseWidget *parent);
|
||||||
|
|
||||||
void setMouseEffectColor(boost::optional<QColor> color);
|
void setMouseEffectColor(boost::optional<QColor> color);
|
||||||
|
void setPixmap(const QPixmap *pixmap);
|
||||||
|
const QPixmap *getPixmap() const;
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
void clicked();
|
void clicked();
|
||||||
|
@ -50,6 +52,7 @@ protected:
|
||||||
void fancyPaint(QPainter &painter);
|
void fancyPaint(QPainter &painter);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
QPixmap *pixmap;
|
||||||
QPoint mousePos;
|
QPoint mousePos;
|
||||||
double hoverMultiplier = 0.0;
|
double hoverMultiplier = 0.0;
|
||||||
QTimer effectTimer;
|
QTimer effectTimer;
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
#include "widgets/helper/splitheader.hpp"
|
#include "widgets/helper/splitheader.hpp"
|
||||||
|
#include "singletons/resourcemanager.hpp"
|
||||||
#include "singletons/thememanager.hpp"
|
#include "singletons/thememanager.hpp"
|
||||||
#include "twitch/twitchchannel.hpp"
|
#include "twitch/twitchchannel.hpp"
|
||||||
#include "util/layoutcreator.hpp"
|
#include "util/layoutcreator.hpp"
|
||||||
|
@ -21,20 +22,20 @@ SplitHeader::SplitHeader(Split *_split)
|
||||||
{
|
{
|
||||||
this->setMouseTracking(true);
|
this->setMouseTracking(true);
|
||||||
|
|
||||||
|
singletons::ResourceManager &resourceManager = singletons::ResourceManager::getInstance();
|
||||||
|
|
||||||
util::LayoutCreator<SplitHeader> layoutCreator(this);
|
util::LayoutCreator<SplitHeader> layoutCreator(this);
|
||||||
auto layout = layoutCreator.emplace<QHBoxLayout>().withoutMargin();
|
auto layout = layoutCreator.emplace<QHBoxLayout>().withoutMargin();
|
||||||
{
|
{
|
||||||
// dropdown label
|
// dropdown label
|
||||||
auto dropdown = layout.emplace<RippleEffectLabel>(this).assign(&this->dropdownLabel);
|
auto dropdown = layout.emplace<RippleEffectButton>(this).assign(&this->dropdownButton);
|
||||||
dropdown->getLabel().setTextFormat(Qt::RichText);
|
|
||||||
dropdown->getLabel().setText("<img src=':/images/tool_moreCollapser_off16.png' />");
|
|
||||||
dropdown->getLabel().setScaledContents(true);
|
|
||||||
dropdown->setMouseTracking(true);
|
dropdown->setMouseTracking(true);
|
||||||
|
dropdown->setPixmap(resourceManager.splitHeaderContext->getPixmap());
|
||||||
this->addDropdownItems(dropdown.getElement());
|
this->addDropdownItems(dropdown.getElement());
|
||||||
QObject::connect(dropdown.getElement(), &RippleEffectLabel::clicked, this, [this] {
|
QObject::connect(dropdown.getElement(), &RippleEffectButton::clicked, this, [this] {
|
||||||
QTimer::singleShot(80, [&] {
|
QTimer::singleShot(80, [&] {
|
||||||
this->dropdownMenu.move(
|
this->dropdownMenu.move(
|
||||||
this->dropdownLabel->mapToGlobal(QPoint(0, this->dropdownLabel->height())));
|
this->dropdownButton->mapToGlobal(QPoint(0, this->dropdownButton->height())));
|
||||||
this->dropdownMenu.show();
|
this->dropdownMenu.show();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
@ -50,11 +51,13 @@ SplitHeader::SplitHeader(Split *_split)
|
||||||
layout->addStretch(1);
|
layout->addStretch(1);
|
||||||
|
|
||||||
// moderation mode
|
// moderation mode
|
||||||
auto moderation = layout.emplace<RippleEffectLabel>(this).assign(&this->moderationLabel);
|
auto moderator = layout.emplace<RippleEffectButton>(this).assign(&this->moderationButton);
|
||||||
moderation->setMouseTracking(true);
|
|
||||||
moderation->getLabel().setScaledContents(true);
|
QObject::connect(moderator.getElement(), &RippleEffectButton::clicked, this, [this] {
|
||||||
moderation->getLabel().setTextFormat(Qt::RichText);
|
this->split->setModerationMode(!this->split->getModerationMode());
|
||||||
moderation->getLabel().setText("<img src=':/images/moderator_bg.png' />");
|
});
|
||||||
|
|
||||||
|
this->updateModerationModeIcon();
|
||||||
}
|
}
|
||||||
|
|
||||||
// ---- misc
|
// ---- misc
|
||||||
|
@ -63,8 +66,6 @@ SplitHeader::SplitHeader(Split *_split)
|
||||||
|
|
||||||
this->updateChannelText();
|
this->updateChannelText();
|
||||||
|
|
||||||
// this->titleLabel.setAlignment(Qt::AlignCenter);
|
|
||||||
|
|
||||||
this->initializeChannelSignals();
|
this->initializeChannelSignals();
|
||||||
|
|
||||||
this->split->channelChanged.connect([this]() {
|
this->split->channelChanged.connect([this]() {
|
||||||
|
@ -77,11 +78,8 @@ SplitHeader::~SplitHeader()
|
||||||
this->onlineStatusChangedConnection.disconnect();
|
this->onlineStatusChangedConnection.disconnect();
|
||||||
}
|
}
|
||||||
|
|
||||||
void SplitHeader::addDropdownItems(RippleEffectLabel *label)
|
void SplitHeader::addDropdownItems(RippleEffectButton *label)
|
||||||
{
|
{
|
||||||
connect(this->dropdownLabel, &RippleEffectLabel::clicked, this,
|
|
||||||
&SplitHeader::leftButtonClicked);
|
|
||||||
|
|
||||||
// clang-format off
|
// clang-format off
|
||||||
this->dropdownMenu.addAction("Add new split", this->split, &Split::doAddSplit, QKeySequence(tr("Ctrl+T")));
|
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("Close split", this->split, &Split::doCloseSplit, QKeySequence(tr("Ctrl+W")));
|
||||||
|
@ -122,8 +120,8 @@ void SplitHeader::resizeEvent(QResizeEvent *event)
|
||||||
int w = 28 * getDpiMultiplier();
|
int w = 28 * getDpiMultiplier();
|
||||||
|
|
||||||
this->setFixedHeight(w);
|
this->setFixedHeight(w);
|
||||||
this->dropdownLabel->setFixedWidth(w);
|
this->dropdownButton->setFixedWidth(w);
|
||||||
this->moderationLabel->setFixedWidth(w);
|
this->moderationButton->setFixedWidth(w);
|
||||||
}
|
}
|
||||||
|
|
||||||
void SplitHeader::updateChannelText()
|
void SplitHeader::updateChannelText()
|
||||||
|
@ -156,6 +154,14 @@ void SplitHeader::updateChannelText()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SplitHeader::updateModerationModeIcon()
|
||||||
|
{
|
||||||
|
singletons::ResourceManager &resourceManager = singletons::ResourceManager::getInstance();
|
||||||
|
this->moderationButton->setPixmap(this->split->getModerationMode()
|
||||||
|
? resourceManager.moderationmode_enabled->getPixmap()
|
||||||
|
: resourceManager.moderationmode_disabled->getPixmap());
|
||||||
|
}
|
||||||
|
|
||||||
void SplitHeader::paintEvent(QPaintEvent *)
|
void SplitHeader::paintEvent(QPaintEvent *)
|
||||||
{
|
{
|
||||||
QPainter painter(this);
|
QPainter painter(this);
|
||||||
|
@ -203,10 +209,6 @@ void SplitHeader::mouseDoubleClickEvent(QMouseEvent *event)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void SplitHeader::leftButtonClicked()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
void SplitHeader::rightButtonClicked()
|
void SplitHeader::rightButtonClicked()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
@ -216,9 +218,9 @@ void SplitHeader::refreshTheme()
|
||||||
QPalette palette;
|
QPalette palette;
|
||||||
palette.setColor(QPalette::Foreground, this->themeManager.splits.header.text);
|
palette.setColor(QPalette::Foreground, this->themeManager.splits.header.text);
|
||||||
|
|
||||||
this->dropdownLabel->setPalette(palette);
|
// this->dropdownButton->setPalette(palette);
|
||||||
this->titleLabel->setPalette(palette);
|
this->titleLabel->setPalette(palette);
|
||||||
this->moderationLabel->setPalette(palette);
|
// this->moderationLabel->setPalette(palette);
|
||||||
}
|
}
|
||||||
|
|
||||||
void SplitHeader::menuMoveSplit()
|
void SplitHeader::menuMoveSplit()
|
||||||
|
|
|
@ -30,6 +30,7 @@ public:
|
||||||
|
|
||||||
// Update channel text from chat widget
|
// Update channel text from chat widget
|
||||||
void updateChannelText();
|
void updateChannelText();
|
||||||
|
void updateModerationModeIcon();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual void paintEvent(QPaintEvent *) override;
|
virtual void paintEvent(QPaintEvent *) override;
|
||||||
|
@ -47,13 +48,12 @@ private:
|
||||||
|
|
||||||
boost::signals2::connection onlineStatusChangedConnection;
|
boost::signals2::connection onlineStatusChangedConnection;
|
||||||
|
|
||||||
RippleEffectLabel *dropdownLabel;
|
RippleEffectButton *dropdownButton;
|
||||||
SignalLabel *titleLabel;
|
SignalLabel *titleLabel;
|
||||||
RippleEffectLabel *moderationLabel;
|
RippleEffectButton *moderationButton;
|
||||||
|
|
||||||
QMenu dropdownMenu;
|
QMenu dropdownMenu;
|
||||||
|
|
||||||
void leftButtonClicked();
|
|
||||||
void rightButtonClicked();
|
void rightButtonClicked();
|
||||||
|
|
||||||
virtual void refreshTheme() override;
|
virtual void refreshTheme() override;
|
||||||
|
@ -64,7 +64,7 @@ private:
|
||||||
bool isLive;
|
bool isLive;
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
void addDropdownItems(RippleEffectLabel *label);
|
void addDropdownItems(RippleEffectButton *label);
|
||||||
|
|
||||||
void menuMoveSplit();
|
void menuMoveSplit();
|
||||||
void menuReloadChannelEmotes();
|
void menuReloadChannelEmotes();
|
||||||
|
|
|
@ -52,6 +52,7 @@ Split::Split(SplitContainer *parent, const std::string &_uuid)
|
||||||
, input(this)
|
, input(this)
|
||||||
, flexSizeX(1)
|
, flexSizeX(1)
|
||||||
, flexSizeY(1)
|
, flexSizeY(1)
|
||||||
|
, moderationMode(false)
|
||||||
{
|
{
|
||||||
this->setMouseTracking(true);
|
this->setMouseTracking(true);
|
||||||
|
|
||||||
|
@ -115,6 +116,8 @@ Split::Split(SplitContainer *parent, const std::string &_uuid)
|
||||||
this->input.show();
|
this->input.show();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
this->header.updateModerationModeIcon();
|
||||||
}
|
}
|
||||||
|
|
||||||
Split::~Split()
|
Split::~Split()
|
||||||
|
@ -168,6 +171,19 @@ double Split::getFlexSizeY()
|
||||||
return this->flexSizeY;
|
return this->flexSizeY;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Split::setModerationMode(bool value)
|
||||||
|
{
|
||||||
|
if (value != this->moderationMode) {
|
||||||
|
this->moderationMode = value;
|
||||||
|
this->header.updateModerationModeIcon();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Split::getModerationMode() const
|
||||||
|
{
|
||||||
|
return this->moderationMode;
|
||||||
|
}
|
||||||
|
|
||||||
void Split::channelNameUpdated(const std::string &newChannelName)
|
void Split::channelNameUpdated(const std::string &newChannelName)
|
||||||
{
|
{
|
||||||
auto &cman = singletons::ChannelManager::getInstance();
|
auto &cman = singletons::ChannelManager::getInstance();
|
||||||
|
|
|
@ -62,6 +62,9 @@ public:
|
||||||
void setFlexSizeY(double y);
|
void setFlexSizeY(double y);
|
||||||
double getFlexSizeY();
|
double getFlexSizeY();
|
||||||
|
|
||||||
|
void setModerationMode(bool value);
|
||||||
|
bool getModerationMode() const;
|
||||||
|
|
||||||
bool showChangeChannelPopup(const char *dialogTitle, bool empty = false);
|
bool showChangeChannelPopup(const char *dialogTitle, bool empty = false);
|
||||||
void giveFocus(Qt::FocusReason reason);
|
void giveFocus(Qt::FocusReason reason);
|
||||||
bool hasFocus() const;
|
bool hasFocus() const;
|
||||||
|
@ -88,6 +91,8 @@ private:
|
||||||
double flexSizeX;
|
double flexSizeX;
|
||||||
double flexSizeY;
|
double flexSizeY;
|
||||||
|
|
||||||
|
bool moderationMode;
|
||||||
|
|
||||||
boost::signals2::connection channelIDChangedConnection;
|
boost::signals2::connection channelIDChangedConnection;
|
||||||
|
|
||||||
void setChannel(SharedChannel newChannel);
|
void setChannel(SharedChannel newChannel);
|
||||||
|
|
Loading…
Reference in a new issue