mirror of
https://git.mirrors.martin98.com/https://github.com/prusa3d/PrusaSlicer.git
synced 2025-08-14 05:05:56 +08:00
Merge branch 'master' into fs_svg_SPE-1517
This commit is contained in:
commit
8b8f161dce
@ -210,6 +210,9 @@ void AppConfig::set_defaults()
|
||||
if (get("allow_ip_resolve").empty())
|
||||
set("allow_ip_resolve", "1");
|
||||
|
||||
if (get("wifi_config_dialog_declined").empty())
|
||||
set("wifi_config_dialog_declined", "0");
|
||||
|
||||
#ifdef _WIN32
|
||||
if (get("use_legacy_3DConnexion").empty())
|
||||
set("use_legacy_3DConnexion", "0");
|
||||
|
@ -2611,12 +2611,15 @@ void GUI_App::add_config_menu(wxMenuBar *menu)
|
||||
break;
|
||||
case ConfigMenuWifiConfigFile:
|
||||
{
|
||||
open_wifi_config_dialog(true);
|
||||
/*
|
||||
std::string file_path;
|
||||
WifiConfigDialog dialog(mainframe, file_path, removable_drive_manager());
|
||||
if (dialog.ShowModal() == wxID_OK)
|
||||
{
|
||||
plater_->get_notification_manager()->push_exporting_finished_notification(file_path, boost::filesystem::path(file_path).parent_path().string(), true);
|
||||
}
|
||||
*/
|
||||
}
|
||||
break;
|
||||
default:
|
||||
@ -3571,5 +3574,38 @@ void GUI_App::start_download(std::string url)
|
||||
m_downloader->start_download(url);
|
||||
}
|
||||
|
||||
void GUI_App::open_wifi_config_dialog(bool forced, const wxString& drive_path/* = {}*/)
|
||||
{
|
||||
if(m_wifi_config_dialog_shown)
|
||||
return;
|
||||
|
||||
bool dialog_was_declined = app_config->get_bool("wifi_config_dialog_declined");
|
||||
|
||||
if (!forced && dialog_was_declined) {
|
||||
|
||||
// dialog was already declined this run, show only notification
|
||||
notification_manager()->push_notification(NotificationType::WifiConfigFileDetected
|
||||
, NotificationManager::NotificationLevel::ImportantNotificationLevel
|
||||
// TRN Text of notification when Slicer starts and usb stick with printer settings ini file is present
|
||||
, _u8L("Printer configuration file detected on removable media.")
|
||||
// TRN Text of hypertext of notification when Slicer starts and usb stick with printer settings ini file is present
|
||||
, _u8L("Write Wi-Fi credetials."), [drive_path](wxEvtHandler* evt_hndlr) {
|
||||
wxGetApp().open_wifi_config_dialog(true, drive_path);
|
||||
return true; });
|
||||
return;
|
||||
}
|
||||
|
||||
m_wifi_config_dialog_shown = true;
|
||||
std::string file_path;
|
||||
WifiConfigDialog dialog(mainframe, file_path, removable_drive_manager(), drive_path);
|
||||
if (dialog.ShowModal() == wxID_OK) {
|
||||
plater_->get_notification_manager()->push_exporting_finished_notification(file_path, boost::filesystem::path(file_path).parent_path().string(), true);
|
||||
app_config->set("wifi_config_dialog_declined", "0");
|
||||
} else {
|
||||
app_config->set("wifi_config_dialog_declined", "1");
|
||||
}
|
||||
m_wifi_config_dialog_shown = false;
|
||||
}
|
||||
|
||||
} // GUI
|
||||
} //Slic3r
|
||||
|
@ -379,6 +379,8 @@ public:
|
||||
// URL download - PrusaSlicer gets system call to open prusaslicer:// URL which should contain address of download
|
||||
void start_download(std::string url);
|
||||
|
||||
void open_wifi_config_dialog(bool forced, const wxString& drive_path = {});
|
||||
bool get_wifi_config_dialog_shown() const { return m_wifi_config_dialog_shown; }
|
||||
private:
|
||||
bool on_init_inner();
|
||||
void init_app_config();
|
||||
@ -400,8 +402,9 @@ private:
|
||||
// inititate read of version file online in separate thread
|
||||
void app_version_check(bool from_user);
|
||||
|
||||
bool m_datadir_redefined { false };
|
||||
|
||||
bool m_datadir_redefined { false };
|
||||
bool m_wifi_config_dialog_shown { false };
|
||||
bool m_wifi_config_dialog_was_declined { false };
|
||||
};
|
||||
|
||||
DECLARE_APP(GUI_App)
|
||||
|
@ -128,6 +128,8 @@ enum class NotificationType
|
||||
URLDownload,
|
||||
// MacOS specific - PS comes forward even when downloader is not allowed
|
||||
URLNotRegistered,
|
||||
// Config file was detected during startup, open wifi config dialog via hypertext
|
||||
WifiConfigFileDetected
|
||||
};
|
||||
|
||||
class NotificationManager
|
||||
|
@ -2284,6 +2284,25 @@ Plater::priv::priv(Plater *q, MainFrame *main_frame)
|
||||
// Close notification ExportingFinished but only if last export was to removable
|
||||
notification_manager->device_ejected();
|
||||
});
|
||||
|
||||
this->q->Bind(EVT_REMOVABLE_DRIVE_ADDED, [this](wxCommandEvent& evt) {
|
||||
if (!fs::exists(fs::path(evt.GetString().utf8_string()) / "prusa_printer_settings.ini"))
|
||||
return;
|
||||
if (evt.GetInt() == 0) { // not at startup, show dialog
|
||||
wxGetApp().open_wifi_config_dialog(false, evt.GetString());
|
||||
} else { // at startup, show only notification
|
||||
notification_manager->push_notification(NotificationType::WifiConfigFileDetected
|
||||
, NotificationManager::NotificationLevel::ImportantNotificationLevel
|
||||
// TRN Text of notification when Slicer starts and usb stick with printer settings ini file is present
|
||||
, _u8L("Printer configuration file detected on removable media.")
|
||||
// TRN Text of hypertext of notification when Slicer starts and usb stick with printer settings ini file is present
|
||||
, _u8L("Write Wi-Fi credetials."), [evt/*, CONFIG_FILE_NAME*/](wxEvtHandler* evt_hndlr){
|
||||
wxGetApp().open_wifi_config_dialog(true, evt.GetString());
|
||||
return true;});
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
// Start the background thread and register this window as a target for update events.
|
||||
wxGetApp().removable_drive_manager()->init(this->q);
|
||||
#ifdef _WIN32
|
||||
|
@ -44,6 +44,8 @@ namespace GUI {
|
||||
|
||||
wxDEFINE_EVENT(EVT_REMOVABLE_DRIVE_EJECTED, RemovableDriveEjectEvent);
|
||||
wxDEFINE_EVENT(EVT_REMOVABLE_DRIVES_CHANGED, RemovableDrivesChangedEvent);
|
||||
wxDEFINE_EVENT(EVT_REMOVABLE_DRIVE_ADDED, wxCommandEvent);
|
||||
|
||||
|
||||
#if _WIN32
|
||||
std::vector<DriveData> RemovableDriveManager::search_for_removable_drives() const
|
||||
@ -1036,11 +1038,28 @@ void RemovableDriveManager::update()
|
||||
std::scoped_lock<std::mutex> lock(m_drives_mutex);
|
||||
std::sort(current_drives.begin(), current_drives.end());
|
||||
if (current_drives != m_current_drives) {
|
||||
// event for writing / ejecting functions
|
||||
assert(m_callback_evt_handler);
|
||||
if (m_callback_evt_handler)
|
||||
wxPostEvent(m_callback_evt_handler, RemovableDrivesChangedEvent(EVT_REMOVABLE_DRIVES_CHANGED));
|
||||
|
||||
// event for printer config file
|
||||
std::vector<DriveData> new_drives;
|
||||
std::set_difference(current_drives.begin(), current_drives.end(), m_current_drives.begin(), m_current_drives.end(),
|
||||
std::inserter(new_drives, new_drives.begin()));
|
||||
|
||||
for (const DriveData& data : new_drives) {
|
||||
if (data.path.empty())
|
||||
continue;
|
||||
wxCommandEvent* evt = new wxCommandEvent(EVT_REMOVABLE_DRIVE_ADDED);
|
||||
evt->SetString(boost::nowide::widen(data.path));
|
||||
evt->SetInt((int)m_first_update);
|
||||
m_callback_evt_handler->QueueEvent(evt);
|
||||
}
|
||||
|
||||
}
|
||||
m_current_drives = std::move(current_drives);
|
||||
m_first_update = false;
|
||||
} else {
|
||||
// Acquiring the m_iniside_update lock failed, therefore another update is running.
|
||||
// Just block until the other instance of update() finishes.
|
||||
|
@ -42,6 +42,8 @@ wxDECLARE_EVENT(EVT_REMOVABLE_DRIVE_EJECTED, RemovableDriveEjectEvent);
|
||||
using RemovableDrivesChangedEvent = SimpleEvent;
|
||||
wxDECLARE_EVENT(EVT_REMOVABLE_DRIVES_CHANGED, RemovableDrivesChangedEvent);
|
||||
|
||||
wxDECLARE_EVENT(EVT_REMOVABLE_DRIVE_ADDED, wxCommandEvent);
|
||||
|
||||
#if __APPLE__
|
||||
// Callbacks on device plug / unplug work reliably on OSX.
|
||||
#define REMOVABLE_DRIVE_MANAGER_OS_CALLBACKS
|
||||
@ -98,7 +100,7 @@ private:
|
||||
bool m_initialized { false };
|
||||
wxEvtHandler* m_callback_evt_handler { nullptr };
|
||||
|
||||
|
||||
bool m_first_update{ true };
|
||||
#ifndef REMOVABLE_DRIVE_MANAGER_OS_CALLBACKS
|
||||
// Worker thread, worker thread synchronization and callbacks to the UI thread.
|
||||
void thread_proc();
|
||||
|
@ -10,8 +10,10 @@
|
||||
#include <wx/stattext.h>
|
||||
#include <wx/button.h>
|
||||
#include <boost/nowide/convert.hpp>
|
||||
#include <boost/nowide/fstream.hpp>
|
||||
#include <boost/log/trivial.hpp>
|
||||
#include <boost/filesystem.hpp>
|
||||
#include <boost/property_tree/ini_parser.hpp>
|
||||
|
||||
#include "Widgets/ComboBox.hpp"
|
||||
|
||||
@ -20,15 +22,13 @@ namespace GUI {
|
||||
|
||||
const char* WIFI_CONFIGFILE_NAME = "prusa_printer_settings.ini";
|
||||
|
||||
WifiConfigDialog::WifiConfigDialog(wxWindow* parent, std::string& file_path, RemovableDriveManager* removable_manager)
|
||||
WifiConfigDialog::WifiConfigDialog(wxWindow* parent, std::string& file_path, RemovableDriveManager* removable_manager, const wxString& preffered_drive)
|
||||
// TRN: This is the dialog title.
|
||||
: DPIDialog(parent, wxID_ANY, _L("Wi-Fi Configuration File Generator"), wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER)
|
||||
, m_wifi_scanner(new WifiScanner())
|
||||
, out_file_path(file_path)
|
||||
, m_removable_manager(removable_manager)
|
||||
{
|
||||
const int em = GUI::wxGetApp().em_unit();
|
||||
|
||||
wxPanel* panel = new wxPanel(this);
|
||||
wxBoxSizer* vsizer = new wxBoxSizer(wxVERTICAL);
|
||||
panel->SetSizer(vsizer);
|
||||
@ -50,8 +50,9 @@ WifiConfigDialog::WifiConfigDialog(wxWindow* parent, std::string& file_path, Rem
|
||||
m_ssid_combo->SetToolTip(_L("On some versions of MacOS, this only loads SSID of connected network."));
|
||||
#endif // __APPLE__
|
||||
rescan_networks(false);
|
||||
m_ssid_button_id = NewControlId();
|
||||
// TRN Text of button to rescan visible networks in Wifi Config dialog.
|
||||
wxButton* ssid_button = new wxButton(panel, wxID_ANY, _(L("Rescan")));
|
||||
wxButton* ssid_button = new wxButton(panel, m_ssid_button_id, _(L("Rescan")));
|
||||
ssid_sizer->Add(m_ssid_combo, 1, wxALIGN_CENTER_VERTICAL | wxRIGHT, 10);
|
||||
ssid_sizer->Add(ssid_button, 0);
|
||||
|
||||
@ -61,8 +62,9 @@ WifiConfigDialog::WifiConfigDialog(wxWindow* parent, std::string& file_path, Rem
|
||||
m_pass_textctrl = new ::TextInput(panel, "", "", "", wxDefaultPosition, wxDefaultSize);
|
||||
pass_sizer->Add(m_pass_textctrl, 1, wxALIGN_CENTER_VERTICAL, 10);
|
||||
#if __APPLE__
|
||||
m_pass_button_id = NewControlId();
|
||||
// TRN Text of button to retrieve password from keychain in Wifi Config dialog. Only on Mac.
|
||||
wxButton* pass_button = new wxButton(panel, wxID_ANY, _(L("Retrieve")));
|
||||
wxButton* pass_button = new wxButton(panel, m_pass_button_id, _(L("Retrieve")));
|
||||
pass_sizer->Add(pass_button, 0);
|
||||
pass_button->Bind(wxEVT_BUTTON, &WifiConfigDialog::on_retrieve_password, this);
|
||||
#endif // __APPLE__
|
||||
@ -73,9 +75,10 @@ WifiConfigDialog::WifiConfigDialog(wxWindow* parent, std::string& file_path, Rem
|
||||
// TRN description of Combo Box with path to USB drive.
|
||||
wxStaticText* drive_label = new wxStaticText(panel, wxID_ANY, GUI::format_wxstr("%1%:", _L("Drive")));
|
||||
m_drive_combo = new ::ComboBox(panel, wxID_ANY);
|
||||
rescan_drives();
|
||||
rescan_drives(preffered_drive);
|
||||
m_drive_button_id = NewControlId();
|
||||
// TRN Text of button to rescan connect usb drives in Wifi Config dialog.
|
||||
wxButton* drive_button = new wxButton(panel, wxID_ANY, _(L("Rescan")));
|
||||
wxButton* drive_button = new wxButton(panel, m_drive_button_id, _(L("Rescan")));
|
||||
drive_sizer->Add(m_drive_combo, 1, wxALIGN_CENTER_VERTICAL | wxRIGHT, 10);
|
||||
drive_sizer->Add(drive_button, 0);
|
||||
|
||||
@ -156,18 +159,22 @@ void WifiConfigDialog::on_retrieve_password(wxCommandEvent& e)
|
||||
|
||||
void WifiConfigDialog::on_rescan_drives(wxCommandEvent& e)
|
||||
{
|
||||
rescan_drives();
|
||||
rescan_drives({});
|
||||
}
|
||||
|
||||
void WifiConfigDialog::rescan_drives()
|
||||
void WifiConfigDialog::rescan_drives(const wxString& preffered_drive)
|
||||
{
|
||||
assert(m_drive_combo && m_removable_manager);
|
||||
m_drive_combo->Clear();
|
||||
m_drive_combo->GetTextCtrl()->Clear();
|
||||
std::vector<DriveData> ddata = m_removable_manager->get_drive_list();
|
||||
for (const auto& data : ddata) {
|
||||
m_drive_combo->Append(boost::nowide::widen(data.path));
|
||||
wxString item = boost::nowide::widen(data.path);
|
||||
m_drive_combo->Append(item);
|
||||
if (preffered_drive == item)
|
||||
m_ssid_combo->Select(m_ssid_combo->GetCount() - 1);
|
||||
}
|
||||
if (m_drive_combo->GetCount() > 0) {
|
||||
if (m_drive_combo->GetSelection() == -1 && m_drive_combo->GetCount() > 0) {
|
||||
m_drive_combo->Select(0);
|
||||
}
|
||||
}
|
||||
@ -184,6 +191,7 @@ void WifiConfigDialog::rescan_networks(bool select)
|
||||
std::string current = m_wifi_scanner->get_current_ssid();
|
||||
const auto& map = m_wifi_scanner->get_map();
|
||||
m_ssid_combo->Clear();
|
||||
m_ssid_combo->GetTextCtrl()->Clear();
|
||||
for (const auto pair : map) {
|
||||
m_ssid_combo->Append(pair.first);
|
||||
// select ssid of current network (if connected)
|
||||
@ -225,26 +233,49 @@ void WifiConfigDialog::on_ok(wxCommandEvent& e)
|
||||
return;
|
||||
}
|
||||
|
||||
if (boost::filesystem::exists(file_path))
|
||||
{
|
||||
if (boost::filesystem::exists(file_path)) {
|
||||
wxString msg_text = GUI::format_wxstr("%1% already exists. Do you want to rewrite it?", file_path.string());
|
||||
WarningDialog dialog(m_parent, msg_text, _L("Warning"), wxYES | wxNO);
|
||||
if (dialog.ShowModal() == wxID_NO)
|
||||
{
|
||||
if (dialog.ShowModal() == wxID_NO) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
wxString ssid = m_ssid_combo->GetValue();
|
||||
wxString pass = m_pass_textctrl->GetValue();
|
||||
std::string data = GUI::format(
|
||||
"[wifi]\n"
|
||||
"ssid=%1%\n"
|
||||
"psk=%2%\n"
|
||||
, ssid
|
||||
, pass
|
||||
);
|
||||
|
||||
std::string data;
|
||||
namespace pt = boost::property_tree;
|
||||
pt::ptree tree;
|
||||
// File already exist and we only need to add data to it rather than rewrite it.
|
||||
if (boost::filesystem::exists(file_path)) {
|
||||
|
||||
boost::nowide::ifstream ifs(file_path.string());
|
||||
try {
|
||||
pt::read_ini(ifs, tree);
|
||||
}
|
||||
catch (const boost::property_tree::ini_parser::ini_parser_error& err) {
|
||||
throw Slic3r::RuntimeError(format("Failed loading ini file \"%1%\"\nError: \"%2%\" at line %3%", file_path, err.message(), err.line()).c_str());
|
||||
}
|
||||
|
||||
if (auto sub = tree.get_optional<std::string>("wifi"); sub) {
|
||||
tree.erase("wifi");
|
||||
}
|
||||
}
|
||||
|
||||
pt::ptree subtree;
|
||||
subtree.put("ssid", m_ssid_combo->GetValue().utf8_string());
|
||||
subtree.put("psk", m_pass_textctrl->GetValue().utf8_string());
|
||||
tree.add_child("wifi", subtree);
|
||||
|
||||
data.clear();
|
||||
// manually write ini string (so there is extra line between sections)
|
||||
for (const auto& section : tree) {
|
||||
data += "[" + section.first + "]" + "\n";
|
||||
for (const auto& entry : section.second) {
|
||||
data += entry.first + " = " + entry.second.get_value<std::string>() + "\n";
|
||||
}
|
||||
data += "\n";
|
||||
}
|
||||
|
||||
m_used_path = boost::nowide::widen(file_path.string());
|
||||
FILE* file;
|
||||
file = fopen(file_path.string().c_str(), "w");
|
||||
if (file == NULL) {
|
||||
@ -264,8 +295,7 @@ void WifiConfigDialog::on_dpi_changed(const wxRect& suggested_rect)
|
||||
SetFont(wxGetApp().normal_font());
|
||||
|
||||
const int em = em_unit();
|
||||
|
||||
//msw_buttons_rescale(this, em, { wxID_OK, wxID_CANCEL });
|
||||
msw_buttons_rescale(this, em, { wxID_OK, wxID_CANCEL, m_ssid_button_id, m_pass_button_id, m_drive_button_id });
|
||||
|
||||
Fit();
|
||||
Refresh();
|
||||
|
@ -20,28 +20,35 @@ class RemovableDriveManager;
|
||||
class WifiConfigDialog : public DPIDialog
|
||||
{
|
||||
public:
|
||||
WifiConfigDialog(wxWindow* parent, std::string& file_path, RemovableDriveManager* removable_manager);
|
||||
~WifiConfigDialog();
|
||||
private:
|
||||
::ComboBox* m_ssid_combo {nullptr};
|
||||
::TextInput* m_pass_textctrl {nullptr};
|
||||
::ComboBox* m_drive_combo {nullptr};
|
||||
WifiConfigDialog(wxWindow* parent, std::string& file_path, RemovableDriveManager* removable_manager, const wxString& preffered_drive );
|
||||
~WifiConfigDialog();
|
||||
wxString get_used_path() const { return m_used_path; }
|
||||
|
||||
void on_ok(wxCommandEvent& e);
|
||||
void on_combo(wxCommandEvent& e);
|
||||
void on_rescan_drives(wxCommandEvent& e);
|
||||
void on_rescan_networks(wxCommandEvent& e);
|
||||
void on_retrieve_password(wxCommandEvent& e);
|
||||
void rescan_drives();
|
||||
void rescan_networks(bool select);
|
||||
void fill_password();
|
||||
private:
|
||||
::ComboBox* m_ssid_combo {nullptr};
|
||||
::TextInput* m_pass_textctrl {nullptr};
|
||||
::ComboBox* m_drive_combo {nullptr};
|
||||
// reference to string that is filled after ShowModal is called from owner
|
||||
std::string& out_file_path;
|
||||
WifiScanner* m_wifi_scanner;
|
||||
RemovableDriveManager* m_removable_manager;
|
||||
std::string& out_file_path;
|
||||
WifiScanner* m_wifi_scanner;
|
||||
RemovableDriveManager* m_removable_manager;
|
||||
wxString m_used_path;
|
||||
int m_ssid_button_id {wxID_ANY};
|
||||
int m_pass_button_id {wxID_ANY};
|
||||
int m_drive_button_id {wxID_ANY};
|
||||
|
||||
void on_ok(wxCommandEvent& e);
|
||||
void on_combo(wxCommandEvent& e);
|
||||
void on_rescan_drives(wxCommandEvent& e);
|
||||
void on_rescan_networks(wxCommandEvent& e);
|
||||
void on_retrieve_password(wxCommandEvent& e);
|
||||
void rescan_drives(const wxString& preffered_drive);
|
||||
void rescan_networks(bool select);
|
||||
void fill_password();
|
||||
|
||||
protected:
|
||||
void on_dpi_changed(const wxRect& suggested_rect) override;
|
||||
void on_sys_color_changed() override {}
|
||||
void on_dpi_changed(const wxRect& suggested_rect) override;
|
||||
void on_sys_color_changed() override {}
|
||||
};
|
||||
|
||||
}} // Slicer::GUI
|
||||
|
Loading…
x
Reference in New Issue
Block a user