#pragma once #include "Message.hpp" #include "types.hpp" #include "../include/Cache.hpp" #include "../include/Scrollbar.hpp" #include #include #include #include #include #include #include namespace dchat { class Channel; class MessageBoard { friend class Channel; public: MessageBoard(Channel *channel); ~MessageBoard(); void processEvent(const sf::Event &event, Cache &cache); void draw(sf::RenderWindow &window, Cache &cache); Message* getLatestMessage(); const std::vector& getMessages() const; private: usize findPositionToInsertMessageByTimestamp(Message *message); void updateStaticContentTexture(const sf::Vector2u &newSize); bool addMessage(Message *message, const odhtdb::Hash &id); void deleteMessage(const odhtdb::Hash &id, const odhtdb::Signature::PublicKey &requestedByUser); void drawDefault(sf::RenderWindow &window, Cache &cache); void drawSimple(sf::RenderWindow &window, Cache &cache); private: Channel *channel; bool dirty; std::vector messages; odhtdb::MapHash messageIdMap; 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; }; }