mirror of
				https://github.com/SoftFever/OrcaSlicer.git
				synced 2025-10-31 04:31:15 -06:00 
			
		
		
		
	Merge branch 'master' of https://github.com/prusa3d/PrusaSlicer into et_custom_bed
This commit is contained in:
		
						commit
						610e0f7ee6
					
				
					 56 changed files with 1779 additions and 1171 deletions
				
			
		|  | @ -410,6 +410,8 @@ public: | |||
|     BoundingBoxf3        transformed_convex_hull_bounding_box(const Transform3d &trafo) const; | ||||
|     // caching variant
 | ||||
|     const BoundingBoxf3& transformed_convex_hull_bounding_box() const; | ||||
|     // convex hull
 | ||||
|     const TriangleMesh*  convex_hull() const { return m_convex_hull.get(); } | ||||
| 
 | ||||
|     bool                empty() const { return this->indexed_vertex_array.empty(); } | ||||
| 
 | ||||
|  |  | |||
|  | @ -229,6 +229,33 @@ std::string AppConfig::get_last_dir() const | |||
|     return std::string(); | ||||
| } | ||||
| 
 | ||||
| std::vector<std::string> AppConfig::get_recent_projects() const | ||||
| { | ||||
|     std::vector<std::string> ret; | ||||
|     const auto it = m_storage.find("recent_projects"); | ||||
|     if (it != m_storage.end()) | ||||
|     { | ||||
|         for (const std::map<std::string, std::string>::value_type& item : it->second) | ||||
|         { | ||||
|             ret.push_back(item.second); | ||||
|         } | ||||
|     } | ||||
|     return ret; | ||||
| } | ||||
| 
 | ||||
| void AppConfig::set_recent_projects(const std::vector<std::string>& recent_projects) | ||||
| { | ||||
|     auto it = m_storage.find("recent_projects"); | ||||
|     if (it == m_storage.end()) | ||||
|         it = m_storage.insert(std::map<std::string, std::map<std::string, std::string>>::value_type("recent_projects", std::map<std::string, std::string>())).first; | ||||
| 
 | ||||
|     it->second.clear(); | ||||
|     for (unsigned int i = 0; i < (unsigned int)recent_projects.size(); ++i) | ||||
|     { | ||||
|         it->second[std::to_string(i + 1)] = recent_projects[i]; | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| void AppConfig::update_config_dir(const std::string &dir) | ||||
| { | ||||
|     this->set("recent", "config_directory", dir); | ||||
|  |  | |||
|  | @ -122,6 +122,9 @@ public: | |||
| 	// Does the config file exist?
 | ||||
| 	static bool 		exists(); | ||||
| 
 | ||||
|     std::vector<std::string> get_recent_projects() const; | ||||
|     void set_recent_projects(const std::vector<std::string>& recent_projects); | ||||
| 
 | ||||
| private: | ||||
| 	// Map of section, name -> value
 | ||||
| 	std::map<std::string, std::map<std::string, std::string>> 	m_storage; | ||||
|  |  | |||
|  | @ -1199,11 +1199,7 @@ GLCanvas3D::GLCanvas3D(wxGLCanvas* canvas, Bed3D& bed, Camera& camera, GLToolbar | |||
|     , m_bed(bed) | ||||
|     , m_camera(camera) | ||||
|     , m_view_toolbar(view_toolbar) | ||||
| #if ENABLE_SVG_ICONS | ||||
|     , m_toolbar(GLToolbar::Normal, "Top") | ||||
| #else | ||||
|     , m_toolbar(GLToolbar::Normal) | ||||
| #endif // ENABLE_SVG_ICONS
 | ||||
|     , m_use_clipping_planes(false) | ||||
|     , m_sidebar_field("") | ||||
|     , m_keep_dirty(false) | ||||
|  | @ -3422,12 +3418,6 @@ bool GLCanvas3D::_init_toolbar() | |||
|     if (!m_toolbar.is_enabled()) | ||||
|         return true; | ||||
| 
 | ||||
| #if !ENABLE_SVG_ICONS | ||||
|     ItemsIconsTexture::Metadata icons_data; | ||||
|     icons_data.filename = "toolbar.png"; | ||||
|     icons_data.icon_size = 37; | ||||
| #endif // !ENABLE_SVG_ICONS
 | ||||
| 
 | ||||
|     BackgroundTexture::Metadata background_data; | ||||
|     background_data.filename = "toolbar_background.png"; | ||||
|     background_data.left = 16; | ||||
|  | @ -3435,11 +3425,7 @@ bool GLCanvas3D::_init_toolbar() | |||
|     background_data.right = 16; | ||||
|     background_data.bottom = 16; | ||||
| 
 | ||||
| #if ENABLE_SVG_ICONS | ||||
|     if (!m_toolbar.init(background_data)) | ||||
| #else | ||||
|     if (!m_toolbar.init(icons_data, background_data)) | ||||
| #endif // ENABLE_SVG_ICONS
 | ||||
|     { | ||||
|         // unable to init the toolbar texture, disable it
 | ||||
|         m_toolbar.set_enabled(false); | ||||
|  | @ -3456,9 +3442,7 @@ bool GLCanvas3D::_init_toolbar() | |||
|     GLToolbarItem::Data item; | ||||
| 
 | ||||
|     item.name = "add"; | ||||
| #if ENABLE_SVG_ICONS | ||||
|     item.icon_filename = "add.svg"; | ||||
| #endif // ENABLE_SVG_ICONS
 | ||||
|     item.tooltip = _utf8(L("Add...")) + " [" + GUI::shortkey_ctrl_prefix() + "I]"; | ||||
|     item.sprite_id = 0; | ||||
|     item.action_callback = [this]() { if (m_canvas != nullptr) wxPostEvent(m_canvas, SimpleEvent(EVT_GLTOOLBAR_ADD)); }; | ||||
|  | @ -3466,9 +3450,7 @@ bool GLCanvas3D::_init_toolbar() | |||
|         return false; | ||||
| 
 | ||||
|     item.name = "delete"; | ||||
| #if ENABLE_SVG_ICONS | ||||
|     item.icon_filename = "remove.svg"; | ||||
| #endif // ENABLE_SVG_ICONS
 | ||||
|     item.tooltip = _utf8(L("Delete")) + " [Del]"; | ||||
|     item.sprite_id = 1; | ||||
|     item.action_callback = [this]() { if (m_canvas != nullptr) wxPostEvent(m_canvas, SimpleEvent(EVT_GLTOOLBAR_DELETE)); }; | ||||
|  | @ -3477,9 +3459,7 @@ bool GLCanvas3D::_init_toolbar() | |||
|         return false; | ||||
| 
 | ||||
|     item.name = "deleteall"; | ||||
| #if ENABLE_SVG_ICONS | ||||
|     item.icon_filename = "delete_all.svg"; | ||||
| #endif // ENABLE_SVG_ICONS
 | ||||
|     item.tooltip = _utf8(L("Delete all")) + " [" + GUI::shortkey_ctrl_prefix() + "Del]"; | ||||
|     item.sprite_id = 2; | ||||
|     item.action_callback = [this]() { if (m_canvas != nullptr) wxPostEvent(m_canvas, SimpleEvent(EVT_GLTOOLBAR_DELETE_ALL)); }; | ||||
|  | @ -3488,9 +3468,7 @@ bool GLCanvas3D::_init_toolbar() | |||
|         return false; | ||||
| 
 | ||||
|     item.name = "arrange"; | ||||
| #if ENABLE_SVG_ICONS | ||||
|     item.icon_filename = "arrange.svg"; | ||||
| #endif // ENABLE_SVG_ICONS
 | ||||
|     item.tooltip = _utf8(L("Arrange")) + " [A]"; | ||||
|     item.sprite_id = 3; | ||||
|     item.action_callback = [this]() { if (m_canvas != nullptr) wxPostEvent(m_canvas, SimpleEvent(EVT_GLTOOLBAR_ARRANGE)); }; | ||||
|  | @ -3502,9 +3480,7 @@ bool GLCanvas3D::_init_toolbar() | |||
|         return false; | ||||
| 
 | ||||
|     item.name = "copy"; | ||||
| #if ENABLE_SVG_ICONS | ||||
|     item.icon_filename = "copy.svg"; | ||||
| #endif // ENABLE_SVG_ICONS
 | ||||
|     item.tooltip = _utf8(L("Copy")) + " [" + GUI::shortkey_ctrl_prefix() + "C]"; | ||||
|     item.sprite_id = 4; | ||||
|     item.action_callback = [this]() { if (m_canvas != nullptr) wxPostEvent(m_canvas, SimpleEvent(EVT_GLTOOLBAR_COPY)); }; | ||||
|  | @ -3513,9 +3489,7 @@ bool GLCanvas3D::_init_toolbar() | |||
|         return false; | ||||
| 
 | ||||
|     item.name = "paste"; | ||||
| #if ENABLE_SVG_ICONS | ||||
|     item.icon_filename = "paste.svg"; | ||||
| #endif // ENABLE_SVG_ICONS
 | ||||
|     item.tooltip = _utf8(L("Paste")) + " [" + GUI::shortkey_ctrl_prefix() + "V]"; | ||||
|     item.sprite_id = 5; | ||||
|     item.action_callback = [this]() { if (m_canvas != nullptr) wxPostEvent(m_canvas, SimpleEvent(EVT_GLTOOLBAR_PASTE)); }; | ||||
|  | @ -3527,9 +3501,7 @@ bool GLCanvas3D::_init_toolbar() | |||
|         return false; | ||||
| 
 | ||||
|     item.name = "more"; | ||||
| #if ENABLE_SVG_ICONS | ||||
|     item.icon_filename = "instance_add.svg"; | ||||
| #endif // ENABLE_SVG_ICONS
 | ||||
|     item.tooltip = _utf8(L("Add instance")) + " [+]"; | ||||
|     item.sprite_id = 6; | ||||
|     item.action_callback = [this]() { if (m_canvas != nullptr) wxPostEvent(m_canvas, SimpleEvent(EVT_GLTOOLBAR_MORE)); }; | ||||
|  | @ -3539,9 +3511,7 @@ bool GLCanvas3D::_init_toolbar() | |||
|         return false; | ||||
| 
 | ||||
|     item.name = "fewer"; | ||||
| #if ENABLE_SVG_ICONS | ||||
|     item.icon_filename = "instance_remove.svg"; | ||||
| #endif // ENABLE_SVG_ICONS
 | ||||
|     item.tooltip = _utf8(L("Remove instance")) + " [-]"; | ||||
|     item.sprite_id = 7; | ||||
|     item.action_callback = [this]() { if (m_canvas != nullptr) wxPostEvent(m_canvas, SimpleEvent(EVT_GLTOOLBAR_FEWER)); }; | ||||
|  | @ -3554,9 +3524,7 @@ bool GLCanvas3D::_init_toolbar() | |||
|         return false; | ||||
| 
 | ||||
|     item.name = "splitobjects"; | ||||
| #if ENABLE_SVG_ICONS | ||||
|     item.icon_filename = "split_objects.svg"; | ||||
| #endif // ENABLE_SVG_ICONS
 | ||||
|     item.tooltip = _utf8(L("Split to objects")); | ||||
|     item.sprite_id = 8; | ||||
|     item.action_callback = [this]() { if (m_canvas != nullptr) wxPostEvent(m_canvas, SimpleEvent(EVT_GLTOOLBAR_SPLIT_OBJECTS)); }; | ||||
|  | @ -3566,9 +3534,7 @@ bool GLCanvas3D::_init_toolbar() | |||
|         return false; | ||||
| 
 | ||||
|     item.name = "splitvolumes"; | ||||
| #if ENABLE_SVG_ICONS | ||||
|     item.icon_filename = "split_parts.svg"; | ||||
| #endif // ENABLE_SVG_ICONS
 | ||||
|     item.tooltip = _utf8(L("Split to parts")); | ||||
|     item.sprite_id = 9; | ||||
|     item.action_callback = [this]() { if (m_canvas != nullptr) wxPostEvent(m_canvas, SimpleEvent(EVT_GLTOOLBAR_SPLIT_VOLUMES)); }; | ||||
|  | @ -3581,9 +3547,7 @@ bool GLCanvas3D::_init_toolbar() | |||
|         return false; | ||||
| 
 | ||||
|     item.name = "layersediting"; | ||||
| #if ENABLE_SVG_ICONS | ||||
|     item.icon_filename = "layers_white.svg"; | ||||
| #endif // ENABLE_SVG_ICONS
 | ||||
|     item.tooltip = _utf8(L("Layers editing")); | ||||
|     item.sprite_id = 10; | ||||
|     item.is_toggable = true; | ||||
|  | @ -3921,9 +3885,6 @@ void GLCanvas3D::_render_overlays() const | |||
|     _render_gizmos_overlay(); | ||||
|     _render_warning_texture(); | ||||
|     _render_legend_texture(); | ||||
| #if !ENABLE_SVG_ICONS | ||||
|     _resize_toolbars(); | ||||
| #endif // !ENABLE_SVG_ICONS
 | ||||
|     _render_toolbar(); | ||||
|     _render_view_toolbar(); | ||||
| 
 | ||||
|  | @ -4000,7 +3961,6 @@ void GLCanvas3D::_render_current_gizmo() const | |||
| 
 | ||||
| void GLCanvas3D::_render_gizmos_overlay() const | ||||
| { | ||||
| #if ENABLE_SVG_ICONS | ||||
| #if ENABLE_RETINA_GL | ||||
| //     m_gizmos.set_overlay_scale(m_retina_helper->get_scale_factor());
 | ||||
|     const float scale = m_retina_helper->get_scale_factor()*wxGetApp().toolbar_icon_scale(); | ||||
|  | @ -4011,14 +3971,12 @@ void GLCanvas3D::_render_gizmos_overlay() const | |||
|     const float size = int(GLGizmosManager::Default_Icons_Size*wxGetApp().toolbar_icon_scale()); | ||||
|     m_gizmos.set_overlay_icon_size(size); //! #ys_FIXME_experiment
 | ||||
| #endif /* __WXMSW__ */ | ||||
| #endif // ENABLE_SVG_ICONS
 | ||||
| 
 | ||||
|     m_gizmos.render_overlay(*this, m_selection); | ||||
| } | ||||
| 
 | ||||
| void GLCanvas3D::_render_toolbar() const | ||||
| { | ||||
| #if ENABLE_SVG_ICONS | ||||
| #if ENABLE_RETINA_GL | ||||
| //     m_toolbar.set_scale(m_retina_helper->get_scale_factor());
 | ||||
|     const float scale = m_retina_helper->get_scale_factor() * wxGetApp().toolbar_icon_scale(true); | ||||
|  | @ -4073,20 +4031,12 @@ void GLCanvas3D::_render_toolbar() const | |||
|     } | ||||
|     } | ||||
|     m_toolbar.set_position(top, left); | ||||
| #else | ||||
| #if ENABLE_RETINA_GL | ||||
|     m_toolbar.set_icons_scale(m_retina_helper->get_scale_factor()); | ||||
| #else | ||||
|     m_toolbar.set_icons_scale(m_canvas->GetContentScaleFactor()); | ||||
| #endif /* __WXMSW__ */ | ||||
| #endif // ENABLE_SVG_ICONS
 | ||||
| 
 | ||||
|     m_toolbar.render(*this); | ||||
| } | ||||
| 
 | ||||
| void GLCanvas3D::_render_view_toolbar() const | ||||
| { | ||||
| #if ENABLE_SVG_ICONS | ||||
| #if ENABLE_RETINA_GL | ||||
| //     m_view_toolbar.set_scale(m_retina_helper->get_scale_factor());
 | ||||
|     const float scale = m_retina_helper->get_scale_factor() * wxGetApp().toolbar_icon_scale(); | ||||
|  | @ -4106,13 +4056,6 @@ void GLCanvas3D::_render_view_toolbar() const | |||
|     float top = (-0.5f * (float)cnv_size.get_height() + m_view_toolbar.get_height()) * inv_zoom; | ||||
|     float left = -0.5f * (float)cnv_size.get_width() * inv_zoom; | ||||
|     m_view_toolbar.set_position(top, left); | ||||
| #else | ||||
| #if ENABLE_RETINA_GL | ||||
|     m_view_toolbar.set_icons_scale(m_retina_helper->get_scale_factor()); | ||||
| #else | ||||
|     m_view_toolbar.set_icons_scale(m_canvas->GetContentScaleFactor()); | ||||
| #endif /* __WXMSW__ */ | ||||
| #endif // ENABLE_SVG_ICONS
 | ||||
|     m_view_toolbar.render(*this); | ||||
| } | ||||
| 
 | ||||
|  | @ -5555,73 +5498,6 @@ bool GLCanvas3D::_is_any_volume_outside() const | |||
|     return false; | ||||
| } | ||||
| 
 | ||||
| #if !ENABLE_SVG_ICONS | ||||
| void GLCanvas3D::_resize_toolbars() const | ||||
| { | ||||
|     Size cnv_size = get_canvas_size(); | ||||
|     float zoom = (float)m_camera.get_zoom(); | ||||
|     float inv_zoom = (zoom != 0.0f) ? 1.0f / zoom : 0.0f; | ||||
| 
 | ||||
| #if ENABLE_RETINA_GL | ||||
|     m_toolbar.set_icons_scale(m_retina_helper->get_scale_factor()); | ||||
| #else | ||||
|     m_toolbar.set_icons_scale(m_canvas->GetContentScaleFactor()); | ||||
| #endif /* __WXMSW__ */ | ||||
| 
 | ||||
|     GLToolbar::Layout::EOrientation orientation = m_toolbar.get_layout_orientation(); | ||||
| 
 | ||||
|     switch (m_toolbar.get_layout_type()) | ||||
|     { | ||||
|     default: | ||||
|     case GLToolbar::Layout::Horizontal: | ||||
|     { | ||||
|         // centers the toolbar on the top edge of the 3d scene
 | ||||
|         float top, left; | ||||
|         if (orientation == GLToolbar::Layout::Top) | ||||
|         { | ||||
|             top = 0.5f * (float)cnv_size.get_height() * inv_zoom; | ||||
|             left = -0.5f * m_toolbar.get_width() * inv_zoom; | ||||
|         } | ||||
|         else | ||||
|         { | ||||
|             top = (-0.5f * (float)cnv_size.get_height() + m_view_toolbar.get_height()) * inv_zoom; | ||||
|             left = -0.5f * m_toolbar.get_width() * inv_zoom; | ||||
|         } | ||||
|         m_toolbar.set_position(top, left); | ||||
|         break; | ||||
|     } | ||||
|     case GLToolbar::Layout::Vertical: | ||||
|     { | ||||
|         // centers the toolbar on the right edge of the 3d scene
 | ||||
|         float top, left; | ||||
|         if (orientation == GLToolbar::Layout::Left) | ||||
|         { | ||||
|             top = 0.5f * m_toolbar.get_height() * inv_zoom; | ||||
|             left = (-0.5f * (float)cnv_size.get_width()) * inv_zoom; | ||||
|         } | ||||
|         else | ||||
|         { | ||||
|             top = 0.5f * m_toolbar.get_height() * inv_zoom; | ||||
|             left = (0.5f * (float)cnv_size.get_width() - m_toolbar.get_width()) * inv_zoom; | ||||
|         } | ||||
|         m_toolbar.set_position(top, left); | ||||
|         break; | ||||
|     } | ||||
|     } | ||||
| 
 | ||||
| #if ENABLE_RETINA_GL | ||||
|     m_view_toolbar.set_icons_scale(m_retina_helper->get_scale_factor()); | ||||
| #else | ||||
|     m_view_toolbar.set_icons_scale(m_canvas->GetContentScaleFactor()); | ||||
| #endif /* __WXMSW__ */ | ||||
| 
 | ||||
|     // places the toolbar on the bottom-left corner of the 3d scene
 | ||||
|     float top = (-0.5f * (float)cnv_size.get_height() + m_view_toolbar.get_height()) * inv_zoom; | ||||
|     float left = -0.5f * (float)cnv_size.get_width() * inv_zoom; | ||||
|     m_view_toolbar.set_position(top, left); | ||||
| } | ||||
| #endif // !ENABLE_SVG_ICONS
 | ||||
| 
 | ||||
| void GLCanvas3D::_update_selection_from_hover() | ||||
| { | ||||
|     bool ctrl_pressed = wxGetKeyState(WXK_CONTROL); | ||||
|  |  | |||
|  | @ -728,10 +728,6 @@ private: | |||
| 
 | ||||
|     bool _is_any_volume_outside() const; | ||||
| 
 | ||||
| #if !ENABLE_SVG_ICONS | ||||
|     void _resize_toolbars() const; | ||||
| #endif // !ENABLE_SVG_ICONS
 | ||||
| 
 | ||||
|     // updates the selection from the content of m_hover_volume_idxs
 | ||||
|     void _update_selection_from_hover(); | ||||
| 
 | ||||
|  |  | |||
|  | @ -38,9 +38,7 @@ const GLToolbarItem::EnabledStateCallback GLToolbarItem::Default_Enabled_State_C | |||
| 
 | ||||
| GLToolbarItem::Data::Data() | ||||
|     : name("") | ||||
| #if ENABLE_SVG_ICONS | ||||
|     , icon_filename("") | ||||
| #endif // ENABLE_SVG_ICONS
 | ||||
|     , tooltip("") | ||||
|     , sprite_id(-1) | ||||
|     , is_toggable(false) | ||||
|  | @ -105,14 +103,6 @@ GLTexture::Quad_UVs GLToolbarItem::get_uvs(unsigned int tex_width, unsigned int | |||
|     return uvs; | ||||
| } | ||||
| 
 | ||||
| #if !ENABLE_SVG_ICONS | ||||
| ItemsIconsTexture::Metadata::Metadata() | ||||
|     : filename("") | ||||
|     , icon_size(0) | ||||
| { | ||||
| } | ||||
| #endif // !ENABLE_SVG_ICONS
 | ||||
| 
 | ||||
| BackgroundTexture::Metadata::Metadata() | ||||
|     : filename("") | ||||
|     , left(0) | ||||
|  | @ -122,9 +112,7 @@ BackgroundTexture::Metadata::Metadata() | |||
| { | ||||
| } | ||||
| 
 | ||||
| #if ENABLE_SVG_ICONS | ||||
| const float GLToolbar::Default_Icons_Size = 40.0f; | ||||
| #endif // ENABLE_SVG_ICONS
 | ||||
| 
 | ||||
| GLToolbar::Layout::Layout() | ||||
|     : type(Horizontal) | ||||
|  | @ -134,31 +122,19 @@ GLToolbar::Layout::Layout() | |||
|     , border(0.0f) | ||||
|     , separator_size(0.0f) | ||||
|     , gap_size(0.0f) | ||||
| #if ENABLE_SVG_ICONS | ||||
|     , icons_size(Default_Icons_Size) | ||||
|     , scale(1.0f) | ||||
| #else | ||||
|     , icons_scale(1.0f) | ||||
| #endif // ENABLE_SVG_ICONS
 | ||||
|     , width(0.0f) | ||||
|     , height(0.0f) | ||||
|     , dirty(true) | ||||
| { | ||||
| } | ||||
| 
 | ||||
| #if ENABLE_SVG_ICONS | ||||
| GLToolbar::GLToolbar(GLToolbar::EType type, const std::string& name) | ||||
| #else | ||||
| GLToolbar::GLToolbar(GLToolbar::EType type) | ||||
| #endif // ENABLE_SVG_ICONS
 | ||||
|     : m_type(type) | ||||
| #if ENABLE_SVG_ICONS | ||||
|     , m_name(name) | ||||
| #endif // ENABLE_SVG_ICONS
 | ||||
|     , m_enabled(false) | ||||
| #if ENABLE_SVG_ICONS | ||||
|     , m_icons_texture_dirty(true) | ||||
| #endif // ENABLE_SVG_ICONS
 | ||||
|     , m_tooltip("") | ||||
| { | ||||
| } | ||||
|  | @ -171,27 +147,13 @@ GLToolbar::~GLToolbar() | |||
|     } | ||||
| } | ||||
| 
 | ||||
| #if ENABLE_SVG_ICONS | ||||
| bool GLToolbar::init(const BackgroundTexture::Metadata& background_texture) | ||||
| #else | ||||
| bool GLToolbar::init(const ItemsIconsTexture::Metadata& icons_texture, const BackgroundTexture::Metadata& background_texture) | ||||
| #endif // ENABLE_SVG_ICONS
 | ||||
| { | ||||
| #if ENABLE_SVG_ICONS | ||||
|     if (m_background_texture.texture.get_id() != 0) | ||||
|         return true; | ||||
| 
 | ||||
|     std::string path = resources_dir() + "/icons/"; | ||||
|     bool res = false; | ||||
| #else | ||||
|     if (m_icons_texture.texture.get_id() != 0) | ||||
|         return true; | ||||
| 
 | ||||
|     std::string path = resources_dir() + "/icons/"; | ||||
|     bool res = !icons_texture.filename.empty() && m_icons_texture.texture.load_from_file(path + icons_texture.filename, false, true); | ||||
|     if (res) | ||||
|         m_icons_texture.metadata = icons_texture; | ||||
| #endif // ENABLE_SVG_ICONS
 | ||||
| 
 | ||||
|     if (!background_texture.filename.empty()) | ||||
|         res = m_background_texture.texture.load_from_file(path + background_texture.filename, false, true); | ||||
|  | @ -247,7 +209,6 @@ void GLToolbar::set_gap_size(float size) | |||
|     m_layout.dirty = true; | ||||
| } | ||||
| 
 | ||||
| #if ENABLE_SVG_ICONS | ||||
| void GLToolbar::set_icons_size(float size) | ||||
| { | ||||
|     if (m_layout.icons_size != size) | ||||
|  | @ -267,13 +228,6 @@ void GLToolbar::set_scale(float scale) | |||
|         m_icons_texture_dirty = true; | ||||
|     } | ||||
| } | ||||
| #else | ||||
| void GLToolbar::set_icons_scale(float scale) | ||||
| { | ||||
|     m_layout.icons_scale = scale; | ||||
|     m_layout.dirty = true; | ||||
| } | ||||
| #endif // ENABLE_SVG_ICONS
 | ||||
| 
 | ||||
| bool GLToolbar::is_enabled() const | ||||
| { | ||||
|  | @ -385,10 +339,8 @@ void GLToolbar::render(const GLCanvas3D& parent) const | |||
|     if (!m_enabled || m_items.empty()) | ||||
|         return; | ||||
| 
 | ||||
| #if ENABLE_SVG_ICONS | ||||
|     if (m_icons_texture_dirty) | ||||
|         generate_icons_texture(); | ||||
| #endif // ENABLE_SVG_ICONS
 | ||||
| 
 | ||||
|     switch (m_layout.type) | ||||
|     { | ||||
|  | @ -492,20 +444,12 @@ float GLToolbar::get_width_horizontal() const | |||
| 
 | ||||
| float GLToolbar::get_width_vertical() const | ||||
| { | ||||
| #if ENABLE_SVG_ICONS | ||||
|     return (2.0f * m_layout.border + m_layout.icons_size) * m_layout.scale; | ||||
| #else | ||||
|     return 2.0f * m_layout.border * m_layout.icons_scale + m_icons_texture.metadata.icon_size * m_layout.icons_scale; | ||||
| #endif // ENABLE_SVG_ICONS
 | ||||
| } | ||||
| 
 | ||||
| float GLToolbar::get_height_horizontal() const | ||||
| { | ||||
| #if ENABLE_SVG_ICONS | ||||
|     return (2.0f * m_layout.border + m_layout.icons_size) * m_layout.scale; | ||||
| #else | ||||
|     return 2.0f * m_layout.border * m_layout.icons_scale + m_icons_texture.metadata.icon_size * m_layout.icons_scale; | ||||
| #endif // ENABLE_SVG_ICONS
 | ||||
| } | ||||
| 
 | ||||
| float GLToolbar::get_height_vertical() const | ||||
|  | @ -515,7 +459,6 @@ float GLToolbar::get_height_vertical() const | |||
| 
 | ||||
| float GLToolbar::get_main_size() const | ||||
| { | ||||
| #if ENABLE_SVG_ICONS | ||||
|     float size = 2.0f * m_layout.border; | ||||
|     for (unsigned int i = 0; i < (unsigned int)m_items.size(); ++i) | ||||
|     { | ||||
|  | @ -531,25 +474,7 @@ float GLToolbar::get_main_size() const | |||
|     if (m_items.size() > 1) | ||||
|         size += ((float)m_items.size() - 1.0f) * m_layout.gap_size; | ||||
| 
 | ||||
|     size *= m_layout.scale; | ||||
| #else | ||||
|     float size = 2.0f * m_layout.border * m_layout.icons_scale; | ||||
|     for (unsigned int i = 0; i < (unsigned int)m_items.size(); ++i) | ||||
|     { | ||||
|         if (!m_items[i]->is_visible()) | ||||
|             continue; | ||||
| 
 | ||||
|         if (m_items[i]->is_separator()) | ||||
|             size += m_layout.separator_size * m_layout.icons_scale; | ||||
|         else | ||||
|             size += (float)m_icons_texture.metadata.icon_size * m_layout.icons_scale; | ||||
|     } | ||||
| 
 | ||||
|     if (m_items.size() > 1) | ||||
|         size += ((float)m_items.size() - 1.0f) * m_layout.gap_size * m_layout.icons_scale; | ||||
| #endif // ENABLE_SVG_ICONS
 | ||||
| 
 | ||||
|     return size; | ||||
|     return size * m_layout.scale; | ||||
| } | ||||
| 
 | ||||
| void GLToolbar::do_action(unsigned int item_id, GLCanvas3D& parent) | ||||
|  | @ -609,20 +534,12 @@ std::string GLToolbar::update_hover_state_horizontal(const Vec2d& mouse_pos, GLC | |||
| 
 | ||||
|     float zoom = (float)parent.get_camera().get_zoom(); | ||||
|     float inv_zoom = (zoom != 0.0f) ? 1.0f / zoom : 0.0f; | ||||
| #if ENABLE_SVG_ICONS | ||||
|     float factor = m_layout.scale * inv_zoom; | ||||
| #else | ||||
|     float factor = m_layout.icons_scale * inv_zoom; | ||||
| #endif // ENABLE_SVG_ICONS
 | ||||
| 
 | ||||
|     Size cnv_size = parent.get_canvas_size(); | ||||
|     Vec2d scaled_mouse_pos((mouse_pos(0) - 0.5 * (double)cnv_size.get_width()) * inv_zoom, (0.5 * (double)cnv_size.get_height() - mouse_pos(1)) * inv_zoom); | ||||
| 
 | ||||
| #if ENABLE_SVG_ICONS | ||||
|     float scaled_icons_size = m_layout.icons_size * factor; | ||||
| #else | ||||
|     float scaled_icons_size = (float)m_icons_texture.metadata.icon_size * factor; | ||||
| #endif // ENABLE_SVG_ICONS
 | ||||
|     float scaled_separator_size = m_layout.separator_size * factor; | ||||
|     float scaled_gap_size = m_layout.gap_size * factor; | ||||
|     float scaled_border = m_layout.border * factor; | ||||
|  | @ -714,20 +631,12 @@ std::string GLToolbar::update_hover_state_vertical(const Vec2d& mouse_pos, GLCan | |||
| 
 | ||||
|     float zoom = (float)parent.get_camera().get_zoom(); | ||||
|     float inv_zoom = (zoom != 0.0f) ? 1.0f / zoom : 0.0f; | ||||
| #if ENABLE_SVG_ICONS | ||||
|     float factor = m_layout.scale * inv_zoom; | ||||
| #else | ||||
|     float factor = m_layout.icons_scale * inv_zoom; | ||||
| #endif // ENABLE_SVG_ICONS
 | ||||
| 
 | ||||
|     Size cnv_size = parent.get_canvas_size(); | ||||
|     Vec2d scaled_mouse_pos((mouse_pos(0) - 0.5 * (double)cnv_size.get_width()) * inv_zoom, (0.5 * (double)cnv_size.get_height() - mouse_pos(1)) * inv_zoom); | ||||
| 
 | ||||
| #if ENABLE_SVG_ICONS | ||||
|     float scaled_icons_size = m_layout.icons_size * factor; | ||||
| #else | ||||
|     float scaled_icons_size = (float)m_icons_texture.metadata.icon_size * factor; | ||||
| #endif // ENABLE_SVG_ICONS
 | ||||
|     float scaled_separator_size = m_layout.separator_size * factor; | ||||
|     float scaled_gap_size = m_layout.gap_size * factor; | ||||
|     float scaled_border = m_layout.border * factor; | ||||
|  | @ -831,20 +740,12 @@ int GLToolbar::contains_mouse_horizontal(const Vec2d& mouse_pos, const GLCanvas3 | |||
| 
 | ||||
|     float zoom = (float)parent.get_camera().get_zoom(); | ||||
|     float inv_zoom = (zoom != 0.0f) ? 1.0f / zoom : 0.0f; | ||||
| #if ENABLE_SVG_ICONS | ||||
|     float factor = m_layout.scale * inv_zoom; | ||||
| #else | ||||
|     float factor = m_layout.icons_scale * inv_zoom; | ||||
| #endif // ENABLE_SVG_ICONS
 | ||||
| 
 | ||||
|     Size cnv_size = parent.get_canvas_size(); | ||||
|     Vec2d scaled_mouse_pos((mouse_pos(0) - 0.5 * (double)cnv_size.get_width()) * inv_zoom, (0.5 * (double)cnv_size.get_height() - mouse_pos(1)) * inv_zoom); | ||||
| 
 | ||||
| #if ENABLE_SVG_ICONS | ||||
|     float scaled_icons_size = m_layout.icons_size * factor; | ||||
| #else | ||||
|     float scaled_icons_size = (float)m_icons_texture.metadata.icon_size * factor; | ||||
| #endif // ENABLE_SVG_ICONS
 | ||||
|     float scaled_separator_size = m_layout.separator_size * factor; | ||||
|     float scaled_gap_size = m_layout.gap_size * factor; | ||||
|     float scaled_border = m_layout.border * factor; | ||||
|  | @ -914,20 +815,12 @@ int GLToolbar::contains_mouse_vertical(const Vec2d& mouse_pos, const GLCanvas3D& | |||
| 
 | ||||
|     float zoom = (float)parent.get_camera().get_zoom(); | ||||
|     float inv_zoom = (zoom != 0.0f) ? 1.0f / zoom : 0.0f; | ||||
| #if ENABLE_SVG_ICONS | ||||
|     float factor = m_layout.scale * inv_zoom; | ||||
| #else | ||||
|     float factor = m_layout.icons_scale * inv_zoom; | ||||
| #endif // ENABLE_SVG_ICONS
 | ||||
| 
 | ||||
|     Size cnv_size = parent.get_canvas_size(); | ||||
|     Vec2d scaled_mouse_pos((mouse_pos(0) - 0.5 * (double)cnv_size.get_width()) * inv_zoom, (0.5 * (double)cnv_size.get_height() - mouse_pos(1)) * inv_zoom); | ||||
| 
 | ||||
| #if ENABLE_SVG_ICONS | ||||
|     float scaled_icons_size = m_layout.icons_size * factor; | ||||
| #else | ||||
|     float scaled_icons_size = (float)m_icons_texture.metadata.icon_size * factor; | ||||
| #endif // ENABLE_SVG_ICONS
 | ||||
|     float scaled_separator_size = m_layout.separator_size * factor; | ||||
|     float scaled_gap_size = m_layout.gap_size * factor; | ||||
|     float scaled_border = m_layout.border * factor; | ||||
|  | @ -993,34 +886,15 @@ int GLToolbar::contains_mouse_vertical(const Vec2d& mouse_pos, const GLCanvas3D& | |||
| 
 | ||||
| void GLToolbar::render_horizontal(const GLCanvas3D& parent) const | ||||
| { | ||||
| #if ENABLE_SVG_ICONS | ||||
|     unsigned int tex_id = m_icons_texture.get_id(); | ||||
|     int tex_width = m_icons_texture.get_width(); | ||||
|     int tex_height = m_icons_texture.get_height(); | ||||
| #else | ||||
|     unsigned int tex_id = m_icons_texture.texture.get_id(); | ||||
|     int tex_width = m_icons_texture.texture.get_width(); | ||||
|     int tex_height = m_icons_texture.texture.get_height(); | ||||
| #endif // ENABLE_SVG_ICONS
 | ||||
| 
 | ||||
| #if !ENABLE_SVG_ICONS | ||||
|     if ((tex_id == 0) || (tex_width <= 0) || (tex_height <= 0)) | ||||
|         return; | ||||
| #endif // !ENABLE_SVG_ICONS
 | ||||
| 
 | ||||
|     float zoom = (float)parent.get_camera().get_zoom(); | ||||
|     float inv_zoom = (zoom != 0.0f) ? 1.0f / zoom : 0.0f; | ||||
| #if ENABLE_SVG_ICONS | ||||
|     float factor = inv_zoom * m_layout.scale; | ||||
| #else | ||||
|     float factor = inv_zoom * m_layout.icons_scale; | ||||
| #endif // ENABLE_SVG_ICONS
 | ||||
| 
 | ||||
| #if ENABLE_SVG_ICONS | ||||
|     float scaled_icons_size = m_layout.icons_size * factor; | ||||
| #else | ||||
|     float scaled_icons_size = (float)m_icons_texture.metadata.icon_size * factor; | ||||
| #endif // ENABLE_SVG_ICONS
 | ||||
|     float scaled_separator_size = m_layout.separator_size * factor; | ||||
|     float scaled_gap_size = m_layout.gap_size * factor; | ||||
|     float scaled_border = m_layout.border * factor; | ||||
|  | @ -1121,10 +995,8 @@ void GLToolbar::render_horizontal(const GLCanvas3D& parent) const | |||
|     left += scaled_border; | ||||
|     top -= scaled_border; | ||||
| 
 | ||||
| #if ENABLE_SVG_ICONS | ||||
|     if ((tex_id == 0) || (tex_width <= 0) || (tex_height <= 0)) | ||||
|         return; | ||||
| #endif // ENABLE_SVG_ICONS
 | ||||
| 
 | ||||
|     // renders icons
 | ||||
|     for (const GLToolbarItem* item : m_items) | ||||
|  | @ -1136,11 +1008,7 @@ void GLToolbar::render_horizontal(const GLCanvas3D& parent) const | |||
|             left += separator_stride; | ||||
|         else | ||||
|         { | ||||
| #if ENABLE_SVG_ICONS | ||||
|             item->render(tex_id, left, left + scaled_icons_size, top - scaled_icons_size, top, (unsigned int)tex_width, (unsigned int)tex_height, (unsigned int)(m_layout.icons_size * m_layout.scale)); | ||||
| #else | ||||
|             item->render(tex_id, left, left + scaled_icons_size, top - scaled_icons_size, top, (unsigned int)tex_width, (unsigned int)tex_height, m_icons_texture.metadata.icon_size); | ||||
| #endif // ENABLE_SVG_ICONS
 | ||||
|             left += icon_stride; | ||||
|         } | ||||
|     } | ||||
|  | @ -1148,34 +1016,15 @@ void GLToolbar::render_horizontal(const GLCanvas3D& parent) const | |||
| 
 | ||||
| void GLToolbar::render_vertical(const GLCanvas3D& parent) const | ||||
| { | ||||
| #if ENABLE_SVG_ICONS | ||||
|     unsigned int tex_id = m_icons_texture.get_id(); | ||||
|     int tex_width = m_icons_texture.get_width(); | ||||
|     int tex_height = m_icons_texture.get_height(); | ||||
| #else | ||||
|     unsigned int tex_id = m_icons_texture.texture.get_id(); | ||||
|     int tex_width = m_icons_texture.texture.get_width(); | ||||
|     int tex_height = m_icons_texture.texture.get_height(); | ||||
| #endif // ENABLE_SVG_ICONS
 | ||||
| 
 | ||||
| #if !ENABLE_SVG_ICONS | ||||
|     if ((tex_id == 0) || (tex_width <= 0) || (tex_height <= 0)) | ||||
|         return; | ||||
| #endif // !ENABLE_SVG_ICONS
 | ||||
| 
 | ||||
|     float zoom = (float)parent.get_camera().get_zoom(); | ||||
|     float inv_zoom = (zoom != 0.0f) ? 1.0f / zoom : 0.0f; | ||||
| #if ENABLE_SVG_ICONS | ||||
|     float factor = inv_zoom * m_layout.scale; | ||||
| #else | ||||
|     float factor = inv_zoom * m_layout.icons_scale; | ||||
| #endif // ENABLE_SVG_ICONS
 | ||||
| 
 | ||||
| #if ENABLE_SVG_ICONS | ||||
|     float scaled_icons_size = m_layout.icons_size * factor; | ||||
| #else | ||||
|     float scaled_icons_size = (float)m_icons_texture.metadata.icon_size * m_layout.icons_scale * factor; | ||||
| #endif // ENABLE_SVG_ICONS
 | ||||
|     float scaled_separator_size = m_layout.separator_size * factor; | ||||
|     float scaled_gap_size = m_layout.gap_size * factor; | ||||
|     float scaled_border = m_layout.border * factor; | ||||
|  | @ -1276,10 +1125,8 @@ void GLToolbar::render_vertical(const GLCanvas3D& parent) const | |||
|     left += scaled_border; | ||||
|     top -= scaled_border; | ||||
| 
 | ||||
| #if ENABLE_SVG_ICONS | ||||
|     if ((tex_id == 0) || (tex_width <= 0) || (tex_height <= 0)) | ||||
|         return; | ||||
| #endif // ENABLE_SVG_ICONS
 | ||||
| 
 | ||||
|     // renders icons
 | ||||
|     for (const GLToolbarItem* item : m_items) | ||||
|  | @ -1291,17 +1138,12 @@ void GLToolbar::render_vertical(const GLCanvas3D& parent) const | |||
|             top -= separator_stride; | ||||
|         else | ||||
|         { | ||||
| #if ENABLE_SVG_ICONS | ||||
|             item->render(tex_id, left, left + scaled_icons_size, top - scaled_icons_size, top, (unsigned int)tex_width, (unsigned int)tex_height, (unsigned int)(m_layout.icons_size * m_layout.scale)); | ||||
| #else | ||||
|             item->render(tex_id, left, left + scaled_icons_size, top - scaled_icons_size, top, (unsigned int)tex_width, (unsigned int)tex_height, m_icons_texture.metadata.icon_size); | ||||
| #endif // ENABLE_SVG_ICONS
 | ||||
|             top -= icon_stride; | ||||
|         } | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| #if ENABLE_SVG_ICONS | ||||
| bool GLToolbar::generate_icons_texture() const | ||||
| { | ||||
|     std::string path = resources_dir() + "/icons/"; | ||||
|  | @ -1337,7 +1179,6 @@ bool GLToolbar::generate_icons_texture() const | |||
| 
 | ||||
|     return res; | ||||
| } | ||||
| #endif // ENABLE_SVG_ICONS
 | ||||
| 
 | ||||
| bool GLToolbar::update_items_visibility() | ||||
| { | ||||
|  |  | |||
|  | @ -58,9 +58,7 @@ public: | |||
|     struct Data | ||||
|     { | ||||
|         std::string name; | ||||
| #if ENABLE_SVG_ICONS | ||||
|         std::string icon_filename; | ||||
| #endif // ENABLE_SVG_ICONS
 | ||||
|         std::string tooltip; | ||||
|         unsigned int sprite_id; | ||||
|         bool is_toggable; | ||||
|  | @ -88,9 +86,7 @@ public: | |||
|     void set_state(EState state) { m_state = state; } | ||||
| 
 | ||||
|     const std::string& get_name() const { return m_data.name; } | ||||
| #if ENABLE_SVG_ICONS | ||||
|     const std::string& get_icon_filename() const { return m_data.icon_filename; } | ||||
| #endif // ENABLE_SVG_ICONS
 | ||||
|     const std::string& get_tooltip() const { return m_data.tooltip; } | ||||
| 
 | ||||
|     void do_action() { m_data.action_callback(); } | ||||
|  | @ -118,27 +114,6 @@ private: | |||
|     friend class GLToolbar; | ||||
| }; | ||||
| 
 | ||||
| #if !ENABLE_SVG_ICONS | ||||
| // items icon textures are assumed to be square and all with the same size in pixels, no internal check is done
 | ||||
| // icons are layed-out into the texture starting from the top-left corner in the same order as enum GLToolbarItem::EState
 | ||||
| // from left to right
 | ||||
| struct ItemsIconsTexture | ||||
| { | ||||
|     struct Metadata | ||||
|     { | ||||
|         // path of the file containing the icons' texture
 | ||||
|         std::string filename; | ||||
|         // size of the square icons, in pixels
 | ||||
|         unsigned int icon_size; | ||||
| 
 | ||||
|         Metadata(); | ||||
|     }; | ||||
| 
 | ||||
|     GLTexture texture; | ||||
|     Metadata metadata; | ||||
| }; | ||||
| #endif // !ENABLE_SVG_ICONS
 | ||||
| 
 | ||||
| struct BackgroundTexture | ||||
| { | ||||
|     struct Metadata | ||||
|  | @ -164,9 +139,7 @@ struct BackgroundTexture | |||
| class GLToolbar | ||||
| { | ||||
| public: | ||||
| #if ENABLE_SVG_ICONS | ||||
|     static const float Default_Icons_Size; | ||||
| #endif // ENABLE_SVG_ICONS
 | ||||
| 
 | ||||
|     enum EType : unsigned char | ||||
|     { | ||||
|  | @ -201,12 +174,8 @@ public: | |||
|         float border; | ||||
|         float separator_size; | ||||
|         float gap_size; | ||||
| #if ENABLE_SVG_ICONS | ||||
|         float icons_size; | ||||
|         float scale; | ||||
| #else | ||||
|         float icons_scale; | ||||
| #endif // ENABLE_SVG_ICONS
 | ||||
| 
 | ||||
|         float width; | ||||
|         float height; | ||||
|  | @ -219,16 +188,10 @@ private: | |||
|     typedef std::vector<GLToolbarItem*> ItemsList; | ||||
| 
 | ||||
|     EType m_type; | ||||
| #if ENABLE_SVG_ICONS | ||||
|     std::string m_name; | ||||
| #endif // ENABLE_SVG_ICONS
 | ||||
|     bool m_enabled; | ||||
| #if ENABLE_SVG_ICONS | ||||
|     mutable GLTexture m_icons_texture; | ||||
|     mutable bool m_icons_texture_dirty; | ||||
| #else | ||||
|     ItemsIconsTexture m_icons_texture; | ||||
| #endif // ENABLE_SVG_ICONS
 | ||||
|     BackgroundTexture m_background_texture; | ||||
|     mutable Layout m_layout; | ||||
| 
 | ||||
|  | @ -251,18 +214,10 @@ private: | |||
|     std::string m_tooltip; | ||||
| 
 | ||||
| public: | ||||
| #if ENABLE_SVG_ICONS | ||||
|     GLToolbar(EType type, const std::string& name); | ||||
| #else | ||||
|     explicit GLToolbar(EType type); | ||||
| #endif // ENABLE_SVG_ICONS
 | ||||
|     ~GLToolbar(); | ||||
| 
 | ||||
| #if ENABLE_SVG_ICONS | ||||
|     bool init(const BackgroundTexture::Metadata& background_texture); | ||||
| #else | ||||
|     bool init(const ItemsIconsTexture::Metadata& icons_texture, const BackgroundTexture::Metadata& background_texture); | ||||
| #endif // ENABLE_SVG_ICONS
 | ||||
| 
 | ||||
|     Layout::EType get_layout_type() const; | ||||
|     void set_layout_type(Layout::EType type); | ||||
|  | @ -273,12 +228,8 @@ public: | |||
|     void set_border(float border); | ||||
|     void set_separator_size(float size); | ||||
|     void set_gap_size(float size); | ||||
| #if ENABLE_SVG_ICONS | ||||
|     void set_icons_size(float size); | ||||
|     void set_scale(float scale); | ||||
| #else | ||||
|     void set_icons_scale(float scale); | ||||
| #endif // ENABLE_SVG_ICONS
 | ||||
| 
 | ||||
|     bool is_enabled() const; | ||||
|     void set_enabled(bool enable); | ||||
|  | @ -297,7 +248,6 @@ public: | |||
| 
 | ||||
|     const std::string& get_tooltip() const { return m_tooltip; } | ||||
| 
 | ||||
| 
 | ||||
|     // returns true if any item changed its state
 | ||||
|     bool update_items_state(); | ||||
| 
 | ||||
|  | @ -324,9 +274,7 @@ private: | |||
|     void render_horizontal(const GLCanvas3D& parent) const; | ||||
|     void render_vertical(const GLCanvas3D& parent) const; | ||||
| 
 | ||||
| #if ENABLE_SVG_ICONS | ||||
|     bool generate_icons_texture() const; | ||||
| #endif // ENABLE_SVG_ICONS
 | ||||
| 
 | ||||
|     // returns true if any item changed its state
 | ||||
|     bool update_items_visibility(); | ||||
|  |  | |||
|  | @ -17,6 +17,28 @@ namespace Slic3r | |||
| namespace GUI | ||||
| { | ||||
| 
 | ||||
| 
 | ||||
| // Helper function to be used by drop to bed button. Returns lowest point of this
 | ||||
| // volume in world coordinate system.
 | ||||
| static double get_volume_min_z(const GLVolume* volume) | ||||
| { | ||||
|     const Transform3f& world_matrix = volume->world_matrix().cast<float>(); | ||||
| 
 | ||||
|     // need to get the ModelVolume pointer
 | ||||
|     const ModelObject* mo = wxGetApp().model_objects()->at(volume->composite_id.object_id); | ||||
|     const ModelVolume* mv = mo->volumes[volume->composite_id.volume_id]; | ||||
|     const TriangleMesh& hull = mv->get_convex_hull(); | ||||
| 
 | ||||
|     float min_z = std::numeric_limits<float>::max(); | ||||
|     for (const stl_facet& facet : hull.stl.facet_start) { | ||||
|         for (int i = 0; i < 3; ++ i) | ||||
|             min_z = std::min(min_z, Vec3f::UnitZ().dot(world_matrix * facet.vertex[i])); | ||||
|     } | ||||
|     return min_z; | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| static wxBitmapComboBox* create_word_local_combo(wxWindow *parent) | ||||
| { | ||||
|     wxSize size(15 * wxGetApp().em_unit(), -1); | ||||
|  | @ -185,7 +207,7 @@ ObjectManipulation::ObjectManipulation(wxWindow* parent) : | |||
|         unsigned int axis_idx = (axis[0] - 'x'); // 0, 1 or 2
 | ||||
| 
 | ||||
|         // We will add a button to toggle mirroring to each axis:
 | ||||
|         auto mirror_button = [=](wxWindow* parent) { | ||||
|         auto mirror_button = [this, mirror_btn_width, axis_idx, &label](wxWindow* parent) { | ||||
|             wxSize btn_size(em_unit(parent) * mirror_btn_width, em_unit(parent) * mirror_btn_width); | ||||
|             auto btn = new ScalableButton(parent, wxID_ANY, "mirroring_off.png", wxEmptyString, btn_size, wxDefaultPosition, wxBU_EXACTFIT | wxNO_BORDER | wxTRANSPARENT_WINDOW); | ||||
|             btn->SetToolTip(wxString::Format(_(L("Toggle %s axis mirroring")), label)); | ||||
|  | @ -195,7 +217,7 @@ ObjectManipulation::ObjectManipulation(wxWindow* parent) : | |||
|             auto sizer = new wxBoxSizer(wxHORIZONTAL); | ||||
|             sizer->Add(btn); | ||||
| 
 | ||||
|             btn->Bind(wxEVT_BUTTON, [=](wxCommandEvent &e) { | ||||
|             btn->Bind(wxEVT_BUTTON, [this, axis_idx](wxCommandEvent &e) { | ||||
|                 Axis axis = (Axis)(axis_idx + X); | ||||
|                 if (m_mirror_buttons[axis_idx].second == mbHidden) | ||||
|                     return; | ||||
|  | @ -258,13 +280,13 @@ ObjectManipulation::ObjectManipulation(wxWindow* parent) : | |||
|                 return btn; | ||||
|             }; | ||||
|             // Add reset scale button
 | ||||
|             auto reset_scale_button = [=](wxWindow* parent) { | ||||
|             auto reset_scale_button = [this](wxWindow* parent) { | ||||
|                 auto btn = new ScalableButton(parent, wxID_ANY, ScalableBitmap(parent, "undo")); | ||||
|                 btn->SetToolTip(_(L("Reset scale"))); | ||||
|                 m_reset_scale_button = btn; | ||||
|                 auto sizer = new wxBoxSizer(wxHORIZONTAL); | ||||
|                 sizer->Add(btn, wxBU_EXACTFIT); | ||||
|                 btn->Bind(wxEVT_BUTTON, [=](wxCommandEvent &e) { | ||||
|                 btn->Bind(wxEVT_BUTTON, [this](wxCommandEvent &e) { | ||||
|                     change_scale_value(0, 100.); | ||||
|                     change_scale_value(1, 100.); | ||||
|                     change_scale_value(2, 100.); | ||||
|  | @ -275,13 +297,13 @@ ObjectManipulation::ObjectManipulation(wxWindow* parent) : | |||
|         } | ||||
|         else if (option_name == "Rotation") { | ||||
|             // Add reset rotation button
 | ||||
|             auto reset_rotation_button = [=](wxWindow* parent) { | ||||
|             auto reset_rotation_button = [this](wxWindow* parent) { | ||||
|                 auto btn = new ScalableButton(parent, wxID_ANY, ScalableBitmap(parent, "undo")); | ||||
|                 btn->SetToolTip(_(L("Reset rotation"))); | ||||
|                 m_reset_rotation_button = btn; | ||||
|                 auto sizer = new wxBoxSizer(wxHORIZONTAL); | ||||
|                 sizer->Add(btn, wxBU_EXACTFIT); | ||||
|                 btn->Bind(wxEVT_BUTTON, [=](wxCommandEvent &e) { | ||||
|                 btn->Bind(wxEVT_BUTTON, [this](wxCommandEvent &e) { | ||||
|                     GLCanvas3D* canvas = wxGetApp().plater()->canvas3D(); | ||||
|                     Selection& selection = canvas->get_selection(); | ||||
| 
 | ||||
|  | @ -310,6 +332,34 @@ ObjectManipulation::ObjectManipulation(wxWindow* parent) : | |||
|             }; | ||||
|             line.append_widget(reset_rotation_button); | ||||
|         } | ||||
|         else if (option_name == "Position") { | ||||
|             // Add drop to bed button
 | ||||
|             auto drop_to_bed_button = [=](wxWindow* parent) { | ||||
|                 auto btn = new ScalableButton(parent, wxID_ANY, ScalableBitmap(parent, "drop_to_bed.png")); | ||||
|                 btn->SetToolTip(_(L("Drop to bed"))); | ||||
|                 m_drop_to_bed_button = btn; | ||||
|                 auto sizer = new wxBoxSizer(wxHORIZONTAL); | ||||
|                 sizer->Add(btn, wxBU_EXACTFIT); | ||||
|                 btn->Bind(wxEVT_BUTTON, [=](wxCommandEvent &e) { | ||||
|                     // ???
 | ||||
|                     GLCanvas3D* canvas = wxGetApp().plater()->canvas3D(); | ||||
|                     Selection& selection = canvas->get_selection(); | ||||
| 
 | ||||
|                     if (selection.is_single_volume() || selection.is_single_modifier()) { | ||||
|                         const GLVolume* volume = selection.get_volume(*selection.get_volume_idxs().begin()); | ||||
| 
 | ||||
|                         const Geometry::Transformation& instance_trafo = volume->get_instance_transformation(); | ||||
|                         Vec3d diff = m_cache.position - instance_trafo.get_matrix(true).inverse() * Vec3d(0., 0., get_volume_min_z(volume)); | ||||
| 
 | ||||
|                         change_position_value(0, diff.x()); | ||||
|                         change_position_value(1, diff.y()); | ||||
|                         change_position_value(2, diff.z()); | ||||
|                     } | ||||
|                 }); | ||||
|             return sizer; | ||||
|             }; | ||||
|             line.append_widget(drop_to_bed_button); | ||||
|         } | ||||
|         // Add empty bmp (Its size have to be equal to PrusaLockButton) in front of "Size" option to label alignment
 | ||||
|         else if (option_name == "Size") { | ||||
|             line.near_label_widget = [this](wxWindow* parent) { | ||||
|  | @ -536,11 +586,13 @@ void ObjectManipulation::update_reset_buttons_visibility() | |||
| 
 | ||||
|     bool show_rotation = false; | ||||
|     bool show_scale = false; | ||||
|     bool show_drop_to_bed = false; | ||||
| 
 | ||||
|     if (selection.is_single_full_instance() || selection.is_single_modifier() || selection.is_single_volume()) { | ||||
|         const GLVolume* volume = selection.get_volume(*selection.get_volume_idxs().begin()); | ||||
|         Vec3d rotation; | ||||
|         Vec3d scale; | ||||
|         double min_z = 0.; | ||||
| 
 | ||||
|         if (selection.is_single_full_instance()) { | ||||
|             rotation = volume->get_instance_rotation(); | ||||
|  | @ -549,14 +601,17 @@ void ObjectManipulation::update_reset_buttons_visibility() | |||
|         else { | ||||
|             rotation = volume->get_volume_rotation(); | ||||
|             scale = volume->get_volume_scaling_factor(); | ||||
|             min_z = get_volume_min_z(volume); | ||||
|         } | ||||
|         show_rotation = !rotation.isApprox(Vec3d::Zero()); | ||||
|         show_scale = !scale.isApprox(Vec3d::Ones()); | ||||
|         show_drop_to_bed = (std::abs(min_z) > EPSILON); | ||||
|     } | ||||
| 
 | ||||
|     wxGetApp().CallAfter([this, show_rotation, show_scale]{ | ||||
|     wxGetApp().CallAfter([this, show_rotation, show_scale, show_drop_to_bed]{ | ||||
|         m_reset_rotation_button->Show(show_rotation); | ||||
|         m_reset_scale_button->Show(show_scale); | ||||
|         m_drop_to_bed_button->Show(show_drop_to_bed); | ||||
|     }); | ||||
| } | ||||
| 
 | ||||
|  | @ -869,6 +924,7 @@ void ObjectManipulation::msw_rescale() | |||
|     m_mirror_bitmap_hidden.msw_rescale(); | ||||
|     m_reset_scale_button->msw_rescale(); | ||||
|     m_reset_rotation_button->msw_rescale(); | ||||
|     m_drop_to_bed_button->msw_rescale(); | ||||
| 
 | ||||
|     get_og()->msw_rescale(); | ||||
| } | ||||
|  |  | |||
|  | @ -56,6 +56,7 @@ class ObjectManipulation : public OG_Settings | |||
|     // Non-owning pointers to the reset buttons, so we can hide and show them.
 | ||||
|     ScalableButton* m_reset_scale_button = nullptr; | ||||
|     ScalableButton* m_reset_rotation_button = nullptr; | ||||
|     ScalableButton* m_drop_to_bed_button = nullptr; | ||||
| 
 | ||||
|     // Mirroring buttons and their current state
 | ||||
|     enum MirrorButtonState { | ||||
|  |  | |||
|  | @ -132,18 +132,12 @@ void GLGizmoBase::Grabber::render_face(float half_size) const | |||
|     glsafe(::glEnd()); | ||||
| } | ||||
| 
 | ||||
| #if ENABLE_SVG_ICONS | ||||
| GLGizmoBase::GLGizmoBase(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id) | ||||
| #else | ||||
| GLGizmoBase::GLGizmoBase(GLCanvas3D& parent, unsigned int sprite_id) | ||||
| #endif // ENABLE_SVG_ICONS
 | ||||
|     : m_parent(parent) | ||||
|     , m_group_id(-1) | ||||
|     , m_state(Off) | ||||
|     , m_shortcut_key(0) | ||||
| #if ENABLE_SVG_ICONS | ||||
|     , m_icon_filename(icon_filename) | ||||
| #endif // ENABLE_SVG_ICONS
 | ||||
|     , m_sprite_id(sprite_id) | ||||
|     , m_hover_id(-1) | ||||
|     , m_dragging(false) | ||||
|  |  | |||
|  | @ -89,9 +89,7 @@ protected: | |||
|     int m_group_id; | ||||
|     EState m_state; | ||||
|     int m_shortcut_key; | ||||
| #if ENABLE_SVG_ICONS | ||||
|     std::string m_icon_filename; | ||||
| #endif // ENABLE_SVG_ICONS
 | ||||
|     unsigned int m_sprite_id; | ||||
|     int m_hover_id; | ||||
|     bool m_dragging; | ||||
|  | @ -102,11 +100,7 @@ protected: | |||
|     ImGuiWrapper* m_imgui; | ||||
| 
 | ||||
| public: | ||||
| #if ENABLE_SVG_ICONS | ||||
|     GLGizmoBase(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id); | ||||
| #else | ||||
|     GLGizmoBase(GLCanvas3D& parent, unsigned int sprite_id); | ||||
| #endif // ENABLE_SVG_ICONS
 | ||||
|     virtual ~GLGizmoBase() {} | ||||
| 
 | ||||
|     bool init() { return on_init(); } | ||||
|  | @ -122,9 +116,7 @@ public: | |||
|     int get_shortcut_key() const { return m_shortcut_key; } | ||||
|     void set_shortcut_key(int key) { m_shortcut_key = key; } | ||||
| 
 | ||||
| #if ENABLE_SVG_ICONS | ||||
|     const std::string& get_icon_filename() const { return m_icon_filename; } | ||||
| #endif // ENABLE_SVG_ICONS
 | ||||
| 
 | ||||
|     bool is_activable(const Selection& selection) const { return on_is_activable(selection); } | ||||
|     bool is_selectable() const { return on_is_selectable(); } | ||||
|  |  | |||
|  | @ -19,13 +19,8 @@ const double GLGizmoCut::Offset = 10.0; | |||
| const double GLGizmoCut::Margin = 20.0; | ||||
| const std::array<float, 3> GLGizmoCut::GrabberColor = { 1.0, 0.5, 0.0 }; | ||||
| 
 | ||||
| #if ENABLE_SVG_ICONS | ||||
| GLGizmoCut::GLGizmoCut(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id) | ||||
|     : GLGizmoBase(parent, icon_filename, sprite_id) | ||||
| #else | ||||
| GLGizmoCut::GLGizmoCut(GLCanvas3D& parent, unsigned int sprite_id) | ||||
|     : GLGizmoBase(parent, sprite_id) | ||||
| #endif // ENABLE_SVG_ICONS
 | ||||
|     , m_cut_z(0.0) | ||||
|     , m_max_z(0.0) | ||||
|     , m_keep_upper(true) | ||||
|  |  | |||
|  | @ -23,11 +23,7 @@ class GLGizmoCut : public GLGizmoBase | |||
|     bool m_rotate_lower; | ||||
| 
 | ||||
| public: | ||||
| #if ENABLE_SVG_ICONS | ||||
|     GLGizmoCut(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id); | ||||
| #else | ||||
|     GLGizmoCut(GLCanvas3D& parent, unsigned int sprite_id); | ||||
| #endif // ENABLE_SVG_ICONS
 | ||||
| 
 | ||||
| protected: | ||||
|     virtual bool on_init(); | ||||
|  |  | |||
|  | @ -9,13 +9,8 @@ namespace Slic3r { | |||
| namespace GUI { | ||||
| 
 | ||||
| 
 | ||||
| #if ENABLE_SVG_ICONS | ||||
| GLGizmoFlatten::GLGizmoFlatten(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id) | ||||
|     : GLGizmoBase(parent, icon_filename, sprite_id) | ||||
| #else | ||||
| GLGizmoFlatten::GLGizmoFlatten(GLCanvas3D& parent, unsigned int sprite_id) | ||||
|     : GLGizmoBase(parent, sprite_id) | ||||
| #endif // ENABLE_SVG_ICONS
 | ||||
|     , m_normal(Vec3d::Zero()) | ||||
|     , m_starting_center(Vec3d::Zero()) | ||||
| { | ||||
|  |  | |||
|  | @ -37,11 +37,7 @@ private: | |||
|     bool is_plane_update_necessary() const; | ||||
| 
 | ||||
| public: | ||||
| #if ENABLE_SVG_ICONS | ||||
|     GLGizmoFlatten(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id); | ||||
| #else | ||||
|     GLGizmoFlatten(GLCanvas3D& parent, unsigned int sprite_id); | ||||
| #endif // ENABLE_SVG_ICONS
 | ||||
| 
 | ||||
|     void set_flattening_data(const ModelObject* model_object); | ||||
|     Vec3d get_flattening_normal() const; | ||||
|  |  | |||
|  | @ -10,13 +10,8 @@ namespace GUI { | |||
| 
 | ||||
| const double GLGizmoMove3D::Offset = 10.0; | ||||
| 
 | ||||
| #if ENABLE_SVG_ICONS | ||||
| GLGizmoMove3D::GLGizmoMove3D(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id) | ||||
|     : GLGizmoBase(parent, icon_filename, sprite_id) | ||||
| #else | ||||
| GLGizmoMove3D::GLGizmoMove3D(GLCanvas3D& parent, unsigned int sprite_id) | ||||
|     : GLGizmoBase(parent, sprite_id) | ||||
| #endif // ENABLE_SVG_ICONS
 | ||||
|     , m_displacement(Vec3d::Zero()) | ||||
|     , m_snap_step(1.0) | ||||
|     , m_starting_drag_position(Vec3d::Zero()) | ||||
|  |  | |||
|  | @ -22,11 +22,7 @@ class GLGizmoMove3D : public GLGizmoBase | |||
|     GLUquadricObj* m_quadric; | ||||
| 
 | ||||
| public: | ||||
| #if ENABLE_SVG_ICONS | ||||
|     GLGizmoMove3D(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id); | ||||
| #else | ||||
|     GLGizmoMove3D(GLCanvas3D& parent, unsigned int sprite_id); | ||||
| #endif // ENABLE_SVG_ICONS
 | ||||
|     virtual ~GLGizmoMove3D(); | ||||
| 
 | ||||
|     double get_snap_step(double step) const { return m_snap_step; } | ||||
|  |  | |||
|  | @ -19,11 +19,7 @@ const unsigned int GLGizmoRotate::SnapRegionsCount = 8; | |||
| const float GLGizmoRotate::GrabberOffset = 0.15f; // in percent of radius
 | ||||
| 
 | ||||
| GLGizmoRotate::GLGizmoRotate(GLCanvas3D& parent, GLGizmoRotate::Axis axis) | ||||
| #if ENABLE_SVG_ICONS | ||||
|     : GLGizmoBase(parent, "", -1) | ||||
| #else | ||||
|     : GLGizmoBase(parent, -1) | ||||
| #endif // ENABLE_SVG_ICONS
 | ||||
|     , m_axis(axis) | ||||
|     , m_angle(0.0) | ||||
|     , m_quadric(nullptr) | ||||
|  | @ -40,11 +36,7 @@ GLGizmoRotate::GLGizmoRotate(GLCanvas3D& parent, GLGizmoRotate::Axis axis) | |||
| } | ||||
| 
 | ||||
| GLGizmoRotate::GLGizmoRotate(const GLGizmoRotate& other) | ||||
| #if ENABLE_SVG_ICONS | ||||
|     : GLGizmoBase(other.m_parent, other.m_icon_filename, other.m_sprite_id) | ||||
| #else | ||||
|     : GLGizmoBase(other.m_parent, other.m_sprite_id) | ||||
| #endif // ENABLE_SVG_ICONS
 | ||||
|     , m_axis(other.m_axis) | ||||
|     , m_angle(other.m_angle) | ||||
|     , m_quadric(nullptr) | ||||
|  | @ -417,13 +409,8 @@ Vec3d GLGizmoRotate::mouse_position_in_local_plane(const Linef3& mouse_ray, cons | |||
|     return transform(mouse_ray, m).intersect_plane(0.0); | ||||
| } | ||||
| 
 | ||||
| #if ENABLE_SVG_ICONS | ||||
| GLGizmoRotate3D::GLGizmoRotate3D(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id) | ||||
|     : GLGizmoBase(parent, icon_filename, sprite_id) | ||||
| #else | ||||
| GLGizmoRotate3D::GLGizmoRotate3D(GLCanvas3D& parent, unsigned int sprite_id) | ||||
|     : GLGizmoBase(parent, sprite_id) | ||||
| #endif // ENABLE_SVG_ICONS
 | ||||
| { | ||||
|     m_gizmos.emplace_back(parent, GLGizmoRotate::X); | ||||
|     m_gizmos.emplace_back(parent, GLGizmoRotate::Y); | ||||
|  |  | |||
|  | @ -76,11 +76,7 @@ class GLGizmoRotate3D : public GLGizmoBase | |||
|     std::vector<GLGizmoRotate> m_gizmos; | ||||
| 
 | ||||
| public: | ||||
| #if ENABLE_SVG_ICONS | ||||
|     GLGizmoRotate3D(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id); | ||||
| #else | ||||
|     GLGizmoRotate3D(GLCanvas3D& parent, unsigned int sprite_id); | ||||
| #endif // ENABLE_SVG_ICONS
 | ||||
| 
 | ||||
|     Vec3d get_rotation() const { return Vec3d(m_gizmos[X].get_angle(), m_gizmos[Y].get_angle(), m_gizmos[Z].get_angle()); } | ||||
|     void set_rotation(const Vec3d& rotation) { m_gizmos[X].set_angle(rotation(0)); m_gizmos[Y].set_angle(rotation(1)); m_gizmos[Z].set_angle(rotation(2)); } | ||||
|  |  | |||
|  | @ -13,13 +13,8 @@ namespace GUI { | |||
| 
 | ||||
| const float GLGizmoScale3D::Offset = 5.0f; | ||||
| 
 | ||||
| #if ENABLE_SVG_ICONS | ||||
| GLGizmoScale3D::GLGizmoScale3D(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id) | ||||
|     : GLGizmoBase(parent, icon_filename, sprite_id) | ||||
| #else | ||||
| GLGizmoScale3D::GLGizmoScale3D(GLCanvas3D& parent, unsigned int sprite_id) | ||||
|     : GLGizmoBase(parent, sprite_id) | ||||
| #endif // ENABLE_SVG_ICONS
 | ||||
|     , m_scale(Vec3d::Ones()) | ||||
|     , m_offset(Vec3d::Zero()) | ||||
|     , m_snap_step(0.05) | ||||
|  |  | |||
|  | @ -32,11 +32,7 @@ class GLGizmoScale3D : public GLGizmoBase | |||
|     StartingData m_starting; | ||||
| 
 | ||||
| public: | ||||
| #if ENABLE_SVG_ICONS | ||||
|     GLGizmoScale3D(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id); | ||||
| #else | ||||
|     GLGizmoScale3D(GLCanvas3D& parent, unsigned int sprite_id); | ||||
| #endif // ENABLE_SVG_ICONS
 | ||||
| 
 | ||||
|     double get_snap_step(double step) const { return m_snap_step; } | ||||
|     void set_snap_step(double step) { m_snap_step = step; } | ||||
|  |  | |||
|  | @ -19,13 +19,8 @@ | |||
| namespace Slic3r { | ||||
| namespace GUI { | ||||
| 
 | ||||
| #if ENABLE_SVG_ICONS | ||||
| GLGizmoSlaSupports::GLGizmoSlaSupports(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id) | ||||
|     : GLGizmoBase(parent, icon_filename, sprite_id) | ||||
| #else | ||||
| GLGizmoSlaSupports::GLGizmoSlaSupports(GLCanvas3D& parent, unsigned int sprite_id) | ||||
|     : GLGizmoBase(parent, sprite_id) | ||||
| #endif // ENABLE_SVG_ICONS
 | ||||
|     , m_quadric(nullptr) | ||||
|     , m_its(nullptr) | ||||
| { | ||||
|  |  | |||
|  | @ -58,11 +58,7 @@ private: | |||
|     }; | ||||
| 
 | ||||
| public: | ||||
| #if ENABLE_SVG_ICONS | ||||
|     GLGizmoSlaSupports(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id); | ||||
| #else | ||||
|     GLGizmoSlaSupports(GLCanvas3D& parent, unsigned int sprite_id); | ||||
| #endif // ENABLE_SVG_ICONS
 | ||||
|     virtual ~GLGizmoSlaSupports(); | ||||
|     void set_sla_support_data(ModelObject* model_object, const Selection& selection); | ||||
|     bool gizmo_event(SLAGizmoEventType action, const Vec2d& mouse_position, bool shift_down, bool alt_down, bool control_down); | ||||
|  |  | |||
|  | @ -12,17 +12,12 @@ | |||
| namespace Slic3r { | ||||
| namespace GUI { | ||||
| 
 | ||||
| #if ENABLE_SVG_ICONS | ||||
|     const float GLGizmosManager::Default_Icons_Size = 64; | ||||
| #endif // ENABLE_SVG_ICONS
 | ||||
| const float GLGizmosManager::Default_Icons_Size = 64; | ||||
| 
 | ||||
| GLGizmosManager::GLGizmosManager() | ||||
|     : m_enabled(false) | ||||
| #if ENABLE_SVG_ICONS | ||||
|     , m_icons_texture_dirty(true) | ||||
| #endif // ENABLE_SVG_ICONS
 | ||||
|     , m_current(Undefined) | ||||
| #if ENABLE_SVG_ICONS | ||||
|     , m_overlay_icons_size(Default_Icons_Size) | ||||
|     , m_overlay_scale(1.0f) | ||||
|     , m_overlay_border(5.0f) | ||||
|  | @ -30,11 +25,6 @@ GLGizmosManager::GLGizmosManager() | |||
|     , m_tooltip("") | ||||
| { | ||||
| } | ||||
| #else | ||||
| { | ||||
|     set_overlay_scale(1.0); | ||||
| } | ||||
| #endif // ENABLE_SVG_ICONS
 | ||||
| 
 | ||||
| GLGizmosManager::~GLGizmosManager() | ||||
| { | ||||
|  | @ -43,20 +33,6 @@ GLGizmosManager::~GLGizmosManager() | |||
| 
 | ||||
| bool GLGizmosManager::init(GLCanvas3D& parent) | ||||
| { | ||||
| #if !ENABLE_SVG_ICONS | ||||
|     m_icons_texture.metadata.filename = "gizmos.png"; | ||||
|     m_icons_texture.metadata.icon_size = 64; | ||||
| 
 | ||||
|     if (!m_icons_texture.metadata.filename.empty()) | ||||
|     { | ||||
|         if (!m_icons_texture.texture.load_from_file(resources_dir() + "/icons/" + m_icons_texture.metadata.filename, false, true)) | ||||
|         { | ||||
|             reset(); | ||||
|             return false; | ||||
|         } | ||||
|     } | ||||
| #endif // !ENABLE_SVG_ICONS
 | ||||
| 
 | ||||
|     m_background_texture.metadata.filename = "toolbar_background.png"; | ||||
|     m_background_texture.metadata.left = 16; | ||||
|     m_background_texture.metadata.top = 16; | ||||
|  | @ -72,11 +48,7 @@ bool GLGizmosManager::init(GLCanvas3D& parent) | |||
|         } | ||||
|     } | ||||
| 
 | ||||
| #if ENABLE_SVG_ICONS | ||||
|     GLGizmoBase* gizmo = new GLGizmoMove3D(parent, "move.svg", 0); | ||||
| #else | ||||
|     GLGizmoBase* gizmo = new GLGizmoMove3D(parent, 0); | ||||
| #endif // ENABLE_SVG_ICONS
 | ||||
|     if (gizmo == nullptr) | ||||
|         return false; | ||||
| 
 | ||||
|  | @ -85,11 +57,7 @@ bool GLGizmosManager::init(GLCanvas3D& parent) | |||
| 
 | ||||
|     m_gizmos.insert(GizmosMap::value_type(Move, gizmo)); | ||||
| 
 | ||||
| #if ENABLE_SVG_ICONS | ||||
|     gizmo = new GLGizmoScale3D(parent, "scale.svg", 1); | ||||
| #else | ||||
|     gizmo = new GLGizmoScale3D(parent, 1); | ||||
| #endif // ENABLE_SVG_ICONS
 | ||||
|     if (gizmo == nullptr) | ||||
|         return false; | ||||
| 
 | ||||
|  | @ -98,11 +66,7 @@ bool GLGizmosManager::init(GLCanvas3D& parent) | |||
| 
 | ||||
|     m_gizmos.insert(GizmosMap::value_type(Scale, gizmo)); | ||||
| 
 | ||||
| #if ENABLE_SVG_ICONS | ||||
|     gizmo = new GLGizmoRotate3D(parent, "rotate.svg", 2); | ||||
| #else | ||||
|     gizmo = new GLGizmoRotate3D(parent, 2); | ||||
| #endif // ENABLE_SVG_ICONS
 | ||||
|     if (gizmo == nullptr) | ||||
|     { | ||||
|         reset(); | ||||
|  | @ -117,11 +81,7 @@ bool GLGizmosManager::init(GLCanvas3D& parent) | |||
| 
 | ||||
|     m_gizmos.insert(GizmosMap::value_type(Rotate, gizmo)); | ||||
| 
 | ||||
| #if ENABLE_SVG_ICONS | ||||
|     gizmo = new GLGizmoFlatten(parent, "place.svg", 3); | ||||
| #else | ||||
|     gizmo = new GLGizmoFlatten(parent, 3); | ||||
| #endif // ENABLE_SVG_ICONS
 | ||||
|     if (gizmo == nullptr) | ||||
|         return false; | ||||
| 
 | ||||
|  | @ -132,11 +92,7 @@ bool GLGizmosManager::init(GLCanvas3D& parent) | |||
| 
 | ||||
|     m_gizmos.insert(GizmosMap::value_type(Flatten, gizmo)); | ||||
| 
 | ||||
| #if ENABLE_SVG_ICONS | ||||
|     gizmo = new GLGizmoCut(parent, "cut.svg", 4); | ||||
| #else | ||||
|     gizmo = new GLGizmoCut(parent, 4); | ||||
| #endif // ENABLE_SVG_ICONS
 | ||||
|     if (gizmo == nullptr) | ||||
|         return false; | ||||
| 
 | ||||
|  | @ -147,11 +103,7 @@ bool GLGizmosManager::init(GLCanvas3D& parent) | |||
| 
 | ||||
|     m_gizmos.insert(GizmosMap::value_type(Cut, gizmo)); | ||||
| 
 | ||||
| #if ENABLE_SVG_ICONS | ||||
|     gizmo = new GLGizmoSlaSupports(parent, "sla_supports.svg", 5); | ||||
| #else | ||||
|     gizmo = new GLGizmoSlaSupports(parent, 5); | ||||
| #endif // ENABLE_SVG_ICONS
 | ||||
|     if (gizmo == nullptr) | ||||
|         return false; | ||||
| 
 | ||||
|  | @ -165,7 +117,6 @@ bool GLGizmosManager::init(GLCanvas3D& parent) | |||
|     return true; | ||||
| } | ||||
| 
 | ||||
| #if ENABLE_SVG_ICONS | ||||
| void GLGizmosManager::set_overlay_icon_size(float size) | ||||
| { | ||||
|     if (m_overlay_icons_size != size) | ||||
|  | @ -174,21 +125,14 @@ void GLGizmosManager::set_overlay_icon_size(float size) | |||
|         m_icons_texture_dirty = true; | ||||
|     } | ||||
| } | ||||
| #endif // ENABLE_SVG_ICONS
 | ||||
| 
 | ||||
| void GLGizmosManager::set_overlay_scale(float scale) | ||||
| { | ||||
| #if ENABLE_SVG_ICONS | ||||
|     if (m_overlay_scale != scale) | ||||
|     { | ||||
|         m_overlay_scale = scale; | ||||
|         m_icons_texture_dirty = true; | ||||
|     } | ||||
| #else | ||||
|     m_overlay_icons_scale = scale; | ||||
|     m_overlay_border = 5.0f * scale; | ||||
|     m_overlay_gap_y = 5.0f * scale; | ||||
| #endif // ENABLE_SVG_ICONS
 | ||||
| } | ||||
| 
 | ||||
| void GLGizmosManager::refresh_on_off_state(const Selection& selection) | ||||
|  | @ -526,10 +470,8 @@ void GLGizmosManager::render_overlay(const GLCanvas3D& canvas, const Selection& | |||
|     if (!m_enabled) | ||||
|         return; | ||||
| 
 | ||||
| #if ENABLE_SVG_ICONS | ||||
|     if (m_icons_texture_dirty) | ||||
|         generate_icons_texture(); | ||||
| #endif // ENABLE_SVG_ICONS
 | ||||
| 
 | ||||
|     do_render_overlay(canvas, selection); | ||||
| } | ||||
|  | @ -935,11 +877,7 @@ void GLGizmosManager::do_render_overlay(const GLCanvas3D& canvas, const Selectio | |||
| 
 | ||||
|     float height = get_total_overlay_height(); | ||||
|     float width = get_total_overlay_width(); | ||||
| #if ENABLE_SVG_ICONS | ||||
|     float scaled_border = m_overlay_border * m_overlay_scale * inv_zoom; | ||||
| #else | ||||
|     float scaled_border = m_overlay_border * inv_zoom; | ||||
| #endif // ENABLE_SVG_ICONS
 | ||||
| 
 | ||||
|     float top_x = (-0.5f * cnv_w) * inv_zoom; | ||||
|     float top_y = (0.5f * height) * inv_zoom; | ||||
|  | @ -1015,7 +953,6 @@ void GLGizmosManager::do_render_overlay(const GLCanvas3D& canvas, const Selectio | |||
|         } | ||||
|     } | ||||
| 
 | ||||
| #if ENABLE_SVG_ICONS | ||||
|     top_x += scaled_border; | ||||
|     top_y -= scaled_border; | ||||
|     float scaled_gap_y = m_overlay_gap_y * m_overlay_scale * inv_zoom; | ||||
|  | @ -1027,21 +964,9 @@ void GLGizmosManager::do_render_overlay(const GLCanvas3D& canvas, const Selectio | |||
|     unsigned int tex_height = m_icons_texture.get_height(); | ||||
|     float inv_tex_width = (tex_width != 0) ? 1.0f / (float)tex_width : 0.0f; | ||||
|     float inv_tex_height = (tex_height != 0) ? 1.0f / (float)tex_height : 0.0f; | ||||
| #else | ||||
|     top_x += m_overlay_border * inv_zoom; | ||||
|     top_y -= m_overlay_border * inv_zoom; | ||||
|     float scaled_gap_y = m_overlay_gap_y * inv_zoom; | ||||
| 
 | ||||
|     float scaled_icons_size = (float)m_icons_texture.metadata.icon_size * m_overlay_icons_scale * inv_zoom; | ||||
|     unsigned int icons_texture_id = m_icons_texture.texture.get_id(); | ||||
|     unsigned int texture_size = m_icons_texture.texture.get_width(); | ||||
|     float inv_texture_size = (texture_size != 0) ? 1.0f / (float)texture_size : 0.0f; | ||||
| #endif // ENABLE_SVG_ICONS
 | ||||
| 
 | ||||
| #if ENABLE_SVG_ICONS | ||||
|     if ((icons_texture_id == 0) || (tex_width <= 0) || (tex_height <= 0)) | ||||
|         return; | ||||
| #endif // ENABLE_SVG_ICONS
 | ||||
| 
 | ||||
|     for (GizmosMap::const_iterator it = m_gizmos.begin(); it != m_gizmos.end(); ++it) | ||||
|     { | ||||
|  | @ -1051,78 +976,44 @@ void GLGizmosManager::do_render_overlay(const GLCanvas3D& canvas, const Selectio | |||
|         unsigned int sprite_id = it->second->get_sprite_id(); | ||||
|         GLGizmoBase::EState state = it->second->get_state(); | ||||
| 
 | ||||
| #if ENABLE_SVG_ICONS | ||||
|         float u_icon_size = m_overlay_icons_size * m_overlay_scale * inv_tex_width; | ||||
|         float v_icon_size = m_overlay_icons_size * m_overlay_scale * inv_tex_height; | ||||
|         float v_top = sprite_id * v_icon_size; | ||||
|         float u_left = state * u_icon_size; | ||||
|         float v_bottom = v_top + v_icon_size; | ||||
|         float u_right = u_left + u_icon_size; | ||||
| #else | ||||
|         float uv_icon_size = (float)m_icons_texture.metadata.icon_size * inv_texture_size; | ||||
|         float v_top = sprite_id * uv_icon_size; | ||||
|         float u_left = state * uv_icon_size; | ||||
|         float v_bottom = v_top + uv_icon_size; | ||||
|         float u_right = u_left + uv_icon_size; | ||||
| #endif // ENABLE_SVG_ICONS
 | ||||
| 
 | ||||
|         GLTexture::render_sub_texture(icons_texture_id, top_x, top_x + scaled_icons_size, top_y - scaled_icons_size, top_y, { { u_left, v_bottom }, { u_right, v_bottom }, { u_right, v_top }, { u_left, v_top } }); | ||||
|         if (it->second->get_state() == GLGizmoBase::On) { | ||||
|             float toolbar_top = (float)cnv_h - canvas.get_view_toolbar_height(); | ||||
| #if ENABLE_SVG_ICONS | ||||
|             it->second->render_input_window(width, 0.5f * cnv_h - top_y * zoom, toolbar_top, selection); | ||||
| #else | ||||
|             it->second->render_input_window(2.0f * m_overlay_border + scaled_icons_size * zoom, 0.5f * cnv_h - top_y * zoom, toolbar_top, selection); | ||||
| #endif // ENABLE_SVG_ICONS
 | ||||
|         } | ||||
| #if ENABLE_SVG_ICONS | ||||
|         top_y -= scaled_stride_y; | ||||
| #else | ||||
|         top_y -= (scaled_icons_size + scaled_gap_y); | ||||
| #endif // ENABLE_SVG_ICONS
 | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| float GLGizmosManager::get_total_overlay_height() const | ||||
| { | ||||
| #if ENABLE_SVG_ICONS | ||||
|     float scaled_icons_size = m_overlay_icons_size * m_overlay_scale; | ||||
|     float scaled_border = m_overlay_border * m_overlay_scale; | ||||
|     float scaled_gap_y = m_overlay_gap_y * m_overlay_scale; | ||||
|     float scaled_stride_y = scaled_icons_size + scaled_gap_y; | ||||
|     float height = 2.0f * scaled_border; | ||||
| #else | ||||
|     float height = 2.0f * m_overlay_border; | ||||
| 
 | ||||
|     float scaled_icons_size = (float)m_icons_texture.metadata.icon_size * m_overlay_icons_scale; | ||||
| #endif // ENABLE_SVG_ICONS
 | ||||
| 
 | ||||
|     for (GizmosMap::const_iterator it = m_gizmos.begin(); it != m_gizmos.end(); ++it) | ||||
|     { | ||||
|         if ((it->second == nullptr) || !it->second->is_selectable()) | ||||
|             continue; | ||||
| 
 | ||||
| #if ENABLE_SVG_ICONS | ||||
|         height += scaled_stride_y; | ||||
| #else | ||||
|         height += (scaled_icons_size + m_overlay_gap_y); | ||||
| #endif // ENABLE_SVG_ICONS
 | ||||
|     } | ||||
| 
 | ||||
| #if ENABLE_SVG_ICONS | ||||
|     return height - scaled_gap_y; | ||||
| #else | ||||
|     return height - m_overlay_gap_y; | ||||
| #endif // ENABLE_SVG_ICONS
 | ||||
| } | ||||
| 
 | ||||
| float GLGizmosManager::get_total_overlay_width() const | ||||
| { | ||||
| #if ENABLE_SVG_ICONS | ||||
|     return (2.0f * m_overlay_border + m_overlay_icons_size) * m_overlay_scale; | ||||
| #else | ||||
|     return (float)m_icons_texture.metadata.icon_size * m_overlay_icons_scale + 2.0f * m_overlay_border; | ||||
| #endif // ENABLE_SVG_ICONS
 | ||||
| } | ||||
| 
 | ||||
| GLGizmoBase* GLGizmosManager::get_current() const | ||||
|  | @ -1131,7 +1022,6 @@ GLGizmoBase* GLGizmosManager::get_current() const | |||
|     return (it != m_gizmos.end()) ? it->second : nullptr; | ||||
| } | ||||
| 
 | ||||
| #if ENABLE_SVG_ICONS | ||||
| bool GLGizmosManager::generate_icons_texture() const | ||||
| { | ||||
|     std::string path = resources_dir() + "/icons/"; | ||||
|  | @ -1157,7 +1047,6 @@ bool GLGizmosManager::generate_icons_texture() const | |||
| 
 | ||||
|     return res; | ||||
| } | ||||
| #endif // ENABLE_SVG_ICONS
 | ||||
| 
 | ||||
| void GLGizmosManager::update_on_off_state(const GLCanvas3D& canvas, const Vec2d& mouse_pos, const Selection& selection) | ||||
| { | ||||
|  | @ -1167,27 +1056,18 @@ void GLGizmosManager::update_on_off_state(const GLCanvas3D& canvas, const Vec2d& | |||
|     float cnv_h = (float)canvas.get_canvas_size().get_height(); | ||||
|     float height = get_total_overlay_height(); | ||||
| 
 | ||||
| #if ENABLE_SVG_ICONS | ||||
|     float scaled_icons_size = m_overlay_icons_size * m_overlay_scale; | ||||
|     float scaled_border = m_overlay_border * m_overlay_scale; | ||||
|     float scaled_gap_y = m_overlay_gap_y * m_overlay_scale; | ||||
|     float scaled_stride_y = scaled_icons_size + scaled_gap_y; | ||||
|     float top_y = 0.5f * (cnv_h - height) + scaled_border; | ||||
| #else | ||||
|     float top_y = 0.5f * (cnv_h - height) + m_overlay_border; | ||||
|     float scaled_icons_size = (float)m_icons_texture.metadata.icon_size * m_overlay_icons_scale; | ||||
| #endif // ENABLE_SVG_ICONS
 | ||||
| 
 | ||||
|     for (GizmosMap::iterator it = m_gizmos.begin(); it != m_gizmos.end(); ++it) | ||||
|     { | ||||
|         if ((it->second == nullptr) || !it->second->is_selectable()) | ||||
|             continue; | ||||
| 
 | ||||
| #if ENABLE_SVG_ICONS | ||||
|         bool inside = (scaled_border <= (float)mouse_pos(0)) && ((float)mouse_pos(0) <= scaled_border + scaled_icons_size) && (top_y <= (float)mouse_pos(1)) && ((float)mouse_pos(1) <= top_y + scaled_icons_size); | ||||
| #else | ||||
|         bool inside = (m_overlay_border <= (float)mouse_pos(0)) && ((float)mouse_pos(0) <= m_overlay_border + scaled_icons_size) && (top_y <= (float)mouse_pos(1)) && ((float)mouse_pos(1) <= top_y + scaled_icons_size); | ||||
| #endif // ENABLE_SVG_ICONS
 | ||||
|         if (it->second->is_activable(selection) && inside) | ||||
|         { | ||||
|             if ((it->second->get_state() == GLGizmoBase::On)) | ||||
|  | @ -1204,11 +1084,7 @@ void GLGizmosManager::update_on_off_state(const GLCanvas3D& canvas, const Vec2d& | |||
|         else | ||||
|             it->second->set_state(GLGizmoBase::Off); | ||||
| 
 | ||||
| #if ENABLE_SVG_ICONS | ||||
|         top_y += scaled_stride_y; | ||||
| #else | ||||
|         top_y += (scaled_icons_size + m_overlay_gap_y); | ||||
| #endif // ENABLE_SVG_ICONS
 | ||||
|     } | ||||
| 
 | ||||
|     GizmosMap::iterator it = m_gizmos.find(m_current); | ||||
|  | @ -1227,38 +1103,25 @@ std::string GLGizmosManager::update_hover_state(const GLCanvas3D& canvas, const | |||
| 
 | ||||
|     float cnv_h = (float)canvas.get_canvas_size().get_height(); | ||||
|     float height = get_total_overlay_height(); | ||||
| #if ENABLE_SVG_ICONS | ||||
|     float scaled_icons_size = m_overlay_icons_size * m_overlay_scale; | ||||
|     float scaled_border = m_overlay_border * m_overlay_scale; | ||||
|     float scaled_gap_y = m_overlay_gap_y * m_overlay_scale; | ||||
|     float scaled_stride_y = scaled_icons_size + scaled_gap_y; | ||||
|     float top_y = 0.5f * (cnv_h - height) + scaled_border; | ||||
| #else | ||||
|     float top_y = 0.5f * (cnv_h - height) + m_overlay_border; | ||||
|     float scaled_icons_size = (float)m_icons_texture.metadata.icon_size * m_overlay_icons_scale; | ||||
| #endif // ENABLE_SVG_ICONS
 | ||||
| 
 | ||||
|     for (GizmosMap::iterator it = m_gizmos.begin(); it != m_gizmos.end(); ++it) | ||||
|     { | ||||
|         if ((it->second == nullptr) || !it->second->is_selectable()) | ||||
|             continue; | ||||
| 
 | ||||
| #if ENABLE_SVG_ICONS | ||||
|         bool inside = (scaled_border <= (float)mouse_pos(0)) && ((float)mouse_pos(0) <= scaled_border + scaled_icons_size) && (top_y <= (float)mouse_pos(1)) && ((float)mouse_pos(1) <= top_y + scaled_icons_size); | ||||
| #else | ||||
|         bool inside = (m_overlay_border <= (float)mouse_pos(0)) && ((float)mouse_pos(0) <= m_overlay_border + scaled_icons_size) && (top_y <= (float)mouse_pos(1)) && ((float)mouse_pos(1) <= top_y + scaled_icons_size); | ||||
| #endif // ENABLE_SVG_ICONS
 | ||||
|         if (inside) | ||||
|             name = it->second->get_name(); | ||||
| 
 | ||||
|         if (it->second->is_activable(selection) && (it->second->get_state() != GLGizmoBase::On)) | ||||
|             it->second->set_state(inside ? GLGizmoBase::Hover : GLGizmoBase::Off); | ||||
| 
 | ||||
| #if ENABLE_SVG_ICONS | ||||
|         top_y += scaled_stride_y; | ||||
| #else | ||||
|         top_y += (scaled_icons_size + m_overlay_gap_y); | ||||
| #endif // ENABLE_SVG_ICONS
 | ||||
|     } | ||||
| 
 | ||||
|     return name; | ||||
|  | @ -1272,34 +1135,21 @@ bool GLGizmosManager::overlay_contains_mouse(const GLCanvas3D& canvas, const Vec | |||
|     float cnv_h = (float)canvas.get_canvas_size().get_height(); | ||||
|     float height = get_total_overlay_height(); | ||||
| 
 | ||||
| #if ENABLE_SVG_ICONS | ||||
|     float scaled_icons_size = m_overlay_icons_size * m_overlay_scale; | ||||
|     float scaled_border = m_overlay_border * m_overlay_scale; | ||||
|     float scaled_gap_y = m_overlay_gap_y * m_overlay_scale; | ||||
|     float scaled_stride_y = scaled_icons_size + scaled_gap_y; | ||||
|     float top_y = 0.5f * (cnv_h - height) + scaled_border; | ||||
| #else | ||||
|     float top_y = 0.5f * (cnv_h - height) + m_overlay_border; | ||||
|     float scaled_icons_size = (float)m_icons_texture.metadata.icon_size * m_overlay_icons_scale; | ||||
| #endif // ENABLE_SVG_ICONS
 | ||||
| 
 | ||||
|     for (GizmosMap::const_iterator it = m_gizmos.begin(); it != m_gizmos.end(); ++it) | ||||
|     { | ||||
|         if ((it->second == nullptr) || !it->second->is_selectable()) | ||||
|             continue; | ||||
| 
 | ||||
| #if ENABLE_SVG_ICONS | ||||
|         if ((scaled_border <= (float)mouse_pos(0)) && ((float)mouse_pos(0) <= scaled_border + scaled_icons_size) && (top_y <= (float)mouse_pos(1)) && ((float)mouse_pos(1) <= top_y + scaled_icons_size)) | ||||
| #else | ||||
|         if ((m_overlay_border <= (float)mouse_pos(0)) && ((float)mouse_pos(0) <= m_overlay_border + scaled_icons_size) && (top_y <= (float)mouse_pos(1)) && ((float)mouse_pos(1) <= top_y + scaled_icons_size)) | ||||
| #endif // ENABLE_SVG_ICONS
 | ||||
|             return true; | ||||
| 
 | ||||
| #if ENABLE_SVG_ICONS | ||||
|         top_y += scaled_stride_y; | ||||
| #else | ||||
|         top_y += (scaled_icons_size + m_overlay_gap_y); | ||||
| #endif // ENABLE_SVG_ICONS
 | ||||
|     } | ||||
| 
 | ||||
|     return false; | ||||
|  |  | |||
|  | @ -46,9 +46,7 @@ public: | |||
| class GLGizmosManager | ||||
| { | ||||
| public: | ||||
| #if ENABLE_SVG_ICONS | ||||
|     static const float Default_Icons_Size; | ||||
| #endif // ENABLE_SVG_ICONS
 | ||||
| 
 | ||||
|     enum EType : unsigned char | ||||
|     { | ||||
|  | @ -66,21 +64,13 @@ private: | |||
|     bool m_enabled; | ||||
|     typedef std::map<EType, GLGizmoBase*> GizmosMap; | ||||
|     GizmosMap m_gizmos; | ||||
| #if ENABLE_SVG_ICONS | ||||
|     mutable GLTexture m_icons_texture; | ||||
|     mutable bool m_icons_texture_dirty; | ||||
| #else | ||||
|     ItemsIconsTexture m_icons_texture; | ||||
| #endif // ENABLE_SVG_ICONS
 | ||||
|     BackgroundTexture m_background_texture; | ||||
|     EType m_current; | ||||
| 
 | ||||
| #if ENABLE_SVG_ICONS | ||||
|     float m_overlay_icons_size; | ||||
|     float m_overlay_scale; | ||||
| #else | ||||
|     float m_overlay_icons_scale; | ||||
| #endif // ENABLE_SVG_ICONS
 | ||||
|     float m_overlay_border; | ||||
|     float m_overlay_gap_y; | ||||
| 
 | ||||
|  | @ -109,9 +99,7 @@ public: | |||
|     bool is_enabled() const { return m_enabled; } | ||||
|     void set_enabled(bool enable) { m_enabled = enable; } | ||||
| 
 | ||||
| #if ENABLE_SVG_ICONS | ||||
|     void set_overlay_icon_size(float size); | ||||
| #endif // ENABLE_SVG_ICONS
 | ||||
|     void set_overlay_scale(float scale); | ||||
| 
 | ||||
|     void refresh_on_off_state(const Selection& selection); | ||||
|  | @ -173,9 +161,7 @@ private: | |||
| 
 | ||||
|     GLGizmoBase* get_current() const; | ||||
| 
 | ||||
| #if ENABLE_SVG_ICONS | ||||
|     bool generate_icons_texture() const; | ||||
| #endif // ENABLE_SVG_ICONS
 | ||||
| 
 | ||||
|     void update_on_off_state(const GLCanvas3D& canvas, const Vec2d& mouse_pos, const Selection& selection); | ||||
|     std::string update_hover_state(const GLCanvas3D& canvas, const Vec2d& mouse_pos); | ||||
|  |  | |||
|  | @ -35,6 +35,7 @@ namespace GUI { | |||
| MainFrame::MainFrame() : | ||||
| DPIFrame(NULL, wxID_ANY, "", wxDefaultPosition, wxDefaultSize, wxDEFAULT_FRAME_STYLE, "mainframe"), | ||||
|     m_printhost_queue_dlg(new PrintHostQueueDialog(this)) | ||||
|     , m_recent_projects(9) | ||||
| { | ||||
|     // Fonts were created by the DPIFrame constructor for the monitor, on which the window opened.
 | ||||
|     wxGetApp().update_fonts(this); | ||||
|  | @ -383,6 +384,40 @@ void MainFrame::init_menubar() | |||
|         append_menu_item(fileMenu, wxID_ANY, _(L("&Open Project")) + dots + "\tCtrl+O", _(L("Open a project file")), | ||||
|             [this](wxCommandEvent&) { if (m_plater) m_plater->load_project(); }, menu_icon("open"), nullptr, | ||||
|             [this](){return m_plater != nullptr; }, this); | ||||
| 
 | ||||
|         wxMenu* recent_projects_menu = new wxMenu(); | ||||
|         wxMenuItem* recent_projects_submenu = append_submenu(fileMenu, recent_projects_menu, wxID_ANY, _(L("Recent projects")), ""); | ||||
|         m_recent_projects.UseMenu(recent_projects_menu); | ||||
|         Bind(wxEVT_MENU, [this](wxCommandEvent& evt) { | ||||
|             size_t file_id = evt.GetId() - wxID_FILE1; | ||||
|             wxString filename = m_recent_projects.GetHistoryFile(file_id); | ||||
|             if (wxFileExists(filename)) | ||||
|                 m_plater->load_project(filename); | ||||
|             else | ||||
|             { | ||||
|                 wxMessageDialog msg(this, _(L("The selected project is no more available")), _(L("Error"))); | ||||
|                 msg.ShowModal(); | ||||
| 
 | ||||
|                 m_recent_projects.RemoveFileFromHistory(file_id); | ||||
|                 std::vector<std::string> recent_projects; | ||||
|                 size_t count = m_recent_projects.GetCount(); | ||||
|                 for (size_t i = 0; i < count; ++i) | ||||
|                 { | ||||
|                     recent_projects.push_back(into_u8(m_recent_projects.GetHistoryFile(i))); | ||||
|                 } | ||||
|                 wxGetApp().app_config->set_recent_projects(recent_projects); | ||||
|                 wxGetApp().app_config->save(); | ||||
|             } | ||||
|             }, wxID_FILE1, wxID_FILE9); | ||||
| 
 | ||||
|         std::vector<std::string> recent_projects = wxGetApp().app_config->get_recent_projects(); | ||||
|         for (const std::string& project : recent_projects) | ||||
|         { | ||||
|             m_recent_projects.AddFileToHistory(from_u8(project)); | ||||
|         } | ||||
| 
 | ||||
|         Bind(wxEVT_UPDATE_UI, [this](wxUpdateUIEvent& evt) { evt.Enable(m_recent_projects.GetCount() > 0); }, recent_projects_submenu->GetId()); | ||||
| 
 | ||||
|         append_menu_item(fileMenu, wxID_ANY, _(L("&Save Project")) + "\tCtrl+S", _(L("Save current project file")), | ||||
|             [this](wxCommandEvent&) { if (m_plater) m_plater->export_3mf(into_path(m_plater->get_project_filename(".3mf"))); }, menu_icon("save"), nullptr, | ||||
|             [this](){return m_plater != nullptr && can_save(); }, this); | ||||
|  | @ -1046,6 +1081,23 @@ void MainFrame::on_config_changed(DynamicPrintConfig* config) const | |||
|         m_plater->on_config_change(*config); // propagate config change events to the plater
 | ||||
| } | ||||
| 
 | ||||
| void MainFrame::add_to_recent_projects(const wxString& filename) | ||||
| { | ||||
|     if (wxFileExists(filename)) | ||||
|     { | ||||
|         m_recent_projects.AddFileToHistory(filename); | ||||
|         std::vector<std::string> recent_projects; | ||||
|         size_t count = m_recent_projects.GetCount(); | ||||
|         for (size_t i = 0; i < count; ++i) | ||||
|         { | ||||
|             recent_projects.push_back(into_u8(m_recent_projects.GetHistoryFile(i))); | ||||
|         } | ||||
|         wxGetApp().app_config->set_recent_projects(recent_projects); | ||||
|         wxGetApp().app_config->save(); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| //
 | ||||
| // Called after the Preferences dialog is closed and the program settings are saved.
 | ||||
| // Update the UI based on the current preferences.
 | ||||
| void MainFrame::update_ui_from_settings() | ||||
|  |  | |||
|  | @ -6,6 +6,7 @@ | |||
| #include <wx/frame.h> | ||||
| #include <wx/settings.h> | ||||
| #include <wx/string.h> | ||||
| #include <wx/filehistory.h> | ||||
| 
 | ||||
| #include <string> | ||||
| #include <map> | ||||
|  | @ -84,6 +85,8 @@ class MainFrame : public DPIFrame | |||
|     // vector of a MenuBar items changeable in respect to printer technology 
 | ||||
|     std::vector<wxMenuItem*> m_changeable_menu_items; | ||||
| 
 | ||||
|     wxFileHistory m_recent_projects; | ||||
| 
 | ||||
| protected: | ||||
|     virtual void on_dpi_changed(const wxRect &suggested_rect); | ||||
| 
 | ||||
|  | @ -121,6 +124,8 @@ public: | |||
|     // Propagate changed configuration from the Tab to the Platter and save changes to the AppConfig
 | ||||
|     void        on_config_changed(DynamicPrintConfig* cfg) const ; | ||||
| 
 | ||||
|     void        add_to_recent_projects(const wxString& filename); | ||||
| 
 | ||||
|     PrintHostQueueDialog* printhost_queue_dlg() { return m_printhost_queue_dlg; } | ||||
| 
 | ||||
|     Plater*             m_plater { nullptr }; | ||||
|  |  | |||
|  | @ -266,7 +266,7 @@ void OptionsGroup::append_line(const Line& line, wxStaticText**	full_Label/* = n | |||
|             is_sizer_field(field) ? | ||||
|                 v_sizer->Add(field->getSizer(), 0, wxEXPAND) : | ||||
|                 v_sizer->Add(field->getWindow(), 0, wxEXPAND); | ||||
|             return; | ||||
|             break;//return;
 | ||||
|         } | ||||
| 
 | ||||
| 		is_sizer_field(field) ?  | ||||
|  | @ -300,7 +300,7 @@ void OptionsGroup::append_line(const Line& line, wxStaticText**	full_Label/* = n | |||
|         { | ||||
|             // extra widget for non-staticbox option group (like for the frequently used parameters on the sidebar) should be wxALIGN_RIGHT
 | ||||
|             const auto v_sizer = new wxBoxSizer(wxVERTICAL); | ||||
|             sizer->Add(v_sizer, 1, wxEXPAND); | ||||
|             sizer->Add(v_sizer, option_set.size() == 1 ? 0 : 1, wxEXPAND); | ||||
|             v_sizer->Add(extra_widget(this->ctrl_parent()), 0, wxALIGN_RIGHT); | ||||
|             return; | ||||
|         } | ||||
|  |  | |||
|  | @ -162,6 +162,12 @@ public: | |||
| 
 | ||||
|     void            clear_fields_except_of(const std::vector<std::string> left_fields); | ||||
| 
 | ||||
|     void            hide_labels() { | ||||
|         label_width = 0; | ||||
|         m_grid_sizer->SetCols(m_grid_sizer->GetEffectiveColsCount()-1); | ||||
|         static_cast<wxFlexGridSizer*>(m_grid_sizer)->AddGrowableCol(!extra_column ? 0 : 1); | ||||
|     } | ||||
| 
 | ||||
| 	OptionsGroup(	wxWindow* _parent, const wxString& title, bool is_tab_opt = false,  | ||||
| 					column_t extra_clmn = nullptr) : | ||||
| 					m_parent(_parent), title(title),  | ||||
|  |  | |||
|  | @ -245,6 +245,7 @@ wxBitmapComboBox(parent, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize(15 * | |||
|     last_selected(wxNOT_FOUND), | ||||
|     m_em_unit(wxGetApp().em_unit()) | ||||
| { | ||||
|     SetFont(wxGetApp().normal_font()); | ||||
|     Bind(wxEVT_COMBOBOX, [this](wxCommandEvent &evt) { | ||||
|         auto selected_item = this->GetSelection(); | ||||
| 
 | ||||
|  | @ -372,24 +373,36 @@ class FreqChangedParams : public OG_Settings | |||
|     wxSizer*        m_sizer {nullptr}; | ||||
| 
 | ||||
|     std::shared_ptr<ConfigOptionsGroup> m_og_sla; | ||||
|     std::vector<ScalableButton*>        m_empty_buttons; | ||||
| public: | ||||
|     FreqChangedParams(wxWindow* parent, const int label_width); | ||||
|     FreqChangedParams(wxWindow* parent); | ||||
|     ~FreqChangedParams() {} | ||||
| 
 | ||||
|     wxButton*       get_wiping_dialog_button() { return m_wiping_dialog_button; } | ||||
|     wxSizer*        get_sizer() override; | ||||
|     ConfigOptionsGroup* get_og(const bool is_fff); | ||||
|     void            Show(const bool is_fff); | ||||
| 
 | ||||
|     void            msw_rescale(); | ||||
| }; | ||||
| 
 | ||||
| FreqChangedParams::FreqChangedParams(wxWindow* parent, const int label_width) : | ||||
| void FreqChangedParams::msw_rescale() | ||||
| { | ||||
|     m_og->msw_rescale(); | ||||
|     m_og_sla->msw_rescale(); | ||||
| 
 | ||||
|     for (auto btn: m_empty_buttons) | ||||
|         btn->msw_rescale(); | ||||
| } | ||||
| 
 | ||||
| FreqChangedParams::FreqChangedParams(wxWindow* parent) : | ||||
|     OG_Settings(parent, false) | ||||
| { | ||||
|     DynamicPrintConfig*	config = &wxGetApp().preset_bundle->prints.get_edited_preset().config; | ||||
| 
 | ||||
|     // Frequently changed parameters for FFF_technology
 | ||||
|     m_og->set_config(config); | ||||
|     m_og->label_width = label_width == 0 ? 1 : label_width; | ||||
|     m_og->hide_labels(); | ||||
| 
 | ||||
|     m_og->m_on_change = [config, this](t_config_option_key opt_key, boost::any value) { | ||||
|         Tab* tab_print = wxGetApp().get_tab(Preset::TYPE_PRINT); | ||||
|  | @ -461,6 +474,20 @@ FreqChangedParams::FreqChangedParams(wxWindow* parent, const int label_width) : | |||
|     Option option = Option(support_def, "support"); | ||||
|     option.opt.full_width = true; | ||||
|     line.append_option(option); | ||||
| 
 | ||||
|     /* Not a best solution, but
 | ||||
|      * Temporary workaround for right border alignment | ||||
|      */ | ||||
|     auto empty_widget = [this] (wxWindow* parent) { | ||||
|         auto sizer = new wxBoxSizer(wxHORIZONTAL); | ||||
|         auto btn = new ScalableButton(parent, wxID_ANY, "mirroring_transparent.png", wxEmptyString, | ||||
|             wxDefaultSize, wxDefaultPosition, wxBU_EXACTFIT | wxNO_BORDER | wxTRANSPARENT_WINDOW); | ||||
|         sizer->Add(btn, 0, wxALIGN_CENTER_VERTICAL | wxLEFT | wxRIGHT, int(0.3 * wxGetApp().em_unit())); | ||||
|         m_empty_buttons.push_back(btn); | ||||
|         return sizer; | ||||
|     }; | ||||
|     line.append_widget(empty_widget); | ||||
| 
 | ||||
|     m_og->append_line(line); | ||||
| 
 | ||||
|      | ||||
|  | @ -469,7 +496,7 @@ FreqChangedParams::FreqChangedParams(wxWindow* parent, const int label_width) : | |||
|     option = m_og->get_option("fill_density"); | ||||
|     option.opt.label = L("Infill"); | ||||
|     option.opt.width = 7/*6*/; | ||||
|     option.opt.sidetext = "     "; | ||||
|     option.opt.sidetext = "   "; | ||||
|     line.append_option(option); | ||||
| 
 | ||||
|     m_brim_width = config->opt_float("brim_width"); | ||||
|  | @ -480,13 +507,14 @@ FreqChangedParams::FreqChangedParams(wxWindow* parent, const int label_width) : | |||
|     def.gui_type = ""; | ||||
|     def.set_default_value(new ConfigOptionBool{ m_brim_width > 0.0 ? true : false }); | ||||
|     option = Option(def, "brim"); | ||||
|     option.opt.sidetext = "     "; | ||||
|     option.opt.sidetext = ""; | ||||
|     line.append_option(option); | ||||
| 
 | ||||
|     auto wiping_dialog_btn = [config, this](wxWindow* parent) { | ||||
|         m_wiping_dialog_button = new wxButton(parent, wxID_ANY, _(L("Purging volumes")) + dots, wxDefaultPosition, wxDefaultSize, wxBU_EXACTFIT); | ||||
|         m_wiping_dialog_button->SetFont(wxGetApp().normal_font()); | ||||
|         auto sizer = new wxBoxSizer(wxHORIZONTAL); | ||||
|         sizer->Add(m_wiping_dialog_button); | ||||
|         sizer->Add(m_wiping_dialog_button, 0, wxALIGN_CENTER_VERTICAL); | ||||
|         m_wiping_dialog_button->Bind(wxEVT_BUTTON, ([parent](wxCommandEvent& e) | ||||
|         { | ||||
|             auto &config = wxGetApp().preset_bundle->project_config; | ||||
|  | @ -503,6 +531,13 @@ FreqChangedParams::FreqChangedParams(wxWindow* parent, const int label_width) : | |||
|                 wxPostEvent(parent, SimpleEvent(EVT_SCHEDULE_BACKGROUND_PROCESS, parent)); | ||||
|             } | ||||
|         })); | ||||
| 
 | ||||
|         auto btn = new ScalableButton(parent, wxID_ANY, "mirroring_transparent.png", wxEmptyString,  | ||||
|                                       wxDefaultSize, wxDefaultPosition, wxBU_EXACTFIT | wxNO_BORDER | wxTRANSPARENT_WINDOW); | ||||
|         sizer->Add(btn , 0, wxALIGN_CENTER_VERTICAL | wxLEFT | wxRIGHT, | ||||
|             int(0.3 * wxGetApp().em_unit())); | ||||
|         m_empty_buttons.push_back(btn); | ||||
| 
 | ||||
|         return sizer; | ||||
|     }; | ||||
|     line.append_widget(wiping_dialog_btn); | ||||
|  | @ -512,9 +547,9 @@ FreqChangedParams::FreqChangedParams(wxWindow* parent, const int label_width) : | |||
| 
 | ||||
|     // Frequently changed parameters for SLA_technology
 | ||||
|     m_og_sla = std::make_shared<ConfigOptionsGroup>(parent, ""); | ||||
|     m_og_sla->hide_labels(); | ||||
|     DynamicPrintConfig*	config_sla = &wxGetApp().preset_bundle->sla_prints.get_edited_preset().config; | ||||
|     m_og_sla->set_config(config_sla); | ||||
|     m_og_sla->label_width = label_width == 0 ? 1 : label_width; | ||||
| 
 | ||||
|     m_og_sla->m_on_change = [config_sla, this](t_config_option_key opt_key, boost::any value) { | ||||
|         Tab* tab = wxGetApp().get_tab(Preset::TYPE_SLA_PRINT); | ||||
|  | @ -552,7 +587,8 @@ FreqChangedParams::FreqChangedParams(wxWindow* parent, const int label_width) : | |||
|     support_def_sla.enum_labels.erase(support_def_sla.enum_labels.begin() + 2); | ||||
|     option = Option(support_def_sla, "support"); | ||||
|     option.opt.full_width = true; | ||||
|     line.append_option(option); | ||||
|     line.append_option(option);  | ||||
|     line.append_widget(empty_widget); | ||||
|     m_og_sla->append_line(line); | ||||
| 
 | ||||
|     line = Line{ "", "" }; | ||||
|  | @ -733,13 +769,12 @@ Sidebar::Sidebar(Plater *parent) | |||
|     init_combo(&p->combo_printer,       _(L("Printer")),            Preset::TYPE_PRINTER,       false); | ||||
| 
 | ||||
|     const int margin_5  = int(0.5*wxGetApp().em_unit());// 5;
 | ||||
|     const int margin_10 = 10;//int(1.5*wxGetApp().em_unit());// 15;
 | ||||
| 
 | ||||
|     p->sizer_params = new wxBoxSizer(wxVERTICAL); | ||||
| 
 | ||||
|     // Frequently changed parameters
 | ||||
|     p->frequently_changed_parameters = new FreqChangedParams(p->scrolled, 0/*label_width*/); | ||||
|     p->sizer_params->Add(p->frequently_changed_parameters->get_sizer(), 0, wxEXPAND | wxTOP | wxBOTTOM, margin_10); | ||||
|     p->frequently_changed_parameters = new FreqChangedParams(p->scrolled); | ||||
|     p->sizer_params->Add(p->frequently_changed_parameters->get_sizer(), 0, wxEXPAND | wxTOP | wxBOTTOM, wxOSX ? 1 : margin_5); | ||||
|      | ||||
|     // Object List
 | ||||
|     p->object_list = new ObjectList(p->scrolled); | ||||
|  | @ -946,9 +981,7 @@ void Sidebar::msw_rescale() | |||
|     // ... then refill them and set min size to correct layout of the sidebar
 | ||||
|     update_all_preset_comboboxes(); | ||||
| 
 | ||||
|     p->frequently_changed_parameters->get_og(true)->msw_rescale(); | ||||
|     p->frequently_changed_parameters->get_og(false)->msw_rescale(); | ||||
| 
 | ||||
|     p->frequently_changed_parameters->msw_rescale(); | ||||
|     p->object_list->msw_rescale(); | ||||
|     p->object_manipulation->msw_rescale(); | ||||
|     p->object_settings->msw_rescale(); | ||||
|  | @ -1132,10 +1165,20 @@ void Sidebar::show_sliced_info_sizer(const bool show) | |||
|                 if (ps.estimated_normal_print_time != "N/A") { | ||||
|                     new_label += wxString::Format("\n    - %s", _(L("normal mode"))); | ||||
|                     info_text += wxString::Format("\n%s", ps.estimated_normal_print_time); | ||||
|                     for (int i = (int)ps.estimated_normal_color_print_times.size() - 1; i >= 0; --i) | ||||
|                     { | ||||
|                         new_label += wxString::Format("\n      - %s%d", _(L("Color ")), i + 1); | ||||
|                         info_text += wxString::Format("\n%s", ps.estimated_normal_color_print_times[i]); | ||||
|                     } | ||||
|                 } | ||||
|                 if (ps.estimated_silent_print_time != "N/A") { | ||||
|                     new_label += wxString::Format("\n    - %s", _(L("stealth mode"))); | ||||
|                     info_text += wxString::Format("\n%s", ps.estimated_silent_print_time); | ||||
|                     for (int i = (int)ps.estimated_normal_color_print_times.size() - 1; i >= 0; --i) | ||||
|                     { | ||||
|                         new_label += wxString::Format("\n      - %s%d", _(L("Color ")), i + 1); | ||||
|                         info_text += wxString::Format("\n%s", ps.estimated_normal_color_print_times[i]); | ||||
|                     } | ||||
|                 } | ||||
|                 p->sliced_info->SetTextAndShow(siEstimatedTime,  info_text,      new_label); | ||||
|             } | ||||
|  | @ -1693,11 +1736,7 @@ Plater::priv::priv(Plater *q, MainFrame *main_frame) | |||
|         })) | ||||
|     , sidebar(new Sidebar(q)) | ||||
|     , delayed_scene_refresh(false) | ||||
| #if ENABLE_SVG_ICONS | ||||
|     , view_toolbar(GLToolbar::Radio, "View") | ||||
| #else | ||||
|     , view_toolbar(GLToolbar::Radio) | ||||
| #endif // ENABLE_SVG_ICONS
 | ||||
|     , m_project_filename(wxEmptyString) | ||||
| { | ||||
| 	this->q->SetFont(Slic3r::GUI::wxGetApp().normal_font()); | ||||
|  | @ -3238,6 +3277,9 @@ void Plater::priv::set_project_filename(const wxString& filename) | |||
| 
 | ||||
|     m_project_filename = from_path(full_path); | ||||
|     wxGetApp().mainframe->update_title(); | ||||
| 
 | ||||
|     if (!filename.empty()) | ||||
|         wxGetApp().mainframe->add_to_recent_projects(filename); | ||||
| } | ||||
| 
 | ||||
| bool Plater::priv::init_common_menu(wxMenu* menu, const bool is_part/* = false*/) | ||||
|  | @ -3352,12 +3394,6 @@ bool Plater::priv::complit_init_part_menu() | |||
| 
 | ||||
| void Plater::priv::init_view_toolbar() | ||||
| { | ||||
| #if !ENABLE_SVG_ICONS | ||||
|     ItemsIconsTexture::Metadata icons_data; | ||||
|     icons_data.filename = "view_toolbar.png"; | ||||
|     icons_data.icon_size = 64; | ||||
| #endif // !ENABLE_SVG_ICONS
 | ||||
| 
 | ||||
|     BackgroundTexture::Metadata background_data; | ||||
|     background_data.filename = "toolbar_background.png"; | ||||
|     background_data.left = 16; | ||||
|  | @ -3365,11 +3401,7 @@ void Plater::priv::init_view_toolbar() | |||
|     background_data.right = 16; | ||||
|     background_data.bottom = 16; | ||||
| 
 | ||||
| #if ENABLE_SVG_ICONS | ||||
|     if (!view_toolbar.init(background_data)) | ||||
| #else | ||||
|     if (!view_toolbar.init(icons_data, background_data)) | ||||
| #endif // ENABLE_SVG_ICONS
 | ||||
|         return; | ||||
| 
 | ||||
|     view_toolbar.set_layout_orientation(GLToolbar::Layout::Bottom); | ||||
|  | @ -3379,9 +3411,7 @@ void Plater::priv::init_view_toolbar() | |||
|     GLToolbarItem::Data item; | ||||
| 
 | ||||
|     item.name = "3D"; | ||||
| #if ENABLE_SVG_ICONS | ||||
|     item.icon_filename = "editor.svg"; | ||||
| #endif // ENABLE_SVG_ICONS
 | ||||
|     item.tooltip = _utf8(L("3D editor view")) + " [" + GUI::shortkey_ctrl_prefix() + "5]"; | ||||
|     item.sprite_id = 0; | ||||
|     item.action_callback = [this]() { if (this->q != nullptr) wxPostEvent(this->q, SimpleEvent(EVT_GLVIEWTOOLBAR_3D)); }; | ||||
|  | @ -3390,9 +3420,7 @@ void Plater::priv::init_view_toolbar() | |||
|         return; | ||||
| 
 | ||||
|     item.name = "Preview"; | ||||
| #if ENABLE_SVG_ICONS | ||||
|     item.icon_filename = "preview.svg"; | ||||
| #endif // ENABLE_SVG_ICONS
 | ||||
|     item.tooltip = _utf8(L("Preview")) + " [" + GUI::shortkey_ctrl_prefix() + "6]"; | ||||
|     item.sprite_id = 1; | ||||
|     item.action_callback = [this]() { if (this->q != nullptr) wxPostEvent(this->q, SimpleEvent(EVT_GLVIEWTOOLBAR_PREVIEW)); }; | ||||
|  | @ -3565,15 +3593,19 @@ void Plater::load_project() | |||
| { | ||||
|     wxString input_file; | ||||
|     wxGetApp().load_project(this, input_file); | ||||
|     load_project(input_file); | ||||
| } | ||||
| 
 | ||||
|     if (input_file.empty()) | ||||
| void Plater::load_project(const wxString& filename) | ||||
| { | ||||
|     if (filename.empty()) | ||||
|         return; | ||||
| 
 | ||||
|     p->reset(); | ||||
|     p->set_project_filename(input_file); | ||||
|     p->set_project_filename(filename); | ||||
| 
 | ||||
|     std::vector<fs::path> input_paths; | ||||
|     input_paths.push_back(into_path(input_file)); | ||||
|     input_paths.push_back(into_path(filename)); | ||||
|     load_files(input_paths); | ||||
| } | ||||
| 
 | ||||
|  |  | |||
|  | @ -138,6 +138,7 @@ public: | |||
| 
 | ||||
|     void new_project(); | ||||
|     void load_project(); | ||||
|     void load_project(const wxString& filename); | ||||
|     void add_model(); | ||||
|     void extract_config_from_project(); | ||||
| 
 | ||||
|  |  | |||
|  | @ -461,6 +461,7 @@ const std::vector<std::string>& Preset::sla_print_options() | |||
|             "support_pillar_widening_factor", | ||||
|             "support_base_diameter", | ||||
|             "support_base_height", | ||||
|             "support_base_safety_distance", | ||||
|             "support_critical_angle", | ||||
|             "support_max_bridge_length", | ||||
|             "support_max_pillar_link_distance", | ||||
|  | @ -474,6 +475,10 @@ const std::vector<std::string>& Preset::sla_print_options() | |||
|             "pad_max_merge_distance", | ||||
|             "pad_edge_radius", | ||||
|             "pad_wall_slope", | ||||
|             "pad_object_gap", | ||||
|             "pad_object_connector_stride", | ||||
|             "pad_object_connector_width", | ||||
|             "pad_object_connector_penetration", | ||||
|             "output_filename_format",  | ||||
|             "default_sla_print_profile", | ||||
|             "compatible_printers", | ||||
|  |  | |||
|  | @ -3515,6 +3515,7 @@ void TabSLAPrint::build() | |||
|     // optgroup->append_single_option_line("support_pillar_widening_factor");
 | ||||
|     optgroup->append_single_option_line("support_base_diameter"); | ||||
|     optgroup->append_single_option_line("support_base_height"); | ||||
|     optgroup->append_single_option_line("support_base_safety_distance"); | ||||
|     optgroup->append_single_option_line("support_object_elevation"); | ||||
| 
 | ||||
|     optgroup = page->new_optgroup(_(L("Connection of the support sticks and junctions"))); | ||||
|  | @ -3535,7 +3536,12 @@ void TabSLAPrint::build() | |||
|     // TODO: Disabling this parameter for the beta release
 | ||||
| //    optgroup->append_single_option_line("pad_edge_radius");
 | ||||
|     optgroup->append_single_option_line("pad_wall_slope"); | ||||
| 
 | ||||
|      | ||||
|     optgroup->append_single_option_line("pad_object_gap"); | ||||
|     optgroup->append_single_option_line("pad_object_connector_stride"); | ||||
|     optgroup->append_single_option_line("pad_object_connector_width"); | ||||
|     optgroup->append_single_option_line("pad_object_connector_penetration"); | ||||
|      | ||||
| 	page = add_options_page(_(L("Advanced")), "wrench"); | ||||
| 	optgroup = page->new_optgroup(_(L("Slicing"))); | ||||
| 	optgroup->append_single_option_line("slice_closing_radius"); | ||||
|  | @ -3580,36 +3586,57 @@ void TabSLAPrint::update() | |||
| 
 | ||||
|      m_update_cnt++; | ||||
| 
 | ||||
|      double head_penetration = m_config->opt_float("support_head_penetration"); | ||||
|      double head_width = m_config->opt_float("support_head_width"); | ||||
|      if(head_penetration > head_width) { | ||||
|          wxString msg_text = _(L("Head penetration should not be greater than the head width.")); | ||||
|          auto dialog = new wxMessageDialog(parent(), msg_text, _(L("Invalid Head penetration")), wxICON_WARNING | wxOK); | ||||
|          DynamicPrintConfig new_conf = *m_config; | ||||
|          if (dialog->ShowModal() == wxID_OK) { | ||||
|              new_conf.set_key_value("support_head_penetration", new ConfigOptionFloat(head_width)); | ||||
|          } | ||||
|     double head_penetration = m_config->opt_float("support_head_penetration"); | ||||
|     double head_width       = m_config->opt_float("support_head_width"); | ||||
|     if (head_penetration > head_width) { | ||||
|         wxString msg_text = _( | ||||
|             L("Head penetration should not be greater than the head width.")); | ||||
| 
 | ||||
|          load_config(new_conf); | ||||
|      } | ||||
|         auto dialog = new wxMessageDialog(parent(), | ||||
|                                           msg_text, | ||||
|                                           _(L("Invalid Head penetration")), | ||||
|                                           wxICON_WARNING | wxOK); | ||||
| 
 | ||||
|      double pinhead_d = m_config->opt_float("support_head_front_diameter"); | ||||
|      double pillar_d     = m_config->opt_float("support_pillar_diameter"); | ||||
|      if(pinhead_d > pillar_d) { | ||||
|          wxString msg_text = _(L("Pinhead diameter should be smaller than the pillar diameter.")); | ||||
|          auto dialog = new wxMessageDialog(parent(), msg_text, _(L("Invalid pinhead diameter")), wxICON_WARNING | wxOK); | ||||
|          DynamicPrintConfig new_conf = *m_config; | ||||
|          if (dialog->ShowModal() == wxID_OK) { | ||||
|              new_conf.set_key_value("support_head_front_diameter", new ConfigOptionFloat(pillar_d / 2.0)); | ||||
|          } | ||||
|         DynamicPrintConfig new_conf = *m_config; | ||||
|         if (dialog->ShowModal() == wxID_OK) { | ||||
|             new_conf.set_key_value("support_head_penetration", | ||||
|                                    new ConfigOptionFloat(head_width)); | ||||
|         } | ||||
| 
 | ||||
|          load_config(new_conf); | ||||
|      } | ||||
|         load_config(new_conf); | ||||
|     } | ||||
| 
 | ||||
|      m_update_cnt--; | ||||
|     double pinhead_d = m_config->opt_float("support_head_front_diameter"); | ||||
|     double pillar_d  = m_config->opt_float("support_pillar_diameter"); | ||||
|     if (pinhead_d > pillar_d) { | ||||
|         wxString msg_text = _(L( | ||||
|             "Pinhead diameter should be smaller than the pillar diameter.")); | ||||
| 
 | ||||
|      if (m_update_cnt == 0) | ||||
|     wxGetApp().mainframe->on_config_changed(m_config); | ||||
|         auto dialog = new wxMessageDialog(parent(), | ||||
|                                           msg_text, | ||||
|                                           _(L("Invalid pinhead diameter")), | ||||
|                                           wxICON_WARNING | wxOK); | ||||
| 
 | ||||
|         DynamicPrintConfig new_conf = *m_config; | ||||
|         if (dialog->ShowModal() == wxID_OK) { | ||||
|             new_conf.set_key_value("support_head_front_diameter", | ||||
|                                    new ConfigOptionFloat(pillar_d / 2.0)); | ||||
|         } | ||||
| 
 | ||||
|         load_config(new_conf); | ||||
|     } | ||||
|      | ||||
|     // if(m_config->opt_float("support_object_elevation") < EPSILON &&
 | ||||
|     //    m_config->opt_bool("pad_enable")) {
 | ||||
|     //     // TODO: disable editding of:
 | ||||
|     //     // pad_object_connector_stride
 | ||||
|     //     // pad_object_connector_width
 | ||||
|     //     // pad_object_connector_penetration
 | ||||
|     // }
 | ||||
| 
 | ||||
|     m_update_cnt--; | ||||
| 
 | ||||
|     if (m_update_cnt == 0) wxGetApp().mainframe->on_config_changed(m_config); | ||||
| } | ||||
| 
 | ||||
| } // GUI
 | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Enrico Turri
						Enrico Turri