fix errors with user menu and window management

This commit is contained in:
ouwou
2021-03-15 00:28:42 -05:00
parent b68b292c2c
commit 818aacb49c
6 changed files with 59 additions and 53 deletions

View File

@@ -79,44 +79,7 @@ int Abaddon::StartGTK() {
m_main_window->UpdateComponents();
// crashes for some stupid reason if i put it somewhere else
m_user_menu = Gtk::manage(new Gtk::Menu);
m_user_menu_insert_mention = Gtk::manage(new Gtk::MenuItem("Insert Mention"));
m_user_menu_ban = Gtk::manage(new Gtk::MenuItem("Ban"));
m_user_menu_kick = Gtk::manage(new Gtk::MenuItem("Kick"));
m_user_menu_copy_id = Gtk::manage(new Gtk::MenuItem("Copy ID"));
m_user_menu_open_dm = Gtk::manage(new Gtk::MenuItem("Open DM"));
m_user_menu_roles = Gtk::manage(new Gtk::MenuItem("Roles"));
m_user_menu_info = Gtk::manage(new Gtk::MenuItem("View Profile"));
m_user_menu_remove_recipient = Gtk::manage(new Gtk::MenuItem("Remove From Group"));
m_user_menu_roles_submenu = Gtk::manage(new Gtk::Menu);
m_user_menu_roles->set_submenu(*m_user_menu_roles_submenu);
m_user_menu_insert_mention->signal_activate().connect(sigc::mem_fun(*this, &Abaddon::on_user_menu_insert_mention));
m_user_menu_ban->signal_activate().connect(sigc::mem_fun(*this, &Abaddon::on_user_menu_ban));
m_user_menu_kick->signal_activate().connect(sigc::mem_fun(*this, &Abaddon::on_user_menu_kick));
m_user_menu_copy_id->signal_activate().connect(sigc::mem_fun(*this, &Abaddon::on_user_menu_copy_id));
m_user_menu_open_dm->signal_activate().connect(sigc::mem_fun(*this, &Abaddon::on_user_menu_open_dm));
m_user_menu_remove_recipient->signal_activate().connect(sigc::mem_fun(*this, &Abaddon::on_user_menu_remove_recipient));
m_user_menu_info->signal_activate().connect([this]() {
auto *window = new ProfileWindow(m_shown_user_menu_id);
window->show();
});
m_user_menu_remove_recipient->override_color(Gdk::RGBA("#BE3C3D"));
m_user_menu->append(*m_user_menu_info);
m_user_menu->append(*m_user_menu_insert_mention);
m_user_menu->append(*Gtk::manage(new Gtk::SeparatorMenuItem));
m_user_menu->append(*m_user_menu_ban);
m_user_menu->append(*m_user_menu_kick);
m_user_menu->append(*Gtk::manage(new Gtk::SeparatorMenuItem));
m_user_menu->append(*m_user_menu_open_dm);
m_user_menu->append(*m_user_menu_roles);
m_user_menu->append(*Gtk::manage(new Gtk::SeparatorMenuItem));
m_user_menu->append(*m_user_menu_remove_recipient);
m_user_menu->append(*Gtk::manage(new Gtk::SeparatorMenuItem));
m_user_menu->append(*m_user_menu_copy_id);
m_user_menu->show_all();
SetupUserMenu();
m_main_window->signal_action_connect().connect(sigc::mem_fun(*this, &Abaddon::ActionConnect));
m_main_window->signal_action_disconnect().connect(sigc::mem_fun(*this, &Abaddon::ActionDisconnect));
@@ -324,6 +287,59 @@ void Abaddon::ShowUserMenu(const GdkEvent *event, Snowflake id, Snowflake guild_
m_user_menu->popup_at_pointer(event);
}
void Abaddon::SetupUserMenu() {
m_user_menu = Gtk::manage(new Gtk::Menu);
m_user_menu_insert_mention = Gtk::manage(new Gtk::MenuItem("Insert Mention"));
m_user_menu_ban = Gtk::manage(new Gtk::MenuItem("Ban"));
m_user_menu_kick = Gtk::manage(new Gtk::MenuItem("Kick"));
m_user_menu_copy_id = Gtk::manage(new Gtk::MenuItem("Copy ID"));
m_user_menu_open_dm = Gtk::manage(new Gtk::MenuItem("Open DM"));
m_user_menu_roles = Gtk::manage(new Gtk::MenuItem("Roles"));
m_user_menu_info = Gtk::manage(new Gtk::MenuItem("View Profile"));
m_user_menu_remove_recipient = Gtk::manage(new Gtk::MenuItem("Remove From Group"));
m_user_menu_roles_submenu = Gtk::manage(new Gtk::Menu);
m_user_menu_roles->set_submenu(*m_user_menu_roles_submenu);
m_user_menu_insert_mention->signal_activate().connect(sigc::mem_fun(*this, &Abaddon::on_user_menu_insert_mention));
m_user_menu_ban->signal_activate().connect(sigc::mem_fun(*this, &Abaddon::on_user_menu_ban));
m_user_menu_kick->signal_activate().connect(sigc::mem_fun(*this, &Abaddon::on_user_menu_kick));
m_user_menu_copy_id->signal_activate().connect(sigc::mem_fun(*this, &Abaddon::on_user_menu_copy_id));
m_user_menu_open_dm->signal_activate().connect(sigc::mem_fun(*this, &Abaddon::on_user_menu_open_dm));
m_user_menu_remove_recipient->signal_activate().connect(sigc::mem_fun(*this, &Abaddon::on_user_menu_remove_recipient));
m_user_menu_info->signal_activate().connect([this]() {
auto *window = new ProfileWindow(m_shown_user_menu_id);
ManageHeapWindow(window);
window->show();
});
m_user_menu_remove_recipient->override_color(Gdk::RGBA("#BE3C3D"));
m_user_menu->append(*m_user_menu_info);
m_user_menu->append(*m_user_menu_insert_mention);
m_user_menu->append(*Gtk::manage(new Gtk::SeparatorMenuItem));
m_user_menu->append(*m_user_menu_ban);
m_user_menu->append(*m_user_menu_kick);
m_user_menu->append(*Gtk::manage(new Gtk::SeparatorMenuItem));
m_user_menu->append(*m_user_menu_open_dm);
m_user_menu->append(*m_user_menu_roles);
m_user_menu->append(*Gtk::manage(new Gtk::SeparatorMenuItem));
m_user_menu->append(*m_user_menu_remove_recipient);
m_user_menu->append(*Gtk::manage(new Gtk::SeparatorMenuItem));
m_user_menu->append(*m_user_menu_copy_id);
m_user_menu->show_all();
}
void Abaddon::ManageHeapWindow(Gtk::Window *window) {
window->signal_hide().connect([this, window]() {
delete window;
// for some reason if ShowUserMenu is called multiple times with events across windows
// and one of the windows is closed, then it throws errors when the menu is opened again
// i dont think this is my fault so this semi-hacky solution will have to do
delete m_user_menu;
SetupUserMenu();
});
}
void Abaddon::on_user_menu_insert_mention() {
ActionInsertMention(m_shown_user_menu_id);
}
@@ -549,6 +565,7 @@ void Abaddon::ActionReactionRemove(Snowflake id, const Glib::ustring &param) {
void Abaddon::ActionGuildSettings(Snowflake id) {
auto window = new GuildSettingsWindow(id);
ManageHeapWindow(window);
window->show();
}

View File

@@ -81,6 +81,10 @@ public:
void ShowUserMenu(const GdkEvent *event, Snowflake id, Snowflake guild_id);
protected:
void SetupUserMenu();
void ManageHeapWindow(Gtk::Window *window);
Snowflake m_shown_user_menu_id;
Snowflake m_shown_user_menu_guild_id;

View File

@@ -71,8 +71,3 @@ GuildSettingsWindow::GuildSettingsWindow(Snowflake id)
m_main.show();
add(m_main);
}
void GuildSettingsWindow::on_hide() {
Gtk::Window::on_hide();
delete this; // :x
}

View File

@@ -12,9 +12,6 @@ class GuildSettingsWindow : public Gtk::Window {
public:
GuildSettingsWindow(Snowflake id);
protected:
void on_hide() override;
private:
Gtk::Box m_main;
Gtk::Stack m_stack;

View File

@@ -97,11 +97,6 @@ ProfileWindow::ProfileWindow(Snowflake user_id)
show_all_children();
}
void ProfileWindow::on_hide() {
Gtk::Window::on_hide();
delete this;
}
void ProfileWindow::OnFetchProfile(const UserProfileData &data) {
m_pane_info.SetConnections(data.ConnectedAccounts);
m_pane_guilds.SetMutualGuilds(data.MutualGuilds);

View File

@@ -9,8 +9,6 @@ class ProfileWindow : public Gtk::Window {
public:
ProfileWindow(Snowflake user_id);
void on_hide() override;
Snowflake ID;
private: