summaryrefslogtreecommitdiff
path: root/src/windows/mainwindow.cpp
diff options
context:
space:
mode:
authorouwou <26526779+ouwou@users.noreply.github.com>2021-11-28 22:48:30 -0500
committerouwou <26526779+ouwou@users.noreply.github.com>2021-11-28 22:48:30 -0500
commite1703aea3fd597b23bde90e6c505278c517be611 (patch)
tree37d98fc90c9cd0844388bfb79beda2204f44af92 /src/windows/mainwindow.cpp
parentfd53a76bf6f53a095a639765923a30f2206b2cd6 (diff)
parente02107feea8214a045e6faa969f00dcbc0d2b072 (diff)
downloadabaddon-portaudio-e1703aea3fd597b23bde90e6c505278c517be611.tar.gz
abaddon-portaudio-e1703aea3fd597b23bde90e6c505278c517be611.zip
merge master
Diffstat (limited to 'src/windows/mainwindow.cpp')
-rw-r--r--src/windows/mainwindow.cpp308
1 files changed, 308 insertions, 0 deletions
diff --git a/src/windows/mainwindow.cpp b/src/windows/mainwindow.cpp
new file mode 100644
index 0000000..659107a
--- /dev/null
+++ b/src/windows/mainwindow.cpp
@@ -0,0 +1,308 @@
+#include "mainwindow.hpp"
+#include "abaddon.hpp"
+
+MainWindow::MainWindow()
+ : m_main_box(Gtk::ORIENTATION_VERTICAL)
+ , m_content_box(Gtk::ORIENTATION_HORIZONTAL)
+ , m_chan_content_paned(Gtk::ORIENTATION_HORIZONTAL)
+ , m_content_members_paned(Gtk::ORIENTATION_HORIZONTAL) {
+ set_default_size(1200, 800);
+ get_style_context()->add_class("app-window");
+
+ m_menu_discord.set_label("Discord");
+ m_menu_discord.set_submenu(m_menu_discord_sub);
+ m_menu_discord_connect.set_label("Connect");
+ m_menu_discord_connect.set_sensitive(false);
+ m_menu_discord_disconnect.set_label("Disconnect");
+ m_menu_discord_disconnect.set_sensitive(false);
+ m_menu_discord_set_token.set_label("Set Token");
+ m_menu_discord_join_guild.set_label("Accept Invite");
+ m_menu_discord_join_guild.set_sensitive(false);
+ m_menu_discord_set_status.set_label("Set Status");
+ m_menu_discord_set_status.set_sensitive(false);
+ m_menu_discord_add_recipient.set_label("Add user to DM");
+ m_menu_discord_sub.append(m_menu_discord_connect);
+ m_menu_discord_sub.append(m_menu_discord_disconnect);
+ m_menu_discord_sub.append(m_menu_discord_set_token);
+ m_menu_discord_sub.append(m_menu_discord_join_guild);
+ m_menu_discord_sub.append(m_menu_discord_set_status);
+ m_menu_discord_sub.append(m_menu_discord_add_recipient);
+ m_menu_discord_sub.signal_popped_up().connect(sigc::mem_fun(*this, &MainWindow::OnDiscordSubmenuPopup)); // this gets called twice for some reason
+ m_menu_discord.set_submenu(m_menu_discord_sub);
+
+ m_menu_file.set_label("File");
+ m_menu_file.set_submenu(m_menu_file_sub);
+ m_menu_file_reload_css.set_label("Reload CSS");
+ m_menu_file_clear_cache.set_label("Clear file cache");
+ m_menu_file_sub.append(m_menu_file_reload_css);
+ m_menu_file_sub.append(m_menu_file_clear_cache);
+
+ m_menu_view.set_label("View");
+ m_menu_view.set_submenu(m_menu_view_sub);
+ m_menu_view_friends.set_label("Friends");
+ m_menu_view_pins.set_label("Pins");
+ m_menu_view_threads.set_label("Threads");
+ m_menu_view_sub.append(m_menu_view_friends);
+ m_menu_view_sub.append(m_menu_view_pins);
+ m_menu_view_sub.append(m_menu_view_threads);
+ m_menu_view_sub.signal_popped_up().connect(sigc::mem_fun(*this, &MainWindow::OnViewSubmenuPopup));
+
+ m_menu_bar.append(m_menu_file);
+ m_menu_bar.append(m_menu_discord);
+ m_menu_bar.append(m_menu_view);
+ m_menu_bar.show_all();
+
+ m_menu_discord_connect.signal_activate().connect([this] {
+ m_signal_action_connect.emit();
+ });
+
+ m_menu_discord_disconnect.signal_activate().connect([this] {
+ m_signal_action_disconnect.emit();
+ });
+
+ m_menu_discord_set_token.signal_activate().connect([this] {
+ m_signal_action_set_token.emit();
+ });
+
+ m_menu_discord_join_guild.signal_activate().connect([this] {
+ m_signal_action_join_guild.emit();
+ });
+
+ m_menu_file_reload_css.signal_activate().connect([this] {
+ m_signal_action_reload_css.emit();
+ });
+
+ m_menu_discord_set_status.signal_activate().connect([this] {
+ m_signal_action_set_status.emit();
+ });
+
+ m_menu_file_clear_cache.signal_activate().connect([this] {
+ Abaddon::Get().GetImageManager().ClearCache();
+ });
+
+ m_menu_discord_add_recipient.signal_activate().connect([this] {
+ m_signal_action_add_recipient.emit(GetChatActiveChannel());
+ });
+
+ m_menu_view_friends.signal_activate().connect([this] {
+ UpdateChatActiveChannel(Snowflake::Invalid);
+ m_members.UpdateMemberList();
+ m_content_stack.set_visible_child("friends");
+ });
+
+ m_menu_view_pins.signal_activate().connect([this] {
+ m_signal_action_view_pins.emit(GetChatActiveChannel());
+ });
+
+ m_menu_view_threads.signal_activate().connect([this] {
+ m_signal_action_view_threads.emit(GetChatActiveChannel());
+ });
+
+ m_content_box.set_hexpand(true);
+ m_content_box.set_vexpand(true);
+ m_content_box.show();
+
+ m_main_box.add(m_menu_bar);
+ m_main_box.add(m_content_box);
+ m_main_box.show();
+
+ auto *member_list = m_members.GetRoot();
+ auto *chat = m_chat.GetRoot();
+
+ chat->set_vexpand(true);
+ chat->set_hexpand(true);
+ chat->show();
+
+ m_channel_list.set_vexpand(true);
+ m_channel_list.set_size_request(-1, -1);
+ m_channel_list.show();
+
+ member_list->set_vexpand(true);
+ member_list->show();
+
+ m_friends.set_vexpand(true);
+ m_friends.set_hexpand(true);
+ m_friends.show();
+
+ m_content_stack.add(*chat, "chat");
+ m_content_stack.add(m_friends, "friends");
+ m_content_stack.set_vexpand(true);
+ m_content_stack.set_hexpand(true);
+ m_content_stack.set_visible_child("chat");
+ m_content_stack.show();
+
+ m_chan_content_paned.pack1(m_channel_list);
+ m_chan_content_paned.pack2(m_content_members_paned);
+ m_chan_content_paned.child_property_shrink(m_channel_list) = false;
+ m_chan_content_paned.child_property_resize(m_channel_list) = false;
+ m_chan_content_paned.set_position(200);
+ m_chan_content_paned.show();
+ m_content_box.add(m_chan_content_paned);
+
+ m_content_members_paned.pack1(m_content_stack);
+ m_content_members_paned.pack2(*member_list);
+ m_content_members_paned.child_property_shrink(*member_list) = false;
+ m_content_members_paned.child_property_resize(*member_list) = false;
+ int w, h;
+ get_default_size(w, h); // :s
+ m_content_members_paned.set_position(w - m_chan_content_paned.get_position() - 150);
+ m_content_members_paned.show();
+
+ add(m_main_box);
+}
+
+void MainWindow::UpdateComponents() {
+ bool discord_active = Abaddon::Get().IsDiscordActive();
+
+ if (!discord_active) {
+ m_chat.Clear();
+ m_members.Clear();
+ } else {
+ m_members.UpdateMemberList();
+ }
+ UpdateChannelListing();
+}
+
+void MainWindow::UpdateMembers() {
+ m_members.UpdateMemberList();
+}
+
+void MainWindow::UpdateChannelListing() {
+ m_channel_list.UpdateListing();
+}
+
+void MainWindow::UpdateChatWindowContents() {
+ auto &discord = Abaddon::Get().GetDiscordClient();
+ auto msgs = discord.GetMessagesForChannel(m_chat.GetActiveChannel(), 50);
+ m_chat.SetMessages(msgs);
+ m_members.UpdateMemberList();
+}
+
+void MainWindow::UpdateChatActiveChannel(Snowflake id) {
+ m_chat.SetActiveChannel(id);
+ m_members.SetActiveChannel(id);
+ m_channel_list.SetActiveChannel(id);
+ m_content_stack.set_visible_child("chat");
+}
+
+Snowflake MainWindow::GetChatActiveChannel() const {
+ return m_chat.GetActiveChannel();
+}
+
+void MainWindow::UpdateChatNewMessage(const Message &data) {
+ if (data.ChannelID == GetChatActiveChannel()) {
+ m_chat.AddNewMessage(data);
+ }
+}
+
+void MainWindow::UpdateChatMessageDeleted(Snowflake id, Snowflake channel_id) {
+ if (channel_id == GetChatActiveChannel())
+ m_chat.DeleteMessage(id);
+}
+
+void MainWindow::UpdateChatMessageUpdated(Snowflake id, Snowflake channel_id) {
+ if (channel_id == GetChatActiveChannel())
+ m_chat.UpdateMessage(id);
+}
+
+void MainWindow::UpdateChatPrependHistory(const std::vector<Message> &msgs) {
+ m_chat.AddNewHistory(msgs); // given vector should be sorted ascending
+}
+
+void MainWindow::InsertChatInput(std::string text) {
+ m_chat.InsertChatInput(text);
+}
+
+Snowflake MainWindow::GetChatOldestListedMessage() {
+ return m_chat.GetOldestListedMessage();
+}
+
+void MainWindow::UpdateChatReactionAdd(Snowflake id, const Glib::ustring &param) {
+ m_chat.UpdateReactions(id);
+}
+
+void MainWindow::UpdateChatReactionRemove(Snowflake id, const Glib::ustring &param) {
+ m_chat.UpdateReactions(id);
+}
+
+void MainWindow::OnDiscordSubmenuPopup(const Gdk::Rectangle *flipped_rect, const Gdk::Rectangle *final_rect, bool flipped_x, bool flipped_y) {
+ auto &discord = Abaddon::Get().GetDiscordClient();
+ auto channel_id = GetChatActiveChannel();
+ m_menu_discord_add_recipient.set_visible(false);
+ if (channel_id.IsValid()) {
+ auto channel = discord.GetChannel(channel_id);
+ if (channel.has_value() && channel->GetDMRecipients().size() + 1 < 10)
+ m_menu_discord_add_recipient.set_visible(channel->Type == ChannelType::GROUP_DM);
+ }
+
+ const bool discord_active = Abaddon::Get().GetDiscordClient().IsStarted();
+
+ std::string token = Abaddon::Get().GetDiscordToken();
+ m_menu_discord_connect.set_sensitive(token.size() > 0 && !discord_active);
+ m_menu_discord_disconnect.set_sensitive(discord_active);
+ m_menu_discord_join_guild.set_sensitive(discord_active);
+ m_menu_discord_set_token.set_sensitive(!discord_active);
+ m_menu_discord_set_status.set_sensitive(discord_active);
+}
+
+void MainWindow::OnViewSubmenuPopup(const Gdk::Rectangle *flipped_rect, const Gdk::Rectangle *final_rect, bool flipped_x, bool flipped_y) {
+ m_menu_view_friends.set_sensitive(Abaddon::Get().GetDiscordClient().IsStarted());
+ auto channel_id = GetChatActiveChannel();
+ m_menu_view_pins.set_sensitive(false);
+ m_menu_view_threads.set_sensitive(false);
+ if (channel_id.IsValid()) {
+ auto channel = Abaddon::Get().GetDiscordClient().GetChannel(channel_id);
+ if (channel.has_value()) {
+ m_menu_view_threads.set_sensitive(channel->Type == ChannelType::GUILD_TEXT || channel->IsThread());
+ m_menu_view_pins.set_sensitive(channel->Type == ChannelType::GUILD_TEXT || channel->Type == ChannelType::DM || channel->Type == ChannelType::GROUP_DM || channel->IsThread());
+ }
+ }
+}
+
+ChannelList *MainWindow::GetChannelList() {
+ return &m_channel_list;
+}
+
+ChatWindow *MainWindow::GetChatWindow() {
+ return &m_chat;
+}
+
+MemberList *MainWindow::GetMemberList() {
+ return &m_members;
+}
+
+MainWindow::type_signal_action_connect MainWindow::signal_action_connect() {
+ return m_signal_action_connect;
+}
+
+MainWindow::type_signal_action_disconnect MainWindow::signal_action_disconnect() {
+ return m_signal_action_disconnect;
+}
+
+MainWindow::type_signal_action_set_token MainWindow::signal_action_set_token() {
+ return m_signal_action_set_token;
+}
+
+MainWindow::type_signal_action_reload_css MainWindow::signal_action_reload_css() {
+ return m_signal_action_reload_css;
+}
+
+MainWindow::type_signal_action_join_guild MainWindow::signal_action_join_guild() {
+ return m_signal_action_join_guild;
+}
+
+MainWindow::type_signal_action_set_status MainWindow::signal_action_set_status() {
+ return m_signal_action_set_status;
+}
+
+MainWindow::type_signal_action_add_recipient MainWindow::signal_action_add_recipient() {
+ return m_signal_action_add_recipient;
+}
+
+MainWindow::type_signal_action_view_pins MainWindow::signal_action_view_pins() {
+ return m_signal_action_view_pins;
+}
+
+MainWindow::type_signal_action_view_threads MainWindow::signal_action_view_threads() {
+ return m_signal_action_view_threads;
+}