forked from OpenGamers/abaddon
move chat message menu into the chatlist
This commit is contained in:
@@ -544,6 +544,7 @@ void Abaddon::ActionChatDeleteMessage(Snowflake channel_id, Snowflake id) {
|
|||||||
|
|
||||||
void Abaddon::ActionChatEditMessage(Snowflake channel_id, Snowflake id) {
|
void Abaddon::ActionChatEditMessage(Snowflake channel_id, Snowflake id) {
|
||||||
const auto msg = m_discord.GetMessage(id);
|
const auto msg = m_discord.GetMessage(id);
|
||||||
|
if (!msg.has_value()) return;
|
||||||
EditMessageDialog dlg(*m_main_window);
|
EditMessageDialog dlg(*m_main_window);
|
||||||
dlg.SetContent(msg->Content);
|
dlg.SetContent(msg->Content);
|
||||||
auto response = dlg.run();
|
auto response = dlg.run();
|
||||||
|
|||||||
@@ -29,6 +29,40 @@ ChatList::ChatList() {
|
|||||||
add(m_list);
|
add(m_list);
|
||||||
|
|
||||||
m_list.show();
|
m_list.show();
|
||||||
|
|
||||||
|
m_menu_copy_id = Gtk::manage(new Gtk::MenuItem("Copy ID"));
|
||||||
|
m_menu_copy_id->signal_activate().connect([this] {
|
||||||
|
Gtk::Clipboard::get()->set_text(std::to_string(m_menu_selected_message));
|
||||||
|
});
|
||||||
|
m_menu.append(*m_menu_copy_id);
|
||||||
|
|
||||||
|
m_menu_delete_message = Gtk::manage(new Gtk::MenuItem("Delete Message"));
|
||||||
|
m_menu_delete_message->signal_activate().connect([this] {
|
||||||
|
m_signal_action_message_delete.emit(m_active_channel, m_menu_selected_message);
|
||||||
|
});
|
||||||
|
m_menu.append(*m_menu_delete_message);
|
||||||
|
|
||||||
|
m_menu_edit_message = Gtk::manage(new Gtk::MenuItem("Edit Message"));
|
||||||
|
m_menu_edit_message->signal_activate().connect([this] {
|
||||||
|
m_signal_action_message_edit.emit(m_active_channel, m_menu_selected_message);
|
||||||
|
});
|
||||||
|
m_menu.append(*m_menu_edit_message);
|
||||||
|
|
||||||
|
m_menu_copy_content = Gtk::manage(new Gtk::MenuItem("Copy Content"));
|
||||||
|
m_menu_copy_content->signal_activate().connect([this] {
|
||||||
|
const auto msg = Abaddon::Get().GetDiscordClient().GetMessage(m_menu_selected_message);
|
||||||
|
if (msg.has_value())
|
||||||
|
Gtk::Clipboard::get()->set_text(msg->Content);
|
||||||
|
});
|
||||||
|
m_menu.append(*m_menu_copy_content);
|
||||||
|
|
||||||
|
m_menu_reply_to = Gtk::manage(new Gtk::MenuItem("Reply To"));
|
||||||
|
m_menu_reply_to->signal_activate().connect([this] {
|
||||||
|
m_signal_action_reply_to.emit(m_menu_selected_message);
|
||||||
|
});
|
||||||
|
m_menu.append(*m_menu_reply_to);
|
||||||
|
|
||||||
|
m_menu.show_all();
|
||||||
}
|
}
|
||||||
|
|
||||||
void ChatList::Clear() {
|
void ChatList::Clear() {
|
||||||
@@ -110,13 +144,29 @@ void ChatList::ProcessNewMessage(const Message &data, bool prepend) {
|
|||||||
header->AddContent(content, prepend);
|
header->AddContent(content, prepend);
|
||||||
m_id_to_widget[data.ID] = content;
|
m_id_to_widget[data.ID] = content;
|
||||||
|
|
||||||
|
const auto cb = [this, id = data.ID](GdkEventButton *ev) -> bool {
|
||||||
|
if (ev->type == GDK_BUTTON_PRESS && ev->button == GDK_BUTTON_SECONDARY) {
|
||||||
|
m_menu_selected_message = id;
|
||||||
|
|
||||||
|
const auto &client = Abaddon::Get().GetDiscordClient();
|
||||||
|
const auto data = client.GetMessage(id);
|
||||||
|
if (data->IsDeleted()) {
|
||||||
|
m_menu_delete_message->set_sensitive(false);
|
||||||
|
m_menu_edit_message->set_sensitive(false);
|
||||||
|
} else {
|
||||||
|
const bool can_edit = client.GetUserData().ID == data->Author.ID;
|
||||||
|
const bool can_delete = can_edit || client.HasChannelPermission(client.GetUserData().ID, m_active_channel, Permission::MANAGE_MESSAGES);
|
||||||
|
m_menu_delete_message->set_sensitive(can_delete);
|
||||||
|
m_menu_edit_message->set_sensitive(can_edit);
|
||||||
|
}
|
||||||
|
|
||||||
|
m_menu.popup_at_pointer(reinterpret_cast<GdkEvent *>(ev));
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
};
|
||||||
|
content->signal_button_press_event().connect(cb);
|
||||||
|
|
||||||
if (!data.IsPending) {
|
if (!data.IsPending) {
|
||||||
content->signal_action_delete().connect([this, id = data.ID] {
|
|
||||||
m_signal_action_message_delete.emit(m_active_channel, id);
|
|
||||||
});
|
|
||||||
content->signal_action_edit().connect([this, id = data.ID] {
|
|
||||||
m_signal_action_message_edit.emit(m_active_channel, id);
|
|
||||||
});
|
|
||||||
content->signal_action_reaction_add().connect([this, id = data.ID](const Glib::ustring ¶m) {
|
content->signal_action_reaction_add().connect([this, id = data.ID](const Glib::ustring ¶m) {
|
||||||
m_signal_action_reaction_add.emit(id, param);
|
m_signal_action_reaction_add.emit(id, param);
|
||||||
});
|
});
|
||||||
@@ -126,9 +176,6 @@ void ChatList::ProcessNewMessage(const Message &data, bool prepend) {
|
|||||||
content->signal_action_channel_click().connect([this](const Snowflake &id) {
|
content->signal_action_channel_click().connect([this](const Snowflake &id) {
|
||||||
m_signal_action_channel_click.emit(id);
|
m_signal_action_channel_click.emit(id);
|
||||||
});
|
});
|
||||||
content->signal_action_reply_to().connect([this](const Snowflake &id) {
|
|
||||||
m_signal_action_reply_to.emit(id);
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -27,6 +27,14 @@ private:
|
|||||||
void ScrollToBottom();
|
void ScrollToBottom();
|
||||||
void RemoveMessageAndHeader(Gtk::Widget *widget);
|
void RemoveMessageAndHeader(Gtk::Widget *widget);
|
||||||
|
|
||||||
|
Gtk::Menu m_menu;
|
||||||
|
Gtk::MenuItem *m_menu_copy_id;
|
||||||
|
Gtk::MenuItem *m_menu_copy_content;
|
||||||
|
Gtk::MenuItem *m_menu_delete_message;
|
||||||
|
Gtk::MenuItem *m_menu_edit_message;
|
||||||
|
Gtk::MenuItem *m_menu_reply_to;
|
||||||
|
Snowflake m_menu_selected_message;
|
||||||
|
|
||||||
Snowflake m_active_channel;
|
Snowflake m_active_channel;
|
||||||
|
|
||||||
int m_num_messages = 0;
|
int m_num_messages = 0;
|
||||||
|
|||||||
@@ -14,28 +14,6 @@ ChatMessageItemContainer::ChatMessageItemContainer() {
|
|||||||
m_main = Gtk::manage(new Gtk::Box(Gtk::ORIENTATION_VERTICAL));
|
m_main = Gtk::manage(new Gtk::Box(Gtk::ORIENTATION_VERTICAL));
|
||||||
add(*m_main);
|
add(*m_main);
|
||||||
|
|
||||||
m_menu_copy_id = Gtk::manage(new Gtk::MenuItem("Copy ID"));
|
|
||||||
m_menu_copy_id->signal_activate().connect(sigc::mem_fun(*this, &ChatMessageItemContainer::on_menu_copy_id));
|
|
||||||
m_menu.append(*m_menu_copy_id);
|
|
||||||
|
|
||||||
m_menu_delete_message = Gtk::manage(new Gtk::MenuItem("Delete Message"));
|
|
||||||
m_menu_delete_message->signal_activate().connect(sigc::mem_fun(*this, &ChatMessageItemContainer::on_menu_delete_message));
|
|
||||||
m_menu.append(*m_menu_delete_message);
|
|
||||||
|
|
||||||
m_menu_edit_message = Gtk::manage(new Gtk::MenuItem("Edit Message"));
|
|
||||||
m_menu_edit_message->signal_activate().connect(sigc::mem_fun(*this, &ChatMessageItemContainer::on_menu_edit_message));
|
|
||||||
m_menu.append(*m_menu_edit_message);
|
|
||||||
|
|
||||||
m_menu_copy_content = Gtk::manage(new Gtk::MenuItem("Copy Content"));
|
|
||||||
m_menu_copy_content->signal_activate().connect(sigc::mem_fun(*this, &ChatMessageItemContainer::on_menu_copy_content));
|
|
||||||
m_menu.append(*m_menu_copy_content);
|
|
||||||
|
|
||||||
m_menu_reply_to = Gtk::manage(new Gtk::MenuItem("Reply To"));
|
|
||||||
m_menu_reply_to->signal_activate().connect(sigc::mem_fun(*this, &ChatMessageItemContainer::on_menu_reply_to));
|
|
||||||
m_menu.append(*m_menu_reply_to);
|
|
||||||
|
|
||||||
m_menu.show_all();
|
|
||||||
|
|
||||||
m_link_menu_copy = Gtk::manage(new Gtk::MenuItem("Copy Link"));
|
m_link_menu_copy = Gtk::manage(new Gtk::MenuItem("Copy Link"));
|
||||||
m_link_menu_copy->signal_activate().connect(sigc::mem_fun(*this, &ChatMessageItemContainer::on_link_menu_copy));
|
m_link_menu_copy->signal_activate().connect(sigc::mem_fun(*this, &ChatMessageItemContainer::on_link_menu_copy));
|
||||||
m_link_menu.append(*m_link_menu_copy);
|
m_link_menu.append(*m_link_menu_copy);
|
||||||
@@ -988,52 +966,6 @@ bool ChatMessageItemContainer::OnLinkClick(GdkEventButton *ev) {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ChatMessageItemContainer::ShowMenu(GdkEvent *event) {
|
|
||||||
const auto &client = Abaddon::Get().GetDiscordClient();
|
|
||||||
const auto data = client.GetMessage(ID);
|
|
||||||
if (data->IsDeleted()) {
|
|
||||||
m_menu_delete_message->set_sensitive(false);
|
|
||||||
m_menu_edit_message->set_sensitive(false);
|
|
||||||
} else {
|
|
||||||
const bool can_edit = client.GetUserData().ID == data->Author.ID;
|
|
||||||
const bool can_delete = can_edit || client.HasChannelPermission(client.GetUserData().ID, ChannelID, Permission::MANAGE_MESSAGES);
|
|
||||||
m_menu_delete_message->set_sensitive(can_delete);
|
|
||||||
m_menu_edit_message->set_sensitive(can_edit);
|
|
||||||
}
|
|
||||||
|
|
||||||
m_menu.popup_at_pointer(event);
|
|
||||||
}
|
|
||||||
|
|
||||||
void ChatMessageItemContainer::on_menu_copy_id() {
|
|
||||||
Gtk::Clipboard::get()->set_text(std::to_string(ID));
|
|
||||||
}
|
|
||||||
|
|
||||||
void ChatMessageItemContainer::on_menu_delete_message() {
|
|
||||||
m_signal_action_delete.emit();
|
|
||||||
}
|
|
||||||
|
|
||||||
void ChatMessageItemContainer::on_menu_edit_message() {
|
|
||||||
m_signal_action_edit.emit();
|
|
||||||
}
|
|
||||||
|
|
||||||
void ChatMessageItemContainer::on_menu_copy_content() {
|
|
||||||
const auto msg = Abaddon::Get().GetDiscordClient().GetMessage(ID);
|
|
||||||
if (msg.has_value())
|
|
||||||
Gtk::Clipboard::get()->set_text(msg->Content);
|
|
||||||
}
|
|
||||||
|
|
||||||
void ChatMessageItemContainer::on_menu_reply_to() {
|
|
||||||
m_signal_action_reply_to.emit(ID);
|
|
||||||
}
|
|
||||||
|
|
||||||
ChatMessageItemContainer::type_signal_action_delete ChatMessageItemContainer::signal_action_delete() {
|
|
||||||
return m_signal_action_delete;
|
|
||||||
}
|
|
||||||
|
|
||||||
ChatMessageItemContainer::type_signal_action_edit ChatMessageItemContainer::signal_action_edit() {
|
|
||||||
return m_signal_action_edit;
|
|
||||||
}
|
|
||||||
|
|
||||||
ChatMessageItemContainer::type_signal_channel_click ChatMessageItemContainer::signal_action_channel_click() {
|
ChatMessageItemContainer::type_signal_channel_click ChatMessageItemContainer::signal_action_channel_click() {
|
||||||
return m_signal_action_channel_click;
|
return m_signal_action_channel_click;
|
||||||
}
|
}
|
||||||
@@ -1046,14 +978,10 @@ ChatMessageItemContainer::type_signal_action_reaction_remove ChatMessageItemCont
|
|||||||
return m_signal_action_reaction_remove;
|
return m_signal_action_reaction_remove;
|
||||||
}
|
}
|
||||||
|
|
||||||
ChatMessageItemContainer::type_signal_action_reply_to ChatMessageItemContainer::signal_action_reply_to() {
|
|
||||||
return m_signal_action_reply_to;
|
|
||||||
}
|
|
||||||
|
|
||||||
void ChatMessageItemContainer::AttachEventHandlers(Gtk::Widget &widget) {
|
void ChatMessageItemContainer::AttachEventHandlers(Gtk::Widget &widget) {
|
||||||
const auto on_button_press_event = [this](GdkEventButton *event) -> bool {
|
const auto on_button_press_event = [this](GdkEventButton *e) -> bool {
|
||||||
if (event->type == GDK_BUTTON_PRESS && event->button == GDK_BUTTON_SECONDARY) {
|
if (e->type == GDK_BUTTON_PRESS && e->button == GDK_BUTTON_SECONDARY) {
|
||||||
ShowMenu(reinterpret_cast<GdkEvent *>(event));
|
event(reinterpret_cast<GdkEvent *>(e)); // illegal ooooooh
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -56,20 +56,6 @@ protected:
|
|||||||
std::map<Glib::RefPtr<Gtk::TextTag>, Snowflake> m_channel_tagmap;
|
std::map<Glib::RefPtr<Gtk::TextTag>, Snowflake> m_channel_tagmap;
|
||||||
|
|
||||||
void AttachEventHandlers(Gtk::Widget &widget);
|
void AttachEventHandlers(Gtk::Widget &widget);
|
||||||
void ShowMenu(GdkEvent *event);
|
|
||||||
|
|
||||||
Gtk::Menu m_menu;
|
|
||||||
Gtk::MenuItem *m_menu_copy_id;
|
|
||||||
Gtk::MenuItem *m_menu_copy_content;
|
|
||||||
Gtk::MenuItem *m_menu_delete_message;
|
|
||||||
Gtk::MenuItem *m_menu_edit_message;
|
|
||||||
Gtk::MenuItem *m_menu_reply_to;
|
|
||||||
|
|
||||||
void on_menu_copy_id();
|
|
||||||
void on_menu_delete_message();
|
|
||||||
void on_menu_edit_message();
|
|
||||||
void on_menu_copy_content();
|
|
||||||
void on_menu_reply_to();
|
|
||||||
|
|
||||||
Gtk::EventBox *m_ev;
|
Gtk::EventBox *m_ev;
|
||||||
Gtk::Box *m_main;
|
Gtk::Box *m_main;
|
||||||
@@ -80,29 +66,18 @@ protected:
|
|||||||
Gtk::Widget *m_reactions_component = nullptr;
|
Gtk::Widget *m_reactions_component = nullptr;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
typedef sigc::signal<void> type_signal_action_delete;
|
|
||||||
typedef sigc::signal<void> type_signal_action_edit;
|
|
||||||
typedef sigc::signal<void, Snowflake> type_signal_channel_click;
|
typedef sigc::signal<void, Snowflake> type_signal_channel_click;
|
||||||
typedef sigc::signal<void, Glib::ustring> type_signal_action_reaction_add;
|
typedef sigc::signal<void, Glib::ustring> type_signal_action_reaction_add;
|
||||||
typedef sigc::signal<void, Glib::ustring> type_signal_action_reaction_remove;
|
typedef sigc::signal<void, Glib::ustring> type_signal_action_reaction_remove;
|
||||||
typedef sigc::signal<void, Snowflake> type_signal_action_reply_to;
|
|
||||||
typedef sigc::signal<void> type_signal_enter;
|
|
||||||
typedef sigc::signal<void> type_signal_leave;
|
|
||||||
|
|
||||||
type_signal_action_delete signal_action_delete();
|
|
||||||
type_signal_action_edit signal_action_edit();
|
|
||||||
type_signal_channel_click signal_action_channel_click();
|
type_signal_channel_click signal_action_channel_click();
|
||||||
type_signal_action_reaction_add signal_action_reaction_add();
|
type_signal_action_reaction_add signal_action_reaction_add();
|
||||||
type_signal_action_reaction_remove signal_action_reaction_remove();
|
type_signal_action_reaction_remove signal_action_reaction_remove();
|
||||||
type_signal_action_reply_to signal_action_reply_to();
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
type_signal_action_delete m_signal_action_delete;
|
|
||||||
type_signal_action_edit m_signal_action_edit;
|
|
||||||
type_signal_channel_click m_signal_action_channel_click;
|
type_signal_channel_click m_signal_action_channel_click;
|
||||||
type_signal_action_reaction_add m_signal_action_reaction_add;
|
type_signal_action_reaction_add m_signal_action_reaction_add;
|
||||||
type_signal_action_reaction_remove m_signal_action_reaction_remove;
|
type_signal_action_reaction_remove m_signal_action_reaction_remove;
|
||||||
type_signal_action_reply_to m_signal_action_reply_to;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
class ChatMessageHeader : public Gtk::ListBoxRow {
|
class ChatMessageHeader : public Gtk::ListBoxRow {
|
||||||
|
|||||||
Reference in New Issue
Block a user