mirror of
https://git.mirrors.martin98.com/https://github.com/prusa3d/PrusaSlicer.git
synced 2025-08-02 06:10:36 +08:00
Multiple fixes and refactoring after code review
This commit is contained in:
parent
37d57af09a
commit
900eca8dbb
@ -3,23 +3,23 @@
|
|||||||
"description": "Prusa FFF printers",
|
"description": "Prusa FFF printers",
|
||||||
"visibility": "",
|
"visibility": "",
|
||||||
"id": "prusa-fff",
|
"id": "prusa-fff",
|
||||||
"url": "http://10.24.3.3:8001/v1/repos/prusa-fff",
|
"url": "https://preset-repo-api.prusa3d.com/v1/repos/prusa-fff/",
|
||||||
"index_url": "http://10.24.3.3:8001/v1/repos/prusa-fff/vendor_indices.zip",
|
"index_url": "https://preset-repo-api.prusa3d.com/v1/repos/prusa-fff/vendor_indices.zip",
|
||||||
"selected": 1
|
"selected": 1
|
||||||
}, {
|
}, {
|
||||||
"name": "Prusa SLA",
|
"name": "Prusa SLA",
|
||||||
"description": "Prusa SLA printers",
|
"description": "Prusa SLA printers",
|
||||||
"visibility": "",
|
"visibility": "",
|
||||||
"id": "prusa-sla",
|
"id": "prusa-sla",
|
||||||
"url": "http://10.24.3.3:8001/v1/repos/prusa-sla",
|
"url": "https://preset-repo-api.prusa3d.com/v1/repos/prusa-sla/",
|
||||||
"index_url": "http://10.24.3.3:8001/v1/repos/prusa-sla/vendor_indices.zip",
|
"index_url": "https://preset-repo-api.prusa3d.com/v1/repos/prusa-sla/vendor_indices.zip",
|
||||||
"selected": 1
|
"selected": 1
|
||||||
}, {
|
}, {
|
||||||
"name": "Non Prusa FFF",
|
"name": "Non Prusa FFF",
|
||||||
"description": "FFF printers by other vendors",
|
"description": "FFF printers by other vendors",
|
||||||
"visibility": "",
|
"visibility": "",
|
||||||
"id": "non-prusa-fff",
|
"id": "non-prusa-fff",
|
||||||
"url": "http://10.24.3.3:8001/v1/repos/non-prusa-fff/",
|
"url": "https://preset-repo-api.prusa3d.com/v1/repos/non-prusa-fff/",
|
||||||
"index_url": "http://10.24.3.3:8001/v1/repos/non-prusa-fff/vendor_indices.zip",
|
"index_url": "https://preset-repo-api.prusa3d.com/v1/repos/non-prusa-fff/vendor_indices.zip",
|
||||||
"selected": 1
|
"selected": 1
|
||||||
}]
|
}]
|
||||||
|
@ -171,11 +171,11 @@ BundleMap BundleMap::load()
|
|||||||
|
|
||||||
fs::path idx_path (archive_dir / (id + ".idx"));
|
fs::path idx_path (archive_dir / (id + ".idx"));
|
||||||
if (!boost::filesystem::exists(idx_path)) {
|
if (!boost::filesystem::exists(idx_path)) {
|
||||||
BOOST_LOG_TRIVIAL(error) << format("Missing index %1% when loading bundle %2%. Going to search for it in cache folder.", idx_path.string(), id);
|
BOOST_LOG_TRIVIAL(info) << format("Missing index %1% when loading bundle %2%. Going to search for it in cache folder.", idx_path.string(), id);
|
||||||
idx_path = fs::path(cache_dir / (id + ".idx"));
|
idx_path = fs::path(cache_dir / (id + ".idx"));
|
||||||
}
|
}
|
||||||
if (!boost::filesystem::exists(idx_path)) {
|
if (!boost::filesystem::exists(idx_path)) {
|
||||||
BOOST_LOG_TRIVIAL(error) << format("Missing index %1% when loading bundle %2%. Going to search for it in vendor folder. Is it a 3rd party profile?", idx_path.string(), id);
|
BOOST_LOG_TRIVIAL(info) << format("Missing index %1% when loading bundle %2%. Going to search for it in vendor folder. Is it a 3rd party profile?", idx_path.string(), id);
|
||||||
idx_path = fs::path(vendor_dir / (id + ".idx"));
|
idx_path = fs::path(vendor_dir / (id + ".idx"));
|
||||||
}
|
}
|
||||||
if (!boost::filesystem::exists(idx_path)) {
|
if (!boost::filesystem::exists(idx_path)) {
|
||||||
@ -229,109 +229,6 @@ BundleMap BundleMap::load()
|
|||||||
|
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
#if 0
|
|
||||||
// Reload is a mockup of a function that takes existing BundleMap and reshapes it into current form.
|
|
||||||
// It would be called after calling preset_updater->sync_blocking() and preset_updater->config_update() instead of fully loading it from scratch.
|
|
||||||
// Some entries will stop existing because its repositories were unselected.
|
|
||||||
// Missing: Entries that changed location: e.g. newer ini is now ready in archive_dir, while previously it was in rsrc_vendor_dir
|
|
||||||
void BundleMap::reload(BundleMap& res)
|
|
||||||
{
|
|
||||||
const auto vendor_dir = (boost::filesystem::path(Slic3r::data_dir()) / "vendor").make_preferred();
|
|
||||||
const auto archive_dir = (boost::filesystem::path(Slic3r::data_dir()) / "cache" / "vendor").make_preferred();
|
|
||||||
const auto rsrc_vendor_dir = (boost::filesystem::path(resources_dir()) / "profiles").make_preferred();
|
|
||||||
const auto cache_dir = boost::filesystem::path(Slic3r::data_dir()) / "cache"; // for Index
|
|
||||||
|
|
||||||
// Load the other bundles in the datadir/vendor directory
|
|
||||||
// and then additionally from datadir/cache/vendor (archive) and resources/profiles.
|
|
||||||
// Should we concider case where archive has older profiles than resources (shouldnt happen)? -> YES, it happens during re-configuration when running older PS after newer version
|
|
||||||
typedef std::pair<const fs::path&, BundleLocation> DirData;
|
|
||||||
std::vector<DirData> dir_list{ {vendor_dir, BundleLocation::IN_VENDOR}, {archive_dir, BundleLocation::IN_ARCHIVE}, {rsrc_vendor_dir, BundleLocation::IN_RESOURCES} };
|
|
||||||
for (auto dir : dir_list) {
|
|
||||||
if (!fs::exists(dir.first))
|
|
||||||
continue;
|
|
||||||
for (const auto& dir_entry : boost::filesystem::directory_iterator(dir.first)) {
|
|
||||||
if (Slic3r::is_ini_file(dir_entry)) {
|
|
||||||
std::string id = dir_entry.path().stem().string(); // stem() = filename() without the trailing ".ini" part
|
|
||||||
|
|
||||||
// Don't load this bundle if we've already loaded it.
|
|
||||||
if (res.find(id) != res.end()) { continue; }
|
|
||||||
|
|
||||||
// Fresh index should be in archive_dir, otherwise look for it in cache
|
|
||||||
// Then if not in archive or cache - it could be 3rd party profile that user just copied to vendor folder (both ini and cache)
|
|
||||||
|
|
||||||
fs::path idx_path(archive_dir / (id + ".idx"));
|
|
||||||
if (!boost::filesystem::exists(idx_path)) {
|
|
||||||
BOOST_LOG_TRIVIAL(error) << format("Missing index %1% when loading bundle %2%. Going to search for it in cache folder.", idx_path.string(), id);
|
|
||||||
idx_path = fs::path(cache_dir / (id + ".idx"));
|
|
||||||
}
|
|
||||||
if (!boost::filesystem::exists(idx_path)) {
|
|
||||||
BOOST_LOG_TRIVIAL(error) << format("Missing index %1% when loading bundle %2%. Going to search for it in vendor folder. Is it a 3rd party profile?", idx_path.string(), id);
|
|
||||||
idx_path = fs::path(vendor_dir / (id + ".idx"));
|
|
||||||
}
|
|
||||||
if (!boost::filesystem::exists(idx_path)) {
|
|
||||||
BOOST_LOG_TRIVIAL(error) << format("Could not load bundle %1% due to missing index %2%.", id, idx_path.string());
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
Slic3r::GUI::Config::Index index;
|
|
||||||
try {
|
|
||||||
index.load(idx_path);
|
|
||||||
}
|
|
||||||
catch (const std::exception& /* err */) {
|
|
||||||
BOOST_LOG_TRIVIAL(error) << format("Could not load bundle %1% due to invalid index %2%.", id, idx_path.string());
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
const auto recommended_it = index.recommended();
|
|
||||||
if (recommended_it == index.end()) {
|
|
||||||
BOOST_LOG_TRIVIAL(error) << format("Could not load bundle %1% due to no recommended version in index %2%.", id, idx_path.string());
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
const auto recommended = recommended_it->config_version;
|
|
||||||
VendorProfile vp;
|
|
||||||
try {
|
|
||||||
vp = VendorProfile::from_ini(dir_entry, true);
|
|
||||||
}
|
|
||||||
catch (const std::exception& e) {
|
|
||||||
BOOST_LOG_TRIVIAL(error) << format("Could not load bundle %1% due to corrupted profile file %2%. Message: %3%", id, dir_entry.path().string(), e.what());
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
// Don't load
|
|
||||||
if (vp.config_version > recommended)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
Bundle bundle;
|
|
||||||
if (bundle.load(dir_entry.path(), dir.second))
|
|
||||||
res.emplace(std::move(id), std::move(bundle));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Delete no longer existing entries and not used repos
|
|
||||||
const PresetArchiveDatabase* pad = wxGetApp().plater()->get_preset_archive_database();
|
|
||||||
std::vector<std::string> to_erease;
|
|
||||||
for (const auto& entry : res) {
|
|
||||||
fs::path ini_path;
|
|
||||||
switch (entry.second.location) {
|
|
||||||
case IN_VENDOR: ini_path = vendor_dir / (entry.first + ".ini"); break;
|
|
||||||
case IN_ARCHIVE: ini_path = archive_dir / (entry.first + ".ini"); break;
|
|
||||||
case IN_RESOURCES: ini_path = rsrc_vendor_dir / (entry.first + ".ini"); break;
|
|
||||||
default: assert(true);
|
|
||||||
}
|
|
||||||
if (!fs::exists(ini_path)) {
|
|
||||||
to_erease.emplace_back(entry.first);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if (entry.second.vendor_profile->repo_id.empty() || !pad->is_selected_repository_by_id(entry.second.vendor_profile->repo_id))
|
|
||||||
{
|
|
||||||
to_erease.emplace_back(entry.first);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
for (const std::string& id : to_erease)
|
|
||||||
{
|
|
||||||
res.erase(id);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif // 0
|
|
||||||
|
|
||||||
Bundle& BundleMap::prusa_bundle()
|
Bundle& BundleMap::prusa_bundle()
|
||||||
{
|
{
|
||||||
@ -732,11 +629,11 @@ PageUpdateManager::PageUpdateManager(ConfigWizard* parent_in)
|
|||||||
|
|
||||||
const int em = em_unit(this);
|
const int em = em_unit(this);
|
||||||
|
|
||||||
m_manager = std::make_unique<UIManager>(this, wxGetApp().plater()->get_preset_archive_database(), em);
|
m_manager = std::make_unique<RepositoryUpdateUIManager>(this, wxGetApp().plater()->get_preset_archive_database(), em);
|
||||||
|
|
||||||
auto sizer = m_manager->get_sizer();
|
auto sizer = m_manager->get_sizer();
|
||||||
|
|
||||||
ScalableButton* btn = new ScalableButton(this, wxID_ANY, "", " " + _L("Confirm configuration update") + " ");
|
wxButton* btn = new wxButton(this, wxID_ANY, " " + _L("Confirm configuration update") + " ");
|
||||||
btn->SetFont(wxGetApp().bold_font());
|
btn->SetFont(wxGetApp().bold_font());
|
||||||
wxGetApp().UpdateDarkUI(btn, true);
|
wxGetApp().UpdateDarkUI(btn, true);
|
||||||
btn->Bind(wxEVT_BUTTON, [this](wxCommandEvent& event) {
|
btn->Bind(wxEVT_BUTTON, [this](wxCommandEvent& event) {
|
||||||
|
@ -97,7 +97,7 @@ struct BundleMap : std::map<std::string /* = vendor ID */, Bundle>
|
|||||||
|
|
||||||
struct Materials;
|
struct Materials;
|
||||||
|
|
||||||
class UIManager;
|
class RepositoryUpdateUIManager;
|
||||||
|
|
||||||
struct PrinterPickerEvent;
|
struct PrinterPickerEvent;
|
||||||
|
|
||||||
@ -187,7 +187,7 @@ struct PageWelcome: ConfigWizardPage
|
|||||||
|
|
||||||
struct PageUpdateManager : ConfigWizardPage
|
struct PageUpdateManager : ConfigWizardPage
|
||||||
{
|
{
|
||||||
std::unique_ptr<UIManager> m_manager;
|
std::unique_ptr<RepositoryUpdateUIManager> m_manager;
|
||||||
|
|
||||||
PageUpdateManager(ConfigWizard* parent);
|
PageUpdateManager(ConfigWizard* parent);
|
||||||
};
|
};
|
||||||
|
@ -2569,7 +2569,6 @@ wxMenu* GUI_App::get_config_menu()
|
|||||||
local_menu->Append(config_id_base + ConfigMenuWizard, config_wizard_name + dots, config_wizard_tooltip);
|
local_menu->Append(config_id_base + ConfigMenuWizard, config_wizard_name + dots, config_wizard_tooltip);
|
||||||
local_menu->Append(config_id_base + ConfigMenuSnapshots, _L("&Configuration Snapshots") + dots, _L("Inspect / activate configuration snapshots"));
|
local_menu->Append(config_id_base + ConfigMenuSnapshots, _L("&Configuration Snapshots") + dots, _L("Inspect / activate configuration snapshots"));
|
||||||
local_menu->Append(config_id_base + ConfigMenuTakeSnapshot, _L("Take Configuration &Snapshot"), _L("Capture a configuration snapshot"));
|
local_menu->Append(config_id_base + ConfigMenuTakeSnapshot, _L("Take Configuration &Snapshot"), _L("Capture a configuration snapshot"));
|
||||||
local_menu->Append(config_id_base + ConfigMenuManageUpdateConf, _L("Manage Configuration Updates"), _L("Manage Configuration Updates"));
|
|
||||||
local_menu->Append(config_id_base + ConfigMenuUpdateConf, _L("Check for Configuration Updates"), _L("Check for configuration updates"));
|
local_menu->Append(config_id_base + ConfigMenuUpdateConf, _L("Check for Configuration Updates"), _L("Check for configuration updates"));
|
||||||
local_menu->Append(config_id_base + ConfigMenuUpdateApp, _L("Check for Application Updates"), _L("Check for new version of application"));
|
local_menu->Append(config_id_base + ConfigMenuUpdateApp, _L("Check for Application Updates"), _L("Check for new version of application"));
|
||||||
#if defined(__linux__) && defined(SLIC3R_DESKTOP_INTEGRATION)
|
#if defined(__linux__) && defined(SLIC3R_DESKTOP_INTEGRATION)
|
||||||
@ -2601,9 +2600,6 @@ wxMenu* GUI_App::get_config_menu()
|
|||||||
case ConfigMenuWizard:
|
case ConfigMenuWizard:
|
||||||
run_wizard(ConfigWizard::RR_USER);
|
run_wizard(ConfigWizard::RR_USER);
|
||||||
break;
|
break;
|
||||||
case ConfigMenuManageUpdateConf:
|
|
||||||
manage_updates();
|
|
||||||
break;
|
|
||||||
case ConfigMenuUpdateConf:
|
case ConfigMenuUpdateConf:
|
||||||
check_updates(true);
|
check_updates(true);
|
||||||
break;
|
break;
|
||||||
@ -3226,7 +3222,6 @@ bool GUI_App::run_wizard(ConfigWizard::RunReason reason, ConfigWizard::StartPage
|
|||||||
m_login_dialog.reset();
|
m_login_dialog.reset();
|
||||||
}
|
}
|
||||||
#endif // 0
|
#endif // 0
|
||||||
plater()->get_preset_archive_database()->set_wizard_lock(true);
|
|
||||||
plater()->get_preset_archive_database()->sync_blocking();
|
plater()->get_preset_archive_database()->sync_blocking();
|
||||||
|
|
||||||
auto wizard = new ConfigWizard(mainframe);
|
auto wizard = new ConfigWizard(mainframe);
|
||||||
@ -3246,7 +3241,6 @@ bool GUI_App::run_wizard(ConfigWizard::RunReason reason, ConfigWizard::StartPage
|
|||||||
if (preset_bundle->printers.get_edited_preset().printer_technology() == ptSLA)
|
if (preset_bundle->printers.get_edited_preset().printer_technology() == ptSLA)
|
||||||
may_switch_to_SLA_preset(_L("Configuration is editing from ConfigWizard"));
|
may_switch_to_SLA_preset(_L("Configuration is editing from ConfigWizard"));
|
||||||
}
|
}
|
||||||
plater()->get_preset_archive_database()->set_wizard_lock(false);
|
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3451,23 +3445,22 @@ bool GUI_App::config_wizard_startup()
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void GUI_App::manage_updates()
|
void GUI_App::manage_preset_repositiories()
|
||||||
{
|
{
|
||||||
ManageUpdatesDialog dlg(plater()->get_preset_archive_database());
|
ManagePresetRepositoriesDialog dlg(plater()->get_preset_archive_database());
|
||||||
dlg.ShowModal();
|
dlg.ShowModal();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool GUI_App::check_updates(const bool verbose)
|
bool GUI_App::check_updates(const bool invoked_automatically)
|
||||||
{
|
{
|
||||||
// verbose means - not run after startup, but by user
|
// verbose means - not run after startup, but by user
|
||||||
if (verbose) {
|
if (invoked_automatically) {
|
||||||
// do preset_updater sync so if user runs slicer for a long time, check for updates actually delivers updates.
|
// do preset_updater sync so if user runs slicer for a long time, check for updates actually delivers updates.
|
||||||
// for preset_updater sync we need to sync archive database first
|
// for preset_updater sync we need to sync archive database first
|
||||||
plater()->get_preset_archive_database()->sync_blocking();
|
plater()->get_preset_archive_database()->sync_blocking();
|
||||||
// and we can have user to select the repos they want (thats additional dialog)
|
// and we can have user to select the repos they want (thats additional dialog)
|
||||||
manage_updates();
|
manage_preset_repositiories();
|
||||||
// then its time for preset_updater sync
|
// then its time for preset_updater sync
|
||||||
// BE CAREFUL! sync and sync_blocking sends event that calls check_updates(false)
|
|
||||||
preset_updater->sync_blocking(preset_bundle, this, plater()->get_preset_archive_database()->get_archive_repositories(), plater()->get_preset_archive_database()->get_selected_repositories_uuid());
|
preset_updater->sync_blocking(preset_bundle, this, plater()->get_preset_archive_database()->get_archive_repositories(), plater()->get_preset_archive_database()->get_selected_repositories_uuid());
|
||||||
// and then we check updates
|
// and then we check updates
|
||||||
}
|
}
|
||||||
@ -3475,7 +3468,7 @@ bool GUI_App::check_updates(const bool verbose)
|
|||||||
PresetUpdater::UpdateResult updater_result;
|
PresetUpdater::UpdateResult updater_result;
|
||||||
try {
|
try {
|
||||||
preset_updater->update_index_db();
|
preset_updater->update_index_db();
|
||||||
updater_result = preset_updater->config_update(app_config->orig_version(), verbose ? PresetUpdater::UpdateParams::SHOW_TEXT_BOX : PresetUpdater::UpdateParams::SHOW_NOTIFICATION, plater()->get_preset_archive_database()->get_archive_repositories());
|
updater_result = preset_updater->config_update(app_config->orig_version(), invoked_automatically ? PresetUpdater::UpdateParams::SHOW_TEXT_BOX : PresetUpdater::UpdateParams::SHOW_NOTIFICATION, plater()->get_preset_archive_database()->get_archive_repositories());
|
||||||
if (updater_result == PresetUpdater::R_INCOMPAT_EXIT) {
|
if (updater_result == PresetUpdater::R_INCOMPAT_EXIT) {
|
||||||
mainframe->Close();
|
mainframe->Close();
|
||||||
// Applicaiton is closing.
|
// Applicaiton is closing.
|
||||||
@ -3484,7 +3477,7 @@ bool GUI_App::check_updates(const bool verbose)
|
|||||||
else if (updater_result == PresetUpdater::R_INCOMPAT_CONFIGURED) {
|
else if (updater_result == PresetUpdater::R_INCOMPAT_CONFIGURED) {
|
||||||
m_app_conf_exists = true;
|
m_app_conf_exists = true;
|
||||||
}
|
}
|
||||||
else if (verbose && updater_result == PresetUpdater::R_NOOP) {
|
else if (invoked_automatically && updater_result == PresetUpdater::R_NOOP) {
|
||||||
MsgNoUpdates dlg;
|
MsgNoUpdates dlg;
|
||||||
dlg.ShowModal();
|
dlg.ShowModal();
|
||||||
}
|
}
|
||||||
|
@ -96,7 +96,6 @@ enum ConfigMenuIDs {
|
|||||||
ConfigMenuWizard,
|
ConfigMenuWizard,
|
||||||
ConfigMenuSnapshots,
|
ConfigMenuSnapshots,
|
||||||
ConfigMenuTakeSnapshot,
|
ConfigMenuTakeSnapshot,
|
||||||
ConfigMenuManageUpdateConf,
|
|
||||||
ConfigMenuUpdateConf,
|
ConfigMenuUpdateConf,
|
||||||
ConfigMenuUpdateApp,
|
ConfigMenuUpdateApp,
|
||||||
ConfigMenuDesktopIntegration,
|
ConfigMenuDesktopIntegration,
|
||||||
@ -441,10 +440,10 @@ private:
|
|||||||
bool select_language();
|
bool select_language();
|
||||||
|
|
||||||
bool config_wizard_startup();
|
bool config_wizard_startup();
|
||||||
void manage_updates();
|
void manage_preset_repositiories();
|
||||||
// Returns true if the configuration is fine.
|
// Returns true if the configuration is fine.
|
||||||
// Returns true if the configuration is not compatible and the user decided to rather close the slicer instead of reconfiguring.
|
// Returns true if the configuration is not compatible and the user decided to rather close the slicer instead of reconfiguring.
|
||||||
bool check_updates(const bool verbose);
|
bool check_updates(const bool invoked_automatically);
|
||||||
void on_version_read(wxCommandEvent& evt);
|
void on_version_read(wxCommandEvent& evt);
|
||||||
// if the data from version file are already downloaded, shows dialogs to start download of new version of app
|
// if the data from version file are already downloaded, shows dialogs to start download of new version of app
|
||||||
void app_updater(bool from_user);
|
void app_updater(bool from_user);
|
||||||
|
@ -909,7 +909,6 @@ Plater::priv::priv(Plater *q, MainFrame *main_frame)
|
|||||||
wxGetApp().update_login_dialog();
|
wxGetApp().update_login_dialog();
|
||||||
#endif // 0
|
#endif // 0
|
||||||
this->show_action_buttons(this->ready_to_slice);
|
this->show_action_buttons(this->ready_to_slice);
|
||||||
preset_archive_database->set_access_token(user_account->get_access_token());
|
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
// data were corrupt and username was not retrieved
|
// data were corrupt and username was not retrieved
|
||||||
@ -923,7 +922,6 @@ Plater::priv::priv(Plater *q, MainFrame *main_frame)
|
|||||||
this->main_frame->refresh_account_menu(true);
|
this->main_frame->refresh_account_menu(true);
|
||||||
// Update sidebar printer status
|
// Update sidebar printer status
|
||||||
sidebar->update_printer_presets_combobox();
|
sidebar->update_printer_presets_combobox();
|
||||||
preset_archive_database->set_access_token({});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
});
|
});
|
||||||
@ -937,7 +935,6 @@ Plater::priv::priv(Plater *q, MainFrame *main_frame)
|
|||||||
this->main_frame->refresh_account_menu(true);
|
this->main_frame->refresh_account_menu(true);
|
||||||
// Update sidebar printer status
|
// Update sidebar printer status
|
||||||
sidebar->update_printer_presets_combobox();
|
sidebar->update_printer_presets_combobox();
|
||||||
preset_archive_database->set_access_token({});
|
|
||||||
});
|
});
|
||||||
this->q->Bind(EVT_UA_FAIL, [this](UserAccountFailEvent& evt) {
|
this->q->Bind(EVT_UA_FAIL, [this](UserAccountFailEvent& evt) {
|
||||||
BOOST_LOG_TRIVIAL(error) << "Failed communication with Prusa Account: " << evt.data;
|
BOOST_LOG_TRIVIAL(error) << "Failed communication with Prusa Account: " << evt.data;
|
||||||
|
@ -660,15 +660,14 @@ std::string PresetArchiveDatabase::get_next_uuid()
|
|||||||
}
|
}
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
bool sync_inner(const std::string& token, std::string& manifest)
|
bool sync_inner(std::string& manifest)
|
||||||
{
|
{
|
||||||
bool ret = false;
|
bool ret = false;
|
||||||
#ifdef SLIC3R_REPO_URL
|
#ifdef SLIC3R_REPO_URL
|
||||||
std::string url = SLIC3R_REPO_URL;
|
std::string url = SLIC3R_REPO_URL;
|
||||||
#else
|
#else
|
||||||
std::string url = "http://10.24.3.3:8001/v1/repos";
|
std::string url = "https://preset-repo-api-stage.prusa3d.com/v1/repos";
|
||||||
#endif
|
#endif
|
||||||
// TODO: use token
|
|
||||||
auto http = Http::get(std::move(url));
|
auto http = Http::get(std::move(url));
|
||||||
add_authorization_header(http);
|
add_authorization_header(http);
|
||||||
http
|
http
|
||||||
@ -688,23 +687,11 @@ bool sync_inner(const std::string& token, std::string& manifest)
|
|||||||
|
|
||||||
void PresetArchiveDatabase::sync_blocking()
|
void PresetArchiveDatabase::sync_blocking()
|
||||||
{
|
{
|
||||||
if (m_wizard_lock) {
|
BOOST_LOG_TRIVIAL(error) << __FUNCTION__ << " " << std::this_thread::get_id();
|
||||||
m_staged_sync = true;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
std::string manifest;
|
std::string manifest;
|
||||||
if (!sync_inner(m_token, manifest))
|
if (!sync_inner(manifest))
|
||||||
return;
|
return;
|
||||||
read_server_manifest(std::move(manifest));
|
read_server_manifest(std::move(manifest));
|
||||||
}
|
}
|
||||||
|
|
||||||
void PresetArchiveDatabase::set_wizard_lock(bool lock)
|
|
||||||
{
|
|
||||||
m_wizard_lock = lock;
|
|
||||||
if (m_staged_sync) {
|
|
||||||
sync_blocking();
|
|
||||||
}
|
|
||||||
m_staged_sync = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
}} // Slic3r::GUI
|
}} // Slic3r::GUI
|
@ -101,22 +101,19 @@ public:
|
|||||||
PresetArchiveDatabase(AppConfig* app_config, wxEvtHandler* evt_handler);
|
PresetArchiveDatabase(AppConfig* app_config, wxEvtHandler* evt_handler);
|
||||||
~PresetArchiveDatabase() {}
|
~PresetArchiveDatabase() {}
|
||||||
|
|
||||||
const ArchiveRepositoryVector& get_archive_repositories() const { return m_archive_repositories; }
|
|
||||||
void set_access_token(const std::string& token) { m_token = token; }
|
|
||||||
void sync_blocking();
|
void sync_blocking();
|
||||||
//void set_local_archives(AppConfig* app_config);
|
|
||||||
void read_server_manifest(const std::string& json_body);
|
const ArchiveRepositoryVector& get_archive_repositories() const { return m_archive_repositories; }
|
||||||
bool is_selected_repository_by_uuid(const std::string& uuid) const;
|
bool is_selected_repository_by_uuid(const std::string& uuid) const;
|
||||||
bool is_selected_repository_by_id(const std::string& repo_id) const;
|
bool is_selected_repository_by_id(const std::string& repo_id) const;
|
||||||
const std::map<std::string, bool>& get_selected_repositories_uuid() const { assert(m_selected_repositories_uuid.size() == m_archive_repositories.size()); return m_selected_repositories_uuid; }
|
const std::map<std::string, bool>& get_selected_repositories_uuid() const { assert(m_selected_repositories_uuid.size() == m_archive_repositories.size()); return m_selected_repositories_uuid; }
|
||||||
bool set_selected_repositories(const std::vector<std::string>& used_uuids, std::string& msg);
|
bool set_selected_repositories(const std::vector<std::string>& used_uuids, std::string& msg);
|
||||||
std::string add_local_archive(const boost::filesystem::path path, std::string& msg);
|
std::string add_local_archive(const boost::filesystem::path path, std::string& msg);
|
||||||
void remove_local_archive(const std::string& uuid);
|
void remove_local_archive(const std::string& uuid);
|
||||||
// should be called only from main UI thread.
|
|
||||||
void set_wizard_lock(bool lock);
|
|
||||||
private:
|
private:
|
||||||
void load_app_manifest_json();
|
void load_app_manifest_json();
|
||||||
void copy_initial_manifest();
|
void copy_initial_manifest();
|
||||||
|
void read_server_manifest(const std::string& json_body);
|
||||||
void save_app_manifest_json() const;
|
void save_app_manifest_json() const;
|
||||||
void clear_online_repos();
|
void clear_online_repos();
|
||||||
bool is_selected(const std::string& id) const;
|
bool is_selected(const std::string& id) const;
|
||||||
@ -127,10 +124,7 @@ private:
|
|||||||
boost::filesystem::path m_unq_tmp_path;
|
boost::filesystem::path m_unq_tmp_path;
|
||||||
ArchiveRepositoryVector m_archive_repositories;
|
ArchiveRepositoryVector m_archive_repositories;
|
||||||
std::map<std::string, bool> m_selected_repositories_uuid;
|
std::map<std::string, bool> m_selected_repositories_uuid;
|
||||||
std::string m_token;
|
|
||||||
boost::uuids::random_generator m_uuid_generator;
|
boost::uuids::random_generator m_uuid_generator;
|
||||||
bool m_wizard_lock { false };
|
|
||||||
bool m_staged_sync { false };
|
|
||||||
};
|
};
|
||||||
|
|
||||||
}} // Slic3r::GUI
|
}} // Slic3r::GUI
|
||||||
|
@ -20,7 +20,7 @@ namespace fs = boost::filesystem;
|
|||||||
namespace Slic3r {
|
namespace Slic3r {
|
||||||
namespace GUI {
|
namespace GUI {
|
||||||
|
|
||||||
UIManager::UIManager(wxWindow* parent, PresetArchiveDatabase* pad, int em) :
|
RepositoryUpdateUIManager::RepositoryUpdateUIManager(wxWindow* parent, PresetArchiveDatabase* pad, int em) :
|
||||||
m_parent(parent)
|
m_parent(parent)
|
||||||
,m_pad(pad)
|
,m_pad(pad)
|
||||||
,m_main_sizer(new wxBoxSizer(wxVERTICAL))
|
,m_main_sizer(new wxBoxSizer(wxVERTICAL))
|
||||||
@ -56,7 +56,7 @@ UIManager::UIManager(wxWindow* parent, PresetArchiveDatabase* pad, int em) :
|
|||||||
fill_grids();
|
fill_grids();
|
||||||
}
|
}
|
||||||
|
|
||||||
void UIManager::fill_entries(bool init_selection/* = false*/)
|
void RepositoryUpdateUIManager::fill_entries(bool init_selection/* = false*/)
|
||||||
{
|
{
|
||||||
m_online_entries.clear();
|
m_online_entries.clear();
|
||||||
m_offline_entries.clear();
|
m_offline_entries.clear();
|
||||||
@ -82,7 +82,7 @@ void UIManager::fill_entries(bool init_selection/* = false*/)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void UIManager::fill_grids()
|
void RepositoryUpdateUIManager::fill_grids()
|
||||||
{
|
{
|
||||||
// clear grids
|
// clear grids
|
||||||
m_online_sizer->Clear(true);
|
m_online_sizer->Clear(true);
|
||||||
@ -169,7 +169,7 @@ void UIManager::fill_grids()
|
|||||||
add(new wxStaticText(m_parent, wxID_ANY, from_u8(entry.source)));
|
add(new wxStaticText(m_parent, wxID_ANY, from_u8(entry.source)));
|
||||||
|
|
||||||
{
|
{
|
||||||
ScalableButton* btn = new ScalableButton(m_parent, wxID_ANY, "", " " + _L("Remove") + " ");
|
wxButton* btn = new wxButton(m_parent, wxID_ANY, " " + _L("Remove") + " ");
|
||||||
wxGetApp().UpdateDarkUI(btn, true);
|
wxGetApp().UpdateDarkUI(btn, true);
|
||||||
btn->Bind(wxEVT_BUTTON, [this, &entry](wxCommandEvent& event) { remove_offline_repos(entry.id); });
|
btn->Bind(wxEVT_BUTTON, [this, &entry](wxCommandEvent& event) { remove_offline_repos(entry.id); });
|
||||||
add(btn);
|
add(btn);
|
||||||
@ -178,7 +178,7 @@ void UIManager::fill_grids()
|
|||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
ScalableButton* btn = new ScalableButton(m_parent, wxID_ANY, "", " " + _L("Load") + "... ");
|
wxButton* btn = new wxButton(m_parent, wxID_ANY, " " + _L("Load") + "... ");
|
||||||
wxGetApp().UpdateDarkUI(btn, true);
|
wxGetApp().UpdateDarkUI(btn, true);
|
||||||
btn->Bind(wxEVT_BUTTON, [this](wxCommandEvent& event) { load_offline_repos(); });
|
btn->Bind(wxEVT_BUTTON, [this](wxCommandEvent& event) { load_offline_repos(); });
|
||||||
m_offline_sizer->Add(btn);
|
m_offline_sizer->Add(btn);
|
||||||
@ -186,7 +186,7 @@ void UIManager::fill_grids()
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void UIManager::update()
|
void RepositoryUpdateUIManager::update()
|
||||||
{
|
{
|
||||||
fill_entries();
|
fill_entries();
|
||||||
|
|
||||||
@ -207,7 +207,7 @@ void UIManager::update()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void UIManager::remove_offline_repos(const std::string& id)
|
void RepositoryUpdateUIManager::remove_offline_repos(const std::string& id)
|
||||||
{
|
{
|
||||||
m_pad->remove_local_archive(id);
|
m_pad->remove_local_archive(id);
|
||||||
m_selected_uuids.erase(id);
|
m_selected_uuids.erase(id);
|
||||||
@ -220,10 +220,10 @@ void UIManager::remove_offline_repos(const std::string& id)
|
|||||||
update();
|
update();
|
||||||
}
|
}
|
||||||
|
|
||||||
void UIManager::load_offline_repos()
|
void RepositoryUpdateUIManager::load_offline_repos()
|
||||||
{
|
{
|
||||||
wxArrayString input_files;
|
wxArrayString input_files;
|
||||||
wxFileDialog dialog(m_parent, _L("Choose one or more YIP-files") + ":",
|
wxFileDialog dialog(m_parent, _L("Choose one or more ZIP-files") + ":",
|
||||||
from_u8(wxGetApp().app_config->get_last_dir()), "",
|
from_u8(wxGetApp().app_config->get_last_dir()), "",
|
||||||
file_wildcards(FT_ZIP), wxFD_OPEN | /*wxFD_MULTIPLE | */wxFD_FILE_MUST_EXIST);
|
file_wildcards(FT_ZIP), wxFD_OPEN | /*wxFD_MULTIPLE | */wxFD_FILE_MUST_EXIST);
|
||||||
|
|
||||||
@ -254,7 +254,7 @@ void UIManager::load_offline_repos()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool UIManager::set_selected_repositories()
|
bool RepositoryUpdateUIManager::set_selected_repositories()
|
||||||
{
|
{
|
||||||
std::vector<std::string> used_ids;
|
std::vector<std::string> used_ids;
|
||||||
std::copy(m_selected_uuids.begin(), m_selected_uuids.end(), std::back_inserter(used_ids));
|
std::copy(m_selected_uuids.begin(), m_selected_uuids.end(), std::back_inserter(used_ids));
|
||||||
@ -270,7 +270,7 @@ bool UIManager::set_selected_repositories()
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
ManageUpdatesDialog::ManageUpdatesDialog(PresetArchiveDatabase* pad)
|
ManagePresetRepositoriesDialog::ManagePresetRepositoriesDialog(PresetArchiveDatabase* pad)
|
||||||
: DPIDialog(static_cast<wxWindow*>(wxGetApp().mainframe), wxID_ANY,
|
: DPIDialog(static_cast<wxWindow*>(wxGetApp().mainframe), wxID_ANY,
|
||||||
format_wxstr("%1% - %2%", SLIC3R_APP_NAME, _L("Manage Updates")),
|
format_wxstr("%1% - %2%", SLIC3R_APP_NAME, _L("Manage Updates")),
|
||||||
wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER)
|
wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER)
|
||||||
@ -278,7 +278,7 @@ ManageUpdatesDialog::ManageUpdatesDialog(PresetArchiveDatabase* pad)
|
|||||||
this->SetFont(wxGetApp().normal_font());
|
this->SetFont(wxGetApp().normal_font());
|
||||||
const int em = em_unit();
|
const int em = em_unit();
|
||||||
|
|
||||||
m_manager = std::make_unique<UIManager>(this, pad, em);
|
m_manager = std::make_unique<RepositoryUpdateUIManager>(this, pad, em);
|
||||||
|
|
||||||
auto sizer = m_manager->get_sizer();
|
auto sizer = m_manager->get_sizer();
|
||||||
|
|
||||||
@ -286,27 +286,27 @@ ManageUpdatesDialog::ManageUpdatesDialog(PresetArchiveDatabase* pad)
|
|||||||
wxGetApp().SetWindowVariantForButton(buttons->GetCancelButton());
|
wxGetApp().SetWindowVariantForButton(buttons->GetCancelButton());
|
||||||
wxGetApp().UpdateDlgDarkUI(this, true);
|
wxGetApp().UpdateDlgDarkUI(this, true);
|
||||||
this->SetEscapeId(wxID_CLOSE);
|
this->SetEscapeId(wxID_CLOSE);
|
||||||
this->Bind(wxEVT_BUTTON, &ManageUpdatesDialog::onCloseDialog, this, wxID_CLOSE);
|
this->Bind(wxEVT_BUTTON, &ManagePresetRepositoriesDialog::onCloseDialog, this, wxID_CLOSE);
|
||||||
this->Bind(wxEVT_BUTTON, &ManageUpdatesDialog::onOkDialog, this, wxID_OK);
|
this->Bind(wxEVT_BUTTON, &ManagePresetRepositoriesDialog::onOkDialog, this, wxID_OK);
|
||||||
sizer->Add(buttons, 0, wxALIGN_CENTER_HORIZONTAL | wxBOTTOM, em);
|
sizer->Add(buttons, 0, wxALIGN_CENTER_HORIZONTAL | wxBOTTOM, em);
|
||||||
|
|
||||||
SetSizer(sizer);
|
SetSizer(sizer);
|
||||||
sizer->SetSizeHints(this);
|
sizer->SetSizeHints(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ManageUpdatesDialog::on_dpi_changed(const wxRect &suggested_rect)
|
void ManagePresetRepositoriesDialog::on_dpi_changed(const wxRect &suggested_rect)
|
||||||
{
|
{
|
||||||
SetMinSize(GetBestSize());
|
SetMinSize(GetBestSize());
|
||||||
Fit();
|
Fit();
|
||||||
Refresh();
|
Refresh();
|
||||||
}
|
}
|
||||||
|
|
||||||
void ManageUpdatesDialog::onCloseDialog(wxEvent &)
|
void ManagePresetRepositoriesDialog::onCloseDialog(wxEvent &)
|
||||||
{
|
{
|
||||||
this->EndModal(wxID_CLOSE);
|
this->EndModal(wxID_CLOSE);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ManageUpdatesDialog::onOkDialog(wxEvent&)
|
void ManagePresetRepositoriesDialog::onOkDialog(wxEvent&)
|
||||||
{
|
{
|
||||||
if (m_manager->set_selected_repositories())
|
if (m_manager->set_selected_repositories())
|
||||||
this->EndModal(wxID_CLOSE);
|
this->EndModal(wxID_CLOSE);
|
||||||
|
@ -15,7 +15,7 @@ namespace GUI {
|
|||||||
|
|
||||||
class PresetArchiveDatabase;
|
class PresetArchiveDatabase;
|
||||||
|
|
||||||
class UIManager
|
class RepositoryUpdateUIManager
|
||||||
{
|
{
|
||||||
struct OnlineEntry {
|
struct OnlineEntry {
|
||||||
OnlineEntry(bool use, const std::string &id, const std::string &name, const std::string &description, const std::string &visibility) :
|
OnlineEntry(bool use, const std::string &id, const std::string &name, const std::string &description, const std::string &visibility) :
|
||||||
@ -61,26 +61,26 @@ class UIManager
|
|||||||
void load_offline_repos();
|
void load_offline_repos();
|
||||||
|
|
||||||
public:
|
public:
|
||||||
UIManager() {}
|
RepositoryUpdateUIManager() {}
|
||||||
UIManager(wxWindow* parent, PresetArchiveDatabase* pad, int em);
|
RepositoryUpdateUIManager(wxWindow* parent, PresetArchiveDatabase* pad, int em);
|
||||||
~UIManager() {}
|
~RepositoryUpdateUIManager() {}
|
||||||
|
|
||||||
wxSizer* get_sizer() { return m_main_sizer; }
|
wxSizer* get_sizer() { return m_main_sizer; }
|
||||||
bool set_selected_repositories();
|
bool set_selected_repositories();
|
||||||
};
|
};
|
||||||
|
|
||||||
class ManageUpdatesDialog : public DPIDialog
|
class ManagePresetRepositoriesDialog : public DPIDialog
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
ManageUpdatesDialog(PresetArchiveDatabase* pad);
|
ManagePresetRepositoriesDialog(PresetArchiveDatabase* pad);
|
||||||
~ManageUpdatesDialog() {}
|
~ManagePresetRepositoriesDialog() {}
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void on_dpi_changed(const wxRect &suggested_rect) override;
|
void on_dpi_changed(const wxRect &suggested_rect) override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
std::unique_ptr<UIManager> m_manager { nullptr };
|
std::unique_ptr<RepositoryUpdateUIManager> m_manager { nullptr };
|
||||||
|
|
||||||
void onCloseDialog(wxEvent &);
|
void onCloseDialog(wxEvent &);
|
||||||
void onOkDialog(wxEvent &);
|
void onOkDialog(wxEvent &);
|
||||||
|
@ -286,11 +286,7 @@ void PresetUpdater::priv::get_missing_resource(const GUI::ArchiveRepository& arc
|
|||||||
// gets resource to vendor/<vendor_name>/
|
// gets resource to vendor/<vendor_name>/
|
||||||
void PresetUpdater::priv::get_or_copy_missing_resource(const GUI::ArchiveRepository& archive, const std::string& vendor, const std::string& filename, const std::string& repository_id_from_ini) const
|
void PresetUpdater::priv::get_or_copy_missing_resource(const GUI::ArchiveRepository& archive, const std::string& vendor, const std::string& filename, const std::string& repository_id_from_ini) const
|
||||||
{
|
{
|
||||||
assert(!filename.empty() && !vendor.empty() /*&& !repository_id_from_ini.empty()*/);
|
assert(!filename.empty() && !vendor.empty());
|
||||||
//if (filename.empty() || vendor.empty()) {
|
|
||||||
// BOOST_LOG_TRIVIAL(error) << "PresetUpdater::get_or_copy_missing_resource - wrong input. vendor: " << vendor << " filename: " << filename;
|
|
||||||
// return;
|
|
||||||
//}
|
|
||||||
|
|
||||||
const fs::path file_in_vendor(vendor_path / (vendor + "/" + filename));
|
const fs::path file_in_vendor(vendor_path / (vendor + "/" + filename));
|
||||||
const fs::path file_in_rsrc(rsrc_path / (vendor + "/" + filename));
|
const fs::path file_in_rsrc(rsrc_path / (vendor + "/" + filename));
|
||||||
@ -1138,8 +1134,6 @@ void PresetUpdater::sync_blocking(const PresetBundle* preset_bundle, wxEvtHandle
|
|||||||
this->p->sync_config(preset_bundle->vendors, *archive);
|
this->p->sync_config(preset_bundle->vendors, *archive);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
wxCommandEvent* evt = new wxCommandEvent(EVT_CONFIG_UPDATER_SYNC_DONE);
|
|
||||||
evt_handler->QueueEvent(evt);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void PresetUpdater::slic3r_update_notify()
|
void PresetUpdater::slic3r_update_notify()
|
||||||
|
Loading…
x
Reference in New Issue
Block a user