diff --git a/resources/web/guide/0/load.js b/resources/web/guide/0/load.js index 03849f6388..8699420333 100644 --- a/resources/web/guide/0/load.js +++ b/resources/web/guide/0/load.js @@ -10,6 +10,11 @@ function OnInit() // Orca: fallback timeout in case the C++ -> JS signal fails (e.g., WebKit issues). // Jump to the target page after 3 minutes so slow computers don't get stuck on a partially loaded page. setTimeout("JumpToTarget()",180*1000); + + var tSend={}; + tSend['sequence_id']=Math.round(new Date() / 1000); + tSend['command']="userguide_loading_page_ready"; + SendWXMessage(JSON.stringify(tSend)); } function HandleStudio( pVal ) diff --git a/src/slic3r/GUI/WebGuideDialog.cpp b/src/slic3r/GUI/WebGuideDialog.cpp index 0c799c9d47..088d4d6c21 100644 --- a/src/slic3r/GUI/WebGuideDialog.cpp +++ b/src/slic3r/GUI/WebGuideDialog.cpp @@ -450,6 +450,16 @@ void GuideFrame::on_profile_loaded() SaveProfileData(); const std::string strAll = m_ProfileJson.dump(-1, ' ', false, json::error_handler_t::ignore); BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << ", finished, json contents:\n" << strAll; + m_profile_ready = true; + notify_profile_loaded(); +} + +// The data is often ready before the loading page has run its scripts, and a +// call into a page without HandleStudio is lost, so the message waits for both. +void GuideFrame::notify_profile_loaded() +{ + if (!m_profile_ready || !m_page_ready) + return; json res; res["command"] = "userguide_profile_load_finish"; res["sequence_id"] = "10001"; @@ -545,7 +555,11 @@ void GuideFrame::OnScriptMessage(wxWebViewEvent &evt) wxString strCmd = j["command"]; BOOST_LOG_TRIVIAL(trace) << "GuideFrame::OnScriptMessage;Command:" << strCmd; - if (strCmd == "close_page") { + if (strCmd == "userguide_loading_page_ready") { + m_page_ready = true; + notify_profile_loaded(); + } + else if (strCmd == "close_page") { this->EndModal(wxID_CANCEL); } if (strCmd == "user_clause") { diff --git a/src/slic3r/GUI/WebGuideDialog.hpp b/src/slic3r/GUI/WebGuideDialog.hpp index 3f84f4248f..8853ee2661 100644 --- a/src/slic3r/GUI/WebGuideDialog.hpp +++ b/src/slic3r/GUI/WebGuideDialog.hpp @@ -102,6 +102,7 @@ public: int LoadProfileFamily(std::string strVendor, std::string strFilePath); void init_guide_paths(); void on_profile_loaded(); + void notify_profile_loaded(); bool BuildProfileJson(const PresetBundle& bundle, bool require_all_resource_vendors); bool BuildProfileDataFromPresetBundle(); bool BuildProfileDataFromVendors(); @@ -142,6 +143,10 @@ private: //First Load bool bFirstComplete{false}; + // The loading page gets userguide_profile_load_finish once both are true; + // every instance of it reports in, so the flag is never reset. + bool m_profile_ready{false}; + bool m_page_ready{false}; // Set once in the destructor. Read through `this` by the loading thread // (joined before `this` dies) and captured as the shared_ptr by CallAfter // lambdas so they don't touch `this` after the object is freed.