#pragma once #include "StarPane.hpp" #include "StarChatTypes.hpp" namespace Star { STAR_CLASS(UniverseClient); STAR_CLASS(TextBoxWidget); STAR_CLASS(LabelWidget); STAR_CLASS(ButtonWidget); STAR_CLASS(ImageStretchWidget); STAR_CLASS(CanvasWidget); STAR_CLASS(Chat); class Chat : public Pane { public: Chat(UniverseClientPtr client); void startChat(); void startCommand(); bool hasFocus() const override; virtual bool sendEvent(InputEvent const& event) override; void stopChat(); virtual void renderImpl() override; virtual void hide() override; virtual void update(float dt) override; void addLine(String const& text, bool showPane = true); void addMessages(List const& messages, bool showPane = true); void addHistory(String const& chat); void clear(size_t count = std::numeric_limits::max()); String currentChat() const; bool setCurrentChat(String const& chat, bool moveCursor = false); void clearCurrentChat(); ChatSendMode sendMode() const; void incrementIndex(); void decrementIndex(); float visible() const; void scrollUp(); void scrollDown(); void scrollBottom(); private: struct LogMessage { MessageContext::Mode mode; String portrait; String text; }; void updateBottomButton(); UniverseClientPtr m_client; TextBoxWidgetPtr m_textBox; LabelWidgetPtr m_say; ButtonWidgetPtr m_bottomButton; ButtonWidgetPtr m_upButton; Deque m_chatHistory; unsigned m_chatPrevIndex; int64_t m_timeChatLastActive; float m_chatVisTime; float m_fadeRate; TextStyle m_chatTextStyle; unsigned m_chatHistoryLimit; int m_historyOffset; String m_chatFormatString; CanvasWidgetPtr m_chatLog; Vec2I m_chatLogPadding; ImageStretchWidgetPtr m_background; int m_defaultHeight; int m_bodyHeight; int m_expandedBodyHeight; bool m_expanded; void updateSize(); Vec2I m_portraitTextOffset; Vec2I m_portraitImageOffset; float m_portraitScale; int m_portraitVerticalMargin; String m_portraitBackground; Map m_colorCodes; Deque m_receivedMessages; Set m_modeFilter; ChatSendMode m_sendMode; }; }