#pragma once #include #include "discord/chatsubmitparams.hpp" #include "discord/permissions.hpp" class ChatInputAttachmentItem : public Gtk::EventBox { public: ChatInputAttachmentItem(const Glib::RefPtr &file); ChatInputAttachmentItem(const Glib::RefPtr &file, const Glib::RefPtr &pb, bool is_extant = false); [[nodiscard]] Glib::RefPtr GetFile() const; [[nodiscard]] ChatSubmitParams::AttachmentType GetType() const; [[nodiscard]] std::string GetFilename() const; [[nodiscard]] bool IsTemp() const noexcept; void RemoveIfTemp(); private: void SetFilenameFromFile(); void SetupMenu(); void UpdateTooltip(); Gtk::Menu m_menu; Gtk::MenuItem m_menu_remove; Gtk::MenuItem m_menu_set_filename; Gtk::Box m_box; Gtk::Image *m_img = nullptr; Glib::RefPtr m_file; ChatSubmitParams::AttachmentType m_type; std::string m_filename; private: using type_signal_item_removed = sigc::signal; type_signal_item_removed m_signal_item_removed; public: type_signal_item_removed signal_item_removed(); }; class ChatInputAttachmentContainer : public Gtk::ScrolledWindow { public: ChatInputAttachmentContainer(); void Clear(); void ClearNoPurge(); bool AddImage(const Glib::RefPtr &pb); bool AddFile(const Glib::RefPtr &file, Glib::RefPtr pb = {}); [[nodiscard]] std::vector GetAttachments() const; private: std::vector m_attachments; Gtk::Box m_box; private: using type_signal_emptied = sigc::signal; type_signal_emptied m_signal_emptied; public: type_signal_emptied signal_emptied(); }; class ChatInputText : public Gtk::ScrolledWindow { public: ChatInputText(); void InsertText(const Glib::ustring &text); Glib::RefPtr GetBuffer(); bool ProcessKeyPress(GdkEventKey *event); protected: void on_grab_focus() override; private: Gtk::TextView m_textview; bool CheckHandleClipboardPaste(); public: using type_signal_submit = sigc::signal; using type_signal_escape = sigc::signal; using type_signal_image_paste = sigc::signal>; type_signal_submit signal_submit(); type_signal_escape signal_escape(); type_signal_image_paste signal_image_paste(); private: type_signal_submit m_signal_submit; type_signal_escape m_signal_escape; type_signal_image_paste m_signal_image_paste; }; class ChatInput : public Gtk::Box { public: ChatInput(); void InsertText(const Glib::ustring &text); Glib::RefPtr GetBuffer(); bool ProcessKeyPress(GdkEventKey *event); void AddAttachment(const Glib::RefPtr &file); void IndicateTooLarge(); void StartReplying(); void StopReplying(); private: bool AddFileAsImageAttachment(const Glib::RefPtr &file); Gtk::Revealer m_attachments_revealer; ChatInputAttachmentContainer m_attachments; ChatInputText m_input; public: using type_signal_submit = sigc::signal; using type_signal_escape = sigc::signal; using type_signal_check_permission = sigc::signal; type_signal_submit signal_submit(); type_signal_escape signal_escape(); type_signal_check_permission signal_check_permission(); private: type_signal_submit m_signal_submit; type_signal_escape m_signal_escape; type_signal_check_permission m_signal_check_permission; };