mirror of
https://git.mirrors.martin98.com/https://github.com/prusa3d/PrusaSlicer.git
synced 2025-07-31 02:21:58 +08:00
TopBar and TopBarMenus: Code refactoring to use callbacks instead of direct use of UserAccount and Mainframe.
This commit is contained in:
parent
fa61ea4e9e
commit
f0531c6fc2
@ -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);
|
||||
}
|
||||
|
@ -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 = "");
|
||||
|
@ -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();
|
||||
|
@ -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();
|
||||
|
@ -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();
|
||||
}
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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");
|
||||
|
@ -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_
|
||||
|
Loading…
x
Reference in New Issue
Block a user