diff options
author | ouwou <26526779+ouwou@users.noreply.github.com> | 2022-01-02 00:07:32 -0500 |
---|---|---|
committer | ouwou <26526779+ouwou@users.noreply.github.com> | 2022-01-02 00:07:32 -0500 |
commit | 8695562cb4b34c70d4d6b607042988de7b6e244d (patch) | |
tree | b183df06498b6894d3f37964b1c97f5b24d8ade8 /src | |
parent | d7bb6049e130dcd3a36e1a07fb39d24468c4889b (diff) | |
parent | 5338eab3a5f9a15fbc5dd049bf45fe16d983a8cb (diff) | |
download | abaddon-portaudio-8695562cb4b34c70d4d6b607042988de7b6e244d.tar.gz abaddon-portaudio-8695562cb4b34c70d4d6b607042988de7b6e244d.zip |
Merge branch 'master' into unread
Diffstat (limited to 'src')
-rw-r--r-- | src/abaddon.cpp | 6 | ||||
-rw-r--r-- | src/components/channels.cpp | 14 | ||||
-rw-r--r-- | src/components/channels.hpp | 4 | ||||
-rw-r--r-- | src/platform.cpp | 40 |
4 files changed, 44 insertions, 20 deletions
diff --git a/src/abaddon.cpp b/src/abaddon.cpp index 2b0cda0..51f8052 100644 --- a/src/abaddon.cpp +++ b/src/abaddon.cpp @@ -388,7 +388,11 @@ void Abaddon::SaveState() { } void Abaddon::LoadState() { - if (!GetSettings().SaveState) return; + if (!GetSettings().SaveState) { + // call with empty data to purge the temporary table + m_main_window->GetChannelList()->UseExpansionState({}); + return; + } const auto data = ReadWholeFile(GetStateCachePath("/state.json")); if (data.empty()) return; diff --git a/src/components/channels.cpp b/src/components/channels.cpp index 290093d..7ad2dd0 100644 --- a/src/components/channels.cpp +++ b/src/components/channels.cpp @@ -278,7 +278,6 @@ void ChannelList::UpdateChannel(Snowflake id) { } void ChannelList::UpdateCreateChannel(const ChannelData &channel) { - ; if (channel.Type == ChannelType::GUILD_CATEGORY) return (void)UpdateCreateChannelCategory(channel); if (channel.Type == ChannelType::DM || channel.Type == ChannelType::GROUP_DM) return UpdateCreateDMChannel(channel); if (channel.Type != ChannelType::GUILD_TEXT && channel.Type != ChannelType::GUILD_NEWS) return; @@ -451,11 +450,11 @@ void ChannelList::UseExpansionState(const ExpansionStateRoot &root) { auto recurse = [this](auto &self, const ExpansionStateRoot &root) -> void { // and these are only channels for (const auto &[id, state] : root.Children) { - if (const auto iter = GetIteratorForChannelFromID(id)) { + if (const auto iter = m_tmp_channel_map.find(id); iter != m_tmp_channel_map.end()) { if (state.IsExpanded) - m_view.expand_row(m_model->get_path(iter), false); + m_view.expand_row(m_model->get_path(iter->second), false); else - m_view.collapse_row(m_model->get_path(iter)); + m_view.collapse_row(m_model->get_path(iter->second)); } self(self, state.Children); @@ -473,6 +472,8 @@ void ChannelList::UseExpansionState(const ExpansionStateRoot &root) { recurse(recurse, state.Children); } + + m_tmp_channel_map.clear(); } ExpansionStateRoot ChannelList::GetExpansionState() const { @@ -553,7 +554,7 @@ Gtk::TreeModel::iterator ChannelList::AddGuild(const GuildData &guild) { if (it == threads.end()) return; for (const auto &thread : it->second) - CreateThreadRow(row.children(), thread); + m_tmp_channel_map[thread.ID] = CreateThreadRow(row.children(), thread); }; for (const auto &channel : orphan_channels) { @@ -564,6 +565,7 @@ Gtk::TreeModel::iterator ChannelList::AddGuild(const GuildData &guild) { channel_row[m_columns.m_sort] = *channel.Position + OrphanChannelSortOffset; channel_row[m_columns.m_nsfw] = channel.NSFW(); add_threads(channel, channel_row); + m_tmp_channel_map[channel.ID] = channel_row; } for (const auto &[category_id, channels] : categories) { @@ -575,6 +577,7 @@ Gtk::TreeModel::iterator ChannelList::AddGuild(const GuildData &guild) { cat_row[m_columns.m_name] = Glib::Markup::escape_text(*category->Name); cat_row[m_columns.m_sort] = *category->Position; cat_row[m_columns.m_expanded] = true; + m_tmp_channel_map[category_id] = cat_row; // m_view.expand_row wont work because it might not have channels for (const auto &channel : channels) { @@ -585,6 +588,7 @@ Gtk::TreeModel::iterator ChannelList::AddGuild(const GuildData &guild) { channel_row[m_columns.m_sort] = *channel.Position; channel_row[m_columns.m_nsfw] = channel.NSFW(); add_threads(channel, channel_row); + m_tmp_channel_map[channel.ID] = channel_row; } } diff --git a/src/components/channels.hpp b/src/components/channels.hpp index 40e8358..6970729 100644 --- a/src/components/channels.hpp +++ b/src/components/channels.hpp @@ -138,6 +138,10 @@ protected: Snowflake m_active_channel; + // (GetIteratorForChannelFromID is rather slow) + // only temporary since i dont want to worry about maintaining this map + std::unordered_map<Snowflake, Gtk::TreeModel::iterator> m_tmp_channel_map; + public: typedef sigc::signal<void, Snowflake> type_signal_action_channel_item_select; typedef sigc::signal<void, Snowflake> type_signal_action_guild_leave; diff --git a/src/platform.cpp b/src/platform.cpp index ce744d7..dc64a26 100644 --- a/src/platform.cpp +++ b/src/platform.cpp @@ -1,18 +1,18 @@ #include "platform.hpp" #include "util.hpp" -#include <string> -#include <fstream> -#include <filesystem> #include <config.h> +#include <filesystem> +#include <fstream> +#include <string> using namespace std::literals::string_literals; #if defined(_WIN32) && defined(_MSC_VER) - #include <Windows.h> - #include <Shlwapi.h> - #include <ShlObj_core.h> #include <pango/pangocairo.h> #include <pango/pangofc-fontmap.h> + #include <ShlObj_core.h> + #include <Shlwapi.h> + #include <Windows.h> #pragma comment(lib, "Shlwapi.lib") bool Platform::SetupFonts() { using namespace std::string_literals; @@ -107,17 +107,29 @@ std::string Platform::FindResourceFolder() { } std::string Platform::FindConfigFile() { - const auto x = std::getenv("ABADDON_CONFIG"); - if (x != nullptr) - return x; + const auto cfg = std::getenv("ABADDON_CONFIG"); + if (cfg != nullptr) return cfg; - const auto home_env = std::getenv("HOME"); - if (home_env != nullptr) { - const auto home_path = home_env + "/.config/abaddon/abaddon.ini"s; - for (auto path : { "./abaddon.ini"s, home_path }) { - if (util::IsFile(path)) return path; + // use config present in cwd first + if (util::IsFile("./abaddon.ini")) + return "./abaddon.ini"; + + if (const auto home_env = std::getenv("HOME")) { + // use ~/.config if present + if (auto home_path = home_env + "/.config/abaddon/abaddon.ini"s; util::IsFile(home_path)) { + return home_path; } + + // fallback to ~/.config if the directory exists/can be created + std::error_code ec; + const auto home_path = home_env + "/.config/abaddon"s; + if (!util::IsFolder(home_path)) + std::filesystem::create_directories(home_path, ec); + if (util::IsFolder(home_path)) + return home_path + "/abaddon.ini"; } + + // fallback to cwd if cant find + cant make in ~/.config puts("can't find configuration file!"); return "./abaddon.ini"; } |