mirror-chatterino2/src/widgets/split.hpp

154 lines
4.1 KiB
C++
Raw Normal View History

#pragma once
2016-12-29 17:31:07 +01:00
2017-06-11 09:31:45 +02:00
#include "channel.hpp"
#include "messages/layouts/messagelayout.hpp"
#include "messages/layouts/messagelayoutelement.hpp"
2017-06-11 09:31:45 +02:00
#include "messages/limitedqueuesnapshot.hpp"
#include "messages/messageelement.hpp"
2018-02-05 15:11:50 +01:00
#include "util/serialize-custom.hpp"
#include "widgets/basewidget.hpp"
2017-11-12 17:21:50 +01:00
#include "widgets/helper/channelview.hpp"
#include "widgets/helper/rippleeffectlabel.hpp"
#include "widgets/helper/splitheader.hpp"
#include "widgets/helper/splitinput.hpp"
2017-01-01 02:30:42 +01:00
2017-01-18 04:33:30 +01:00
#include <QFont>
#include <QShortcut>
2017-01-18 04:33:30 +01:00
#include <QVBoxLayout>
#include <QWidget>
2017-04-14 17:52:22 +02:00
namespace chatterino {
namespace widgets {
2017-01-18 21:30:23 +01:00
2017-11-12 17:21:50 +01:00
class SplitContainer;
2018-04-06 16:37:30 +02:00
class xD
{
};
2017-06-10 22:48:28 +02:00
// Each ChatWidget consists of three sub-elements that handle their own part of the chat widget:
// ChatWidgetHeader
// - Responsible for rendering which channel the ChatWidget is in, and the menu in the top-left of
// the chat widget
// ChatWidgetView
// - Responsible for rendering all chat messages, and the scrollbar
// ChatWidgetInput
// - Responsible for rendering and handling user text input
//
// Each sub-element has a reference to the parent Chat Widget
2017-11-12 17:21:50 +01:00
class Split : public BaseWidget
2016-12-29 17:31:07 +01:00
{
2017-11-12 17:21:50 +01:00
friend class SplitInput;
2017-09-21 02:20:02 +02:00
2016-12-29 17:31:07 +01:00
Q_OBJECT
public:
explicit Split(SplitContainer *parent);
explicit Split(BaseWidget *widget);
explicit Split(singletons::ThemeManager &manager, QWidget *parent);
~Split() override;
2017-11-12 17:21:50 +01:00
pajlada::Signals::NoArgSignal channelChanged;
2016-12-29 17:31:07 +01:00
ChannelView &getChannelView()
{
return this->view;
}
2018-04-20 19:54:45 +02:00
IndirectChannel getIndirectChannel();
ChannelPtr getChannel();
void setChannel(IndirectChannel newChannel);
2017-11-12 17:21:50 +01:00
void setFlexSizeX(double x);
double getFlexSizeX();
void setFlexSizeY(double y);
double getFlexSizeY();
2017-01-17 00:15:44 +01:00
2018-01-17 16:52:51 +01:00
void setModerationMode(bool value);
bool getModerationMode() const;
2018-04-18 09:12:29 +02:00
void showChangeChannelPopup(const char *dialogTitle, bool empty,
std::function<void(bool)> callback);
void giveFocus(Qt::FocusReason reason);
bool hasFocus() const;
void layoutMessages();
void updateGifEmotes();
2018-01-23 22:48:33 +01:00
void updateLastReadMessage();
void drag();
bool isInContainer() const;
2016-12-29 17:31:07 +01:00
protected:
2018-04-07 12:53:10 +02:00
void paintEvent(QPaintEvent *event) override;
void mouseMoveEvent(QMouseEvent *event) override;
void mousePressEvent(QMouseEvent *event) override;
2018-04-07 12:53:10 +02:00
void keyPressEvent(QKeyEvent *event) override;
void keyReleaseEvent(QKeyEvent *event) override;
2016-12-29 17:31:07 +01:00
private:
SplitContainer *container;
2018-04-20 19:54:45 +02:00
IndirectChannel channel;
2017-01-18 04:33:30 +01:00
QVBoxLayout vbox;
2017-11-12 17:21:50 +01:00
SplitHeader header;
ChannelView view;
2017-11-12 17:21:50 +01:00
SplitInput input;
double flexSizeX = 1;
double flexSizeY = 1;
2017-01-29 11:38:00 +01:00
bool moderationMode = false;
2018-01-17 16:52:51 +01:00
pajlada::Signals::Connection channelIDChangedConnection;
pajlada::Signals::Connection usermodeChangedConnection;
2018-04-20 19:54:45 +02:00
pajlada::Signals::Connection indirectChannelChangedConnection;
2017-11-12 17:21:50 +01:00
void doOpenAccountPopupWidget(AccountPopupWidget *widget, QString user);
2018-02-05 15:11:50 +01:00
void channelNameUpdated(const QString &newChannelName);
void handleModifiers(QEvent *event, Qt::KeyboardModifiers modifiers);
public slots:
// Add new split to the notebook page that this chat widget is in
// This is only activated from the menu now. Hotkey is handled in Notebook
void doAddSplit();
// Close current split (chat widget)
void doCloseSplit();
// Show a dialog for changing the current splits/chat widgets channel
void doChangeChannel();
2017-06-11 09:11:55 +02:00
// Open popup copy of this chat widget
// XXX: maybe make current chatwidget a popup instead?
void doPopup();
// Clear chat from all messages
void doClearChat();
// Open link to twitch channel in default browser
void doOpenChannel();
// Open popup player of twitch channel in default browser
void doOpenPopupPlayer();
// Open twitch channel stream through streamlink
void doOpenStreamlink();
2017-09-12 19:06:16 +02:00
// Copy text from chat
void doCopy();
2018-01-05 13:42:23 +01:00
// Open a search popup
void doSearch();
// Open viewer list of the channel
void doOpenViewerList();
2017-11-12 17:21:50 +01:00
void doIncFlexX();
void doDecFlexX();
void doIncFlexY();
void doDecFlexY();
2016-12-29 17:31:07 +01:00
};
2017-01-29 11:38:00 +01:00
2017-04-14 17:52:22 +02:00
} // namespace widgets
} // namespace chatterino