mirror of
https://git.mirrors.martin98.com/https://github.com/prusa3d/PrusaSlicer.git
synced 2025-08-14 13:45:59 +08:00
SPE-2515: Reload button inside html pages and button in menu
This commit is contained in:
parent
1040332c87
commit
20af632115
28
resources/web/connect_connection_failed.html
Normal file
28
resources/web/connect_connection_failed.html
Normal 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>
|
@ -71,6 +71,7 @@
|
||||
</g>
|
||||
</svg>
|
||||
</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>
|
||||
</body>
|
@ -22,6 +22,7 @@
|
||||
<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.ExternalApp.postMessage(JSON.stringify({ event: 'reloadHomePage' }))">Reload</button>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
@ -62,6 +62,7 @@
|
||||
</g>
|
||||
</svg>
|
||||
</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>
|
@ -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()
|
||||
{
|
||||
|
@ -8,7 +8,7 @@
|
||||
#include <wx/dialog.h>
|
||||
#include <wx/window.h>
|
||||
|
||||
//#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<std::string, std::function<void(const std::string&)>> m_actions;
|
||||
|
@ -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
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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)
|
||||
|
@ -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;
|
||||
};
|
||||
|
@ -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)
|
||||
, 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<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()
|
||||
{
|
||||
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
|
||||
|
@ -23,7 +23,7 @@ namespace Slic3r::GUI {
|
||||
class WebViewPanel : public wxPanel
|
||||
{
|
||||
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();
|
||||
|
||||
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<std::string, std::function<void(const std::string&)>> m_events;
|
||||
|
@ -287,9 +287,7 @@ void load_request(wxWebView* web_view, const std::string& address, const std::st
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
} // namespace Slic3r::GUI
|
||||
#endif // WIN32
|
||||
|
Loading…
x
Reference in New Issue
Block a user