diff --git a/src/slic3r/GUI/GUI_App.cpp b/src/slic3r/GUI/GUI_App.cpp index 472abd6dc..74a574fe3 100644 --- a/src/slic3r/GUI/GUI_App.cpp +++ b/src/slic3r/GUI/GUI_App.cpp @@ -707,7 +707,7 @@ void GUI_App::update_mode() void GUI_App::add_config_menu(wxMenuBar *menu) { auto local_menu = new wxMenu(); - wxWindowID config_id_base = wxWindow::NewControlId((int)ConfigMenuCnt); + wxWindowID config_id_base = wxWindow::NewControlId(int(ConfigMenuCnt)); const auto config_wizard_name = _(ConfigWizard::name(true).wx_str()); const auto config_wizard_tooltip = wxString::Format(_(L("Run %s")), config_wizard_name); @@ -729,9 +729,9 @@ void GUI_App::add_config_menu(wxMenuBar *menu) mode_menu->AppendRadioItem(config_id_base + ConfigMenuModeSimple, _(L("Simple")), _(L("Simple View Mode"))); mode_menu->AppendRadioItem(config_id_base + ConfigMenuModeAdvanced, _(L("Advanced")), _(L("Advanced View Mode"))); mode_menu->AppendRadioItem(config_id_base + ConfigMenuModeExpert, _(L("Expert")), _(L("Expert View Mode"))); - Bind(wxEVT_UPDATE_UI, [this](wxUpdateUIEvent& evt) { evt.Check(get_mode() == comSimple); }, config_id_base + ConfigMenuModeSimple); - Bind(wxEVT_UPDATE_UI, [this](wxUpdateUIEvent& evt) { evt.Check(get_mode() == comAdvanced); }, config_id_base + ConfigMenuModeAdvanced); - Bind(wxEVT_UPDATE_UI, [this](wxUpdateUIEvent& evt) { evt.Check(get_mode() == comExpert); }, config_id_base + ConfigMenuModeExpert); + Bind(wxEVT_UPDATE_UI, [this](wxUpdateUIEvent& evt) { if(get_mode() == comSimple) evt.Check(true); }, config_id_base + ConfigMenuModeSimple); + Bind(wxEVT_UPDATE_UI, [this](wxUpdateUIEvent& evt) { if(get_mode() == comAdvanced) evt.Check(true); }, config_id_base + ConfigMenuModeAdvanced); + Bind(wxEVT_UPDATE_UI, [this](wxUpdateUIEvent& evt) { if(get_mode() == comExpert) evt.Check(true); }, config_id_base + ConfigMenuModeExpert); local_menu->AppendSubMenu(mode_menu, _(L("Mode")), wxString::Format(_(L("%s View Mode")), SLIC3R_APP_NAME)); local_menu->AppendSeparator(); @@ -810,10 +810,14 @@ void GUI_App::add_config_menu(wxMenuBar *menu) break; } }); - mode_menu->Bind(wxEVT_MENU, [this, config_id_base](wxEvent& event) { - int id_mode = event.GetId() - config_id_base; - save_mode(id_mode - ConfigMenuModeSimple); - }); + + using std::placeholders::_1; + + auto modfn = [this](int mode, wxCommandEvent&) { if(get_mode() != mode) save_mode(mode); }; + mode_menu->Bind(wxEVT_MENU, std::bind(modfn, comSimple, _1), config_id_base + ConfigMenuModeSimple); + mode_menu->Bind(wxEVT_MENU, std::bind(modfn, comAdvanced, _1), config_id_base + ConfigMenuModeAdvanced); + mode_menu->Bind(wxEVT_MENU, std::bind(modfn, comExpert, _1), config_id_base + ConfigMenuModeExpert); + menu->Append(local_menu, _(L("&Configuration"))); } diff --git a/src/slic3r/GUI/wxExtensions.cpp b/src/slic3r/GUI/wxExtensions.cpp index 103a9ecf0..76ba853dc 100644 --- a/src/slic3r/GUI/wxExtensions.cpp +++ b/src/slic3r/GUI/wxExtensions.cpp @@ -2557,6 +2557,11 @@ ModeSizer::ModeSizer(wxWindow *parent, int hgap/* = 10*/) : {_(L("Expert")), "mode_expert_sq.png"} }; + auto modebtnfn = [](wxCommandEvent &event, int mode_id) { + Slic3r::GUI::wxGetApp().save_mode(mode_id); + event.Skip(); + }; + m_mode_btns.reserve(3); for (const auto& button : buttons) { #ifdef __WXOSX__ @@ -2567,37 +2572,22 @@ ModeSizer::ModeSizer(wxWindow *parent, int hgap/* = 10*/) : #else m_mode_btns.push_back(new ModeButton(parent, wxID_ANY, button.second, button.first));; #endif // __WXOSX__ + + m_mode_btns.back()->Bind(wxEVT_BUTTON, std::bind(modebtnfn, std::placeholders::_1, m_mode_btns.size() - 1)); + Add(m_mode_btns.back()); } - - for (auto btn : m_mode_btns) - { - btn->Bind(wxEVT_BUTTON, [btn, this](wxCommandEvent &event) { - event.Skip(); - int mode_id = 0; - for (auto cur_btn : m_mode_btns) { - if (cur_btn == btn) - break; - else - mode_id++; - } - Slic3r::GUI::wxGetApp().save_mode(mode_id); - }); - - Add(btn); - } - } void ModeSizer::SetMode(const int mode) { - for (int m = 0; m < m_mode_btns.size(); m++) - m_mode_btns[m]->SetState(m == mode); + for (size_t m = 0; m < m_mode_btns.size(); m++) + m_mode_btns[m]->SetState(int(m) == mode); } void ModeSizer::msw_rescale() { - for (int m = 0; m < m_mode_btns.size(); m++) + for (size_t m = 0; m < m_mode_btns.size(); m++) m_mode_btns[m]->msw_rescale(); }