SPE-2515: Reload button inside html pages and button in menu

This commit is contained in:
David Kocik 2024-10-22 13:05:29 +02:00 committed by Lukas Matena
parent 1040332c87
commit 20af632115
14 changed files with 131 additions and 18 deletions

View File

@ -0,0 +1,28 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Connection failed</title>
<style>
body {
display: flex;
align-items: center;
justify-content: center;
height: 100vh;
margin: 0;
}
.container {
text-align: center;
}
</style>
</head>
<body>
<div class="container">
<h1>Connection failed</h1>
<p>Something went wrong.</p>
<button style="margin-top: 20px; padding: 10px 20px; font-size: 16px;" onclick="window._prusaSlicer.postMessage(JSON.stringify({ action: 'RELOAD_HOME_PAGE' }))">Reload</button>
</div>
</body>
</html>

View File

@ -71,6 +71,7 @@
</g> </g>
</svg> </svg>
</p> </p>
<button style="margin-top: 20px; padding: 10px 20px; font-size: 16px;" onclick="window._prusaSlicer.postMessage(JSON.stringify({ action: 'RELOAD_HOME_PAGE' }))">Reload</button>
</div> </div>
</div> </div>
</body> </body>

View File

@ -22,6 +22,7 @@
<div class="container"> <div class="container">
<h1>Connection failed</h1> <h1>Connection failed</h1>
<p>Something went wrong.</p> <p>Something went wrong.</p>
<button style="margin-top: 20px; padding: 10px 20px; font-size: 16px;" onclick="window.ExternalApp.postMessage(JSON.stringify({ event: 'reloadHomePage' }))">Reload</button>
</div> </div>
</body> </body>
</html> </html>

View File

@ -62,6 +62,7 @@
</g> </g>
</svg> </svg>
</p> </p>
<button style="margin-top: 20px; padding: 10px 20px; font-size: 16px;" onclick="window.ExternalApp.postMessage(JSON.stringify({ event: 'reloadHomePage' }))">Reload</button>
</div> </div>
</div> </div>
</body> </body>

View File

@ -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["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["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["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() ConnectRequestHandler::~ConnectRequestHandler()
{ {

View File

@ -8,7 +8,7 @@
#include <wx/dialog.h> #include <wx/dialog.h>
#include <wx/window.h> #include <wx/window.h>
//#define DEBUG_URL_PANEL #define DEBUG_URL_PANEL
namespace Slic3r::GUI { namespace Slic3r::GUI {
class ConnectRequestHandler class ConnectRequestHandler
@ -20,7 +20,7 @@ public:
void handle_message(const std::string& message); void handle_message(const std::string& message);
void resend_config(); void resend_config();
protected: 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_log(const std::string& message_data);
virtual void on_connect_action_error(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); 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_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_print(const std::string& message_data) = 0;
virtual void on_connect_action_webapp_ready(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; virtual void run_script_bridge(const wxString &script) = 0;
std::map<std::string, std::function<void(const std::string&)>> m_actions; std::map<std::string, std::function<void(const std::string&)>> m_actions;

View File

@ -868,7 +868,9 @@ void MainFrame::remove_connect_webview_tab()
void MainFrame::show_connect_tab(const wxString& url) 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_tabpanel->SetSelection(m_tabpanel->FindPage(m_connect_webview));
m_connect_webview->set_load_default_url_on_next_error(true); m_connect_webview->set_load_default_url_on_next_error(true);
m_connect_webview->load_url(url); 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); 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 */) void Slic3r::GUI::MainFrame::refresh_account_menu(bool avatar/* = false */)
{ {
// Update User name in TopBar // Update User name in TopBar
@ -1686,6 +1711,10 @@ void MainFrame::init_menubar_as_editor()
wxFULLSCREEN_NOSTATUSBAR | wxFULLSCREEN_NOBORDER | wxFULLSCREEN_NOCAPTION); }, wxFULLSCREEN_NOSTATUSBAR | wxFULLSCREEN_NOBORDER | wxFULLSCREEN_NOCAPTION); },
this, []() { return true; }, [this]() { return this->IsFullScreen(); }, this); this, []() { return true; }, [this]() { return this->IsFullScreen(); }, this);
#endif // __APPLE__ #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 // Help menu

View File

@ -237,6 +237,8 @@ public:
bool get_printer_webview_tab_added() const { return m_printer_webview_added; } 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_api_key(const std::string& key);
void set_printer_webview_credentials(const std::string& usr, const std::string& psk); 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); void refresh_account_menu(bool avatar = false);

View File

@ -45,7 +45,6 @@ wxWebView* WebView::CreateWebView(wxWindow * parent, const wxString& url, const
#endif #endif
for (const std::string& handler : message_handlers) { for (const std::string& handler : message_handlers) {
if (!webView->AddScriptMessageHandler(Slic3r::GUI::into_u8(handler))) { if (!webView->AddScriptMessageHandler(Slic3r::GUI::into_u8(handler))) {
// TODO: dialog to user !!!
//wxLogError("Could not add script message handler"); //wxLogError("Could not add script message handler");
BOOST_LOG_TRIVIAL(error) << __FUNCTION__ << "Could not add script message handler " << handler; BOOST_LOG_TRIVIAL(error) << __FUNCTION__ << "Could not add script message handler " << handler;
} }

View File

@ -618,6 +618,15 @@ void PrinterPickWebViewDialog::on_dpi_changed(const wxRect &suggested_rect)
Refresh(); 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) 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()), {}) : WebViewDialog(parent, url, _L("Log in dialog"), wxSize(50 * wxGetApp().em_unit(), 80 * wxGetApp().em_unit()), {})
, m_ret_val(ret_val) , m_ret_val(ret_val)

View File

@ -104,7 +104,7 @@ protected:
void request_compatible_printers_SLA(); void request_compatible_printers_SLA();
void run_script_bridge(const wxString& script) override { run_script(script); } void run_script_bridge(const wxString& script) override { run_script(script); }
void on_dpi_changed(const wxRect &suggested_rect) override; void on_dpi_changed(const wxRect &suggested_rect) override;
void on_reload_event(const std::string& message_data) override;
private: private:
std::string& m_ret_val; std::string& m_ret_val;
}; };

View File

@ -58,10 +58,11 @@ void WebViewPanel::load_url(const wxString& url)
} }
WebViewPanel::WebViewPanel(wxWindow *parent, const wxString& default_url, const std::vector<std::string>& message_handler_names, const std::string& loading_html/* = "loading"*/) WebViewPanel::WebViewPanel(wxWindow *parent, const wxString& default_url, const std::vector<std::string>& message_handler_names, const std::string& loading_html, const std::string& error_html)
: wxPanel(parent, wxID_ANY, wxDefaultPosition, wxDefaultSize) : wxPanel(parent, wxID_ANY, wxDefaultPosition, wxDefaultSize)
, m_default_url (default_url) , m_default_url (default_url)
, m_loading_html(loading_html) , m_loading_html(loading_html)
, m_error_html(error_html)
, m_script_message_hadler_names(message_handler_names) , m_script_message_hadler_names(message_handler_names)
{ {
topsizer = new wxBoxSizer(wxVERTICAL); topsizer = new wxBoxSizer(wxVERTICAL);
@ -188,7 +189,9 @@ void WebViewPanel::on_show(wxShowEvent& evt)
{ {
m_shown = evt.IsShown(); m_shown = evt.IsShown();
if (evt.IsShown() && m_load_default_url) { 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; m_load_default_url_on_next_error = false;
load_url(m_default_url); load_url(m_default_url);
} else { } 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) void WebViewPanel::on_script_message(wxWebViewEvent& evt)
{ {
BOOST_LOG_TRIVIAL(error) << "unhandled script message: " << evt.GetString();
} }
void WebViewPanel::on_navigation_request(wxWebViewEvent &evt) void WebViewPanel::on_navigation_request(wxWebViewEvent &evt)
@ -465,7 +469,7 @@ case type: \
WX_ERROR_CASE(wxWEBVIEW_NAV_ERR_OTHER); 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(); load_error_page();
#ifdef DEBUG_URL_PANEL #ifdef DEBUG_URL_PANEL
m_info->ShowMessage(wxString("An error occurred loading ") + evt.GetURL() + "\n" + m_info->ShowMessage(wxString("An error occurred loading ") + evt.GetURL() + "\n" +
@ -473,6 +477,28 @@ case type: \
#endif #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() void WebViewPanel::sys_color_changed()
{ {
#ifdef _WIN32 #ifdef _WIN32
@ -481,7 +507,7 @@ void WebViewPanel::sys_color_changed()
} }
ConnectWebViewPanel::ConnectWebViewPanel(wxWindow* parent) 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<wxWebViewHandler>(new WebViewHandler("https"))); // m_browser->RegisterHandler(wxSharedPtr<wxWebViewHandler>(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() void ConnectWebViewPanel::logout()
{ {
wxString script = L"window._prusaConnect_v1.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) 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) if (!m_browser)
return; return;
@ -757,6 +788,7 @@ PrinterWebViewPanel::PrinterWebViewPanel(wxWindow* parent, const wxString& defau
m_browser->EnableAccessToDevTools(); m_browser->EnableAccessToDevTools();
m_browser->EnableContextMenu(); m_browser->EnableContextMenu();
#endif #endif
} }
void PrinterWebViewPanel::on_loaded(wxWebViewEvent& evt) void PrinterWebViewPanel::on_loaded(wxWebViewEvent& evt)
@ -769,6 +801,11 @@ void PrinterWebViewPanel::on_loaded(wxWebViewEvent& evt)
send_credentials(); send_credentials();
} }
} }
void PrinterWebViewPanel::on_script_message(wxWebViewEvent& evt)
{
// Only reload messages are being sent now.
load_default_url();
}
void PrinterWebViewPanel::send_api_key() void PrinterWebViewPanel::send_api_key()
{ {
@ -817,7 +854,7 @@ void PrinterWebViewPanel::sys_color_changed()
PrintablesWebViewPanel::PrintablesWebViewPanel(wxWindow* parent) 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_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); 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() 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(); 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 // in case of opening printables logged out - delete cookies and localstorage to get rid of last login

View File

@ -23,7 +23,7 @@ namespace Slic3r::GUI {
class WebViewPanel : public wxPanel class WebViewPanel : public wxPanel
{ {
public: public:
WebViewPanel(wxWindow *parent, const wxString& default_url, const std::vector<std::string>& message_handler_names, const std::string& loading_html = "loading"); WebViewPanel(wxWindow *parent, const wxString& default_url, const std::vector<std::string>& message_handler_names, const std::string& loading_html, const std::string& error_html);
virtual ~WebViewPanel(); virtual ~WebViewPanel();
void load_url(const wxString& url); void load_url(const wxString& url);
@ -58,6 +58,8 @@ public:
wxString get_default_url() const { return m_default_url; } wxString get_default_url() const { return m_default_url; }
void set_default_url(const wxString& url) { m_default_url = 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(); virtual void sys_color_changed();
@ -98,6 +100,7 @@ protected:
bool m_reached_default_url {false}; bool m_reached_default_url {false};
std::string m_loading_html; std::string m_loading_html;
std::string m_error_html;
//DECLARE_EVENT_TABLE() //DECLARE_EVENT_TABLE()
bool m_load_error_page { false }; bool m_load_error_page { false };
@ -124,6 +127,7 @@ protected:
void run_script_bridge(const wxString& script) override {run_script(script); } void run_script_bridge(const wxString& script) override {run_script(script); }
void on_page_will_load() override; void on_page_will_load() override;
void on_connect_action_error(const std::string &message_data) override; void on_connect_action_error(const std::string &message_data) override;
void on_reload_event(const std::string& message_data) override;
private: private:
static wxString get_login_script(bool refresh); static wxString get_login_script(bool refresh);
static wxString get_logout_script(); static wxString get_logout_script();
@ -137,6 +141,7 @@ public:
PrinterWebViewPanel(wxWindow* parent, const wxString& default_url); PrinterWebViewPanel(wxWindow* parent, const wxString& default_url);
void on_loaded(wxWebViewEvent& evt); void on_loaded(wxWebViewEvent& evt);
void on_script_message(wxWebViewEvent& evt) override;
void send_api_key(); void send_api_key();
void send_credentials(); void send_credentials();
@ -184,7 +189,7 @@ private:
void on_printables_event_print_gcode(const std::string& message_data); void on_printables_event_print_gcode(const std::string& message_data);
void on_reload_event(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::string get_url_lang_theme(const wxString& url);
std::map<std::string, std::function<void(const std::string&)>> m_events; std::map<std::string, std::function<void(const std::string&)>> m_events;

View File

@ -286,10 +286,8 @@ void load_request(wxWebView* web_view, const std::string& address, const std::st
if (FAILED(wv2_2->NavigateWithWebResourceRequest(webResourceRequest.get()))) if (FAILED(wv2_2->NavigateWithWebResourceRequest(webResourceRequest.get())))
{ {
return; return;
} }
} }
} // namespace Slic3r::GUI } // namespace Slic3r::GUI
#endif // WIN32 #endif // WIN32