diff --git a/components/channels.cpp b/components/channels.cpp index 802b592..7cfd9e0 100644 --- a/components/channels.cpp +++ b/components/channels.cpp @@ -57,7 +57,7 @@ ChannelListRowDMChannel::ChannelListRowDMChannel(const ChannelData *data) { if (recipients.size() > 0) top_recipient = recipients[0]; - const static bool alt = Abaddon::Get().GetSettings().GetAltChannelWidget(); + const static bool alt = Abaddon::Get().GetSettings().GetUseMobileLayout(); if (alt) { auto *tmp = Gtk::manage(new Gtk::Label); m_lbl = tmp; @@ -131,7 +131,7 @@ ChannelListRowGuild::ChannelListRowGuild(const GuildData *data) { m_ev = Gtk::manage(new Gtk::EventBox); m_box = Gtk::manage(new Gtk::Box(Gtk::ORIENTATION_HORIZONTAL)); - const static bool alt = Abaddon::Get().GetSettings().GetAltChannelWidget(); + const static bool alt = Abaddon::Get().GetSettings().GetUseMobileLayout(); if (alt) { m_lbl = Gtk::manage(new Gtk::Label(data->Name)); } else { @@ -219,7 +219,7 @@ ChannelListRowCategory::ChannelListRowCategory(const ChannelData *data) { m_ev = Gtk::manage(new Gtk::EventBox); m_box = Gtk::manage(new Gtk::Box(Gtk::ORIENTATION_HORIZONTAL)); - const static bool alt = Abaddon::Get().GetSettings().GetAltChannelWidget(); + const static bool alt = Abaddon::Get().GetSettings().GetUseMobileLayout(); if (alt) { m_lbl = Gtk::manage(new Gtk::Label(*data->Name)); } else { @@ -274,7 +274,7 @@ ChannelListRowChannel::ChannelListRowChannel(const ChannelData *data) { m_ev = Gtk::manage(new Gtk::EventBox); m_box = Gtk::manage(new Gtk::Box(Gtk::ORIENTATION_HORIZONTAL)); - const static bool alt = Abaddon::Get().GetSettings().GetAltChannelWidget(); + const static bool alt = Abaddon::Get().GetSettings().GetUseMobileLayout(); if (alt) { m_lbl = Gtk::manage(new Gtk::Label("#" + *data->Name)); } else { diff --git a/settings.cpp b/settings.cpp index 4563ee9..3d5f0dd 100644 --- a/settings.cpp +++ b/settings.cpp @@ -82,6 +82,7 @@ bool SettingsManager::GetShowOwnerCrown() const { return GetSettingBool("gui", "owner_crown", true); } -bool SettingsManager::GetAltChannelWidget() const { - return GetSettingBool("gui", "alt_channel_widget", false); +bool SettingsManager::GetUseMobileLayout() const { + // todo: see if there's some sort of preprocessor directive to default this to true on mobile platforms + return GetSettingBool("gui", "mobile", false); } diff --git a/settings.hpp b/settings.hpp index 9bf5636..3dad284 100644 --- a/settings.hpp +++ b/settings.hpp @@ -20,7 +20,7 @@ public: std::string GetMainCSS() const; bool GetShowAnimations() const; bool GetShowOwnerCrown() const; - bool GetAltChannelWidget() const; + bool GetUseMobileLayout() const; bool IsValid() const; diff --git a/windows/mainwindow.cpp b/windows/mainwindow.cpp index d1598c6..654d745 100644 --- a/windows/mainwindow.cpp +++ b/windows/mainwindow.cpp @@ -1,11 +1,9 @@ #include "mainwindow.hpp" #include "../abaddon.hpp" -MainWindow::MainWindow() - : m_main_box(Gtk::ORIENTATION_VERTICAL) - , m_content_box(Gtk::ORIENTATION_HORIZONTAL) - , m_chan_chat_paned(Gtk::ORIENTATION_HORIZONTAL) - , m_chat_members_paned(Gtk::ORIENTATION_HORIZONTAL) { +MainWindow::MainWindow() { + const bool use_mobile = Abaddon::Get().GetSettings().GetUseMobileLayout(); + set_default_size(1200, 800); get_style_context()->add_class("app-window"); @@ -79,26 +77,10 @@ MainWindow::MainWindow() m_signal_action_add_recipient.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 *channel_list = m_channel_list.GetRoot(); auto *member_list = m_members.GetRoot(); auto *chat = m_chat.GetRoot(); - m_members.signal_action_show_user_menu().connect([this](const GdkEvent *event, Snowflake id, Snowflake guild_id) { - m_signal_action_show_user_menu.emit(event, id, guild_id); - }); - - m_chat.signal_action_open_user_menu().connect([this](const GdkEvent *event, Snowflake id, Snowflake guild_id) { - m_signal_action_show_user_menu.emit(event, id, guild_id); - }); - chat->set_vexpand(true); chat->set_hexpand(true); chat->show(); @@ -110,24 +92,76 @@ MainWindow::MainWindow() member_list->set_vexpand(true); member_list->show(); - m_chan_chat_paned.pack1(*channel_list); - m_chan_chat_paned.pack2(m_chat_members_paned); - m_chan_chat_paned.child_property_shrink(*channel_list) = false; - m_chan_chat_paned.child_property_resize(*channel_list) = false; - m_chan_chat_paned.set_position(200); - m_chan_chat_paned.show(); - m_content_box.add(m_chan_chat_paned); + if (use_mobile) { + m_main_box = Gtk::manage(new Gtk::Box(Gtk::ORIENTATION_VERTICAL)); - m_chat_members_paned.pack1(*chat); - m_chat_members_paned.pack2(*member_list); - m_chat_members_paned.child_property_shrink(*member_list) = false; - m_chat_members_paned.child_property_resize(*member_list) = false; - int w, h; - get_default_size(w, h); // :s - m_chat_members_paned.set_position(w - m_chan_chat_paned.get_position() - 150); - m_chat_members_paned.show(); + m_stack = Gtk::manage(new Gtk::Stack); + m_switcher = Gtk::manage(new Gtk::StackSwitcher); - add(m_main_box); + m_stack->set_transition_type(Gtk::STACK_TRANSITION_TYPE_SLIDE_LEFT_RIGHT); + + m_stack->add(*m_channel_list.GetRoot(), "Channels"); + m_stack->add(*m_chat.GetRoot(), "Chat"); + m_stack->add(*m_members.GetRoot(), "Members"); + m_stack->child_property_icon_name(*m_channel_list.GetRoot()) = "format-justify-fill-symbolic"; + m_stack->child_property_icon_name(*m_chat.GetRoot()) = "user-invisible-symbolic"; + m_stack->child_property_icon_name(*m_members.GetRoot()) = "avatar-default-symbolic"; + + m_switcher->set_hexpand(true); + m_switcher->set_halign(Gtk::ALIGN_FILL); + m_switcher->set_homogeneous(true); + + m_main_box->add(m_menu_bar); + m_main_box->add(*m_stack); + m_main_box->add(*m_switcher); + m_switcher->set_stack(*m_stack); + + m_stack->show(); + m_switcher->show_all(); + m_main_box->show(); + + add(*m_main_box); + } else { + m_main_box = Gtk::manage(new Gtk::Box(Gtk::ORIENTATION_VERTICAL)); + m_content_box = Gtk::manage(new Gtk::Box(Gtk::ORIENTATION_HORIZONTAL)); + m_chan_chat_paned = Gtk::manage(new Gtk::Paned(Gtk::ORIENTATION_HORIZONTAL)); + m_chat_members_paned = Gtk::manage(new Gtk::Paned(Gtk::ORIENTATION_HORIZONTAL)); + + 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(); + + m_chan_chat_paned->pack1(*channel_list); + m_chan_chat_paned->pack2(*m_chat_members_paned); + m_chan_chat_paned->child_property_shrink(*channel_list) = false; + m_chan_chat_paned->child_property_resize(*channel_list) = false; + m_chan_chat_paned->set_position(200); + m_chan_chat_paned->show(); + m_content_box->add(*m_chan_chat_paned); + + m_chat_members_paned->pack1(*chat); + m_chat_members_paned->pack2(*member_list); + m_chat_members_paned->child_property_shrink(*member_list) = false; + m_chat_members_paned->child_property_resize(*member_list) = false; + int w, h; + get_default_size(w, h); // :s + m_chat_members_paned->set_position(w - m_chan_chat_paned->get_position() - 150); + m_chat_members_paned->show(); + + add(*m_main_box); + } + + m_members.signal_action_show_user_menu().connect([this](const GdkEvent *event, Snowflake id, Snowflake guild_id) { + m_signal_action_show_user_menu.emit(event, id, guild_id); + }); + + m_chat.signal_action_open_user_menu().connect([this](const GdkEvent *event, Snowflake id, Snowflake guild_id) { + m_signal_action_show_user_menu.emit(event, id, guild_id); + }); } void MainWindow::UpdateComponents() { @@ -202,6 +236,10 @@ void MainWindow::UpdateChatActiveChannel(Snowflake id) { m_chat.SetActiveChannel(id); m_members.SetActiveChannel(id); m_channel_list.SetActiveChannel(id); + + if (m_stack != nullptr) { + m_stack->set_visible_child("Chat"); + } } Snowflake MainWindow::GetChatActiveChannel() const { diff --git a/windows/mainwindow.hpp b/windows/mainwindow.hpp index b1803ad..679c683 100644 --- a/windows/mainwindow.hpp +++ b/windows/mainwindow.hpp @@ -66,10 +66,15 @@ protected: type_signal_action_add_recipient m_signal_action_add_recipient; protected: - Gtk::Box m_main_box; - Gtk::Box m_content_box; - Gtk::Paned m_chan_chat_paned; - Gtk::Paned m_chat_members_paned; + Gtk::Box *m_main_box; + // normal + Gtk::Box *m_content_box = nullptr; + Gtk::Paned *m_chan_chat_paned = nullptr; + Gtk::Paned *m_chat_members_paned = nullptr; + + // mobile + Gtk::StackSwitcher *m_switcher = nullptr; + Gtk::Stack *m_stack = nullptr; ChannelList m_channel_list; ChatWindow m_chat;