diff --git a/src/slic3r/GUI/ConfigWizardWebViewPage.cpp b/src/slic3r/GUI/ConfigWizardWebViewPage.cpp index 79804aa21f..87e7f6ccbe 100644 --- a/src/slic3r/GUI/ConfigWizardWebViewPage.cpp +++ b/src/slic3r/GUI/ConfigWizardWebViewPage.cpp @@ -47,7 +47,7 @@ ConfigWizardWebViewPage::ConfigWizardWebViewPage(ConfigWizard *parent) // Connect the webview events Bind(wxEVT_WEBVIEW_ERROR, &ConfigWizardWebViewPage::on_error, this, m_browser->GetId()); Bind(wxEVT_WEBVIEW_NAVIGATING, &ConfigWizardWebViewPage::on_navigation_request, this, m_browser->GetId()); - + Bind(wxEVT_IDLE, &ConfigWizardWebViewPage::on_idle, this); } bool ConfigWizardWebViewPage::login_changed() @@ -85,14 +85,44 @@ case type: \ WX_ERROR_CASE(wxWEBVIEW_NAV_ERR_OTHER); } - BOOST_LOG_TRIVIAL(error) << "WebViewPanel error: " << category; + BOOST_LOG_TRIVIAL(error) << "ConfigWizardWebViewPage error: " << category; + load_error_page(); } +void ConfigWizardWebViewPage::load_error_page() { + if (!m_browser) + return; + if (m_vetoed) + return; + m_browser->Stop(); + m_load_error_page = true; +} + +void ConfigWizardWebViewPage::on_idle(wxIdleEvent &WXUNUSED(evt)) { + if (!m_browser) + return; + if (m_browser->IsBusy()) { + wxSetCursor(wxCURSOR_ARROWWAIT); + } else { + wxSetCursor(wxNullCursor); + + if (!m_vetoed && m_load_error_page) { + m_load_error_page = false; + m_browser->LoadURL(GUI::format_wxstr( + "file://%1%/web/connection_failed.html", + boost::filesystem::path(resources_dir()).generic_string() + )); + } + } +} + + void ConfigWizardWebViewPage::on_navigation_request(wxWebViewEvent &evt) { wxString url = evt.GetURL(); if (url.starts_with(L"prusaslicer")) { evt.Veto(); + m_vetoed = true; wxPostEvent(wxGetApp().plater(), Event(EVT_LOGIN_VIA_WIZARD, into_u8(url))); } } diff --git a/src/slic3r/GUI/ConfigWizardWebViewPage.hpp b/src/slic3r/GUI/ConfigWizardWebViewPage.hpp index c05e6ebfeb..8ad6638063 100644 --- a/src/slic3r/GUI/ConfigWizardWebViewPage.hpp +++ b/src/slic3r/GUI/ConfigWizardWebViewPage.hpp @@ -49,6 +49,8 @@ public: void on_error(wxWebViewEvent &evt); void on_navigation_request(wxWebViewEvent &evt); + void on_idle(wxIdleEvent &evt); + void load_error_page(); // returns true if logged in - wizard needs to update repos bool login_changed(); @@ -57,6 +59,8 @@ private: UserAccount *p_user_account{nullptr}; wxBoxSizer *m_browser_sizer{nullptr}; wxStaticText *m_text{nullptr}; + bool m_load_error_page{false}; + bool m_vetoed{false}; }; }} // namespace Slic3r::GUI diff --git a/src/slic3r/GUI/UserAccountCommunication.cpp b/src/slic3r/GUI/UserAccountCommunication.cpp index 0b32f42082..47af20d5f8 100644 --- a/src/slic3r/GUI/UserAccountCommunication.cpp +++ b/src/slic3r/GUI/UserAccountCommunication.cpp @@ -307,7 +307,7 @@ wxString UserAccountCommunication::get_login_redirect_url() { BOOST_LOG_TRIVIAL(info) << "code verifier: " << m_code_verifier; BOOST_LOG_TRIVIAL(info) << "code challenge: " << code_challenge; - wxString url = GUI::format_wxstr(L"%1%/o/authorize/?embed=1&client_id=%2%&response_type=code&code_challenge=%3%&code_challenge_method=S256&scope=basic_info&redirect_uri=%4%&choose_account=1&language=%5%", AUTH_HOST, CLIENT_ID, code_challenge, REDIRECT_URI, language); + wxString url = GUI::format_wxstr(L"%1%/o/authorize/?embed=1&client_id=%2%&response_type=code&code_challenge=%3%&code_challenge_method=S256&scope=basic_info&redirect_uri=%4%&language=%5%", AUTH_HOST, CLIENT_ID, code_challenge, REDIRECT_URI, language); return url; } diff --git a/src/slic3r/GUI/WebViewDialog.cpp b/src/slic3r/GUI/WebViewDialog.cpp index f9f64fd382..8b5066fa14 100644 --- a/src/slic3r/GUI/WebViewDialog.cpp +++ b/src/slic3r/GUI/WebViewDialog.cpp @@ -820,7 +820,7 @@ void PrinterWebViewPanel::sys_color_changed() } WebViewDialog::WebViewDialog(wxWindow* parent, const wxString& url, const wxString& dialog_name, const wxSize& size, const std::vector& message_handler_names, const std::string& loading_html/* = "loading"*/) - : wxDialog(parent, wxID_ANY, dialog_name, wxDefaultPosition, size, wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER) + : DPIDialog(parent, wxID_ANY, dialog_name, wxDefaultPosition, size, wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER) , m_loading_html(loading_html) , m_script_message_hadler_names (message_handler_names) { @@ -1313,11 +1313,23 @@ void PrinterPickWebViewDialog::request_compatible_printers_SLA() wxString script = GUI::format_wxstr("window._prusaConnect_v1.requestCompatiblePrinter(%1%)", request); run_script(script); } +void PrinterPickWebViewDialog::on_dpi_changed(const wxRect &suggested_rect) +{ + wxWindow *parent = GetParent(); + const wxSize &size = wxSize( + std::max(parent->GetClientSize().x / 2, 100 * wxGetApp().em_unit()), + std::max(parent->GetClientSize().y / 2, 50 * wxGetApp().em_unit()) + ); + SetMinSize(size); + Fit(); + Refresh(); +} + LoginWebViewDialog::LoginWebViewDialog(wxWindow *parent, std::string &ret_val, const wxString& url) : WebViewDialog(parent , url - , _L("Log in dialog") - , wxSize(parent->GetClientSize().x / 3, parent->GetClientSize().y / 4 * 3) + , _L("Log in dialog"), + wxSize(50 * wxGetApp().em_unit(), 80 * wxGetApp().em_unit()) , {}) , m_ret_val(ret_val) { @@ -1332,6 +1344,13 @@ void LoginWebViewDialog::on_navigation_request(wxWebViewEvent &evt) EndModal(wxID_OK); } } +void LoginWebViewDialog::on_dpi_changed(const wxRect &suggested_rect) +{ + const wxSize &size = wxSize(50 * wxGetApp().em_unit(), 80 * wxGetApp().em_unit()); + SetMinSize(size); + Fit(); + Refresh(); +} LogoutWebViewDialog::LogoutWebViewDialog(wxWindow *parent) : WebViewDialog(parent @@ -1342,6 +1361,7 @@ LogoutWebViewDialog::LogoutWebViewDialog(wxWindow *parent) { Centre(); } + void LogoutWebViewDialog::on_loaded(wxWebViewEvent &evt) { EndModal(wxID_OK); diff --git a/src/slic3r/GUI/WebViewDialog.hpp b/src/slic3r/GUI/WebViewDialog.hpp index 7c8d6ea33e..90ae1c8ccc 100644 --- a/src/slic3r/GUI/WebViewDialog.hpp +++ b/src/slic3r/GUI/WebViewDialog.hpp @@ -7,6 +7,7 @@ #include #include +#include "GUI_Utils.hpp" #include "UserAccountSession.hpp" #ifdef DEBUG_URL_PANEL @@ -102,7 +103,7 @@ protected: }; -class WebViewDialog : public wxDialog +class WebViewDialog : public DPIDialog { public: WebViewDialog(wxWindow* parent, const wxString& url, const wxString& dialog_name, const wxSize& size, const std::vector& message_handler_names, const std::string& loading_html = "loading"); @@ -247,6 +248,7 @@ protected: void request_compatible_printers_FFF(); void request_compatible_printers_SLA(); void run_script_bridge(const wxString& script) override { run_script(script); } + void on_dpi_changed(const wxRect &suggested_rect) override; private: std::string& m_ret_val; @@ -263,6 +265,7 @@ class LoginWebViewDialog : public WebViewDialog public: LoginWebViewDialog(wxWindow *parent, std::string &ret_val, const wxString& url); void on_navigation_request(wxWebViewEvent &evt) override; + void on_dpi_changed(const wxRect &suggested_rect) override; private: std::string &m_ret_val; @@ -273,6 +276,7 @@ class LogoutWebViewDialog : public WebViewDialog public: LogoutWebViewDialog(wxWindow* parent); void on_loaded(wxWebViewEvent &evt) override; + void on_dpi_changed(const wxRect &suggested_rect) override {} }; } // GUI