mirror of
https://github.com/OrcaSlicer/OrcaSlicer.git
synced 2026-10-04 14:20:58 +00:00
* Save device url in all cases and load printer url after hot-reload finishes * Recreate web view from scratch as only URL fix seems not robust enough * Add the same robust browser recreation for WebViewDialog It should eliminate possible issue with blank Home and other pages in the same way as Printer page * Remove redundant fallback leftover * Fix webview reset state and replay Project info on page reload The first-show webview reset now runs only on Windows, reloads the last printer URL and resets the Project page's ready state. The Project tab replays its 3MF info whenever the page reloads, so it no longer goes blank after a theme switch or a slow first load. The Device tab no longer loads an extra time on first open, and the Home tab no longer navigates twice. NeedsRecreateOnShow() logs is_recreating_gui so one language switch shows whether the reset ever fires. * Build plugin pages on first show A language switch rebuilt every plugin page's browser while the main window was being recreated, which left plugin tabs blank on Windows. Plugin pages are now lazy pages, never prebuilt, and are removed left to right so removing pages never builds one only to destroy it. A plugin page's script now starts when its tab is first opened; messages posted before that are dropped. --------- Co-authored-by: SoftFever <softfeverever@gmail.com> Co-authored-by: Noisyfox <timemanager.rick@gmail.com> Co-authored-by: SoftFever <103989404+SoftFever@users.noreply.github.com>
121 lines
3.5 KiB
C++
121 lines
3.5 KiB
C++
#ifndef slic3r_Project_hpp_
|
|
#define slic3r_Project_hpp_
|
|
|
|
#include "Tabbook.hpp"
|
|
#include "wx/artprov.h"
|
|
#include "wx/cmdline.h"
|
|
#include "wx/notifmsg.h"
|
|
#include "wx/settings.h"
|
|
#include "wx/webview.h"
|
|
#include <wx/setup.h>
|
|
#include <string>
|
|
#include "slic3r/GUI/StagedBuild.hpp"
|
|
#include <wx/string.h>
|
|
#include <wx/bookctrl.h>
|
|
#include <wx/gdicmn.h>
|
|
#include <wx/event.h>
|
|
#include "slic3r/GUI/Printer/PrinterFileSystem.h"
|
|
|
|
#if wxUSE_WEBVIEW_EDGE
|
|
#include "wx/msw/webview_edge.h"
|
|
#endif
|
|
|
|
#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/panel.h>
|
|
#include <wx/tbarbase.h>
|
|
#include "wx/textctrl.h"
|
|
#include <wx/timer.h>
|
|
|
|
#include "nlohmann/json.hpp"
|
|
#include "slic3r/Utils/json_diff.hpp"
|
|
|
|
#include <atomic>
|
|
#include <map>
|
|
#include <vector>
|
|
#include <memory>
|
|
#include <boost/thread.hpp>
|
|
#include "Event.hpp"
|
|
#include "libslic3r/ProjectTask.hpp"
|
|
#include "wxExtensions.hpp"
|
|
#include "Auxiliary.hpp"
|
|
#include "Lazy.hpp"
|
|
|
|
#define AUFILE_GREY700 wxColour(107, 107, 107)
|
|
#define AUFILE_GREY500 wxColour(158, 158, 158)
|
|
#define AUFILE_GREY300 wxColour(238, 238, 238)
|
|
#define AUFILE_GREY200 wxColour(248, 248, 248)
|
|
#define AUFILE_BRAND wxColour(0, 150, 136)
|
|
#define AUFILE_BRAND_TRANSPARENT wxColour("#E5F0EE") // ORCA color with %10 opacity
|
|
//#define AUFILE_PICTURES_SIZE wxSize(FromDIP(300), FromDIP(300))
|
|
//#define AUFILE_PICTURES_PANEL_SIZE wxSize(FromDIP(300), FromDIP(340))
|
|
#define AUFILE_PICTURES_SIZE wxSize(FromDIP(168), FromDIP(168))
|
|
#define AUFILE_PICTURES_PANEL_SIZE wxSize(FromDIP(168), FromDIP(208))
|
|
#define AUFILE_SIZE wxSize(FromDIP(168), FromDIP(168))
|
|
#define AUFILE_PANEL_SIZE wxSize(FromDIP(168), FromDIP(208))
|
|
#define AUFILE_TEXT_HEIGHT FromDIP(40)
|
|
#define AUFILE_ROUNDING FromDIP(5)
|
|
|
|
namespace Slic3r { namespace GUI {
|
|
|
|
struct project_file{
|
|
std::string filepath;
|
|
std::string filename;
|
|
std::string size;
|
|
};
|
|
|
|
class ProjectPanel : public wxPanel, public StagedBuild, public LazyInstance<ProjectPanel>
|
|
{
|
|
private:
|
|
std::atomic<bool> m_web_init_completed{false};
|
|
|
|
std::shared_ptr<std::atomic<bool>> m_reload_cancel_token{std::make_shared<std::atomic<bool>>(false)};
|
|
std::unique_ptr<boost::thread> m_reload_task;
|
|
|
|
wxWebView* m_browser = {nullptr};
|
|
AuxiliaryPanel* m_auxiliary{nullptr};
|
|
wxString m_project_home_url;
|
|
wxString m_root_dir;
|
|
// Last show_3mf_info script, also sent whenever the page asks for it.
|
|
std::string m_info_script;
|
|
bool m_reset_on_show{false};
|
|
static inline std::atomic<int> m_sequence_id{8000};
|
|
|
|
void show_info_editor(bool show);
|
|
void create_browser();
|
|
void reset_browser();
|
|
|
|
|
|
public:
|
|
ProjectPanel(wxWindow *parent, wxWindowID id = wxID_ANY, const wxPoint &pos = wxDefaultPosition, const wxSize &size = wxDefaultSize, long style = wxTAB_TRAVERSAL);
|
|
~ProjectPanel();
|
|
void shutdown();
|
|
|
|
|
|
void onWebNavigating(wxWebViewEvent& evt);
|
|
void on_reload(wxCommandEvent& evt);
|
|
void on_size(wxSizeEvent &event);
|
|
void on_navigated(wxWebViewEvent& event);
|
|
|
|
void msw_rescale();
|
|
void update_model_data();
|
|
void clear_model_info();
|
|
|
|
bool Show(bool show);
|
|
void OnScriptMessage(wxWebViewEvent& evt);
|
|
void RunScript(std::string content);
|
|
|
|
std::map<std::string, std::vector<json>> Reload(wxString aux_path);
|
|
std::string formatBytes(unsigned long bytes);
|
|
wxString to_base64(std::string path);
|
|
};
|
|
|
|
wxDECLARE_EVENT(EVT_PROJECT_RELOAD, wxCommandEvent);
|
|
}} // namespace Slic3r::GUI
|
|
|
|
#endif
|