add opened tabs to state

This commit is contained in:
ouwou 2022-04-21 14:41:45 -04:00
parent 2dab595476
commit b4ab88f708
7 changed files with 62 additions and 0 deletions

View File

@ -424,6 +424,9 @@ void Abaddon::SaveState() {
AbaddonApplicationState state;
state.ActiveChannel = m_main_window->GetChatActiveChannel();
state.Expansion = m_main_window->GetChannelList()->GetExpansionState();
#ifdef WITH_LIBHANDY
state.Tabs = m_main_window->GetChatWindow()->GetTabsState();
#endif
const auto path = GetStateCachePath();
if (!util::IsFolder(path)) {
@ -450,6 +453,9 @@ void Abaddon::LoadState() {
try {
AbaddonApplicationState state = nlohmann::json::parse(data.begin(), data.end());
m_main_window->GetChannelList()->UseExpansionState(state.Expansion);
#ifdef WITH_LIBHANDY
m_main_window->GetChatWindow()->UseTabsState(state.Tabs);
#endif
ActionChannelOpened(state.ActiveChannel);
} catch (const std::exception &e) {
printf("failed to load application state: %s\n", e.what());

View File

@ -81,6 +81,28 @@ void ChannelTabSwitcherHandy::ReplaceActiveTab(Snowflake id) {
}
}
TabsState ChannelTabSwitcherHandy::GetTabsState() {
TabsState state;
const gint num_pages = hdy_tab_view_get_n_pages(m_tab_view);
for (gint i = 0; i < num_pages; i++) {
auto *page = hdy_tab_view_get_nth_page(m_tab_view, i);
if (page != nullptr) {
if (const auto it = m_pages_rev.find(page); it != m_pages_rev.end()) {
state.Channels.push_back(it->second);
}
}
}
return state;
}
void ChannelTabSwitcherHandy::UseTabsState(const TabsState &state) {
for (auto id : state.Channels) {
AddChannelTab(id);
}
}
void ChannelTabSwitcherHandy::CheckUnread(Snowflake id) {
if (auto it = m_pages.find(id); it != m_pages.end()) {
hdy_tab_page_set_needs_attention(it->second, Abaddon::Get().GetDiscordClient().GetUnreadStateForChannel(id) > -1);

View File

@ -5,6 +5,7 @@
#include <unordered_map>
#include <handy.h>
#include "discord/snowflake.hpp"
#include "state.hpp"
class ChannelData;
@ -18,6 +19,8 @@ public:
void AddChannelTab(Snowflake id);
// switches to existing tab if it exists
void ReplaceActiveTab(Snowflake id);
TabsState GetTabsState();
void UseTabsState(const TabsState &state);
private:
void CheckUnread(Snowflake id);

View File

@ -172,6 +172,14 @@ void ChatWindow::SetTopic(const std::string &text) {
void ChatWindow::OpenNewTab(Snowflake id) {
m_tab_switcher->AddChannelTab(id);
}
TabsState ChatWindow::GetTabsState() {
return m_tab_switcher->GetTabsState();
}
void ChatWindow::UseTabsState(const TabsState &state) {
m_tab_switcher->UseTabsState(state);
}
#endif
Snowflake ChatWindow::GetActiveChannel() const {

View File

@ -4,6 +4,7 @@
#include <set>
#include "discord/discord.hpp"
#include "completer.hpp"
#include "state.hpp"
#ifdef WITH_LIBHANDY
class ChannelTabSwitcherHandy;
@ -36,6 +37,8 @@ public:
#ifdef WITH_LIBHANDY
void OpenNewTab(Snowflake id);
TabsState GetTabsState();
void UseTabsState(const TabsState &state);
#endif
protected:

View File

@ -24,9 +24,18 @@ void from_json(const nlohmann::json &j, ExpansionState &m) {
j.at("c").get_to(m.Children);
}
void to_json(nlohmann::json &j, const TabsState &m) {
j = m.Channels;
}
void from_json(const nlohmann::json &j, TabsState &m) {
j.get_to(m.Channels);
}
void to_json(nlohmann::json &j, const AbaddonApplicationState &m) {
j["active_channel"] = m.ActiveChannel;
j["expansion"] = m.Expansion;
j["tabs"] = m.Tabs;
}
void from_json(const nlohmann::json &j, AbaddonApplicationState &m) {
@ -34,4 +43,6 @@ void from_json(const nlohmann::json &j, AbaddonApplicationState &m) {
j.at("active_channel").get_to(m.ActiveChannel);
if (j.contains("expansion"))
j.at("expansion").get_to(m.Expansion);
if (j.contains("tabs"))
j.at("tabs").get_to(m.Tabs);
}

View File

@ -1,3 +1,4 @@
#pragma once
#include <vector>
#include <nlohmann/json.hpp>
#include "discord/snowflake.hpp"
@ -18,9 +19,17 @@ struct ExpansionState {
friend void from_json(const nlohmann::json &j, ExpansionState &m);
};
struct TabsState {
std::vector<Snowflake> Channels;
friend void to_json(nlohmann::json &j, const TabsState &m);
friend void from_json(const nlohmann::json &j, TabsState &m);
};
struct AbaddonApplicationState {
Snowflake ActiveChannel;
ExpansionStateRoot Expansion;
TabsState Tabs;
friend void to_json(nlohmann::json &j, const AbaddonApplicationState &m);
friend void from_json(const nlohmann::json &j, AbaddonApplicationState &m);