From 2c9e3819c1562b7f84ee8ce71e58a3b334dbf4bc Mon Sep 17 00:00:00 2001 From: Enrico Turri Date: Mon, 29 Apr 2019 09:02:04 +0200 Subject: [PATCH 01/10] Darker colors for axes arrows, transformation visual hints and gizmo grabbers --- src/slic3r/GUI/3DBed.cpp | 7 ++++--- src/slic3r/GUI/Gizmos/GLGizmoBase.hpp | 2 +- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/slic3r/GUI/3DBed.cpp b/src/slic3r/GUI/3DBed.cpp index 05f4fd8fd..8392e534a 100644 --- a/src/slic3r/GUI/3DBed.cpp +++ b/src/slic3r/GUI/3DBed.cpp @@ -8,6 +8,7 @@ #include "GUI_App.hpp" #include "PresetBundle.hpp" +#include "Gizmos/GLGizmoBase.hpp" #include @@ -232,7 +233,7 @@ void Bed3D::Axes::render() const glsafe(::glEnable(GL_LIGHTING)); // x axis - glsafe(::glColor3f(1.0f, 0.0f, 0.0f)); + glsafe(::glColor3fv(AXES_COLOR[0])); glsafe(::glPushMatrix()); glsafe(::glTranslated(origin(0), origin(1), origin(2))); glsafe(::glRotated(90.0, 0.0, 1.0, 0.0)); @@ -240,7 +241,7 @@ void Bed3D::Axes::render() const glsafe(::glPopMatrix()); // y axis - glsafe(::glColor3f(0.0f, 1.0f, 0.0f)); + glsafe(::glColor3fv(AXES_COLOR[1])); glsafe(::glPushMatrix()); glsafe(::glTranslated(origin(0), origin(1), origin(2))); glsafe(::glRotated(-90.0, 1.0, 0.0, 0.0)); @@ -248,7 +249,7 @@ void Bed3D::Axes::render() const glsafe(::glPopMatrix()); // z axis - glsafe(::glColor3f(0.0f, 0.0f, 1.0f)); + glsafe(::glColor3fv(AXES_COLOR[2])); glsafe(::glPushMatrix()); glsafe(::glTranslated(origin(0), origin(1), origin(2))); render_axis(length(2)); diff --git a/src/slic3r/GUI/Gizmos/GLGizmoBase.hpp b/src/slic3r/GUI/Gizmos/GLGizmoBase.hpp index 461f65570..b07984ef1 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoBase.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoBase.hpp @@ -23,7 +23,7 @@ namespace GUI { static const float DEFAULT_BASE_COLOR[3] = { 0.625f, 0.625f, 0.625f }; static const float DEFAULT_DRAG_COLOR[3] = { 1.0f, 1.0f, 1.0f }; static const float DEFAULT_HIGHLIGHT_COLOR[3] = { 1.0f, 0.38f, 0.0f }; -static const float AXES_COLOR[3][3] = { { 1.0f, 0.0f, 0.0f }, { 0.0f, 1.0f, 0.0f }, { 0.0f, 0.0f, 1.0f } }; +static const float AXES_COLOR[3][3] = { { 0.75f, 0.0f, 0.0f }, { 0.0f, 0.75f, 0.0f }, { 0.0f, 0.0f, 0.75f } }; From c8815041e2707c354846688cc77110f21d3c3a76 Mon Sep 17 00:00:00 2001 From: YuSanka Date: Mon, 29 Apr 2019 09:43:42 +0200 Subject: [PATCH 02/10] Fix of #2168 --- src/slic3r/GUI/wxExtensions.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/slic3r/GUI/wxExtensions.cpp b/src/slic3r/GUI/wxExtensions.cpp index d76e0da93..00d37d664 100644 --- a/src/slic3r/GUI/wxExtensions.cpp +++ b/src/slic3r/GUI/wxExtensions.cpp @@ -2351,8 +2351,9 @@ void ModeButton::SetState(const bool state) void ModeButton::focus_button(const bool focus) { - wxFont font = GetFont(); - const wxFont& new_font = focus ? font.Bold() : font.GetBaseFont(); + const wxFont& new_font = focus ? + Slic3r::GUI::wxGetApp().bold_font() : + Slic3r::GUI::wxGetApp().normal_font(); SetFont(new_font); From fb0836b0b2f5a5c3eaaa25d5d92c3d5e9661b81b Mon Sep 17 00:00:00 2001 From: Vojtech Kral Date: Fri, 26 Apr 2019 16:53:04 +0200 Subject: [PATCH 03/10] ConfigWizard: Select an appropriate printer based on the bundle order --- src/slic3r/GUI/ConfigWizard.cpp | 28 +++++++++++++++++++++++----- src/slic3r/GUI/GUI.cpp | 9 ++------- src/slic3r/GUI/Preset.cpp | 11 +++++++++++ src/slic3r/GUI/Preset.hpp | 4 +++- src/slic3r/GUI/PresetBundle.cpp | 22 ++++++++++++++++------ src/slic3r/GUI/PresetBundle.hpp | 4 ++-- 6 files changed, 57 insertions(+), 21 deletions(-) diff --git a/src/slic3r/GUI/ConfigWizard.cpp b/src/slic3r/GUI/ConfigWizard.cpp index 93cf1c73f..bf4acacfa 100644 --- a/src/slic3r/GUI/ConfigWizard.cpp +++ b/src/slic3r/GUI/ConfigWizard.cpp @@ -982,10 +982,11 @@ void ConfigWizard::priv::apply_config(AppConfig *app_config, PresetBundle *prese size_t size_sum = 0; for (const auto &model : vendor->second) { size_sum += model.second.size(); } - if (size_sum == 0) { continue; } - // This vendor needs to be installed - install_bundles.emplace_back(vendor_rsrc.second); + if (size_sum > 0) { + // This vendor needs to be installed + install_bundles.emplace_back(vendor_rsrc.second); + } } // Decide whether to create snapshot based on run_reason and the reset profile checkbox @@ -1011,9 +1012,26 @@ void ConfigWizard::priv::apply_config(AppConfig *app_config, PresetBundle *prese app_config->set_vendors(appconfig_vendors); app_config->set("version_check", page_update->version_check ? "1" : "0"); app_config->set("preset_update", page_update->preset_update ? "1" : "0"); - app_config->reset_selections(); - preset_bundle->load_presets(*app_config); + std::string preferred_model; + + // Figure out the default pre-selected printer based on the seletions in the picker. + // The default is the first selected printer model (one with at least 1 variant selected). + // The default is only applied by load_presets() if the user doesn't have a (visible) printer + // selected already. + const auto vendor_prusa = vendors.find("PrusaResearch"); + const auto config_prusa = enabled_vendors.find("PrusaResearch"); + if (vendor_prusa != vendors.end() && config_prusa != enabled_vendors.end()) { + for (const auto &model : vendor_prusa->second.models) { + const auto model_it = config_prusa->second.find(model.id); + if (model_it != config_prusa->second.end() && model_it->second.size() > 0) { + preferred_model = model.id; + break; + } + } + } + + preset_bundle->load_presets(*app_config, preferred_model); if (page_custom->custom_wanted()) { page_firmware->apply_custom_config(*custom_config); diff --git a/src/slic3r/GUI/GUI.cpp b/src/slic3r/GUI/GUI.cpp index 4a3ccc356..9a641c7c0 100644 --- a/src/slic3r/GUI/GUI.cpp +++ b/src/slic3r/GUI/GUI.cpp @@ -125,9 +125,6 @@ void config_wizard(int reason) if (! wxGetApp().check_unsaved_changes()) return; - // save selected preset before config wizard running - const auto printer_preset_name = wxGetApp().preset_bundle->printers.get_edited_preset().name; - try { ConfigWizard wizard(nullptr, static_cast(reason)); wizard.run(wxGetApp().preset_bundle, wxGetApp().preset_updater); @@ -136,10 +133,8 @@ void config_wizard(int reason) show_error(nullptr, e.what()); } - // select old(before config wizard running) preset - wxGetApp().get_tab(Preset::TYPE_PRINTER)->select_preset(printer_preset_name); - // If old preset if invisible now, then first visible preset will be selected - // So, let control the case if multi-part object is on the scene and first visible preset is SLA + wxGetApp().load_current_presets(); + if (wxGetApp().preset_bundle->printers.get_edited_preset().printer_technology() == ptSLA && wxGetApp().obj_list()->has_multi_part_objects()) { diff --git a/src/slic3r/GUI/Preset.cpp b/src/slic3r/GUI/Preset.cpp index 9875586ed..6fb3da5a6 100644 --- a/src/slic3r/GUI/Preset.cpp +++ b/src/slic3r/GUI/Preset.cpp @@ -1330,4 +1330,15 @@ const Preset& PrinterPresetCollection::default_preset_for(const DynamicPrintConf return this->default_preset((opt_printer_technology == nullptr || opt_printer_technology->value == ptFFF) ? 0 : 1); } +const Preset* PrinterPresetCollection::find_by_model_id(const std::string &model_id) const +{ + if (model_id.empty()) { return nullptr; } + + const auto it = std::find_if(cbegin(), cend(), [&](const Preset &preset) { + return preset.config.opt_string("printer_model") == model_id; + }); + + return it != cend() ? &*it : nullptr; +} + } // namespace Slic3r diff --git a/src/slic3r/GUI/Preset.hpp b/src/slic3r/GUI/Preset.hpp index 051a55f66..bac1bfc4f 100644 --- a/src/slic3r/GUI/Preset.hpp +++ b/src/slic3r/GUI/Preset.hpp @@ -312,7 +312,7 @@ public: const Preset& get_edited_preset() const { return m_edited_preset; } // used to update preset_choice from Tab - const std::deque& get_presets() { return m_presets; } + const std::deque& get_presets() const { return m_presets; } int get_idx_selected() { return m_idx_selected; } static const std::string& get_suffix_modified(); @@ -503,6 +503,8 @@ public: PrinterPresetCollection(Preset::Type type, const std::vector &keys, const Slic3r::StaticPrintConfig &defaults, const std::string &default_name = "- default -") : PresetCollection(type, keys, defaults, default_name) {} const Preset& default_preset_for(const DynamicPrintConfig &config) const override; + + const Preset* find_by_model_id(const std::string &model_id) const; }; } // namespace Slic3r diff --git a/src/slic3r/GUI/PresetBundle.cpp b/src/slic3r/GUI/PresetBundle.cpp index b2fa0a857..6acaf31c9 100644 --- a/src/slic3r/GUI/PresetBundle.cpp +++ b/src/slic3r/GUI/PresetBundle.cpp @@ -191,7 +191,7 @@ void PresetBundle::setup_directories() } } -void PresetBundle::load_presets(const AppConfig &config) +void PresetBundle::load_presets(const AppConfig &config, const std::string &preferred_model_id) { // First load the vendor specific system presets. std::string errors_cummulative = this->load_system_presets(); @@ -234,7 +234,7 @@ void PresetBundle::load_presets(const AppConfig &config) if (! errors_cummulative.empty()) throw std::runtime_error(errors_cummulative); - this->load_selections(config); + this->load_selections(config, preferred_model_id); } // Load system presets into this PresetBundle. @@ -324,7 +324,7 @@ void PresetBundle::load_installed_printers(const AppConfig &config) // Load selections (current print, current filaments, current printer) from config.ini // This is done on application start up or after updates are applied. -void PresetBundle::load_selections(const AppConfig &config) +void PresetBundle::load_selections(const AppConfig &config, const std::string &preferred_model_id) { // Update visibility of presets based on application vendor / model / variant configuration. this->load_installed_printers(config); @@ -336,11 +336,21 @@ void PresetBundle::load_selections(const AppConfig &config) std::string initial_sla_material_profile_name = remove_ini_suffix(config.get("presets", "sla_material")); std::string initial_printer_profile_name = remove_ini_suffix(config.get("presets", "printer")); - // Activate print / filament / printer profiles from the config. - // If the printer profile enumerated by the config are not visible, select an alternate preset. + // Activate print / filament / printer profiles from either the config, + // or from the preferred_model_id suggestion passed in by ConfigWizard. + // If the printer profile enumerated by the config are not visible, select an alternate preset. // Do not select alternate profiles for the print / filament profiles as those presets // will be selected by the following call of this->update_compatible(true). - printers.select_preset_by_name(initial_printer_profile_name, true); + + const Preset *initial_printer = printers.find_preset(initial_printer_profile_name); + const Preset *preferred_printer = printers.find_by_model_id(preferred_model_id); + + if (preferred_printer != nullptr && (initial_printer == nullptr || !initial_printer->is_visible)) { + printers.select_preset_by_name(preferred_printer->name, true); + } else { + printers.select_preset_by_name(initial_printer_profile_name, true); + } + PrinterTechnology printer_technology = printers.get_selected_preset().printer_technology(); if (printer_technology == ptFFF) { prints.select_preset_by_name_strict(initial_print_profile_name); diff --git a/src/slic3r/GUI/PresetBundle.hpp b/src/slic3r/GUI/PresetBundle.hpp index 069ebd784..f351f66ac 100644 --- a/src/slic3r/GUI/PresetBundle.hpp +++ b/src/slic3r/GUI/PresetBundle.hpp @@ -31,7 +31,7 @@ public: // Load ini files of all types (print, filament, printer) from Slic3r::data_dir() / presets. // Load selections (current print, current filaments, current printer) from config.ini // This is done just once on application start up. - void load_presets(const AppConfig &config); + void load_presets(const AppConfig &config, const std::string &preferred_model_id = ""); // Export selections (current print, current filaments, current printer) into config.ini void export_selections(AppConfig &config); @@ -143,7 +143,7 @@ private: // Load selections (current print, current filaments, current printer) from config.ini // This is done just once on application start up. - void load_selections(const AppConfig &config); + void load_selections(const AppConfig &config, const std::string &preferred_model_id = ""); // Load print, filament & printer presets from a config. If it is an external config, then the name is extracted from the external path. // and the external config is just referenced, not stored into user profile directory. From b158598393778b9aabb7e697232a86b4e5c28ee5 Mon Sep 17 00:00:00 2001 From: Vojtech Kral Date: Fri, 26 Apr 2019 16:59:14 +0200 Subject: [PATCH 04/10] Detect dank mode on Mac OS --- src/slic3r/CMakeLists.txt | 5 ++++- src/slic3r/GUI/GUI_App.cpp | 19 +++++++++++++++++-- src/slic3r/GUI/GUI_App.hpp | 4 +++- src/slic3r/Utils/MacDarkMode.hpp | 15 +++++++++++++++ src/slic3r/Utils/MacDarkMode.mm | 22 ++++++++++++++++++++++ 5 files changed, 61 insertions(+), 4 deletions(-) create mode 100644 src/slic3r/Utils/MacDarkMode.hpp create mode 100644 src/slic3r/Utils/MacDarkMode.mm diff --git a/src/slic3r/CMakeLists.txt b/src/slic3r/CMakeLists.txt index 1d8a1e26e..555918765 100644 --- a/src/slic3r/CMakeLists.txt +++ b/src/slic3r/CMakeLists.txt @@ -149,7 +149,10 @@ set(SLIC3R_GUI_SOURCES ) if (APPLE) - list(APPEND SLIC3R_GUI_SOURCES Utils/RetinaHelperImpl.mm) + list(APPEND SLIC3R_GUI_SOURCES + Utils/RetinaHelperImpl.mm + Utils/MacDarkMode.mm + ) endif () add_library(libslic3r_gui STATIC ${SLIC3R_GUI_SOURCES}) diff --git a/src/slic3r/GUI/GUI_App.cpp b/src/slic3r/GUI/GUI_App.cpp index 0ffdd576f..87f58aa1a 100644 --- a/src/slic3r/GUI/GUI_App.cpp +++ b/src/slic3r/GUI/GUI_App.cpp @@ -34,6 +34,7 @@ #include "../Utils/PresetUpdater.hpp" #include "../Utils/PrintHost.hpp" +#include "../Utils/MacDarkMode.hpp" #include "ConfigWizard.hpp" #include "slic3r/Config/Snapshot.hpp" #include "ConfigSnapshotDialog.hpp" @@ -284,10 +285,24 @@ unsigned GUI_App::get_colour_approx_luma(const wxColour &colour) )); } +bool GUI_App::dark_mode() +{ + const unsigned luma = get_colour_approx_luma(wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW)); + return luma < 128; +} + +bool GUI_App::dark_mode_menus() +{ +#if __APPLE__ + return mac_dark_mode(); +#else + return dark_mode(); +#endif +} + void GUI_App::init_label_colours() { - auto luma = get_colour_approx_luma(wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW)); - if (luma >= 128) { + if (dark_mode()) { m_color_label_modified = wxColour(252, 77, 1); m_color_label_sys = wxColour(26, 132, 57); } diff --git a/src/slic3r/GUI/GUI_App.hpp b/src/slic3r/GUI/GUI_App.hpp index d3c9e0afa..5ee0c1509 100644 --- a/src/slic3r/GUI/GUI_App.hpp +++ b/src/slic3r/GUI/GUI_App.hpp @@ -94,7 +94,9 @@ public: GUI_App(); - unsigned get_colour_approx_luma(const wxColour &colour); + static unsigned get_colour_approx_luma(const wxColour &colour); + static bool dark_mode(); + static bool dark_mode_menus(); void init_label_colours(); void update_label_colours_from_appconfig(); void init_fonts(); diff --git a/src/slic3r/Utils/MacDarkMode.hpp b/src/slic3r/Utils/MacDarkMode.hpp new file mode 100644 index 000000000..cfdc02888 --- /dev/null +++ b/src/slic3r/Utils/MacDarkMode.hpp @@ -0,0 +1,15 @@ +#ifndef slic3r_MacDarkMode_hpp_ +#define slic3r_MacDarkMode_hpp_ + +namespace Slic3r { +namespace GUI { + +#if __APPLE__ +extern bool mac_dark_mode(); +#endif + + +} // namespace GUI +} // namespace Slic3r + +#endif // MacDarkMode_h diff --git a/src/slic3r/Utils/MacDarkMode.mm b/src/slic3r/Utils/MacDarkMode.mm new file mode 100644 index 000000000..4177ee371 --- /dev/null +++ b/src/slic3r/Utils/MacDarkMode.mm @@ -0,0 +1,22 @@ +#import "MacDarkMode.hpp" + +#import + + +@implementation MacDarkMode + +namespace Slic3r { +namespace GUI { + +bool mac_dark_mode() +{ + NSString *style = [[NSUserDefaults standardUserDefaults] stringForKey:@"AppleInterfaceStyle"]; + return style && [style isEqualToString:@"Dark"]; + +} + + +} +} + +@end From 9d67804d10135cad9302324aea73f592904aabfe Mon Sep 17 00:00:00 2001 From: Vojtech Kral Date: Mon, 29 Apr 2019 12:22:44 +0200 Subject: [PATCH 05/10] ConfigWizard: Finish DPI resizing (MSW) --- src/slic3r/GUI/ConfigWizard.cpp | 68 +++++++++++-------------- src/slic3r/GUI/ConfigWizard_private.hpp | 1 + 2 files changed, 30 insertions(+), 39 deletions(-) diff --git a/src/slic3r/GUI/ConfigWizard.cpp b/src/slic3r/GUI/ConfigWizard.cpp index bf4acacfa..93c780909 100644 --- a/src/slic3r/GUI/ConfigWizard.cpp +++ b/src/slic3r/GUI/ConfigWizard.cpp @@ -649,12 +649,6 @@ void PageTemperatures::apply_custom_config(DynamicPrintConfig &config) ConfigWizardIndex::ConfigWizardIndex(wxWindow *parent) : wxPanel(parent) - /* #ys_FIXME_delete_after_testing by VK - , bg(GUI::from_u8(Slic3r::var("Slic3r_192px_transparent.png")), wxBITMAP_TYPE_PNG) - , bullet_black(GUI::from_u8(Slic3r::var("bullet_black.png")), wxBITMAP_TYPE_PNG) - , bullet_blue(GUI::from_u8(Slic3r::var("bullet_blue.png")), wxBITMAP_TYPE_PNG) - , bullet_white(GUI::from_u8(Slic3r::var("bullet_white.png")), wxBITMAP_TYPE_PNG) - */ , bg(ScalableBitmap(parent, "Slic3r_192px_transparent.png", 192)) , bullet_black(ScalableBitmap(parent, "bullet_black.png")) , bullet_blue(ScalableBitmap(parent, "bullet_blue.png")) @@ -675,9 +669,6 @@ ConfigWizardIndex::ConfigWizardIndex(wxWindow *parent) // In some cases it didn't work at all. And so wxStaticBitmap is used here instead, // because it has all the platform quirks figured out. auto *sizer = new wxBoxSizer(wxVERTICAL); - /* #ys_FIXME_delete_after_testing by VK - auto *logo = new wxStaticBitmap(this, wxID_ANY, bg); - */ logo = new wxStaticBitmap(this, wxID_ANY, bg.bmp()); sizer->AddStretchSpacer(); sizer->Add(logo); @@ -786,10 +777,6 @@ void ConfigWizardIndex::on_paint(wxPaintEvent & evt) wxPaintDC dc(this); - /* #ys_FIXME_delete_after_testing by VK - const auto bullet_w = bullet_black.GetSize().GetWidth(); - const auto bullet_h = bullet_black.GetSize().GetHeight(); - */ const auto bullet_w = bullet_black.bmp().GetSize().GetWidth(); const auto bullet_h = bullet_black.bmp().GetSize().GetHeight(); const int yoff_icon = bullet_h < em_h ? (em_h - bullet_h) / 2 : 0; @@ -804,12 +791,6 @@ void ConfigWizardIndex::on_paint(wxPaintEvent & evt) unsigned x = em_w/2 + item.indent * em_w; if (i == item_active || item_hover >= 0 && i == (size_t)item_hover) { - /*#ys_FIXME_delete_after_testing by VK - dc.DrawBitmap(bullet_blue, x, y + yoff_icon, false); - } - else if (i < item_active) { dc.DrawBitmap(bullet_black, x, y + yoff_icon, false); } - else if (i > item_active) { dc.DrawBitmap(bullet_white, x, y + yoff_icon, false); } - */ dc.DrawBitmap(bullet_blue.bmp(), x, y + yoff_icon, false); } else if (i < item_active) { dc.DrawBitmap(bullet_black.bmp(), x, y + yoff_icon, false); } @@ -848,6 +829,10 @@ void ConfigWizardIndex::on_mouse_move(wxMouseEvent &evt) void ConfigWizardIndex::msw_rescale() { + const wxSize size = GetTextExtent("m"); + em_w = size.x; + em_h = size.y; + bg.msw_rescale(); SetMinSize(bg.bmp().GetSize()); logo->SetBitmap(bg.bmp()); @@ -897,6 +882,29 @@ void ConfigWizard::priv::load_pages(bool custom_setup) q->Layout(); } +void ConfigWizard::priv::init_dialog_size() +{ + // Clamp the Wizard size based on screen dimensions + + const auto idx = wxDisplay::GetFromWindow(q); + wxDisplay display(idx != wxNOT_FOUND ? idx : 0u); + + const auto disp_rect = display.GetClientArea(); + wxRect window_rect( + disp_rect.x + disp_rect.width / 20, + disp_rect.y + disp_rect.height / 20, + 9*disp_rect.width / 10, + 9*disp_rect.height / 10); + + const int width_hint = index->GetSize().GetWidth() + page_fff->get_width() + 30 * em(); // XXX: magic constant, I found no better solution + if (width_hint < window_rect.width) { + window_rect.x += (window_rect.width - width_hint) / 2; + window_rect.width = width_hint; + } + + q->SetSize(window_rect); +} + bool ConfigWizard::priv::check_first_variant() const { return run_reason == RR_DATA_EMPTY || run_reason == RR_DATA_LEGACY; @@ -1125,25 +1133,7 @@ ConfigWizard::ConfigWizard(wxWindow *parent, RunReason reason) p->hscroll->SetScrollRate(30, 30); on_window_geometry(this, [this]() { - // Clamp the Wizard size based on screen dimensions - - const auto idx = wxDisplay::GetFromWindow(this); - wxDisplay display(idx != wxNOT_FOUND ? idx : 0u); - - const auto disp_rect = display.GetClientArea(); - wxRect window_rect( - disp_rect.x + disp_rect.width / 20, - disp_rect.y + disp_rect.height / 20, - 9*disp_rect.width / 10, - 9*disp_rect.height / 10); - - const int width_hint = p->index->GetSize().GetWidth() + p->page_fff->get_width() + 30 * p->em(); // XXX: magic constant, I found no better solution - if (width_hint < window_rect.width) { - window_rect.x += (window_rect.width - width_hint) / 2; - window_rect.width = width_hint; - } - - SetSize(window_rect); + p->init_dialog_size(); }); p->btn_prev->Bind(wxEVT_BUTTON, [this](const wxCommandEvent &) { this->p->index->go_prev(); }); @@ -1212,7 +1202,7 @@ void ConfigWizard::on_dpi_changed(const wxRect &suggested_rect) for (auto printer_picker: p->page_fff->printer_pickers) msw_buttons_rescale(this, em, printer_picker->get_button_indexes()); - // FIXME VK SetSize(???) + p->init_dialog_size(); Refresh(); } diff --git a/src/slic3r/GUI/ConfigWizard_private.hpp b/src/slic3r/GUI/ConfigWizard_private.hpp index 95411e2aa..f4848933f 100644 --- a/src/slic3r/GUI/ConfigWizard_private.hpp +++ b/src/slic3r/GUI/ConfigWizard_private.hpp @@ -292,6 +292,7 @@ struct ConfigWizard::priv priv(ConfigWizard *q) : q(q) {} void load_pages(bool custom_setup); + void init_dialog_size(); bool check_first_variant() const; void load_vendors(); From 3ec17fae67cf24d934062bb3f1d817fe89e419e8 Mon Sep 17 00:00:00 2001 From: Lukas Matena Date: Mon, 29 Apr 2019 11:13:32 +0200 Subject: [PATCH 06/10] A hotfix for #2179 (GCode preview crash on T-1 in GCode) --- src/slic3r/GUI/GLCanvas3D.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index bfa4a8ed6..dfddc7f45 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -5001,6 +5001,10 @@ bool GLCanvas3D::_travel_paths_by_tool(const GCodePreviewData& preview_data, con // creates a new volume for each tool for (Tool& tool : tools) { + // tool.value could be invalid (as it was with https://github.com/prusa3d/Slic3r/issues/2179), we better check + if (tool.value >= tool_colors.size()) + continue; + GLVolume* volume = new GLVolume(tool_colors.data() + tool.value * 4); if (volume == nullptr) return false; @@ -5015,7 +5019,7 @@ bool GLCanvas3D::_travel_paths_by_tool(const GCodePreviewData& preview_data, con for (const GCodePreviewData::Travel::Polyline& polyline : preview_data.travel.polylines) { ToolsList::iterator tool = std::find(tools.begin(), tools.end(), Tool(polyline.extruder_id)); - if (tool != tools.end()) + if (tool != tools.end() && tool->volume != nullptr) { tool->volume->print_zs.push_back(unscale(polyline.polyline.bounding_box().min(2))); tool->volume->offsets.push_back(tool->volume->indexed_vertex_array.quad_indices.size()); From cd9a77fed6c9a0a709bcc542bb773f3e34af64e5 Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Mon, 29 Apr 2019 16:42:22 +0200 Subject: [PATCH 07/10] Remove back offset from the print statistic calculation. --- src/libslic3r/SLAPrint.cpp | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/libslic3r/SLAPrint.cpp b/src/libslic3r/SLAPrint.cpp index 3122beece..9be438eda 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); From bfcd9f3c299b84ae94e1d522865f97da295c38aa Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Mon, 29 Apr 2019 16:53:16 +0200 Subject: [PATCH 08/10] Fix for unregistered scaling correction values. --- src/libslic3r/PrintConfig.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/libslic3r/PrintConfig.cpp b/src/libslic3r/PrintConfig.cpp index a143051e0..3e1fc5c3d 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"); From 8098c09589f9af6ca3cda86bafb7d0cec49bf514 Mon Sep 17 00:00:00 2001 From: Vojtech Kral Date: Mon, 29 Apr 2019 16:55:41 +0200 Subject: [PATCH 09/10] MainFrame: Maximize by default (at first start) --- src/slic3r/GUI/GUI_App.cpp | 16 +++++++++++----- src/slic3r/GUI/GUI_App.hpp | 4 ++-- src/slic3r/GUI/MainFrame.cpp | 2 +- 3 files changed, 14 insertions(+), 8 deletions(-) diff --git a/src/slic3r/GUI/GUI_App.cpp b/src/slic3r/GUI/GUI_App.cpp index 87f58aa1a..595a968bd 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 5ee0c1509..3a6a443f0 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 571b57235..3e3642af5 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 (?) } From a7d57de6f3635aae28ca74289d7e9d7caffe7bdf Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Mon, 29 Apr 2019 17:07:55 +0200 Subject: [PATCH 10/10] Fix for possible clash with old correction vectors in config --- src/libslic3r/SLAPrint.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/libslic3r/SLAPrint.cpp b/src/libslic3r/SLAPrint.cpp index 9be438eda..4210b46d5 100644 --- a/src/libslic3r/SLAPrint.cpp +++ b/src/libslic3r/SLAPrint.cpp @@ -1664,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;