Wifi config dialog changes.

Usb drive insertion triggers wifi config dialog.
Ini file is not rewritten, rather information is added.
This commit is contained in:
David Kocik 2023-10-25 11:53:52 +02:00
parent 06aa0fb3f9
commit 9974e4e33f
8 changed files with 114 additions and 24 deletions

View File

@ -2611,12 +2611,15 @@ void GUI_App::add_config_menu(wxMenuBar *menu)
break; break;
case ConfigMenuWifiConfigFile: case ConfigMenuWifiConfigFile:
{ {
open_wifi_config_dialog();
/*
std::string file_path; std::string file_path;
WifiConfigDialog dialog(mainframe, file_path, removable_drive_manager()); WifiConfigDialog dialog(mainframe, file_path, removable_drive_manager());
if (dialog.ShowModal() == wxID_OK) if (dialog.ShowModal() == wxID_OK)
{ {
plater_->get_notification_manager()->push_exporting_finished_notification(file_path, boost::filesystem::path(file_path).parent_path().string(), true); plater_->get_notification_manager()->push_exporting_finished_notification(file_path, boost::filesystem::path(file_path).parent_path().string(), true);
} }
*/
} }
break; break;
default: default:
@ -3571,5 +3574,19 @@ void GUI_App::start_download(std::string url)
m_downloader->start_download(url); m_downloader->start_download(url);
} }
void GUI_App::open_wifi_config_dialog(const wxString& drive_path/* = {}*/)
{
if(m_wifi_config_dialog_shown)
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);
}
m_wifi_config_dialog_shown = false;
}
} // GUI } // GUI
} //Slic3r } //Slic3r

View File

@ -379,6 +379,8 @@ public:
// URL download - PrusaSlicer gets system call to open prusaslicer:// URL which should contain address of download // URL download - PrusaSlicer gets system call to open prusaslicer:// URL which should contain address of download
void start_download(std::string url); void start_download(std::string url);
void open_wifi_config_dialog(const wxString& drive_path = {});
bool get_wifi_config_dialog_shown() const { return m_wifi_config_dialog_shown; }
private: private:
bool on_init_inner(); bool on_init_inner();
void init_app_config(); void init_app_config();
@ -401,7 +403,7 @@ private:
void app_version_check(bool from_user); void app_version_check(bool from_user);
bool m_datadir_redefined { false }; bool m_datadir_redefined { false };
bool m_wifi_config_dialog_shown { false };
}; };
DECLARE_APP(GUI_App) DECLARE_APP(GUI_App)

View File

@ -128,6 +128,8 @@ enum class NotificationType
URLDownload, URLDownload,
// MacOS specific - PS comes forward even when downloader is not allowed // MacOS specific - PS comes forward even when downloader is not allowed
URLNotRegistered, URLNotRegistered,
// Config file was detected during startup, open wifi config dialog via hypertext
WifiConfigFileDetected
}; };
class NotificationManager class NotificationManager

View File

@ -2284,6 +2284,26 @@ Plater::priv::priv(Plater *q, MainFrame *main_frame)
// Close notification ExportingFinished but only if last export was to removable // Close notification ExportingFinished but only if last export was to removable
notification_manager->device_ejected(); notification_manager->device_ejected();
}); });
this->q->Bind(EVT_REMOVABLE_DRIVE_ADDED, [this](wxCommandEvent& evt) {
const std::string CONFIG_FILE_NAME = "prusa_printer_settings.ini";
if (evt.GetInt() == 0) { // not at startup, show dialog
if (fs::exists(fs::path(evt.GetString().utf8_string()) / CONFIG_FILE_NAME))
wxGetApp().open_wifi_config_dialog(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){
if (fs::exists(fs::path(evt.GetString().utf8_string()) / CONFIG_FILE_NAME))
wxGetApp().open_wifi_config_dialog(evt.GetString());
return true;});
}
});
// Start the background thread and register this window as a target for update events. // Start the background thread and register this window as a target for update events.
wxGetApp().removable_drive_manager()->init(this->q); wxGetApp().removable_drive_manager()->init(this->q);
#ifdef _WIN32 #ifdef _WIN32

View File

@ -44,6 +44,8 @@ namespace GUI {
wxDEFINE_EVENT(EVT_REMOVABLE_DRIVE_EJECTED, RemovableDriveEjectEvent); wxDEFINE_EVENT(EVT_REMOVABLE_DRIVE_EJECTED, RemovableDriveEjectEvent);
wxDEFINE_EVENT(EVT_REMOVABLE_DRIVES_CHANGED, RemovableDrivesChangedEvent); wxDEFINE_EVENT(EVT_REMOVABLE_DRIVES_CHANGED, RemovableDrivesChangedEvent);
wxDEFINE_EVENT(EVT_REMOVABLE_DRIVE_ADDED, wxCommandEvent);
#if _WIN32 #if _WIN32
std::vector<DriveData> RemovableDriveManager::search_for_removable_drives() const 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::scoped_lock<std::mutex> lock(m_drives_mutex);
std::sort(current_drives.begin(), current_drives.end()); std::sort(current_drives.begin(), current_drives.end());
if (current_drives != m_current_drives) { if (current_drives != m_current_drives) {
// event for writing / ejecting functions
assert(m_callback_evt_handler); assert(m_callback_evt_handler);
if (m_callback_evt_handler) if (m_callback_evt_handler)
wxPostEvent(m_callback_evt_handler, RemovableDrivesChangedEvent(EVT_REMOVABLE_DRIVES_CHANGED)); 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_current_drives = std::move(current_drives);
m_first_update = false;
} else { } else {
// Acquiring the m_iniside_update lock failed, therefore another update is running. // Acquiring the m_iniside_update lock failed, therefore another update is running.
// Just block until the other instance of update() finishes. // Just block until the other instance of update() finishes.

View File

@ -42,6 +42,8 @@ wxDECLARE_EVENT(EVT_REMOVABLE_DRIVE_EJECTED, RemovableDriveEjectEvent);
using RemovableDrivesChangedEvent = SimpleEvent; using RemovableDrivesChangedEvent = SimpleEvent;
wxDECLARE_EVENT(EVT_REMOVABLE_DRIVES_CHANGED, RemovableDrivesChangedEvent); wxDECLARE_EVENT(EVT_REMOVABLE_DRIVES_CHANGED, RemovableDrivesChangedEvent);
wxDECLARE_EVENT(EVT_REMOVABLE_DRIVE_ADDED, wxCommandEvent);
#if __APPLE__ #if __APPLE__
// Callbacks on device plug / unplug work reliably on OSX. // Callbacks on device plug / unplug work reliably on OSX.
#define REMOVABLE_DRIVE_MANAGER_OS_CALLBACKS #define REMOVABLE_DRIVE_MANAGER_OS_CALLBACKS
@ -98,7 +100,7 @@ private:
bool m_initialized { false }; bool m_initialized { false };
wxEvtHandler* m_callback_evt_handler { nullptr }; wxEvtHandler* m_callback_evt_handler { nullptr };
bool m_first_update{ true };
#ifndef REMOVABLE_DRIVE_MANAGER_OS_CALLBACKS #ifndef REMOVABLE_DRIVE_MANAGER_OS_CALLBACKS
// Worker thread, worker thread synchronization and callbacks to the UI thread. // Worker thread, worker thread synchronization and callbacks to the UI thread.
void thread_proc(); void thread_proc();

View File

@ -10,8 +10,10 @@
#include <wx/stattext.h> #include <wx/stattext.h>
#include <wx/button.h> #include <wx/button.h>
#include <boost/nowide/convert.hpp> #include <boost/nowide/convert.hpp>
#include <boost/nowide/fstream.hpp>
#include <boost/log/trivial.hpp> #include <boost/log/trivial.hpp>
#include <boost/filesystem.hpp> #include <boost/filesystem.hpp>
#include <boost/property_tree/ini_parser.hpp>
#include "Widgets/ComboBox.hpp" #include "Widgets/ComboBox.hpp"
@ -20,15 +22,13 @@ namespace GUI {
const char* WIFI_CONFIGFILE_NAME = "prusa_printer_settings.ini"; 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. // TRN: This is the dialog title.
: DPIDialog(parent, wxID_ANY, _L("Wi-Fi Configuration File Generator"), wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER) : DPIDialog(parent, wxID_ANY, _L("Wi-Fi Configuration File Generator"), wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER)
, m_wifi_scanner(new WifiScanner()) , m_wifi_scanner(new WifiScanner())
, out_file_path(file_path) , out_file_path(file_path)
, m_removable_manager(removable_manager) , m_removable_manager(removable_manager)
{ {
const int em = GUI::wxGetApp().em_unit();
wxPanel* panel = new wxPanel(this); wxPanel* panel = new wxPanel(this);
wxBoxSizer* vsizer = new wxBoxSizer(wxVERTICAL); wxBoxSizer* vsizer = new wxBoxSizer(wxVERTICAL);
panel->SetSizer(vsizer); panel->SetSizer(vsizer);
@ -73,7 +73,7 @@ WifiConfigDialog::WifiConfigDialog(wxWindow* parent, std::string& file_path, Rem
// TRN description of Combo Box with path to USB drive. // TRN description of Combo Box with path to USB drive.
wxStaticText* drive_label = new wxStaticText(panel, wxID_ANY, GUI::format_wxstr("%1%:", _L("Drive"))); wxStaticText* drive_label = new wxStaticText(panel, wxID_ANY, GUI::format_wxstr("%1%:", _L("Drive")));
m_drive_combo = new ::ComboBox(panel, wxID_ANY); m_drive_combo = new ::ComboBox(panel, wxID_ANY);
rescan_drives(); rescan_drives(preffered_drive);
// TRN Text of button to rescan connect usb drives in Wifi Config dialog. // 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, wxID_ANY, _(L("Rescan")));
drive_sizer->Add(m_drive_combo, 1, wxALIGN_CENTER_VERTICAL | wxRIGHT, 10); drive_sizer->Add(m_drive_combo, 1, wxALIGN_CENTER_VERTICAL | wxRIGHT, 10);
@ -156,18 +156,21 @@ void WifiConfigDialog::on_retrieve_password(wxCommandEvent& e)
void WifiConfigDialog::on_rescan_drives(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); assert(m_drive_combo && m_removable_manager);
m_drive_combo->Clear(); m_drive_combo->Clear();
std::vector<DriveData> ddata = m_removable_manager->get_drive_list(); std::vector<DriveData> ddata = m_removable_manager->get_drive_list();
for (const auto& data : ddata) { 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); m_drive_combo->Select(0);
} }
} }
@ -225,6 +228,7 @@ void WifiConfigDialog::on_ok(wxCommandEvent& e)
return; return;
} }
#if 0 // older variant of rewriting previous ini file
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()); wxString msg_text = GUI::format_wxstr("%1% already exists. Do you want to rewrite it?", file_path.string());
@ -234,16 +238,41 @@ void WifiConfigDialog::on_ok(wxCommandEvent& e)
return; return;
} }
} }
#endif
wxString ssid = m_ssid_combo->GetValue();
wxString pass = m_pass_textctrl->GetValue(); std::string data;
std::string data = GUI::format( namespace pt = boost::property_tree;
"[wifi]\n" pt::ptree tree;
"ssid=%1%\n" // File already exist and we only need to add data to it rather than rewrite it.
"psk=%2%\n" if (boost::filesystem::exists(file_path)) {
, ssid
, pass 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";
}
FILE* file; FILE* file;
file = fopen(file_path.string().c_str(), "w"); file = fopen(file_path.string().c_str(), "w");
@ -263,8 +292,7 @@ void WifiConfigDialog::on_dpi_changed(const wxRect& suggested_rect)
{ {
SetFont(wxGetApp().normal_font()); SetFont(wxGetApp().normal_font());
const int em = em_unit(); //const int em = em_unit();
//msw_buttons_rescale(this, em, { wxID_OK, wxID_CANCEL }); //msw_buttons_rescale(this, em, { wxID_OK, wxID_CANCEL });
Fit(); Fit();

View File

@ -20,7 +20,7 @@ class RemovableDriveManager;
class WifiConfigDialog : public DPIDialog class WifiConfigDialog : public DPIDialog
{ {
public: public:
WifiConfigDialog(wxWindow* parent, std::string& file_path, RemovableDriveManager* removable_manager); WifiConfigDialog(wxWindow* parent, std::string& file_path, RemovableDriveManager* removable_manager, const wxString& preffered_drive );
~WifiConfigDialog(); ~WifiConfigDialog();
private: private:
::ComboBox* m_ssid_combo {nullptr}; ::ComboBox* m_ssid_combo {nullptr};
@ -32,7 +32,7 @@ private:
void on_rescan_drives(wxCommandEvent& e); void on_rescan_drives(wxCommandEvent& e);
void on_rescan_networks(wxCommandEvent& e); void on_rescan_networks(wxCommandEvent& e);
void on_retrieve_password(wxCommandEvent& e); void on_retrieve_password(wxCommandEvent& e);
void rescan_drives(); void rescan_drives(const wxString& preffered_drive);
void rescan_networks(bool select); void rescan_networks(bool select);
void fill_password(); void fill_password();
// reference to string that is filled after ShowModal is called from owner // reference to string that is filled after ShowModal is called from owner