mirror of
https://git.mirrors.martin98.com/https://github.com/prusa3d/PrusaSlicer.git
synced 2025-07-30 15:22:03 +08:00
129 lines
3.8 KiB
C++
129 lines
3.8 KiB
C++
#include "TopBarMenus.hpp"
|
|
#include "TopBar.hpp"
|
|
|
|
#include "libslic3r/Config.hpp" //ConfigOptionMode
|
|
#include "GUI_Factories.hpp"
|
|
#include "I18N.hpp"
|
|
|
|
using namespace Slic3r::GUI;
|
|
|
|
TopBarMenus::TopBarMenus()
|
|
{
|
|
CreateAccountMenu();
|
|
UpdateAccountMenu();
|
|
|
|
BindEvtClose();
|
|
}
|
|
|
|
void TopBarMenus::AppendMenuItem(wxMenu* menu, const wxString& title)
|
|
{
|
|
append_submenu(&main, menu, wxID_ANY, title, "cog");
|
|
}
|
|
|
|
void TopBarMenus::AppendMenuSeparaorItem()
|
|
{
|
|
main.AppendSeparator();
|
|
}
|
|
|
|
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);
|
|
MenuFactory::sys_color_changed(&workspaces);
|
|
MenuFactory::sys_color_changed(&account);
|
|
}
|
|
|
|
void TopBarMenus::ApplyWorkspacesMenu()
|
|
{
|
|
wxMenuItemList& items = workspaces.GetMenuItems();
|
|
if (!items.IsEmpty()) {
|
|
for (int id = int(workspaces.GetMenuItemCount()) - 1; id >= 0; id--)
|
|
workspaces.Destroy(items[id]);
|
|
}
|
|
|
|
for (const Slic3r::ConfigOptionMode& mode : { Slic3r::ConfigOptionMode::comSimple,
|
|
Slic3r::ConfigOptionMode::comAdvanced,
|
|
Slic3r::ConfigOptionMode::comExpert }) {
|
|
const wxString label = get_workspace_name(mode);
|
|
append_menu_item(&workspaces, wxID_ANY, label, label,
|
|
[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();
|
|
}
|
|
}
|
|
|
|
void TopBarMenus::CreateAccountMenu()
|
|
{
|
|
m_login_item = append_menu_item(&account, wxID_ANY, "", "",
|
|
[this](wxCommandEvent&) { if (m_cb_act_with_user_account) m_cb_act_with_user_account(); }, "login");
|
|
|
|
m_hide_login_item = append_menu_item(&account, wxID_ANY, _L("Hide \"Log in\" button"), "",
|
|
[this](wxCommandEvent&) { if (m_cb_hide_user_account) m_cb_hide_user_account(); });
|
|
}
|
|
|
|
void TopBarMenus::UpdateAccountMenu()
|
|
{
|
|
bool is_logged{ false };
|
|
if (m_cb_get_user_account_info)
|
|
is_logged = m_cb_get_user_account_info().is_logged;
|
|
if (is_logged)
|
|
RemoveHideLoginItem();
|
|
if (m_login_item) {
|
|
m_login_item->SetItemLabel(is_logged ? _L("Log out") : _L("Log in"));
|
|
set_menu_item_bitmap(m_login_item, is_logged ? "logout" : "login");
|
|
}
|
|
}
|
|
|
|
void TopBarMenus::RemoveHideLoginItem()
|
|
{
|
|
if (m_hide_login_item)
|
|
account.Remove(m_hide_login_item);
|
|
}
|
|
|
|
void TopBarMenus::Popup(TopBarItemsCtrl* popup_ctrl, wxMenu* menu, wxPoint pos)
|
|
{
|
|
m_popup_ctrl = popup_ctrl;
|
|
m_popup_ctrl->PopupMenu(menu, pos);
|
|
}
|
|
|
|
void TopBarMenus::BindEvtClose()
|
|
{
|
|
auto close_fn = [this]() {
|
|
if (m_popup_ctrl)
|
|
m_popup_ctrl->UnselectPopupButtons();
|
|
m_popup_ctrl = nullptr;
|
|
};
|
|
|
|
main. Bind(wxEVT_MENU_CLOSE, [close_fn](wxMenuEvent&) { close_fn(); });
|
|
workspaces. Bind(wxEVT_MENU_CLOSE, [close_fn](wxMenuEvent&) { close_fn(); });
|
|
account. Bind(wxEVT_MENU_CLOSE, [close_fn](wxMenuEvent&) { close_fn(); });
|
|
} |