From 20af63211585e9356da4bc002cbe484ff44898a1 Mon Sep 17 00:00:00 2001 From: David Kocik Date: Tue, 22 Oct 2024 13:05:29 +0200 Subject: [PATCH] SPE-2515: Reload button inside html pages and button in menu --- resources/web/connect_connection_failed.html | 28 ++++++++++ ...ading.html => connect_loading_reload.html} | 1 + ...iled.html => other_connection_failed.html} | 1 + ...loading.html => other_loading_reload.html} | 1 + src/slic3r/GUI/ConnectRequestHandler.cpp | 2 + src/slic3r/GUI/ConnectRequestHandler.hpp | 5 +- src/slic3r/GUI/MainFrame.cpp | 31 ++++++++++- src/slic3r/GUI/MainFrame.hpp | 2 + src/slic3r/GUI/WebView.cpp | 1 - src/slic3r/GUI/WebViewDialog.cpp | 9 ++++ src/slic3r/GUI/WebViewDialog.hpp | 2 +- src/slic3r/GUI/WebViewPanel.cpp | 53 ++++++++++++++++--- src/slic3r/GUI/WebViewPanel.hpp | 9 +++- src/slic3r/GUI/WebViewPlatformUtilsWin32.cpp | 4 +- 14 files changed, 131 insertions(+), 18 deletions(-) create mode 100644 resources/web/connect_connection_failed.html rename resources/web/{connect_loading.html => connect_loading_reload.html} (97%) rename resources/web/{connection_failed.html => other_connection_failed.html} (76%) rename resources/web/{loading.html => other_loading_reload.html} (93%) diff --git a/resources/web/connect_connection_failed.html b/resources/web/connect_connection_failed.html new file mode 100644 index 0000000000..7936470b41 --- /dev/null +++ b/resources/web/connect_connection_failed.html @@ -0,0 +1,28 @@ + + + + + + Connection failed + + + +
+

Connection failed

+

Something went wrong.

+ +
+ + diff --git a/resources/web/connect_loading.html b/resources/web/connect_loading_reload.html similarity index 97% rename from resources/web/connect_loading.html rename to resources/web/connect_loading_reload.html index bfe8401d2d..7a1909a5de 100644 --- a/resources/web/connect_loading.html +++ b/resources/web/connect_loading_reload.html @@ -71,6 +71,7 @@

+ diff --git a/resources/web/connection_failed.html b/resources/web/other_connection_failed.html similarity index 76% rename from resources/web/connection_failed.html rename to resources/web/other_connection_failed.html index 72cb686232..3ea607b3be 100644 --- a/resources/web/connection_failed.html +++ b/resources/web/other_connection_failed.html @@ -22,6 +22,7 @@

Connection failed

Something went wrong.

+
diff --git a/resources/web/loading.html b/resources/web/other_loading_reload.html similarity index 93% rename from resources/web/loading.html rename to resources/web/other_loading_reload.html index 0f50d68325..e07a212c4c 100644 --- a/resources/web/loading.html +++ b/resources/web/other_loading_reload.html @@ -62,6 +62,7 @@

+ diff --git a/src/slic3r/GUI/ConnectRequestHandler.cpp b/src/slic3r/GUI/ConnectRequestHandler.cpp index 7a156bc78b..1fe6ac3b0d 100644 --- a/src/slic3r/GUI/ConnectRequestHandler.cpp +++ b/src/slic3r/GUI/ConnectRequestHandler.cpp @@ -25,6 +25,8 @@ ConnectRequestHandler::ConnectRequestHandler() m_actions["REQUEST_OPEN_IN_BROWSER"] = std::bind(&ConnectRequestHandler::on_connect_action_request_open_in_browser, this, std::placeholders::_1); m_actions["ERROR"] = std::bind(&ConnectRequestHandler::on_connect_action_error, this, std::placeholders::_1); m_actions["LOG"] = std::bind(&ConnectRequestHandler::on_connect_action_log, this, std::placeholders::_1); + m_actions["RELOAD_HOME_PAGE"] = std::bind(&ConnectRequestHandler::on_reload_event, this, std::placeholders::_1); + } ConnectRequestHandler::~ConnectRequestHandler() { diff --git a/src/slic3r/GUI/ConnectRequestHandler.hpp b/src/slic3r/GUI/ConnectRequestHandler.hpp index ea64913977..b783194782 100644 --- a/src/slic3r/GUI/ConnectRequestHandler.hpp +++ b/src/slic3r/GUI/ConnectRequestHandler.hpp @@ -8,7 +8,7 @@ #include #include -//#define DEBUG_URL_PANEL +#define DEBUG_URL_PANEL namespace Slic3r::GUI { class ConnectRequestHandler @@ -20,7 +20,7 @@ public: void handle_message(const std::string& message); void resend_config(); protected: - // action callbacs stored in m_actions + // action callbacks stored in m_actions virtual void on_connect_action_log(const std::string& message_data); virtual void on_connect_action_error(const std::string& message_data); virtual void on_connect_action_request_login(const std::string& message_data); @@ -29,6 +29,7 @@ protected: virtual void on_connect_action_select_printer(const std::string& message_data) = 0; virtual void on_connect_action_print(const std::string& message_data) = 0; virtual void on_connect_action_webapp_ready(const std::string& message_data) = 0; + virtual void on_reload_event(const std::string& message_data) = 0; virtual void run_script_bridge(const wxString &script) = 0; std::map> m_actions; diff --git a/src/slic3r/GUI/MainFrame.cpp b/src/slic3r/GUI/MainFrame.cpp index 94a18ba293..ba37ccc6e7 100644 --- a/src/slic3r/GUI/MainFrame.cpp +++ b/src/slic3r/GUI/MainFrame.cpp @@ -868,7 +868,9 @@ void MainFrame::remove_connect_webview_tab() void MainFrame::show_connect_tab(const wxString& url) { - assert(m_connect_webview_added); + if (!m_connect_webview_added) { + return; + } m_tabpanel->SetSelection(m_tabpanel->FindPage(m_connect_webview)); m_connect_webview->set_load_default_url_on_next_error(true); m_connect_webview->load_url(url); @@ -984,6 +986,29 @@ void MainFrame::set_printer_webview_credentials(const std::string& usr, const st m_printer_webview->set_credentials(usr, psk); } +bool MainFrame::is_any_webview_selected() +{ + int selection = m_tabpanel->GetSelection(); + if ( selection == m_tabpanel->FindPage(m_printables_webview)) + return true; + if (m_connect_webview_added && selection == m_tabpanel->FindPage(m_connect_webview)) + return true; + if (m_printer_webview_added && selection == m_tabpanel->FindPage(m_printer_webview)) + return true; + return false; +} + +void MainFrame::reload_selected_webview() +{ + int selection = m_tabpanel->GetSelection(); + if ( selection == m_tabpanel->FindPage(m_printables_webview)) + m_printables_webview->do_reload(); + if (m_connect_webview_added && selection == m_tabpanel->FindPage(m_connect_webview)) + m_connect_webview->do_reload(); + if (m_printer_webview_added && selection == m_tabpanel->FindPage(m_printer_webview)) + m_printer_webview->do_reload(); +} + void Slic3r::GUI::MainFrame::refresh_account_menu(bool avatar/* = false */) { // Update User name in TopBar @@ -1686,6 +1711,10 @@ void MainFrame::init_menubar_as_editor() wxFULLSCREEN_NOSTATUSBAR | wxFULLSCREEN_NOBORDER | wxFULLSCREEN_NOCAPTION); }, this, []() { return true; }, [this]() { return this->IsFullScreen(); }, this); #endif // __APPLE__ + + viewMenu->AppendSeparator(); + append_menu_item(viewMenu, wxID_ANY, _L("&Reload WebView"), _L("Reload WebView"), + [this](wxCommandEvent&) { reload_selected_webview(); }, "", nullptr, [this]() {return is_any_webview_selected(); }, this); } // Help menu diff --git a/src/slic3r/GUI/MainFrame.hpp b/src/slic3r/GUI/MainFrame.hpp index 359961fe90..2856b695f8 100644 --- a/src/slic3r/GUI/MainFrame.hpp +++ b/src/slic3r/GUI/MainFrame.hpp @@ -237,6 +237,8 @@ public: bool get_printer_webview_tab_added() const { return m_printer_webview_added; } void set_printer_webview_api_key(const std::string& key); void set_printer_webview_credentials(const std::string& usr, const std::string& psk); + bool is_any_webview_selected(); + void reload_selected_webview(); void refresh_account_menu(bool avatar = false); diff --git a/src/slic3r/GUI/WebView.cpp b/src/slic3r/GUI/WebView.cpp index b236b29155..e4f04205e5 100644 --- a/src/slic3r/GUI/WebView.cpp +++ b/src/slic3r/GUI/WebView.cpp @@ -45,7 +45,6 @@ wxWebView* WebView::CreateWebView(wxWindow * parent, const wxString& url, const #endif for (const std::string& handler : message_handlers) { if (!webView->AddScriptMessageHandler(Slic3r::GUI::into_u8(handler))) { - // TODO: dialog to user !!! //wxLogError("Could not add script message handler"); BOOST_LOG_TRIVIAL(error) << __FUNCTION__ << "Could not add script message handler " << handler; } diff --git a/src/slic3r/GUI/WebViewDialog.cpp b/src/slic3r/GUI/WebViewDialog.cpp index 52bacaa391..c3d920567f 100644 --- a/src/slic3r/GUI/WebViewDialog.cpp +++ b/src/slic3r/GUI/WebViewDialog.cpp @@ -618,6 +618,15 @@ void PrinterPickWebViewDialog::on_dpi_changed(const wxRect &suggested_rect) Refresh(); } +void PrinterPickWebViewDialog::on_reload_event(const std::string& message_data) +{ + if (!m_browser) { + return; + } + m_browser->LoadURL(m_default_url); +} + + LoginWebViewDialog::LoginWebViewDialog(wxWindow *parent, std::string &ret_val, const wxString& url, wxEvtHandler* evt_handler) : WebViewDialog(parent, url, _L("Log in dialog"), wxSize(50 * wxGetApp().em_unit(), 80 * wxGetApp().em_unit()), {}) , m_ret_val(ret_val) diff --git a/src/slic3r/GUI/WebViewDialog.hpp b/src/slic3r/GUI/WebViewDialog.hpp index 82ff2f9739..d9e890fc3f 100644 --- a/src/slic3r/GUI/WebViewDialog.hpp +++ b/src/slic3r/GUI/WebViewDialog.hpp @@ -104,7 +104,7 @@ protected: 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; - + void on_reload_event(const std::string& message_data) override; private: std::string& m_ret_val; }; diff --git a/src/slic3r/GUI/WebViewPanel.cpp b/src/slic3r/GUI/WebViewPanel.cpp index 12c8c1ff5b..3329658c81 100644 --- a/src/slic3r/GUI/WebViewPanel.cpp +++ b/src/slic3r/GUI/WebViewPanel.cpp @@ -58,10 +58,11 @@ void WebViewPanel::load_url(const wxString& url) } -WebViewPanel::WebViewPanel(wxWindow *parent, const wxString& default_url, const std::vector& message_handler_names, const std::string& loading_html/* = "loading"*/) +WebViewPanel::WebViewPanel(wxWindow *parent, const wxString& default_url, const std::vector& message_handler_names, const std::string& loading_html, const std::string& error_html) : wxPanel(parent, wxID_ANY, wxDefaultPosition, wxDefaultSize) , m_default_url (default_url) , m_loading_html(loading_html) + , m_error_html(error_html) , m_script_message_hadler_names(message_handler_names) { topsizer = new wxBoxSizer(wxVERTICAL); @@ -188,7 +189,9 @@ void WebViewPanel::on_show(wxShowEvent& evt) { m_shown = evt.IsShown(); if (evt.IsShown() && m_load_default_url) { - load_url(m_default_url); + m_load_default_url = false; + //load_url(m_default_url); + load_error_page(); } } @@ -207,7 +210,7 @@ void WebViewPanel::on_idle(wxIdleEvent& WXUNUSED(evt)) m_load_default_url_on_next_error = false; load_url(m_default_url); } else { - load_url(GUI::format_wxstr("file://%1%/web/connection_failed.html", boost::filesystem::path(resources_dir()).generic_string())); + load_url(GUI::format_wxstr("file://%1%/web/%2%.html", boost::filesystem::path(resources_dir()).generic_string(), m_error_html)); } } } @@ -271,6 +274,7 @@ void WebViewPanel::on_reload_button(wxCommandEvent& WXUNUSED(evt)) void WebViewPanel::on_script_message(wxWebViewEvent& evt) { + BOOST_LOG_TRIVIAL(error) << "unhandled script message: " << evt.GetString(); } void WebViewPanel::on_navigation_request(wxWebViewEvent &evt) @@ -465,7 +469,7 @@ case type: \ WX_ERROR_CASE(wxWEBVIEW_NAV_ERR_OTHER); } - BOOST_LOG_TRIVIAL(error) << "WebViewPanel error: " << category; + BOOST_LOG_TRIVIAL(error) << this <<" WebViewPanel error: " << category; load_error_page(); #ifdef DEBUG_URL_PANEL m_info->ShowMessage(wxString("An error occurred loading ") + evt.GetURL() + "\n" + @@ -473,6 +477,28 @@ case type: \ #endif } +void WebViewPanel::do_reload() +{ + if (!m_browser) { + return; + } + const wxString current_url = m_browser->GetCurrentURL(); + if (current_url.StartsWith(m_default_url)) + { + m_browser->Reload(); + return; + } + load_default_url(); +} + +void WebViewPanel::load_default_url() +{ + if (!m_browser) { + return; + } + load_url(m_default_url); +} + void WebViewPanel::sys_color_changed() { #ifdef _WIN32 @@ -481,7 +507,7 @@ void WebViewPanel::sys_color_changed() } ConnectWebViewPanel::ConnectWebViewPanel(wxWindow* parent) - : WebViewPanel(parent, GUI::from_u8(Utils::ServiceConfig::instance().connect_url()), { "_prusaSlicer" }, "connect_loading") + : WebViewPanel(parent, GUI::from_u8(Utils::ServiceConfig::instance().connect_url()), { "_prusaSlicer" }, "connect_loading_reload", "connect_connection_failed") { // m_browser->RegisterHandler(wxSharedPtr(new WebViewHandler("https"))); @@ -702,6 +728,11 @@ void ConnectWebViewPanel::on_connect_action_error(const std::string &message_dat } +void ConnectWebViewPanel::on_reload_event(const std::string& message_data) +{ + load_default_url(); +} + void ConnectWebViewPanel::logout() { wxString script = L"window._prusaConnect_v1.logout()"; @@ -747,7 +778,7 @@ void ConnectWebViewPanel::on_connect_action_print(const std::string& message_dat } PrinterWebViewPanel::PrinterWebViewPanel(wxWindow* parent, const wxString& default_url) - : WebViewPanel(parent, default_url, {}) + : WebViewPanel(parent, default_url, {"ExternalApp"}, "other_loading_reload", "other_connection_failed") { if (!m_browser) return; @@ -757,6 +788,7 @@ PrinterWebViewPanel::PrinterWebViewPanel(wxWindow* parent, const wxString& defau m_browser->EnableAccessToDevTools(); m_browser->EnableContextMenu(); #endif + } void PrinterWebViewPanel::on_loaded(wxWebViewEvent& evt) @@ -769,6 +801,11 @@ void PrinterWebViewPanel::on_loaded(wxWebViewEvent& evt) send_credentials(); } } +void PrinterWebViewPanel::on_script_message(wxWebViewEvent& evt) +{ + // Only reload messages are being sent now. + load_default_url(); +} void PrinterWebViewPanel::send_api_key() { @@ -817,7 +854,7 @@ void PrinterWebViewPanel::sys_color_changed() PrintablesWebViewPanel::PrintablesWebViewPanel(wxWindow* parent) - : WebViewPanel(parent, GUI::from_u8(Utils::ServiceConfig::instance().printables_url()), { "ExternalApp" }, "loading") + : WebViewPanel(parent, GUI::from_u8(Utils::ServiceConfig::instance().printables_url()), { "ExternalApp" }, "other_loading_reload", "other_connection_failed") { m_browser->Bind(wxEVT_WEBVIEW_LOADED, &PrintablesWebViewPanel::on_loaded, this); m_events["accessTokenExpired"] = std::bind(&PrintablesWebViewPanel::on_printables_event_access_token_expired, this, std::placeholders::_1); @@ -899,7 +936,7 @@ void PrintablesWebViewPanel::on_navigation_request(wxWebViewEvent &evt) void PrintablesWebViewPanel::load_default_url() { - std::string actual_default_url = get_url_lang_theme(Utils::ServiceConfig::instance().printables_url()); + std::string actual_default_url = get_url_lang_theme(Utils::ServiceConfig::instance().printables_url() + "/homepage"); const std::string access_token = wxGetApp().plater()->get_user_account()->get_access_token(); // in case of opening printables logged out - delete cookies and localstorage to get rid of last login diff --git a/src/slic3r/GUI/WebViewPanel.hpp b/src/slic3r/GUI/WebViewPanel.hpp index eaeeb433de..bddb30cb6a 100644 --- a/src/slic3r/GUI/WebViewPanel.hpp +++ b/src/slic3r/GUI/WebViewPanel.hpp @@ -23,7 +23,7 @@ namespace Slic3r::GUI { class WebViewPanel : public wxPanel { public: - WebViewPanel(wxWindow *parent, const wxString& default_url, const std::vector& message_handler_names, const std::string& loading_html = "loading"); + WebViewPanel(wxWindow *parent, const wxString& default_url, const std::vector& message_handler_names, const std::string& loading_html, const std::string& error_html); virtual ~WebViewPanel(); void load_url(const wxString& url); @@ -58,6 +58,8 @@ public: wxString get_default_url() const { return m_default_url; } void set_default_url(const wxString& url) { m_default_url = url; } + virtual void do_reload(); + virtual void load_default_url(); virtual void sys_color_changed(); @@ -98,6 +100,7 @@ protected: bool m_reached_default_url {false}; std::string m_loading_html; + std::string m_error_html; //DECLARE_EVENT_TABLE() bool m_load_error_page { false }; @@ -124,6 +127,7 @@ protected: void run_script_bridge(const wxString& script) override {run_script(script); } void on_page_will_load() override; void on_connect_action_error(const std::string &message_data) override; + void on_reload_event(const std::string& message_data) override; private: static wxString get_login_script(bool refresh); static wxString get_logout_script(); @@ -137,6 +141,7 @@ public: PrinterWebViewPanel(wxWindow* parent, const wxString& default_url); void on_loaded(wxWebViewEvent& evt); + void on_script_message(wxWebViewEvent& evt) override; void send_api_key(); void send_credentials(); @@ -184,7 +189,7 @@ private: void on_printables_event_print_gcode(const std::string& message_data); void on_reload_event(const std::string& message_data); - void load_default_url(); + void load_default_url() override; std::string get_url_lang_theme(const wxString& url); std::map> m_events; diff --git a/src/slic3r/GUI/WebViewPlatformUtilsWin32.cpp b/src/slic3r/GUI/WebViewPlatformUtilsWin32.cpp index 7445031258..2beeed0dce 100644 --- a/src/slic3r/GUI/WebViewPlatformUtilsWin32.cpp +++ b/src/slic3r/GUI/WebViewPlatformUtilsWin32.cpp @@ -286,10 +286,8 @@ void load_request(wxWebView* web_view, const std::string& address, const std::st if (FAILED(wv2_2->NavigateWithWebResourceRequest(webResourceRequest.get()))) { return; - } - + } } - } // namespace Slic3r::GUI #endif // WIN32