mirror of
https://github.com/SoftFever/OrcaSlicer.git
synced 2025-07-15 02:37:51 -06:00

* Add new MyRRF custom printer * hide user panel when networking plugin is not installed/used * Fixed a bug that promption of installing plugin notification was not displayed when trying to switch to Bambu device tab * replay missing_connection animated image when switching to device tab
377 lines
11 KiB
C++
377 lines
11 KiB
C++
#include "NetworkTestDialog.hpp"
|
|
#include "I18N.hpp"
|
|
|
|
#include "libslic3r/Utils.hpp"
|
|
#include "GUI.hpp"
|
|
#include "GUI_App.hpp"
|
|
#include "I18N.hpp"
|
|
#include "slic3r/Utils/Http.hpp"
|
|
#include "libslic3r/AppConfig.hpp"
|
|
#include <boost/asio/ip/address.hpp>
|
|
#include <boost/log/trivial.hpp>
|
|
|
|
namespace Slic3r {
|
|
namespace GUI {
|
|
|
|
wxDECLARE_EVENT(EVT_UPDATE_RESULT, wxCommandEvent);
|
|
|
|
wxDEFINE_EVENT(EVT_UPDATE_RESULT, wxCommandEvent);
|
|
|
|
static wxString NA_STR = _L("N/A");
|
|
|
|
NetworkTestDialog::NetworkTestDialog(wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style)
|
|
: DPIDialog(parent,wxID_ANY,from_u8((boost::format(_utf8(L("Network Test")))).str()),wxDefaultPosition,
|
|
wxSize(1000, 700),
|
|
/*wxCAPTION*/wxDEFAULT_DIALOG_STYLE|wxMAXIMIZE_BOX|wxMINIMIZE_BOX|wxRESIZE_BORDER)
|
|
{
|
|
this->SetBackgroundColour(wxColour(255, 255, 255));
|
|
|
|
this->SetSizeHints(wxDefaultSize, wxDefaultSize);
|
|
|
|
wxBoxSizer* main_sizer;
|
|
main_sizer = new wxBoxSizer(wxVERTICAL);
|
|
|
|
wxBoxSizer* top_sizer = create_top_sizer(this);
|
|
main_sizer->Add(top_sizer, 0, wxEXPAND, 5);
|
|
|
|
wxBoxSizer* info_sizer = create_info_sizer(this);
|
|
main_sizer->Add(info_sizer, 0, wxEXPAND, 5);
|
|
|
|
wxBoxSizer* content_sizer = create_content_sizer(this);
|
|
main_sizer->Add(content_sizer, 0, wxEXPAND, 5);
|
|
|
|
wxBoxSizer* result_sizer = create_result_sizer(this);
|
|
main_sizer->Add(result_sizer, 1, wxEXPAND, 5);
|
|
|
|
set_default();
|
|
|
|
init_bind();
|
|
|
|
this->SetSizer(main_sizer);
|
|
this->Layout();
|
|
|
|
this->Centre(wxBOTH);
|
|
wxGetApp().UpdateDlgDarkUI(this);
|
|
}
|
|
|
|
wxBoxSizer* NetworkTestDialog::create_top_sizer(wxWindow* parent)
|
|
{
|
|
StateColor btn_bg(std::pair<wxColour, int>(wxColour(0, 137, 123), StateColor::Pressed), std::pair<wxColour, int>(wxColour(38, 166, 154), StateColor::Hovered), std::pair<wxColour, int>(wxColour(255, 255, 255), StateColor::Enabled));
|
|
auto sizer = new wxBoxSizer(wxVERTICAL);
|
|
|
|
auto line_sizer = new wxBoxSizer(wxHORIZONTAL);
|
|
btn_start = new Button(this, _L("Start Test Multi-Thread"));
|
|
btn_start->SetBackgroundColor(btn_bg);
|
|
line_sizer->Add(btn_start, 0, wxALL, 5);
|
|
|
|
btn_start_sequence = new Button(this, _L("Start Test Single-Thread"));
|
|
btn_start_sequence->SetBackgroundColor(btn_bg);
|
|
|
|
line_sizer->Add(btn_start_sequence, 0, wxALL, 5);
|
|
|
|
btn_download_log = new Button(this, _L("Export Log"));
|
|
btn_download_log->SetBackgroundColor(btn_bg);
|
|
line_sizer->Add(btn_download_log, 0, wxALL, 5);
|
|
btn_download_log->Hide();
|
|
|
|
btn_start->Bind(wxEVT_BUTTON, [this](wxCommandEvent &evt) {
|
|
start_all_job();
|
|
});
|
|
btn_start_sequence->Bind(wxEVT_BUTTON, [this](wxCommandEvent &evt) {
|
|
start_all_job_sequence();
|
|
});
|
|
sizer->Add(line_sizer, 0, wxEXPAND, 5);
|
|
return sizer;
|
|
}
|
|
|
|
wxBoxSizer* NetworkTestDialog::create_info_sizer(wxWindow* parent)
|
|
{
|
|
auto sizer = new wxBoxSizer(wxVERTICAL);
|
|
|
|
text_basic_info = new wxStaticText(this, wxID_ANY, _L("Basic Info"), wxDefaultPosition, wxDefaultSize, 0);
|
|
text_basic_info->Wrap(-1);
|
|
sizer->Add(text_basic_info, 0, wxALL, 5);
|
|
|
|
wxBoxSizer* version_sizer = new wxBoxSizer(wxHORIZONTAL);
|
|
text_version_title = new wxStaticText(this, wxID_ANY, _L("OrcaSlicer Version:"), wxDefaultPosition, wxDefaultSize, 0);
|
|
text_version_title->Wrap(-1);
|
|
version_sizer->Add(text_version_title, 0, wxALL, 5);
|
|
|
|
wxString text_version = get_studio_version();
|
|
text_version_val = new wxStaticText(this, wxID_ANY, text_version, wxDefaultPosition, wxDefaultSize, 0);
|
|
text_version_val->Wrap(-1);
|
|
version_sizer->Add(text_version_val, 0, wxALL, 5);
|
|
sizer->Add(version_sizer, 1, wxEXPAND, 5);
|
|
|
|
wxBoxSizer* sys_sizer = new wxBoxSizer(wxHORIZONTAL);
|
|
|
|
txt_sys_info_title = new wxStaticText(this, wxID_ANY, _L("System Version:"), wxDefaultPosition, wxDefaultSize, 0);
|
|
txt_sys_info_title->Wrap(-1);
|
|
sys_sizer->Add(txt_sys_info_title, 0, wxALL, 5);
|
|
|
|
txt_sys_info_value = new wxStaticText(this, wxID_ANY, get_os_info(), wxDefaultPosition, wxDefaultSize, 0);
|
|
txt_sys_info_value->Wrap(-1);
|
|
sys_sizer->Add(txt_sys_info_value, 0, wxALL, 5);
|
|
|
|
sizer->Add(sys_sizer, 1, wxEXPAND, 5);
|
|
|
|
wxBoxSizer* line_sizer = new wxBoxSizer(wxHORIZONTAL);
|
|
txt_dns_info_title = new wxStaticText(this, wxID_ANY, _L("DNS Server:"), wxDefaultPosition, wxDefaultSize, 0);
|
|
txt_dns_info_title->Wrap(-1);
|
|
txt_dns_info_title->Hide();
|
|
line_sizer->Add(txt_dns_info_title, 0, wxALL, 5);
|
|
|
|
txt_dns_info_value = new wxStaticText(this, wxID_ANY, get_dns_info(), wxDefaultPosition, wxDefaultSize, 0);
|
|
txt_dns_info_value->Hide();
|
|
line_sizer->Add(txt_dns_info_value, 0, wxALL, 5);
|
|
sizer->Add(line_sizer, 1, wxEXPAND, 5);
|
|
|
|
return sizer;
|
|
}
|
|
|
|
wxBoxSizer* NetworkTestDialog::create_content_sizer(wxWindow* parent)
|
|
{
|
|
auto sizer = new wxBoxSizer(wxVERTICAL);
|
|
|
|
wxFlexGridSizer* grid_sizer;
|
|
grid_sizer = new wxFlexGridSizer(0, 3, 0, 0);
|
|
grid_sizer->SetFlexibleDirection(wxBOTH);
|
|
grid_sizer->SetNonFlexibleGrowMode(wxFLEX_GROWMODE_SPECIFIED);
|
|
|
|
StateColor btn_bg(std::pair<wxColour, int>(wxColour(0, 137, 123), StateColor::Pressed),std::pair<wxColour, int>(wxColour(38, 166, 154), StateColor::Hovered), std::pair<wxColour, int>(wxColour(255,255,255), StateColor::Enabled));
|
|
btn_link = new Button(this, _L("Test OrcaSlicer(GitHub)"));
|
|
btn_link->SetBackgroundColor(btn_bg);
|
|
grid_sizer->Add(btn_link, 0, wxEXPAND | wxALL, 5);
|
|
|
|
text_link_title = new wxStaticText(this, wxID_ANY, _L("Test OrcaSlicer(GitHub):"), wxDefaultPosition, wxDefaultSize, 0);
|
|
text_link_title->Wrap(-1);
|
|
grid_sizer->Add(text_link_title, 0, wxALIGN_RIGHT | wxALL, 5);
|
|
|
|
text_link_val = new wxStaticText(this, wxID_ANY, _L("N/A"), wxDefaultPosition, wxDefaultSize, 0);
|
|
text_link_val->Wrap(-1);
|
|
grid_sizer->Add(text_link_val, 0, wxALL, 5);
|
|
|
|
btn_bing = new Button(this, _L("Test Bing.com"));
|
|
btn_bing->SetBackgroundColor(btn_bg);
|
|
grid_sizer->Add(btn_bing, 0, wxEXPAND | wxALL, 5);
|
|
|
|
text_bing_title = new wxStaticText(this, wxID_ANY, _L("Test bing.com:"), wxDefaultPosition, wxDefaultSize, 0);
|
|
|
|
text_bing_title->Wrap(-1);
|
|
grid_sizer->Add(text_bing_title, 0, wxALIGN_RIGHT | wxALL, 5);
|
|
|
|
text_bing_val = new wxStaticText(this, wxID_ANY, _L("N/A"), wxDefaultPosition, wxDefaultSize, 0);
|
|
text_bing_val->Wrap(-1);
|
|
grid_sizer->Add(text_bing_val, 0, wxALL, 5);
|
|
sizer->Add(grid_sizer, 1, wxEXPAND, 5);
|
|
|
|
btn_link->Bind(wxEVT_BUTTON, [this](wxCommandEvent& evt) {
|
|
start_test_github_thread();
|
|
});
|
|
|
|
btn_bing->Bind(wxEVT_BUTTON, [this](wxCommandEvent& evt) {
|
|
start_test_bing_thread();
|
|
});
|
|
|
|
return sizer;
|
|
}
|
|
wxBoxSizer* NetworkTestDialog::create_result_sizer(wxWindow* parent)
|
|
{
|
|
auto sizer = new wxBoxSizer(wxVERTICAL);
|
|
text_result = new wxStaticText(this, wxID_ANY, _L("Log Info"), wxDefaultPosition, wxDefaultSize, 0);
|
|
text_result->Wrap(-1);
|
|
sizer->Add(text_result, 0, wxALL, 5);
|
|
|
|
txt_log = new wxTextCtrl(this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_MULTILINE);
|
|
sizer->Add(txt_log, 1, wxALL | wxEXPAND, 5);
|
|
return sizer;
|
|
}
|
|
|
|
NetworkTestDialog::~NetworkTestDialog()
|
|
{
|
|
;
|
|
}
|
|
|
|
void NetworkTestDialog::init_bind()
|
|
{
|
|
Bind(EVT_UPDATE_RESULT, [this](wxCommandEvent& evt) {
|
|
if (evt.GetInt() == TEST_ORCA_JOB) {
|
|
text_link_val->SetLabelText(evt.GetString());
|
|
} else if (evt.GetInt() == TEST_BING_JOB) {
|
|
text_bing_val->SetLabelText(evt.GetString());
|
|
}
|
|
|
|
std::time_t t = std::time(0);
|
|
std::tm* now_time = std::localtime(&t);
|
|
std::stringstream buf;
|
|
buf << std::put_time(now_time, "%a %b %d %H:%M:%S");
|
|
wxString info = wxString::Format("%s:", buf.str()) + evt.GetString() + "\n";
|
|
try {
|
|
txt_log->AppendText(info);
|
|
}
|
|
catch (std::exception& e) {
|
|
BOOST_LOG_TRIVIAL(error) << "Unkown Exception in print_log, exception=" << e.what();
|
|
return;
|
|
}
|
|
catch (...) {
|
|
BOOST_LOG_TRIVIAL(error) << "Unkown Exception in print_log";
|
|
return;
|
|
}
|
|
return;
|
|
});
|
|
|
|
Bind(wxEVT_CLOSE_WINDOW, &NetworkTestDialog::on_close, this);
|
|
}
|
|
|
|
wxString NetworkTestDialog::get_os_info()
|
|
{
|
|
int major = 0, minor = 0, micro = 0;
|
|
wxGetOsVersion(&major, &minor, µ);
|
|
std::string os_version = (boost::format("%1%.%2%.%3%") % major % minor % micro).str();
|
|
wxString text_sys_version = wxGetOsDescription() + wxString::Format("%d.%d.%d", major, minor, micro);
|
|
return text_sys_version;
|
|
}
|
|
|
|
|
|
wxString NetworkTestDialog::get_dns_info()
|
|
{
|
|
return NA_STR;
|
|
}
|
|
|
|
void NetworkTestDialog::start_all_job()
|
|
{
|
|
start_test_github_thread();
|
|
start_test_bing_thread();
|
|
}
|
|
|
|
void NetworkTestDialog::start_all_job_sequence()
|
|
{
|
|
m_sequence_job = new boost::thread([this] {
|
|
update_status(-1, "start_test_sequence");
|
|
start_test_url(TEST_BING_JOB, "Bing", "http://www.bing.com");
|
|
if (m_closing) return;
|
|
start_test_url(TEST_ORCA_JOB, "OrcaSlicer(GitHub)", "https://github.com/SoftFever/OrcaSlicer");
|
|
if (m_closing) return;
|
|
update_status(-1, "end_test_sequence");
|
|
});
|
|
}
|
|
|
|
void NetworkTestDialog::start_test_url(TestJob job, wxString name, wxString url)
|
|
{
|
|
m_in_testing[job] = true;
|
|
wxString info = wxString::Format("test %s start...", name);
|
|
|
|
update_status(job, info);
|
|
|
|
Slic3r::Http http = Slic3r::Http::get(url.ToStdString());
|
|
info = wxString::Format("[test %s]: url=%s", name,url);
|
|
|
|
update_status(-1, info);
|
|
|
|
int result = -1;
|
|
http.timeout_max(10)
|
|
.on_complete([this, &result](std::string body, unsigned status) {
|
|
try {
|
|
if (status == 200) {
|
|
result = 0;
|
|
}
|
|
}
|
|
catch (...) {
|
|
;
|
|
}
|
|
})
|
|
.on_ip_resolve([this,name,job](std::string ip) {
|
|
wxString ip_report = wxString::Format("test %s ip resolved = %s", name, ip);
|
|
update_status(job, ip_report);
|
|
})
|
|
.on_error([this,name,job](std::string body, std::string error, unsigned int status) {
|
|
wxString info = wxString::Format("status=%u, body=%s, error=%s", status, body, error);
|
|
this->update_status(job, wxString::Format("test %s failed", name));
|
|
this->update_status(-1, info);
|
|
}).perform_sync();
|
|
if (result == 0) {
|
|
update_status(job, wxString::Format("test %s ok", name));
|
|
}
|
|
m_in_testing[job] = false;
|
|
}
|
|
|
|
void NetworkTestDialog::start_test_ping_thread()
|
|
{
|
|
test_job[TEST_PING_JOB] = new boost::thread([this] {
|
|
m_in_testing[TEST_PING_JOB] = true;
|
|
|
|
m_in_testing[TEST_PING_JOB] = false;
|
|
});
|
|
}
|
|
void NetworkTestDialog::start_test_github_thread()
|
|
{
|
|
if (m_in_testing[TEST_ORCA_JOB])
|
|
return;
|
|
test_job[TEST_ORCA_JOB] = new boost::thread([this] {
|
|
start_test_url(TEST_ORCA_JOB, "OrcaSlicer(GitHub)", "https://github.com/SoftFever/OrcaSlicer");
|
|
});
|
|
}
|
|
void NetworkTestDialog::start_test_bing_thread()
|
|
{
|
|
test_job[TEST_BING_JOB] = new boost::thread([this] {
|
|
start_test_url(TEST_BING_JOB, "Bing", "http://www.bing.com");
|
|
});
|
|
}
|
|
|
|
void NetworkTestDialog::on_close(wxCloseEvent& event)
|
|
{
|
|
m_download_cancel = true;
|
|
m_closing = true;
|
|
for (int i = 0; i < TEST_JOB_MAX; i++) {
|
|
if (test_job[i]) {
|
|
test_job[i]->join();
|
|
test_job[i] = nullptr;
|
|
}
|
|
}
|
|
|
|
event.Skip();
|
|
}
|
|
|
|
|
|
wxString NetworkTestDialog::get_studio_version()
|
|
{
|
|
return wxString(SoftFever_VERSION);
|
|
}
|
|
|
|
void NetworkTestDialog::set_default()
|
|
{
|
|
for (int i = 0; i < TEST_JOB_MAX; i++) {
|
|
test_job[i] = nullptr;
|
|
m_in_testing[i] = false;
|
|
}
|
|
|
|
m_sequence_job = nullptr;
|
|
|
|
text_version_val->SetLabelText(get_studio_version());
|
|
txt_sys_info_value->SetLabelText(get_os_info());
|
|
txt_dns_info_value->SetLabelText(get_dns_info());
|
|
text_link_val->SetLabelText(NA_STR);
|
|
text_bing_val->SetLabelText(NA_STR);
|
|
m_download_cancel = false;
|
|
m_closing = false;
|
|
}
|
|
|
|
|
|
void NetworkTestDialog::on_dpi_changed(const wxRect &suggested_rect)
|
|
{
|
|
;
|
|
}
|
|
|
|
void NetworkTestDialog::update_status(int job_id, wxString info)
|
|
{
|
|
auto evt = new wxCommandEvent(EVT_UPDATE_RESULT, this->GetId());
|
|
evt->SetString(info);
|
|
evt->SetInt(job_id);
|
|
wxQueueEvent(this, evt);
|
|
}
|
|
|
|
|
|
} // namespace GUI
|
|
} // namespace Slic3r
|
|
|
|
|