diff --git a/README.md b/README.md index 13a5a57ba..6fd1af4e2 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,8 @@ # PrusaSlicer -Prebuilt Windows, OSX and Linux binaries are available through the [git releases page](https://github.com/prusa3d/PrusaSlicer/releases). +You may want to check the [PrusaSlicer project page](https://www.prusa3d.com/prusaslicer/). +Prebuilt Windows, OSX and Linux binaries are available through the [git releases page](https://github.com/prusa3d/PrusaSlicer/releases) or from the [Prusa3D downloads page](https://www.prusa3d.com/drivers/). PrusaSlicer takes 3D models (STL, OBJ, AMF) and converts them into G-code instructions for FFF printers or PNG layers for mSLA 3D printers. It's diff --git a/src/slic3r/GUI/Field.cpp b/src/slic3r/GUI/Field.cpp index 30b95d82a..7f42db4d7 100644 --- a/src/slic3r/GUI/Field.cpp +++ b/src/slic3r/GUI/Field.cpp @@ -434,7 +434,6 @@ void CheckBox::msw_rescale() field->SetMinSize(wxSize(-1, int(1.5f*field->GetFont().GetPixelSize().y +0.5f))); } -int undef_spin_val = -9999; //! Probably, It's not necessary void SpinCtrl::BUILD() { auto size = wxSize(wxDefaultSize); @@ -472,12 +471,14 @@ void SpinCtrl::BUILD() { temp->SetFont(Slic3r::GUI::wxGetApp().normal_font()); temp->SetBackgroundStyle(wxBG_STYLE_PAINT); -#ifndef __WXOSX__ - // #ys_FIXME_KILL_FOCUS - // wxEVT_KILL_FOCUS doesn't handled on OSX now (wxWidgets 3.1.1) - // So, we will update values on KILL_FOCUS & SPINCTRL events under MSW and GTK - // and on TEXT event under OSX +// XXX: On OS X the wxSpinCtrl widget is made up of two subwidgets, unfortunatelly +// the kill focus event is not propagated to the encompassing widget, +// so we need to bind it on the inner text widget instead. (Ugh.) +#ifdef __WXOSX__ + temp->GetText()->Bind(wxEVT_KILL_FOCUS, ([this](wxEvent& e) +#else temp->Bind(wxEVT_KILL_FOCUS, ([this](wxEvent& e) +#endif { e.Skip(); if (bEnterPressed) { @@ -486,7 +487,7 @@ void SpinCtrl::BUILD() { } propagate_value(); - }), temp->GetId()); + })); temp->Bind(wxEVT_SPINCTRL, ([this](wxCommandEvent e) { propagate_value(); }), temp->GetId()); @@ -496,7 +497,6 @@ void SpinCtrl::BUILD() { propagate_value(); bEnterPressed = true; }), temp->GetId()); -#endif temp->Bind(wxEVT_TEXT, ([this](wxCommandEvent e) { @@ -504,24 +504,17 @@ void SpinCtrl::BUILD() { // # when it was changed from the text control, so the on_change callback // # gets the old one, and on_kill_focus resets the control to the old value. // # As a workaround, we get the new value from $event->GetString and store -// # here temporarily so that we can return it from $self->get_value - std::string value = e.GetString().utf8_str().data(); - if (is_matched(value, "^\\-?\\d+$")) { - try { - tmp_value = std::stoi(value); - } - catch (const std::exception & /* e */) { - tmp_value = -9999; - } - } - else tmp_value = -9999; -#ifdef __WXOSX__ - propagate_value(); +// # here temporarily so that we can return it from get_value() + long value; + const bool parsed = e.GetString().ToLong(&value); + tmp_value = parsed && value >= INT_MIN && value <= INT_MAX ? (int)value : UNDEF_VALUE; + +#ifdef __WXOSX__ // Forcibly set the input value for SpinControl, since the value - // inserted from the clipboard is not updated under OSX - if (tmp_value > -9999) { - wxSpinCtrl* spin = dynamic_cast<wxSpinCtrl*>(window); + // inserted from the keyboard or clipboard is not updated under OSX + if (tmp_value != UNDEF_VALUE) { + wxSpinCtrl* spin = static_cast<wxSpinCtrl*>(window); spin->SetValue(tmp_value); // But in SetValue() is executed m_text_ctrl->SelectAll(), so @@ -539,10 +532,11 @@ void SpinCtrl::BUILD() { void SpinCtrl::propagate_value() { - if (tmp_value == -9999) + if (tmp_value == UNDEF_VALUE) { on_kill_focus(); - else if (boost::any_cast<int>(m_value) != tmp_value) + } else { on_change_field(); + } } void SpinCtrl::msw_rescale() diff --git a/src/slic3r/GUI/Field.hpp b/src/slic3r/GUI/Field.hpp index ae449450a..990c40e6f 100644 --- a/src/slic3r/GUI/Field.hpp +++ b/src/slic3r/GUI/Field.hpp @@ -7,6 +7,7 @@ #endif #include <memory> +#include <cstdint> #include <functional> #include <boost/any.hpp> @@ -331,9 +332,11 @@ public: class SpinCtrl : public Field { using Field::Field; +private: + static const int UNDEF_VALUE = INT_MIN; public: - SpinCtrl(const ConfigOptionDef& opt, const t_config_option_key& id) : Field(opt, id), tmp_value(-9999) {} - SpinCtrl(wxWindow* parent, const ConfigOptionDef& opt, const t_config_option_key& id) : Field(parent, opt, id), tmp_value(-9999) {} + SpinCtrl(const ConfigOptionDef& opt, const t_config_option_key& id) : Field(opt, id), tmp_value(UNDEF_VALUE) {} + SpinCtrl(wxWindow* parent, const ConfigOptionDef& opt, const t_config_option_key& id) : Field(parent, opt, id), tmp_value(UNDEF_VALUE) {} ~SpinCtrl() {} int tmp_value; @@ -355,9 +358,10 @@ public: dynamic_cast<wxSpinCtrl*>(window)->SetValue(tmp_value); m_disable_change_event = false; } + boost::any& get_value() override { -// return boost::any(tmp_value); - return m_value = tmp_value; + int value = static_cast<wxSpinCtrl*>(window)->GetValue(); + return m_value = value; } void msw_rescale() override; diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index bb2cb5e2d..26d205055 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -2292,6 +2292,9 @@ void GLCanvas3D::on_size(wxSizeEvent& evt) void GLCanvas3D::on_idle(wxIdleEvent& evt) { + if (!m_initialized) + return; + m_dirty |= m_toolbar.update_items_state(); m_dirty |= m_view_toolbar.update_items_state(); @@ -4022,8 +4025,7 @@ void GLCanvas3D::_render_selection() const #if ENABLE_RENDER_SELECTION_CENTER void GLCanvas3D::_render_selection_center() const { - if (!m_gizmos.is_running()) - m_selection.render_center(); + m_selection.render_center(m_gizmos.is_dragging()); } #endif // ENABLE_RENDER_SELECTION_CENTER diff --git a/src/slic3r/GUI/GUI_ObjectList.cpp b/src/slic3r/GUI/GUI_ObjectList.cpp index 4f7efb849..0e69fc3e6 100644 --- a/src/slic3r/GUI/GUI_ObjectList.cpp +++ b/src/slic3r/GUI/GUI_ObjectList.cpp @@ -297,13 +297,18 @@ void ObjectList::set_tooltip_for_item(const wxPoint& pt) wxDataViewItem item; wxDataViewColumn* col; HitTest(pt, item, col); - if (!item) return; /* GetMainWindow() return window, associated with wxDataViewCtrl. * And for this window we should to set tooltips. * Just this->SetToolTip(tooltip) => has no effect. */ + if (!item) + { + GetMainWindow()->SetToolTip(""); // hide tooltip + return; + } + if (col->GetTitle() == " " && GetSelectedItemsCount()<2) GetMainWindow()->SetToolTip(_(L("Right button click the icon to change the object settings"))); else if (col->GetTitle() == _("Name")) diff --git a/src/slic3r/GUI/MainFrame.cpp b/src/slic3r/GUI/MainFrame.cpp index 6b0d40fda..25f05a728 100644 --- a/src/slic3r/GUI/MainFrame.cpp +++ b/src/slic3r/GUI/MainFrame.cpp @@ -143,7 +143,9 @@ void MainFrame::update_title() wxString title = wxEmptyString; if (m_plater != nullptr) { - wxString project = from_path(into_path(m_plater->get_project_filename()).stem()); + // m_plater->get_project_filename() produces file name including path, but excluding extension. + // Don't try to remove the extension, it would remove part of the file name after the last dot! + wxString project = from_path(into_path(m_plater->get_project_filename()).filename()); if (!project.empty()) title += (project + " - "); } diff --git a/src/slic3r/GUI/Selection.cpp b/src/slic3r/GUI/Selection.cpp index 0b880c75f..00fbaa42a 100644 --- a/src/slic3r/GUI/Selection.cpp +++ b/src/slic3r/GUI/Selection.cpp @@ -955,14 +955,14 @@ void Selection::render(float scale_factor) const } #if ENABLE_RENDER_SELECTION_CENTER -void Selection::render_center() const +void Selection::render_center(bool gizmo_is_dragging) const { if (!m_valid || is_empty() || (m_quadric == nullptr)) return; - const Vec3d& center = get_bounding_box().center(); + Vec3d center = gizmo_is_dragging ? m_cache.dragging_center : get_bounding_box().center(); - glsafe(::glDisable(GL_DEPTH_TEST))); + glsafe(::glDisable(GL_DEPTH_TEST)); glsafe(::glEnable(GL_LIGHTING)); diff --git a/src/slic3r/GUI/Selection.hpp b/src/slic3r/GUI/Selection.hpp index 4e5da3685..99d939acc 100644 --- a/src/slic3r/GUI/Selection.hpp +++ b/src/slic3r/GUI/Selection.hpp @@ -5,6 +5,11 @@ #include "libslic3r/Geometry.hpp" #include "3DScene.hpp" +#if ENABLE_RENDER_SELECTION_CENTER +class GLUquadric; +typedef class GLUquadric GLUquadricObj; +#endif // ENABLE_RENDER_SELECTION_CENTER + namespace Slic3r { namespace GUI { @@ -291,7 +296,7 @@ public: void render(float scale_factor = 1.0) const; #if ENABLE_RENDER_SELECTION_CENTER - void render_center() const; + void render_center(bool gizmo_is_dragging) const; #endif // ENABLE_RENDER_SELECTION_CENTER void render_sidebar_hints(const std::string& sidebar_field) const; diff --git a/src/slic3r/GUI/UpdateDialogs.cpp b/src/slic3r/GUI/UpdateDialogs.cpp index c378b853e..a4f696fb8 100644 --- a/src/slic3r/GUI/UpdateDialogs.cpp +++ b/src/slic3r/GUI/UpdateDialogs.cpp @@ -25,7 +25,7 @@ namespace Slic3r { namespace GUI { -static const char* URL_CHANGELOG = "http://files.prusa3d.com/file/?type=slicerstable&lng=%1%"; +static const char* URL_CHANGELOG = "http://files.prusa3d.com/?latest=slicer-stable&lng=%1%"; static const char* URL_DOWNLOAD = "https://www.prusa3d.com/downloads&lng=%1%"; static const char* URL_DEV = "https://github.com/prusa3d/PrusaSlicer/releases/tag/version_%1%";