diff options
Diffstat (limited to 'components/chatmessage.hpp')
-rw-r--r-- | components/chatmessage.hpp | 132 |
1 files changed, 37 insertions, 95 deletions
diff --git a/components/chatmessage.hpp b/components/chatmessage.hpp index 91c74f1..bf4f0da 100644 --- a/components/chatmessage.hpp +++ b/components/chatmessage.hpp @@ -1,125 +1,67 @@ #pragma once #include <gtkmm.h> -#include <string> -#include <sigc++/sigc++.h> #include "../discord/discord.hpp" -enum class ChatDisplayType { - Unknown, - Text, - Embed, - Image, - GuildMemberJoin, - ChannelPinnedMessage, -}; - -// contains the username and timestamp, chat items get stuck into its box -class ChatMessageContainer : public Gtk::ListBoxRow { -public: - Snowflake UserID; - Snowflake ChannelID; - - ChatMessageContainer(const Message *data); - void AddNewContent(Gtk::Widget *widget, bool prepend = false); - void AddNewContentAtIndex(Gtk::Widget *widget, int index); - void SetAvatarFromPixbuf(Glib::RefPtr<Gdk::Pixbuf> pixbuf); - void Update(); - int RemoveItem(Gtk::Widget *widget); - -protected: - Gtk::Box *m_main_box; - Gtk::Box *m_content_box; - Gtk::Box *m_meta_box; - Gtk::Label *m_author; - Gtk::Label *m_timestamp; - Gtk::Image *m_avatar; -}; - -class ChatMessageItem { +class ChatMessageItemContainer : public Gtk::Box { public: - ChatMessageItem(); - - Snowflake ChannelID; Snowflake ID; - ChatDisplayType MessageType = ChatDisplayType::Unknown; + Snowflake ChannelID; - virtual void ShowMenu(const GdkEvent *event); - void AddMenuItem(Gtk::MenuItem *item); - virtual void Update() = 0; + ChatMessageItemContainer(); + static ChatMessageItemContainer *FromMessage(Snowflake id); - void SetContainer(ChatMessageContainer *container); - ChatMessageContainer *GetContainer() const; + // attributes = edited, deleted + void UpdateAttributes(); + void UpdateContent(); protected: - ChatMessageContainer *m_container = nullptr; - + static Gtk::TextView *CreateTextComponent(const Message *data); // Message.Content + static Gtk::EventBox *CreateEmbedComponent(const Message *data); // Message.Embeds[0] void AttachMenuHandler(Gtk::Widget *widget); - void on_menu_copy_id(); - void on_menu_message_delete(); - void on_menu_message_edit(); + void ShowMenu(GdkEvent *event); Gtk::Menu m_menu; Gtk::MenuItem *m_menu_copy_id; Gtk::MenuItem *m_menu_delete_message; Gtk::MenuItem *m_menu_edit_message; -public: - typedef sigc::signal<void, Snowflake, Snowflake> type_signal_action_message_delete; - typedef sigc::signal<void, Snowflake, Snowflake> type_signal_action_message_edit; - - type_signal_action_message_delete signal_action_message_delete(); - type_signal_action_message_edit signal_action_message_edit(); - -private: - type_signal_action_message_delete m_signal_action_message_delete; - type_signal_action_message_edit m_signal_action_message_edit; -}; - -class ChatMessageTextItem - : public Gtk::TextView // oh well - , public ChatMessageItem { -public: - ChatMessageTextItem(const Message *data); - - void EditContent(std::string content); - - virtual void Update(); - -protected: - void UpdateAttributes(); + void on_menu_copy_id(); + void on_menu_delete_message(); + void on_menu_edit_message(); - std::string m_content; + Gtk::Box *m_main; + Gtk::Label *m_attrib_label = nullptr; - void on_menu_copy_content(); - Gtk::MenuItem *m_menu_copy_content; - Gtk::MenuItem *m_menu_delete_message; -}; + Gtk::TextView *m_text_component = nullptr; + Gtk::EventBox *m_embed_component = nullptr; -class ChatMessageEmbedItem - : public Gtk::EventBox - , public ChatMessageItem { public: - ChatMessageEmbedItem(const Message *data); + typedef sigc::signal<void> type_signal_action_delete; + typedef sigc::signal<void> type_signal_action_edit; - virtual void Update(); + type_signal_action_delete signal_action_delete(); + type_signal_action_edit signal_action_edit(); -protected: - void DoLayout(); - void UpdateAttributes(); - - EmbedData m_embed; - Gtk::Box *m_main; - Gtk::Label *m_attrib_label = nullptr; +private: + type_signal_action_delete m_signal_action_delete; + type_signal_action_edit m_signal_action_edit; }; -class ChatMessageUserEventItem - : public Gtk::EventBox - , public ChatMessageItem { +class ChatMessageHeader : public Gtk::ListBoxRow { public: - ChatMessageUserEventItem(const Message *data); + Snowflake UserID; + Snowflake ChannelID; - virtual void Update(); + ChatMessageHeader(const Message *data); + void SetAvatarFromPixbuf(Glib::RefPtr<Gdk::Pixbuf> pixbuf); + void AddContent(Gtk::Widget *widget, bool prepend); + void UpdateNameColor(); protected: - Gtk::Label *m_label; + Gtk::Box *m_main_box; + Gtk::Box *m_content_box; + Gtk::Box *m_meta_box; + Gtk::Label *m_author; + Gtk::Label *m_timestamp; + Gtk::Image *m_avatar; }; |