diff --git a/deps/deps-macos.cmake b/deps/deps-macos.cmake
index 790a65aeba..c7c6819e33 100644
--- a/deps/deps-macos.cmake
+++ b/deps/deps-macos.cmake
@@ -89,10 +89,12 @@ ExternalProject_Add(dep_libcurl
ExternalProject_Add(dep_wxwidgets
EXCLUDE_FROM_ALL 1
- URL "https://github.com/wxWidgets/wxWidgets/releases/download/v3.1.2/wxWidgets-3.1.2.tar.bz2"
- URL_HASH SHA256=4cb8d23d70f9261debf7d6cfeca667fc0a7d2b6565adb8f1c484f9b674f1f27a
+ GIT_REPOSITORY "https://github.com/prusa3d/wxWidgets"
+ GIT_TAG v3.1.1-patched
+# URL "https://github.com/wxWidgets/wxWidgets/releases/download/v3.1.2/wxWidgets-3.1.2.tar.bz2"
+# URL_HASH SHA256=4cb8d23d70f9261debf7d6cfeca667fc0a7d2b6565adb8f1c484f9b674f1f27a
BUILD_IN_SOURCE 1
- PATCH_COMMAND "${CMAKE_COMMAND}" -E copy "${CMAKE_CURRENT_SOURCE_DIR}/wxwidgets-pngprefix.h" src/png/pngprefix.h
+# PATCH_COMMAND "${CMAKE_COMMAND}" -E copy "${CMAKE_CURRENT_SOURCE_DIR}/wxwidgets-pngprefix.h" src/png/pngprefix.h
CONFIGURE_COMMAND env "CXXFLAGS=${DEP_WERRORS_SDK}" "CFLAGS=${DEP_WERRORS_SDK}" ./configure
"--prefix=${DESTDIR}/usr/local"
--disable-shared
diff --git a/resources/icons/layers.svg b/resources/icons/layers.svg
index cd71fab3a3..da5dec21d5 100644
--- a/resources/icons/layers.svg
+++ b/resources/icons/layers.svg
@@ -5,13 +5,13 @@
-
+
-
+
-
+
@@ -20,7 +20,7 @@
-
+
diff --git a/resources/icons/white/add_copies.svg b/resources/icons/white/add_copies.svg
new file mode 100644
index 0000000000..17eff0179e
--- /dev/null
+++ b/resources/icons/white/add_copies.svg
@@ -0,0 +1,19 @@
+
+
+
diff --git a/resources/icons/white/add_modifier.svg b/resources/icons/white/add_modifier.svg
new file mode 100644
index 0000000000..09c3ce27dc
--- /dev/null
+++ b/resources/icons/white/add_modifier.svg
@@ -0,0 +1,13 @@
+
+
+
diff --git a/resources/icons/white/add_part.svg b/resources/icons/white/add_part.svg
new file mode 100644
index 0000000000..b7c800bbb2
--- /dev/null
+++ b/resources/icons/white/add_part.svg
@@ -0,0 +1,20 @@
+
+
+
diff --git a/resources/icons/white/advanced+wrench.svg b/resources/icons/white/advanced+wrench.svg
new file mode 100644
index 0000000000..5e878cb3cc
--- /dev/null
+++ b/resources/icons/white/advanced+wrench.svg
@@ -0,0 +1,43 @@
+
+
+
diff --git a/resources/icons/white/advanced_plus.svg b/resources/icons/white/advanced_plus.svg
new file mode 100644
index 0000000000..db532ec4b1
--- /dev/null
+++ b/resources/icons/white/advanced_plus.svg
@@ -0,0 +1,24 @@
+
+
+
diff --git a/resources/icons/white/cog.svg b/resources/icons/white/cog.svg
new file mode 100644
index 0000000000..773e4d65dd
--- /dev/null
+++ b/resources/icons/white/cog.svg
@@ -0,0 +1,17 @@
+
+
+
diff --git a/resources/icons/white/cooling.svg b/resources/icons/white/cooling.svg
new file mode 100644
index 0000000000..29bd04c368
--- /dev/null
+++ b/resources/icons/white/cooling.svg
@@ -0,0 +1,25 @@
+
+
+
diff --git a/resources/icons/white/copy_menu.svg b/resources/icons/white/copy_menu.svg
new file mode 100644
index 0000000000..d660aab6a2
--- /dev/null
+++ b/resources/icons/white/copy_menu.svg
@@ -0,0 +1,37 @@
+
+
+
diff --git a/resources/icons/white/delete.svg b/resources/icons/white/delete.svg
new file mode 100644
index 0000000000..91d5ce74c5
--- /dev/null
+++ b/resources/icons/white/delete.svg
@@ -0,0 +1,22 @@
+
+
+
diff --git a/resources/icons/white/delete_all_menu.svg b/resources/icons/white/delete_all_menu.svg
new file mode 100644
index 0000000000..5d825c424c
--- /dev/null
+++ b/resources/icons/white/delete_all_menu.svg
@@ -0,0 +1,31 @@
+
+
+
diff --git a/resources/icons/white/editor_menu.svg b/resources/icons/white/editor_menu.svg
new file mode 100644
index 0000000000..649d2c40fa
--- /dev/null
+++ b/resources/icons/white/editor_menu.svg
@@ -0,0 +1,20 @@
+
+
+
diff --git a/resources/icons/white/export_config.svg b/resources/icons/white/export_config.svg
new file mode 100644
index 0000000000..22f8ebe1a6
--- /dev/null
+++ b/resources/icons/white/export_config.svg
@@ -0,0 +1,20 @@
+
+
+
diff --git a/resources/icons/white/export_config_bundle.svg b/resources/icons/white/export_config_bundle.svg
new file mode 100644
index 0000000000..99bd62b6c3
--- /dev/null
+++ b/resources/icons/white/export_config_bundle.svg
@@ -0,0 +1,50 @@
+
+
+
diff --git a/resources/icons/white/export_gcode.svg b/resources/icons/white/export_gcode.svg
new file mode 100644
index 0000000000..39f5225cbe
--- /dev/null
+++ b/resources/icons/white/export_gcode.svg
@@ -0,0 +1,14 @@
+
+
+
diff --git a/resources/icons/white/export_plate.svg b/resources/icons/white/export_plate.svg
new file mode 100644
index 0000000000..18159d2a87
--- /dev/null
+++ b/resources/icons/white/export_plate.svg
@@ -0,0 +1,15 @@
+
+
+
diff --git a/resources/icons/white/export_plater.svg b/resources/icons/white/export_plater.svg
new file mode 100644
index 0000000000..e71b38a0aa
--- /dev/null
+++ b/resources/icons/white/export_plater.svg
@@ -0,0 +1,12 @@
+
+
+
diff --git a/resources/icons/white/extruder+funnel.svg b/resources/icons/white/extruder+funnel.svg
new file mode 100644
index 0000000000..de6b227da2
--- /dev/null
+++ b/resources/icons/white/extruder+funnel.svg
@@ -0,0 +1,15 @@
+
+
+
diff --git a/resources/icons/white/flag_green.svg b/resources/icons/white/flag_green.svg
new file mode 100644
index 0000000000..8479d0e9a9
--- /dev/null
+++ b/resources/icons/white/flag_green.svg
@@ -0,0 +1,10 @@
+
+
+
diff --git a/resources/icons/white/flag_red.svg b/resources/icons/white/flag_red.svg
new file mode 100644
index 0000000000..a9b1cf8fed
--- /dev/null
+++ b/resources/icons/white/flag_red.svg
@@ -0,0 +1,10 @@
+
+
+
diff --git a/resources/icons/white/import_config.svg b/resources/icons/white/import_config.svg
new file mode 100644
index 0000000000..001277f738
--- /dev/null
+++ b/resources/icons/white/import_config.svg
@@ -0,0 +1,25 @@
+
+
+
diff --git a/resources/icons/white/import_config_bundle.svg b/resources/icons/white/import_config_bundle.svg
new file mode 100644
index 0000000000..c16cd7b3c6
--- /dev/null
+++ b/resources/icons/white/import_config_bundle.svg
@@ -0,0 +1,61 @@
+
+
+
diff --git a/resources/icons/white/import_plate.svg b/resources/icons/white/import_plate.svg
new file mode 100644
index 0000000000..7f888e3d78
--- /dev/null
+++ b/resources/icons/white/import_plate.svg
@@ -0,0 +1,38 @@
+
+
+
+
+
+
+
+
+
+
+]>
+
diff --git a/resources/icons/white/import_plater.svg b/resources/icons/white/import_plater.svg
new file mode 100644
index 0000000000..1dc5aae6eb
--- /dev/null
+++ b/resources/icons/white/import_plater.svg
@@ -0,0 +1,17 @@
+
+
+
diff --git a/resources/icons/white/infill.svg b/resources/icons/white/infill.svg
new file mode 100644
index 0000000000..0860430998
--- /dev/null
+++ b/resources/icons/white/infill.svg
@@ -0,0 +1,35 @@
+
+
+
diff --git a/resources/icons/white/layers.svg b/resources/icons/white/layers.svg
new file mode 100644
index 0000000000..cd71fab3a3
--- /dev/null
+++ b/resources/icons/white/layers.svg
@@ -0,0 +1,27 @@
+
+
+
diff --git a/resources/icons/white/lock2_closed.svg b/resources/icons/white/lock2_closed.svg
new file mode 100644
index 0000000000..726c850a11
--- /dev/null
+++ b/resources/icons/white/lock2_closed.svg
@@ -0,0 +1,10 @@
+
+
+
diff --git a/resources/icons/white/lock_closed.svg b/resources/icons/white/lock_closed.svg
new file mode 100644
index 0000000000..1665dc9a08
--- /dev/null
+++ b/resources/icons/white/lock_closed.svg
@@ -0,0 +1,10 @@
+
+
+
diff --git a/resources/icons/white/machine+cog.svg b/resources/icons/white/machine+cog.svg
new file mode 100644
index 0000000000..ec49265b81
--- /dev/null
+++ b/resources/icons/white/machine+cog.svg
@@ -0,0 +1,30 @@
+
+
+
diff --git a/resources/icons/white/notes.svg b/resources/icons/white/notes.svg
new file mode 100644
index 0000000000..25de4191e8
--- /dev/null
+++ b/resources/icons/white/notes.svg
@@ -0,0 +1,25 @@
+
+
+
diff --git a/resources/icons/white/number_of_copies.svg b/resources/icons/white/number_of_copies.svg
new file mode 100644
index 0000000000..7c9d78a801
--- /dev/null
+++ b/resources/icons/white/number_of_copies.svg
@@ -0,0 +1,29 @@
+
+
+
diff --git a/resources/icons/white/open.svg b/resources/icons/white/open.svg
new file mode 100644
index 0000000000..0ea9ecdb2c
--- /dev/null
+++ b/resources/icons/white/open.svg
@@ -0,0 +1,11 @@
+
+
+
diff --git a/resources/icons/white/output+page_white.svg b/resources/icons/white/output+page_white.svg
new file mode 100644
index 0000000000..0838740032
--- /dev/null
+++ b/resources/icons/white/output+page_white.svg
@@ -0,0 +1,20 @@
+
+
+
diff --git a/resources/icons/white/pad.svg b/resources/icons/white/pad.svg
new file mode 100644
index 0000000000..cddb2da022
--- /dev/null
+++ b/resources/icons/white/pad.svg
@@ -0,0 +1,83 @@
+
+
+
diff --git a/resources/icons/white/paste_menu.svg b/resources/icons/white/paste_menu.svg
new file mode 100644
index 0000000000..465c2faf08
--- /dev/null
+++ b/resources/icons/white/paste_menu.svg
@@ -0,0 +1,27 @@
+
+
+
diff --git a/resources/icons/white/plater.svg b/resources/icons/white/plater.svg
new file mode 100644
index 0000000000..d637a5e7e7
--- /dev/null
+++ b/resources/icons/white/plater.svg
@@ -0,0 +1,12 @@
+
+
+
diff --git a/resources/icons/white/preview_menu.svg b/resources/icons/white/preview_menu.svg
new file mode 100644
index 0000000000..98095359c9
--- /dev/null
+++ b/resources/icons/white/preview_menu.svg
@@ -0,0 +1,48 @@
+
+
+
diff --git a/resources/icons/white/printer.svg b/resources/icons/white/printer.svg
new file mode 100644
index 0000000000..d94f6fd5c4
--- /dev/null
+++ b/resources/icons/white/printer.svg
@@ -0,0 +1,14 @@
+
+
+
diff --git a/resources/icons/white/re_slice.svg b/resources/icons/white/re_slice.svg
new file mode 100644
index 0000000000..b8d7dc7271
--- /dev/null
+++ b/resources/icons/white/re_slice.svg
@@ -0,0 +1,19 @@
+
+
+
diff --git a/resources/icons/white/remove_copies.svg b/resources/icons/white/remove_copies.svg
new file mode 100644
index 0000000000..5b277e45e9
--- /dev/null
+++ b/resources/icons/white/remove_copies.svg
@@ -0,0 +1,15 @@
+
+
+
diff --git a/resources/icons/white/remove_menu.svg b/resources/icons/white/remove_menu.svg
new file mode 100644
index 0000000000..59360a33f4
--- /dev/null
+++ b/resources/icons/white/remove_menu.svg
@@ -0,0 +1,44 @@
+
+
+
diff --git a/resources/icons/white/resin.svg b/resources/icons/white/resin.svg
new file mode 100644
index 0000000000..81abfae0ce
--- /dev/null
+++ b/resources/icons/white/resin.svg
@@ -0,0 +1,10 @@
+
+
+
diff --git a/resources/icons/white/save.svg b/resources/icons/white/save.svg
new file mode 100644
index 0000000000..3349a42dd5
--- /dev/null
+++ b/resources/icons/white/save.svg
@@ -0,0 +1,25 @@
+
+
+
diff --git a/resources/icons/white/set_separate_obj.svg b/resources/icons/white/set_separate_obj.svg
new file mode 100644
index 0000000000..de083c1c99
--- /dev/null
+++ b/resources/icons/white/set_separate_obj.svg
@@ -0,0 +1,29 @@
+
+
+
diff --git a/resources/icons/white/skirt+brim.svg b/resources/icons/white/skirt+brim.svg
new file mode 100644
index 0000000000..684e177d25
--- /dev/null
+++ b/resources/icons/white/skirt+brim.svg
@@ -0,0 +1,15 @@
+
+
+
diff --git a/resources/icons/white/split_object_SMALL.svg b/resources/icons/white/split_object_SMALL.svg
new file mode 100644
index 0000000000..4795cab512
--- /dev/null
+++ b/resources/icons/white/split_object_SMALL.svg
@@ -0,0 +1,19 @@
+
+
+
diff --git a/resources/icons/white/split_parts_SMALL.svg b/resources/icons/white/split_parts_SMALL.svg
new file mode 100644
index 0000000000..eba846c17f
--- /dev/null
+++ b/resources/icons/white/split_parts_SMALL.svg
@@ -0,0 +1,18 @@
+
+
+
diff --git a/resources/icons/white/spool.svg b/resources/icons/white/spool.svg
new file mode 100644
index 0000000000..7c9fbab977
--- /dev/null
+++ b/resources/icons/white/spool.svg
@@ -0,0 +1,21 @@
+
+
+
diff --git a/resources/icons/white/support.svg b/resources/icons/white/support.svg
new file mode 100644
index 0000000000..52b7c6b40e
--- /dev/null
+++ b/resources/icons/white/support.svg
@@ -0,0 +1,94 @@
+
+
+
diff --git a/resources/icons/white/support_blocker.svg b/resources/icons/white/support_blocker.svg
new file mode 100644
index 0000000000..17401e2ab2
--- /dev/null
+++ b/resources/icons/white/support_blocker.svg
@@ -0,0 +1,48 @@
+
+
+
diff --git a/resources/icons/white/support_enforcer.svg b/resources/icons/white/support_enforcer.svg
new file mode 100644
index 0000000000..0de2dc6a79
--- /dev/null
+++ b/resources/icons/white/support_enforcer.svg
@@ -0,0 +1,19 @@
+
+
+
diff --git a/resources/icons/white/test.svg b/resources/icons/white/test.svg
new file mode 100644
index 0000000000..639bbbde8e
--- /dev/null
+++ b/resources/icons/white/test.svg
@@ -0,0 +1,37 @@
+
+
+
diff --git a/resources/icons/white/time.svg b/resources/icons/white/time.svg
new file mode 100644
index 0000000000..d014286b5a
--- /dev/null
+++ b/resources/icons/white/time.svg
@@ -0,0 +1,16 @@
+
+
+
diff --git a/resources/icons/white/upload_queue.svg b/resources/icons/white/upload_queue.svg
new file mode 100644
index 0000000000..710e2be89d
--- /dev/null
+++ b/resources/icons/white/upload_queue.svg
@@ -0,0 +1,29 @@
+
+
+
diff --git a/resources/icons/white/wrench.svg b/resources/icons/white/wrench.svg
new file mode 100644
index 0000000000..714c5a82af
--- /dev/null
+++ b/resources/icons/white/wrench.svg
@@ -0,0 +1,20 @@
+
+
+
diff --git a/resources/icons/wrench_white.svg b/resources/icons/wrench_white.svg
new file mode 100644
index 0000000000..714c5a82af
--- /dev/null
+++ b/resources/icons/wrench_white.svg
@@ -0,0 +1,20 @@
+
+
+
diff --git a/src/libslic3r/PrintConfig.cpp b/src/libslic3r/PrintConfig.cpp
index a143051e0f..3e1fc5c3d9 100644
--- a/src/libslic3r/PrintConfig.cpp
+++ b/src/libslic3r/PrintConfig.cpp
@@ -2266,7 +2266,7 @@ void PrintConfigDef::init_sla_params()
def->tooltip = L("Printer scaling correction");
def->min = 0;
def->mode = comExpert;
- def->default_value = new ConfigOptionFloats( { 1., 1., 1. } );
+ def->default_value = new ConfigOptionFloats( { 1., 1. } );
def = this->add("absolute_correction", coFloat);
def->label = L("Printer absolute correction");
@@ -2323,7 +2323,7 @@ void PrintConfigDef::init_sla_params()
def->tooltip = L("Correction for expansion");
def->min = 0;
def->mode = comExpert;
- def->default_value = new ConfigOptionFloats( { 1. , 1., 1. } );
+ def->default_value = new ConfigOptionFloats( { 1. , 1. } );
def = this->add("material_notes", coString);
def->label = L("SLA print material notes");
diff --git a/src/libslic3r/SLAPrint.cpp b/src/libslic3r/SLAPrint.cpp
index 3122beece4..4210b46d5a 100644
--- a/src/libslic3r/SLAPrint.cpp
+++ b/src/libslic3r/SLAPrint.cpp
@@ -1174,8 +1174,9 @@ void SLAPrint::process()
for(const SliceRecord& record : layer.slices()) {
const SLAPrintObject *po = record.print_obj();
- const ExPolygons &rawmodelslices = record.get_slice(soModel);
- const ExPolygons &modelslices = clpr_back_offs != 0 ? offset_ex(rawmodelslices, clpr_back_offs) : rawmodelslices;
+ // const ExPolygons &rawmodelslices = record.get_slice(soModel);
+ // const ExPolygons &modelslices = clpr_back_offs != 0 ? offset_ex(rawmodelslices, clpr_back_offs) : rawmodelslices;
+ const ExPolygons &modelslices = record.get_slice(soModel);
bool is_lefth = record.print_obj()->is_left_handed();
if (!modelslices.empty()) {
@@ -1183,8 +1184,9 @@ void SLAPrint::process()
for(ClipperPolygon& p_tmp : v) model_polygons.emplace_back(std::move(p_tmp));
}
- const ExPolygons &rawsupportslices = record.get_slice(soSupport);
- const ExPolygons &supportslices = clpr_back_offs != 0 ? offset_ex(rawsupportslices, clpr_back_offs) : rawsupportslices;
+ // const ExPolygons &rawsupportslices = record.get_slice(soSupport);
+ // const ExPolygons &supportslices = clpr_back_offs != 0 ? offset_ex(rawsupportslices, clpr_back_offs) : rawsupportslices;
+ const ExPolygons &supportslices = record.get_slice(soSupport);
if (!supportslices.empty()) {
ClipperPolygons v = get_all_polygons(supportslices, po->instances(), is_lefth);
@@ -1662,16 +1664,16 @@ Vec3d SLAPrint::relative_correction() const
{
Vec3d corr(1., 1., 1.);
- if(printer_config().relative_correction.values.size() == 2) {
+ if(printer_config().relative_correction.values.size() >= 2) {
corr(X) = printer_config().relative_correction.values[0];
corr(Y) = printer_config().relative_correction.values[0];
- corr(Z) = printer_config().relative_correction.values[1];
- }
+ corr(Z) = printer_config().relative_correction.values.back();
+ }
- if(material_config().material_correction.values.size() == 2) {
+ if(material_config().material_correction.values.size() >= 2) {
corr(X) *= material_config().material_correction.values[0];
corr(Y) *= material_config().material_correction.values[0];
- corr(Z) *= material_config().material_correction.values[1];
+ corr(Z) *= material_config().material_correction.values.back();
}
return corr;
diff --git a/src/slic3r/GUI/Camera.cpp b/src/slic3r/GUI/Camera.cpp
index 7a1023e621..dd6cbefe19 100644
--- a/src/slic3r/GUI/Camera.cpp
+++ b/src/slic3r/GUI/Camera.cpp
@@ -25,6 +25,7 @@ Camera::Camera()
, phi(45.0f)
// , distance(0.0f)
, requires_zoom_to_bed(false)
+ , inverted_phi(false)
, m_theta(45.0f)
, m_target(Vec3d::Zero())
{
diff --git a/src/slic3r/GUI/Camera.hpp b/src/slic3r/GUI/Camera.hpp
index d19bc870ef..b9c5dfc32c 100644
--- a/src/slic3r/GUI/Camera.hpp
+++ b/src/slic3r/GUI/Camera.hpp
@@ -22,6 +22,7 @@ struct Camera
float phi;
// float distance;
bool requires_zoom_to_bed;
+ bool inverted_phi;
private:
Vec3d m_target;
diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp
index dfddc7f452..d02878a1ad 100644
--- a/src/slic3r/GUI/GLCanvas3D.cpp
+++ b/src/slic3r/GUI/GLCanvas3D.cpp
@@ -2729,7 +2729,8 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt)
if ((m_hover_volume_id == -1) && m_mouse.is_start_position_3D_defined())
{
const Vec3d& orig = m_mouse.drag.start_position_3D;
- m_camera.phi += (((float)pos(0) - (float)orig(0)) * TRACKBALLSIZE);
+ float sign = m_camera.inverted_phi ? -1.0f : 1.0f;
+ m_camera.phi += sign * ((float)pos(0) - (float)orig(0)) * TRACKBALLSIZE;
m_camera.set_theta(m_camera.get_theta() - ((float)pos(1) - (float)orig(1)) * TRACKBALLSIZE, wxGetApp().preset_bundle->printers.get_edited_preset().printer_technology() != ptSLA);
m_dirty = true;
}
@@ -2781,6 +2782,9 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt)
post_event(SimpleEvent(EVT_GLCANVAS_OBJECT_SELECT));
}
}
+ else if (evt.LeftUp() && m_mouse.dragging)
+ // Flips X mouse deltas if bed is upside down
+ m_camera.inverted_phi = (m_camera.get_dir_up()(2) < 0.0);
else if (evt.RightUp())
{
m_mouse.position = pos.cast();
diff --git a/src/slic3r/GUI/GUI_App.cpp b/src/slic3r/GUI/GUI_App.cpp
index 87f58aa1af..595a968bd2 100644
--- a/src/slic3r/GUI/GUI_App.cpp
+++ b/src/slic3r/GUI/GUI_App.cpp
@@ -466,7 +466,7 @@ void GUI_App::update_ui_from_settings()
mainframe->update_ui_from_settings();
}
-void GUI_App::persist_window_geometry(wxTopLevelWindow *window)
+void GUI_App::persist_window_geometry(wxTopLevelWindow *window, bool default_maximized)
{
const std::string name = into_u8(window->GetName());
@@ -475,7 +475,7 @@ void GUI_App::persist_window_geometry(wxTopLevelWindow *window)
event.Skip();
});
- window_pos_restore(window, name);
+ window_pos_restore(window, name, default_maximized);
on_window_geometry(window, [=]() {
window_pos_sanitize(window);
@@ -883,15 +883,21 @@ void GUI_App::window_pos_save(wxTopLevelWindow* window, const std::string &name)
app_config->save();
}
-void GUI_App::window_pos_restore(wxTopLevelWindow* window, const std::string &name)
+void GUI_App::window_pos_restore(wxTopLevelWindow* window, const std::string &name, bool default_maximized)
{
if (name.empty()) { return; }
const auto config_key = (boost::format("window_%1%") % name).str();
- if (! app_config->has(config_key)) { return; }
+ if (! app_config->has(config_key)) {
+ window->Maximize(default_maximized);
+ return;
+ }
auto metrics = WindowMetrics::deserialize(app_config->get(config_key));
- if (! metrics) { return; }
+ if (! metrics) {
+ window->Maximize(default_maximized);
+ return;
+ }
window->SetSize(metrics->get_rect());
window->Maximize(metrics->get_maximized());
diff --git a/src/slic3r/GUI/GUI_App.hpp b/src/slic3r/GUI/GUI_App.hpp
index 5ee0c15095..3a6a443f06 100644
--- a/src/slic3r/GUI/GUI_App.hpp
+++ b/src/slic3r/GUI/GUI_App.hpp
@@ -124,7 +124,7 @@ public:
const std::string& err);
// void notify(/*message*/);
- void persist_window_geometry(wxTopLevelWindow *window);
+ void persist_window_geometry(wxTopLevelWindow *window, bool default_maximized = false);
void update_ui_from_settings();
bool select_language(wxArrayString & names, wxArrayLong & identifiers);
@@ -176,7 +176,7 @@ public:
private:
bool on_init_inner();
void window_pos_save(wxTopLevelWindow* window, const std::string &name);
- void window_pos_restore(wxTopLevelWindow* window, const std::string &name);
+ void window_pos_restore(wxTopLevelWindow* window, const std::string &name, bool default_maximized = false);
void window_pos_sanitize(wxTopLevelWindow* window);
};
DECLARE_APP(GUI_App)
diff --git a/src/slic3r/GUI/MainFrame.cpp b/src/slic3r/GUI/MainFrame.cpp
index 571b57235f..78d17a4f1a 100644
--- a/src/slic3r/GUI/MainFrame.cpp
+++ b/src/slic3r/GUI/MainFrame.cpp
@@ -129,7 +129,7 @@ DPIFrame(NULL, wxID_ANY, SLIC3R_BUILD, wxDefaultPosition, wxDefaultSize, wxDEFAU
event.Skip();
});
- wxGetApp().persist_window_geometry(this);
+ wxGetApp().persist_window_geometry(this, true);
update_ui_from_settings(); // FIXME (?)
}
@@ -298,6 +298,16 @@ void MainFrame::on_dpi_changed(const wxRect &suggested_rect)
this->Maximize(is_maximized);
}
+static std::string menu_icon(const std::string& icon_name)
+{
+#ifdef __WXMSW__
+ const std::string folder = "white\\";
+#else
+ const std::string folder = "white/";
+#endif
+ return wxGetApp().dark_mode_menus() ? folder+icon_name : icon_name;
+}
+
void MainFrame::init_menubar()
{
#ifdef __APPLE__
@@ -308,40 +318,41 @@ void MainFrame::init_menubar()
wxMenu* fileMenu = new wxMenu;
{
wxMenuItem* item_open = append_menu_item(fileMenu, wxID_ANY, _(L("&Open Project")) + dots + "\tCtrl+O", _(L("Open a project file")),
- [this](wxCommandEvent&) { if (m_plater) m_plater->load_project(); }, "open");
+ [this](wxCommandEvent&) { if (m_plater) m_plater->load_project(); }, menu_icon("open"));
wxMenuItem* item_save = append_menu_item(fileMenu, wxID_ANY, _(L("&Save Project")) + "\tCtrl+S", _(L("Save current project file")),
- [this](wxCommandEvent&) { if (m_plater) m_plater->export_3mf(into_path(m_plater->get_project_filename())); }, "save");
+ [this](wxCommandEvent&) { if (m_plater) m_plater->export_3mf(into_path(m_plater->get_project_filename())); }, menu_icon("save"));
wxMenuItem* item_save_as = append_menu_item(fileMenu, wxID_ANY, _(L("Save Project &as")) + dots + "\tCtrl+Alt+S", _(L("Save current project file as")),
- [this](wxCommandEvent&) { if (m_plater) m_plater->export_3mf(); }, "save");
+ [this](wxCommandEvent&) { if (m_plater) m_plater->export_3mf(); }, menu_icon("save"));
fileMenu->AppendSeparator();
wxMenu* import_menu = new wxMenu();
wxMenuItem* item_import_model = append_menu_item(import_menu, wxID_ANY, _(L("Import STL/OBJ/AM&F/3MF")) + dots + "\tCtrl+I", _(L("Load a model")),
- [this](wxCommandEvent&) { if (m_plater) m_plater->add_model(); }, "import_plater");
+ [this](wxCommandEvent&) { if (m_plater) m_plater->add_model(); }, menu_icon("import_plater"));
import_menu->AppendSeparator();
append_menu_item(import_menu, wxID_ANY, _(L("Import &Config")) + dots + "\tCtrl+L", _(L("Load exported configuration file")),
- [this](wxCommandEvent&) { load_config_file(); }, "import_config");
+ [this](wxCommandEvent&) { load_config_file(); }, menu_icon("import_config"));
append_menu_item(import_menu, wxID_ANY, _(L("Import Config from &project")) + dots +"\tCtrl+Alt+L", _(L("Load configuration from project file")),
- [this](wxCommandEvent&) { if (m_plater) m_plater->extract_config_from_project(); }, "import_config");
+ [this](wxCommandEvent&) { if (m_plater) m_plater->extract_config_from_project(); }, menu_icon("import_config"));
import_menu->AppendSeparator();
append_menu_item(import_menu, wxID_ANY, _(L("Import Config &Bundle")) + dots, _(L("Load presets from a bundle")),
- [this](wxCommandEvent&) { load_configbundle(); }, "import_config_bundle");
+ [this](wxCommandEvent&) { load_configbundle(); }, menu_icon("import_config_bundle"));
append_submenu(fileMenu, import_menu, wxID_ANY, _(L("&Import")), "");
wxMenu* export_menu = new wxMenu();
wxMenuItem* item_export_gcode = append_menu_item(export_menu, wxID_ANY, _(L("Export &G-code")) + dots +"\tCtrl+G", _(L("Export current plate as G-code")),
- [this](wxCommandEvent&) { if (m_plater) m_plater->export_gcode(); }, "export_gcode");
+ [this](wxCommandEvent&) { if (m_plater) m_plater->export_gcode(); }, menu_icon("export_gcode"));
+ m_changeable_menu_items.push_back(item_export_gcode);
export_menu->AppendSeparator();
wxMenuItem* item_export_stl = append_menu_item(export_menu, wxID_ANY, _(L("Export plate as &STL")) + dots, _(L("Export current plate as STL")),
- [this](wxCommandEvent&) { if (m_plater) m_plater->export_stl(); }, "export_plater");
+ [this](wxCommandEvent&) { if (m_plater) m_plater->export_stl(); }, menu_icon("export_plater"));
wxMenuItem* item_export_amf = append_menu_item(export_menu, wxID_ANY, _(L("Export plate as &AMF")) + dots, _(L("Export current plate as AMF")),
- [this](wxCommandEvent&) { if (m_plater) m_plater->export_amf(); }, "export_plater");
+ [this](wxCommandEvent&) { if (m_plater) m_plater->export_amf(); }, menu_icon("export_plater"));
export_menu->AppendSeparator();
append_menu_item(export_menu, wxID_ANY, _(L("Export &Config")) +dots +"\tCtrl+E", _(L("Export current configuration to file")),
- [this](wxCommandEvent&) { export_config(); }, "export_config");
+ [this](wxCommandEvent&) { export_config(); }, menu_icon("export_config"));
append_menu_item(export_menu, wxID_ANY, _(L("Export Config &Bundle")) + dots, _(L("Export all presets to file")),
- [this](wxCommandEvent&) { export_configbundle(); }, "export_config_bundle");
+ [this](wxCommandEvent&) { export_configbundle(); }, menu_icon("export_config_bundle"));
append_submenu(fileMenu, export_menu, wxID_ANY, _(L("&Export")), "");
fileMenu->AppendSeparator();
@@ -369,10 +380,10 @@ void MainFrame::init_menubar()
fileMenu->AppendSeparator();
#endif
m_menu_item_reslice_now = append_menu_item(fileMenu, wxID_ANY, _(L("(Re)Slice &Now")) + "\tCtrl+R", _(L("Start new slicing process")),
- [this](wxCommandEvent&) { reslice_now(); }, "re_slice");
+ [this](wxCommandEvent&) { reslice_now(); }, menu_icon("re_slice"));
fileMenu->AppendSeparator();
append_menu_item(fileMenu, wxID_ANY, _(L("&Repair STL file")) + dots, _(L("Automatically repair an STL file")),
- [this](wxCommandEvent&) { repair_stl(); }, "wrench");
+ [this](wxCommandEvent&) { repair_stl(); }, menu_icon("wrench"));
fileMenu->AppendSeparator();
append_menu_item(fileMenu, wxID_EXIT, _(L("&Quit")), wxString::Format(_(L("Quit %s")), SLIC3R_APP_NAME),
[this](wxCommandEvent&) { Close(false); });
@@ -412,16 +423,16 @@ void MainFrame::init_menubar()
[this](wxCommandEvent&) { m_plater->select_all(); }, "");
editMenu->AppendSeparator();
wxMenuItem* item_delete_sel = append_menu_item(editMenu, wxID_ANY, _(L("&Delete selected")) + sep + hotkey_delete, _(L("Deletes the current selection")),
- [this](wxCommandEvent&) { m_plater->remove_selected(); }, "remove_menu");
+ [this](wxCommandEvent&) { m_plater->remove_selected(); }, menu_icon("remove_menu"));
wxMenuItem* item_delete_all = append_menu_item(editMenu, wxID_ANY, _(L("Delete &all")) + sep + GUI::shortkey_ctrl_prefix() + sep_space + hotkey_delete, _(L("Deletes all objects")),
- [this](wxCommandEvent&) { m_plater->reset(); }, "delete_all_menu");
+ [this](wxCommandEvent&) { m_plater->reset(); }, menu_icon("delete_all_menu"));
editMenu->AppendSeparator();
wxMenuItem* item_copy = append_menu_item(editMenu, wxID_ANY, _(L("&Copy")) + sep + GUI::shortkey_ctrl_prefix() + sep_space + "C", _(L("Copy selection to clipboard")),
- [this](wxCommandEvent&) { m_plater->copy_selection_to_clipboard(); }, "copy_menu");
+ [this](wxCommandEvent&) { m_plater->copy_selection_to_clipboard(); }, menu_icon("copy_menu"));
wxMenuItem* item_paste = append_menu_item(editMenu, wxID_ANY, _(L("&Paste")) + sep + GUI::shortkey_ctrl_prefix() + sep_space + "V", _(L("Paste clipboard")),
- [this](wxCommandEvent&) { m_plater->paste_from_clipboard(); }, "paste_menu");
+ [this](wxCommandEvent&) { m_plater->paste_from_clipboard(); }, menu_icon("paste_menu"));
Bind(wxEVT_UPDATE_UI, [this](wxUpdateUIEvent& evt) { evt.Enable(can_select()); }, item_select_all->GetId());
Bind(wxEVT_UPDATE_UI, [this](wxUpdateUIEvent& evt) { evt.Enable(can_delete()); }, item_delete_sel->GetId());
@@ -436,24 +447,25 @@ void MainFrame::init_menubar()
size_t tab_offset = 0;
if (m_plater) {
append_menu_item(windowMenu, wxID_HIGHEST + 1, _(L("&Plater Tab")) + "\tCtrl+1", _(L("Show the plater")),
- [this](wxCommandEvent&) { select_tab(0); }, "plater");
+ [this](wxCommandEvent&) { select_tab(0); }, menu_icon("plater"));
tab_offset += 1;
}
if (tab_offset > 0) {
windowMenu->AppendSeparator();
}
append_menu_item(windowMenu, wxID_HIGHEST + 2, _(L("P&rint Settings Tab")) + "\tCtrl+2", _(L("Show the print settings")),
- [this, tab_offset](wxCommandEvent&) { select_tab(tab_offset + 0); }, "cog");
- append_menu_item(windowMenu, wxID_HIGHEST + 3, _(L("&Filament Settings Tab")) + "\tCtrl+3", _(L("Show the filament settings")),
- [this, tab_offset](wxCommandEvent&) { select_tab(tab_offset + 1); }, "spool.png");
+ [this, tab_offset](wxCommandEvent&) { select_tab(tab_offset + 0); }, menu_icon("cog"));
+ wxMenuItem* item_material_tab = append_menu_item(windowMenu, wxID_HIGHEST + 3, _(L("&Filament Settings Tab")) + "\tCtrl+3", _(L("Show the filament settings")),
+ [this, tab_offset](wxCommandEvent&) { select_tab(tab_offset + 1); }, menu_icon("spool"));
+ m_changeable_menu_items.push_back(item_material_tab);
append_menu_item(windowMenu, wxID_HIGHEST + 4, _(L("Print&er Settings Tab")) + "\tCtrl+4", _(L("Show the printer settings")),
- [this, tab_offset](wxCommandEvent&) { select_tab(tab_offset + 2); }, "printer");
+ [this, tab_offset](wxCommandEvent&) { select_tab(tab_offset + 2); }, menu_icon("printer"));
if (m_plater) {
windowMenu->AppendSeparator();
wxMenuItem* item_3d = append_menu_item(windowMenu, wxID_HIGHEST + 5, _(L("3&D")) + "\tCtrl+5", _(L("Show the 3D editing view")),
- [this](wxCommandEvent&) { m_plater->select_view_3D("3D"); }, "editor_menu");
+ [this](wxCommandEvent&) { m_plater->select_view_3D("3D"); }, menu_icon("editor_menu"));
wxMenuItem* item_preview = append_menu_item(windowMenu, wxID_HIGHEST + 6, _(L("Pre&view")) + "\tCtrl+6", _(L("Show the 3D slices preview")),
- [this](wxCommandEvent&) { m_plater->select_view_3D("Preview"); }, "preview_menu");
+ [this](wxCommandEvent&) { m_plater->select_view_3D("Preview"); }, menu_icon("preview_menu"));
Bind(wxEVT_UPDATE_UI, [this](wxUpdateUIEvent& evt) { evt.Enable(can_change_view()); }, item_3d->GetId());
Bind(wxEVT_UPDATE_UI, [this](wxUpdateUIEvent& evt) { evt.Enable(can_change_view()); }, item_preview->GetId());
@@ -474,7 +486,7 @@ void MainFrame::init_menubar()
windowMenu->AppendSeparator();
append_menu_item(windowMenu, wxID_ANY, _(L("Print &Host Upload Queue")) + "\tCtrl+J", _(L("Display the Print Host Upload Queue window")),
- [this](wxCommandEvent&) { m_printhost_queue_dlg->Show(); }, "upload_queue");
+ [this](wxCommandEvent&) { m_printhost_queue_dlg->Show(); }, menu_icon("upload_queue"));
}
// View menu
@@ -554,6 +566,19 @@ void MainFrame::init_menubar()
}, wxID_EXIT);
}
#endif
+
+ if (plater()->printer_technology() == ptSLA)
+ update_menubar();
+}
+
+void MainFrame::update_menubar()
+{
+ const bool is_fff = plater()->printer_technology() == ptFFF;
+
+ m_changeable_menu_items[miExport] ->SetItemLabel((is_fff ? _(L("Export &G-code")) : _(L("Export")) ) + dots + "\tCtrl+G");
+
+ m_changeable_menu_items[miMaterialTab] ->SetItemLabel((is_fff ? _(L("&Filament Settings Tab")) : _(L("Mate&rial Settings Tab"))) + "\tCtrl+3");
+ m_changeable_menu_items[miMaterialTab] ->SetBitmap(create_scaled_bitmap(this, menu_icon(is_fff ? "spool": "resin")));
}
// To perform the "Quck Slice", "Quick Slice and Save As", "Repeat last Quick Slice" and "Slice to SVG".
diff --git a/src/slic3r/GUI/MainFrame.hpp b/src/slic3r/GUI/MainFrame.hpp
index a8b2be2bc7..13bf07922f 100644
--- a/src/slic3r/GUI/MainFrame.hpp
+++ b/src/slic3r/GUI/MainFrame.hpp
@@ -70,6 +70,16 @@ class MainFrame : public DPIFrame
bool can_delete() const;
bool can_delete_all() const;
+ // MenuBar items changeable in respect to printer technology
+ enum MenuItems
+ { // FFF SLA
+ miExport = 0, // Export G-code Export
+ miMaterialTab, // Filament Settings Material Settings
+ };
+
+ // vector of a MenuBar items changeable in respect to printer technology
+ std::vector m_changeable_menu_items;
+
protected:
virtual void on_dpi_changed(const wxRect &suggested_rect);
@@ -83,6 +93,7 @@ public:
void create_preset_tabs();
void add_created_tab(Tab* panel);
void init_menubar();
+ void update_menubar();
void update_ui_from_settings();
bool is_loaded() const { return m_loaded; }
diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp
index d45abd4793..07e1e2bae1 100644
--- a/src/slic3r/GUI/Plater.cpp
+++ b/src/slic3r/GUI/Plater.cpp
@@ -3758,6 +3758,9 @@ void Plater::set_printer_technology(PrinterTechnology printer_technology)
p->label_btn_export = printer_technology == ptFFF ? L("Export G-code") : L("Export");
p->label_btn_send = printer_technology == ptFFF ? L("Send G-code") : L("Send to printer");
+
+ if (wxGetApp().mainframe)
+ wxGetApp().mainframe->update_menubar();
}
void Plater::changed_object(int obj_idx)