TopBar and TopBarMenus: Code refactoring to use callbacks instead of direct use of UserAccount and Mainframe.

This commit is contained in:
YuSanka 2024-05-27 13:54:07 +02:00 committed by Lukas Matena
parent fa61ea4e9e
commit f0531c6fc2
8 changed files with 151 additions and 72 deletions

View File

@ -64,6 +64,7 @@
#include "NotificationManager.hpp"
#include "Preferences.hpp"
#include "WebViewDialog.hpp"
#include "UserAccount.hpp"
#ifdef _WIN32
#include <dbt.h>
@ -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);
}

View File

@ -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 = "");

View File

@ -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();

View File

@ -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();

View File

@ -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<void()> 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();
}

View File

@ -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<void()> m_cb_settings_btn { nullptr };
void update_btns_width();
public:
TopBarItemsCtrl(wxWindow* parent,
TopBarMenus* menus = nullptr,
bool is_main = true);
std::function<void()> 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<void()> 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<void()> 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);

View File

@ -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");

View File

@ -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<void()> m_cb_on_user_item { nullptr };
std::function<int()> m_cb_get_mode { nullptr };
std::function<void(int)> m_cb_save_mode { nullptr };
std::function<std::string(int)> m_cb_get_mode_btn_color { nullptr };
std::function<void()> m_cb_toggle_remember_session { nullptr };
std::function<void()> m_cb_act_with_user_account { nullptr };
std::function<UserAccountInfo()>m_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<void()> 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</*ConfigOptionMode*/int()> cb_get_mode,
std::function<void(/*ConfigOptionMode*/int)> cb_save_mode,
std::function<std::string(/*ConfigOptionMode*/int)> 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<void()> cb_toggle_remember_session,
std::function<void()> cb_act_with_user_account ,
std::function<UserAccountInfo()> 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_