#pragma once #include #include #include "./texture_uploader.hpp" #include "./texture_cache.hpp" #include "./tox_avatar_loader.hpp" #include "./message_image_loader.hpp" #include "./chat_gui/file_selector.hpp" #include "./chat_gui/send_image_popup.hpp" #include #include #include #include #include #include using ContactTextureCache = TextureCache; using MessageTextureCache = TextureCache; class ChatGui4 { ConfigModelI& _conf; RegistryMessageModel& _rmm; Contact3Registry& _cr; ContactTextureCache& _contact_tc; MessageTextureCache& _msg_tc; FileSelector _fss; SendImagePopup _sip; // TODO: refactor this to allow multiple open contacts 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, ContactTextureCache& contact_tc, MessageTextureCache& msg_tc ); ~ChatGui4(void); public: float 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); };