mirror of
				https://github.com/SoftFever/OrcaSlicer.git
				synced 2025-10-30 12:11:15 -06:00 
			
		
		
		
	Merge remote-tracking branch 'origin/master' into ys_ftn_improvements
This commit is contained in:
		
						commit
						c752394abd
					
				
					 19 changed files with 1114 additions and 1012 deletions
				
			
		
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							|  | @ -213,7 +213,7 @@ void PrintConfigDef::init_fff_params() | |||
| 
 | ||||
|     def = this->add("clip_multipart_objects", coBool); | ||||
|     def->label = L("Clip multi-part objects"); | ||||
|     def->tooltip = L("When printing multi-material objects, this settings will make slic3r " | ||||
|     def->tooltip = L("When printing multi-material objects, this settings will make Slic3r " | ||||
|                    "to clip the overlapping object parts one by the other " | ||||
|                    "(2nd part will be clipped by the 1st, 3rd part will be clipped by the 1st and 2nd etc)."); | ||||
|     def->mode = comExpert; | ||||
|  |  | |||
|  | @ -248,20 +248,21 @@ RawBytes Raster::save(Raster::Compression comp) | |||
| { | ||||
|     assert(m_impl); | ||||
| 
 | ||||
|     std::uint8_t *ptr = nullptr; size_t s = 0; | ||||
|     std::vector<std::uint8_t> data; size_t s = 0; | ||||
| 
 | ||||
|     switch(comp) { | ||||
|     case Compression::PNG: { | ||||
| 
 | ||||
|         void *rawdata = tdefl_write_image_to_png_file_in_memory( | ||||
|                     m_impl->buffer().data(), | ||||
|                     int(resolution().width_px), | ||||
|                     int(resolution().height_px), 1, &s); | ||||
| 
 | ||||
|         if(rawdata == nullptr) break; | ||||
| 
 | ||||
|         ptr = static_cast<std::uint8_t*>(rawdata); | ||||
| 
 | ||||
|         auto ptr = static_cast<std::uint8_t*>(rawdata); | ||||
|          | ||||
|         data.reserve(s); std::copy(ptr, ptr + s, std::back_inserter(data)); | ||||
|          | ||||
|         MZ_FREE(rawdata); | ||||
|         break; | ||||
|     } | ||||
|     case Compression::RAW: { | ||||
|  | @ -270,21 +271,19 @@ RawBytes Raster::save(Raster::Compression comp) | |||
|                 std::to_string(m_impl->resolution().height_px) + " " + "255 "; | ||||
| 
 | ||||
|         auto sz = m_impl->buffer().size()*sizeof(Impl::TBuffer::value_type); | ||||
| 
 | ||||
|         s = sz + header.size(); | ||||
|         ptr = static_cast<std::uint8_t*>(MZ_MALLOC(s)); | ||||
| 
 | ||||
|          | ||||
|         data.reserve(s); | ||||
|          | ||||
|         auto buff = reinterpret_cast<std::uint8_t*>(m_impl->buffer().data()); | ||||
|         std::copy(buff, buff+sz, ptr + header.size()); | ||||
|         std::copy(header.begin(), header.end(), std::back_inserter(data)); | ||||
|         std::copy(buff, buff+sz, std::back_inserter(data)); | ||||
|          | ||||
|         break; | ||||
|     } | ||||
|     } | ||||
| 
 | ||||
|     return {ptr, s}; | ||||
| } | ||||
| 
 | ||||
| void RawBytes::MinzDeleter::operator()(uint8_t *rawptr) | ||||
| { | ||||
|     MZ_FREE(rawptr); | ||||
|     return {std::move(data)}; | ||||
| } | ||||
| 
 | ||||
| } | ||||
|  |  | |||
|  | @ -15,34 +15,25 @@ class ExPolygon; | |||
| // Raw byte buffer paired with its size. Suitable for compressed PNG data.
 | ||||
| class RawBytes { | ||||
| 
 | ||||
|     class MinzDeleter { | ||||
|     public: | ||||
|         void operator()(std::uint8_t *rawptr); | ||||
|     }; | ||||
| 
 | ||||
|     std::unique_ptr<std::uint8_t, MinzDeleter> m_buffer = nullptr; | ||||
|     size_t m_size = 0; | ||||
| 
 | ||||
|     std::vector<std::uint8_t> m_buffer; | ||||
| public: | ||||
| 
 | ||||
|     RawBytes() = default; | ||||
|     RawBytes(std::uint8_t *rawptr, size_t s): m_buffer(rawptr), m_size(s) {} | ||||
| 
 | ||||
|     size_t size() const { return m_size; } | ||||
|     const uint8_t * data() { return m_buffer.get(); } | ||||
|     RawBytes(std::vector<std::uint8_t>&& data): m_buffer(std::move(data)) {} | ||||
|      | ||||
|     size_t size() const { return m_buffer.size(); } | ||||
|     const uint8_t * data() { return m_buffer.data(); } | ||||
| 
 | ||||
|     // /////////////////////////////////////////////////////////////////////////
 | ||||
|     // FIXME: the following is needed for MSVC2013 compatibility
 | ||||
|     // /////////////////////////////////////////////////////////////////////////
 | ||||
| 
 | ||||
|     RawBytes(const RawBytes&) = delete; | ||||
|     RawBytes(RawBytes&& mv): | ||||
|         m_buffer(std::move(mv.m_buffer)), m_size(mv.m_size) {} | ||||
|     RawBytes(RawBytes&& mv) : m_buffer(std::move(mv.m_buffer)) {} | ||||
| 
 | ||||
|     RawBytes& operator=(const RawBytes&) = delete; | ||||
|     RawBytes& operator=(RawBytes&& mv) { | ||||
|         m_buffer.swap(mv.m_buffer); | ||||
|         m_size = mv.m_size; | ||||
|         m_buffer = std::move(mv.m_buffer); | ||||
|         return *this; | ||||
|     } | ||||
| 
 | ||||
|  |  | |||
|  | @ -846,6 +846,16 @@ public: | |||
|         if(!meshcache_valid) merged_mesh(); | ||||
|         return model_height; | ||||
|     } | ||||
|      | ||||
|     // Intended to be called after the generation is fully complete
 | ||||
|     void clear_support_data() { | ||||
|         merged_mesh(); // in case the mesh is not generated, it should be...
 | ||||
|         m_heads.clear(); | ||||
|         m_pillars.clear(); | ||||
|         m_junctions.clear(); | ||||
|         m_bridges.clear(); | ||||
|         m_compact_bridges.clear(); | ||||
|     } | ||||
| 
 | ||||
| }; | ||||
| 
 | ||||
|  | @ -2285,6 +2295,7 @@ SLASupportTree::SLASupportTree(const std::vector<SupportPoint> &points, | |||
| { | ||||
|     m_impl->ground_level = emesh.ground_level() - cfg.object_elevation_mm; | ||||
|     generate(points, emesh, cfg, ctl); | ||||
|     m_impl->clear_support_data(); | ||||
| } | ||||
| 
 | ||||
| SLASupportTree::SLASupportTree(const SLASupportTree &c): | ||||
|  |  | |||
|  | @ -436,6 +436,12 @@ SLAPrint::ApplyStatus SLAPrint::apply(const Model &model, const DynamicPrintConf | |||
|         if (new_objects) | ||||
|             update_apply_status(false); | ||||
|     } | ||||
|      | ||||
|     if(m_objects.empty()) { | ||||
|         m_printer.release(); | ||||
|         m_printer_input.clear(); | ||||
|         m_print_statistics.clear(); | ||||
|     } | ||||
| 
 | ||||
| #ifdef _DEBUG | ||||
|     check_model_ids_equal(m_model, model); | ||||
|  | @ -668,8 +674,8 @@ void SLAPrint::process() | |||
| 
 | ||||
|     // Slicing the model object. This method is oversimplified and needs to
 | ||||
|     // be compared with the fff slicing algorithm for verification
 | ||||
|     auto slice_model = [this, ilhs, ilh](SLAPrintObject& po) { | ||||
|         TriangleMesh mesh = po.transformed_mesh(); | ||||
|     auto slice_model = [this, ilhs, ilh, ilhd](SLAPrintObject& po) { | ||||
|         const TriangleMesh& mesh = po.transformed_mesh(); | ||||
| 
 | ||||
|         // We need to prepare the slice index...
 | ||||
| 
 | ||||
|  | @ -685,13 +691,15 @@ void SLAPrint::process() | |||
|         auto maxZs = coord_t(maxZ / SCALING_FACTOR); | ||||
| 
 | ||||
|         po.m_slice_index.clear(); | ||||
|         po.m_slice_index.reserve(size_t(maxZs - (minZs + ilhs) / lhs) + 1); | ||||
|         po.m_slice_index.emplace_back(minZs + ilhs, float(minZ) + ilh / 2.f, ilh); | ||||
| 
 | ||||
|         for(coord_t h = minZs + ilhs + lhs; h <= maxZs; h += lhs) { | ||||
|             po.m_slice_index.emplace_back(h, float(h*SCALING_FACTOR) - lh / 2.f, lh); | ||||
|         } | ||||
|          | ||||
|         size_t cap = size_t(1 + (maxZs - minZs - ilhs) / lhs); | ||||
|         po.m_slice_index.reserve(cap); | ||||
|          | ||||
|         po.m_slice_index.emplace_back(minZs + ilhs, minZ + ilhd / 2.0, ilh); | ||||
| 
 | ||||
|         for(coord_t h = minZs + ilhs + lhs; h <= maxZs; h += lhs)  | ||||
|             po.m_slice_index.emplace_back(h, h*SCALING_FACTOR - lhd / 2.0, lh); | ||||
|         | ||||
|         // Just get the first record that is form the model:
 | ||||
|         auto slindex_it = | ||||
|                 po.closest_slice_record(po.m_slice_index, float(bb3d.min(Z))); | ||||
|  | @ -704,11 +712,8 @@ void SLAPrint::process() | |||
|         po.m_model_height_levels.clear(); | ||||
|         po.m_model_height_levels.reserve(po.m_slice_index.size()); | ||||
|         for(auto it = slindex_it; it != po.m_slice_index.end(); ++it) | ||||
|         { | ||||
|             po.m_model_height_levels.emplace_back(it->slice_level()); | ||||
|         } | ||||
| 
 | ||||
|         mesh.require_shared_vertices(); // TriangleMeshSlicer needs this
 | ||||
|         TriangleMeshSlicer slicer(&mesh); | ||||
| 
 | ||||
|         po.m_model_slices.clear(); | ||||
|  | @ -1534,7 +1539,7 @@ SLAPrintObject::SLAPrintObject(SLAPrint *print, ModelObject *model_object): | |||
|     Inherited(print, model_object), | ||||
|     m_stepmask(slaposCount, true), | ||||
|     m_transformed_rmesh( [this](TriangleMesh& obj){ | ||||
|             obj = m_model_object->raw_mesh(); obj.transform(m_trafo); | ||||
|             obj = m_model_object->raw_mesh(); obj.transform(m_trafo); obj.require_shared_vertices(); | ||||
|         }) | ||||
| { | ||||
| } | ||||
|  | @ -1823,7 +1828,7 @@ void SLAPrint::StatusReporter::operator()( | |||
|         SLAPrint &p, double st, const std::string &msg, unsigned flags) | ||||
| { | ||||
|     m_st = st; | ||||
|     BOOST_LOG_TRIVIAL(info) << st << "% " << msg; | ||||
|     BOOST_LOG_TRIVIAL(info) << st << "% " << msg << log_memory_info(); | ||||
|     p.set_status(int(std::round(st)), msg, flags); | ||||
| } | ||||
| 
 | ||||
|  |  | |||
|  | @ -67,7 +67,7 @@ static wxString generate_html_row(const Config::Snapshot &snapshot, bool row_eve | |||
|     } | ||||
| 
 | ||||
|     if (! compatible) { | ||||
|         text += "<p align=\"right\">" + _(L("Incompatible with this Slic3r")) + "</p>"; | ||||
|         text += "<p align=\"right\">" + wxString::Format(_(L("Incompatible with this %s")), SLIC3R_APP_NAME) + "</p>"; | ||||
|     } | ||||
|     else if (! snapshot_active) | ||||
|         text += "<p align=\"right\"><a href=\"" + snapshot.id + "\">" + _(L("Activate")) + "</a></p>"; | ||||
|  |  | |||
|  | @ -100,6 +100,7 @@ wxString Field::get_tooltip_text(const wxString& default_string) | |||
| { | ||||
| 	wxString tooltip_text(""); | ||||
| 	wxString tooltip = _(m_opt.tooltip); | ||||
|     edit_tooltip(tooltip); | ||||
| 	if (tooltip.length() > 0) | ||||
|         tooltip_text = tooltip + "\n" + _(L("default value")) + "\t: " + | ||||
|         (boost::iends_with(m_opt_id, "_gcode") ? "\n" : "") + default_string + | ||||
|  | @ -504,6 +505,11 @@ void SpinCtrl::BUILD() { | |||
|         else tmp_value = -9999; | ||||
| #ifdef __WXOSX__ | ||||
|         propagate_value(); | ||||
| 
 | ||||
|         // Forcibly set the input value for SpinControl, since the value 
 | ||||
| 	    // inserted from the clipboard is not updated under OSX
 | ||||
|         if (tmp_value > -9999) | ||||
|             dynamic_cast<wxSpinCtrl*>(window)->SetValue(tmp_value); | ||||
| #endif | ||||
| 	}), temp->GetId()); | ||||
| 	 | ||||
|  |  | |||
|  | @ -794,10 +794,15 @@ bool GLCanvas3D::WarningTexture::_generate(const std::string& msg_utf8, const GL | |||
|     wxString msg = GUI::from_u8(msg_utf8); | ||||
| 
 | ||||
|     wxMemoryDC memDC; | ||||
| 
 | ||||
| #ifdef __WXMSW__ | ||||
|     // set scaled application normal font as default font 
 | ||||
|     wxFont font = wxGetApp().normal_font(); | ||||
| #else | ||||
|     // select default font
 | ||||
|     const float scale = canvas.get_canvas_size().get_scale_factor(); | ||||
| //     wxFont font = wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT).Scale(scale);
 | ||||
|     wxFont font = wxGetApp().normal_font();//! #ys_FIXME_experiment
 | ||||
|     wxFont font = wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT).Scale(scale); | ||||
| #endif | ||||
| 
 | ||||
|     font.MakeLarger(); | ||||
|     font.MakeBold(); | ||||
|  | @ -899,7 +904,7 @@ void GLCanvas3D::WarningTexture::render(const GLCanvas3D& canvas) const | |||
|     } | ||||
| } | ||||
| 
 | ||||
| void GLCanvas3D::WarningTexture::rescale(const GLCanvas3D& canvas) | ||||
| void GLCanvas3D::WarningTexture::msw_rescale(const GLCanvas3D& canvas) | ||||
| { | ||||
|     if (m_msg_text.empty()) | ||||
|         return; | ||||
|  | @ -976,14 +981,16 @@ bool GLCanvas3D::LegendTexture::generate(const GCodePreviewData& preview_data, c | |||
|     const int scaled_square_contour = Px_Square_Contour * scale; | ||||
|     const int scaled_border = Px_Border * scale; | ||||
| 
 | ||||
|     // select default font
 | ||||
| //     wxFont font = wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT).Scale(scale_gl);
 | ||||
|     wxFont font = wxGetApp().normal_font();//! #ys_FIXME_experiment
 | ||||
| #ifdef __WXMSW__ | ||||
|     // set scaled application normal font as default font 
 | ||||
|     wxFont font = wxGetApp().normal_font(); | ||||
| 
 | ||||
|     // Disabling ClearType works, but the font returned is very different (much thicker) from the default.
 | ||||
| //    msw_disable_cleartype(font);
 | ||||
|     bool cleartype = is_font_cleartype(font); | ||||
| #else | ||||
|     // select default font
 | ||||
|     wxFont font = wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT).Scale(scale_gl); | ||||
|     bool cleartype = false; | ||||
| #endif /* __WXMSW__ */ | ||||
| 
 | ||||
|  | @ -3190,7 +3197,7 @@ double GLCanvas3D::get_size_proportional_to_max_bed_size(double factor) const | |||
| 
 | ||||
| void GLCanvas3D::msw_rescale() | ||||
| { | ||||
|     m_warning_texture.rescale(*this); | ||||
|     m_warning_texture.msw_rescale(*this); | ||||
| } | ||||
| 
 | ||||
| bool GLCanvas3D::_is_shown_on_screen() const | ||||
|  |  | |||
|  | @ -354,7 +354,7 @@ private: | |||
|         void render(const GLCanvas3D& canvas) const; | ||||
| 
 | ||||
|         // function used to get an information for rescaling of the warning
 | ||||
|         void rescale(const GLCanvas3D& canvas); | ||||
|         void msw_rescale(const GLCanvas3D& canvas); | ||||
| 
 | ||||
|     private: | ||||
|         static const unsigned char Background_Color[3]; | ||||
|  |  | |||
|  | @ -663,7 +663,7 @@ void GUI_App::add_config_menu(wxMenuBar *menu) | |||
|     Bind(wxEVT_UPDATE_UI, [this](wxUpdateUIEvent& evt) { evt.Check(get_mode() == comAdvanced); }, config_id_base + ConfigMenuModeAdvanced); | ||||
|     Bind(wxEVT_UPDATE_UI, [this](wxUpdateUIEvent& evt) { evt.Check(get_mode() == comExpert); }, config_id_base + ConfigMenuModeExpert); | ||||
| 
 | ||||
|     local_menu->AppendSubMenu(mode_menu, _(L("Mode")), _(L("Slic3r View Mode"))); | ||||
|     local_menu->AppendSubMenu(mode_menu, _(L("Mode")), wxString::Format(_(L("%s View Mode")), SLIC3R_APP_NAME)); | ||||
|     local_menu->AppendSeparator(); | ||||
|     local_menu->Append(config_id_base + ConfigMenuLanguage, _(L("Change Application &Language"))); | ||||
|     local_menu->AppendSeparator(); | ||||
|  |  | |||
|  | @ -276,12 +276,26 @@ void MainFrame::on_dpi_changed(const wxRect &suggested_rect) | |||
|     for (auto tab : wxGetApp().tabs_list) | ||||
|         tab->msw_rescale(); | ||||
| 
 | ||||
|     // Workarounds for correct Window rendering after rescale
 | ||||
| 
 | ||||
|     /* Even if Window is maximized during moving, 
 | ||||
|      * first of all we should imitate Window resizing. So: | ||||
|      * 1. cancel maximization, if it was set | ||||
|      * 2. imitate resizing | ||||
|      * 3. set maximization, if it was set | ||||
|      */ | ||||
|     const bool is_maximized = this->IsMaximized(); | ||||
|     if (is_maximized) | ||||
|         this->Maximize(false); | ||||
| 
 | ||||
|     /* To correct window rendering (especially redraw of a status bar)
 | ||||
|      * we should imitate window resizing. | ||||
|      */ | ||||
|     const wxSize& sz = this->GetSize(); | ||||
|     this->SetSize(sz.x + 1, sz.y + 1); | ||||
|     this->SetSize(sz); | ||||
| 
 | ||||
|     this->Maximize(is_maximized); | ||||
| } | ||||
| 
 | ||||
| void MainFrame::init_menubar() | ||||
|  | @ -360,7 +374,7 @@ void MainFrame::init_menubar() | |||
|         append_menu_item(fileMenu, wxID_ANY, _(L("&Repair STL file")) + dots, _(L("Automatically repair an STL file")), | ||||
|             [this](wxCommandEvent&) { repair_stl(); }, "wrench"); | ||||
|         fileMenu->AppendSeparator(); | ||||
|         append_menu_item(fileMenu, wxID_EXIT, _(L("&Quit")), _(L("Quit Slic3r")), | ||||
|         append_menu_item(fileMenu, wxID_EXIT, _(L("&Quit")), wxString::Format(_(L("Quit %s")), SLIC3R_APP_NAME), | ||||
|             [this](wxCommandEvent&) { Close(false); }); | ||||
| 
 | ||||
|         Bind(wxEVT_UPDATE_UI, [this](wxUpdateUIEvent& evt) { evt.Enable(m_plater != nullptr); }, item_open->GetId()); | ||||
|  | @ -497,9 +511,11 @@ void MainFrame::init_menubar() | |||
| //#            wxTheApp->check_version(1);
 | ||||
| //#        });
 | ||||
| //#        $versioncheck->Enable(wxTheApp->have_version_check);
 | ||||
|         append_menu_item(helpMenu, wxID_ANY, _(L("Slic3r &Website")), _(L("Open the Slic3r website in your browser")), | ||||
|         append_menu_item(helpMenu, wxID_ANY, wxString::Format(_(L("%s &Website")), SLIC3R_APP_NAME),  | ||||
|                                              wxString::Format(_(L("Open the %s website in your browser")), SLIC3R_APP_NAME), | ||||
|             [this](wxCommandEvent&) { wxLaunchDefaultBrowser("http://slic3r.org/"); }); | ||||
|         append_menu_item(helpMenu, wxID_ANY, _(L("Slic3r &Manual")), _(L("Open the Slic3r manual in your browser")), | ||||
|         append_menu_item(helpMenu, wxID_ANY, wxString::Format(_(L("%s &Manual")), SLIC3R_APP_NAME), | ||||
|                                              wxString::Format(_(L("Open the %s manual in your browser")), SLIC3R_APP_NAME), | ||||
|             [this](wxCommandEvent&) { wxLaunchDefaultBrowser("http://manual.slic3r.org/"); }); | ||||
|         helpMenu->AppendSeparator(); | ||||
|         append_menu_item(helpMenu, wxID_ANY, _(L("System &Info")), _(L("Show system information")),  | ||||
|  |  | |||
|  | @ -70,7 +70,8 @@ MsgDialog::~MsgDialog() {} | |||
| // ErrorDialog
 | ||||
| 
 | ||||
| ErrorDialog::ErrorDialog(wxWindow *parent, const wxString &msg) | ||||
| 	: MsgDialog(parent, _(L("Slic3r error")), _(L("Slic3r has encountered an error")), | ||||
|     : MsgDialog(parent, wxString::Format(_(L("%s error")), SLIC3R_APP_NAME),  | ||||
|                         wxString::Format(_(L("%s has encountered an error")), SLIC3R_APP_NAME), | ||||
| 		wxID_NONE) | ||||
| 	, msg(msg) | ||||
| { | ||||
|  |  | |||
|  | @ -307,7 +307,10 @@ void OptionsGroup::append_line(const Line& line, wxStaticText**	full_Label/* = n | |||
| } | ||||
| 
 | ||||
| Line OptionsGroup::create_single_option_line(const Option& option) const { | ||||
| 	Line retval{ _(option.opt.label), _(option.opt.tooltip) }; | ||||
| // 	Line retval{ _(option.opt.label), _(option.opt.tooltip) };
 | ||||
|     wxString tooltip = _(option.opt.tooltip); | ||||
|     edit_tooltip(tooltip); | ||||
| 	Line retval{ _(option.opt.label), tooltip }; | ||||
|     Option tmp(option); | ||||
|     tmp.opt.label = std::string(""); | ||||
|     retval.append_option(tmp); | ||||
|  |  | |||
|  | @ -127,7 +127,7 @@ void PreferencesDialog::accept() | |||
| { | ||||
| 	if (m_values.find("no_defaults")       != m_values.end() || | ||||
| 		m_values.find("use_legacy_opengl") != m_values.end()) { | ||||
| 		warning_catcher(this, _(L("You need to restart Slic3r to make the changes effective."))); | ||||
|         warning_catcher(this, wxString::Format(_(L("You need to restart %s to make the changes effective.")), SLIC3R_APP_NAME)); | ||||
| 	} | ||||
| 
 | ||||
| 	auto app_config = get_app_config(); | ||||
|  |  | |||
|  | @ -1770,9 +1770,9 @@ void TabPrinter::build_printhost(ConfigOptionsGroup *optgroup) | |||
| 
 | ||||
| 		line.widget = [this, ca_file_hint] (wxWindow* parent) { | ||||
| 			auto txt = new wxStaticText(parent, wxID_ANY, wxString::Format("%s\n\n\t%s", | ||||
| 				_(L("HTTPS CA File:\n\
 | ||||
| \tOn this system, Slic3r uses HTTPS certificates from the system Certificate Store or Keychain.\n\ | ||||
| \tTo use a custom CA file, please import your CA file into Certificate Store / Keychain.")), | ||||
| 	wxString::Format(_(L("HTTPS CA File:\n\
 | ||||
|     \tOn this system, %s uses HTTPS certificates from the system Certificate Store or Keychain.\n\ | ||||
|     \tTo use a custom CA file, please import your CA file into Certificate Store / Keychain.")), SLIC3R_APP_NAME), | ||||
| 				ca_file_hint)); | ||||
| 			txt->SetFont(Slic3r::GUI::wxGetApp().normal_font()); | ||||
| 			auto sizer = new wxBoxSizer(wxHORIZONTAL); | ||||
|  |  | |||
|  | @ -109,7 +109,8 @@ MsgUpdateConfig::~MsgUpdateConfig() {} | |||
| // MsgDataIncompatible
 | ||||
| 
 | ||||
| MsgDataIncompatible::MsgDataIncompatible(const std::unordered_map<std::string, wxString> &incompats) : | ||||
| 	MsgDialog(nullptr, _(L("Slic3r incompatibility")), _(L("Slic3r configuration is incompatible")), wxID_NONE) | ||||
|     MsgDialog(nullptr, wxString::Format(_(L("%s incompatibility")), SLIC3R_APP_NAME),  | ||||
|                        wxString::Format(_(L("%s configuration is incompatible")), SLIC3R_APP_NAME), wxID_NONE) | ||||
| { | ||||
| 	logo->SetBitmap(create_scaled_bitmap(this, "Slic3r_192px_grayscale.png", 192)); | ||||
| 
 | ||||
|  | @ -117,9 +118,9 @@ MsgDataIncompatible::MsgDataIncompatible(const std::unordered_map<std::string, w | |||
| 		"This version of %s is not compatible with currently installed configuration bundles.\n" | ||||
| 		"This probably happened as a result of running an older %s after using a newer one.\n\n" | ||||
| 
 | ||||
| 		"You may either exit Slic3r and try again with a newer version, or you may re-run the initial configuration. " | ||||
| 		"Doing so will create a backup snapshot of the existing configuration before installing files compatible with this Slic3r.\n" | ||||
| 		)), SLIC3R_APP_NAME, SLIC3R_APP_NAME)); | ||||
| 		"You may either exit %s and try again with a newer version, or you may re-run the initial configuration. " | ||||
| 		"Doing so will create a backup snapshot of the existing configuration before installing files compatible with this %s.\n" | ||||
| 		)), SLIC3R_APP_NAME, SLIC3R_APP_NAME, SLIC3R_APP_NAME, SLIC3R_APP_NAME)); | ||||
| 	text->Wrap(CONTENT_WIDTH * wxGetApp().em_unit()); | ||||
| 	content_sizer->Add(text); | ||||
| 
 | ||||
|  | @ -144,7 +145,7 @@ MsgDataIncompatible::MsgDataIncompatible(const std::unordered_map<std::string, w | |||
| 	content_sizer->Add(versions); | ||||
| 	content_sizer->AddSpacer(2*VERT_SPACING); | ||||
| 
 | ||||
| 	auto *btn_exit = new wxButton(this, wxID_EXIT, _(L("Exit Slic3r"))); | ||||
|     auto *btn_exit = new wxButton(this, wxID_EXIT, wxString::Format(_(L("Exit %s")), SLIC3R_APP_NAME)); | ||||
| 	btn_sizer->Add(btn_exit); | ||||
| 	btn_sizer->AddSpacer(HORIZ_SPACING); | ||||
| 	auto *btn_reconf = new wxButton(this, wxID_REPLACE, _(L("Re-configure"))); | ||||
|  | @ -187,7 +188,7 @@ MsgDataLegacy::MsgDataLegacy() : | |||
| 	auto *text2 = new wxStaticText(this, wxID_ANY, _(L("For more information please visit our wiki page:"))); | ||||
| 	static const wxString url("https://github.com/prusa3d/Slic3r/wiki/Slic3r-PE-1.40-configuration-update"); | ||||
| 	// The wiki page name is intentionally not localized:
 | ||||
| 	auto *link = new wxHyperlinkCtrl(this, wxID_ANY, "Slic3r PE 1.40 configuration update", CONFIG_UPDATE_WIKI_URL); | ||||
| 	auto *link = new wxHyperlinkCtrl(this, wxID_ANY, wxString::Format("%s 1.40 configuration update", SLIC3R_APP_NAME), CONFIG_UPDATE_WIKI_URL); | ||||
| 	content_sizer->Add(text2); | ||||
| 	content_sizer->Add(link); | ||||
| 	content_sizer->AddSpacer(VERT_SPACING); | ||||
|  |  | |||
|  | @ -267,6 +267,13 @@ void wxDataViewTreeCtrlComboPopup::OnDataViewTreeCtrlSelection(wxCommandEvent& e | |||
| 	cmb->SetText(selected); | ||||
| } | ||||
| 
 | ||||
| // edit tooltip : change Slic3r to SLIC3R_APP_KEY
 | ||||
| // Temporary workaround for localization
 | ||||
| void edit_tooltip(wxString& tooltip) | ||||
| { | ||||
|     tooltip.Replace("Slic3r", SLIC3R_APP_KEY, true); | ||||
| } | ||||
| 
 | ||||
| /* Function for rescale of buttons in Dialog under MSW if dpi is changed.
 | ||||
|  * btn_ids - vector of buttons identifiers | ||||
|  */ | ||||
|  |  | |||
|  | @ -31,6 +31,8 @@ wxMenuItem* append_submenu(wxMenu* menu, wxMenu* sub_menu, int id, const wxStrin | |||
| wxMenuItem* append_menu_radio_item(wxMenu* menu, int id, const wxString& string, const wxString& description,  | ||||
|     std::function<void(wxCommandEvent& event)> cb, wxEvtHandler* event_handler); | ||||
| 
 | ||||
| class wxDialog; | ||||
| void    edit_tooltip(wxString& tooltip); | ||||
| void    msw_buttons_rescale(wxDialog* dlg, const int em_unit, const std::vector<int>& btn_ids); | ||||
| int     em_unit(wxWindow* win); | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 YuSanka
						YuSanka