Files
OrcaSlicer/src/slic3r/GUI/WebGuideDialog.hpp
T
SoftFever e5aa9a8cfc Speed up profile loading with per-vendor preset caches
Each vendor's system presets are serialized into a <vendor>.opc cache
that the app loads instead of parsing the profile JSONs, falling back
to the parse whenever no cache covers what is installed. Shipped builds
carry the caches instead of the raw profiles, installing and updating
treat a vendor's cache as its installation, and the setup wizard loads
through the same path. Per-platform scripts and CI generate the caches
at build time; tests and a design doc cover the format and its
validation.
2026-07-29 21:56:17 +08:00

166 lines
4.5 KiB
C++

#ifndef slic3r_WebGuideDialog_hpp_
#define slic3r_WebGuideDialog_hpp_
#include "wx/artprov.h"
#include "wx/cmdline.h"
#include "wx/notifmsg.h"
#include "wx/settings.h"
#include "wx/webview.h"
#if wxUSE_WEBVIEW_IE
#include "wx/msw/webview_ie.h"
#endif
#if wxUSE_WEBVIEW_EDGE
#include "wx/msw/webview_edge.h"
#endif
#include "wx/webviewarchivehandler.h"
#include "wx/webviewfshandler.h"
#include "wx/numdlg.h"
#include "wx/infobar.h"
#include "wx/filesys.h"
#include "wx/fs_arc.h"
#include "wx/fs_mem.h"
#include "wx/stdpaths.h"
#include <wx/frame.h>
#include <wx/tbarbase.h>
#include "wx/textctrl.h"
#include "GUI_App.hpp"
#include "libslic3r/PresetBundle.hpp"
#include "slic3r/Utils/PresetUpdater.hpp"
#include <atomic>
#include <memory>
#include <unordered_map>
#include <nlohmann/json.hpp>
#include <boost/thread.hpp>
namespace Slic3r { namespace GUI {
class GuideFrame : public DPIDialog
{
public:
GuideFrame(GUI_App *pGUI, long style = wxCAPTION | wxCLOSE_BOX | wxSYSTEM_MENU);
virtual ~GuideFrame();
enum GuidePage {
BBL_WELCOME,
BBL_REGION,
BBL_MODELS,
BBL_FILAMENTS,
BBL_FILAMENT_ONLY,
BBL_MODELS_ONLY
}m_page;
//Web Function
void load_url(wxString &url);
wxString SetStartPage(GuidePage startpage=BBL_WELCOME, bool load = true);
void UpdateState();
void OnIdle(wxIdleEvent &evt);
// void OnClose(wxCloseEvent &evt);
void OnNavigationRequest(wxWebViewEvent &evt);
void OnNavigationComplete(wxWebViewEvent &evt);
void OnDocumentLoaded(wxWebViewEvent &evt);
void OnNewWindow(wxWebViewEvent &evt);
void OnError(wxWebViewEvent &evt);
void OnTitleChanged(wxWebViewEvent &evt);
void OnFullScreenChanged(wxWebViewEvent &evt);
void OnScriptMessage(wxWebViewEvent &evt);
void OnScriptResponseMessage(wxCommandEvent &evt);
void RunScript(const wxString &javascript);
//Logic
bool IsFirstUse();
//Model - Machine - Filaments
int LoadProfileData();
int SaveProfileData();
int LoadProfileFamily(std::string strVendor, std::string strFilePath);
void init_guide_paths();
void on_profile_loaded();
bool BuildProfileJson(const PresetBundle& bundle, bool require_all_resource_vendors);
bool BuildProfileDataFromPresetBundle();
bool BuildProfileDataFromVendors();
int SaveProfile();
int GetFilamentInfo( std::string VendorDirectory,json & pFilaList, std::string filepath, std::string &sVendor, std::string &sType);
bool apply_config(AppConfig *app_config, PresetBundle *preset_bundle, const PresetUpdater *updater, bool& apply_keeped_changes);
bool run();
void StrReplace(std::string &strBase, std::string strSrc, std::string strDes);
std::string w2s(wxString sSrc);
void GetStardardFilePath(std::string &FilePath);
bool LoadFile(std::string jPath, std::string & sContent);
// install plugin
int DownloadPlugin();
int InstallPlugin();
int ShowPluginStatus(int status, int percent, bool &cancel);
void on_dpi_changed(const wxRect &suggested_rect) {}
private:
GUI_App *m_MainPtr;
AppConfig m_appconfig_new;
wxWebView *m_browser;
wxButton * m_TestBtn;
wxString m_SectionName;
bool orca_bundle_rsrc;
boost::filesystem::path vendor_dir;
boost::filesystem::path rsrc_vendor_dir;
//First Load
bool bFirstComplete{false};
std::atomic<bool> m_destroy{false};
// Shared cancel token captured by CallAfter lambdas so they don't touch
// `this` after the destructor has run and the object is freed.
std::shared_ptr<std::atomic<bool>> m_cancel_token{std::make_shared<std::atomic<bool>>(false)};
std::unique_ptr<boost::thread> m_load_task;
// User Config
bool PrivacyUse;
bool StealthMode;
std::string m_Region;
bool InstallNetplugin;
bool network_plugin_ready {false};
json m_ProfileJson;
json m_OrcaFilaList;
std::string m_OrcaFilaLibPath;
#if wxUSE_WEBVIEW_IE
wxMenuItem *m_script_object_el;
wxMenuItem *m_script_date_el;
wxMenuItem *m_script_array_el;
#endif
// Last executed JavaScript snippet, for convenience.
wxString m_javascript;
wxString m_response_js;
wxString m_bbl_user_agent;
std::string m_editing_filament_id;
struct CachedFilamentInfo
{
int status{-1};
std::string vendor;
std::string type;
};
std::unordered_map<std::string, CachedFilamentInfo> filament_info_cache;
};
}} // namespace Slic3r::GUI
#endif /* slic3r_Tab_hpp_ */