summaryrefslogtreecommitdiff
path: root/components/chatmessage.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'components/chatmessage.hpp')
-rw-r--r--components/chatmessage.hpp132
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;
};