From 27b6c061d81122729e38446c961066316b23760b Mon Sep 17 00:00:00 2001 From: Vojtech Kral Date: Fri, 22 Jun 2018 15:01:33 +0200 Subject: [PATCH 01/17] ConfigWizard: Fix default printer selection --- xs/src/slic3r/GUI/ConfigWizard.cpp | 14 +++++++++----- xs/src/slic3r/GUI/ConfigWizard_private.hpp | 1 + 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/xs/src/slic3r/GUI/ConfigWizard.cpp b/xs/src/slic3r/GUI/ConfigWizard.cpp index ce06da853..f723e7f4b 100644 --- a/xs/src/slic3r/GUI/ConfigWizard.cpp +++ b/xs/src/slic3r/GUI/ConfigWizard.cpp @@ -113,11 +113,6 @@ PrinterPicker::PrinterPicker(wxWindow *parent, const VendorProfile &vendor, cons sizer->Add(all_none_sizer, 0, wxEXPAND); SetSizer(sizer); - - if (cboxes.size() > 0) { - cboxes[0]->SetValue(true); - on_checkbox(cboxes[0], true); - } } void PrinterPicker::select_all(bool select) @@ -130,6 +125,14 @@ void PrinterPicker::select_all(bool select) } } +void PrinterPicker::select_one(size_t i, bool select) +{ + if (i < cboxes.size() && cboxes[i]->GetValue() != select) { + cboxes[i]->SetValue(select); + on_checkbox(cboxes[i], select); + } +} + void PrinterPicker::on_checkbox(const Checkbox *cbox, bool checked) { variants_checked += checked ? 1 : -1; @@ -232,6 +235,7 @@ PageWelcome::PageWelcome(ConfigWizard *parent) : AppConfig &appconfig_vendors = this->wizard_p()->appconfig_vendors; printer_picker = new PrinterPicker(this, vendor_prusa->second, appconfig_vendors); + printer_picker->select_one(0, true); // Select the default (first) model/variant on the Prusa vendor printer_picker->Bind(EVT_PRINTER_PICK, [this, &appconfig_vendors](const PrinterPickerEvent &evt) { appconfig_vendors.set_variant(evt.vendor_id, evt.model_id, evt.variant_name, evt.enable); this->on_variant_checked(); diff --git a/xs/src/slic3r/GUI/ConfigWizard_private.hpp b/xs/src/slic3r/GUI/ConfigWizard_private.hpp index 72cb88655..04319a1b4 100644 --- a/xs/src/slic3r/GUI/ConfigWizard_private.hpp +++ b/xs/src/slic3r/GUI/ConfigWizard_private.hpp @@ -56,6 +56,7 @@ struct PrinterPicker: wxPanel PrinterPicker(wxWindow *parent, const VendorProfile &vendor, const AppConfig &appconfig_vendors); void select_all(bool select); + void select_one(size_t i, bool select); void on_checkbox(const Checkbox *cbox, bool checked); }; From ac829ea0637e2108f4d4d90b5ad2dc650761f1dd Mon Sep 17 00:00:00 2001 From: Vojtech Kral Date: Fri, 22 Jun 2018 15:27:04 +0200 Subject: [PATCH 02/17] PresetUpdater: Fix double update detection (had_config_update) --- xs/src/slic3r/Utils/PresetUpdater.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/xs/src/slic3r/Utils/PresetUpdater.cpp b/xs/src/slic3r/Utils/PresetUpdater.cpp index 8159a75e2..1ce814b89 100644 --- a/xs/src/slic3r/Utils/PresetUpdater.cpp +++ b/xs/src/slic3r/Utils/PresetUpdater.cpp @@ -537,15 +537,15 @@ bool PresetUpdater::config_update() const incompats_map.emplace(std::make_pair(std::move(vendor), std::move(restrictions))); } + p->had_config_update = true; // This needs to be done before a dialog is shown because of OnIdle() + CallAfter() in Perl + GUI::MsgDataIncompatible dlg(std::move(incompats_map)); const auto res = dlg.ShowModal(); if (res == wxID_REPLACE) { BOOST_LOG_TRIVIAL(info) << "User wants to re-configure..."; p->perform_updates(std::move(updates)); GUI::ConfigWizard wizard(nullptr, GUI::ConfigWizard::RR_DATA_INCOMPAT); - if (wizard.run(GUI::get_preset_bundle(), this)) { - p->had_config_update = true; - } else { + if (! wizard.run(GUI::get_preset_bundle(), this)) { return false; } } else { @@ -566,6 +566,8 @@ bool PresetUpdater::config_update() const updates_map.emplace(std::make_pair(std::move(vendor), std::move(ver_str))); } + p->had_config_update = true; // Ditto, see above + GUI::MsgUpdateConfig dlg(std::move(updates_map)); const auto res = dlg.ShowModal(); @@ -581,8 +583,6 @@ bool PresetUpdater::config_update() const } else { BOOST_LOG_TRIVIAL(info) << "User refused the update"; } - - p->had_config_update = true; } else { BOOST_LOG_TRIVIAL(info) << "No configuration updates available."; } From 5c89a80ef4b1efb493af1e5ace21360fbfd193d4 Mon Sep 17 00:00:00 2001 From: Vojtech Kral Date: Mon, 25 Jun 2018 13:29:54 +0200 Subject: [PATCH 03/17] ConfigWizard: Mark the first variant of each printer as default in the GUI --- xs/src/slic3r/GUI/ConfigWizard.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/xs/src/slic3r/GUI/ConfigWizard.cpp b/xs/src/slic3r/GUI/ConfigWizard.cpp index f723e7f4b..642c6dce7 100644 --- a/xs/src/slic3r/GUI/ConfigWizard.cpp +++ b/xs/src/slic3r/GUI/ConfigWizard.cpp @@ -83,8 +83,11 @@ PrinterPicker::PrinterPicker(wxWindow *parent, const VendorProfile &vendor, cons const auto model_id = model.id; + bool default_variant = true; // Mark the first variant as default in the GUI for (const auto &variant : model.variants) { - const auto label = wxString::Format("%s %s %s", variant.name, _(L("mm")), _(L("nozzle"))); + const auto label = wxString::Format("%s %s %s %s", variant.name, _(L("mm")), _(L("nozzle")), + (default_variant ? _(L("(default)")) : wxString())); + default_variant = false; auto *cbox = new Checkbox(panel, label, model_id, variant.name); const size_t idx = cboxes.size(); cboxes.push_back(cbox); From 2a23a9c5bc6d5ee335c5ec55b52c215c07024f96 Mon Sep 17 00:00:00 2001 From: Vojtech Kral Date: Wed, 27 Jun 2018 10:34:21 +0200 Subject: [PATCH 04/17] Fix: Http: Body size limit not properly initialized --- xs/src/slic3r/Utils/Http.cpp | 1 + xs/src/slic3r/Utils/Http.hpp | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/xs/src/slic3r/Utils/Http.cpp b/xs/src/slic3r/Utils/Http.cpp index 47021d39f..949a0e7d6 100644 --- a/xs/src/slic3r/Utils/Http.cpp +++ b/xs/src/slic3r/Utils/Http.cpp @@ -71,6 +71,7 @@ Http::priv::priv(const std::string &url) : form(nullptr), form_end(nullptr), headerlist(nullptr), + limit(0), cancel(false) { if (curl == nullptr) { diff --git a/xs/src/slic3r/Utils/Http.hpp b/xs/src/slic3r/Utils/Http.hpp index 73656bf88..7c2bd84fc 100644 --- a/xs/src/slic3r/Utils/Http.hpp +++ b/xs/src/slic3r/Utils/Http.hpp @@ -46,7 +46,8 @@ public: Http& operator=(const Http &) = delete; Http& operator=(Http &&) = delete; - // Sets a maximum size of the data that can be received. The default is 5MB. + // Sets a maximum size of the data that can be received. + // A value of zero sets the default limit, which is is 5MB. Http& size_limit(size_t sizeLimit); // Sets a HTTP header field. Http& header(std::string name, const std::string &value); From 5c323474499b133d7994da296b1d906bbc1e656a Mon Sep 17 00:00:00 2001 From: Enrico Turri Date: Wed, 27 Jun 2018 11:31:11 +0200 Subject: [PATCH 05/17] 1st attempt to fix opengl on ubuntu --- lib/Slic3r/GUI/Plater.pm | 4 +- lib/Slic3r/GUI/Plater/3DPreview.pm | 4 +- xs/src/slic3r/GUI/3DScene.cpp | 20 +++--- xs/src/slic3r/GUI/3DScene.hpp | 6 +- xs/src/slic3r/GUI/GLCanvas3D.cpp | 80 ++++++++++++++++++---- xs/src/slic3r/GUI/GLCanvas3D.hpp | 10 ++- xs/src/slic3r/GUI/GLCanvas3DManager.cpp | 88 ++++++++++++++----------- xs/src/slic3r/GUI/GLCanvas3DManager.hpp | 8 ++- xs/xsp/GUI_3DScene.xsp | 5 -- 9 files changed, 154 insertions(+), 71 deletions(-) diff --git a/lib/Slic3r/GUI/Plater.pm b/lib/Slic3r/GUI/Plater.pm index 96bddd466..1e32fd8d3 100644 --- a/lib/Slic3r/GUI/Plater.pm +++ b/lib/Slic3r/GUI/Plater.pm @@ -204,7 +204,9 @@ sub new { if (($preview != $self->{preview3D}) && ($preview != $self->{canvas3D})) { Slic3r::GUI::_3DScene::set_active($self->{preview3D}->canvas, 0); Slic3r::GUI::_3DScene::set_active($self->{canvas3D}, 0); - Slic3r::GUI::_3DScene::reset_current_canvas(); +#================================================================================================================== +# Slic3r::GUI::_3DScene::reset_current_canvas(); +#================================================================================================================== $preview->OnActivate if $preview->can('OnActivate'); } elsif ($preview == $self->{preview3D}) { Slic3r::GUI::_3DScene::set_active($self->{preview3D}->canvas, 1); diff --git a/lib/Slic3r/GUI/Plater/3DPreview.pm b/lib/Slic3r/GUI/Plater/3DPreview.pm index c7dab869f..9a470e017 100644 --- a/lib/Slic3r/GUI/Plater/3DPreview.pm +++ b/lib/Slic3r/GUI/Plater/3DPreview.pm @@ -279,7 +279,9 @@ sub reload_print { my ($self, $force) = @_; Slic3r::GUI::_3DScene::reset_volumes($self->canvas); - Slic3r::GUI::_3DScene::reset_current_canvas(); +#================================================================================================================== +# Slic3r::GUI::_3DScene::reset_current_canvas(); +#================================================================================================================== $self->_loaded(0); if (! $self->IsShown && ! $force) { diff --git a/xs/src/slic3r/GUI/3DScene.cpp b/xs/src/slic3r/GUI/3DScene.cpp index a499825a4..556be56bc 100644 --- a/xs/src/slic3r/GUI/3DScene.cpp +++ b/xs/src/slic3r/GUI/3DScene.cpp @@ -1754,15 +1754,17 @@ bool _3DScene::init(wxGLCanvas* canvas) return s_canvas_mgr.init(canvas); } -bool _3DScene::set_current(wxGLCanvas* canvas, bool force) -{ - return s_canvas_mgr.set_current(canvas, force); -} - -void _3DScene::reset_current_canvas() -{ - s_canvas_mgr.set_current(nullptr, false); -} +//################################################################################################################# +//bool _3DScene::set_current(wxGLCanvas* canvas, bool force) +//{ +// return s_canvas_mgr.set_current(canvas, force); +//} +// +//void _3DScene::reset_current_canvas() +//{ +// s_canvas_mgr.set_current(nullptr, false); +//} +//################################################################################################################# void _3DScene::set_active(wxGLCanvas* canvas, bool active) { diff --git a/xs/src/slic3r/GUI/3DScene.hpp b/xs/src/slic3r/GUI/3DScene.hpp index f45bab276..a375bd756 100644 --- a/xs/src/slic3r/GUI/3DScene.hpp +++ b/xs/src/slic3r/GUI/3DScene.hpp @@ -516,8 +516,10 @@ public: static bool init(wxGLCanvas* canvas); - static bool set_current(wxGLCanvas* canvas, bool force); - static void reset_current_canvas(); +//################################################################################################################# +// static bool set_current(wxGLCanvas* canvas, bool force); +// static void reset_current_canvas(); +//################################################################################################################# static void set_active(wxGLCanvas* canvas, bool active); static void set_as_dirty(wxGLCanvas* canvas); diff --git a/xs/src/slic3r/GUI/GLCanvas3D.cpp b/xs/src/slic3r/GUI/GLCanvas3D.cpp index 2148579e8..04b134b41 100644 --- a/xs/src/slic3r/GUI/GLCanvas3D.cpp +++ b/xs/src/slic3r/GUI/GLCanvas3D.cpp @@ -1408,9 +1408,15 @@ GLGizmoBase* GLCanvas3D::Gizmos::_get_current() const return (it != m_gizmos.end()) ? it->second : nullptr; } -GLCanvas3D::GLCanvas3D(wxGLCanvas* canvas, wxGLContext* context) +//################################################################################################################# +GLCanvas3D::GLCanvas3D(wxGLCanvas* canvas) +//GLCanvas3D::GLCanvas3D(wxGLCanvas* canvas, wxGLContext* context) +//################################################################################################################# : m_canvas(canvas) - , m_context(context) +//################################################################################################################# + , m_context(nullptr) +// , m_context(context) +//################################################################################################################# , m_timer(nullptr) , m_config(nullptr) , m_print(nullptr) @@ -1433,8 +1439,16 @@ GLCanvas3D::GLCanvas3D(wxGLCanvas* canvas, wxGLContext* context) , m_drag_by("instance") , m_reload_delayed(false) { +//################################################################################################################# if (m_canvas != nullptr) + { + m_context = new wxGLContext(m_canvas); m_timer = new wxTimer(m_canvas); + } + +// if (m_canvas != nullptr) +// m_timer = new wxTimer(m_canvas); +//################################################################################################################# } GLCanvas3D::~GLCanvas3D() @@ -1447,6 +1461,14 @@ GLCanvas3D::~GLCanvas3D() m_timer = nullptr; } +//################################################################################################################# + if (m_context != nullptr) + { + delete m_context; + m_context = nullptr; + } +//################################################################################################################# + _deregister_callbacks(); } @@ -1455,6 +1477,11 @@ bool GLCanvas3D::init(bool useVBOs, bool use_legacy_opengl) if (m_initialized) return true; +//################################################################################################################# + if ((m_canvas == nullptr) || (m_context == nullptr)) + return false; +//################################################################################################################# + ::glClearColor(1.0f, 1.0f, 1.0f, 1.0f); ::glClearDepth(1.0f); @@ -1520,14 +1547,27 @@ bool GLCanvas3D::init(bool useVBOs, bool use_legacy_opengl) return true; } -bool GLCanvas3D::set_current(bool force) +//################################################################################################################# +bool GLCanvas3D::set_current() { - if ((force || m_active) && (m_canvas != nullptr) && (m_context != nullptr)) + if ((m_canvas != nullptr) && (m_context != nullptr)) +// if (m_active && (m_canvas != nullptr) && (m_context != nullptr)) + { + std::cout << "set_current: " << (void*)m_canvas << " - " << (void*)m_context << std::endl; return m_canvas->SetCurrent(*m_context); - + } return false; } +//bool GLCanvas3D::set_current(bool force) +//{ +// if ((force || m_active) && (m_canvas != nullptr) && (m_context != nullptr)) +// return m_canvas->SetCurrent(*m_context); +// +// return false; +//} +//################################################################################################################# + void GLCanvas3D::set_active(bool active) { m_active = active; @@ -1549,7 +1589,10 @@ void GLCanvas3D::reset_volumes() if (!m_volumes.empty()) { // ensures this canvas is current - if ((m_canvas == nullptr) || !_3DScene::set_current(m_canvas, true)) +//################################################################################################################# + if (!set_current()) +// if ((m_canvas == nullptr) || !_3DScene::set_current(m_canvas, true)) +//################################################################################################################# return; m_volumes.release_geometry(); @@ -1850,7 +1893,10 @@ void GLCanvas3D::render() return; // ensures this canvas is current and initialized - if (!_3DScene::set_current(m_canvas, false) || !_3DScene::init(m_canvas)) +//################################################################################################################# + if (!set_current() || !_3DScene::init(m_canvas)) +// if (!_3DScene::set_current(m_canvas, false) || !_3DScene::init(m_canvas)) +//################################################################################################################# return; if (m_force_zoom_to_bed_enabled) @@ -1933,7 +1979,10 @@ void GLCanvas3D::reload_scene(bool force) reset_volumes(); // ensures this canvas is current - if (!_3DScene::set_current(m_canvas, true)) +//################################################################################################################# + if (!set_current()) +// if (!_3DScene::set_current(m_canvas, true)) +//################################################################################################################# return; set_bed_shape(dynamic_cast(m_config->option("bed_shape"))->values); @@ -2008,7 +2057,10 @@ void GLCanvas3D::reload_scene(bool force) void GLCanvas3D::load_print_toolpaths() { // ensures this canvas is current - if (!_3DScene::set_current(m_canvas, true)) +//################################################################################################################# + if (!set_current()) +// if (!_3DScene::set_current(m_canvas, true)) +//################################################################################################################# return; if (m_print == nullptr) @@ -2376,7 +2428,10 @@ void GLCanvas3D::load_gcode_preview(const GCodePreviewData& preview_data, const if ((m_canvas != nullptr) && (m_print != nullptr)) { // ensures that this canvas is current - if (!_3DScene::set_current(m_canvas, true)) +//################################################################################################################# + if (!set_current()) +// if (!_3DScene::set_current(m_canvas, true)) +//################################################################################################################# return; if (m_volumes.empty()) @@ -3019,7 +3074,10 @@ void GLCanvas3D::_resize(unsigned int w, unsigned int h) return; // ensures that this canvas is current - _3DScene::set_current(m_canvas, false); +//################################################################################################################# + set_current(); +// _3DScene::set_current(m_canvas, false); +//################################################################################################################# ::glViewport(0, 0, w, h); ::glMatrixMode(GL_PROJECTION); diff --git a/xs/src/slic3r/GUI/GLCanvas3D.hpp b/xs/src/slic3r/GUI/GLCanvas3D.hpp index 237044e83..181f5d1ac 100644 --- a/xs/src/slic3r/GUI/GLCanvas3D.hpp +++ b/xs/src/slic3r/GUI/GLCanvas3D.hpp @@ -444,12 +444,18 @@ private: PerlCallback m_on_gizmo_scale_uniformly_callback; public: - GLCanvas3D(wxGLCanvas* canvas, wxGLContext* context); +//################################################################################################################# + GLCanvas3D(wxGLCanvas* canvas); +// GLCanvas3D(wxGLCanvas* canvas, wxGLContext* context); +//################################################################################################################# ~GLCanvas3D(); bool init(bool useVBOs, bool use_legacy_opengl); - bool set_current(bool force); +//################################################################################################################# + bool set_current(); +// bool set_current(bool force); +//################################################################################################################# void set_active(bool active); void set_as_dirty(); diff --git a/xs/src/slic3r/GUI/GLCanvas3DManager.cpp b/xs/src/slic3r/GUI/GLCanvas3DManager.cpp index 62d17827a..0021f13eb 100644 --- a/xs/src/slic3r/GUI/GLCanvas3DManager.cpp +++ b/xs/src/slic3r/GUI/GLCanvas3DManager.cpp @@ -114,8 +114,11 @@ std::string GLCanvas3DManager::GLInfo::to_string(bool format_as_html, bool exten } GLCanvas3DManager::GLCanvas3DManager() - : m_context(nullptr) - , m_current(nullptr) +//################################################################################################################# + : m_current(nullptr) +// : m_context(nullptr) +// , m_current(nullptr) +//################################################################################################################# , m_gl_initialized(false) , m_use_legacy_opengl(false) , m_use_VBOs(false) @@ -124,8 +127,10 @@ GLCanvas3DManager::GLCanvas3DManager() GLCanvas3DManager::~GLCanvas3DManager() { - if (m_context != nullptr) - delete m_context; +//################################################################################################################# +// if (m_context != nullptr) +// delete m_context; +//################################################################################################################# } bool GLCanvas3DManager::add(wxGLCanvas* canvas) @@ -136,14 +141,19 @@ bool GLCanvas3DManager::add(wxGLCanvas* canvas) if (_get_canvas(canvas) != m_canvases.end()) return false; - if (m_context == nullptr) - { - m_context = new wxGLContext(canvas); - if (m_context == nullptr) - return false; - } +//################################################################################################################# +// if (m_context == nullptr) +// { +// m_context = new wxGLContext(canvas); +// if (m_context == nullptr) +// return false; +// } +//################################################################################################################# - GLCanvas3D* canvas3D = new GLCanvas3D(canvas, m_context); +//################################################################################################################# + GLCanvas3D* canvas3D = new GLCanvas3D(canvas); +// GLCanvas3D* canvas3D = new GLCanvas3D(canvas, m_context); +//################################################################################################################# if (canvas3D == nullptr) return false; @@ -213,33 +223,35 @@ bool GLCanvas3DManager::init(wxGLCanvas* canvas) return false; } -bool GLCanvas3DManager::set_current(wxGLCanvas* canvas, bool force) -{ - // given canvas is already current, return - if (m_current == canvas) - return true; - - if (canvas == nullptr) - { - m_current = nullptr; - return true; - } - - // set given canvas as current - CanvasesMap::iterator it = _get_canvas(canvas); - if (it != m_canvases.end()) - { - bool res = it->second->set_current(force); - if (res) - { - m_current = canvas; - return true; - } - } - - m_current = nullptr; - return false; -} +//################################################################################################################# +//bool GLCanvas3DManager::set_current(wxGLCanvas* canvas, bool force) +//{ +// // given canvas is already current, return +// if (m_current == canvas) +// return true; +// +// if (canvas == nullptr) +// { +// m_current = nullptr; +// return true; +// } +// +// // set given canvas as current +// CanvasesMap::iterator it = _get_canvas(canvas); +// if (it != m_canvases.end()) +// { +// bool res = it->second->set_current(force); +// if (res) +// { +// m_current = canvas; +// return true; +// } +// } +// +// m_current = nullptr; +// return false; +//} +//################################################################################################################# void GLCanvas3DManager::set_active(wxGLCanvas* canvas, bool active) { diff --git a/xs/src/slic3r/GUI/GLCanvas3DManager.hpp b/xs/src/slic3r/GUI/GLCanvas3DManager.hpp index 35a1db206..57e6f503d 100644 --- a/xs/src/slic3r/GUI/GLCanvas3DManager.hpp +++ b/xs/src/slic3r/GUI/GLCanvas3DManager.hpp @@ -43,7 +43,9 @@ class GLCanvas3DManager typedef std::map CanvasesMap; - wxGLContext* m_context; +//################################################################################################################# +// wxGLContext* m_context; +//################################################################################################################# CanvasesMap m_canvases; wxGLCanvas* m_current; GLInfo m_gl_info; @@ -70,7 +72,9 @@ public: bool init(wxGLCanvas* canvas); - bool set_current(wxGLCanvas* canvas, bool force); +//################################################################################################################# +// bool set_current(wxGLCanvas* canvas, bool force); +//################################################################################################################# void set_active(wxGLCanvas* canvas, bool active); void set_as_dirty(wxGLCanvas* canvas); diff --git a/xs/xsp/GUI_3DScene.xsp b/xs/xsp/GUI_3DScene.xsp index 8ee88543d..d46c06120 100644 --- a/xs/xsp/GUI_3DScene.xsp +++ b/xs/xsp/GUI_3DScene.xsp @@ -190,11 +190,6 @@ remove_all_canvases() CODE: _3DScene::remove_all_canvases(); -void -reset_current_canvas() - CODE: - _3DScene::reset_current_canvas(); - void set_active(canvas, active) SV *canvas; From 23d10fdadc7810eeec999c1e34f81f5d55d3cda6 Mon Sep 17 00:00:00 2001 From: Enrico Turri Date: Wed, 27 Jun 2018 12:05:23 +0200 Subject: [PATCH 06/17] 2nd attempt to fix opengl on ubuntu --- xs/src/slic3r/GUI/GLCanvas3D.cpp | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/xs/src/slic3r/GUI/GLCanvas3D.cpp b/xs/src/slic3r/GUI/GLCanvas3D.cpp index 04b134b41..d44106337 100644 --- a/xs/src/slic3r/GUI/GLCanvas3D.cpp +++ b/xs/src/slic3r/GUI/GLCanvas3D.cpp @@ -1553,7 +1553,7 @@ bool GLCanvas3D::set_current() if ((m_canvas != nullptr) && (m_context != nullptr)) // if (m_active && (m_canvas != nullptr) && (m_context != nullptr)) { - std::cout << "set_current: " << (void*)m_canvas << " - " << (void*)m_context << std::endl; +// std::cout << "set_current: " << (void*)m_canvas << " - " << (void*)m_context << std::endl; return m_canvas->SetCurrent(*m_context); } return false; @@ -1698,6 +1698,10 @@ void GLCanvas3D::set_bed_shape(const Pointfs& shape) // Set the origin and size for painting of the coordinate system axes. m_axes.origin = Pointf3(0.0, 0.0, (coordf_t)GROUND_Z); set_axes_length(0.3f * (float)m_bed.get_bounding_box().max_size()); + +//########################################################################################################################### + m_dirty = true; +//########################################################################################################################### } void GLCanvas3D::set_auto_bed_shape() @@ -3059,7 +3063,10 @@ Point GLCanvas3D::get_local_mouse_position() const bool GLCanvas3D::_is_shown_on_screen() const { - return (m_canvas != nullptr) ? m_active && m_canvas->IsShownOnScreen() : false; +//################################################################################################################# + return (m_canvas != nullptr) ? m_canvas->IsShownOnScreen() : false; +// return (m_canvas != nullptr) ? m_active && m_canvas->IsShownOnScreen() : false; +//################################################################################################################# } void GLCanvas3D::_force_zoom_to_bed() From 8db4fdc24c2fa17f359065038f738e032db23d92 Mon Sep 17 00:00:00 2001 From: Enrico Turri Date: Wed, 27 Jun 2018 12:36:49 +0200 Subject: [PATCH 07/17] 3rd attempt to fix opengl on ubuntu --- lib/Slic3r/GUI/Plater.pm | 20 ++++++++++----- xs/src/slic3r/GUI/3DScene.cpp | 10 ++++---- xs/src/slic3r/GUI/3DScene.hpp | 4 +-- xs/src/slic3r/GUI/GLCanvas3D.cpp | 34 ++++++++++++++++--------- xs/src/slic3r/GUI/GLCanvas3D.hpp | 12 ++++++--- xs/src/slic3r/GUI/GLCanvas3DManager.cpp | 14 +++++----- xs/src/slic3r/GUI/GLCanvas3DManager.hpp | 2 +- xs/xsp/GUI_3DScene.xsp | 7 ----- 8 files changed, 58 insertions(+), 45 deletions(-) diff --git a/lib/Slic3r/GUI/Plater.pm b/lib/Slic3r/GUI/Plater.pm index 1e32fd8d3..47a060e47 100644 --- a/lib/Slic3r/GUI/Plater.pm +++ b/lib/Slic3r/GUI/Plater.pm @@ -186,7 +186,9 @@ sub new { # Initialize 3D toolpaths preview if ($Slic3r::GUI::have_OpenGL) { $self->{preview3D} = Slic3r::GUI::Plater::3DPreview->new($self->{preview_notebook}, $self->{print}, $self->{gcode_preview_data}, $self->{config}); - Slic3r::GUI::_3DScene::set_active($self->{preview3D}->canvas, 0); +#================================================================================================================== +# Slic3r::GUI::_3DScene::set_active($self->{preview3D}->canvas, 0); +#================================================================================================================== Slic3r::GUI::_3DScene::enable_legend_texture($self->{preview3D}->canvas, 1); Slic3r::GUI::_3DScene::register_on_viewport_changed_callback($self->{preview3D}->canvas, sub { Slic3r::GUI::_3DScene::set_viewport_from_scene($self->{canvas3D}, $self->{preview3D}->canvas); }); $self->{preview_notebook}->AddPage($self->{preview3D}, L('Preview')); @@ -202,21 +204,25 @@ sub new { EVT_NOTEBOOK_PAGE_CHANGED($self, $self->{preview_notebook}, sub { my $preview = $self->{preview_notebook}->GetCurrentPage; if (($preview != $self->{preview3D}) && ($preview != $self->{canvas3D})) { - Slic3r::GUI::_3DScene::set_active($self->{preview3D}->canvas, 0); - Slic3r::GUI::_3DScene::set_active($self->{canvas3D}, 0); #================================================================================================================== +# Slic3r::GUI::_3DScene::set_active($self->{preview3D}->canvas, 0); +# Slic3r::GUI::_3DScene::set_active($self->{canvas3D}, 0); # Slic3r::GUI::_3DScene::reset_current_canvas(); #================================================================================================================== $preview->OnActivate if $preview->can('OnActivate'); } elsif ($preview == $self->{preview3D}) { - Slic3r::GUI::_3DScene::set_active($self->{preview3D}->canvas, 1); - Slic3r::GUI::_3DScene::set_active($self->{canvas3D}, 0); +#================================================================================================================== +# Slic3r::GUI::_3DScene::set_active($self->{preview3D}->canvas, 1); +# Slic3r::GUI::_3DScene::set_active($self->{canvas3D}, 0); +#================================================================================================================== $self->{preview3D}->load_print; # sets the canvas as dirty to force a render at the 1st idle event (wxWidgets IsShownOnScreen() is buggy and cannot be used reliably) Slic3r::GUI::_3DScene::set_as_dirty($self->{preview3D}->canvas); } elsif ($preview == $self->{canvas3D}) { - Slic3r::GUI::_3DScene::set_active($self->{canvas3D}, 1); - Slic3r::GUI::_3DScene::set_active($self->{preview3D}->canvas, 0); +#================================================================================================================== +# Slic3r::GUI::_3DScene::set_active($self->{canvas3D}, 1); +# Slic3r::GUI::_3DScene::set_active($self->{preview3D}->canvas, 0); +#================================================================================================================== if (Slic3r::GUI::_3DScene::is_reload_delayed($self->{canvas3D})) { my $selections = $self->collect_selections; Slic3r::GUI::_3DScene::set_objects_selections($self->{canvas3D}, \@$selections); diff --git a/xs/src/slic3r/GUI/3DScene.cpp b/xs/src/slic3r/GUI/3DScene.cpp index 556be56bc..ac2304c69 100644 --- a/xs/src/slic3r/GUI/3DScene.cpp +++ b/xs/src/slic3r/GUI/3DScene.cpp @@ -1764,13 +1764,13 @@ bool _3DScene::init(wxGLCanvas* canvas) //{ // s_canvas_mgr.set_current(nullptr, false); //} +// +//void _3DScene::set_active(wxGLCanvas* canvas, bool active) +//{ +// s_canvas_mgr.set_active(canvas, active); +//} //################################################################################################################# -void _3DScene::set_active(wxGLCanvas* canvas, bool active) -{ - s_canvas_mgr.set_active(canvas, active); -} - void _3DScene::set_as_dirty(wxGLCanvas* canvas) { s_canvas_mgr.set_as_dirty(canvas); diff --git a/xs/src/slic3r/GUI/3DScene.hpp b/xs/src/slic3r/GUI/3DScene.hpp index a375bd756..d34a79ee3 100644 --- a/xs/src/slic3r/GUI/3DScene.hpp +++ b/xs/src/slic3r/GUI/3DScene.hpp @@ -519,9 +519,9 @@ public: //################################################################################################################# // static bool set_current(wxGLCanvas* canvas, bool force); // static void reset_current_canvas(); +// +// static void set_active(wxGLCanvas* canvas, bool active); //################################################################################################################# - - static void set_active(wxGLCanvas* canvas, bool active); static void set_as_dirty(wxGLCanvas* canvas); static unsigned int get_volumes_count(wxGLCanvas* canvas); diff --git a/xs/src/slic3r/GUI/GLCanvas3D.cpp b/xs/src/slic3r/GUI/GLCanvas3D.cpp index d44106337..e3a3b1572 100644 --- a/xs/src/slic3r/GUI/GLCanvas3D.cpp +++ b/xs/src/slic3r/GUI/GLCanvas3D.cpp @@ -1422,7 +1422,9 @@ GLCanvas3D::GLCanvas3D(wxGLCanvas* canvas) , m_print(nullptr) , m_model(nullptr) , m_dirty(true) - , m_active(true) +//################################################################################################################# +// , m_active(true) +//################################################################################################################# , m_initialized(false) , m_use_VBOs(false) , m_force_zoom_to_bed_enabled(false) @@ -1552,10 +1554,8 @@ bool GLCanvas3D::set_current() { if ((m_canvas != nullptr) && (m_context != nullptr)) // if (m_active && (m_canvas != nullptr) && (m_context != nullptr)) - { -// std::cout << "set_current: " << (void*)m_canvas << " - " << (void*)m_context << std::endl; return m_canvas->SetCurrent(*m_context); - } + return false; } @@ -1568,10 +1568,12 @@ bool GLCanvas3D::set_current() //} //################################################################################################################# -void GLCanvas3D::set_active(bool active) -{ - m_active = active; -} +//################################################################################################################# +//void GLCanvas3D::set_active(bool active) +//{ +// m_active = active; +//} +//################################################################################################################# void GLCanvas3D::set_as_dirty() { @@ -2753,9 +2755,13 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) } else if (evt.LeftDClick() && (m_hover_volume_id != -1)) { - m_active = false; +//################################################################################################################# +// m_active = false; +//################################################################################################################# m_on_double_click_callback.call(); - m_active = true; +//################################################################################################################# +// m_active = true; +//################################################################################################################# } else if (evt.LeftDown() || evt.RightDown()) { @@ -2853,9 +2859,13 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) // if right clicking on volume, propagate event through callback if (m_volumes.volumes[volume_idx]->hover) { - m_active = false; +//################################################################################################################# +// m_active = false; +//################################################################################################################# m_on_right_click_callback.call(pos.x, pos.y); - m_active = true; +//################################################################################################################# +// m_active = true; +//################################################################################################################# } } } diff --git a/xs/src/slic3r/GUI/GLCanvas3D.hpp b/xs/src/slic3r/GUI/GLCanvas3D.hpp index 181f5d1ac..2ab7863aa 100644 --- a/xs/src/slic3r/GUI/GLCanvas3D.hpp +++ b/xs/src/slic3r/GUI/GLCanvas3D.hpp @@ -401,9 +401,11 @@ private: Model* m_model; bool m_dirty; - // the active member has been introduced to overcome a bug in wxWidgets method IsShownOnScreen() which always return true - // when a window is inside a wxNotebook - bool m_active; +//################################################################################################################# +// // the active member has been introduced to overcome a bug in wxWidgets method IsShownOnScreen() which always return true +// // when a window is inside a wxNotebook +// bool m_active; +//################################################################################################################# bool m_initialized; bool m_use_VBOs; bool m_force_zoom_to_bed_enabled; @@ -457,7 +459,9 @@ public: // bool set_current(bool force); //################################################################################################################# - void set_active(bool active); +//################################################################################################################# +// void set_active(bool active); +//################################################################################################################# void set_as_dirty(); unsigned int get_volumes_count() const; diff --git a/xs/src/slic3r/GUI/GLCanvas3DManager.cpp b/xs/src/slic3r/GUI/GLCanvas3DManager.cpp index 0021f13eb..660f1f41f 100644 --- a/xs/src/slic3r/GUI/GLCanvas3DManager.cpp +++ b/xs/src/slic3r/GUI/GLCanvas3DManager.cpp @@ -251,15 +251,15 @@ bool GLCanvas3DManager::init(wxGLCanvas* canvas) // m_current = nullptr; // return false; //} +// +//void GLCanvas3DManager::set_active(wxGLCanvas* canvas, bool active) +//{ +// CanvasesMap::iterator it = _get_canvas(canvas); +// if (it != m_canvases.end()) +// it->second->set_active(active); +//} //################################################################################################################# -void GLCanvas3DManager::set_active(wxGLCanvas* canvas, bool active) -{ - CanvasesMap::iterator it = _get_canvas(canvas); - if (it != m_canvases.end()) - it->second->set_active(active); -} - void GLCanvas3DManager::set_as_dirty(wxGLCanvas* canvas) { CanvasesMap::iterator it = _get_canvas(canvas); diff --git a/xs/src/slic3r/GUI/GLCanvas3DManager.hpp b/xs/src/slic3r/GUI/GLCanvas3DManager.hpp index 57e6f503d..c5b03a553 100644 --- a/xs/src/slic3r/GUI/GLCanvas3DManager.hpp +++ b/xs/src/slic3r/GUI/GLCanvas3DManager.hpp @@ -74,8 +74,8 @@ public: //################################################################################################################# // bool set_current(wxGLCanvas* canvas, bool force); +// void set_active(wxGLCanvas* canvas, bool active); //################################################################################################################# - void set_active(wxGLCanvas* canvas, bool active); void set_as_dirty(wxGLCanvas* canvas); unsigned int get_volumes_count(wxGLCanvas* canvas) const; diff --git a/xs/xsp/GUI_3DScene.xsp b/xs/xsp/GUI_3DScene.xsp index d46c06120..48bd30cd1 100644 --- a/xs/xsp/GUI_3DScene.xsp +++ b/xs/xsp/GUI_3DScene.xsp @@ -190,13 +190,6 @@ remove_all_canvases() CODE: _3DScene::remove_all_canvases(); -void -set_active(canvas, active) - SV *canvas; - bool active; - CODE: - _3DScene::set_active((wxGLCanvas*)wxPli_sv_2_object(aTHX_ canvas, "Wx::GLCanvas"), active); - void set_as_dirty(canvas) SV *canvas; From 06f44a9e4b7962e910f3c9a65276b04ffe160e37 Mon Sep 17 00:00:00 2001 From: Enrico Turri Date: Wed, 27 Jun 2018 12:49:38 +0200 Subject: [PATCH 08/17] Code cleanup --- lib/Slic3r/GUI/Plater.pm | 16 ------ lib/Slic3r/GUI/Plater/3DPreview.pm | 3 - xs/src/slic3r/GUI/3DScene.cpp | 17 ------ xs/src/slic3r/GUI/3DScene.hpp | 6 -- xs/src/slic3r/GUI/GLCanvas3D.cpp | 75 ------------------------- xs/src/slic3r/GUI/GLCanvas3D.hpp | 14 ----- xs/src/slic3r/GUI/GLCanvas3DManager.cpp | 61 -------------------- xs/src/slic3r/GUI/GLCanvas3DManager.hpp | 8 --- 8 files changed, 200 deletions(-) diff --git a/lib/Slic3r/GUI/Plater.pm b/lib/Slic3r/GUI/Plater.pm index 47a060e47..2b0a5a0d5 100644 --- a/lib/Slic3r/GUI/Plater.pm +++ b/lib/Slic3r/GUI/Plater.pm @@ -186,9 +186,6 @@ sub new { # Initialize 3D toolpaths preview if ($Slic3r::GUI::have_OpenGL) { $self->{preview3D} = Slic3r::GUI::Plater::3DPreview->new($self->{preview_notebook}, $self->{print}, $self->{gcode_preview_data}, $self->{config}); -#================================================================================================================== -# Slic3r::GUI::_3DScene::set_active($self->{preview3D}->canvas, 0); -#================================================================================================================== Slic3r::GUI::_3DScene::enable_legend_texture($self->{preview3D}->canvas, 1); Slic3r::GUI::_3DScene::register_on_viewport_changed_callback($self->{preview3D}->canvas, sub { Slic3r::GUI::_3DScene::set_viewport_from_scene($self->{canvas3D}, $self->{preview3D}->canvas); }); $self->{preview_notebook}->AddPage($self->{preview3D}, L('Preview')); @@ -204,25 +201,12 @@ sub new { EVT_NOTEBOOK_PAGE_CHANGED($self, $self->{preview_notebook}, sub { my $preview = $self->{preview_notebook}->GetCurrentPage; if (($preview != $self->{preview3D}) && ($preview != $self->{canvas3D})) { -#================================================================================================================== -# Slic3r::GUI::_3DScene::set_active($self->{preview3D}->canvas, 0); -# Slic3r::GUI::_3DScene::set_active($self->{canvas3D}, 0); -# Slic3r::GUI::_3DScene::reset_current_canvas(); -#================================================================================================================== $preview->OnActivate if $preview->can('OnActivate'); } elsif ($preview == $self->{preview3D}) { -#================================================================================================================== -# Slic3r::GUI::_3DScene::set_active($self->{preview3D}->canvas, 1); -# Slic3r::GUI::_3DScene::set_active($self->{canvas3D}, 0); -#================================================================================================================== $self->{preview3D}->load_print; # sets the canvas as dirty to force a render at the 1st idle event (wxWidgets IsShownOnScreen() is buggy and cannot be used reliably) Slic3r::GUI::_3DScene::set_as_dirty($self->{preview3D}->canvas); } elsif ($preview == $self->{canvas3D}) { -#================================================================================================================== -# Slic3r::GUI::_3DScene::set_active($self->{canvas3D}, 1); -# Slic3r::GUI::_3DScene::set_active($self->{preview3D}->canvas, 0); -#================================================================================================================== if (Slic3r::GUI::_3DScene::is_reload_delayed($self->{canvas3D})) { my $selections = $self->collect_selections; Slic3r::GUI::_3DScene::set_objects_selections($self->{canvas3D}, \@$selections); diff --git a/lib/Slic3r/GUI/Plater/3DPreview.pm b/lib/Slic3r/GUI/Plater/3DPreview.pm index 9a470e017..9ed2374ec 100644 --- a/lib/Slic3r/GUI/Plater/3DPreview.pm +++ b/lib/Slic3r/GUI/Plater/3DPreview.pm @@ -279,9 +279,6 @@ sub reload_print { my ($self, $force) = @_; Slic3r::GUI::_3DScene::reset_volumes($self->canvas); -#================================================================================================================== -# Slic3r::GUI::_3DScene::reset_current_canvas(); -#================================================================================================================== $self->_loaded(0); if (! $self->IsShown && ! $force) { diff --git a/xs/src/slic3r/GUI/3DScene.cpp b/xs/src/slic3r/GUI/3DScene.cpp index ac2304c69..09e10ac28 100644 --- a/xs/src/slic3r/GUI/3DScene.cpp +++ b/xs/src/slic3r/GUI/3DScene.cpp @@ -1754,23 +1754,6 @@ bool _3DScene::init(wxGLCanvas* canvas) return s_canvas_mgr.init(canvas); } -//################################################################################################################# -//bool _3DScene::set_current(wxGLCanvas* canvas, bool force) -//{ -// return s_canvas_mgr.set_current(canvas, force); -//} -// -//void _3DScene::reset_current_canvas() -//{ -// s_canvas_mgr.set_current(nullptr, false); -//} -// -//void _3DScene::set_active(wxGLCanvas* canvas, bool active) -//{ -// s_canvas_mgr.set_active(canvas, active); -//} -//################################################################################################################# - void _3DScene::set_as_dirty(wxGLCanvas* canvas) { s_canvas_mgr.set_as_dirty(canvas); diff --git a/xs/src/slic3r/GUI/3DScene.hpp b/xs/src/slic3r/GUI/3DScene.hpp index d34a79ee3..9016f984d 100644 --- a/xs/src/slic3r/GUI/3DScene.hpp +++ b/xs/src/slic3r/GUI/3DScene.hpp @@ -516,12 +516,6 @@ public: static bool init(wxGLCanvas* canvas); -//################################################################################################################# -// static bool set_current(wxGLCanvas* canvas, bool force); -// static void reset_current_canvas(); -// -// static void set_active(wxGLCanvas* canvas, bool active); -//################################################################################################################# static void set_as_dirty(wxGLCanvas* canvas); static unsigned int get_volumes_count(wxGLCanvas* canvas); diff --git a/xs/src/slic3r/GUI/GLCanvas3D.cpp b/xs/src/slic3r/GUI/GLCanvas3D.cpp index e3a3b1572..adea27fa4 100644 --- a/xs/src/slic3r/GUI/GLCanvas3D.cpp +++ b/xs/src/slic3r/GUI/GLCanvas3D.cpp @@ -1408,23 +1408,14 @@ GLGizmoBase* GLCanvas3D::Gizmos::_get_current() const return (it != m_gizmos.end()) ? it->second : nullptr; } -//################################################################################################################# GLCanvas3D::GLCanvas3D(wxGLCanvas* canvas) -//GLCanvas3D::GLCanvas3D(wxGLCanvas* canvas, wxGLContext* context) -//################################################################################################################# : m_canvas(canvas) -//################################################################################################################# , m_context(nullptr) -// , m_context(context) -//################################################################################################################# , m_timer(nullptr) , m_config(nullptr) , m_print(nullptr) , m_model(nullptr) , m_dirty(true) -//################################################################################################################# -// , m_active(true) -//################################################################################################################# , m_initialized(false) , m_use_VBOs(false) , m_force_zoom_to_bed_enabled(false) @@ -1441,16 +1432,11 @@ GLCanvas3D::GLCanvas3D(wxGLCanvas* canvas) , m_drag_by("instance") , m_reload_delayed(false) { -//################################################################################################################# if (m_canvas != nullptr) { m_context = new wxGLContext(m_canvas); m_timer = new wxTimer(m_canvas); } - -// if (m_canvas != nullptr) -// m_timer = new wxTimer(m_canvas); -//################################################################################################################# } GLCanvas3D::~GLCanvas3D() @@ -1463,13 +1449,11 @@ GLCanvas3D::~GLCanvas3D() m_timer = nullptr; } -//################################################################################################################# if (m_context != nullptr) { delete m_context; m_context = nullptr; } -//################################################################################################################# _deregister_callbacks(); } @@ -1479,10 +1463,8 @@ bool GLCanvas3D::init(bool useVBOs, bool use_legacy_opengl) if (m_initialized) return true; -//################################################################################################################# if ((m_canvas == nullptr) || (m_context == nullptr)) return false; -//################################################################################################################# ::glClearColor(1.0f, 1.0f, 1.0f, 1.0f); ::glClearDepth(1.0f); @@ -1549,32 +1531,14 @@ bool GLCanvas3D::init(bool useVBOs, bool use_legacy_opengl) return true; } -//################################################################################################################# bool GLCanvas3D::set_current() { if ((m_canvas != nullptr) && (m_context != nullptr)) -// if (m_active && (m_canvas != nullptr) && (m_context != nullptr)) return m_canvas->SetCurrent(*m_context); return false; } -//bool GLCanvas3D::set_current(bool force) -//{ -// if ((force || m_active) && (m_canvas != nullptr) && (m_context != nullptr)) -// return m_canvas->SetCurrent(*m_context); -// -// return false; -//} -//################################################################################################################# - -//################################################################################################################# -//void GLCanvas3D::set_active(bool active) -//{ -// m_active = active; -//} -//################################################################################################################# - void GLCanvas3D::set_as_dirty() { m_dirty = true; @@ -1591,10 +1555,7 @@ void GLCanvas3D::reset_volumes() if (!m_volumes.empty()) { // ensures this canvas is current -//################################################################################################################# if (!set_current()) -// if ((m_canvas == nullptr) || !_3DScene::set_current(m_canvas, true)) -//################################################################################################################# return; m_volumes.release_geometry(); @@ -1701,9 +1662,7 @@ void GLCanvas3D::set_bed_shape(const Pointfs& shape) m_axes.origin = Pointf3(0.0, 0.0, (coordf_t)GROUND_Z); set_axes_length(0.3f * (float)m_bed.get_bounding_box().max_size()); -//########################################################################################################################### m_dirty = true; -//########################################################################################################################### } void GLCanvas3D::set_auto_bed_shape() @@ -1899,10 +1858,7 @@ void GLCanvas3D::render() return; // ensures this canvas is current and initialized -//################################################################################################################# if (!set_current() || !_3DScene::init(m_canvas)) -// if (!_3DScene::set_current(m_canvas, false) || !_3DScene::init(m_canvas)) -//################################################################################################################# return; if (m_force_zoom_to_bed_enabled) @@ -1985,10 +1941,7 @@ void GLCanvas3D::reload_scene(bool force) reset_volumes(); // ensures this canvas is current -//################################################################################################################# if (!set_current()) -// if (!_3DScene::set_current(m_canvas, true)) -//################################################################################################################# return; set_bed_shape(dynamic_cast(m_config->option("bed_shape"))->values); @@ -2063,10 +2016,7 @@ void GLCanvas3D::reload_scene(bool force) void GLCanvas3D::load_print_toolpaths() { // ensures this canvas is current -//################################################################################################################# if (!set_current()) -// if (!_3DScene::set_current(m_canvas, true)) -//################################################################################################################# return; if (m_print == nullptr) @@ -2434,10 +2384,7 @@ void GLCanvas3D::load_gcode_preview(const GCodePreviewData& preview_data, const if ((m_canvas != nullptr) && (m_print != nullptr)) { // ensures that this canvas is current -//################################################################################################################# if (!set_current()) -// if (!_3DScene::set_current(m_canvas, true)) -//################################################################################################################# return; if (m_volumes.empty()) @@ -2754,15 +2701,7 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) #endif } else if (evt.LeftDClick() && (m_hover_volume_id != -1)) - { -//################################################################################################################# -// m_active = false; -//################################################################################################################# m_on_double_click_callback.call(); -//################################################################################################################# -// m_active = true; -//################################################################################################################# - } else if (evt.LeftDown() || evt.RightDown()) { // If user pressed left or right button we first check whether this happened @@ -2858,15 +2797,7 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) { // if right clicking on volume, propagate event through callback if (m_volumes.volumes[volume_idx]->hover) - { -//################################################################################################################# -// m_active = false; -//################################################################################################################# m_on_right_click_callback.call(pos.x, pos.y); -//################################################################################################################# -// m_active = true; -//################################################################################################################# - } } } } @@ -3073,10 +3004,7 @@ Point GLCanvas3D::get_local_mouse_position() const bool GLCanvas3D::_is_shown_on_screen() const { -//################################################################################################################# return (m_canvas != nullptr) ? m_canvas->IsShownOnScreen() : false; -// return (m_canvas != nullptr) ? m_active && m_canvas->IsShownOnScreen() : false; -//################################################################################################################# } void GLCanvas3D::_force_zoom_to_bed() @@ -3091,10 +3019,7 @@ void GLCanvas3D::_resize(unsigned int w, unsigned int h) return; // ensures that this canvas is current -//################################################################################################################# set_current(); -// _3DScene::set_current(m_canvas, false); -//################################################################################################################# ::glViewport(0, 0, w, h); ::glMatrixMode(GL_PROJECTION); diff --git a/xs/src/slic3r/GUI/GLCanvas3D.hpp b/xs/src/slic3r/GUI/GLCanvas3D.hpp index 2ab7863aa..b0706a05d 100644 --- a/xs/src/slic3r/GUI/GLCanvas3D.hpp +++ b/xs/src/slic3r/GUI/GLCanvas3D.hpp @@ -401,11 +401,6 @@ private: Model* m_model; bool m_dirty; -//################################################################################################################# -// // the active member has been introduced to overcome a bug in wxWidgets method IsShownOnScreen() which always return true -// // when a window is inside a wxNotebook -// bool m_active; -//################################################################################################################# bool m_initialized; bool m_use_VBOs; bool m_force_zoom_to_bed_enabled; @@ -446,22 +441,13 @@ private: PerlCallback m_on_gizmo_scale_uniformly_callback; public: -//################################################################################################################# GLCanvas3D(wxGLCanvas* canvas); -// GLCanvas3D(wxGLCanvas* canvas, wxGLContext* context); -//################################################################################################################# ~GLCanvas3D(); bool init(bool useVBOs, bool use_legacy_opengl); -//################################################################################################################# bool set_current(); -// bool set_current(bool force); -//################################################################################################################# -//################################################################################################################# -// void set_active(bool active); -//################################################################################################################# void set_as_dirty(); unsigned int get_volumes_count() const; diff --git a/xs/src/slic3r/GUI/GLCanvas3DManager.cpp b/xs/src/slic3r/GUI/GLCanvas3DManager.cpp index 660f1f41f..f817e7739 100644 --- a/xs/src/slic3r/GUI/GLCanvas3DManager.cpp +++ b/xs/src/slic3r/GUI/GLCanvas3DManager.cpp @@ -114,25 +114,13 @@ std::string GLCanvas3DManager::GLInfo::to_string(bool format_as_html, bool exten } GLCanvas3DManager::GLCanvas3DManager() -//################################################################################################################# : m_current(nullptr) -// : m_context(nullptr) -// , m_current(nullptr) -//################################################################################################################# , m_gl_initialized(false) , m_use_legacy_opengl(false) , m_use_VBOs(false) { } -GLCanvas3DManager::~GLCanvas3DManager() -{ -//################################################################################################################# -// if (m_context != nullptr) -// delete m_context; -//################################################################################################################# -} - bool GLCanvas3DManager::add(wxGLCanvas* canvas) { if (canvas == nullptr) @@ -141,19 +129,7 @@ bool GLCanvas3DManager::add(wxGLCanvas* canvas) if (_get_canvas(canvas) != m_canvases.end()) return false; -//################################################################################################################# -// if (m_context == nullptr) -// { -// m_context = new wxGLContext(canvas); -// if (m_context == nullptr) -// return false; -// } -//################################################################################################################# - -//################################################################################################################# GLCanvas3D* canvas3D = new GLCanvas3D(canvas); -// GLCanvas3D* canvas3D = new GLCanvas3D(canvas, m_context); -//################################################################################################################# if (canvas3D == nullptr) return false; @@ -223,43 +199,6 @@ bool GLCanvas3DManager::init(wxGLCanvas* canvas) return false; } -//################################################################################################################# -//bool GLCanvas3DManager::set_current(wxGLCanvas* canvas, bool force) -//{ -// // given canvas is already current, return -// if (m_current == canvas) -// return true; -// -// if (canvas == nullptr) -// { -// m_current = nullptr; -// return true; -// } -// -// // set given canvas as current -// CanvasesMap::iterator it = _get_canvas(canvas); -// if (it != m_canvases.end()) -// { -// bool res = it->second->set_current(force); -// if (res) -// { -// m_current = canvas; -// return true; -// } -// } -// -// m_current = nullptr; -// return false; -//} -// -//void GLCanvas3DManager::set_active(wxGLCanvas* canvas, bool active) -//{ -// CanvasesMap::iterator it = _get_canvas(canvas); -// if (it != m_canvases.end()) -// it->second->set_active(active); -//} -//################################################################################################################# - void GLCanvas3DManager::set_as_dirty(wxGLCanvas* canvas) { CanvasesMap::iterator it = _get_canvas(canvas); diff --git a/xs/src/slic3r/GUI/GLCanvas3DManager.hpp b/xs/src/slic3r/GUI/GLCanvas3DManager.hpp index c5b03a553..9d9285601 100644 --- a/xs/src/slic3r/GUI/GLCanvas3DManager.hpp +++ b/xs/src/slic3r/GUI/GLCanvas3DManager.hpp @@ -43,9 +43,6 @@ class GLCanvas3DManager typedef std::map CanvasesMap; -//################################################################################################################# -// wxGLContext* m_context; -//################################################################################################################# CanvasesMap m_canvases; wxGLCanvas* m_current; GLInfo m_gl_info; @@ -55,7 +52,6 @@ class GLCanvas3DManager public: GLCanvas3DManager(); - ~GLCanvas3DManager(); bool add(wxGLCanvas* canvas); bool remove(wxGLCanvas* canvas); @@ -72,10 +68,6 @@ public: bool init(wxGLCanvas* canvas); -//################################################################################################################# -// bool set_current(wxGLCanvas* canvas, bool force); -// void set_active(wxGLCanvas* canvas, bool active); -//################################################################################################################# void set_as_dirty(wxGLCanvas* canvas); unsigned int get_volumes_count(wxGLCanvas* canvas) const; From 8eb8a8b1f6c95b6ff741199a60a70cd91f4aad31 Mon Sep 17 00:00:00 2001 From: Chow Loong Jin Date: Sat, 23 Jun 2018 09:53:23 +0800 Subject: [PATCH 09/17] Fix format-security violation with croak Missed one in https://github.com/prusa3d/slic3r/pull/802. --- xs/xsp/GCode.xsp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/xs/xsp/GCode.xsp b/xs/xsp/GCode.xsp index 36b43271c..c1856ccf7 100644 --- a/xs/xsp/GCode.xsp +++ b/xs/xsp/GCode.xsp @@ -31,7 +31,7 @@ try { THIS->do_export(print, path, preview_data); } catch (std::exception& e) { - croak(e.what()); + croak("%s\n", e.what()); } %}; From 3229574a39e9b60291384a540e0afaab407351f2 Mon Sep 17 00:00:00 2001 From: Vojtech Kral Date: Fri, 22 Jun 2018 15:01:33 +0200 Subject: [PATCH 10/17] ConfigWizard: Fix default printer selection --- xs/src/slic3r/GUI/ConfigWizard.cpp | 14 +++++++++----- xs/src/slic3r/GUI/ConfigWizard_private.hpp | 1 + 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/xs/src/slic3r/GUI/ConfigWizard.cpp b/xs/src/slic3r/GUI/ConfigWizard.cpp index ce06da853..f723e7f4b 100644 --- a/xs/src/slic3r/GUI/ConfigWizard.cpp +++ b/xs/src/slic3r/GUI/ConfigWizard.cpp @@ -113,11 +113,6 @@ PrinterPicker::PrinterPicker(wxWindow *parent, const VendorProfile &vendor, cons sizer->Add(all_none_sizer, 0, wxEXPAND); SetSizer(sizer); - - if (cboxes.size() > 0) { - cboxes[0]->SetValue(true); - on_checkbox(cboxes[0], true); - } } void PrinterPicker::select_all(bool select) @@ -130,6 +125,14 @@ void PrinterPicker::select_all(bool select) } } +void PrinterPicker::select_one(size_t i, bool select) +{ + if (i < cboxes.size() && cboxes[i]->GetValue() != select) { + cboxes[i]->SetValue(select); + on_checkbox(cboxes[i], select); + } +} + void PrinterPicker::on_checkbox(const Checkbox *cbox, bool checked) { variants_checked += checked ? 1 : -1; @@ -232,6 +235,7 @@ PageWelcome::PageWelcome(ConfigWizard *parent) : AppConfig &appconfig_vendors = this->wizard_p()->appconfig_vendors; printer_picker = new PrinterPicker(this, vendor_prusa->second, appconfig_vendors); + printer_picker->select_one(0, true); // Select the default (first) model/variant on the Prusa vendor printer_picker->Bind(EVT_PRINTER_PICK, [this, &appconfig_vendors](const PrinterPickerEvent &evt) { appconfig_vendors.set_variant(evt.vendor_id, evt.model_id, evt.variant_name, evt.enable); this->on_variant_checked(); diff --git a/xs/src/slic3r/GUI/ConfigWizard_private.hpp b/xs/src/slic3r/GUI/ConfigWizard_private.hpp index 72cb88655..04319a1b4 100644 --- a/xs/src/slic3r/GUI/ConfigWizard_private.hpp +++ b/xs/src/slic3r/GUI/ConfigWizard_private.hpp @@ -56,6 +56,7 @@ struct PrinterPicker: wxPanel PrinterPicker(wxWindow *parent, const VendorProfile &vendor, const AppConfig &appconfig_vendors); void select_all(bool select); + void select_one(size_t i, bool select); void on_checkbox(const Checkbox *cbox, bool checked); }; From e00125d866c23bd68924d1fe4f92af8a05a5de03 Mon Sep 17 00:00:00 2001 From: Vojtech Kral Date: Fri, 22 Jun 2018 15:27:04 +0200 Subject: [PATCH 11/17] PresetUpdater: Fix double update detection (had_config_update) --- xs/src/slic3r/Utils/PresetUpdater.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/xs/src/slic3r/Utils/PresetUpdater.cpp b/xs/src/slic3r/Utils/PresetUpdater.cpp index 8159a75e2..1ce814b89 100644 --- a/xs/src/slic3r/Utils/PresetUpdater.cpp +++ b/xs/src/slic3r/Utils/PresetUpdater.cpp @@ -537,15 +537,15 @@ bool PresetUpdater::config_update() const incompats_map.emplace(std::make_pair(std::move(vendor), std::move(restrictions))); } + p->had_config_update = true; // This needs to be done before a dialog is shown because of OnIdle() + CallAfter() in Perl + GUI::MsgDataIncompatible dlg(std::move(incompats_map)); const auto res = dlg.ShowModal(); if (res == wxID_REPLACE) { BOOST_LOG_TRIVIAL(info) << "User wants to re-configure..."; p->perform_updates(std::move(updates)); GUI::ConfigWizard wizard(nullptr, GUI::ConfigWizard::RR_DATA_INCOMPAT); - if (wizard.run(GUI::get_preset_bundle(), this)) { - p->had_config_update = true; - } else { + if (! wizard.run(GUI::get_preset_bundle(), this)) { return false; } } else { @@ -566,6 +566,8 @@ bool PresetUpdater::config_update() const updates_map.emplace(std::make_pair(std::move(vendor), std::move(ver_str))); } + p->had_config_update = true; // Ditto, see above + GUI::MsgUpdateConfig dlg(std::move(updates_map)); const auto res = dlg.ShowModal(); @@ -581,8 +583,6 @@ bool PresetUpdater::config_update() const } else { BOOST_LOG_TRIVIAL(info) << "User refused the update"; } - - p->had_config_update = true; } else { BOOST_LOG_TRIVIAL(info) << "No configuration updates available."; } From 6706c3b71f49ee82c9f027b027d62bb75feb049d Mon Sep 17 00:00:00 2001 From: Vojtech Kral Date: Mon, 25 Jun 2018 13:29:54 +0200 Subject: [PATCH 12/17] ConfigWizard: Mark the first variant of each printer as default in the GUI --- xs/src/slic3r/GUI/ConfigWizard.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/xs/src/slic3r/GUI/ConfigWizard.cpp b/xs/src/slic3r/GUI/ConfigWizard.cpp index f723e7f4b..642c6dce7 100644 --- a/xs/src/slic3r/GUI/ConfigWizard.cpp +++ b/xs/src/slic3r/GUI/ConfigWizard.cpp @@ -83,8 +83,11 @@ PrinterPicker::PrinterPicker(wxWindow *parent, const VendorProfile &vendor, cons const auto model_id = model.id; + bool default_variant = true; // Mark the first variant as default in the GUI for (const auto &variant : model.variants) { - const auto label = wxString::Format("%s %s %s", variant.name, _(L("mm")), _(L("nozzle"))); + const auto label = wxString::Format("%s %s %s %s", variant.name, _(L("mm")), _(L("nozzle")), + (default_variant ? _(L("(default)")) : wxString())); + default_variant = false; auto *cbox = new Checkbox(panel, label, model_id, variant.name); const size_t idx = cboxes.size(); cboxes.push_back(cbox); From 930a2f1d1203ae8c5205b9fcacb70368b9deebb9 Mon Sep 17 00:00:00 2001 From: Vojtech Kral Date: Wed, 27 Jun 2018 10:34:21 +0200 Subject: [PATCH 13/17] Fix: Http: Body size limit not properly initialized --- xs/src/slic3r/Utils/Http.cpp | 1 + xs/src/slic3r/Utils/Http.hpp | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/xs/src/slic3r/Utils/Http.cpp b/xs/src/slic3r/Utils/Http.cpp index 47021d39f..949a0e7d6 100644 --- a/xs/src/slic3r/Utils/Http.cpp +++ b/xs/src/slic3r/Utils/Http.cpp @@ -71,6 +71,7 @@ Http::priv::priv(const std::string &url) : form(nullptr), form_end(nullptr), headerlist(nullptr), + limit(0), cancel(false) { if (curl == nullptr) { diff --git a/xs/src/slic3r/Utils/Http.hpp b/xs/src/slic3r/Utils/Http.hpp index 73656bf88..7c2bd84fc 100644 --- a/xs/src/slic3r/Utils/Http.hpp +++ b/xs/src/slic3r/Utils/Http.hpp @@ -46,7 +46,8 @@ public: Http& operator=(const Http &) = delete; Http& operator=(Http &&) = delete; - // Sets a maximum size of the data that can be received. The default is 5MB. + // Sets a maximum size of the data that can be received. + // A value of zero sets the default limit, which is is 5MB. Http& size_limit(size_t sizeLimit); // Sets a HTTP header field. Http& header(std::string name, const std::string &value); From 5787c495d670a980ec5120c3740aa2470e4096a3 Mon Sep 17 00:00:00 2001 From: Vojtech Kral Date: Wed, 27 Jun 2018 17:00:20 +0200 Subject: [PATCH 14/17] Octoprint: Improve error reporting --- xs/src/slic3r/Utils/Http.cpp | 18 ++++++++++-------- xs/src/slic3r/Utils/Http.hpp | 9 +++++++++ xs/src/slic3r/Utils/OctoPrint.cpp | 20 +++++++++----------- xs/src/slic3r/Utils/OctoPrint.hpp | 2 +- 4 files changed, 29 insertions(+), 20 deletions(-) diff --git a/xs/src/slic3r/Utils/Http.cpp b/xs/src/slic3r/Utils/Http.cpp index 47021d39f..1a202b2ad 100644 --- a/xs/src/slic3r/Utils/Http.cpp +++ b/xs/src/slic3r/Utils/Http.cpp @@ -201,7 +201,6 @@ std::string Http::priv::body_size_error() void Http::priv::http_perform() { - ::curl_easy_setopt(curl, CURLOPT_FAILONERROR, 1L); ::curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L); ::curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writecb); ::curl_easy_setopt(curl, CURLOPT_WRITEDATA, static_cast(this)); @@ -230,8 +229,6 @@ void Http::priv::http_perform() } CURLcode res = ::curl_easy_perform(curl); - long http_status = 0; - ::curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &http_status); if (res != CURLE_OK) { if (res == CURLE_ABORTED_BY_CALLBACK) { @@ -242,17 +239,22 @@ void Http::priv::http_perform() if (progressfn) { progressfn(dummyprogress, cancel); } } else { // The abort comes from the CURLOPT_READFUNCTION callback, which means reading file failed - if (errorfn) { errorfn(std::move(buffer), "Error reading file for file upload", http_status); } + if (errorfn) { errorfn(std::move(buffer), "Error reading file for file upload", 0); } } } else if (res == CURLE_WRITE_ERROR) { - if (errorfn) { errorfn(std::move(buffer), body_size_error(), http_status); } + if (errorfn) { errorfn(std::move(buffer), body_size_error(), 0); } } else { - if (errorfn) { errorfn(std::move(buffer), curl_error(res), http_status); } + if (errorfn) { errorfn(std::move(buffer), curl_error(res), 0); } }; } else { - if (completefn) { - completefn(std::move(buffer), http_status); + long http_status = 0; + ::curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &http_status); + + if (http_status >= 400) { + if (errorfn) { errorfn(std::move(buffer), std::string(), http_status); } + } else { + if (completefn) { completefn(std::move(buffer), http_status); } } } } diff --git a/xs/src/slic3r/Utils/Http.hpp b/xs/src/slic3r/Utils/Http.hpp index 73656bf88..0724da9ee 100644 --- a/xs/src/slic3r/Utils/Http.hpp +++ b/xs/src/slic3r/Utils/Http.hpp @@ -29,7 +29,16 @@ public: typedef std::shared_ptr Ptr; typedef std::function CompleteFn; + + // A HTTP request may fail at various stages of completeness (URL parsing, DNS lookup, TCP connection, ...). + // If the HTTP request could not be made or failed before completion, the `error` arg contains a description + // of the error and `http_status` is zero. + // If the HTTP request was completed but the response HTTP code is >= 400, `error` is empty and `http_status` contains the response code. + // In either case there may or may not be a body. typedef std::function ErrorFn; + + // See the Progress struct above. + // Writing true to the `cancel` reference cancels the request in progress. typedef std::function ProgressFn; Http(Http &&other); diff --git a/xs/src/slic3r/Utils/OctoPrint.cpp b/xs/src/slic3r/Utils/OctoPrint.cpp index 86049de16..97b4123d4 100644 --- a/xs/src/slic3r/Utils/OctoPrint.cpp +++ b/xs/src/slic3r/Utils/OctoPrint.cpp @@ -78,10 +78,10 @@ bool OctoPrint::test(wxString &msg) const auto http = Http::get(std::move(url)); set_auth(http); - http.on_error([&](std::string, std::string error, unsigned status) { - BOOST_LOG_TRIVIAL(error) << boost::format("Octoprint: Error getting version: %1% (HTTP %2%)") % error % status; + http.on_error([&](std::string body, std::string error, unsigned status) { + BOOST_LOG_TRIVIAL(error) << boost::format("Octoprint: Error getting version: %1%, HTTP %2%, body: `%3%`") % error % status % body; res = false; - msg = format_error(error, status); + msg = format_error(body, error, status); }) .on_complete([&](std::string body, unsigned) { BOOST_LOG_TRIVIAL(debug) << boost::format("Octoprint: Got version: %1%") % body; @@ -140,8 +140,8 @@ bool OctoPrint::send_gcode(const std::string &filename) const progress_dialog.Update(PROGRESS_RANGE); }) .on_error([&](std::string body, std::string error, unsigned status) { - BOOST_LOG_TRIVIAL(error) << boost::format("Octoprint: Error uploading file: %1% (HTTP %2%)") % error % status; - auto errormsg = wxString::Format("%s: %s", errortitle, format_error(error, status)); + BOOST_LOG_TRIVIAL(error) << boost::format("Octoprint: Error uploading file: %1%, HTTP %2%, body: `%3%`") % error % status % body; + auto errormsg = wxString::Format("%s: %s", errortitle, format_error(body, error, status)); GUI::show_error(&progress_dialog, std::move(errormsg)); res = false; }) @@ -183,15 +183,13 @@ std::string OctoPrint::make_url(const std::string &path) const } } -wxString OctoPrint::format_error(const std::string &error, unsigned status) +wxString OctoPrint::format_error(const std::string &body, const std::string &error, unsigned status) { - auto wxerror = wxString::FromUTF8(error.data()); - if (status != 0) { - return wxString::Format("HTTP %u: %s", status, - (status == 401 ? _(L("Invalid API key")) : wxerror)); + auto wxbody = wxString::FromUTF8(body.data()); + return wxString::Format("HTTP %u: %s", status, wxbody); } else { - return wxerror; + return wxString::FromUTF8(error.data()); } } diff --git a/xs/src/slic3r/Utils/OctoPrint.hpp b/xs/src/slic3r/Utils/OctoPrint.hpp index a8599faa9..1e2098ae3 100644 --- a/xs/src/slic3r/Utils/OctoPrint.hpp +++ b/xs/src/slic3r/Utils/OctoPrint.hpp @@ -26,7 +26,7 @@ private: void set_auth(Http &http) const; std::string make_url(const std::string &path) const; - static wxString format_error(const std::string &error, unsigned status); + static wxString format_error(const std::string &body, const std::string &error, unsigned status); }; From 19f5863d75b286e7459f2ce163ec5e5befe1ac78 Mon Sep 17 00:00:00 2001 From: Lukas Matena Date: Thu, 28 Jun 2018 10:22:04 +0200 Subject: [PATCH 15/17] Wipe tower fix - incorrect start/end position reported to the GCode generator when the tower was rotated --- xs/src/libslic3r/GCode/WipeTowerPrusaMM.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/xs/src/libslic3r/GCode/WipeTowerPrusaMM.cpp b/xs/src/libslic3r/GCode/WipeTowerPrusaMM.cpp index fbde83754..5aa6470a2 100644 --- a/xs/src/libslic3r/GCode/WipeTowerPrusaMM.cpp +++ b/xs/src/libslic3r/GCode/WipeTowerPrusaMM.cpp @@ -142,10 +142,10 @@ public: } m_gcode += "G1"; - if (std::abs(dx) > EPSILON) + if (std::abs(rot.x - rotated_current_pos.x) > EPSILON) m_gcode += set_format_X(rot.x); - if (std::abs(dy) > EPSILON) + if (std::abs(rot.y - rotated_current_pos.y) > EPSILON) m_gcode += set_format_Y(rot.y); if (e != 0.f) From 5f1f7dcbedcdc884b4cd489562b444ad372b89c9 Mon Sep 17 00:00:00 2001 From: YuSanka Date: Wed, 27 Jun 2018 09:07:04 +0200 Subject: [PATCH 16/17] Fix of tooltips on OSX showing on the first page of a parameter tab. --- lib/Slic3r/GUI/MainFrame.pm | 4 + xs/src/slic3r/GUI/ConfigWizard.cpp | 4 +- xs/src/slic3r/GUI/GUI.cpp | 7 +- xs/src/slic3r/GUI/Tab.cpp | 132 +++++++++++------------------ xs/src/slic3r/GUI/Tab.hpp | 6 +- 5 files changed, 63 insertions(+), 90 deletions(-) diff --git a/lib/Slic3r/GUI/MainFrame.pm b/lib/Slic3r/GUI/MainFrame.pm index 910b86dd8..ea4a158f4 100644 --- a/lib/Slic3r/GUI/MainFrame.pm +++ b/lib/Slic3r/GUI/MainFrame.pm @@ -110,6 +110,10 @@ sub _init_tabpanel { EVT_NOTEBOOK_PAGE_CHANGED($self, $self->{tabpanel}, sub { my $panel = $self->{tabpanel}->GetCurrentPage; $panel->OnActivate if $panel->can('OnActivate'); + + for my $tab_name (qw(print filament printer)) { + Slic3r::GUI::get_preset_tab("$tab_name")->OnActivate if ("$tab_name" eq $panel->GetName); + } }); if (!$self->{no_plater}) { diff --git a/xs/src/slic3r/GUI/ConfigWizard.cpp b/xs/src/slic3r/GUI/ConfigWizard.cpp index ce06da853..b19515dd4 100644 --- a/xs/src/slic3r/GUI/ConfigWizard.cpp +++ b/xs/src/slic3r/GUI/ConfigWizard.cpp @@ -886,9 +886,9 @@ const wxString& ConfigWizard::name() { // A different naming convention is used for the Wizard on Windows vs. OSX & GTK. #if WIN32 - static const wxString config_wizard_name = _(L("Configuration Wizard")); + static const wxString config_wizard_name = L("Configuration Wizard"); #else - static const wxString config_wizard_name = _(L("Configuration Assistant")); + static const wxString config_wizard_name = L("Configuration Assistant"); #endif return config_wizard_name; } diff --git a/xs/src/slic3r/GUI/GUI.cpp b/xs/src/slic3r/GUI/GUI.cpp index c1f8adaf1..12af36d19 100644 --- a/xs/src/slic3r/GUI/GUI.cpp +++ b/xs/src/slic3r/GUI/GUI.cpp @@ -317,10 +317,11 @@ void add_config_menu(wxMenuBar *menu, int event_preferences_changed, int event_l auto local_menu = new wxMenu(); wxWindowID config_id_base = wxWindow::NewControlId((int)ConfigMenuCnt); - const auto config_wizard_tooltip = wxString::Format(_(L("Run %s")), ConfigWizard::name()); + auto config_wizard_name = _(ConfigWizard::name().wx_str()); + const auto config_wizard_tooltip = wxString::Format(_(L("Run %s")), config_wizard_name); // Cmd+, is standard on OS X - what about other operating systems? - local_menu->Append(config_id_base + ConfigMenuWizard, ConfigWizard::name() + dots, config_wizard_tooltip); - local_menu->Append(config_id_base + ConfigMenuSnapshots, _(L("Configuration Snapshots"))+dots, _(L("Inspect / activate configuration snapshots"))); + local_menu->Append(config_id_base + ConfigMenuWizard, config_wizard_name + dots, config_wizard_tooltip); + local_menu->Append(config_id_base + ConfigMenuSnapshots, _(L("Configuration Snapshots"))+dots, _(L("Inspect / activate configuration snapshots"))); local_menu->Append(config_id_base + ConfigMenuTakeSnapshot, _(L("Take Configuration Snapshot")), _(L("Capture a configuration snapshot"))); // local_menu->Append(config_id_base + ConfigMenuUpdate, _(L("Check for updates")), _(L("Check for configuration updates"))); local_menu->AppendSeparator(); diff --git a/xs/src/slic3r/GUI/Tab.cpp b/xs/src/slic3r/GUI/Tab.cpp index 94f8cc3ea..b3b3c6139 100644 --- a/xs/src/slic3r/GUI/Tab.cpp +++ b/xs/src/slic3r/GUI/Tab.cpp @@ -47,66 +47,32 @@ void Tab::create_preset_tab(PresetBundle *preset_bundle) // preset chooser m_presets_choice = new wxBitmapComboBox(panel, wxID_ANY, "", wxDefaultPosition, wxSize(270, -1), 0, 0,wxCB_READONLY); - /* - m_cc_presets_choice = new wxComboCtrl(panel, wxID_ANY, L(""), wxDefaultPosition, wxDefaultSize, wxCB_READONLY); - wxDataViewTreeCtrlComboPopup* popup = new wxDataViewTreeCtrlComboPopup; - if (popup != nullptr) - { - // FIXME If the following line is removed, the combo box popup list will not react to mouse clicks. - // On the other side, with this line the combo box popup cannot be closed by clicking on the combo button on Windows 10. -// m_cc_presets_choice->UseAltPopupWindow(); - -// m_cc_presets_choice->EnablePopupAnimation(false); - m_cc_presets_choice->SetPopupControl(popup); - popup->SetStringValue(from_u8("Text1")); - - popup->Bind(wxEVT_DATAVIEW_SELECTION_CHANGED, [this, popup](wxCommandEvent& evt) - { - auto selected = popup->GetItemText(popup->GetSelection()); - if (selected != _(L("System presets")) && selected != _(L("Default presets"))) - { - m_cc_presets_choice->SetText(selected); - std::string selected_string = selected.ToUTF8().data(); -#ifdef __APPLE__ -#else - select_preset(selected_string); -#endif - } - }); - -// popup->Bind(wxEVT_KEY_DOWN, [popup](wxKeyEvent& evt) { popup->OnKeyEvent(evt); }); -// popup->Bind(wxEVT_KEY_UP, [popup](wxKeyEvent& evt) { popup->OnKeyEvent(evt); }); - - auto icons = new wxImageList(16, 16, true, 1); - popup->SetImageList(icons); - icons->Add(*new wxIcon(from_u8(Slic3r::var("flag-green-icon.png")), wxBITMAP_TYPE_PNG)); - icons->Add(*new wxIcon(from_u8(Slic3r::var("flag-red-icon.png")), wxBITMAP_TYPE_PNG)); - } -*/ auto color = wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW); //buttons + m_btn_panel = new wxPanel(panel, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxBK_LEFT | wxTAB_TRAVERSAL); + wxBitmap bmpMenu; bmpMenu = wxBitmap(from_u8(Slic3r::var("disk.png")), wxBITMAP_TYPE_PNG); - m_btn_save_preset = new wxBitmapButton(panel, wxID_ANY, bmpMenu, wxDefaultPosition, wxDefaultSize, wxBORDER_NONE); + m_btn_save_preset = new wxBitmapButton(m_btn_panel, wxID_ANY, bmpMenu, wxDefaultPosition, wxDefaultSize, wxBORDER_NONE); if (wxMSW) m_btn_save_preset->SetBackgroundColour(color); bmpMenu = wxBitmap(from_u8(Slic3r::var("delete.png")), wxBITMAP_TYPE_PNG); - m_btn_delete_preset = new wxBitmapButton(panel, wxID_ANY, bmpMenu, wxDefaultPosition, wxDefaultSize, wxBORDER_NONE); + m_btn_delete_preset = new wxBitmapButton(m_btn_panel, wxID_ANY, bmpMenu, wxDefaultPosition, wxDefaultSize, wxBORDER_NONE); if (wxMSW) m_btn_delete_preset->SetBackgroundColour(color); m_show_incompatible_presets = false; m_bmp_show_incompatible_presets.LoadFile(from_u8(Slic3r::var("flag-red-icon.png")), wxBITMAP_TYPE_PNG); m_bmp_hide_incompatible_presets.LoadFile(from_u8(Slic3r::var("flag-green-icon.png")), wxBITMAP_TYPE_PNG); - m_btn_hide_incompatible_presets = new wxBitmapButton(panel, wxID_ANY, m_bmp_hide_incompatible_presets, wxDefaultPosition, wxDefaultSize, wxBORDER_NONE); + m_btn_hide_incompatible_presets = new wxBitmapButton(m_btn_panel, wxID_ANY, m_bmp_hide_incompatible_presets, wxDefaultPosition, wxDefaultSize, wxBORDER_NONE); if (wxMSW) m_btn_hide_incompatible_presets->SetBackgroundColour(color); m_btn_save_preset->SetToolTip(_(L("Save current ")) + m_title); m_btn_delete_preset->SetToolTip(_(L("Delete this preset"))); m_btn_delete_preset->Disable(); - m_undo_btn = new wxButton(panel, wxID_ANY, "", wxDefaultPosition, wxDefaultSize, wxBU_EXACTFIT | wxNO_BORDER); - m_undo_to_sys_btn = new wxButton(panel, wxID_ANY, "", wxDefaultPosition, wxDefaultSize, wxBU_EXACTFIT | wxNO_BORDER); - m_question_btn = new wxButton(panel, wxID_ANY, "", wxDefaultPosition, wxDefaultSize, wxBU_EXACTFIT | wxNO_BORDER); + m_undo_btn = new wxButton(m_btn_panel, wxID_ANY, "", wxDefaultPosition, wxDefaultSize, wxBU_EXACTFIT | wxNO_BORDER); + m_undo_to_sys_btn = new wxButton(m_btn_panel, wxID_ANY, "", wxDefaultPosition, wxDefaultSize, wxBU_EXACTFIT | wxNO_BORDER); + m_question_btn = new wxButton(m_btn_panel, wxID_ANY, "", wxDefaultPosition, wxDefaultSize, wxBU_EXACTFIT | wxNO_BORDER); if (wxMSW) { m_undo_btn->SetBackgroundColour(color); m_undo_to_sys_btn->SetBackgroundColour(color); @@ -153,57 +119,32 @@ void Tab::create_preset_tab(PresetBundle *preset_bundle) m_modified_label_clr = get_label_clr_modified(); m_default_text_clr = get_label_clr_default(); + auto btn_sizer = new wxBoxSizer(wxHORIZONTAL); + m_btn_panel->SetSizer(btn_sizer); + m_btn_panel->Layout(); + + btn_sizer->Add(m_btn_save_preset, 0, wxALIGN_CENTER_VERTICAL); + btn_sizer->AddSpacer(4); + btn_sizer->Add(m_btn_delete_preset, 0, wxALIGN_CENTER_VERTICAL); + btn_sizer->AddSpacer(16); + btn_sizer->Add(m_btn_hide_incompatible_presets, 0, wxALIGN_CENTER_VERTICAL); + btn_sizer->AddSpacer(64); + btn_sizer->Add(m_undo_to_sys_btn, 0, wxALIGN_CENTER_VERTICAL); + btn_sizer->Add(m_undo_btn, 0, wxALIGN_CENTER_VERTICAL); + btn_sizer->AddSpacer(32); + btn_sizer->Add(m_question_btn, 0, wxALIGN_CENTER_VERTICAL); + m_hsizer = new wxBoxSizer(wxHORIZONTAL); sizer->Add(m_hsizer, 0, wxBOTTOM, 3); m_hsizer->Add(m_presets_choice, 1, wxLEFT | wxRIGHT | wxTOP | wxALIGN_CENTER_VERTICAL, 3); m_hsizer->AddSpacer(4); - m_hsizer->Add(m_btn_save_preset, 0, wxALIGN_CENTER_VERTICAL); - m_hsizer->AddSpacer(4); - m_hsizer->Add(m_btn_delete_preset, 0, wxALIGN_CENTER_VERTICAL); - m_hsizer->AddSpacer(16); - m_hsizer->Add(m_btn_hide_incompatible_presets, 0, wxALIGN_CENTER_VERTICAL); - m_hsizer->AddSpacer(64); - m_hsizer->Add(m_undo_to_sys_btn, 0, wxALIGN_CENTER_VERTICAL); - m_hsizer->Add(m_undo_btn, 0, wxALIGN_CENTER_VERTICAL); - m_hsizer->AddSpacer(32); - m_hsizer->Add(m_question_btn, 0, wxALIGN_CENTER_VERTICAL); -// m_hsizer->Add(m_cc_presets_choice, 1, wxLEFT | wxRIGHT | wxTOP | wxALIGN_CENTER_VERTICAL, 3); + m_hsizer->Add(m_btn_panel, 0, wxALIGN_CENTER_VERTICAL); //Horizontal sizer to hold the tree and the selected page. m_hsizer = new wxBoxSizer(wxHORIZONTAL); sizer->Add(m_hsizer, 1, wxEXPAND, 0); -/* - - - //temporary left vertical sizer - m_left_sizer = new wxBoxSizer(wxVERTICAL); - m_hsizer->Add(m_left_sizer, 0, wxEXPAND | wxLEFT | wxTOP | wxBOTTOM, 3); - - // tree - m_presetctrl = new wxDataViewTreeCtrl(panel, wxID_ANY, wxDefaultPosition, wxSize(200, -1), wxDV_NO_HEADER); - m_left_sizer->Add(m_presetctrl, 1, wxEXPAND); - m_preset_icons = new wxImageList(16, 16, true, 1); - m_presetctrl->SetImageList(m_preset_icons); - m_preset_icons->Add(*new wxIcon(from_u8(Slic3r::var("flag-green-icon.png")), wxBITMAP_TYPE_PNG)); - m_preset_icons->Add(*new wxIcon(from_u8(Slic3r::var("flag-red-icon.png")), wxBITMAP_TYPE_PNG)); - - m_presetctrl->Bind(wxEVT_DATAVIEW_SELECTION_CHANGED, [this](wxCommandEvent& evt) - { - auto selected = m_presetctrl->GetItemText(m_presetctrl->GetSelection()); - if (selected != _(L("System presets")) && selected != _(L("Default presets"))) - { - std::string selected_string = selected.ToUTF8().data(); -#ifdef __APPLE__ -#else - select_preset(selected_string); -#endif - } - }); - -*/ - //left vertical sizer m_left_sizer = new wxBoxSizer(wxVERTICAL); m_hsizer->Add(m_left_sizer, 0, wxEXPAND | wxLEFT | wxTOP | wxBOTTOM, 3); @@ -290,6 +231,28 @@ PageShp Tab::add_options_page(const wxString& title, const std::string& icon, bo return page; } +void Tab::OnActivate() +{ +#ifdef __WXOSX__ + wxWindowUpdateLocker noUpdates(this); + + m_btn_panel->Fit(); + + Page* page = nullptr; + auto selection = m_treectrl->GetItemText(m_treectrl->GetSelection()); + for (auto p : m_pages) + if (p->title() == selection) + { + page = p.get(); + break; + } + if (page == nullptr) return; + page->Fit(); + m_hsizer->Layout(); + Refresh(); +#endif +} + void Tab::update_labels_colour() { Freeze(); @@ -1246,6 +1209,7 @@ void TabPrint::update() void TabPrint::OnActivate() { + Tab::OnActivate(); m_recommended_thin_wall_thickness_description_line->SetText( from_u8(PresetHints::recommended_thin_wall_thickness(*m_preset_bundle))); } @@ -1404,6 +1368,7 @@ void TabFilament::update() void TabFilament::OnActivate() { + Tab::OnActivate(); m_volumetric_speed_description_line->SetText(from_u8(PresetHints::maximum_volumetric_flow_description(*m_preset_bundle))); } @@ -2086,6 +2051,7 @@ void Tab::OnTreeSelChange(wxTreeEvent& event) #endif page->Show(); + page->Fit(); m_hsizer->Layout(); Refresh(); diff --git a/xs/src/slic3r/GUI/Tab.hpp b/xs/src/slic3r/GUI/Tab.hpp index d6bf2cf43..633f89750 100644 --- a/xs/src/slic3r/GUI/Tab.hpp +++ b/xs/src/slic3r/GUI/Tab.hpp @@ -119,6 +119,8 @@ protected: wxButton* m_undo_to_sys_btn; wxButton* m_question_btn; + wxPanel* m_btn_panel; + wxComboCtrl* m_cc_presets_choice; wxDataViewTreeCtrl* m_presetctrl; wxImageList* m_preset_icons; @@ -198,7 +200,7 @@ public: Tab() {} Tab(wxNotebook* parent, const wxString& title, const char* name, bool no_controller) : m_parent(parent), m_title(title), m_name(name), m_no_controller(no_controller) { - Create(parent, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxBK_LEFT | wxTAB_TRAVERSAL); + Create(parent, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxBK_LEFT | wxTAB_TRAVERSAL, name); get_tabs_list().push_back(this); } ~Tab(){ @@ -242,7 +244,7 @@ public: PageShp add_options_page(const wxString& title, const std::string& icon, bool is_extruder_pages = false); - virtual void OnActivate(){} + virtual void OnActivate(); virtual void on_preset_loaded(){} virtual void build() = 0; virtual void update() = 0; From 2cbf5b75db3ce89171a9cb0e39f94c72816e3230 Mon Sep 17 00:00:00 2001 From: YuSanka Date: Thu, 28 Jun 2018 18:30:22 +0200 Subject: [PATCH 17/17] Final Fix of tooltips on OSX showing on the first page of a parameter tab. --- xs/src/slic3r/GUI/Tab.cpp | 91 ++++++++++++++++++++------------------- xs/src/slic3r/GUI/Tab.hpp | 7 +-- 2 files changed, 51 insertions(+), 47 deletions(-) diff --git a/xs/src/slic3r/GUI/Tab.cpp b/xs/src/slic3r/GUI/Tab.cpp index b3b3c6139..f41a14e93 100644 --- a/xs/src/slic3r/GUI/Tab.cpp +++ b/xs/src/slic3r/GUI/Tab.cpp @@ -40,39 +40,54 @@ void Tab::create_preset_tab(PresetBundle *preset_bundle) m_preset_bundle = preset_bundle; // Vertical sizer to hold the choice menu and the rest of the page. +#ifdef __WXOSX__ + auto *main_sizer = new wxBoxSizer(wxVERTICAL); + main_sizer->SetSizeHints(this); + this->SetSizer(main_sizer); + + // Create additional panel to Fit() it from OnActivate() + // It's needed for tooltip showing on OSX + m_tmp_panel = new wxPanel(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxBK_LEFT | wxTAB_TRAVERSAL); + auto panel = m_tmp_panel; + auto sizer = new wxBoxSizer(wxVERTICAL); + m_tmp_panel->SetSizer(sizer); + m_tmp_panel->Layout(); + + main_sizer->Add(m_tmp_panel, 1, wxEXPAND | wxALL, 0); +#else Tab *panel = this; auto *sizer = new wxBoxSizer(wxVERTICAL); sizer->SetSizeHints(panel); panel->SetSizer(sizer); +#endif //__WXOSX__ // preset chooser m_presets_choice = new wxBitmapComboBox(panel, wxID_ANY, "", wxDefaultPosition, wxSize(270, -1), 0, 0,wxCB_READONLY); + auto color = wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW); //buttons - m_btn_panel = new wxPanel(panel, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxBK_LEFT | wxTAB_TRAVERSAL); - wxBitmap bmpMenu; bmpMenu = wxBitmap(from_u8(Slic3r::var("disk.png")), wxBITMAP_TYPE_PNG); - m_btn_save_preset = new wxBitmapButton(m_btn_panel, wxID_ANY, bmpMenu, wxDefaultPosition, wxDefaultSize, wxBORDER_NONE); + m_btn_save_preset = new wxBitmapButton(panel, wxID_ANY, bmpMenu, wxDefaultPosition, wxDefaultSize, wxBORDER_NONE); if (wxMSW) m_btn_save_preset->SetBackgroundColour(color); bmpMenu = wxBitmap(from_u8(Slic3r::var("delete.png")), wxBITMAP_TYPE_PNG); - m_btn_delete_preset = new wxBitmapButton(m_btn_panel, wxID_ANY, bmpMenu, wxDefaultPosition, wxDefaultSize, wxBORDER_NONE); + m_btn_delete_preset = new wxBitmapButton(panel, wxID_ANY, bmpMenu, wxDefaultPosition, wxDefaultSize, wxBORDER_NONE); if (wxMSW) m_btn_delete_preset->SetBackgroundColour(color); m_show_incompatible_presets = false; m_bmp_show_incompatible_presets.LoadFile(from_u8(Slic3r::var("flag-red-icon.png")), wxBITMAP_TYPE_PNG); m_bmp_hide_incompatible_presets.LoadFile(from_u8(Slic3r::var("flag-green-icon.png")), wxBITMAP_TYPE_PNG); - m_btn_hide_incompatible_presets = new wxBitmapButton(m_btn_panel, wxID_ANY, m_bmp_hide_incompatible_presets, wxDefaultPosition, wxDefaultSize, wxBORDER_NONE); + m_btn_hide_incompatible_presets = new wxBitmapButton(panel, wxID_ANY, m_bmp_hide_incompatible_presets, wxDefaultPosition, wxDefaultSize, wxBORDER_NONE); if (wxMSW) m_btn_hide_incompatible_presets->SetBackgroundColour(color); m_btn_save_preset->SetToolTip(_(L("Save current ")) + m_title); m_btn_delete_preset->SetToolTip(_(L("Delete this preset"))); m_btn_delete_preset->Disable(); - m_undo_btn = new wxButton(m_btn_panel, wxID_ANY, "", wxDefaultPosition, wxDefaultSize, wxBU_EXACTFIT | wxNO_BORDER); - m_undo_to_sys_btn = new wxButton(m_btn_panel, wxID_ANY, "", wxDefaultPosition, wxDefaultSize, wxBU_EXACTFIT | wxNO_BORDER); - m_question_btn = new wxButton(m_btn_panel, wxID_ANY, "", wxDefaultPosition, wxDefaultSize, wxBU_EXACTFIT | wxNO_BORDER); + m_undo_btn = new wxButton(panel, wxID_ANY, "", wxDefaultPosition, wxDefaultSize, wxBU_EXACTFIT | wxNO_BORDER); + m_undo_to_sys_btn = new wxButton(panel, wxID_ANY, "", wxDefaultPosition, wxDefaultSize, wxBU_EXACTFIT | wxNO_BORDER); + m_question_btn = new wxButton(panel, wxID_ANY, "", wxDefaultPosition, wxDefaultSize, wxBU_EXACTFIT | wxNO_BORDER); if (wxMSW) { m_undo_btn->SetBackgroundColour(color); m_undo_to_sys_btn->SetBackgroundColour(color); @@ -119,32 +134,26 @@ void Tab::create_preset_tab(PresetBundle *preset_bundle) m_modified_label_clr = get_label_clr_modified(); m_default_text_clr = get_label_clr_default(); - auto btn_sizer = new wxBoxSizer(wxHORIZONTAL); - m_btn_panel->SetSizer(btn_sizer); - m_btn_panel->Layout(); - - btn_sizer->Add(m_btn_save_preset, 0, wxALIGN_CENTER_VERTICAL); - btn_sizer->AddSpacer(4); - btn_sizer->Add(m_btn_delete_preset, 0, wxALIGN_CENTER_VERTICAL); - btn_sizer->AddSpacer(16); - btn_sizer->Add(m_btn_hide_incompatible_presets, 0, wxALIGN_CENTER_VERTICAL); - btn_sizer->AddSpacer(64); - btn_sizer->Add(m_undo_to_sys_btn, 0, wxALIGN_CENTER_VERTICAL); - btn_sizer->Add(m_undo_btn, 0, wxALIGN_CENTER_VERTICAL); - btn_sizer->AddSpacer(32); - btn_sizer->Add(m_question_btn, 0, wxALIGN_CENTER_VERTICAL); - m_hsizer = new wxBoxSizer(wxHORIZONTAL); sizer->Add(m_hsizer, 0, wxBOTTOM, 3); m_hsizer->Add(m_presets_choice, 1, wxLEFT | wxRIGHT | wxTOP | wxALIGN_CENTER_VERTICAL, 3); m_hsizer->AddSpacer(4); - m_hsizer->Add(m_btn_panel, 0, wxALIGN_CENTER_VERTICAL); + m_hsizer->Add(m_btn_save_preset, 0, wxALIGN_CENTER_VERTICAL); + m_hsizer->AddSpacer(4); + m_hsizer->Add(m_btn_delete_preset, 0, wxALIGN_CENTER_VERTICAL); + m_hsizer->AddSpacer(16); + m_hsizer->Add(m_btn_hide_incompatible_presets, 0, wxALIGN_CENTER_VERTICAL); + m_hsizer->AddSpacer(64); + m_hsizer->Add(m_undo_to_sys_btn, 0, wxALIGN_CENTER_VERTICAL); + m_hsizer->Add(m_undo_btn, 0, wxALIGN_CENTER_VERTICAL); + m_hsizer->AddSpacer(32); + m_hsizer->Add(m_question_btn, 0, wxALIGN_CENTER_VERTICAL); +// m_hsizer->Add(m_cc_presets_choice, 1, wxLEFT | wxRIGHT | wxTOP | wxALIGN_CENTER_VERTICAL, 3); //Horizontal sizer to hold the tree and the selected page. m_hsizer = new wxBoxSizer(wxHORIZONTAL); sizer->Add(m_hsizer, 1, wxEXPAND, 0); - //left vertical sizer m_left_sizer = new wxBoxSizer(wxVERTICAL); m_hsizer->Add(m_left_sizer, 0, wxEXPAND | wxLEFT | wxTOP | wxBOTTOM, 3); @@ -220,7 +229,12 @@ PageShp Tab::add_options_page(const wxString& title, const std::string& icon, bo } } // Initialize the page. - PageShp page(new Page(this, title, icon_idx)); +#ifdef __WXOSX__ + auto panel = m_tmp_panel; +#else + auto panel = this; +#endif + PageShp page(new Page(panel, title, icon_idx)); page->SetScrollbars(1, 1, 1, 1); page->Hide(); m_hsizer->Add(page.get(), 1, wxEXPAND | wxLEFT, 5); @@ -236,21 +250,11 @@ void Tab::OnActivate() #ifdef __WXOSX__ wxWindowUpdateLocker noUpdates(this); - m_btn_panel->Fit(); - - Page* page = nullptr; - auto selection = m_treectrl->GetItemText(m_treectrl->GetSelection()); - for (auto p : m_pages) - if (p->title() == selection) - { - page = p.get(); - break; - } - if (page == nullptr) return; - page->Fit(); - m_hsizer->Layout(); - Refresh(); -#endif + auto size = GetSizer()->GetSize(); + m_tmp_panel->GetSizer()->SetMinSize(size.x + m_size_move, size.y); + Fit(); + m_size_move *= -1; +#endif // __WXOSX__ } void Tab::update_labels_colour() @@ -1209,9 +1213,9 @@ void TabPrint::update() void TabPrint::OnActivate() { - Tab::OnActivate(); m_recommended_thin_wall_thickness_description_line->SetText( from_u8(PresetHints::recommended_thin_wall_thickness(*m_preset_bundle))); + Tab::OnActivate(); } void TabFilament::build() @@ -1368,8 +1372,8 @@ void TabFilament::update() void TabFilament::OnActivate() { - Tab::OnActivate(); m_volumetric_speed_description_line->SetText(from_u8(PresetHints::maximum_volumetric_flow_description(*m_preset_bundle))); + Tab::OnActivate(); } wxSizer* Tab::description_line_widget(wxWindow* parent, ogStaticText* *StaticText) @@ -2051,7 +2055,6 @@ void Tab::OnTreeSelChange(wxTreeEvent& event) #endif page->Show(); - page->Fit(); m_hsizer->Layout(); Refresh(); diff --git a/xs/src/slic3r/GUI/Tab.hpp b/xs/src/slic3r/GUI/Tab.hpp index 633f89750..c755f91f1 100644 --- a/xs/src/slic3r/GUI/Tab.hpp +++ b/xs/src/slic3r/GUI/Tab.hpp @@ -102,6 +102,10 @@ using PageShp = std::shared_ptr; class Tab: public wxPanel { wxNotebook* m_parent; +#ifdef __WXOSX__ + wxPanel* m_tmp_panel; + int m_size_move = -1; +#endif // __WXOSX__ protected: std::string m_name; const wxString m_title; @@ -118,9 +122,6 @@ protected: wxButton* m_undo_btn; wxButton* m_undo_to_sys_btn; wxButton* m_question_btn; - - wxPanel* m_btn_panel; - wxComboCtrl* m_cc_presets_choice; wxDataViewTreeCtrl* m_presetctrl; wxImageList* m_preset_icons;