diff --git a/src/slic3r/GUI/ConnectRequestHandler.cpp b/src/slic3r/GUI/ConnectRequestHandler.cpp index 4af2f92148..0f4bf4a208 100644 --- a/src/slic3r/GUI/ConnectRequestHandler.cpp +++ b/src/slic3r/GUI/ConnectRequestHandler.cpp @@ -26,7 +26,7 @@ ConnectRequestHandler::ConnectRequestHandler() 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); - + m_actions["CLOSE_DIALOG"] = std::bind(&ConnectRequestHandler::on_connect_action_close_dialog, this, std::placeholders::_1); } ConnectRequestHandler::~ConnectRequestHandler() { diff --git a/src/slic3r/GUI/ConnectRequestHandler.hpp b/src/slic3r/GUI/ConnectRequestHandler.hpp index 017d68f0de..50053b545b 100644 --- a/src/slic3r/GUI/ConnectRequestHandler.hpp +++ b/src/slic3r/GUI/ConnectRequestHandler.hpp @@ -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_connect_action_close_dialog(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; diff --git a/src/slic3r/GUI/GUI_App.cpp b/src/slic3r/GUI/GUI_App.cpp index 22fef94c11..a5d3c120ee 100644 --- a/src/slic3r/GUI/GUI_App.cpp +++ b/src/slic3r/GUI/GUI_App.cpp @@ -4190,10 +4190,6 @@ void GUI_App::printables_slice_request(const std::string& download_url, const st m_downloader->init(dest_folder); m_downloader->start_download_printables(download_url, true, model_url, this); } -void GUI_App::printables_print_request(const std::string& download_url, const std::string& model_url) -{ - plater()->printables_to_connect_gcode(Utils::ServiceConfig::instance().printables_url() + model_url); -} void GUI_App::printables_login_request() { diff --git a/src/slic3r/GUI/GUI_App.hpp b/src/slic3r/GUI/GUI_App.hpp index a85c8a8480..5dde60ea54 100644 --- a/src/slic3r/GUI/GUI_App.hpp +++ b/src/slic3r/GUI/GUI_App.hpp @@ -413,14 +413,6 @@ public: void open_wifi_config_dialog(bool forced, const wxString& drive_path = {}); bool get_wifi_config_dialog_shown() const { return m_wifi_config_dialog_shown; } - void request_login(bool show_user_info = false) {} - bool check_login() { return false; } - void get_login_info() {} - bool is_user_login() { return true; } - - void request_user_login(int online_login) {} - void request_user_logout() {} - int request_user_unbind(std::string dev_id) { return 0; } bool select_printer_from_connect(const std::string& cmd); void select_filament_from_connect(const std::string& cmd); void handle_connect_request_printer_select(const std::string& cmd); @@ -438,7 +430,6 @@ public: void request_remove_project(std::string project_id) {} void printables_download_request(const std::string& download_url, const std::string& model_url); void printables_slice_request(const std::string& download_url, const std::string& model_url); - void printables_print_request(const std::string& download_url, const std::string& model_url); void printables_login_request(); void open_link_in_printables(const std::string& url); private: diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index 45d6eaded8..c36e105123 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -127,6 +127,7 @@ #include "UserAccountUtils.hpp" #include "DesktopIntegrationDialog.hpp" #include "WebViewDialog.hpp" +#include "WebViewPanel.hpp" #include "ConfigWizardWebViewPage.hpp" #include "PresetArchiveDatabase.hpp" @@ -1044,6 +1045,15 @@ Plater::priv::priv(Plater *q, MainFrame *main_frame) this->q->Bind(EVT_UA_ENQUEUED_REFRESH, [this](SimpleEvent& evt) { this->main_frame->on_account_will_refresh(); }); + + this->q->Bind(EVT_PRINTABLES_CONNECT_PRINT, [this](wxCommandEvent& evt) { + if (!this->user_account->is_logged()) { + // show login dialog instead of print dialog + this->user_account->do_login(); + return; + } + this->q->printables_to_connect_gcode(into_u8(evt.GetString())); + }); } wxGetApp().other_instance_message_handler()->init(this->q); @@ -6059,12 +6069,9 @@ bool load_secret(const std::string& id, const std::string& opt, std::string& usr void Plater::printables_to_connect_gcode(const std::string& url) { - { - PrintablesConnectUploadDialog dialog(this, url); - if (dialog.ShowModal() != wxID_OK) { - return; - } - } + PrintablesConnectUploadDialog dialog(this, url); + dialog.ShowModal(); + } void Plater::connect_gcode() diff --git a/src/slic3r/GUI/WebView.hpp b/src/slic3r/GUI/WebView.hpp index 40ec2fa534..11afc09268 100644 --- a/src/slic3r/GUI/WebView.hpp +++ b/src/slic3r/GUI/WebView.hpp @@ -10,8 +10,6 @@ class wxString; namespace WebView { - // When using WebView in Panel, it is benfitable to call create only when it is being shown. (lower CPU usage) - // But when using WebView in Dialog, call both. wxWebView* webview_new(); void webview_create(wxWebView* webview, wxWindow *parent, const wxString& url, const std::vector& message_handlers); }; diff --git a/src/slic3r/GUI/WebViewDialog.cpp b/src/slic3r/GUI/WebViewDialog.cpp index 485c974c27..1b7740f630 100644 --- a/src/slic3r/GUI/WebViewDialog.cpp +++ b/src/slic3r/GUI/WebViewDialog.cpp @@ -219,13 +219,20 @@ void WebViewDialog::on_reload_button(wxCommandEvent& WXUNUSED(evt)) m_browser->Reload(); } - void WebViewDialog::on_navigation_request(wxWebViewEvent &evt) { + BOOST_LOG_TRIVIAL(debug) << "WebViewDialog::on_navigation_request " << evt.GetURL(); } +void WebViewDialog::on_loaded(wxWebViewEvent &evt) +{ + BOOST_LOG_TRIVIAL(debug) << "WebViewDialog::on_loaded " << evt.GetURL(); +} + + void WebViewDialog::on_script_message(wxWebViewEvent& evt) { + BOOST_LOG_TRIVIAL(error) << "Unhandled script message: " << evt.GetString(); } /** @@ -634,13 +641,14 @@ void PrinterPickWebViewDialog::on_reload_event(const std::string& message_data) m_browser->LoadURL(m_default_url); } + PrintablesConnectUploadDialog::PrintablesConnectUploadDialog(wxWindow* parent, const std::string url) : WebViewDialog(parent - , GUI::from_u8(url) - , _L("Choose a printer") - , wxSize(parent->GetClientSize().x / 4 * 3, parent->GetClientSize().y/ 4 * 3) - ,{"_prusaSlicer"} - , "connect_loading") + , GUI::from_u8(url) + , _L("Choose a printer") + , wxSize(parent->GetClientSize().x / 4 * 3, parent->GetClientSize().y/ 4 * 3) + ,{"_prusaSlicer"} + , "connect_loading") { wxDisplay display(wxDisplay::GetFromWindow(this)); wxRect geometry = display.GetGeometry(); @@ -657,7 +665,39 @@ void PrintablesConnectUploadDialog::on_dpi_changed(const wxRect &suggested_rect) Refresh(); } +void PrintablesConnectUploadDialog::on_script_message(wxWebViewEvent& evt) +{ + handle_message(into_u8(evt.GetString())); +} +void PrintablesConnectUploadDialog::on_connect_action_select_printer(const std::string& message_data) +{ + // SELECT_PRINTER request is not defined for PrintablesConnectUploadDialog + assert(true); +} +void PrintablesConnectUploadDialog::on_connect_action_print(const std::string& message_data) +{ + assert(true); +} + +void PrintablesConnectUploadDialog::on_connect_action_webapp_ready(const std::string& message_data) +{ + // WEBAPP_READY request is not defined for PrintablesConnectUploadDialog + assert(true); +} + +void PrintablesConnectUploadDialog::on_reload_event(const std::string& message_data) +{ + if (!m_browser) { + return; + } + m_browser->LoadURL(m_default_url); +} + +void PrintablesConnectUploadDialog::on_connect_action_close_dialog(const std::string& message_data) +{ + this->EndModal(wxID_OK); +} 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()), {}) diff --git a/src/slic3r/GUI/WebViewDialog.hpp b/src/slic3r/GUI/WebViewDialog.hpp index fc24eab489..318fd9cefa 100644 --- a/src/slic3r/GUI/WebViewDialog.hpp +++ b/src/slic3r/GUI/WebViewDialog.hpp @@ -52,7 +52,7 @@ public: void On_enable_dev_tools(wxCommandEvent& evt); virtual void on_navigation_request(wxWebViewEvent &evt); - virtual void on_loaded(wxWebViewEvent &evt) {} + virtual void on_loaded(wxWebViewEvent &evt); void run_script(const wxString& javascript); @@ -105,17 +105,25 @@ protected: 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; + void on_connect_action_close_dialog(const std::string& message_data) override {assert(true);} private: std::string& m_ret_val; }; -class PrintablesConnectUploadDialog : public WebViewDialog +class PrintablesConnectUploadDialog : public WebViewDialog, public ConnectRequestHandler { public: PrintablesConnectUploadDialog(wxWindow* parent, const std::string url); + void on_script_message(wxWebViewEvent& evt) override; protected: void on_dpi_changed(const wxRect &suggested_rect) override; + void on_connect_action_select_printer(const std::string& message_data) override; + void on_connect_action_print(const std::string& message_data) override; + void on_connect_action_webapp_ready(const std::string& message_data) override; + void on_reload_event(const std::string& message_data) override; + void run_script_bridge(const wxString &script) override { run_script(script); } + void on_connect_action_close_dialog(const std::string& message_data) override; }; class LoginWebViewDialog : public WebViewDialog diff --git a/src/slic3r/GUI/WebViewPanel.cpp b/src/slic3r/GUI/WebViewPanel.cpp index 2796764fda..5618b0c008 100644 --- a/src/slic3r/GUI/WebViewPanel.cpp +++ b/src/slic3r/GUI/WebViewPanel.cpp @@ -18,7 +18,7 @@ #include #include - +#include #include #include #include @@ -30,6 +30,8 @@ // to set authorization cookie for all WebKit requests to Connect #define AUTH_VIA_FETCH_OVERRIDE 0 +wxDEFINE_EVENT(EVT_PRINTABLES_CONNECT_PRINT, wxCommandEvent); + namespace pt = boost::property_tree; namespace Slic3r::GUI { @@ -1162,6 +1164,24 @@ void PrintablesWebViewPanel::on_reload_event(const std::string& message_data) // Event from our error / loading html pages load_default_url(); } + +namespace { +std::string escape_url(const std::string& unescaped) +{ + std::string ret_val; + CURL* curl = curl_easy_init(); + if (curl) { + char* decoded = curl_easy_escape(curl, unescaped.c_str(), unescaped.size()); + if (decoded) { + ret_val = std::string(decoded); + curl_free(decoded); + } + curl_easy_cleanup(curl); + } + return ret_val; +} +} + void PrintablesWebViewPanel::on_printables_event_print_gcode(const std::string& message_data) { // { "event": "downloadFile", "url": "https://media.printables.com/somesecure.stl", "modelUrl": "https://www.printables.com/model/123" } @@ -1182,7 +1202,9 @@ void PrintablesWebViewPanel::on_printables_event_print_gcode(const std::string& return; } assert(!download_url.empty() && !model_url.empty()); - wxGetApp().printables_print_request(download_url, model_url); + wxCommandEvent* evt = new wxCommandEvent(EVT_PRINTABLES_CONNECT_PRINT); + evt->SetString(from_u8(Utils::ServiceConfig::instance().connect_printables_print_url() +"?url=" + escape_url(download_url))); + wxQueueEvent(GUI::wxGetApp().mainframe->m_plater, evt); } void PrintablesWebViewPanel::on_printables_event_download_file(const std::string& message_data) { @@ -1207,6 +1229,7 @@ void PrintablesWebViewPanel::on_printables_event_download_file(const std::string assert(!download_url.empty() && !model_url.empty()); boost::filesystem::path url_path(download_url); show_download_notification(url_path.filename().string()); + wxGetApp().printables_download_request(download_url, model_url); } void PrintablesWebViewPanel::on_printables_event_slice_file(const std::string& message_data) @@ -1230,6 +1253,7 @@ void PrintablesWebViewPanel::on_printables_event_slice_file(const std::string& m return; } assert(!download_url.empty() && !model_url.empty()); + wxGetApp().printables_slice_request(download_url, model_url); } diff --git a/src/slic3r/GUI/WebViewPanel.hpp b/src/slic3r/GUI/WebViewPanel.hpp index 3034e23d47..4a16b90a7d 100644 --- a/src/slic3r/GUI/WebViewPanel.hpp +++ b/src/slic3r/GUI/WebViewPanel.hpp @@ -17,7 +17,7 @@ class wxWebView; class wxWebViewEvent; -wxDECLARE_EVENT(EVT_OPEN_EXTERNAL_LOGIN, wxCommandEvent); +wxDECLARE_EVENT(EVT_PRINTABLES_CONNECT_PRINT, wxCommandEvent); namespace Slic3r::GUI { @@ -141,6 +141,7 @@ protected: 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; + void on_connect_action_close_dialog(const std::string& message_data) override {assert(true);} private: static wxString get_login_script(bool refresh); static wxString get_logout_script(); diff --git a/src/slic3r/Utils/ServiceConfig.hpp b/src/slic3r/Utils/ServiceConfig.hpp index 6bfe5d9a94..20c3547137 100644 --- a/src/slic3r/Utils/ServiceConfig.hpp +++ b/src/slic3r/Utils/ServiceConfig.hpp @@ -14,6 +14,7 @@ public: std::string connect_select_printer_url() const { return m_connect_url + "/slicer-select-printer"; } std::string connect_printers_url() const { return m_connect_url + "/app/printers/"; } std::string connect_teams_url() const { return m_connect_url + "/app/teams"; } + std::string connect_printables_print_url() const { return m_connect_url + "/slicer-print"; } const std::string& account_url() const { return m_account_url; } const std::string& account_client_id() const { return m_account_client_id; }