From 44b7989f50d458a8d60024f29e225e40a106d927 Mon Sep 17 00:00:00 2001 From: ouwou <26526779+ouwou@users.noreply.github.com> Date: Sun, 30 Aug 2020 20:24:02 -0400 Subject: add MESSAGE_UPDATE --- components/chatmessage.cpp | 32 +++++++++++++++++++++++++++++--- components/chatmessage.hpp | 12 ++++++++++++ components/chatwindow.cpp | 26 ++++++++++++++++++++++++++ components/chatwindow.hpp | 4 ++++ 4 files changed, 71 insertions(+), 3 deletions(-) (limited to 'components') 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, " [deleted]"); + + if (deleted) { + buf->insert_markup(end, " [deleted]"); + } else if (edited) { + buf->insert_markup(end, " [edited]"); + } } 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 guard(m_update_mutex); + m_message_edit_queue.push(id); + m_message_edit_dispatch.emit(); +} + void ChatWindow::ClearMessages() { std::scoped_lock guard(m_update_mutex); m_message_set_queue.push(std::unordered_set()); @@ -241,6 +248,25 @@ void ChatWindow::DeleteMessageInternal() { item->MarkAsDeleted(); } +void ChatWindow::UpdateMessageContentInternal() { + Snowflake id; + { + std::scoped_lock 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(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 &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> m_new_history_queue; Glib::Dispatcher m_message_delete_dispatch; std::queue m_message_delete_queue; + Glib::Dispatcher m_message_edit_dispatch; + std::queue m_message_edit_queue; std::mutex m_update_mutex; Snowflake m_active_channel; -- cgit v1.2.3