#pragma once #include #include #include "./texture_uploader.hpp" #include "./texture_cache.hpp" #include "./tox_avatar_loader.hpp" #include "./message_image_loader.hpp" #include "./file_selector.hpp" #include "./send_image_popup.hpp" #include "entt/container/dense_map.hpp" #include #include #include #include #include class ChatGui4 { ConfigModelI& _conf; RegistryMessageModel& _rmm; Contact3Registry& _cr; ToxAvatarLoader _tal; TextureCache _contact_tc; MessageImageLoader _mil; TextureCache _msg_tc; FileSelector _fss; SendImagePopup _sip; std::optional _selected_contact; // TODO: per contact std::string _text_input_buffer; bool _show_chat_extra_info {false}; bool _show_chat_avatar_tf {false}; float TEXT_BASE_WIDTH {1}; float TEXT_BASE_HEIGHT {1}; // mimetype -> data entt::dense_map>> _set_clipboard_data; std::mutex _set_clipboard_data_mutex; // might be called out of order friend const void* clipboard_callback(void* userdata, const char* mime_type, size_t* size); void setClipboardData(std::vector mime_types, std::shared_ptr>&& data); public: ChatGui4( ConfigModelI& conf, RegistryMessageModel& rmm, Contact3Registry& cr, TextureUploaderI& tu ); ~ChatGui4(void); public: void render(float time_delta); public: bool any_unread {false}; void sendFilePath(const char* file_path); private: void renderMessageBodyText(Message3Registry& reg, const Message3 e); void renderMessageBodyFile(Message3Registry& reg, const Message3 e); void renderMessageExtra(Message3Registry& reg, const Message3 e); void renderContactList(void); bool renderContactListContactBig(const Contact3 c, const bool selected); bool renderContactListContactSmall(const Contact3 c, const bool selected) const; bool renderSubContactListContact(const Contact3 c, const bool selected) const; void pasteFile(const char* mime_type); };