Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/prusa3d/PrusaSlicer.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/xs/src
diff options
context:
space:
mode:
Diffstat (limited to 'xs/src')
-rw-r--r--xs/src/libslic3r/GCode/WipeTowerPrusaMM.cpp4
-rw-r--r--xs/src/slic3r/GUI/3DScene.cpp15
-rw-r--r--xs/src/slic3r/GUI/3DScene.hpp4
-rw-r--r--xs/src/slic3r/GUI/ConfigWizard.cpp19
-rw-r--r--xs/src/slic3r/GUI/ConfigWizard_private.hpp1
-rw-r--r--xs/src/slic3r/GUI/GLCanvas3D.cpp50
-rw-r--r--xs/src/slic3r/GUI/GLCanvas3D.hpp8
-rw-r--r--xs/src/slic3r/GUI/GLCanvas3DManager.cpp53
-rw-r--r--xs/src/slic3r/GUI/GLCanvas3DManager.hpp4
-rw-r--r--xs/src/slic3r/Utils/Http.cpp19
-rw-r--r--xs/src/slic3r/Utils/Http.hpp12
-rw-r--r--xs/src/slic3r/Utils/OctoPrint.cpp20
-rw-r--r--xs/src/slic3r/Utils/OctoPrint.hpp2
-rw-r--r--xs/src/slic3r/Utils/PresetUpdater.cpp10
14 files changed, 82 insertions, 139 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)
diff --git a/xs/src/slic3r/GUI/3DScene.cpp b/xs/src/slic3r/GUI/3DScene.cpp
index a499825a4..09e10ac28 100644
--- a/xs/src/slic3r/GUI/3DScene.cpp
+++ b/xs/src/slic3r/GUI/3DScene.cpp
@@ -1754,21 +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 f45bab276..9016f984d 100644
--- a/xs/src/slic3r/GUI/3DScene.hpp
+++ b/xs/src/slic3r/GUI/3DScene.hpp
@@ -516,10 +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/ConfigWizard.cpp b/xs/src/slic3r/GUI/ConfigWizard.cpp
index b19515dd4..2e315a70b 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);
@@ -113,11 +116,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 +128,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 +238,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);
};
diff --git a/xs/src/slic3r/GUI/GLCanvas3D.cpp b/xs/src/slic3r/GUI/GLCanvas3D.cpp
index 2148579e8..adea27fa4 100644
--- a/xs/src/slic3r/GUI/GLCanvas3D.cpp
+++ b/xs/src/slic3r/GUI/GLCanvas3D.cpp
@@ -1408,15 +1408,14 @@ GLGizmoBase* GLCanvas3D::Gizmos::_get_current() const
return (it != m_gizmos.end()) ? it->second : nullptr;
}
-GLCanvas3D::GLCanvas3D(wxGLCanvas* canvas, wxGLContext* context)
+GLCanvas3D::GLCanvas3D(wxGLCanvas* canvas)
: m_canvas(canvas)
- , m_context(context)
+ , m_context(nullptr)
, 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)
@@ -1434,7 +1433,10 @@ GLCanvas3D::GLCanvas3D(wxGLCanvas* canvas, wxGLContext* context)
, m_reload_delayed(false)
{
if (m_canvas != nullptr)
+ {
+ m_context = new wxGLContext(m_canvas);
m_timer = new wxTimer(m_canvas);
+ }
}
GLCanvas3D::~GLCanvas3D()
@@ -1447,6 +1449,12 @@ GLCanvas3D::~GLCanvas3D()
m_timer = nullptr;
}
+ if (m_context != nullptr)
+ {
+ delete m_context;
+ m_context = nullptr;
+ }
+
_deregister_callbacks();
}
@@ -1455,6 +1463,9 @@ 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,19 +1531,14 @@ 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))
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;
@@ -1549,7 +1555,7 @@ 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())
return;
m_volumes.release_geometry();
@@ -1655,6 +1661,8 @@ 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()
@@ -1850,7 +1858,7 @@ 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))
return;
if (m_force_zoom_to_bed_enabled)
@@ -1933,7 +1941,7 @@ void GLCanvas3D::reload_scene(bool force)
reset_volumes();
// ensures this canvas is current
- if (!_3DScene::set_current(m_canvas, true))
+ if (!set_current())
return;
set_bed_shape(dynamic_cast<const ConfigOptionPoints*>(m_config->option("bed_shape"))->values);
@@ -2008,7 +2016,7 @@ 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())
return;
if (m_print == nullptr)
@@ -2376,7 +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 (!_3DScene::set_current(m_canvas, true))
+ if (!set_current())
return;
if (m_volumes.empty())
@@ -2693,11 +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
@@ -2793,11 +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;
- }
}
}
}
@@ -3004,7 +3004,7 @@ 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;
}
void GLCanvas3D::_force_zoom_to_bed()
@@ -3019,7 +3019,7 @@ void GLCanvas3D::_resize(unsigned int w, unsigned int h)
return;
// ensures that this canvas is current
- _3DScene::set_current(m_canvas, false);
+ set_current();
::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..b0706a05d 100644
--- a/xs/src/slic3r/GUI/GLCanvas3D.hpp
+++ b/xs/src/slic3r/GUI/GLCanvas3D.hpp
@@ -401,9 +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;
@@ -444,14 +441,13 @@ private:
PerlCallback m_on_gizmo_scale_uniformly_callback;
public:
- GLCanvas3D(wxGLCanvas* canvas, wxGLContext* context);
+ GLCanvas3D(wxGLCanvas* canvas);
~GLCanvas3D();
bool init(bool useVBOs, bool use_legacy_opengl);
- bool set_current(bool force);
+ bool set_current();
- 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 62d17827a..f817e7739 100644
--- a/xs/src/slic3r/GUI/GLCanvas3DManager.cpp
+++ b/xs/src/slic3r/GUI/GLCanvas3DManager.cpp
@@ -114,20 +114,13 @@ std::string GLCanvas3DManager::GLInfo::to_string(bool format_as_html, bool exten
}
GLCanvas3DManager::GLCanvas3DManager()
- : m_context(nullptr)
- , m_current(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)
@@ -136,14 +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, m_context);
+ GLCanvas3D* canvas3D = new GLCanvas3D(canvas);
if (canvas3D == nullptr)
return false;
@@ -213,41 +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 35a1db206..9d9285601 100644
--- a/xs/src/slic3r/GUI/GLCanvas3DManager.hpp
+++ b/xs/src/slic3r/GUI/GLCanvas3DManager.hpp
@@ -43,7 +43,6 @@ class GLCanvas3DManager
typedef std::map<wxGLCanvas*, GLCanvas3D*> CanvasesMap;
- wxGLContext* m_context;
CanvasesMap m_canvases;
wxGLCanvas* m_current;
GLInfo m_gl_info;
@@ -53,7 +52,6 @@ class GLCanvas3DManager
public:
GLCanvas3DManager();
- ~GLCanvas3DManager();
bool add(wxGLCanvas* canvas);
bool remove(wxGLCanvas* canvas);
@@ -70,8 +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;
diff --git a/xs/src/slic3r/Utils/Http.cpp b/xs/src/slic3r/Utils/Http.cpp
index 47021d39f..37eb59a00 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) {
@@ -201,7 +202,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<void*>(this));
@@ -230,8 +230,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 +240,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..ce4e438ca 100644
--- a/xs/src/slic3r/Utils/Http.hpp
+++ b/xs/src/slic3r/Utils/Http.hpp
@@ -29,7 +29,16 @@ public:
typedef std::shared_ptr<Http> Ptr;
typedef std::function<void(std::string /* body */, unsigned /* http_status */)> 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<void(std::string /* body */, std::string /* error */, unsigned /* http_status */)> ErrorFn;
+
+ // See the Progress struct above.
+ // Writing true to the `cancel` reference cancels the request in progress.
typedef std::function<void(Progress, bool& /* cancel */)> ProgressFn;
Http(Http &&other);
@@ -46,7 +55,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);
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);
};
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.";
}