diff --git a/src/slic3r/GUI/MainFrame.cpp b/src/slic3r/GUI/MainFrame.cpp index 127a402d94..ef498f0b6d 100644 --- a/src/slic3r/GUI/MainFrame.cpp +++ b/src/slic3r/GUI/MainFrame.cpp @@ -64,6 +64,7 @@ #include "NotificationManager.hpp" #include "Preferences.hpp" #include "WebViewDialog.hpp" +#include "UserAccount.hpp" #ifdef _WIN32 #include @@ -595,12 +596,36 @@ static wxString GetTooltipForSettingsButton(PrinterTechnology pt) return from_u8(tooltip); } +void MainFrame::set_callbacks_for_topbar_menus() +{ + m_bar_menus.set_workspaces_menu_callbacks( + []() -> int { return wxGetApp().get_mode(); }, + [](/*ConfigOptionMode*/int mode) -> void { wxGetApp().save_mode(mode); }, + [](/*ConfigOptionMode*/int mode) -> std::string { return wxGetApp().get_mode_btn_color(mode); } + ); + + m_bar_menus.set_account_menu_callbacks( + []() -> void { wxGetApp().plater()->toggle_remember_user_account_session(); }, + []() -> void { wxGetApp().plater()->act_with_user_account(); }, + []() -> TopBarMenus::UserAccountInfo { + if (auto user_account = wxGetApp().plater()->get_user_account()) + return { user_account->is_logged(), + user_account->get_remember_session(), + user_account->get_username(), + user_account->get_avatar_path(true) }; + return TopBarMenus::UserAccountInfo(); + } + ); +} + void MainFrame::init_tabpanel() { wxGetApp().update_ui_colours_from_appconfig(); + set_callbacks_for_topbar_menus(); + if (wxGetApp().is_editor()) { - m_tmp_top_bar = new TopBar(this, &m_bar_menus, false); + m_tmp_top_bar = new TopBar(this, &m_bar_menus, [this]() -> void { select_tab(); }); m_tmp_top_bar->SetFont(Slic3r::GUI::wxGetApp().normal_font()); m_tmp_top_bar->Hide(); } @@ -855,7 +880,8 @@ void MainFrame::set_printer_webview_credentials(const std::string& usr, const st void Slic3r::GUI::MainFrame::refresh_account_menu(bool avatar/* = false */) { // Update User name in TopBar - m_bar_menus.UpdateAccountMenu(m_plater->get_user_account()); + m_bar_menus.UpdateAccountMenu(); + m_tabpanel->GetTopBarItemsCtrl()->UpdateAccountButton(avatar); m_tmp_top_bar->GetTopBarItemsCtrl()->UpdateAccountButton(avatar); } diff --git a/src/slic3r/GUI/MainFrame.hpp b/src/slic3r/GUI/MainFrame.hpp index 147059d945..be329355d5 100644 --- a/src/slic3r/GUI/MainFrame.hpp +++ b/src/slic3r/GUI/MainFrame.hpp @@ -171,6 +171,7 @@ public: void update_title(); + void set_callbacks_for_topbar_menus(); void init_tabpanel(); void create_preset_tabs(); void add_created_tab(Tab* panel, const std::string& bmp_name = ""); diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index 036b18d2ac..56b66db03b 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -6815,6 +6815,22 @@ const UserAccount* Plater::get_user_account() const return p->user_account.get(); } +void Plater::toggle_remember_user_account_session() +{ + if (p->user_account) + p->user_account->toggle_remember_session(); +} + +void Plater::act_with_user_account() +{ + if (p->user_account) { + if (p->user_account->is_logged()) + p->user_account->do_logout(); + else + p->user_account->do_login(); + } +} + void Plater::init_notification_manager() { p->init_notification_manager(); diff --git a/src/slic3r/GUI/Plater.hpp b/src/slic3r/GUI/Plater.hpp index 28c33b13c3..d841d17378 100644 --- a/src/slic3r/GUI/Plater.hpp +++ b/src/slic3r/GUI/Plater.hpp @@ -358,6 +358,9 @@ public: UserAccount* get_user_account(); const UserAccount* get_user_account() const; + void toggle_remember_user_account_session(); + void act_with_user_account(); + void init_notification_manager(); void bring_instance_forward(); diff --git a/src/slic3r/GUI/TopBar.cpp b/src/slic3r/GUI/TopBar.cpp index 32766cb5fc..8665cd1cbc 100644 --- a/src/slic3r/GUI/TopBar.cpp +++ b/src/slic3r/GUI/TopBar.cpp @@ -2,10 +2,7 @@ #include "TopBarMenus.hpp" #include "GUI_App.hpp" -#include "MainFrame.hpp" -#include "Plater.hpp" #include "Search.hpp" -#include "UserAccount.hpp" #include "format.hpp" #include "I18N.hpp" @@ -228,14 +225,13 @@ void TopBarItemsCtrl::ButtonWithPopup::SetLabel(const wxString& label) void TopBarItemsCtrl::UpdateAccountButton(bool avatar/* = false*/) { - auto user_account = wxGetApp().plater()->get_user_account(); - const wxString user_name = user_account->is_logged() ? from_u8(user_account->get_username()) : _L("Log in"); + TopBarMenus::UserAccountInfo user_account = m_menus->get_user_account_info(); + const wxString user_name = user_account.is_logged ? from_u8(user_account.user_name) : _L("Log in"); m_account_btn->SetToolTip(user_name); #ifdef __linux__ if (avatar) { - if (user_account->is_logged()) { - boost::filesystem::path path = user_account->get_avatar_path(true); - ScalableBitmap new_logo(this, path, wxSize(icon_sz, icon_sz)); + if (user_account.is_logged) { + ScalableBitmap new_logo(this, user_account.avatar_path, wxSize(icon_sz, icon_sz)); if (new_logo.IsOk()) m_account_btn->SetBitmap_(new_logo); else @@ -247,9 +243,8 @@ void TopBarItemsCtrl::UpdateAccountButton(bool avatar/* = false*/) } #else if (avatar) { - if (user_account->is_logged()) { - boost::filesystem::path path = user_account->get_avatar_path(true); - ScalableBitmap new_logo(this, path, wxSize(icon_sz, icon_sz)); + if (user_account.is_logged) { + ScalableBitmap new_logo(this, user_account.avatar_path, wxSize(icon_sz, icon_sz)); if (new_logo.IsOk()) m_account_btn->SetBitmapBundle(new_logo.bmp()); else @@ -423,9 +418,10 @@ void TopBarItemsCtrl::update_btns_width() } } -TopBarItemsCtrl::TopBarItemsCtrl(wxWindow *parent, TopBarMenus* menus/* = nullptr*/, bool is_main/* = true*/) : +TopBarItemsCtrl::TopBarItemsCtrl(wxWindow *parent, TopBarMenus* menus/* = nullptr*/, std::function cb_settings_btn/* = nullptr*/) : wxControl(parent, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxBORDER_NONE | wxTAB_TRAVERSAL) ,m_menus(menus) + ,m_cb_settings_btn(cb_settings_btn) { wxGetApp().UpdateDarkUI(this); @@ -454,11 +450,9 @@ TopBarItemsCtrl::TopBarItemsCtrl(wxWindow *parent, TopBarMenus* menus/* = nullpt }); #endif - if (!is_main) { + if (m_cb_settings_btn) { m_settings_btn = new Button(this, _L("Settings"/*, "settings"*/)); - m_settings_btn->Bind(wxEVT_BUTTON, [](wxCommandEvent& event) { - wxGetApp().mainframe->select_tab(); - }); + m_settings_btn->Bind(wxEVT_BUTTON, [this](wxCommandEvent& event) { m_cb_settings_btn(); }); left_sizer->Add(m_settings_btn, 0, wxALIGN_CENTER_VERTICAL); } @@ -466,7 +460,7 @@ TopBarItemsCtrl::TopBarItemsCtrl(wxWindow *parent, TopBarMenus* menus/* = nullpt left_sizer->Add(m_buttons_sizer, 0, wxALIGN_CENTER_VERTICAL | wxLEFT | wxRIGHT, m_btn_margin); CreateSearch(); - if (!is_main) + if (m_cb_settings_btn) wxGetApp().searcher().set_search_input(m_search); wxBoxSizer* search_sizer = new wxBoxSizer(wxVERTICAL); @@ -498,10 +492,10 @@ TopBarItemsCtrl::TopBarItemsCtrl(wxWindow *parent, TopBarMenus* menus/* = nullpt m_sizer->SetItemMinSize(1, wxSize(42 * wxGetApp().em_unit(), -1)); - this->Bind(wxEVT_UPDATE_UI, [](wxUpdateUIEvent& evt) { - auto user_account = wxGetApp().plater()->get_user_account(); - evt.Enable(user_account ? user_account->is_logged() : false); - evt.Check (user_account ? user_account->get_remember_session() : false); + this->Bind(wxEVT_UPDATE_UI, [this](wxUpdateUIEvent& evt) { + auto user_account = m_menus->get_user_account_info(); + evt.Enable(user_account.is_logged); + evt.Check (user_account.remember_session); }, m_menus->remember_me_item_id); update_btns_width(); @@ -509,9 +503,7 @@ TopBarItemsCtrl::TopBarItemsCtrl(wxWindow *parent, TopBarMenus* menus/* = nullpt void TopBarItemsCtrl::UpdateMode() { - auto mode = wxGetApp().get_mode(); - - wxBitmapBundle bmp = *get_bmp_bundle("mode", 16, -1, wxGetApp().get_mode_btn_color(mode)); + wxBitmapBundle bmp = *m_menus->get_workspace_bitmap(); #ifdef __linux__ m_workspace_btn->SetBitmap(bmp); m_workspace_btn->SetBitmapCurrent(bmp); @@ -520,7 +512,7 @@ void TopBarItemsCtrl::UpdateMode() m_workspace_btn->SetBitmapBundle(bmp); #endif - m_workspace_btn->SetLabel(m_collapsed_btns ? "" : m_menus->get_workspace_name(mode)); + m_workspace_btn->SetLabel(m_collapsed_btns ? "" : m_menus->get_workspace_name()); this->Layout(); } @@ -653,10 +645,6 @@ void TopBarItemsCtrl::ShowFull() if (m_settings_btn) m_settings_btn->Show(); m_account_btn->Show(); - m_menus->set_cb_on_user_item([this]() { - m_account_btn->set_selected(true); - m_menus->Popup(this, &m_menus->account, m_account_btn->get_popup_pos()); - }); update_btns_width(); UpdateSearchSizeAndPosition(); } @@ -668,7 +656,6 @@ void TopBarItemsCtrl::ShowJustMode() if (m_settings_btn) m_settings_btn->Hide(); m_account_btn->Hide(); - m_menus->set_cb_on_user_item(nullptr); update_btns_width(); UpdateSearchSizeAndPosition(); } diff --git a/src/slic3r/GUI/TopBar.hpp b/src/slic3r/GUI/TopBar.hpp index ac9fe018d5..0225e3f3d6 100644 --- a/src/slic3r/GUI/TopBar.hpp +++ b/src/slic3r/GUI/TopBar.hpp @@ -57,19 +57,21 @@ class TopBarItemsCtrl : public wxControl wxPoint get_popup_pos(); }; - TopBarMenus* m_menus{ nullptr }; + TopBarMenus* m_menus { nullptr }; - ::TextInput* m_search{ nullptr }; + ::TextInput* m_search { nullptr }; - int m_btns_width{ 0 }; - bool m_collapsed_btns{ false }; + int m_btns_width { 0 }; + bool m_collapsed_btns { false }; + + std::function m_cb_settings_btn { nullptr }; void update_btns_width(); public: TopBarItemsCtrl(wxWindow* parent, TopBarMenus* menus = nullptr, - bool is_main = true); + std::function cb_settings_btn = nullptr); ~TopBarItemsCtrl() {} void SetSelection(int sel, bool force = false); @@ -124,12 +126,12 @@ public: TopBar( wxWindow * parent, TopBarMenus* menus, - bool is_main = true) + std::function cb_settings_btn = nullptr) { Init(); // wxNB_NOPAGETHEME: Disable Windows Vista theme for the Notebook background. The theme performance is terrible on Windows 10 // with multiple high resolution displays connected. - Create(parent, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxNB_TOP | wxTAB_TRAVERSAL | wxNB_NOPAGETHEME, menus, is_main); + Create(parent, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxNB_TOP | wxTAB_TRAVERSAL | wxNB_NOPAGETHEME, menus, cb_settings_btn); } bool Create(wxWindow * parent, @@ -138,12 +140,12 @@ public: const wxSize & size = wxDefaultSize, long style = 0, TopBarMenus* menus = nullptr, - bool is_main = true) + std::function cb_settings_btn = nullptr) { if (!wxBookCtrlBase::Create(parent, winid, pos, size, style | wxBK_TOP)) return false; - m_bookctrl = new TopBarItemsCtrl(this, menus, is_main); + m_bookctrl = new TopBarItemsCtrl(this, menus, cb_settings_btn); wxSizer* mainSizer = new wxBoxSizer(IsVertical() ? wxVERTICAL : wxHORIZONTAL); diff --git a/src/slic3r/GUI/TopBarMenus.cpp b/src/slic3r/GUI/TopBarMenus.cpp index 41d456eae3..e7253e4561 100644 --- a/src/slic3r/GUI/TopBarMenus.cpp +++ b/src/slic3r/GUI/TopBarMenus.cpp @@ -1,12 +1,8 @@ #include "TopBarMenus.hpp" #include "TopBar.hpp" +#include "libslic3r/Config.hpp" //ConfigOptionMode #include "GUI_Factories.hpp" - -#include "GUI_App.hpp" -#include "Plater.hpp" -#include "UserAccount.hpp" - #include "I18N.hpp" using namespace Slic3r::GUI; @@ -14,7 +10,6 @@ using namespace Slic3r::GUI; TopBarMenus::TopBarMenus() { CreateAccountMenu(); - ApplyWorkspacesMenu(); UpdateAccountMenu(); BindEvtClose(); @@ -30,12 +25,31 @@ void TopBarMenus::AppendMenuSeparaorItem() main.AppendSeparator(); } -wxString TopBarMenus::get_workspace_name(const int mode) +wxString TopBarMenus::get_workspace_name(int mode/* = -1*/) { + if (mode < 0 && m_cb_get_mode) + mode = m_cb_get_mode(); + return mode == Slic3r::ConfigOptionMode::comSimple ? _L("Beginner mode") : mode == Slic3r::ConfigOptionMode::comAdvanced ? _L("Normal mode") : _L("Expert mode"); } +wxBitmapBundle* TopBarMenus::get_workspace_bitmap(int mode/* = -1*/) +{ + assert(m_cb_get_mode_btn_color); + if (mode < 0 && m_cb_get_mode) + mode = m_cb_get_mode(); + + return get_bmp_bundle("mode", 16, -1, m_cb_get_mode_btn_color(mode)); +} + +TopBarMenus::UserAccountInfo TopBarMenus::get_user_account_info() +{ + if (m_cb_get_user_account_info) + return m_cb_get_user_account_info(); + return UserAccountInfo(); +} + void TopBarMenus::sys_color_changed() { MenuFactory::sys_color_changed(&main); @@ -56,10 +70,11 @@ void TopBarMenus::ApplyWorkspacesMenu() Slic3r::ConfigOptionMode::comExpert }) { const wxString label = get_workspace_name(mode); append_menu_item(&workspaces, wxID_ANY, label, label, - [mode](wxCommandEvent&) { - if (wxGetApp().get_mode() != mode) - wxGetApp().save_mode(mode); - }, get_bmp_bundle("mode", 16, -1, wxGetApp().get_mode_btn_color(mode))); + [mode, this](wxCommandEvent&) { + if (m_cb_get_mode && m_cb_save_mode && + m_cb_get_mode() != mode) + m_cb_save_mode(mode); + }, get_workspace_bitmap(mode)); if (mode < Slic3r::ConfigOptionMode::comExpert) workspaces.AppendSeparator(); @@ -70,21 +85,17 @@ void TopBarMenus::CreateAccountMenu() { remember_me_item_id = wxWindow::NewControlId(); append_menu_check_item(&account, remember_me_item_id, _L("Remember me"), "" , - [](wxCommandEvent&) { wxGetApp().plater()->get_user_account()->toggle_remember_session(); } , nullptr); + [this](wxCommandEvent&) { if (m_cb_toggle_remember_session) m_cb_toggle_remember_session(); }, nullptr); m_login_item = append_menu_item(&account, wxID_ANY, "", "", - [](wxCommandEvent&) { - auto user_account = wxGetApp().plater()->get_user_account(); - if (user_account->is_logged()) - user_account->do_logout(); - else - user_account->do_login(); - }, "login"); + [this](wxCommandEvent&) { if (m_cb_act_with_user_account) m_cb_act_with_user_account(); }, "login"); } -void TopBarMenus::UpdateAccountMenu(Slic3r::GUI::UserAccount* user_account) +void TopBarMenus::UpdateAccountMenu() { - bool is_logged = user_account && user_account->is_logged(); + bool is_logged{ false }; + if (m_cb_get_user_account_info) + is_logged = m_cb_get_user_account_info().is_logged; if (m_login_item) { m_login_item->SetItemLabel(is_logged ? _L("Prusa Account Log out") : _L("Prusa Account Log in")); set_menu_item_bitmap(m_login_item, is_logged ? "logout" : "login"); diff --git a/src/slic3r/GUI/TopBarMenus.hpp b/src/slic3r/GUI/TopBarMenus.hpp index 6d0b8e0052..20235cba2e 100644 --- a/src/slic3r/GUI/TopBarMenus.hpp +++ b/src/slic3r/GUI/TopBarMenus.hpp @@ -6,20 +6,30 @@ class TopBarItemsCtrl; class wxString; -namespace Slic3r { -namespace GUI { -class UserAccount; -} -} - class TopBarMenus { +public: + struct UserAccountInfo { + bool is_logged { false }; + bool remember_session{ false }; + std::string user_name; + boost::filesystem::path avatar_path; + }; + +private: + // Prusa Account menu items wxMenuItem* m_login_item { nullptr }; TopBarItemsCtrl* m_popup_ctrl { nullptr }; - std::function m_cb_on_user_item { nullptr }; + std::function m_cb_get_mode { nullptr }; + std::function m_cb_save_mode { nullptr }; + std::function m_cb_get_mode_btn_color { nullptr }; + + std::function m_cb_toggle_remember_session { nullptr }; + std::function m_cb_act_with_user_account { nullptr }; + std::functionm_cb_get_user_account_info { nullptr }; public: wxMenu main; @@ -34,15 +44,38 @@ public: void AppendMenuSeparaorItem(); void ApplyWorkspacesMenu(); void CreateAccountMenu(); - void UpdateAccountMenu(Slic3r::GUI::UserAccount* user_account = nullptr); + void UpdateAccountMenu(); void Popup(TopBarItemsCtrl* popup_ctrl, wxMenu* menu, wxPoint pos); void BindEvtClose(); - wxString get_workspace_name(const /*ConfigOptionMode*/int mode); - void set_cb_on_user_item (std::function cb) { m_cb_on_user_item = cb; } void sys_color_changed(); + wxString get_workspace_name(/*ConfigOptionMode*/int mode = -1); + wxBitmapBundle* get_workspace_bitmap(/*ConfigOptionMode*/int mode = -1); + + UserAccountInfo get_user_account_info(); + + void set_workspaces_menu_callbacks(std::function cb_get_mode, + std::function cb_save_mode, + std::function cb_get_mode_btn_color) + { + m_cb_get_mode = cb_get_mode; + m_cb_save_mode = cb_save_mode; + m_cb_get_mode_btn_color = cb_get_mode_btn_color; + + ApplyWorkspacesMenu(); + } + + void set_account_menu_callbacks(std::function cb_toggle_remember_session, + std::function cb_act_with_user_account , + std::function cb_get_user_account_info ) + { + m_cb_toggle_remember_session = cb_toggle_remember_session; + m_cb_act_with_user_account = cb_act_with_user_account; + m_cb_get_user_account_info = cb_get_user_account_info; + } + }; #endif // slic3r_TopBarMenus_hpp_