#pragma once #include "channel.hpp" #include "messages/limitedqueuesnapshot.hpp" #include "messages/messageref.hpp" #include "messages/word.hpp" #include "messages/wordpart.hpp" #include "widgets/chatwidgetheader.hpp" #include "widgets/chatwidgetinput.hpp" #include "widgets/chatwidgetview.hpp" #include #include #include #include #include #include namespace chatterino { namespace widgets { // 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 class ChatWidget : public QWidget { Q_OBJECT public: ChatWidget(QWidget *parent = nullptr); ~ChatWidget(); std::shared_ptr getChannel() const; std::shared_ptr &getChannelRef(); const QString &getChannelName() const; void setChannelName(const QString &name); void showChangeChannelPopup(); messages::LimitedQueueSnapshot getMessagesSnapshot(); void layoutMessages(); void updateGifEmotes(); void giveFocus(); protected: void paintEvent(QPaintEvent *) override; private: void setChannel(std::shared_ptr newChannel); void detachChannel(); messages::LimitedQueue messages; std::shared_ptr channel; QString channelName; QVBoxLayout vbox; ChatWidgetHeader header; ChatWidgetView view; ChatWidgetInput input; boost::signals2::connection messageAppendedConnection; boost::signals2::connection messageRemovedConnection; public: void load(const boost::property_tree::ptree &tree); boost::property_tree::ptree save(); public slots: // Add new split to the notebook page that this chat widget is in // Maybe we should use this chat widget as a hint to where the new split should be created void doAddSplit(); // Close current split (chat widget) void doCloseSplit(); // Show a dialog for changing the current splits/chat widgets channel void doChangeChannel(); // 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(); }; } // namespace widgets } // namespace chatterino