forked from OpenGamers/abaddon
add opened tabs to state
This commit is contained in:
@@ -424,6 +424,9 @@ void Abaddon::SaveState() {
|
|||||||
AbaddonApplicationState state;
|
AbaddonApplicationState state;
|
||||||
state.ActiveChannel = m_main_window->GetChatActiveChannel();
|
state.ActiveChannel = m_main_window->GetChatActiveChannel();
|
||||||
state.Expansion = m_main_window->GetChannelList()->GetExpansionState();
|
state.Expansion = m_main_window->GetChannelList()->GetExpansionState();
|
||||||
|
#ifdef WITH_LIBHANDY
|
||||||
|
state.Tabs = m_main_window->GetChatWindow()->GetTabsState();
|
||||||
|
#endif
|
||||||
|
|
||||||
const auto path = GetStateCachePath();
|
const auto path = GetStateCachePath();
|
||||||
if (!util::IsFolder(path)) {
|
if (!util::IsFolder(path)) {
|
||||||
@@ -450,6 +453,9 @@ void Abaddon::LoadState() {
|
|||||||
try {
|
try {
|
||||||
AbaddonApplicationState state = nlohmann::json::parse(data.begin(), data.end());
|
AbaddonApplicationState state = nlohmann::json::parse(data.begin(), data.end());
|
||||||
m_main_window->GetChannelList()->UseExpansionState(state.Expansion);
|
m_main_window->GetChannelList()->UseExpansionState(state.Expansion);
|
||||||
|
#ifdef WITH_LIBHANDY
|
||||||
|
m_main_window->GetChatWindow()->UseTabsState(state.Tabs);
|
||||||
|
#endif
|
||||||
ActionChannelOpened(state.ActiveChannel);
|
ActionChannelOpened(state.ActiveChannel);
|
||||||
} catch (const std::exception &e) {
|
} catch (const std::exception &e) {
|
||||||
printf("failed to load application state: %s\n", e.what());
|
printf("failed to load application state: %s\n", e.what());
|
||||||
|
|||||||
@@ -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) {
|
void ChannelTabSwitcherHandy::CheckUnread(Snowflake id) {
|
||||||
if (auto it = m_pages.find(id); it != m_pages.end()) {
|
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);
|
hdy_tab_page_set_needs_attention(it->second, Abaddon::Get().GetDiscordClient().GetUnreadStateForChannel(id) > -1);
|
||||||
|
|||||||
@@ -5,6 +5,7 @@
|
|||||||
#include <unordered_map>
|
#include <unordered_map>
|
||||||
#include <handy.h>
|
#include <handy.h>
|
||||||
#include "discord/snowflake.hpp"
|
#include "discord/snowflake.hpp"
|
||||||
|
#include "state.hpp"
|
||||||
|
|
||||||
class ChannelData;
|
class ChannelData;
|
||||||
|
|
||||||
@@ -18,6 +19,8 @@ public:
|
|||||||
void AddChannelTab(Snowflake id);
|
void AddChannelTab(Snowflake id);
|
||||||
// switches to existing tab if it exists
|
// switches to existing tab if it exists
|
||||||
void ReplaceActiveTab(Snowflake id);
|
void ReplaceActiveTab(Snowflake id);
|
||||||
|
TabsState GetTabsState();
|
||||||
|
void UseTabsState(const TabsState &state);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void CheckUnread(Snowflake id);
|
void CheckUnread(Snowflake id);
|
||||||
|
|||||||
@@ -172,6 +172,14 @@ void ChatWindow::SetTopic(const std::string &text) {
|
|||||||
void ChatWindow::OpenNewTab(Snowflake id) {
|
void ChatWindow::OpenNewTab(Snowflake id) {
|
||||||
m_tab_switcher->AddChannelTab(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
|
#endif
|
||||||
|
|
||||||
Snowflake ChatWindow::GetActiveChannel() const {
|
Snowflake ChatWindow::GetActiveChannel() const {
|
||||||
|
|||||||
@@ -4,6 +4,7 @@
|
|||||||
#include <set>
|
#include <set>
|
||||||
#include "discord/discord.hpp"
|
#include "discord/discord.hpp"
|
||||||
#include "completer.hpp"
|
#include "completer.hpp"
|
||||||
|
#include "state.hpp"
|
||||||
|
|
||||||
#ifdef WITH_LIBHANDY
|
#ifdef WITH_LIBHANDY
|
||||||
class ChannelTabSwitcherHandy;
|
class ChannelTabSwitcherHandy;
|
||||||
@@ -36,6 +37,8 @@ public:
|
|||||||
|
|
||||||
#ifdef WITH_LIBHANDY
|
#ifdef WITH_LIBHANDY
|
||||||
void OpenNewTab(Snowflake id);
|
void OpenNewTab(Snowflake id);
|
||||||
|
TabsState GetTabsState();
|
||||||
|
void UseTabsState(const TabsState &state);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|||||||
@@ -24,9 +24,18 @@ void from_json(const nlohmann::json &j, ExpansionState &m) {
|
|||||||
j.at("c").get_to(m.Children);
|
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) {
|
void to_json(nlohmann::json &j, const AbaddonApplicationState &m) {
|
||||||
j["active_channel"] = m.ActiveChannel;
|
j["active_channel"] = m.ActiveChannel;
|
||||||
j["expansion"] = m.Expansion;
|
j["expansion"] = m.Expansion;
|
||||||
|
j["tabs"] = m.Tabs;
|
||||||
}
|
}
|
||||||
|
|
||||||
void from_json(const nlohmann::json &j, AbaddonApplicationState &m) {
|
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);
|
j.at("active_channel").get_to(m.ActiveChannel);
|
||||||
if (j.contains("expansion"))
|
if (j.contains("expansion"))
|
||||||
j.at("expansion").get_to(m.Expansion);
|
j.at("expansion").get_to(m.Expansion);
|
||||||
|
if (j.contains("tabs"))
|
||||||
|
j.at("tabs").get_to(m.Tabs);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
#pragma once
|
||||||
#include <vector>
|
#include <vector>
|
||||||
#include <nlohmann/json.hpp>
|
#include <nlohmann/json.hpp>
|
||||||
#include "discord/snowflake.hpp"
|
#include "discord/snowflake.hpp"
|
||||||
@@ -18,9 +19,17 @@ struct ExpansionState {
|
|||||||
friend void from_json(const nlohmann::json &j, ExpansionState &m);
|
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 {
|
struct AbaddonApplicationState {
|
||||||
Snowflake ActiveChannel;
|
Snowflake ActiveChannel;
|
||||||
ExpansionStateRoot Expansion;
|
ExpansionStateRoot Expansion;
|
||||||
|
TabsState Tabs;
|
||||||
|
|
||||||
friend void to_json(nlohmann::json &j, const AbaddonApplicationState &m);
|
friend void to_json(nlohmann::json &j, const AbaddonApplicationState &m);
|
||||||
friend void from_json(const nlohmann::json &j, AbaddonApplicationState &m);
|
friend void from_json(const nlohmann::json &j, AbaddonApplicationState &m);
|
||||||
|
|||||||
Reference in New Issue
Block a user