diff --git a/resources/web/homepage/index.html b/resources/web/homepage/index.html
index b2f6a246e3..d05753b885 100644
--- a/resources/web/homepage/index.html
+++ b/resources/web/homepage/index.html
@@ -145,19 +145,18 @@
document.onkeydown = function (event) {
var e = event || window.event || arguments.callee.caller.arguments[0];
+ if (e.ctrlKey && e.metaKey)
+ OutputKey(e.keyCode, true, false, true);
+ else if (e.ctrlKey)
+ OutputKey(e.keyCode, true, false, false);
+ else if (e.metaKey)
+ OutputKey(e.keyCode, false, false, true);
+
if (e.shiftKey && e.ctrlKey)
OutputKey(e.keyCode, true, true, false);
- else if (e.ctrlKey)
- OutputKey(e.keyCode, true, false, false);
- else if (e.keyCode === 27)
- OutputKey(e.keyCode, false, false, false);
if (e.shiftKey && e.metaKey)
OutputKey(e.keyCode, false, true, true);
- else if (e.metaKey)
- OutputKey(e.keyCode, false, false, true);
- else if (e.keyCode === 27)
- OutputKey(e.keyCode, false, false, false);
if (window.event) {
try { e.keyCode = 0; } catch (e) { }
diff --git a/src/slic3r/GUI/GUI_App.cpp b/src/slic3r/GUI/GUI_App.cpp
index e5b3021cc7..c94d2dd292 100644
--- a/src/slic3r/GUI/GUI_App.cpp
+++ b/src/slic3r/GUI/GUI_App.cpp
@@ -3014,10 +3014,12 @@ std::string GUI_App::handle_web_request(std::string cmd)
wxKeyEvent e(wxEVT_CHAR_HOOK);
#ifdef __APPLE__
e.SetControlDown(cmdKey);
+ e.SetRawControlDown(ctrlKey);
#else
e.SetControlDown(ctrlKey);
#endif
e.SetShiftDown(shiftKey);
+ keyCode = keyCode == 188 ? ',' : keyCode;
e.m_keyCode = keyCode;
e.SetEventObject(mainframe);
wxPostEvent(mainframe, e);
diff --git a/src/slic3r/GUI/MainFrame.cpp b/src/slic3r/GUI/MainFrame.cpp
index 6c44fc1617..9b72c288b7 100644
--- a/src/slic3r/GUI/MainFrame.cpp
+++ b/src/slic3r/GUI/MainFrame.cpp
@@ -474,18 +474,36 @@ DPIFrame(NULL, wxID_ANY, "", wxDefaultPosition, wxDefaultSize, BORDERLESS_FRAME_
Slic3r::run_backup_ui_tasks();
});
; }
-
this->Bind(wxEVT_CHAR_HOOK, [this](wxKeyEvent &evt) {
#ifdef __APPLE__
- if (evt.CmdDown() && evt.GetKeyCode() == 'H') { this->Iconize(); return;}
+ if (evt.CmdDown() && (evt.GetKeyCode() == 'H')) {
+ //call parent_menu hide behavior
+ return;}
+ if (evt.CmdDown() && (evt.GetKeyCode() == 'M')) {
+ this->Iconize();
+ return;
+ }
if (evt.CmdDown() && evt.GetKeyCode() == 'Q') { wxPostEvent(this, wxCloseEvent(wxEVT_CLOSE_WINDOW)); return;}
+ if (evt.CmdDown() && evt.RawControlDown() && evt.GetKeyCode() == 'F') {
+ EnableFullScreenView(true);
+ if (IsFullScreen()) {
+ ShowFullScreen(false);
+ } else {
+ ShowFullScreen(true);
+ }
+ return;}
#endif
if (evt.CmdDown() && evt.GetKeyCode() == 'N') { m_plater->new_project(); return;}
if (evt.CmdDown() && evt.GetKeyCode() == 'O') { m_plater->load_project(); return;}
if (evt.CmdDown() && evt.ShiftDown() && evt.GetKeyCode() == 'S') { if (m_plater) m_plater->save_project(true); return;}
else if (evt.CmdDown() && evt.GetKeyCode() == 'S') { if (m_plater) m_plater->save_project(); return;}
- if (evt.CmdDown() && evt.GetKeyCode() == 'P') {
+#ifdef __APPLE__
+ if (evt.CmdDown() && evt.GetKeyCode() == ',')
+#else
+ if (evt.CmdDown() && evt.GetKeyCode() == 'P')
+#endif
+ {
PreferencesDialog dlg(this);
dlg.ShowModal();
#if ENABLE_GCODE_LINES_ID_IN_H_SLIDER
@@ -496,6 +514,7 @@ DPIFrame(NULL, wxID_ANY, "", wxDefaultPosition, wxDefaultSize, BORDERLESS_FRAME_
plater()->refresh_print();
return;
}
+
if (evt.CmdDown() && evt.GetKeyCode() == 'I') {
if (!can_add_models()) return;
if (m_plater) { m_plater->add_model(); }
@@ -1150,24 +1169,28 @@ bool MainFrame::can_change_view() const
}
}
+bool MainFrame::can_clone() const {
+ return can_select() && !m_plater->is_selection_empty();
+}
+
bool MainFrame::can_select() const
{
- return (m_plater != nullptr) && !m_plater->model().objects.empty();
+ return (m_plater != nullptr) && (m_tabpanel->GetSelection() == TabPosition::tp3DEditor) && !m_plater->model().objects.empty();
}
bool MainFrame::can_deselect() const
{
- return (m_plater != nullptr) && !m_plater->is_selection_empty();
+ return (m_plater != nullptr) && (m_tabpanel->GetSelection() == TabPosition::tp3DEditor) && !m_plater->is_selection_empty();
}
bool MainFrame::can_delete() const
{
- return (m_plater != nullptr) && !m_plater->is_selection_empty();
+ return (m_plater != nullptr) && (m_tabpanel->GetSelection() == TabPosition::tp3DEditor) && !m_plater->is_selection_empty();
}
bool MainFrame::can_delete_all() const
{
- return (m_plater != nullptr) && !m_plater->model().objects.empty();
+ return (m_plater != nullptr) && (m_tabpanel->GetSelection() == TabPosition::tp3DEditor) && !m_plater->model().objects.empty();
}
bool MainFrame::can_reslice() const
@@ -1795,7 +1818,7 @@ void MainFrame::init_menubar_as_editor()
_L("Clone copies of selections"),[this](wxCommandEvent&) {
m_plater->clone_selection();
},
- "menu_remove", nullptr, [this](){return can_select(); }, this);
+ "menu_remove", nullptr, [this](){return can_clone(); }, this);
editMenu->AppendSeparator();
#else
// BBS undo
@@ -1833,7 +1856,7 @@ void MainFrame::init_menubar_as_editor()
_L("Clone copies of selections"),[this](wxCommandEvent&) {
m_plater->clone_selection();
},
- "", nullptr, [this](){return can_select(); }, this);
+ "", nullptr, [this](){return can_clone(); }, this);
editMenu->AppendSeparator();
#endif
@@ -1906,117 +1929,122 @@ void MainFrame::init_menubar_as_editor()
#ifdef __APPLE__
wxWindowID bambu_studio_id_base = wxWindow::NewControlId(int(2));
wxMenu* parent_menu = m_menubar->OSXGetAppleMenu();
- auto preference_item = new wxMenuItem(parent_menu, BambuStudioMenuPreferences + bambu_studio_id_base, _L("Preferences") + "\tCtrl+P", "");
+ auto preference_item = new wxMenuItem(parent_menu, BambuStudioMenuPreferences + bambu_studio_id_base, _L("Preferences") + "\tCtrl+,", "");
#else
wxMenu* parent_menu = m_topbar->GetTopMenu();
auto preference_item = new wxMenuItem(parent_menu, ConfigMenuPreferences + config_id_base, _L("Preferences") + "\tCtrl+P", "");
+
#endif
-
//auto printer_item = new wxMenuItem(parent_menu, ConfigMenuPrinter + config_id_base, _L("Printer"), "");
//auto language_item = new wxMenuItem(parent_menu, ConfigMenuLanguage + config_id_base, _L("Switch Language"), "");
- parent_menu->Bind(wxEVT_MENU, [this, config_id_base](wxEvent& event) {
- switch (event.GetId() - config_id_base) {
- //case ConfigMenuLanguage:
- //{
- // /* Before change application language, let's check unsaved changes on 3D-Scene
- // * and draw user's attention to the application restarting after a language change
- // */
- // {
- // // the dialog needs to be destroyed before the call to switch_language()
- // // or sometimes the application crashes into wxDialogBase() destructor
- // // so we put it into an inner scope
- // wxString title = _L("Language selection");
- // wxMessageDialog dialog(nullptr,
- // _L("Switching the language requires application restart.\n") + "\n\n" +
- // _L("Do you want to continue?"),
- // title,
- // wxICON_QUESTION | wxOK | wxCANCEL);
- // if (dialog.ShowModal() == wxID_CANCEL)
- // return;
- // }
-
- // wxGetApp().switch_language();
- // break;
- //}
- //case ConfigMenuWizard:
- //{
- // wxGetApp().run_wizard(ConfigWizard::RR_USER);
- // break;
- //}
- case ConfigMenuPrinter:
- {
- wxGetApp().params_dialog()->Popup();
- wxGetApp().get_tab(Preset::TYPE_PRINTER)->restore_last_select_item();
- break;
- }
- case ConfigMenuPreferences:
- {
- wxGetApp().CallAfter([this] {
- PreferencesDialog dlg(this);
- dlg.ShowModal();
-#if ENABLE_GCODE_LINES_ID_IN_H_SLIDER
- if (dlg.seq_top_layer_only_changed() || dlg.seq_seq_top_gcode_indices_changed())
-#else
- if (dlg.seq_top_layer_only_changed())
-#endif // ENABLE_GCODE_LINES_ID_IN_H_SLIDER
- plater()->refresh_print();
-#if ENABLE_CUSTOMIZABLE_FILES_ASSOCIATION_ON_WIN
-#ifdef _WIN32
- /*
- if (wxGetApp().app_config()->get("associate_3mf") == "true")
- wxGetApp().associate_3mf_files();
- if (wxGetApp().app_config()->get("associate_stl") == "true")
- wxGetApp().associate_stl_files();
- /*if (wxGetApp().app_config()->get("associate_step") == "true")
- wxGetApp().associate_step_files();*/
-#endif // _WIN32
-#endif
- });
- break;
- }
- default:
- break;
- }
- });
+// parent_menu->Bind(wxEVT_MENU, [this, config_id_base](wxEvent& event) {
+// switch (event.GetId() - config_id_base) {
+// //case ConfigMenuLanguage:
+// //{
+// // /* Before change application language, let's check unsaved changes on 3D-Scene
+// // * and draw user's attention to the application restarting after a language change
+// // */
+// // {
+// // // the dialog needs to be destroyed before the call to switch_language()
+// // // or sometimes the application crashes into wxDialogBase() destructor
+// // // so we put it into an inner scope
+// // wxString title = _L("Language selection");
+// // wxMessageDialog dialog(nullptr,
+// // _L("Switching the language requires application restart.\n") + "\n\n" +
+// // _L("Do you want to continue?"),
+// // title,
+// // wxICON_QUESTION | wxOK | wxCANCEL);
+// // if (dialog.ShowModal() == wxID_CANCEL)
+// // return;
+// // }
+//
+// // wxGetApp().switch_language();
+// // break;
+// //}
+// //case ConfigMenuWizard:
+// //{
+// // wxGetApp().run_wizard(ConfigWizard::RR_USER);
+// // break;
+// //}
+// case ConfigMenuPrinter:
+// {
+// wxGetApp().params_dialog()->Popup();
+// wxGetApp().get_tab(Preset::TYPE_PRINTER)->restore_last_select_item();
+// break;
+// }
+// case ConfigMenuPreferences:
+// {
+// wxGetApp().CallAfter([this] {
+// PreferencesDialog dlg(this);
+// dlg.ShowModal();
+//#if ENABLE_GCODE_LINES_ID_IN_H_SLIDER
+// if (dlg.seq_top_layer_only_changed() || dlg.seq_seq_top_gcode_indices_changed())
+//#else
+// if (dlg.seq_top_layer_only_changed())
+//#endif // ENABLE_GCODE_LINES_ID_IN_H_SLIDER
+// plater()->refresh_print();
+//#if ENABLE_CUSTOMIZABLE_FILES_ASSOCIATION_ON_WIN
+//#ifdef _WIN32
+// /*
+// if (wxGetApp().app_config()->get("associate_3mf") == "true")
+// wxGetApp().associate_3mf_files();
+// if (wxGetApp().app_config()->get("associate_stl") == "true")
+// wxGetApp().associate_stl_files();
+// /*if (wxGetApp().app_config()->get("associate_step") == "true")
+// wxGetApp().associate_step_files();*/
+//#endif // _WIN32
+//#endif
+// });
+// break;
+// }
+// default:
+// break;
+// }
+// });
#ifdef __APPLE__
wxString about_title = wxString::Format(_L("&About %s"), SLIC3R_APP_FULL_NAME);
auto about_item = new wxMenuItem(parent_menu, BambuStudioMenuAbout + bambu_studio_id_base, about_title, "");
- parent_menu->Bind(wxEVT_MENU, [this, bambu_studio_id_base](wxEvent& event) {
- switch (event.GetId() - bambu_studio_id_base) {
- case BambuStudioMenuAbout:
- Slic3r::GUI::about();
- break;
- case BambuStudioMenuPreferences:
- wxGetApp().CallAfter([this] {
- PreferencesDialog dlg(this);
- dlg.ShowModal();
- #if ENABLE_GCODE_LINES_ID_IN_H_SLIDER
- if (dlg.seq_top_layer_only_changed() || dlg.seq_seq_top_gcode_indices_changed())
- #else
- if (dlg.seq_top_layer_only_changed())
- #endif // ENABLE_GCODE_LINES_ID_IN_H_SLIDER
- plater()->refresh_print();
- #if ENABLE_CUSTOMIZABLE_FILES_ASSOCIATION_ON_WIN
- #ifdef _WIN32
- /*
- if (wxGetApp().app_config()->get("associate_3mf") == "true")
- wxGetApp().associate_3mf_files();
- if (wxGetApp().app_config()->get("associate_stl") == "true")
- wxGetApp().associate_stl_files();
- /*if (wxGetApp().app_config()->get("associate_step") == "true")
- wxGetApp().associate_step_files();*/
- #endif // _WIN32
- #endif
- });
- break;
- default:
- break;
- }
-
- });
- parent_menu->Insert(0, about_item);
- parent_menu->Insert(1, preference_item);
+ //parent_menu->Bind(wxEVT_MENU, [this, bambu_studio_id_base](wxEvent& event) {
+ // switch (event.GetId() - bambu_studio_id_base) {
+ // case BambuStudioMenuAbout:
+ // Slic3r::GUI::about();
+ // break;
+ // case BambuStudioMenuPreferences:
+ // wxGetApp().CallAfter([this] {
+ // PreferencesDialog dlg(this);
+ // dlg.ShowModal();
+ //#if ENABLE_GCODE_LINES_ID_IN_H_SLIDER
+ // if (dlg.seq_top_layer_only_changed() || dlg.seq_seq_top_gcode_indices_changed())
+ //#else
+ // if (dlg.seq_top_layer_only_changed())
+ //#endif // ENABLE_GCODE_LINES_ID_IN_H_SLIDER
+ // plater()->refresh_print();
+ // });
+ // break;
+ // default:
+ // break;
+ // }
+ //});
+ //parent_menu->Insert(0, about_item);
+ append_menu_item(
+ parent_menu, wxID_ANY, _L("About") + "", _L(""),
+ [this](wxCommandEvent &) { Slic3r::GUI::about();},
+ "", nullptr, []() { return true; }, this, 0);
+ append_menu_item(
+ parent_menu, wxID_ANY, _L("Preferences") + "\tCtrl+'", _L(""),
+ [this](wxCommandEvent &) {
+ PreferencesDialog dlg(this);
+ dlg.ShowModal();
+#if ENABLE_GCODE_LINES_ID_IN_H_SLIDER
+ if (dlg.seq_top_layer_only_changed() || dlg.seq_seq_top_gcode_indices_changed())
+#else
+ if (dlg.seq_top_layer_only_changed())
+#endif
+ plater()->refresh_print();
+ },
+ "", nullptr, []() { return true; }, this, 1);
+ //parent_menu->Insert(1, preference_item);
#endif
// Help menu
auto helpMenu = generate_help_menu();
@@ -2029,7 +2057,21 @@ void MainFrame::init_menubar_as_editor()
if (viewMenu)
m_topbar->AddDropDownSubMenu(viewMenu, _L("View"));
//BBS add Preference
- m_topbar->AddDropDownMenuItem(preference_item);
+
+ append_menu_item(
+ m_topbar->GetTopMenu(), wxID_ANY, _L("Preferences") + "\tCtrl+P", _L(""),
+ [this](wxCommandEvent &) {
+ PreferencesDialog dlg(this);
+ dlg.ShowModal();
+#if ENABLE_GCODE_LINES_ID_IN_H_SLIDER
+ if (dlg.seq_top_layer_only_changed() || dlg.seq_seq_top_gcode_indices_changed())
+#else
+ if (dlg.seq_top_layer_only_changed())
+#endif
+ plater()->refresh_print();
+ },
+ "", nullptr, []() { return true; }, this);
+ //m_topbar->AddDropDownMenuItem(preference_item);
//m_topbar->AddDropDownMenuItem(printer_item);
//m_topbar->AddDropDownMenuItem(language_item);
//m_topbar->AddDropDownMenuItem(config_item);
diff --git a/src/slic3r/GUI/MainFrame.hpp b/src/slic3r/GUI/MainFrame.hpp
index 17ff07465d..2eca15278e 100644
--- a/src/slic3r/GUI/MainFrame.hpp
+++ b/src/slic3r/GUI/MainFrame.hpp
@@ -116,6 +116,7 @@ class MainFrame : public DPIFrame
bool can_change_view() const;
bool can_select() const;
bool can_deselect() const;
+ bool can_clone() const;
bool can_delete() const;
bool can_delete_all() const;
bool can_reslice() const;
diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp
index 8f0284bbad..e65e54d54c 100644
--- a/src/slic3r/GUI/Plater.cpp
+++ b/src/slic3r/GUI/Plater.cpp
@@ -9854,6 +9854,8 @@ bool Plater::can_split_to_volumes() const { return p->can_split_to_volumes(); }
bool Plater::can_arrange() const { return p->can_arrange(); }
bool Plater::can_paste_from_clipboard() const
{
+ if (!IsShown() || !p->is_view3D_shown()) return false;
+
const Selection& selection = p->view3D->get_canvas3d()->get_selection();
const Selection::Clipboard& clipboard = selection.get_clipboard();
@@ -9883,6 +9885,9 @@ bool Plater::can_cut_to_clipboard() const
bool Plater::can_copy_to_clipboard() const
{
+ if (!IsShown() || !p->is_view3D_shown())
+ return false;
+
if (is_selection_empty())
return false;
@@ -9893,8 +9898,8 @@ bool Plater::can_copy_to_clipboard() const
return true;
}
-bool Plater::can_undo() const { return p->undo_redo_stack().has_undo_snapshot(); }
-bool Plater::can_redo() const { return p->undo_redo_stack().has_redo_snapshot(); }
+bool Plater::can_undo() const { return IsShown() && p->is_view3D_shown() && p->undo_redo_stack().has_undo_snapshot(); }
+bool Plater::can_redo() const { return IsShown() && p->is_view3D_shown() && p->undo_redo_stack().has_redo_snapshot(); }
bool Plater::can_reload_from_disk() const { return p->can_reload_from_disk(); }
//BBS
bool Plater::can_fillcolor() const { return p->can_fillcolor(); }