#pragma once #include "types.hpp" #include "Message.hpp" #include "Scrollbar.hpp" #include #include #include #include #include #include #include #include namespace dchat { class Room; struct RoomMessage; class Cache; class User; class MessageBoard { public: MessageBoard(std::shared_ptr room); ~MessageBoard(); void processEvent(const sf::Event &event, Cache *cache); void draw(sf::RenderWindow &window, Cache *cache); bool addMessage(Message *message); void deleteMessage(const odhtdb::Hash &id, const odhtdb::Signature::PublicKey &requestedByUser); void addOfflineUserMessage(std::string msg, bool plainText); void addSystemUserMessage(std::string msg, bool plainText); private: usize findPositionToInsertMessageByTimestamp(Message *message); void updateStaticContentTexture(const sf::Vector2u &newSize); void drawDefault(sf::RenderWindow &window, Cache *cache); void drawSimple(sf::RenderWindow &window, Cache *cache); private: std::shared_ptr room; bool dirty; odhtdb::MapHash messageIdMap; std::vector messages; double scroll; double scrollSpeed; double totalHeight; sf::Clock frameTimer; bool scrollToBottom; sf::Vector2f backgroundSizeWithoutPadding; sf::Vector2f backgroundSize; sf::Vector2f backgroundPos; std::mutex messageProcessMutex; usize visibleMessageStartIndex; usize visibleMessageEndIndex; Scrollbar scrollbar; std::shared_ptr offlineUser; std::shared_ptr systemUser; }; }