mirror of
https://git.mirrors.martin98.com/https://github.com/prusa3d/PrusaSlicer.git
synced 2025-08-12 06:19:00 +08:00
Merge branch 'dk_config_update'
This commit is contained in:
commit
6da93f04bf
@ -2330,6 +2330,15 @@ namespace PresetUtils {
|
|||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
bool compare_vendor_profile_printers(const VendorProfile& vp_old, const VendorProfile& vp_new, std::vector<std::string>& new_printers)
|
||||||
|
{
|
||||||
|
for (const VendorProfile::PrinterModel& model : vp_new.models)
|
||||||
|
{
|
||||||
|
if (std::find_if(vp_old.models.begin(), vp_old.models.end(), [model](const VendorProfile::PrinterModel& pm) { return pm.id == model.id; }) == vp_old.models.end())
|
||||||
|
new_printers.push_back(model.name);
|
||||||
|
}
|
||||||
|
return new_printers.empty();
|
||||||
|
}
|
||||||
} // namespace PresetUtils
|
} // namespace PresetUtils
|
||||||
|
|
||||||
} // namespace Slic3r
|
} // namespace Slic3r
|
||||||
|
@ -630,6 +630,7 @@ namespace PresetUtils {
|
|||||||
std::string system_printer_bed_model(const Preset& preset);
|
std::string system_printer_bed_model(const Preset& preset);
|
||||||
std::string system_printer_bed_texture(const Preset& preset);
|
std::string system_printer_bed_texture(const Preset& preset);
|
||||||
bool vendor_profile_has_all_resources(const VendorProfile& vp);
|
bool vendor_profile_has_all_resources(const VendorProfile& vp);
|
||||||
|
bool compare_vendor_profile_printers(const VendorProfile& vp_old, const VendorProfile& vp_new, std::vector<std::string>& new_printers);
|
||||||
} // namespace PresetUtils
|
} // namespace PresetUtils
|
||||||
|
|
||||||
|
|
||||||
|
@ -825,13 +825,16 @@ void GUI_App::post_init()
|
|||||||
// This is ugly but I honestly found no better way to do it.
|
// This is ugly but I honestly found no better way to do it.
|
||||||
// Neither wxShowEvent nor wxWindowCreateEvent work reliably.
|
// Neither wxShowEvent nor wxWindowCreateEvent work reliably.
|
||||||
if (this->preset_updater) { // G-Code Viewer does not initialize preset_updater.
|
if (this->preset_updater) { // G-Code Viewer does not initialize preset_updater.
|
||||||
|
|
||||||
|
#if 0 // This code was moved to EVT_CONFIG_UPDATER_SYNC_DONE bind - after preset_updater finishes synchronization.
|
||||||
if (! this->check_updates(false))
|
if (! this->check_updates(false))
|
||||||
// Configuration is not compatible and reconfigure was refused by the user. Application is closing.
|
// Configuration is not compatible and reconfigure was refused by the user. Application is closing.
|
||||||
return;
|
return;
|
||||||
|
#endif
|
||||||
CallAfter([this] {
|
CallAfter([this] {
|
||||||
// preset_updater->sync downloads profile updates on background so it must begin after config wizard finished.
|
// preset_updater->sync downloads profile updates on background so it must begin after config wizard finished.
|
||||||
bool cw_showed = this->config_wizard_startup();
|
bool cw_showed = this->config_wizard_startup();
|
||||||
this->preset_updater->sync(preset_bundle);
|
this->preset_updater->sync(preset_bundle, this);
|
||||||
if (! cw_showed) {
|
if (! cw_showed) {
|
||||||
// The CallAfter is needed as well, without it, GL extensions did not show.
|
// The CallAfter is needed as well, without it, GL extensions did not show.
|
||||||
// Also, we only want to show this when the wizard does not, so the new user
|
// Also, we only want to show this when the wizard does not, so the new user
|
||||||
@ -1295,6 +1298,10 @@ bool GUI_App::on_init_inner()
|
|||||||
show_error(nullptr, evt.GetString());
|
show_error(nullptr, evt.GetString());
|
||||||
});
|
});
|
||||||
|
|
||||||
|
Bind(EVT_CONFIG_UPDATER_SYNC_DONE, [this](const wxCommandEvent& evt) {
|
||||||
|
this->check_updates(false);
|
||||||
|
});
|
||||||
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
#ifdef __WXMSW__
|
#ifdef __WXMSW__
|
||||||
|
@ -64,6 +64,7 @@ enum class NotificationType
|
|||||||
// Notification on the start of PrusaSlicer, when updates of system profiles are detected.
|
// Notification on the start of PrusaSlicer, when updates of system profiles are detected.
|
||||||
// Contains a hyperlink to execute installation of the new system profiles.
|
// Contains a hyperlink to execute installation of the new system profiles.
|
||||||
PresetUpdateAvailable,
|
PresetUpdateAvailable,
|
||||||
|
PresetUpdateAvailableNewPrinter,
|
||||||
// LoadingFailed,
|
// LoadingFailed,
|
||||||
// Errors emmited by Print::validate
|
// Errors emmited by Print::validate
|
||||||
// difference from Slicing error is that they disappear not grey out at update_background_process
|
// difference from Slicing error is that they disappear not grey out at update_background_process
|
||||||
@ -908,6 +909,13 @@ private:
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{NotificationType::PresetUpdateAvailableNewPrinter, NotificationLevel::ImportantNotificationLevel, 20, _u8L("Configuration update is available. Update contains new printer releases."), _u8L("See more."),
|
||||||
|
[](wxEvtHandler* evnthndlr) {
|
||||||
|
if (evnthndlr != nullptr)
|
||||||
|
wxPostEvent(evnthndlr, PresetUpdateAvailableClickedEvent(EVT_PRESET_UPDATE_AVAILABLE_CLICKED));
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
},
|
||||||
{NotificationType::EmptyColorChangeCode, NotificationLevel::PrintInfoNotificationLevel, 10,
|
{NotificationType::EmptyColorChangeCode, NotificationLevel::PrintInfoNotificationLevel, 10,
|
||||||
_u8L("You have just added a G-code for color change, but its value is empty.\n"
|
_u8L("You have just added a G-code for color change, but its value is empty.\n"
|
||||||
"To export the G-code correctly, check the \"Color Change G-code\" in \"Printer Settings > Custom G-code\"") },
|
"To export the G-code correctly, check the \"Color Change G-code\" in \"Printer Settings > Custom G-code\"") },
|
||||||
|
@ -305,6 +305,13 @@ MsgUpdateConfig::MsgUpdateConfig(const std::vector<Update> &updates, bool force_
|
|||||||
flex->Add(update_comment);
|
flex->Add(update_comment);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (! update.new_printers.empty()) {
|
||||||
|
flex->Add(new wxStaticText(this, wxID_ANY, _L_PLURAL("New printer:", "New printers:", update.new_printers.find(',') == std::string::npos ? 1 : 2)), 0, wxALIGN_RIGHT);
|
||||||
|
auto* update_printer = new wxStaticText(this, wxID_ANY, from_u8(update.new_printers));
|
||||||
|
update_printer->Wrap(CONTENT_WIDTH * wxGetApp().em_unit());
|
||||||
|
flex->Add(update_printer);
|
||||||
|
}
|
||||||
|
|
||||||
versions->Add(flex);
|
versions->Add(flex);
|
||||||
|
|
||||||
if (! update.changelog_url.empty() && update.version.prerelease() == nullptr) {
|
if (! update.changelog_url.empty() && update.version.prerelease() == nullptr) {
|
||||||
@ -365,6 +372,13 @@ MsgUpdateForced::MsgUpdateForced(const std::vector<Update>& updates) :
|
|||||||
versions->Add(update_comment);
|
versions->Add(update_comment);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!update.new_printers.empty()) {
|
||||||
|
versions->Add(new wxStaticText(this, wxID_ANY, _L_PLURAL("New printer:", "New printers:", update.new_printers.find(',') == std::string::npos ? 1 : 2))/*, 0, wxALIGN_RIGHT*/);
|
||||||
|
auto* update_printer = new wxStaticText(this, wxID_ANY, from_u8(update.new_printers));
|
||||||
|
update_printer->Wrap(CONTENT_WIDTH * wxGetApp().em_unit());
|
||||||
|
versions->Add(update_printer);
|
||||||
|
}
|
||||||
|
|
||||||
if (!update.changelog_url.empty() && update.version.prerelease() == nullptr) {
|
if (!update.changelog_url.empty() && update.version.prerelease() == nullptr) {
|
||||||
auto* line = new wxBoxSizer(wxHORIZONTAL);
|
auto* line = new wxBoxSizer(wxHORIZONTAL);
|
||||||
auto changelog_url = (boost::format(update.changelog_url) % lang_code).str();
|
auto changelog_url = (boost::format(update.changelog_url) % lang_code).str();
|
||||||
|
@ -90,12 +90,14 @@ public:
|
|||||||
Semver version;
|
Semver version;
|
||||||
std::string comment;
|
std::string comment;
|
||||||
std::string changelog_url;
|
std::string changelog_url;
|
||||||
|
std::string new_printers;
|
||||||
|
|
||||||
Update(std::string vendor, Semver version, std::string comment, std::string changelog_url)
|
Update(std::string vendor, Semver version, std::string comment, std::string changelog_url, std::string new_printers)
|
||||||
: vendor(std::move(vendor))
|
: vendor(std::move(vendor))
|
||||||
, version(std::move(version))
|
, version(std::move(version))
|
||||||
, comment(std::move(comment))
|
, comment(std::move(comment))
|
||||||
, changelog_url(std::move(changelog_url))
|
, changelog_url(std::move(changelog_url))
|
||||||
|
, new_printers(std::move(new_printers))
|
||||||
{}
|
{}
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -118,12 +120,14 @@ public:
|
|||||||
Semver version;
|
Semver version;
|
||||||
std::string comment;
|
std::string comment;
|
||||||
std::string changelog_url;
|
std::string changelog_url;
|
||||||
|
std::string new_printers;
|
||||||
|
|
||||||
Update(std::string vendor, Semver version, std::string comment, std::string changelog_url)
|
Update(std::string vendor, Semver version, std::string comment, std::string changelog_url, std::string new_printers)
|
||||||
: vendor(std::move(vendor))
|
: vendor(std::move(vendor))
|
||||||
, version(std::move(version))
|
, version(std::move(version))
|
||||||
, comment(std::move(comment))
|
, comment(std::move(comment))
|
||||||
, changelog_url(std::move(changelog_url))
|
, changelog_url(std::move(changelog_url))
|
||||||
|
, new_printers(std::move(new_printers))
|
||||||
{}
|
{}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -89,6 +89,9 @@ std::string escape_string_url(const std::string& unescaped)
|
|||||||
return ret_val;
|
return ret_val;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
wxDEFINE_EVENT(EVT_CONFIG_UPDATER_SYNC_DONE, wxCommandEvent);
|
||||||
|
|
||||||
struct Update
|
struct Update
|
||||||
{
|
{
|
||||||
fs::path source;
|
fs::path source;
|
||||||
@ -99,15 +102,17 @@ struct Update
|
|||||||
std::string changelog_url;
|
std::string changelog_url;
|
||||||
|
|
||||||
bool forced_update;
|
bool forced_update;
|
||||||
|
std::vector<std::string> new_printers;
|
||||||
|
|
||||||
Update() {}
|
Update() {}
|
||||||
Update(fs::path &&source, fs::path &&target, const Version &version, std::string vendor, std::string changelog_url, bool forced = false)
|
Update(fs::path &&source, fs::path &&target, const Version &version, std::string vendor, std::string changelog_url, bool forced = false, std::vector<std::string> new_printers = {})
|
||||||
: source(std::move(source))
|
: source(std::move(source))
|
||||||
, target(std::move(target))
|
, target(std::move(target))
|
||||||
, version(version)
|
, version(version)
|
||||||
, vendor(std::move(vendor))
|
, vendor(std::move(vendor))
|
||||||
, changelog_url(std::move(changelog_url))
|
, changelog_url(std::move(changelog_url))
|
||||||
, forced_update(forced)
|
, forced_update(forced)
|
||||||
|
, new_printers(std::move(new_printers))
|
||||||
{}
|
{}
|
||||||
|
|
||||||
void install() const
|
void install() const
|
||||||
@ -900,13 +905,16 @@ Updates PresetUpdater::priv::get_config_updates(const Semver &old_slic3r_version
|
|||||||
if (fs::exists(path_in_cache)) {
|
if (fs::exists(path_in_cache)) {
|
||||||
try {
|
try {
|
||||||
VendorProfile new_vp = VendorProfile::from_ini(path_in_cache, true);
|
VendorProfile new_vp = VendorProfile::from_ini(path_in_cache, true);
|
||||||
|
VendorProfile old_vp = VendorProfile::from_ini(bundle_path, true);
|
||||||
if (new_vp.config_version == recommended->config_version) {
|
if (new_vp.config_version == recommended->config_version) {
|
||||||
// The config bundle from the cache directory matches the recommended version of the index from the cache directory.
|
// The config bundle from the cache directory matches the recommended version of the index from the cache directory.
|
||||||
// This is the newest known recommended config. Use it.
|
// This is the newest known recommended config. Use it.
|
||||||
if (!PresetUtils::vendor_profile_has_all_resources(new_vp)) {
|
if (!PresetUtils::vendor_profile_has_all_resources(new_vp)) {
|
||||||
BOOST_LOG_TRIVIAL(warning) << "Some resources are missing for update of vedor " << new_vp.id;
|
BOOST_LOG_TRIVIAL(warning) << "Some resources are missing for update of vedor " << new_vp.id;
|
||||||
}
|
}
|
||||||
new_update = Update(std::move(path_in_cache), std::move(bundle_path), *recommended, vp.name, vp.changelog_url, current_not_supported);
|
std::vector<std::string> new_printers;
|
||||||
|
PresetUtils::compare_vendor_profile_printers(old_vp, new_vp, new_printers);
|
||||||
|
new_update = Update(std::move(path_in_cache), std::move(bundle_path), *recommended, vp.name, vp.changelog_url, current_not_supported, std::move(new_printers));
|
||||||
// and install the config index from the cache into vendor's directory.
|
// and install the config index from the cache into vendor's directory.
|
||||||
bundle_path_idx_to_install = idx.path();
|
bundle_path_idx_to_install = idx.path();
|
||||||
found = true;
|
found = true;
|
||||||
@ -1120,7 +1128,7 @@ PresetUpdater::~PresetUpdater()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void PresetUpdater::sync(const PresetBundle *preset_bundle)
|
void PresetUpdater::sync(const PresetBundle *preset_bundle, wxEvtHandler* evt_handler)
|
||||||
{
|
{
|
||||||
p->set_download_prefs(GUI::wxGetApp().app_config);
|
p->set_download_prefs(GUI::wxGetApp().app_config);
|
||||||
if (!p->enabled_version_check && !p->enabled_config_update) { return; }
|
if (!p->enabled_version_check && !p->enabled_config_update) { return; }
|
||||||
@ -1131,9 +1139,11 @@ void PresetUpdater::sync(const PresetBundle *preset_bundle)
|
|||||||
VendorMap vendors = preset_bundle->vendors;
|
VendorMap vendors = preset_bundle->vendors;
|
||||||
std::string index_archive_url = GUI::wxGetApp().app_config->index_archive_url();
|
std::string index_archive_url = GUI::wxGetApp().app_config->index_archive_url();
|
||||||
|
|
||||||
p->thread = std::thread([this, vendors, index_archive_url]() {
|
p->thread = std::thread([this, vendors, index_archive_url, evt_handler]() {
|
||||||
this->p->prune_tmps();
|
this->p->prune_tmps();
|
||||||
this->p->sync_config(std::move(vendors), index_archive_url);
|
this->p->sync_config(std::move(vendors), index_archive_url);
|
||||||
|
wxCommandEvent* evt = new wxCommandEvent(EVT_CONFIG_UPDATER_SYNC_DONE);
|
||||||
|
evt_handler->QueueEvent(evt);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1252,7 +1262,13 @@ PresetUpdater::UpdateResult PresetUpdater::config_update(const Semver& old_slic3
|
|||||||
std::vector<GUI::MsgUpdateForced::Update> updates_msg;
|
std::vector<GUI::MsgUpdateForced::Update> updates_msg;
|
||||||
for (const auto& update : updates.updates) {
|
for (const auto& update : updates.updates) {
|
||||||
std::string changelog_url = update.version.config_version.prerelease() == nullptr ? update.changelog_url : std::string();
|
std::string changelog_url = update.version.config_version.prerelease() == nullptr ? update.changelog_url : std::string();
|
||||||
updates_msg.emplace_back(update.vendor, update.version.config_version, update.version.comment, std::move(changelog_url));
|
std::string printers;
|
||||||
|
for (size_t i = 0; i < update.new_printers.size(); i++) {
|
||||||
|
if (i > 0)
|
||||||
|
printers += ", ";
|
||||||
|
printers += update.new_printers[i];
|
||||||
|
}
|
||||||
|
updates_msg.emplace_back(update.vendor, update.version.config_version, update.version.comment, std::move(changelog_url), std::move(printers));
|
||||||
}
|
}
|
||||||
|
|
||||||
GUI::MsgUpdateForced dlg(updates_msg);
|
GUI::MsgUpdateForced dlg(updates_msg);
|
||||||
@ -1274,7 +1290,14 @@ PresetUpdater::UpdateResult PresetUpdater::config_update(const Semver& old_slic3
|
|||||||
// regular update
|
// regular update
|
||||||
if (params == UpdateParams::SHOW_NOTIFICATION) {
|
if (params == UpdateParams::SHOW_NOTIFICATION) {
|
||||||
p->set_waiting_updates(updates);
|
p->set_waiting_updates(updates);
|
||||||
GUI::wxGetApp().plater()->get_notification_manager()->push_notification(GUI::NotificationType::PresetUpdateAvailable);
|
bool new_printer = false;
|
||||||
|
for (const Update& updt : updates.updates) {
|
||||||
|
if(updt.new_printers.size() > 0) {
|
||||||
|
new_printer = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
GUI::wxGetApp().plater()->get_notification_manager()->push_notification(new_printer? GUI::NotificationType::PresetUpdateAvailableNewPrinter : GUI::NotificationType::PresetUpdateAvailable);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
BOOST_LOG_TRIVIAL(info) << format("Update of %1% bundles available. Asking for confirmation ...", p->waiting_updates.updates.size());
|
BOOST_LOG_TRIVIAL(info) << format("Update of %1% bundles available. Asking for confirmation ...", p->waiting_updates.updates.size());
|
||||||
@ -1282,7 +1305,13 @@ PresetUpdater::UpdateResult PresetUpdater::config_update(const Semver& old_slic3
|
|||||||
std::vector<GUI::MsgUpdateConfig::Update> updates_msg;
|
std::vector<GUI::MsgUpdateConfig::Update> updates_msg;
|
||||||
for (const auto& update : updates.updates) {
|
for (const auto& update : updates.updates) {
|
||||||
std::string changelog_url = update.version.config_version.prerelease() == nullptr ? update.changelog_url : std::string();
|
std::string changelog_url = update.version.config_version.prerelease() == nullptr ? update.changelog_url : std::string();
|
||||||
updates_msg.emplace_back(update.vendor, update.version.config_version, update.version.comment, std::move(changelog_url));
|
std::string printers;
|
||||||
|
for (size_t i = 0; i < update.new_printers.size(); i++) {
|
||||||
|
if (i > 0)
|
||||||
|
printers += ", ";
|
||||||
|
printers += update.new_printers[i];
|
||||||
|
}
|
||||||
|
updates_msg.emplace_back(update.vendor, update.version.config_version, update.version.comment, std::move(changelog_url), std::move(printers));
|
||||||
}
|
}
|
||||||
|
|
||||||
GUI::MsgUpdateConfig dlg(updates_msg, params == UpdateParams::FORCED_BEFORE_WIZARD);
|
GUI::MsgUpdateConfig dlg(updates_msg, params == UpdateParams::FORCED_BEFORE_WIZARD);
|
||||||
@ -1426,7 +1455,13 @@ void PresetUpdater::on_update_notification_confirm()
|
|||||||
std::vector<GUI::MsgUpdateConfig::Update> updates_msg;
|
std::vector<GUI::MsgUpdateConfig::Update> updates_msg;
|
||||||
for (const auto& update : p->waiting_updates.updates) {
|
for (const auto& update : p->waiting_updates.updates) {
|
||||||
std::string changelog_url = update.version.config_version.prerelease() == nullptr ? update.changelog_url : std::string();
|
std::string changelog_url = update.version.config_version.prerelease() == nullptr ? update.changelog_url : std::string();
|
||||||
updates_msg.emplace_back(update.vendor, update.version.config_version, update.version.comment, std::move(changelog_url));
|
std::string printers;
|
||||||
|
for (size_t i = 0; i < update.new_printers.size(); i++) {
|
||||||
|
if (i > 0)
|
||||||
|
printers += ", ";
|
||||||
|
printers += update.new_printers[i];
|
||||||
|
}
|
||||||
|
updates_msg.emplace_back(update.vendor, update.version.config_version, update.version.comment, std::move(changelog_url), std::move(printers));
|
||||||
}
|
}
|
||||||
|
|
||||||
GUI::MsgUpdateConfig dlg(updates_msg);
|
GUI::MsgUpdateConfig dlg(updates_msg);
|
||||||
|
@ -30,7 +30,7 @@ public:
|
|||||||
~PresetUpdater();
|
~PresetUpdater();
|
||||||
|
|
||||||
// If either version check or config updating is enabled, get the appropriate data in the background and cache it.
|
// If either version check or config updating is enabled, get the appropriate data in the background and cache it.
|
||||||
void sync(const PresetBundle *preset_bundle);
|
void sync(const PresetBundle *preset_bundle, wxEvtHandler* evt_handler);
|
||||||
void cancel_sync();
|
void cancel_sync();
|
||||||
|
|
||||||
// If version check is enabled, check if chaced online slic3r version is newer, notify if so.
|
// If version check is enabled, check if chaced online slic3r version is newer, notify if so.
|
||||||
@ -74,5 +74,6 @@ private:
|
|||||||
|
|
||||||
//wxDECLARE_EVENT(EVT_SLIC3R_VERSION_ONLINE, wxCommandEvent);
|
//wxDECLARE_EVENT(EVT_SLIC3R_VERSION_ONLINE, wxCommandEvent);
|
||||||
//wxDECLARE_EVENT(EVT_SLIC3R_EXPERIMENTAL_VERSION_ONLINE, wxCommandEvent);
|
//wxDECLARE_EVENT(EVT_SLIC3R_EXPERIMENTAL_VERSION_ONLINE, wxCommandEvent);
|
||||||
|
wxDECLARE_EVENT(EVT_CONFIG_UPDATER_SYNC_DONE, wxCommandEvent);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
x
Reference in New Issue
Block a user