diff --git a/src/slic3r/GUI/AppConfig.cpp b/src/slic3r/GUI/AppConfig.cpp index 3b0382870..94f279101 100644 --- a/src/slic3r/GUI/AppConfig.cpp +++ b/src/slic3r/GUI/AppConfig.cpp @@ -91,6 +91,9 @@ void AppConfig::set_defaults() if (get("use_perspective_camera").empty()) set("use_perspective_camera", "1"); + if (get("objects_always_expert").empty()) + set("objects_always_expert", "1"); + if (get("use_free_camera").empty()) set("use_free_camera", "0"); diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index 73ecd8699..33cf264a2 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -4692,7 +4692,7 @@ bool GLCanvas3D::_init_main_toolbar() item.tooltip = _utf8(L("Add instance")) + " [+]"; item.sprite_id = 6; item.left.action_callback = [this]() { if (m_canvas != nullptr) wxPostEvent(m_canvas, SimpleEvent(EVT_GLTOOLBAR_MORE)); }; - item.visibility_callback = []()->bool { return wxGetApp().get_mode() != comSimple; }; + item.visibility_callback = []()->bool { return wxGetApp().get_mode() != comSimple || wxGetApp().app_config->get("objects_always_expert") == "1"; }; item.enabling_callback = []()->bool { return wxGetApp().plater()->can_increase_instances(); }; if (!m_main_toolbar.add_item(item)) @@ -4703,7 +4703,7 @@ bool GLCanvas3D::_init_main_toolbar() item.tooltip = _utf8(L("Remove instance")) + " [-]"; item.sprite_id = 7; item.left.action_callback = [this]() { if (m_canvas != nullptr) wxPostEvent(m_canvas, SimpleEvent(EVT_GLTOOLBAR_FEWER)); }; - item.visibility_callback = []()->bool { return wxGetApp().get_mode() != comSimple; }; + item.visibility_callback = []()->bool { return wxGetApp().get_mode() != comSimple || wxGetApp().app_config->get("objects_always_expert") == "1"; }; item.enabling_callback = []()->bool { return wxGetApp().plater()->can_decrease_instances(); }; if (!m_main_toolbar.add_item(item)) return false; @@ -4716,7 +4716,7 @@ bool GLCanvas3D::_init_main_toolbar() item.tooltip = _utf8(L("Split to objects")); item.sprite_id = 8; item.left.action_callback = [this]() { if (m_canvas != nullptr) wxPostEvent(m_canvas, SimpleEvent(EVT_GLTOOLBAR_SPLIT_OBJECTS)); }; - item.visibility_callback = GLToolbarItem::Default_Visibility_Callback; + item.visibility_callback = []()->bool { return wxGetApp().get_mode() != comSimple; }; item.enabling_callback = []()->bool { return wxGetApp().plater()->can_split_to_objects(); }; if (!m_main_toolbar.add_item(item)) return false; diff --git a/src/slic3r/GUI/GUI_ObjectList.cpp b/src/slic3r/GUI/GUI_ObjectList.cpp index 6c7221e91..f5c06f84f 100644 --- a/src/slic3r/GUI/GUI_ObjectList.cpp +++ b/src/slic3r/GUI/GUI_ObjectList.cpp @@ -1436,7 +1436,7 @@ void ObjectList::show_settings(const wxDataViewItem settings_item) wxMenu* ObjectList::append_submenu_add_generic(wxMenu* menu, const ModelVolumeType type) { auto sub_menu = new wxMenu; - if (wxGetApp().get_mode() == comExpert && type != ModelVolumeType::INVALID) { + if ( (wxGetApp().get_mode() == comExpert || wxGetApp().app_config->get("objects_always_expert") == "1") && type != ModelVolumeType::INVALID) { append_menu_item(sub_menu, wxID_ANY, _(L("Load")) + " " + dots, "", [this, type](wxCommandEvent&) { load_subobject(type); }, "", menu); sub_menu->AppendSeparator(); @@ -1466,13 +1466,13 @@ void ObjectList::append_menu_items_add_volume(wxMenu* menu) wxWindow* parent = wxGetApp().plater(); - if (mode == comAdvanced) { + if (mode == comAdvanced && wxGetApp().app_config->get("objects_always_expert") != "1") { append_menu_item(menu, wxID_ANY, _(ADD_VOLUME_MENU_ITEMS[int(ModelVolumeType::MODEL_PART)].first), "", [this](wxCommandEvent&) { load_subobject(ModelVolumeType::MODEL_PART); }, ADD_VOLUME_MENU_ITEMS[int(ModelVolumeType::MODEL_PART)].second, nullptr, [this]() { return is_instance_or_object_selected(); }, parent); } - if (mode == comSimple) { + if (mode == comSimple && wxGetApp().app_config->get("objects_always_expert") != "1") { append_menu_item(menu, wxID_ANY, _(ADD_VOLUME_MENU_ITEMS[int(ModelVolumeType::SUPPORT_ENFORCER)].first), "", [this](wxCommandEvent&) { load_generic_subobject(L("Box"), ModelVolumeType::SUPPORT_ENFORCER); }, ADD_VOLUME_MENU_ITEMS[int(ModelVolumeType::SUPPORT_ENFORCER)].second, nullptr, @@ -1485,7 +1485,7 @@ void ObjectList::append_menu_items_add_volume(wxMenu* menu) return; } - for (size_t type = (mode == comExpert ? 0 : 1) ; type < ADD_VOLUME_MENU_ITEMS.size(); type++) + for (size_t type = (mode == comExpert || wxGetApp().app_config->get("objects_always_expert") == "1" ? 0 : 1) ; type < ADD_VOLUME_MENU_ITEMS.size(); type++) { auto& item = ADD_VOLUME_MENU_ITEMS[type]; @@ -1565,7 +1565,7 @@ wxMenuItem* ObjectList::append_menu_item_settings(wxMenu* menu_) return nullptr; const ConfigOptionMode mode = wxGetApp().get_mode(); - if (mode == comSimple) + if (mode == comSimple && wxGetApp().app_config->get("objects_always_expert") != "1") return nullptr; // Create new items for settings popupmenu @@ -1583,7 +1583,7 @@ wxMenuItem* ObjectList::append_menu_item_settings(wxMenu* menu_) (item_type == itUndef && selection.is_single_full_object()); create_freq_settings_popupmenu(menu, is_object_settings); - if (mode == comAdvanced) + if (mode == comAdvanced && wxGetApp().app_config->get("objects_always_expert") != "1") return nullptr; menu->SetSecondSeparator(); diff --git a/src/slic3r/GUI/GUI_ObjectManipulation.cpp b/src/slic3r/GUI/GUI_ObjectManipulation.cpp index 36293525a..1c3c79fe4 100644 --- a/src/slic3r/GUI/GUI_ObjectManipulation.cpp +++ b/src/slic3r/GUI/GUI_ObjectManipulation.cpp @@ -420,7 +420,7 @@ void ObjectManipulation::Show(const bool show) // Show all lines of the panel. Some of these lines will be hidden in the lines below. m_og->Show(show); - if (show && wxGetApp().get_mode() != comSimple) { + if (show && wxGetApp().get_mode() != comSimple && wxGetApp().app_config->get("objects_always_expert") != "1") { // Show the label and the name of the STL in simple mode only. // Label "Name: " m_main_grid_sizer->Show(size_t(0), false); @@ -431,7 +431,8 @@ void ObjectManipulation::Show(const bool show) if (show) { // Show the "World Coordinates" / "Local Coordintes" Combo in Advanced / Expert mode only. - bool show_world_local_combo = wxGetApp().plater()->canvas3D()->get_selection().is_single_full_instance() && wxGetApp().get_mode() != comSimple; + bool show_world_local_combo = wxGetApp().plater()->canvas3D()->get_selection().is_single_full_instance() + && (wxGetApp().get_mode() != comSimple || wxGetApp().app_config->get("objects_always_expert") == "1"); m_word_local_combo->Show(show_world_local_combo); m_empty_str->Show(!show_world_local_combo); } @@ -458,7 +459,7 @@ void ObjectManipulation::update_settings_value(const Selection& selection) m_new_rotate_label_string = L("Rotation"); m_new_scale_label_string = L("Scale factors"); - if (wxGetApp().get_mode() == comSimple) + if (wxGetApp().get_mode() == comSimple && wxGetApp().app_config->get("objects_always_expert") != "1") m_world_coordinates = true; ObjectList* obj_list = wxGetApp().obj_list(); diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index 1cc2b317c..d502b391f 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -1044,7 +1044,7 @@ void Sidebar::update_mode_sizer() const void Sidebar::update_reslice_btn_tooltip() const { wxString tooltip = wxString("Slice") + " [" + GUI::shortkey_ctrl_prefix() + "R]"; - if (m_mode != comSimple) + if (m_mode != comSimple || wxGetApp().app_config->get("objects_always_expert") == "1") tooltip += wxString("\n") + _(L("Hold Shift to Slice & Export G-code")); p->btn_reslice->SetToolTip(tooltip); } @@ -1133,7 +1133,7 @@ void Sidebar::update_objects_list_extruder_column(size_t extruders_count) void Sidebar::show_info_sizer() { if (!p->plater->is_single_full_object_selection() || - m_mode < comExpert || + (m_mode < comExpert && wxGetApp().app_config->get("objects_always_expert") != "1") || p->plater->model().objects.empty()) { p->object_info->Show(false); return; @@ -1378,7 +1378,7 @@ void Sidebar::update_mode() wxWindowUpdateLocker noUpdates(this); - p->object_list->get_sizer()->Show(m_mode > comSimple); + p->object_list->get_sizer()->Show(m_mode > comSimple || wxGetApp().app_config->get("objects_always_expert") == "1"); p->object_list->unselect_objects(); p->object_list->update_selections(); @@ -2458,7 +2458,7 @@ std::vector Plater::priv::load_files(const std::vector& input_ } } } - else if ((wxGetApp().get_mode() == comSimple) && (type_3mf || type_any_amf) && model_has_advanced_features(model)) { + else if ((wxGetApp().get_mode() == comSimple && wxGetApp().app_config->get("objects_always_expert") == "0") && (type_3mf || type_any_amf) && model_has_advanced_features(model)) { wxMessageDialog msg_dlg(q, _(L("This file cannot be loaded in a simple mode. Do you want to switch to an advanced mode?"))+"\n", _(L("Detected advanced data")), wxICON_WARNING | wxYES | wxNO); if (msg_dlg.ShowModal() == wxID_YES) @@ -3220,7 +3220,7 @@ unsigned int Plater::priv::update_background_process(bool force_validation, bool sidebar->set_btn_label(ActionButtonType::abExport, _(label_btn_export)); sidebar->set_btn_label(ActionButtonType::abSendGCode, _(label_btn_send)); - const wxString slice_string = background_process.running() && wxGetApp().get_mode() == comSimple ? + const wxString slice_string = background_process.running() && wxGetApp().get_mode() == comSimple && wxGetApp().app_config->get("objects_always_expert") != "1" ? _(L("Slicing")) + dots : _(L("Slice now")); sidebar->set_btn_label(ActionButtonType::abReslice, slice_string); @@ -3799,11 +3799,11 @@ void Plater::priv::on_process_completed(wxCommandEvent &evt) if (canceled) { - if (wxGetApp().get_mode() == comSimple) + if (wxGetApp().get_mode() == comSimple && wxGetApp().app_config->get("objects_always_expert") != "1") sidebar->set_btn_label(ActionButtonType::abReslice, "Slice now"); show_action_buttons(true); } - else if (this->writing_to_removable_device || wxGetApp().get_mode() == comSimple) + else if (this->writing_to_removable_device || (wxGetApp().get_mode() == comSimple && wxGetApp().app_config->get("objects_always_expert") != "1")) show_action_buttons(false); this->writing_to_removable_device = false; } @@ -3887,7 +3887,7 @@ void Plater::priv::on_right_click(RBtnEvent& evt) * Suppress to show those items for a Simple mode */ const MenuIdentifier id = printer_technology == ptSLA ? miObjectSLA : miObjectFFF; - if (wxGetApp().get_mode() == comSimple) { + if (wxGetApp().get_mode() == comSimple && wxGetApp().app_config->get("objects_always_expert") != "1") { if (menu->FindItem(_(L("Add instance"))) != wxNOT_FOUND) { /* Detach an items from the menu, but don't delete them @@ -4120,7 +4120,7 @@ bool Plater::priv::complit_init_object_menu() [this](wxCommandEvent&) { split_volume(); }, "split_parts_SMALL", &object_menu, [this]() { return can_split(); }, q); append_submenu(&object_menu, split_menu, wxID_ANY, _(L("Split")), _(L("Split the selected object")), "", - [this]() { return can_split() && wxGetApp().get_mode() > comSimple; }, q); + [this]() { return can_split() && wxGetApp().get_mode() > comSimple || wxGetApp().app_config->get("objects_always_expert") == "1"; }, q); object_menu.AppendSeparator(); // Layers Editing for object @@ -4611,7 +4611,7 @@ void Plater::priv::update_after_undo_redo(const UndoRedo::Snapshot& snapshot, bo wxGetApp().obj_list()->update_after_undo_redo(); - if (wxGetApp().get_mode() == comSimple && model_has_advanced_features(this->model)) { + if (wxGetApp().get_mode() == comSimple && model_has_advanced_features(this->model) && wxGetApp().app_config->get("objects_always_expert") != "1") { // If the user jumped to a snapshot that require user interface with advanced features, switch to the advanced mode without asking. // There is a little risk of surprising the user, as he already must have had the advanced or expert mode active for such a snapshot to be taken. Slic3r::GUI::wxGetApp().save_mode(comAdvanced); @@ -5200,7 +5200,7 @@ void Plater::reslice() if (p->background_process.running()) { - if (wxGetApp().get_mode() == comSimple) + if (wxGetApp().get_mode() == comSimple && wxGetApp().app_config->get("objects_always_expert") != "1") p->sidebar->set_btn_label(ActionButtonType::abReslice, _(L("Slicing")) + dots); else { diff --git a/src/slic3r/GUI/Preferences.cpp b/src/slic3r/GUI/Preferences.cpp index ba45df86c..88dd67b1d 100644 --- a/src/slic3r/GUI/Preferences.cpp +++ b/src/slic3r/GUI/Preferences.cpp @@ -100,6 +100,13 @@ void PreferencesDialog::build() option = Option (def,"show_incompatible_presets"); m_optgroup_general->append_single_option_line(option); + def.label = L("Main GUI always in expert mode"); + def.type = coBool; + def.tooltip = L("If enabled, the gui will be in expert mode even if the simple or advanced mode is selected (but not the setting tabs)."); + def.set_default_value(new ConfigOptionBool{ app_config->get("objects_always_expert") == "1" }); + option = Option(def, "objects_always_expert"); + m_optgroup_general->append_single_option_line(option); + m_optgroup_paths = std::make_shared(this, _(L("General"))); m_optgroup_paths->title_width = 10; m_optgroup_paths->m_on_change = [this](t_config_option_key opt_key, boost::any value) { @@ -129,12 +136,12 @@ void PreferencesDialog::build() m_values[opt_key] = boost::any_cast(value) ? "1" : "0"; }; - def.label = L("Use perspective camera"); - def.type = coBool; - def.tooltip = L("If enabled, use perspective camera. If not enabled, use orthographic camera."); - def.set_default_value(new ConfigOptionBool{ app_config->get("use_perspective_camera") == "1" }); - option = Option(def, "use_perspective_camera"); - m_optgroup_camera->append_single_option_line(option); + def.label = L("Use perspective camera"); + def.type = coBool; + def.tooltip = L("If enabled, use perspective camera. If not enabled, use orthographic camera."); + def.set_default_value(new ConfigOptionBool{ app_config->get("use_perspective_camera") == "1" }); + option = Option(def, "use_perspective_camera"); + m_optgroup_camera->append_single_option_line(option); def.label = L("Use free camera"); def.type = coBool;