SPE-2561: Printables Print dialog

Fix of opening webview dialog from webview panel

CLOSE_DIALOG connect action

Login on logged out Print request

Register CLOSE_DIALOG callback.

refactoring
This commit is contained in:
David Kocik 2024-11-11 09:58:04 +01:00
parent 668d73b2ea
commit 3bdaef4910
11 changed files with 100 additions and 33 deletions

View File

@ -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()
{

View File

@ -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;

View File

@ -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()
{

View File

@ -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:

View File

@ -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()

View File

@ -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<std::string>& message_handlers);
};

View File

@ -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()), {})

View File

@ -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

View File

@ -18,7 +18,7 @@
#include <wx/webview.h>
#include <wx/url.h>
#include <curl/curl.h>
#include <boost/log/trivial.hpp>
#include <boost/property_tree/ptree.hpp>
#include <boost/property_tree/json_parser.hpp>
@ -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);
}

View File

@ -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();

View File

@ -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; }