mirror-chatterino2/src/widgets/chatwidget.hpp

116 lines
3.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/limitedqueuesnapshot.hpp"
#include "messages/messageref.hpp"
#include "messages/word.hpp"
#include "messages/wordpart.hpp"
#include "widgets/basewidget.hpp"
2017-06-11 09:31:45 +02:00
#include "widgets/chatwidgetheader.hpp"
#include "widgets/chatwidgetinput.hpp"
#include "widgets/chatwidgetview.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-01-29 11:38:00 +01:00
#include <boost/property_tree/ptree.hpp>
#include <boost/signals2/connection.hpp>
2017-01-18 04:33:30 +01:00
2017-04-14 17:52:22 +02:00
namespace chatterino {
class ChannelManager;
class ColorScheme;
class CompletionManager;
2017-04-14 17:52:22 +02:00
namespace widgets {
2017-01-18 21:30:23 +01:00
class NotebookPage;
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
class ChatWidget : public BaseWidget
2016-12-29 17:31:07 +01:00
{
Q_OBJECT
public:
ChatWidget(ChannelManager &_channelManager, NotebookPage *parent);
2017-01-01 02:30:42 +01:00
~ChatWidget();
2016-12-29 17:31:07 +01:00
std::shared_ptr<Channel> getChannel() const;
std::shared_ptr<Channel> &getChannelRef();
2017-01-17 00:15:44 +01:00
void showChangeChannelPopup();
2017-04-12 17:46:44 +02:00
messages::LimitedQueueSnapshot<messages::SharedMessageRef> getMessagesSnapshot();
2017-07-02 14:40:36 +02:00
void layoutMessages(bool forceUpdate = false);
2017-04-12 17:46:44 +02:00
void updateGifEmotes();
void giveFocus();
pajlada::Settings::Setting<std::string> channelName;
2016-12-29 17:31:07 +01:00
protected:
virtual void paintEvent(QPaintEvent *) override;
2016-12-29 17:31:07 +01:00
public:
ChannelManager &channelManager;
CompletionManager &completionManager;
private:
void setChannel(std::shared_ptr<Channel> newChannel);
2017-05-29 21:02:01 +02:00
void detachChannel();
2017-04-12 17:46:44 +02:00
void channelNameUpdated(const std::string &newChannelName);
messages::LimitedQueue<messages::SharedMessageRef> messages;
std::shared_ptr<Channel> channel;
2017-01-18 04:33:30 +01:00
QVBoxLayout vbox;
ChatWidgetHeader header;
ChatWidgetView view;
ChatWidgetInput input;
2017-01-29 11:38:00 +01:00
boost::signals2::connection messageAppendedConnection;
boost::signals2::connection messageRemovedConnection;
2017-01-29 11:38:00 +01:00
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();
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();
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