forked from OpenGamers/abaddon
some memory usage optimizations pending proper rewrite
This commit is contained in:
@@ -243,48 +243,46 @@ ChannelListRowCategory::type_signal_copy_id ChannelListRowCategory::signal_copy_
|
|||||||
return m_signal_copy_id;
|
return m_signal_copy_id;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool ChannelListRowChannel::m_menu_init = false;
|
||||||
|
Gtk::Menu *ChannelListRowChannel::m_menu;
|
||||||
ChannelListRowChannel::ChannelListRowChannel(const ChannelData *data) {
|
ChannelListRowChannel::ChannelListRowChannel(const ChannelData *data) {
|
||||||
|
if (!m_menu_init) {
|
||||||
|
m_menu = Gtk::manage(new Gtk::Menu);
|
||||||
|
auto *menu_copy_id = Gtk::manage(new Gtk::MenuItem("_Copy ID", true));
|
||||||
|
menu_copy_id->signal_activate().connect([this] {
|
||||||
|
Gtk::Clipboard::get()->set_text(std::to_string(ID));
|
||||||
|
});
|
||||||
|
m_menu->append(*menu_copy_id);
|
||||||
|
m_menu->show_all();
|
||||||
|
m_menu_init = true;
|
||||||
|
}
|
||||||
|
|
||||||
ID = data->ID;
|
ID = data->ID;
|
||||||
m_ev = Gtk::manage(new Gtk::EventBox);
|
auto *ev = Gtk::manage(new Gtk::EventBox);
|
||||||
m_box = Gtk::manage(new Gtk::Box(Gtk::ORIENTATION_HORIZONTAL));
|
auto *lbl = Gtk::manage(new Gtk::TextView);
|
||||||
m_lbl = Gtk::manage(new Gtk::TextView);
|
MakeReadOnly(lbl);
|
||||||
MakeReadOnly(m_lbl);
|
|
||||||
|
|
||||||
m_menu_copyid = Gtk::manage(new Gtk::MenuItem("_Copy ID", true));
|
AddWidgetMenuHandler(ev, *m_menu);
|
||||||
m_menu_copyid->signal_activate().connect([this]() {
|
AddWidgetMenuHandler(lbl, *m_menu);
|
||||||
m_signal_copy_id.emit();
|
|
||||||
});
|
|
||||||
m_menu.append(*m_menu_copyid);
|
|
||||||
|
|
||||||
m_menu.show_all();
|
|
||||||
|
|
||||||
AddWidgetMenuHandler(m_ev, m_menu);
|
|
||||||
AddWidgetMenuHandler(m_lbl, m_menu);
|
|
||||||
|
|
||||||
get_style_context()->add_class("channel-row");
|
get_style_context()->add_class("channel-row");
|
||||||
get_style_context()->add_class("channel-row-channel");
|
get_style_context()->add_class("channel-row-channel");
|
||||||
m_lbl->get_style_context()->add_class("channel-row-label");
|
lbl->get_style_context()->add_class("channel-row-label");
|
||||||
|
|
||||||
auto buf = m_lbl->get_buffer();
|
auto buf = lbl->get_buffer();
|
||||||
if (data->IsNSFW.has_value() && *data->IsNSFW) {
|
if (data->IsNSFW.has_value() && *data->IsNSFW) {
|
||||||
get_style_context()->add_class("nsfw");
|
get_style_context()->add_class("nsfw");
|
||||||
m_lbl->get_style_context()->add_class("nsfw");
|
lbl->get_style_context()->add_class("nsfw");
|
||||||
}
|
}
|
||||||
buf->set_text("#" + *data->Name);
|
buf->set_text("#" + *data->Name);
|
||||||
static bool show_emojis = Abaddon::Get().GetSettings().GetShowEmojis();
|
static bool show_emojis = Abaddon::Get().GetSettings().GetShowEmojis();
|
||||||
if (show_emojis)
|
if (show_emojis)
|
||||||
Abaddon::Get().GetEmojis().ReplaceEmojis(buf, ChannelEmojiSize);
|
Abaddon::Get().GetEmojis().ReplaceEmojis(buf, ChannelEmojiSize);
|
||||||
m_box->set_halign(Gtk::ALIGN_START);
|
ev->add(*lbl);
|
||||||
m_box->pack_start(*m_lbl);
|
add(*ev);
|
||||||
m_ev->add(*m_box);
|
|
||||||
add(*m_ev);
|
|
||||||
show_all_children();
|
show_all_children();
|
||||||
}
|
}
|
||||||
|
|
||||||
ChannelListRowChannel::type_signal_copy_id ChannelListRowChannel::signal_copy_id() {
|
|
||||||
return m_signal_copy_id;
|
|
||||||
}
|
|
||||||
|
|
||||||
ChannelList::ChannelList() {
|
ChannelList::ChannelList() {
|
||||||
m_main = Gtk::manage(new Gtk::ScrolledWindow);
|
m_main = Gtk::manage(new Gtk::ScrolledWindow);
|
||||||
m_list = Gtk::manage(new Gtk::ListBox);
|
m_list = Gtk::manage(new Gtk::ListBox);
|
||||||
@@ -376,7 +374,7 @@ void ChannelList::UpdateChannelCategory(Snowflake id) {
|
|||||||
for (auto child : row->Children) {
|
for (auto child : row->Children) {
|
||||||
child_rows[child->get_index()] = child->ID;
|
child_rows[child->get_index()] = child->ID;
|
||||||
}
|
}
|
||||||
guild_row->Children.erase(row);
|
guild_row->Children.erase(std::remove(guild_row->Children.begin(), guild_row->Children.end(), row), guild_row->Children.end());
|
||||||
DeleteRow(row);
|
DeleteRow(row);
|
||||||
|
|
||||||
int pos = guild_row->get_index();
|
int pos = guild_row->get_index();
|
||||||
@@ -400,16 +398,15 @@ void ChannelList::UpdateChannelCategory(Snowflake id) {
|
|||||||
m_id_to_row[id] = new_row;
|
m_id_to_row[id] = new_row;
|
||||||
new_row->signal_copy_id().connect(sigc::bind(sigc::mem_fun(*this, &ChannelList::OnMenuCopyID), new_row->ID));
|
new_row->signal_copy_id().connect(sigc::bind(sigc::mem_fun(*this, &ChannelList::OnMenuCopyID), new_row->ID));
|
||||||
new_row->Parent = guild_row;
|
new_row->Parent = guild_row;
|
||||||
guild_row->Children.insert(new_row);
|
guild_row->Children.push_back(new_row);
|
||||||
m_list->insert(*new_row, pos);
|
m_list->insert(*new_row, pos);
|
||||||
int i = 1;
|
int i = 1;
|
||||||
for (const auto &[idx, child_id] : child_rows) {
|
for (const auto &[idx, child_id] : child_rows) {
|
||||||
const auto channel = Abaddon::Get().GetDiscordClient().GetChannel(child_id);
|
const auto channel = Abaddon::Get().GetDiscordClient().GetChannel(child_id);
|
||||||
if (channel.has_value()) {
|
if (channel.has_value()) {
|
||||||
auto *new_child = Gtk::manage(new ChannelListRowChannel(&*channel));
|
auto *new_child = Gtk::manage(new ChannelListRowChannel(&*channel));
|
||||||
new_row->Children.insert(new_child);
|
new_row->Children.push_back(new_child);
|
||||||
new_child->Parent = new_row;
|
new_child->Parent = new_row;
|
||||||
new_child->signal_copy_id().connect(sigc::bind(sigc::mem_fun(*this, &ChannelList::OnMenuCopyID), new_child->ID));
|
|
||||||
m_id_to_row[child_id] = new_child;
|
m_id_to_row[child_id] = new_child;
|
||||||
if (visible && !new_row->IsUserCollapsed)
|
if (visible && !new_row->IsUserCollapsed)
|
||||||
new_child->show();
|
new_child->show();
|
||||||
@@ -456,10 +453,9 @@ void ChannelList::UpdateChannel(Snowflake id) {
|
|||||||
} else {
|
} else {
|
||||||
new_row->Parent = m_guild_id_to_row.at(*data->GuildID);
|
new_row->Parent = m_guild_id_to_row.at(*data->GuildID);
|
||||||
}
|
}
|
||||||
new_row->Parent->Children.insert(new_row);
|
new_row->Parent->Children.push_back(new_row);
|
||||||
if (new_row->Parent->is_visible() && !new_row->Parent->IsUserCollapsed)
|
if (new_row->Parent->is_visible() && !new_row->Parent->IsUserCollapsed)
|
||||||
new_row->show();
|
new_row->show();
|
||||||
new_row->signal_copy_id().connect(sigc::bind(sigc::mem_fun(*this, &ChannelList::OnMenuCopyID), new_row->ID));
|
|
||||||
m_list->insert(*new_row, pos);
|
m_list->insert(*new_row, pos);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -468,7 +464,7 @@ void ChannelList::UpdateCreateDMChannel(Snowflake id) {
|
|||||||
auto *dm_row = Gtk::manage(new ChannelListRowDMChannel(&*chan));
|
auto *dm_row = Gtk::manage(new ChannelListRowDMChannel(&*chan));
|
||||||
dm_row->IsUserCollapsed = false;
|
dm_row->IsUserCollapsed = false;
|
||||||
m_list->insert(*dm_row, m_dm_header_row->get_index() + 1);
|
m_list->insert(*dm_row, m_dm_header_row->get_index() + 1);
|
||||||
m_dm_header_row->Children.insert(dm_row);
|
m_dm_header_row->Children.push_back(dm_row);
|
||||||
m_id_to_row[id] = dm_row;
|
m_id_to_row[id] = dm_row;
|
||||||
if (!m_dm_header_row->IsUserCollapsed)
|
if (!m_dm_header_row->IsUserCollapsed)
|
||||||
dm_row->show();
|
dm_row->show();
|
||||||
@@ -500,7 +496,6 @@ void ChannelList::UpdateCreateChannel(Snowflake id) {
|
|||||||
ChannelListRow *row;
|
ChannelListRow *row;
|
||||||
if (data->Type == ChannelType::GUILD_TEXT || data->Type == ChannelType::GUILD_NEWS) {
|
if (data->Type == ChannelType::GUILD_TEXT || data->Type == ChannelType::GUILD_NEWS) {
|
||||||
auto *tmp = Gtk::manage(new ChannelListRowChannel(&*data));
|
auto *tmp = Gtk::manage(new ChannelListRowChannel(&*data));
|
||||||
tmp->signal_copy_id().connect(sigc::bind(sigc::mem_fun(*this, &ChannelList::OnMenuCopyID), tmp->ID));
|
|
||||||
row = tmp;
|
row = tmp;
|
||||||
} else if (data->Type == ChannelType::GUILD_CATEGORY) {
|
} else if (data->Type == ChannelType::GUILD_CATEGORY) {
|
||||||
auto *tmp = Gtk::manage(new ChannelListRowCategory(&*data));
|
auto *tmp = Gtk::manage(new ChannelListRowCategory(&*data));
|
||||||
@@ -512,7 +507,7 @@ void ChannelList::UpdateCreateChannel(Snowflake id) {
|
|||||||
if (!guild_row->IsUserCollapsed)
|
if (!guild_row->IsUserCollapsed)
|
||||||
row->show();
|
row->show();
|
||||||
row->Parent = guild_row;
|
row->Parent = guild_row;
|
||||||
guild_row->Children.insert(row);
|
guild_row->Children.push_back(row);
|
||||||
m_id_to_row[id] = row;
|
m_id_to_row[id] = row;
|
||||||
m_list->insert(*row, pos);
|
m_list->insert(*row, pos);
|
||||||
}
|
}
|
||||||
@@ -569,7 +564,7 @@ void ChannelList::DeleteRow(ChannelListRow *row) {
|
|||||||
for (auto child : row->Children)
|
for (auto child : row->Children)
|
||||||
DeleteRow(child);
|
DeleteRow(child);
|
||||||
if (row->Parent != nullptr)
|
if (row->Parent != nullptr)
|
||||||
row->Parent->Children.erase(row);
|
row->Parent->Children.erase(std::remove(row->Parent->Children.begin(), row->Parent->Children.end(), row), row->Parent->Children.end());
|
||||||
else
|
else
|
||||||
printf("row has no parent!\n");
|
printf("row has no parent!\n");
|
||||||
if (dynamic_cast<ChannelListRowGuild *>(row) != nullptr)
|
if (dynamic_cast<ChannelListRowGuild *>(row) != nullptr)
|
||||||
@@ -633,9 +628,8 @@ void ChannelList::InsertGuildAt(Snowflake id, int pos) {
|
|||||||
for (const auto &[pos, channel] : orphan_channels) {
|
for (const auto &[pos, channel] : orphan_channels) {
|
||||||
auto *chan_row = Gtk::manage(new ChannelListRowChannel(&channel));
|
auto *chan_row = Gtk::manage(new ChannelListRowChannel(&channel));
|
||||||
chan_row->IsUserCollapsed = false;
|
chan_row->IsUserCollapsed = false;
|
||||||
chan_row->signal_copy_id().connect(sigc::bind(sigc::mem_fun(*this, &ChannelList::OnMenuCopyID), chan_row->ID));
|
|
||||||
insert_and_adjust(*chan_row);
|
insert_and_adjust(*chan_row);
|
||||||
guild_row->Children.insert(chan_row);
|
guild_row->Children.push_back(chan_row);
|
||||||
chan_row->Parent = guild_row;
|
chan_row->Parent = guild_row;
|
||||||
m_id_to_row[chan_row->ID] = chan_row;
|
m_id_to_row[chan_row->ID] = chan_row;
|
||||||
}
|
}
|
||||||
@@ -657,7 +651,7 @@ void ChannelList::InsertGuildAt(Snowflake id, int pos) {
|
|||||||
cat_row->IsUserCollapsed = false;
|
cat_row->IsUserCollapsed = false;
|
||||||
cat_row->signal_copy_id().connect(sigc::bind(sigc::mem_fun(*this, &ChannelList::OnMenuCopyID), cat_row->ID));
|
cat_row->signal_copy_id().connect(sigc::bind(sigc::mem_fun(*this, &ChannelList::OnMenuCopyID), cat_row->ID));
|
||||||
insert_and_adjust(*cat_row);
|
insert_and_adjust(*cat_row);
|
||||||
guild_row->Children.insert(cat_row);
|
guild_row->Children.push_back(cat_row);
|
||||||
cat_row->Parent = guild_row;
|
cat_row->Parent = guild_row;
|
||||||
m_id_to_row[cat_row->ID] = cat_row;
|
m_id_to_row[cat_row->ID] = cat_row;
|
||||||
|
|
||||||
@@ -671,9 +665,8 @@ void ChannelList::InsertGuildAt(Snowflake id, int pos) {
|
|||||||
for (const auto &[pos, channel] : sorted_channels) {
|
for (const auto &[pos, channel] : sorted_channels) {
|
||||||
auto *chan_row = Gtk::manage(new ChannelListRowChannel(&channel));
|
auto *chan_row = Gtk::manage(new ChannelListRowChannel(&channel));
|
||||||
chan_row->IsUserCollapsed = false;
|
chan_row->IsUserCollapsed = false;
|
||||||
chan_row->signal_copy_id().connect(sigc::bind(sigc::mem_fun(*this, &ChannelList::OnMenuCopyID), chan_row->ID));
|
|
||||||
insert_and_adjust(*chan_row);
|
insert_and_adjust(*chan_row);
|
||||||
cat_row->Children.insert(chan_row);
|
cat_row->Children.push_back(chan_row);
|
||||||
chan_row->Parent = cat_row;
|
chan_row->Parent = cat_row;
|
||||||
m_id_to_row[chan_row->ID] = chan_row;
|
m_id_to_row[chan_row->ID] = chan_row;
|
||||||
}
|
}
|
||||||
@@ -704,7 +697,7 @@ void ChannelList::AddPrivateChannels() {
|
|||||||
m_id_to_row[dm.ID] = dm_row;
|
m_id_to_row[dm.ID] = dm_row;
|
||||||
dm_row->IsUserCollapsed = false;
|
dm_row->IsUserCollapsed = false;
|
||||||
m_list->add(*dm_row);
|
m_list->add(*dm_row);
|
||||||
m_dm_header_row->Children.insert(dm_row);
|
m_dm_header_row->Children.push_back(dm_row);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -719,6 +712,7 @@ void ChannelList::UpdateListing() {
|
|||||||
it++;
|
it++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
m_guild_id_to_row.clear();
|
||||||
m_id_to_row.clear();
|
m_id_to_row.clear();
|
||||||
|
|
||||||
m_guild_count = 0;
|
m_guild_count = 0;
|
||||||
@@ -750,16 +744,16 @@ void ChannelList::CheckBumpDM(Snowflake channel_id) {
|
|||||||
const auto index = row->get_index();
|
const auto index = row->get_index();
|
||||||
if (index == 1) return; // 1 is top of dm list
|
if (index == 1) return; // 1 is top of dm list
|
||||||
const bool selected = row->is_selected();
|
const bool selected = row->is_selected();
|
||||||
row->Parent->Children.erase(row);
|
row->Parent->Children.erase(std::remove(row->Parent->Children.begin(), row->Parent->Children.end(), row), row->Parent->Children.end());
|
||||||
delete row;
|
delete row;
|
||||||
const auto chan = Abaddon::Get().GetDiscordClient().GetChannel(channel_id);
|
const auto chan = Abaddon::Get().GetDiscordClient().GetChannel(channel_id);
|
||||||
auto *dm_row = Gtk::manage(new ChannelListRowDMChannel(&*chan));
|
auto *dm_row = Gtk::manage(new ChannelListRowDMChannel(&*chan));
|
||||||
dm_row->Parent = m_dm_header_row;
|
dm_row->Parent = m_dm_header_row;
|
||||||
m_dm_header_row->Children.insert(dm_row);
|
m_dm_header_row->Children.push_back(dm_row);
|
||||||
m_id_to_row[channel_id] = dm_row;
|
m_id_to_row[channel_id] = dm_row;
|
||||||
dm_row->IsUserCollapsed = false;
|
dm_row->IsUserCollapsed = false;
|
||||||
m_list->insert(*dm_row, 1);
|
m_list->insert(*dm_row, 1);
|
||||||
m_dm_header_row->Children.insert(dm_row);
|
m_dm_header_row->Children.push_back(dm_row);
|
||||||
if (selected)
|
if (selected)
|
||||||
m_list->select_row(*dm_row);
|
m_list->select_row(*dm_row);
|
||||||
if (m_dm_header_row->is_visible() && !m_dm_header_row->IsUserCollapsed)
|
if (m_dm_header_row->is_visible() && !m_dm_header_row->IsUserCollapsed)
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ class ChannelListRow : public Gtk::ListBoxRow {
|
|||||||
public:
|
public:
|
||||||
bool IsUserCollapsed;
|
bool IsUserCollapsed;
|
||||||
Snowflake ID;
|
Snowflake ID;
|
||||||
std::unordered_set<ChannelListRow *> Children;
|
std::vector<ChannelListRow *> Children;
|
||||||
ChannelListRow *Parent = nullptr;
|
ChannelListRow *Parent = nullptr;
|
||||||
|
|
||||||
virtual void Collapse();
|
virtual void Collapse();
|
||||||
@@ -111,21 +111,9 @@ class ChannelListRowChannel : public ChannelListRow {
|
|||||||
public:
|
public:
|
||||||
ChannelListRowChannel(const ChannelData *data);
|
ChannelListRowChannel(const ChannelData *data);
|
||||||
|
|
||||||
protected:
|
|
||||||
Gtk::EventBox *m_ev;
|
|
||||||
Gtk::Box *m_box;
|
|
||||||
Gtk::TextView *m_lbl;
|
|
||||||
|
|
||||||
Gtk::Menu m_menu;
|
|
||||||
Gtk::MenuItem *m_menu_copyid;
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
typedef sigc::signal<void> type_signal_copy_id;
|
static Gtk::Menu *m_menu;
|
||||||
|
static bool m_menu_init;
|
||||||
type_signal_copy_id m_signal_copy_id;
|
|
||||||
|
|
||||||
public:
|
|
||||||
type_signal_copy_id signal_copy_id();
|
|
||||||
};
|
};
|
||||||
|
|
||||||
class ChannelList {
|
class ChannelList {
|
||||||
|
|||||||
Reference in New Issue
Block a user