diff options
author | ouwou <26526779+ouwou@users.noreply.github.com> | 2020-08-30 20:24:02 -0400 |
---|---|---|
committer | ouwou <26526779+ouwou@users.noreply.github.com> | 2020-08-30 20:24:02 -0400 |
commit | 44b7989f50d458a8d60024f29e225e40a106d927 (patch) | |
tree | 24bafb2f31d12b36ce488cee351f335015e5bd20 /components | |
parent | 4e7e5a30632b76ccc53255532ba9a6549084e498 (diff) | |
download | abaddon-portaudio-44b7989f50d458a8d60024f29e225e40a106d927.tar.gz abaddon-portaudio-44b7989f50d458a8d60024f29e225e40a106d927.zip |
add MESSAGE_UPDATE
Diffstat (limited to 'components')
-rw-r--r-- | components/chatmessage.cpp | 32 | ||||
-rw-r--r-- | components/chatmessage.hpp | 12 | ||||
-rw-r--r-- | components/chatwindow.cpp | 26 | ||||
-rw-r--r-- | components/chatwindow.hpp | 4 |
4 files changed, 71 insertions, 3 deletions
diff --git a/components/chatmessage.cpp b/components/chatmessage.cpp index 6ac4a99..c7cf21b 100644 --- a/components/chatmessage.cpp +++ b/components/chatmessage.cpp @@ -104,6 +104,8 @@ void ChatMessageItem::AddMenuItem(Gtk::MenuItem *item) { } ChatMessageTextItem::ChatMessageTextItem(const MessageData *data) { + m_content = data->Content; + set_can_focus(false); set_editable(false); set_wrap_mode(Gtk::WRAP_WORD_CHAR); @@ -118,14 +120,38 @@ ChatMessageTextItem::ChatMessageTextItem(const MessageData *data) { m_menu_copy_content->signal_activate().connect(sigc::mem_fun(*this, &ChatMessageTextItem::on_menu_copy_content)); } +void ChatMessageTextItem::EditContent(std::string content) { + m_content = content; + get_buffer()->set_text(content); + UpdateAttributes(); +} + void ChatMessageTextItem::on_menu_copy_content() { - auto *data = m_abaddon->GetDiscordClient().GetMessage(ID); - Gtk::Clipboard::get()->set_text(data->Content); + Gtk::Clipboard::get()->set_text(m_content); } void ChatMessageTextItem::MarkAsDeleted() { + m_was_deleted = true; + UpdateAttributes(); +} + +void ChatMessageTextItem::MarkAsEdited() { + m_was_edited = true; + UpdateAttributes(); +} + +void ChatMessageTextItem::UpdateAttributes() { + bool deleted = m_was_deleted; + bool edited = m_was_edited && !m_was_deleted; + auto buf = get_buffer(); + buf->set_text(m_content); Gtk::TextBuffer::iterator start, end; buf->get_bounds(start, end); - buf->insert_markup(end, "<span color='#ff0000'> [deleted]</span>"); + + if (deleted) { + buf->insert_markup(end, "<span color='#ff0000'> [deleted]</span>"); + } else if (edited) { + buf->insert_markup(end, "<span color='#999999'> [edited]</span>"); + } } diff --git a/components/chatmessage.hpp b/components/chatmessage.hpp index dc967af..82f4504 100644 --- a/components/chatmessage.hpp +++ b/components/chatmessage.hpp @@ -37,6 +37,7 @@ public: virtual void ShowMenu(const GdkEvent *event); void AddMenuItem(Gtk::MenuItem *item); virtual void MarkAsDeleted() = 0; + virtual void MarkAsEdited() = 0; protected: void AttachMenuHandler(Gtk::Widget *widget); @@ -55,9 +56,20 @@ class ChatMessageTextItem , public ChatMessageItem { public: ChatMessageTextItem(const MessageData *data); + + void EditContent(std::string content); + virtual void MarkAsDeleted(); + virtual void MarkAsEdited(); protected: + void UpdateAttributes(); + + std::string m_content; + + bool m_was_deleted = false; + bool m_was_edited = false; + void on_menu_copy_content(); Gtk::MenuItem *m_menu_copy_content; Gtk::MenuItem *m_menu_delete_message; diff --git a/components/chatwindow.cpp b/components/chatwindow.cpp index 647d5b2..e3ceb88 100644 --- a/components/chatwindow.cpp +++ b/components/chatwindow.cpp @@ -7,6 +7,7 @@ ChatWindow::ChatWindow() { m_new_message_dispatch.connect(sigc::mem_fun(*this, &ChatWindow::AddNewMessageInternal)); m_new_history_dispatch.connect(sigc::mem_fun(*this, &ChatWindow::AddNewHistoryInternal)); m_message_delete_dispatch.connect(sigc::mem_fun(*this, &ChatWindow::DeleteMessageInternal)); + m_message_edit_dispatch.connect(sigc::mem_fun(*this, &ChatWindow::UpdateMessageContentInternal)); m_main = Gtk::manage(new Gtk::Box(Gtk::ORIENTATION_VERTICAL)); m_listbox = Gtk::manage(new Gtk::ListBox); @@ -182,6 +183,12 @@ void ChatWindow::DeleteMessage(Snowflake id) { m_message_delete_dispatch.emit(); } +void ChatWindow::UpdateMessageContent(Snowflake id) { + std::scoped_lock<std::mutex> guard(m_update_mutex); + m_message_edit_queue.push(id); + m_message_edit_dispatch.emit(); +} + void ChatWindow::ClearMessages() { std::scoped_lock<std::mutex> guard(m_update_mutex); m_message_set_queue.push(std::unordered_set<const MessageData *>()); @@ -241,6 +248,25 @@ void ChatWindow::DeleteMessageInternal() { item->MarkAsDeleted(); } +void ChatWindow::UpdateMessageContentInternal() { + Snowflake id; + { + std::scoped_lock<std::mutex> guard(m_update_mutex); + id = m_message_edit_queue.front(); + m_message_edit_queue.pop(); + } + + if (m_id_to_widget.find(id) == m_id_to_widget.end()) + return; + + auto *msg = m_abaddon->GetDiscordClient().GetMessage(id); + auto *item = dynamic_cast<ChatMessageTextItem *>(m_id_to_widget.at(id)); + if (item != nullptr) { + item->EditContent(msg->Content); + item->MarkAsEdited(); + } +} + void ChatWindow::SetMessagesInternal() { auto children = m_listbox->get_children(); auto it = children.begin(); diff --git a/components/chatwindow.hpp b/components/chatwindow.hpp index 5054a85..f5342e9 100644 --- a/components/chatwindow.hpp +++ b/components/chatwindow.hpp @@ -19,6 +19,7 @@ public: void AddNewMessage(Snowflake id); void AddNewHistory(const std::vector<MessageData> &msgs); void DeleteMessage(Snowflake id); + void UpdateMessageContent(Snowflake id); void ClearMessages(); protected: @@ -27,6 +28,7 @@ protected: void AddNewMessageInternal(); void AddNewHistoryInternal(); void DeleteMessageInternal(); + void UpdateMessageContentInternal(); ChatDisplayType GetMessageDisplayType(const MessageData *data); void ProcessMessage(const MessageData *data, bool prepend = false); int m_num_rows = 0; // youd think thered be a Gtk::ListBox::get_row_count or something but nope @@ -45,6 +47,8 @@ protected: std::queue<std::vector<Snowflake>> m_new_history_queue; Glib::Dispatcher m_message_delete_dispatch; std::queue<Snowflake> m_message_delete_queue; + Glib::Dispatcher m_message_edit_dispatch; + std::queue<Snowflake> m_message_edit_queue; std::mutex m_update_mutex; Snowflake m_active_channel; |