From dbeed95448106e459f1810ad68c7816523a8bcf2 Mon Sep 17 00:00:00 2001 From: "hang.xu" Date: Mon, 2 Sep 2024 20:45:26 +0800 Subject: [PATCH] NEW: Support beta version update jira: STUDIO-7392 Change-Id: Iea71823295669c56e2550e1c61bf782e611a2daa (cherry picked from commit f6f87cd36fece5df8e9a63e229a6f2c965b2b417) --- src/slic3r/GUI/GUI_App.cpp | 83 +++++++++++++++++++++++++++++++++- src/slic3r/GUI/GUI_App.hpp | 9 +++- src/slic3r/GUI/Preferences.cpp | 2 + 3 files changed, 91 insertions(+), 3 deletions(-) diff --git a/src/slic3r/GUI/GUI_App.cpp b/src/slic3r/GUI/GUI_App.cpp index d508f821e..0d1a6cb55 100644 --- a/src/slic3r/GUI/GUI_App.cpp +++ b/src/slic3r/GUI/GUI_App.cpp @@ -4474,7 +4474,7 @@ void GUI_App::reset_to_active() last_active_point = std::chrono::system_clock::now(); } -void GUI_App::check_update(bool show_tips, int by_user) +void GUI_App::check_update(bool show_tips, int by_user, VersionUpdateType type) { if (version_info.version_str.empty()) return; if (version_info.url.empty()) return; @@ -4495,8 +4495,17 @@ void GUI_App::check_update(bool show_tips, int by_user) } } else { wxGetApp().app_config->set("upgrade", "force_upgrade", false); - if (show_tips) + if (app_config->get("enable_beta_version_update") == "true"){ + if (type == ReleaseVersionUpdate){ + check_beta_version(show_tips, by_user); + } + else if (type == BetaVersionUpdate){ + this->no_new_version(); + } + } + else{ this->no_new_version(); + } } } @@ -4562,6 +4571,76 @@ void GUI_App::check_new_version(bool show_tips, int by_user) }).perform(); } +void GUI_App::check_beta_version(bool show_tips, int by_user) { + std::string platform = "windows"; + +#ifdef __WINDOWS__ + platform = "windows"; +#endif +#ifdef __APPLE__ + platform = "macos"; +#endif +#ifdef __LINUX__ + platform = "linux"; +#endif + + std::string repoOwner = "bambulab"; // The owner of repository + std::string repoName = "BambuStudio"; // The name of repository + //"https://api.github.com/repos/bambulab/BambuStudio/releases" + std::string url = "https://api.github.com/repos/" + repoOwner + "/" + repoName + "/releases"; + + Slic3r::Http http = Slic3r::Http::get(url); + + http.header("accept", "application/json") + .timeout_connect(TIMEOUT_CONNECT) + .timeout_max(TIMEOUT_RESPONSE) + .on_complete([this, show_tips, by_user, platform](std::string body, unsigned) { + try { + json versions = json::parse(body, nullptr, false); + for (auto version : versions){ + if (version.contains("prerelease") && version.contains("assets") && version.contains("tag_name") && version.contains("html_url")) { + bool is_beta_version = version["prerelease"]; + if (is_beta_version){ + std::regex version_regex(R"((\d+)\.(\d+)\.(\d+)\.(\d+))"); + std::smatch match; + std::string version_str = ""; + std::string tag_name = version["tag_name"]; + if (std::regex_search(tag_name, match, version_regex)) { + version_str = match[0]; + } + version_info.version_str = version_str; + auto assets = version["assets"]; + for (auto asset : assets){ + if (asset.contains("browser_download_url")){ + std::string url = asset["browser_download_url"]; + if ((platform == "windows" && url.find(".exe") != std::string::npos) + || (platform == "linux" && url.find(".AppImage") != std::string::npos) + || (platform == "macos" && url.find(".dmg") != std::string::npos)) + { + version_info.url = url; + version_info.description = "###" + std::string(version["html_url"]) + "###"; + version_info.force_upgrade = false; + CallAfter([this, show_tips, by_user]() { + this->check_update(show_tips, by_user, BetaVersionUpdate); + }); + return; + } + } + } + } + } + } + } + catch (...) { + ; + } + }) + .on_error([this](std::string body, std::string error, unsigned int status) { + handle_http_error(status, body); + BOOST_LOG_TRIVIAL(error) << "check new version error" << body; + }).perform(); +} + //BBS pop up a dialog and download files void GUI_App::request_new_version(int by_user) diff --git a/src/slic3r/GUI/GUI_App.hpp b/src/slic3r/GUI/GUI_App.hpp index b17562066..d7d47238f 100644 --- a/src/slic3r/GUI/GUI_App.hpp +++ b/src/slic3r/GUI/GUI_App.hpp @@ -134,6 +134,12 @@ enum CameraMenuIDs { wxID_CAMERA_COUNT, }; +enum VersionUpdateType +{ + ReleaseVersionUpdate, + BetaVersionUpdate +}; + class Tab; class ConfigWizard; @@ -455,8 +461,9 @@ public: bool m_studio_active = true; std::chrono::system_clock::time_point last_active_point; - void check_update(bool show_tips, int by_user); + void check_update(bool show_tips, int by_user, VersionUpdateType = ReleaseVersionUpdate); void check_new_version(bool show_tips = false, int by_user = 0); + void check_beta_version(bool show_tips = false, int by_user = 0); void request_new_version(int by_user); void enter_force_upgrade(); void set_skip_version(bool skip = true); diff --git a/src/slic3r/GUI/Preferences.cpp b/src/slic3r/GUI/Preferences.cpp index 66f5deeb7..14a2e8ae2 100644 --- a/src/slic3r/GUI/Preferences.cpp +++ b/src/slic3r/GUI/Preferences.cpp @@ -1125,6 +1125,7 @@ wxWindow* PreferencesDialog::create_general_page() auto item_calc_mode = create_item_checkbox(_L("Flushing volumes: Auto-calculate every time when the color is changed."), page, _L("If enabled, auto-calculate every time when the color is changed."), 50, "auto_calculate"); auto item_calc_in_long_retract = create_item_checkbox(_L("Flushing volumes: Auto-calculate every time when the filament is changed."), page, _L("If enabled, auto-calculate every time when filament is changed"), 50, "auto_calculate_when_filament_change"); auto item_multi_machine = create_item_checkbox(_L("Multi-device Management(Take effect after restarting Studio)."), page, _L("With this option enabled, you can send a task to multiple devices at the same time and manage multiple devices."), 50, "enable_multi_machine"); + auto item_beta_version_update = create_item_checkbox(_L("Support beta version update."), page, _L("With this option enabled, you can receive beta version updates."), 50, "enable_beta_version_update"); auto _3d_settings = create_item_title(_L("3D Settings"), page, _L("3D Settings")); auto item_mouse_zoom_settings = create_item_checkbox(_L("Zoom to mouse position"), page, _L("Zoom in towards the mouse pointer's position in the 3D view, rather than the 2D window center."), 50, @@ -1211,6 +1212,7 @@ wxWindow* PreferencesDialog::create_general_page() sizer_page->Add(item_calc_mode, 0, wxTOP, FromDIP(3)); sizer_page->Add(item_calc_in_long_retract, 0, wxTOP, FromDIP(3)); sizer_page->Add(item_multi_machine, 0, wxTOP, FromDIP(3)); + sizer_page->Add(item_beta_version_update, 0, wxTOP, FromDIP(3)); sizer_page->Add(_3d_settings, 0, wxTOP | wxEXPAND, FromDIP(20)); sizer_page->Add(item_mouse_zoom_settings, 0, wxTOP, FromDIP(3)); sizer_page->Add(enable_lod_settings, 0, wxTOP, FromDIP(3));