abaddon/components/chatmessage.hpp

126 lines
3.0 KiB
C++
Raw Normal View History

#pragma once
#include <gtkmm.h>
#include <string>
2020-09-07 06:45:46 +00:00
#include <sigc++/sigc++.h>
#include "../discord/discord.hpp"
enum class ChatDisplayType {
Unknown,
Text,
2020-09-03 05:54:40 +00:00
Embed,
2020-09-10 03:59:40 +00:00
Image,
2020-09-22 01:01:32 +00:00
GuildMemberJoin,
2020-09-22 04:07:55 +00:00
ChannelPinnedMessage,
};
// contains the username and timestamp, chat items get stuck into its box
class ChatMessageContainer : public Gtk::ListBoxRow {
public:
Snowflake UserID;
Snowflake ChannelID;
2020-09-10 03:59:40 +00:00
ChatMessageContainer(const Message *data);
void AddNewContent(Gtk::Widget *widget, bool prepend = false);
void AddNewContentAtIndex(Gtk::Widget *widget, int index);
2020-09-12 07:17:34 +00:00
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;
2020-09-10 22:28:42 +00:00
Gtk::Image *m_avatar;
};
class ChatMessageItem {
public:
2020-08-30 06:00:56 +00:00
ChatMessageItem();
Snowflake ChannelID;
Snowflake ID;
2020-08-30 06:00:56 +00:00
ChatDisplayType MessageType = ChatDisplayType::Unknown;
2020-08-29 05:14:07 +00:00
2020-08-30 06:00:56 +00:00
virtual void ShowMenu(const GdkEvent *event);
void AddMenuItem(Gtk::MenuItem *item);
virtual void Update() = 0;
2020-08-30 06:00:56 +00:00
void SetContainer(ChatMessageContainer *container);
ChatMessageContainer *GetContainer() const;
2020-08-30 06:00:56 +00:00
protected:
ChatMessageContainer *m_container = nullptr;
2020-08-30 06:00:56 +00:00
void AttachMenuHandler(Gtk::Widget *widget);
void on_menu_copy_id();
void on_menu_message_delete();
2020-08-31 02:55:36 +00:00
void on_menu_message_edit();
2020-08-30 06:00:56 +00:00
Gtk::Menu m_menu;
Gtk::MenuItem *m_menu_copy_id;
Gtk::MenuItem *m_menu_delete_message;
2020-08-31 02:55:36 +00:00
Gtk::MenuItem *m_menu_edit_message;
2020-09-07 06:45:46 +00:00
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:
2020-09-10 03:59:40 +00:00
ChatMessageTextItem(const Message *data);
2020-08-31 00:24:02 +00:00
void EditContent(std::string content);
virtual void Update();
2020-08-30 06:00:56 +00:00
protected:
2020-08-31 00:24:02 +00:00
void UpdateAttributes();
std::string m_content;
2020-08-30 06:00:56 +00:00
void on_menu_copy_content();
Gtk::MenuItem *m_menu_copy_content;
Gtk::MenuItem *m_menu_delete_message;
};
2020-09-03 05:54:40 +00:00
class ChatMessageEmbedItem
: public Gtk::EventBox
, public ChatMessageItem {
public:
2020-09-10 03:59:40 +00:00
ChatMessageEmbedItem(const Message *data);
2020-09-03 05:54:40 +00:00
virtual void Update();
2020-09-03 05:54:40 +00:00
protected:
void DoLayout();
void UpdateAttributes();
EmbedData m_embed;
Gtk::Box *m_main;
Gtk::Label *m_attrib_label = nullptr;
};
2020-09-22 01:01:32 +00:00
class ChatMessageUserEventItem
: public Gtk::EventBox
, public ChatMessageItem {
public:
ChatMessageUserEventItem(const Message *data);
virtual void Update();
protected:
Gtk::Label *m_label;
};