mirror of
https://github.com/OrcaSlicer/OrcaSlicer.git
synced 2026-09-28 19:31:22 +00:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
54ed1cbade | ||
|
|
d4a611147c | ||
|
|
d6d19795b2 | ||
|
|
570b94ec49 | ||
|
|
f99cf7ca3f | ||
|
|
4964f49765 | ||
|
|
ea471dc82d | ||
|
|
bd65cce3f4 |
@@ -285,6 +285,21 @@ inline std::string sanitize_filename(const std::string &filename){
|
|||||||
const std::regex special_chars("[/\\\\:*?\"<>|]");
|
const std::regex special_chars("[/\\\\:*?\"<>|]");
|
||||||
return std::regex_replace(filename, special_chars, "_");
|
return std::regex_replace(filename, special_chars, "_");
|
||||||
}
|
}
|
||||||
|
// Reduce an untrusted, possibly path-qualified name to a single sanitized file name.
|
||||||
|
// Returns an empty string when nothing usable remains.
|
||||||
|
inline std::string sanitize_file_basename(const std::string &name){
|
||||||
|
const size_t sep = name.find_last_of("/\\");
|
||||||
|
const std::string base = sanitize_filename(sep == std::string::npos ? name : name.substr(sep + 1));
|
||||||
|
// Names made only of dots and spaces refer to the folder or its parent, or are stripped to nothing on Windows.
|
||||||
|
return base.find_first_not_of(". ") == std::string::npos ? std::string() : base;
|
||||||
|
}
|
||||||
|
// Marker file a download of this process writes to before it is renamed to filename.
|
||||||
|
boost::filesystem::path download_marker_path(const boost::filesystem::path &dest_folder, const std::string &filename);
|
||||||
|
// Finds a sanitized variant of filename, "name(N).ext" if needed, that neither an entry of dest_folder
|
||||||
|
// nor the download marker of another download uses. The marker at ignored_marker does not count.
|
||||||
|
// Returns true and the name in result, or false and the last name tried.
|
||||||
|
bool find_unused_filename(const boost::filesystem::path &dest_folder, const std::string &filename,
|
||||||
|
const boost::filesystem::path &ignored_marker, std::string &result);
|
||||||
// File path / name / extension splitting utilities, working with UTF-8,
|
// File path / name / extension splitting utilities, working with UTF-8,
|
||||||
// to be published to Perl.
|
// to be published to Perl.
|
||||||
namespace PerlUtils {
|
namespace PerlUtils {
|
||||||
|
|||||||
@@ -1321,6 +1321,31 @@ unsigned get_current_pid()
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
boost::filesystem::path download_marker_path(const boost::filesystem::path &dest_folder, const std::string &filename)
|
||||||
|
{
|
||||||
|
return dest_folder / (filename + "." + std::to_string(get_current_pid()) + ".download");
|
||||||
|
}
|
||||||
|
|
||||||
|
bool find_unused_filename(const boost::filesystem::path &dest_folder, const std::string &filename,
|
||||||
|
const boost::filesystem::path &ignored_marker, std::string &result)
|
||||||
|
{
|
||||||
|
// Probe the name that will be written, so a name the sanitizing maps onto an existing file is versioned too.
|
||||||
|
const std::string sanitized = sanitize_filename(filename);
|
||||||
|
const std::string extension = boost::filesystem::path(sanitized).extension().string();
|
||||||
|
const std::string stem = sanitized.substr(0, sanitized.size() - extension.size());
|
||||||
|
auto is_used = [&](const std::string &name) {
|
||||||
|
const boost::filesystem::path marker = download_marker_path(dest_folder, name);
|
||||||
|
return boost::filesystem::exists(dest_folder / name) || (marker != ignored_marker && boost::filesystem::exists(marker));
|
||||||
|
};
|
||||||
|
result = sanitized;
|
||||||
|
for (size_t version = 1; is_used(result); ++version) {
|
||||||
|
if (version > 999)
|
||||||
|
return false;
|
||||||
|
result = stem + "(" + std::to_string(version) + ")" + extension;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
std::string per_user_temp_id()
|
std::string per_user_temp_id()
|
||||||
{
|
{
|
||||||
#ifdef WIN32
|
#ifdef WIN32
|
||||||
|
|||||||
@@ -819,7 +819,7 @@ AmsMapingPopup::AmsMapingPopup(wxWindow *parent, bool use_in_sync_dialog) :
|
|||||||
|
|
||||||
m_scrolled_window = new wxScrolledWindow(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxVSCROLL | wxHSCROLL);
|
m_scrolled_window = new wxScrolledWindow(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxVSCROLL | wxHSCROLL);
|
||||||
m_scrolled_window->SetBackgroundColour(*wxWHITE);
|
m_scrolled_window->SetBackgroundColour(*wxWHITE);
|
||||||
m_scrolled_window->SetScrollRate(0, FromDIP(10));
|
m_scrolled_window->SetScrollRate(0, FromDIP(20));
|
||||||
|
|
||||||
wxBoxSizer *title_sizer_h= new wxBoxSizer(wxHORIZONTAL);
|
wxBoxSizer *title_sizer_h= new wxBoxSizer(wxHORIZONTAL);
|
||||||
wxBoxSizer *title_sizer_v = new wxBoxSizer(wxVERTICAL);
|
wxBoxSizer *title_sizer_v = new wxBoxSizer(wxVERTICAL);
|
||||||
@@ -1000,13 +1000,13 @@ AmsMapingPopup::AmsMapingPopup(wxWindow *parent, bool use_in_sync_dialog) :
|
|||||||
show_pos.x = screen_size.GetLeft();
|
show_pos.x = screen_size.GetLeft();
|
||||||
m_scrolled_window->SetMaxSize(wxSize(screen_size.GetWidth(), popup_height));
|
m_scrolled_window->SetMaxSize(wxSize(screen_size.GetWidth(), popup_height));
|
||||||
m_scrolled_window->SetMinSize(wxSize(screen_size.GetWidth(), popup_height));
|
m_scrolled_window->SetMinSize(wxSize(screen_size.GetWidth(), popup_height));
|
||||||
m_scrolled_window->SetScrollRate(FromDIP(10), FromDIP(10));
|
m_scrolled_window->SetScrollRate(FromDIP(10), FromDIP(20));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
m_scrolled_window->SetMaxSize(wxSize(popup_width, popup_height));
|
m_scrolled_window->SetMaxSize(wxSize(popup_width, popup_height));
|
||||||
m_scrolled_window->SetMinSize(wxSize(popup_width, popup_height));
|
m_scrolled_window->SetMinSize(wxSize(popup_width, popup_height));
|
||||||
m_scrolled_window->SetScrollRate(0, FromDIP(10));
|
m_scrolled_window->SetScrollRate(0, FromDIP(20));
|
||||||
}
|
}
|
||||||
|
|
||||||
//Vertical Direction Processing
|
//Vertical Direction Processing
|
||||||
@@ -2117,7 +2117,7 @@ void AmsReplaceMaterialDialog::create()
|
|||||||
identical_filament->SetForegroundColour(StateColor::darkModeColorFor(wxColour("#009688"))); // Orca: accent teal (not brand green)
|
identical_filament->SetForegroundColour(StateColor::darkModeColorFor(wxColour("#009688"))); // Orca: accent teal (not brand green)
|
||||||
|
|
||||||
m_scrollview_groups = new wxScrolledWindow(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxHSCROLL | wxVSCROLL);
|
m_scrollview_groups = new wxScrolledWindow(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxHSCROLL | wxVSCROLL);
|
||||||
m_scrollview_groups->SetScrollRate(5, 5);
|
m_scrollview_groups->SetScrollRate(5, FromDIP(20));
|
||||||
//m_scrollview_groups->SetMinSize(wxSize(400, 400));
|
//m_scrollview_groups->SetMinSize(wxSize(400, 400));
|
||||||
//m_scrollview_groups->SetMaxSize(wxSize(400, 400));
|
//m_scrollview_groups->SetMaxSize(wxSize(400, 400));
|
||||||
m_scrollview_sizer = new wxBoxSizer(wxVERTICAL);
|
m_scrollview_sizer = new wxBoxSizer(wxVERTICAL);
|
||||||
|
|||||||
@@ -606,7 +606,7 @@ AuFolderPanel::AuFolderPanel(wxWindow *parent, AuxiliaryFolderType type, wxWindo
|
|||||||
wxBoxSizer *sizer_main = new wxBoxSizer(wxVERTICAL);
|
wxBoxSizer *sizer_main = new wxBoxSizer(wxVERTICAL);
|
||||||
|
|
||||||
m_scrolledWindow = new wxScrolledWindow(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxHSCROLL | wxVSCROLL);
|
m_scrolledWindow = new wxScrolledWindow(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxHSCROLL | wxVSCROLL);
|
||||||
m_scrolledWindow->SetScrollRate(5, 5);
|
m_scrolledWindow->SetScrollRate(5, FromDIP(20));
|
||||||
wxBoxSizer *sizer_body = new wxBoxSizer(wxVERTICAL);
|
wxBoxSizer *sizer_body = new wxBoxSizer(wxVERTICAL);
|
||||||
wxBoxSizer *sizer_top = new wxBoxSizer(wxHORIZONTAL);
|
wxBoxSizer *sizer_top = new wxBoxSizer(wxHORIZONTAL);
|
||||||
|
|
||||||
|
|||||||
@@ -558,7 +558,7 @@ PingCodeBindDialog::~PingCodeBindDialog() {
|
|||||||
//show bind failed info
|
//show bind failed info
|
||||||
m_sw_bind_failed_info = new wxScrolledWindow(this, wxID_ANY, wxDefaultPosition, wxSize(FromDIP(450), FromDIP(300)), wxVSCROLL);
|
m_sw_bind_failed_info = new wxScrolledWindow(this, wxID_ANY, wxDefaultPosition, wxSize(FromDIP(450), FromDIP(300)), wxVSCROLL);
|
||||||
m_sw_bind_failed_info->SetBackgroundColour(*wxWHITE);
|
m_sw_bind_failed_info->SetBackgroundColour(*wxWHITE);
|
||||||
m_sw_bind_failed_info->SetScrollRate(5, 5);
|
m_sw_bind_failed_info->SetScrollRate(5, FromDIP(20));
|
||||||
m_sw_bind_failed_info->SetMinSize(wxSize(FromDIP(450), FromDIP(90)));
|
m_sw_bind_failed_info->SetMinSize(wxSize(FromDIP(450), FromDIP(90)));
|
||||||
m_sw_bind_failed_info->SetMaxSize(wxSize(FromDIP(450), FromDIP(90)));
|
m_sw_bind_failed_info->SetMaxSize(wxSize(FromDIP(450), FromDIP(90)));
|
||||||
|
|
||||||
|
|||||||
@@ -3521,7 +3521,7 @@ DesignPanel::DesignPanel(wxWindow* parent)
|
|||||||
cards->Show(m_box_mate, false, true);
|
cards->Show(m_box_mate, false, true);
|
||||||
|
|
||||||
m_form->FitInside();
|
m_form->FitInside();
|
||||||
m_form->SetScrollRate(0, 10); // vertical only, like Prepare's sidebar: never scroll labels out
|
m_form->SetScrollRate(0, FromDIP(20)); // vertical only, like Prepare's sidebar: never scroll labels out
|
||||||
m_form->SetMinSize(wxSize(264, -1));
|
m_form->SetMinSize(wxSize(264, -1));
|
||||||
|
|
||||||
// Right column: a small view toolbar over the live 3D viewport that mirrors
|
// Right column: a small view toolbar over the live 3D viewport that mirrors
|
||||||
|
|||||||
@@ -115,7 +115,7 @@ HistoryWindow::HistoryWindow(wxWindow* parent, const std::vector<PACalibResult>&
|
|||||||
auto main_sizer = new wxBoxSizer(wxVERTICAL);
|
auto main_sizer = new wxBoxSizer(wxVERTICAL);
|
||||||
|
|
||||||
auto scroll_window = new wxScrolledWindow(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxHSCROLL | wxVSCROLL);
|
auto scroll_window = new wxScrolledWindow(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxHSCROLL | wxVSCROLL);
|
||||||
scroll_window->SetScrollRate(5, 5);
|
scroll_window->SetScrollRate(5, FromDIP(20));
|
||||||
scroll_window->SetBackgroundColour(*wxWHITE);
|
scroll_window->SetBackgroundColour(*wxWHITE);
|
||||||
scroll_window->SetMinSize(HISTORY_WINDOW_SIZE);
|
scroll_window->SetMinSize(HISTORY_WINDOW_SIZE);
|
||||||
scroll_window->SetSize(HISTORY_WINDOW_SIZE);
|
scroll_window->SetSize(HISTORY_WINDOW_SIZE);
|
||||||
|
|||||||
@@ -207,7 +207,7 @@ SelectMObjectPopup::SelectMObjectPopup(wxWindow* parent)
|
|||||||
m_scrolledWindow = new wxScrolledWindow(this, wxID_ANY, wxDefaultPosition, SELECT_MACHINE_LIST_SIZE, wxHSCROLL | wxVSCROLL);
|
m_scrolledWindow = new wxScrolledWindow(this, wxID_ANY, wxDefaultPosition, SELECT_MACHINE_LIST_SIZE, wxHSCROLL | wxVSCROLL);
|
||||||
m_scrolledWindow->SetBackgroundColour(*wxWHITE);
|
m_scrolledWindow->SetBackgroundColour(*wxWHITE);
|
||||||
m_scrolledWindow->SetMinSize(SELECT_MACHINE_LIST_SIZE);
|
m_scrolledWindow->SetMinSize(SELECT_MACHINE_LIST_SIZE);
|
||||||
m_scrolledWindow->SetScrollRate(0, 5);
|
m_scrolledWindow->SetScrollRate(0, SELECT_MACHINE_ITEM_SIZE.y);
|
||||||
auto m_sizxer_scrolledWindow = new wxBoxSizer(wxVERTICAL);
|
auto m_sizxer_scrolledWindow = new wxBoxSizer(wxVERTICAL);
|
||||||
m_scrolledWindow->SetSizer(m_sizxer_scrolledWindow);
|
m_scrolledWindow->SetSizer(m_sizxer_scrolledWindow);
|
||||||
m_scrolledWindow->Layout();
|
m_scrolledWindow->Layout();
|
||||||
|
|||||||
@@ -81,7 +81,7 @@ CalibrationWizard::CalibrationWizard(wxWindow* parent, CalibMode mode, wxWindowI
|
|||||||
wxBoxSizer* main_sizer = new wxBoxSizer(wxVERTICAL);
|
wxBoxSizer* main_sizer = new wxBoxSizer(wxVERTICAL);
|
||||||
|
|
||||||
m_scrolledWindow = new wxScrolledWindow(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxHSCROLL | wxVSCROLL);
|
m_scrolledWindow = new wxScrolledWindow(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxHSCROLL | wxVSCROLL);
|
||||||
m_scrolledWindow->SetScrollRate(5, 5);
|
m_scrolledWindow->SetScrollRate(5, FromDIP(20));
|
||||||
m_scrolledWindow->SetBackgroundColour(*wxWHITE);
|
m_scrolledWindow->SetBackgroundColour(*wxWHITE);
|
||||||
|
|
||||||
wxBoxSizer* padding_sizer = new wxBoxSizer(wxHORIZONTAL);
|
wxBoxSizer* padding_sizer = new wxBoxSizer(wxHORIZONTAL);
|
||||||
|
|||||||
@@ -834,7 +834,7 @@ void CaliPageSendingPanel::create(wxWindow* parent)
|
|||||||
|
|
||||||
m_sw_print_failed_info = new wxScrolledWindow(parent, wxID_ANY, wxDefaultPosition, wxSize(FromDIP(380), FromDIP(125)), wxVSCROLL);
|
m_sw_print_failed_info = new wxScrolledWindow(parent, wxID_ANY, wxDefaultPosition, wxSize(FromDIP(380), FromDIP(125)), wxVSCROLL);
|
||||||
m_sw_print_failed_info->SetBackgroundColour(*wxWHITE);
|
m_sw_print_failed_info->SetBackgroundColour(*wxWHITE);
|
||||||
m_sw_print_failed_info->SetScrollRate(0, 5);
|
m_sw_print_failed_info->SetScrollRate(0, FromDIP(20));
|
||||||
m_sw_print_failed_info->SetMinSize(wxSize(FromDIP(380), FromDIP(125)));
|
m_sw_print_failed_info->SetMinSize(wxSize(FromDIP(380), FromDIP(125)));
|
||||||
m_sw_print_failed_info->SetMaxSize(wxSize(FromDIP(380), FromDIP(125)));
|
m_sw_print_failed_info->SetMaxSize(wxSize(FromDIP(380), FromDIP(125)));
|
||||||
|
|
||||||
|
|||||||
@@ -2710,7 +2710,7 @@ ConfigWizard::ConfigWizard(wxWindow *parent)
|
|||||||
SetSizerAndFit(vsizer);
|
SetSizerAndFit(vsizer);
|
||||||
|
|
||||||
// We can now enable scrolling on hscroll
|
// We can now enable scrolling on hscroll
|
||||||
p->hscroll->SetScrollRate(30, 30);
|
p->hscroll->SetScrollRate(30, FromDIP(20));
|
||||||
|
|
||||||
on_window_geometry(this, [this]() {
|
on_window_geometry(this, [this]() {
|
||||||
p->init_dialog_size();
|
p->init_dialog_size();
|
||||||
|
|||||||
@@ -699,7 +699,7 @@ CreateFilamentPresetDialog::CreateFilamentPresetDialog(wxWindow *parent)
|
|||||||
m_scrolled_preset_panel = new wxScrolledWindow(this, wxID_ANY);
|
m_scrolled_preset_panel = new wxScrolledWindow(this, wxID_ANY);
|
||||||
m_scrolled_preset_panel->SetMaxSize(wxSize(-1, FromDIP(350)));
|
m_scrolled_preset_panel->SetMaxSize(wxSize(-1, FromDIP(350)));
|
||||||
m_scrolled_preset_panel->SetBackgroundColour(*wxWHITE);
|
m_scrolled_preset_panel->SetBackgroundColour(*wxWHITE);
|
||||||
m_scrolled_preset_panel->SetScrollRate(5, 5);
|
m_scrolled_preset_panel->SetScrollRate(5, FromDIP(20));
|
||||||
m_scrolled_sizer = new wxBoxSizer(wxVERTICAL);
|
m_scrolled_sizer = new wxBoxSizer(wxVERTICAL);
|
||||||
m_scrolled_sizer->Add(create_item(FilamentOptionType::PRESET_FOR_PRINTER), 0, wxEXPAND | wxLEFT | wxRIGHT | wxBOTTOM, FromDIP(5));
|
m_scrolled_sizer->Add(create_item(FilamentOptionType::PRESET_FOR_PRINTER), 0, wxEXPAND | wxLEFT | wxRIGHT | wxBOTTOM, FromDIP(5));
|
||||||
m_scrolled_sizer->Add(0, 0, 0, wxTOP, FromDIP(5));
|
m_scrolled_sizer->Add(0, 0, 0, wxTOP, FromDIP(5));
|
||||||
@@ -1593,7 +1593,7 @@ CreatePrinterPresetDialog::CreatePrinterPresetDialog(wxWindow *parent)
|
|||||||
|
|
||||||
m_page1 = new wxScrolledWindow(this, wxID_ANY, wxDefaultPosition, wxDefaultSize);
|
m_page1 = new wxScrolledWindow(this, wxID_ANY, wxDefaultPosition, wxDefaultSize);
|
||||||
m_page1->SetBackgroundColour(*wxWHITE);
|
m_page1->SetBackgroundColour(*wxWHITE);
|
||||||
m_page1->SetScrollRate(5, 5);
|
m_page1->SetScrollRate(5, FromDIP(20));
|
||||||
m_page2 = new wxPanel(this, wxID_ANY, wxDefaultPosition, wxDefaultSize); m_page2->SetBackgroundColour(*wxWHITE);
|
m_page2 = new wxPanel(this, wxID_ANY, wxDefaultPosition, wxDefaultSize); m_page2->SetBackgroundColour(*wxWHITE);
|
||||||
|
|
||||||
create_printer_page1(m_page1);
|
create_printer_page1(m_page1);
|
||||||
@@ -2652,7 +2652,7 @@ wxBoxSizer *CreatePrinterPresetDialog::create_presets_template_item(wxWindow *pa
|
|||||||
wxBoxSizer *vertical_sizer = new wxBoxSizer(wxVERTICAL);
|
wxBoxSizer *vertical_sizer = new wxBoxSizer(wxVERTICAL);
|
||||||
|
|
||||||
m_scrolled_preset_window = new wxScrolledWindow(parent);
|
m_scrolled_preset_window = new wxScrolledWindow(parent);
|
||||||
m_scrolled_preset_window->SetScrollRate(5, 5);
|
m_scrolled_preset_window->SetScrollRate(5, FromDIP(20));
|
||||||
m_scrolled_preset_window->SetBackgroundColour(*wxWHITE);
|
m_scrolled_preset_window->SetBackgroundColour(*wxWHITE);
|
||||||
//m_scrolled_preset_window->SetMinSize(wxSize(FromDIP(1500), FromDIP(-1)));
|
//m_scrolled_preset_window->SetMinSize(wxSize(FromDIP(1500), FromDIP(-1)));
|
||||||
m_scrolled_preset_window->SetMaxSize(wxSize(FromDIP(1500), FromDIP(-1)));
|
m_scrolled_preset_window->SetMaxSize(wxSize(FromDIP(1500), FromDIP(-1)));
|
||||||
@@ -4297,7 +4297,7 @@ wxBoxSizer *ExportConfigsDialog::create_select_printer(wxWindow *parent)
|
|||||||
optionSizer->SetMinSize(OPTION_SIZE);
|
optionSizer->SetMinSize(OPTION_SIZE);
|
||||||
horizontal_sizer->Add(optionSizer, 0, wxEXPAND | wxALL, FromDIP(10));
|
horizontal_sizer->Add(optionSizer, 0, wxEXPAND | wxALL, FromDIP(10));
|
||||||
m_scrolled_preset_window = new wxScrolledWindow(parent);
|
m_scrolled_preset_window = new wxScrolledWindow(parent);
|
||||||
m_scrolled_preset_window->SetScrollRate(5, 5);
|
m_scrolled_preset_window->SetScrollRate(5, FromDIP(20));
|
||||||
m_scrolled_preset_window->SetBackgroundColour(*wxWHITE);
|
m_scrolled_preset_window->SetBackgroundColour(*wxWHITE);
|
||||||
m_scrolled_preset_window->SetMaxSize(wxSize(FromDIP(660), FromDIP(400)));
|
m_scrolled_preset_window->SetMaxSize(wxSize(FromDIP(660), FromDIP(400)));
|
||||||
m_scrolled_preset_window->SetSize(wxSize(FromDIP(660), FromDIP(400)));
|
m_scrolled_preset_window->SetSize(wxSize(FromDIP(660), FromDIP(400)));
|
||||||
@@ -4736,7 +4736,7 @@ wxBoxSizer *EditFilamentPresetDialog::create_preset_tree_sizer()
|
|||||||
{
|
{
|
||||||
wxBoxSizer *filament_preset_tree_sizer = new wxBoxSizer(wxHORIZONTAL);
|
wxBoxSizer *filament_preset_tree_sizer = new wxBoxSizer(wxHORIZONTAL);
|
||||||
m_preset_tree_window = new wxScrolledWindow(this);
|
m_preset_tree_window = new wxScrolledWindow(this);
|
||||||
m_preset_tree_window->SetScrollRate(5, 5);
|
m_preset_tree_window->SetScrollRate(5, FromDIP(20));
|
||||||
m_preset_tree_window->SetBackgroundColour(PRINTER_LIST_COLOUR);
|
m_preset_tree_window->SetBackgroundColour(PRINTER_LIST_COLOUR);
|
||||||
m_preset_tree_window->SetMinSize(wxSize(-1, FromDIP(400)));
|
m_preset_tree_window->SetMinSize(wxSize(-1, FromDIP(400)));
|
||||||
m_preset_tree_window->SetMaxSize(wxSize(-1, FromDIP(300)));
|
m_preset_tree_window->SetMaxSize(wxSize(-1, FromDIP(300)));
|
||||||
|
|||||||
@@ -39,7 +39,7 @@ DeviceErrorDialog::DeviceErrorDialog(MachineObject* obj, wxWindow* parent, wxWin
|
|||||||
m_line_top->SetBackgroundColour(wxColour(166, 169, 170));
|
m_line_top->SetBackgroundColour(wxColour(166, 169, 170));
|
||||||
|
|
||||||
m_scroll_area = new wxScrolledWindow(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxVSCROLL);
|
m_scroll_area = new wxScrolledWindow(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxVSCROLL);
|
||||||
m_scroll_area->SetScrollRate(0, 5);
|
m_scroll_area->SetScrollRate(0, FromDIP(20));
|
||||||
m_scroll_area->SetBackgroundColour(*wxWHITE);
|
m_scroll_area->SetBackgroundColour(*wxWHITE);
|
||||||
m_scroll_area->SetMinSize(wxSize(FromDIP(320), FromDIP(250)));
|
m_scroll_area->SetMinSize(wxSize(FromDIP(320), FromDIP(250)));
|
||||||
|
|
||||||
|
|||||||
@@ -71,17 +71,6 @@ bool FileGet::is_subdomain(const std::string& url, const std::string& domain)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
namespace {
|
|
||||||
unsigned get_current_pid()
|
|
||||||
{
|
|
||||||
#ifdef WIN32
|
|
||||||
return GetCurrentProcessId();
|
|
||||||
#else
|
|
||||||
return ::getpid();
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// int = DOWNLOAD ID; string = file path
|
// int = DOWNLOAD ID; string = file path
|
||||||
wxDEFINE_EVENT(EVT_DWNLDR_FILE_COMPLETE, wxCommandEvent);
|
wxDEFINE_EVENT(EVT_DWNLDR_FILE_COMPLETE, wxCommandEvent);
|
||||||
// int = DOWNLOAD ID; string = error msg
|
// int = DOWNLOAD ID; string = error msg
|
||||||
@@ -144,25 +133,10 @@ void FileGet::priv::get_perform()
|
|||||||
std::string extension;
|
std::string extension;
|
||||||
if (m_written == 0)
|
if (m_written == 0)
|
||||||
{
|
{
|
||||||
boost::filesystem::path dest_path = m_dest_folder / m_filename;
|
std::string final_filename;
|
||||||
extension = dest_path.extension().string();
|
bool found = false;
|
||||||
std::string just_filename = m_filename.substr(0, m_filename.size() - extension.size());
|
|
||||||
std::string final_filename = just_filename;
|
|
||||||
// Find unsed filename
|
|
||||||
try {
|
try {
|
||||||
size_t version = 0;
|
found = find_unused_filename(m_dest_folder, m_filename, m_tmp_path, final_filename);
|
||||||
while (boost::filesystem::exists(m_dest_folder / (final_filename + extension)) || boost::filesystem::exists(m_dest_folder / (final_filename + extension + "." + std::to_string(get_current_pid()) + ".download")))
|
|
||||||
{
|
|
||||||
++version;
|
|
||||||
if (version > 999) {
|
|
||||||
wxCommandEvent* evt = new wxCommandEvent(EVT_DWNLDR_FILE_ERROR);
|
|
||||||
evt->SetString(GUI::format_wxstr(L"Failed to find suitable filename. Last name: %1%." , (m_dest_folder / (final_filename + extension)).string()));
|
|
||||||
evt->SetInt(m_id);
|
|
||||||
m_evt_handler->QueueEvent(evt);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
final_filename = GUI::format("%1%(%2%)", just_filename, std::to_string(version));
|
|
||||||
}
|
|
||||||
} catch (const boost::filesystem::filesystem_error& e)
|
} catch (const boost::filesystem::filesystem_error& e)
|
||||||
{
|
{
|
||||||
wxCommandEvent* evt = new wxCommandEvent(EVT_DWNLDR_FILE_ERROR);
|
wxCommandEvent* evt = new wxCommandEvent(EVT_DWNLDR_FILE_ERROR);
|
||||||
@@ -171,10 +145,18 @@ void FileGet::priv::get_perform()
|
|||||||
m_evt_handler->QueueEvent(evt);
|
m_evt_handler->QueueEvent(evt);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
if (!found) {
|
||||||
|
wxCommandEvent* evt = new wxCommandEvent(EVT_DWNLDR_FILE_ERROR);
|
||||||
|
evt->SetString(GUI::format_wxstr(L"Failed to find suitable filename. Last name: %1%." , (m_dest_folder / final_filename).string()));
|
||||||
|
evt->SetInt(m_id);
|
||||||
|
m_evt_handler->QueueEvent(evt);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
m_filename = sanitize_filename(final_filename + extension);
|
m_filename = final_filename;
|
||||||
|
extension = boost::filesystem::path(m_filename).extension().string();
|
||||||
|
|
||||||
m_tmp_path = m_dest_folder / (m_filename + "." + std::to_string(get_current_pid()) + ".download");
|
m_tmp_path = download_marker_path(m_dest_folder, m_filename);
|
||||||
|
|
||||||
wxCommandEvent* evt = new wxCommandEvent(EVT_DWNLDR_FILE_NAME_CHANGE);
|
wxCommandEvent* evt = new wxCommandEvent(EVT_DWNLDR_FILE_NAME_CHANGE);
|
||||||
evt->SetString(boost::nowide::widen(m_filename));
|
evt->SetString(boost::nowide::widen(m_filename));
|
||||||
@@ -221,7 +203,32 @@ void FileGet::priv::get_perform()
|
|||||||
if(dest_path.empty()) {
|
if(dest_path.empty()) {
|
||||||
std::string filename = extract_remote_filename(header);
|
std::string filename = extract_remote_filename(header);
|
||||||
if (!filename.empty()) {
|
if (!filename.empty()) {
|
||||||
m_filename = filename;
|
// The name comes from the server: keep it inside the destination folder and never
|
||||||
|
// replace an existing file. Keep the current name if nothing usable remains.
|
||||||
|
filename = sanitize_file_basename(filename);
|
||||||
|
std::string unused;
|
||||||
|
try {
|
||||||
|
if (filename.empty() || !find_unused_filename(m_dest_folder, filename, m_tmp_path, unused))
|
||||||
|
unused.clear();
|
||||||
|
} catch (const boost::filesystem::filesystem_error&) {
|
||||||
|
unused.clear();
|
||||||
|
}
|
||||||
|
const boost::filesystem::path tmp_path = unused.empty() ? m_tmp_path : download_marker_path(m_dest_folder, unused);
|
||||||
|
if (tmp_path != m_tmp_path) {
|
||||||
|
// Move the marker to the adopted name so that other downloads see the name as taken.
|
||||||
|
// Only before anything is written, so that no downloaded data has to be carried over.
|
||||||
|
FILE* tmp_file = m_written == 0 ? fopen(wxString(tmp_path.wstring()).c_str(), "wb") : nullptr;
|
||||||
|
if (tmp_file != nullptr) {
|
||||||
|
fclose(file);
|
||||||
|
boost::system::error_code ec;
|
||||||
|
boost::filesystem::remove(m_tmp_path, ec);
|
||||||
|
file = tmp_file;
|
||||||
|
m_tmp_path = tmp_path;
|
||||||
|
} else
|
||||||
|
unused.clear();
|
||||||
|
}
|
||||||
|
if (!unused.empty())
|
||||||
|
m_filename = unused;
|
||||||
dest_path = m_dest_folder / m_filename;
|
dest_path = m_dest_folder / m_filename;
|
||||||
wxCommandEvent* evt = new wxCommandEvent(EVT_DWNLDR_FILE_NAME_CHANGE);
|
wxCommandEvent* evt = new wxCommandEvent(EVT_DWNLDR_FILE_NAME_CHANGE);
|
||||||
evt->SetString(boost::nowide::widen(m_filename));
|
evt->SetString(boost::nowide::widen(m_filename));
|
||||||
@@ -327,6 +334,18 @@ void FileGet::priv::get_perform()
|
|||||||
m_evt_handler->QueueEvent(evt);
|
m_evt_handler->QueueEvent(evt);
|
||||||
}
|
}
|
||||||
fclose(file);
|
fclose(file);
|
||||||
|
// Another file may have taken the name while downloading.
|
||||||
|
if (!dest_path.empty() && boost::filesystem::exists(dest_path)) {
|
||||||
|
std::string unused;
|
||||||
|
if (!find_unused_filename(m_dest_folder, m_filename, m_tmp_path, unused))
|
||||||
|
throw std::runtime_error("No unused file name.");
|
||||||
|
m_filename = unused;
|
||||||
|
dest_path = m_dest_folder / m_filename;
|
||||||
|
wxCommandEvent* evt = new wxCommandEvent(EVT_DWNLDR_FILE_NAME_CHANGE);
|
||||||
|
evt->SetString(boost::nowide::widen(m_filename));
|
||||||
|
evt->SetInt(m_id);
|
||||||
|
m_evt_handler->QueueEvent(evt);
|
||||||
|
}
|
||||||
boost::filesystem::rename(m_tmp_path, dest_path);
|
boost::filesystem::rename(m_tmp_path, dest_path);
|
||||||
}
|
}
|
||||||
catch (const std::exception& /*e*/)
|
catch (const std::exception& /*e*/)
|
||||||
|
|||||||
@@ -456,8 +456,9 @@ void GLModel::init_from(const indexed_triangle_set& its)
|
|||||||
data.reserve_vertices(3 * its.indices.size());
|
data.reserve_vertices(3 * its.indices.size());
|
||||||
data.reserve_indices(3 * its.indices.size());
|
data.reserve_indices(3 * its.indices.size());
|
||||||
|
|
||||||
// Read user preference: smooth normals enabled
|
// CLI thumbnail generation can initialize models without a wx application.
|
||||||
const bool smooth_normals_enabled = wxGetApp().app_config != nullptr && wxGetApp().app_config->get_bool(SETTING_OPENGL_PHONG_SMOOTH_NORMALS);
|
const bool smooth_normals_enabled = wxApp::GetInstance() != nullptr && wxGetApp().app_config != nullptr &&
|
||||||
|
wxGetApp().app_config->get_bool(SETTING_OPENGL_PHONG_SMOOTH_NORMALS);
|
||||||
|
|
||||||
if (smooth_normals_enabled) {
|
if (smooth_normals_enabled) {
|
||||||
// Use per-corner smooth normals (via IGL)
|
// Use per-corner smooth normals (via IGL)
|
||||||
|
|||||||
@@ -2764,12 +2764,12 @@ ObjectTablePanel::ObjectTablePanel( wxWindow* parent, wxWindowID id, const wxPoi
|
|||||||
//m_object_grid->AssignTable(m_object_grid_table);
|
//m_object_grid->AssignTable(m_object_grid_table);
|
||||||
|
|
||||||
m_side_window = new wxScrolledWindow(this, wxID_ANY, wxDefaultPosition, wxSize(FromDIP(440),FromDIP(480)), wxVSCROLL);
|
m_side_window = new wxScrolledWindow(this, wxID_ANY, wxDefaultPosition, wxSize(FromDIP(440),FromDIP(480)), wxVSCROLL);
|
||||||
m_side_window->SetScrollRate( 0, 5 );
|
m_side_window->SetScrollRate(0, FromDIP(20));
|
||||||
m_page_sizer = new wxBoxSizer(wxVERTICAL);
|
m_page_sizer = new wxBoxSizer(wxVERTICAL);
|
||||||
//m_page_top_sizer = new wxBoxSizer(wxHORIZONTAL);
|
//m_page_top_sizer = new wxBoxSizer(wxHORIZONTAL);
|
||||||
m_side_window->SetBackgroundColour(wxColour(0xff, 0xff, 0xff));
|
m_side_window->SetBackgroundColour(wxColour(0xff, 0xff, 0xff));
|
||||||
m_side_window->SetSizer(m_page_sizer);
|
m_side_window->SetSizer(m_page_sizer);
|
||||||
m_side_window->SetScrollbars(1, 20, 1, 2);
|
m_side_window->SetScrollbars(1, FromDIP(20), 1, 2);
|
||||||
//m_side_window->ShowScrollbars(wxSHOW_SB_NEVER, wxSHOW_SB_NEVER);
|
//m_side_window->ShowScrollbars(wxSHOW_SB_NEVER, wxSHOW_SB_NEVER);
|
||||||
|
|
||||||
//m_side_window->EnableScrolling(false, true);
|
//m_side_window->EnableScrolling(false, true);
|
||||||
|
|||||||
@@ -171,7 +171,7 @@ HMSPanel::HMSPanel(wxWindow *parent, wxWindowID id, const wxPoint &pos, const wx
|
|||||||
|
|
||||||
m_scrolledWindow = new wxScrolledWindow(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxVSCROLL);
|
m_scrolledWindow = new wxScrolledWindow(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxVSCROLL);
|
||||||
m_scrolledWindow->SetBackgroundColour(*wxWHITE);
|
m_scrolledWindow->SetBackgroundColour(*wxWHITE);
|
||||||
m_scrolledWindow->SetScrollRate(5, 5);
|
m_scrolledWindow->SetScrollRate(5, FromDIP(20));
|
||||||
|
|
||||||
m_top_sizer = new wxBoxSizer(wxVERTICAL);
|
m_top_sizer = new wxBoxSizer(wxVERTICAL);
|
||||||
|
|
||||||
|
|||||||
@@ -211,7 +211,7 @@ wxPanel* KBShortcutsDialog::create_page(wxWindow* parent, const Page& page)
|
|||||||
wxGetApp().UpdateDarkUI(scrollable_panel);
|
wxGetApp().UpdateDarkUI(scrollable_panel);
|
||||||
const wxColour page_colour = StateColor::darkModeColorFor(*wxWHITE);
|
const wxColour page_colour = StateColor::darkModeColorFor(*wxWHITE);
|
||||||
scrollable_panel->SetBackgroundColour(page_colour);
|
scrollable_panel->SetBackgroundColour(page_colour);
|
||||||
scrollable_panel->SetScrollRate(0, 20);
|
scrollable_panel->SetScrollRate(0, FromDIP(20));
|
||||||
const int page_width = FromDIP(PAGE_WIDTH);
|
const int page_width = FromDIP(PAGE_WIDTH);
|
||||||
scrollable_panel->SetInitialSize(wxSize(page_width, FromDIP(450)));
|
scrollable_panel->SetInitialSize(wxSize(page_width, FromDIP(450)));
|
||||||
|
|
||||||
|
|||||||
@@ -1125,7 +1125,7 @@ wxBoxSizer* MixedFilamentDialog::create_recommendation_grid()
|
|||||||
outer->Add(title_sizer, 0, wxEXPAND | wxBOTTOM, FromDIP(4));
|
outer->Add(title_sizer, 0, wxEXPAND | wxBOTTOM, FromDIP(4));
|
||||||
|
|
||||||
m_recommendation_scroll = new wxScrolledWindow(this, wxID_ANY, wxDefaultPosition, wxSize(-1, FromDIP(116)));
|
m_recommendation_scroll = new wxScrolledWindow(this, wxID_ANY, wxDefaultPosition, wxSize(-1, FromDIP(116)));
|
||||||
m_recommendation_scroll->SetScrollRate(0, 5);
|
m_recommendation_scroll->SetScrollRate(0, FromDIP(20));
|
||||||
m_recommendation_scroll->SetBackgroundColour(StateColor::darkModeColorFor(wxColour("#F8F8F8")));
|
m_recommendation_scroll->SetBackgroundColour(StateColor::darkModeColorFor(wxColour("#F8F8F8")));
|
||||||
|
|
||||||
m_recommendation_grid = new wxWrapSizer(wxHORIZONTAL, wxREMOVE_LEADING_SPACES);
|
m_recommendation_grid = new wxWrapSizer(wxHORIZONTAL, wxREMOVE_LEADING_SPACES);
|
||||||
|
|||||||
@@ -194,9 +194,10 @@ Button* MsgDialog::add_button(wxWindowID btn_id, bool set_focus /*= false*/, con
|
|||||||
bd->button = btn;
|
bd->button = btn;
|
||||||
//bd->type = type;
|
//bd->type = type;
|
||||||
|
|
||||||
mb->id = wxString::Format("%d", m_buttons.size());
|
// m_buttons.size() is a size_t, which does not match the %d conversion
|
||||||
|
mb->id = wxString(std::to_string(m_buttons.size()));
|
||||||
mb->buttondata = bd;
|
mb->buttondata = bd;
|
||||||
m_buttons[ wxString::Format("%d", m_buttons.size())] = mb;
|
m_buttons[ wxString(std::to_string(m_buttons.size()))] = mb;
|
||||||
return btn;
|
return btn;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -398,7 +399,7 @@ static void add_msg_content(wxWindow *parent,
|
|||||||
}
|
}
|
||||||
wxScrolledWindow *scrolledWindow = new wxScrolledWindow(parent, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxVSCROLL);
|
wxScrolledWindow *scrolledWindow = new wxScrolledWindow(parent, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxVSCROLL);
|
||||||
scrolledWindow->SetBackgroundColour(*wxWHITE);
|
scrolledWindow->SetBackgroundColour(*wxWHITE);
|
||||||
scrolledWindow->SetScrollRate(0, 20);
|
scrolledWindow->SetScrollRate(0, scrolledWindow->FromDIP(20));
|
||||||
scrolledWindow->EnableScrolling(false, true);
|
scrolledWindow->EnableScrolling(false, true);
|
||||||
wxBoxSizer *sizer_scrolled = new wxBoxSizer(wxHORIZONTAL);
|
wxBoxSizer *sizer_scrolled = new wxBoxSizer(wxHORIZONTAL);
|
||||||
Label *wrapped_text = new Label(scrolledWindow, font, msg, LB_AUTO_WRAP, wxSize(info_width, -1));
|
Label *wrapped_text = new Label(scrolledWindow, font, msg, LB_AUTO_WRAP, wxSize(info_width, -1));
|
||||||
|
|||||||
@@ -398,7 +398,7 @@ MultiMachineManagerPage::MultiMachineManagerPage(wxWindow* parent)
|
|||||||
|
|
||||||
m_machine_list = new wxScrolledWindow(m_main_panel, wxID_ANY, wxDefaultPosition, wxDefaultSize);
|
m_machine_list = new wxScrolledWindow(m_main_panel, wxID_ANY, wxDefaultPosition, wxDefaultSize);
|
||||||
m_machine_list->SetBackgroundColour(*wxWHITE);
|
m_machine_list->SetBackgroundColour(*wxWHITE);
|
||||||
m_machine_list->SetScrollRate(0, 5);
|
m_machine_list->SetScrollRate(0, FromDIP(DEVICE_ITEM_MAX_HEIGHT));
|
||||||
m_machine_list->SetMinSize(wxSize(FromDIP(DEVICE_ITEM_MAX_WIDTH), 10 * FromDIP(DEVICE_ITEM_MAX_HEIGHT)));
|
m_machine_list->SetMinSize(wxSize(FromDIP(DEVICE_ITEM_MAX_WIDTH), 10 * FromDIP(DEVICE_ITEM_MAX_HEIGHT)));
|
||||||
m_machine_list->SetMaxSize(wxSize(FromDIP(DEVICE_ITEM_MAX_WIDTH), 10 * FromDIP(DEVICE_ITEM_MAX_HEIGHT)));
|
m_machine_list->SetMaxSize(wxSize(FromDIP(DEVICE_ITEM_MAX_WIDTH), 10 * FromDIP(DEVICE_ITEM_MAX_HEIGHT)));
|
||||||
|
|
||||||
|
|||||||
@@ -323,7 +323,7 @@ MultiMachinePickPage::MultiMachinePickPage(Plater* plater /*= nullptr*/)
|
|||||||
scroll_macine_list->SetMinSize(wxSize(FromDIP(400), FromDIP(10 * 30)));
|
scroll_macine_list->SetMinSize(wxSize(FromDIP(400), FromDIP(10 * 30)));
|
||||||
scroll_macine_list->SetMaxSize(wxSize(FromDIP(400), FromDIP(10 * 30)));
|
scroll_macine_list->SetMaxSize(wxSize(FromDIP(400), FromDIP(10 * 30)));
|
||||||
scroll_macine_list->SetBackgroundColour(*wxWHITE);
|
scroll_macine_list->SetBackgroundColour(*wxWHITE);
|
||||||
scroll_macine_list->SetScrollRate(0, 5);
|
scroll_macine_list->SetScrollRate(0, FromDIP(DEVICE_ITEM_MAX_HEIGHT));
|
||||||
|
|
||||||
sizer_machine_list = new wxBoxSizer(wxVERTICAL);
|
sizer_machine_list = new wxBoxSizer(wxVERTICAL);
|
||||||
scroll_macine_list->SetSizer(sizer_machine_list);
|
scroll_macine_list->SetSizer(sizer_machine_list);
|
||||||
|
|||||||
@@ -675,7 +675,7 @@ LocalTaskManagerPage::LocalTaskManagerPage(wxWindow* parent)
|
|||||||
|
|
||||||
m_task_list = new wxScrolledWindow(m_main_panel, wxID_ANY, wxDefaultPosition, wxDefaultSize);
|
m_task_list = new wxScrolledWindow(m_main_panel, wxID_ANY, wxDefaultPosition, wxDefaultSize);
|
||||||
m_task_list->SetBackgroundColour(*wxWHITE);
|
m_task_list->SetBackgroundColour(*wxWHITE);
|
||||||
m_task_list->SetScrollRate(0, 5);
|
m_task_list->SetScrollRate(0, FromDIP(DEVICE_ITEM_MAX_HEIGHT));
|
||||||
m_task_list->SetMinSize(wxSize(FromDIP(CLOUD_TASK_ITEM_MAX_WIDTH), FromDIP(DEVICE_ITEM_MAX_HEIGHT)));
|
m_task_list->SetMinSize(wxSize(FromDIP(CLOUD_TASK_ITEM_MAX_WIDTH), FromDIP(DEVICE_ITEM_MAX_HEIGHT)));
|
||||||
m_task_list->SetMaxSize(wxSize(FromDIP(CLOUD_TASK_ITEM_MAX_WIDTH), 10 * FromDIP(DEVICE_ITEM_MAX_HEIGHT)));
|
m_task_list->SetMaxSize(wxSize(FromDIP(CLOUD_TASK_ITEM_MAX_WIDTH), 10 * FromDIP(DEVICE_ITEM_MAX_HEIGHT)));
|
||||||
|
|
||||||
@@ -1056,7 +1056,7 @@ CloudTaskManagerPage::CloudTaskManagerPage(wxWindow* parent)
|
|||||||
|
|
||||||
m_task_list = new wxScrolledWindow(m_main_panel, wxID_ANY, wxDefaultPosition, wxDefaultSize);
|
m_task_list = new wxScrolledWindow(m_main_panel, wxID_ANY, wxDefaultPosition, wxDefaultSize);
|
||||||
m_task_list->SetBackgroundColour(*wxWHITE);
|
m_task_list->SetBackgroundColour(*wxWHITE);
|
||||||
m_task_list->SetScrollRate(0, 5);
|
m_task_list->SetScrollRate(0, FromDIP(DEVICE_ITEM_MAX_HEIGHT));
|
||||||
m_task_list->SetMinSize(wxSize(FromDIP(CLOUD_TASK_ITEM_MAX_WIDTH), FromDIP(DEVICE_ITEM_MAX_HEIGHT)));
|
m_task_list->SetMinSize(wxSize(FromDIP(CLOUD_TASK_ITEM_MAX_WIDTH), FromDIP(DEVICE_ITEM_MAX_HEIGHT)));
|
||||||
m_task_list->SetMaxSize(wxSize(FromDIP(CLOUD_TASK_ITEM_MAX_WIDTH), 10 * FromDIP(DEVICE_ITEM_MAX_HEIGHT)));
|
m_task_list->SetMaxSize(wxSize(FromDIP(CLOUD_TASK_ITEM_MAX_WIDTH), 10 * FromDIP(DEVICE_ITEM_MAX_HEIGHT)));
|
||||||
|
|
||||||
|
|||||||
@@ -355,7 +355,7 @@ ObjColorPanel::ObjColorPanel(wxWindow *parent, Slic3r::ObjDialogInOut &in_out, c
|
|||||||
//new color table
|
//new color table
|
||||||
m_scrolledWindow = new wxScrolledWindow(m_page_simple, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxVSCROLL);
|
m_scrolledWindow = new wxScrolledWindow(m_page_simple, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxVSCROLL);
|
||||||
m_scrolledWindow->SetBackgroundColour(*wxWHITE);
|
m_scrolledWindow->SetBackgroundColour(*wxWHITE);
|
||||||
m_scrolledWindow->SetScrollRate(0, 20);
|
m_scrolledWindow->SetScrollRate(0, FromDIP(20));
|
||||||
m_scrolledWindow->EnableScrolling(false, true);
|
m_scrolledWindow->EnableScrolling(false, true);
|
||||||
m_scrolledWindow->ShowScrollbars(wxScrollbarVisibility::wxSHOW_SB_NEVER, wxScrollbarVisibility::wxSHOW_SB_DEFAULT);
|
m_scrolledWindow->ShowScrollbars(wxScrollbarVisibility::wxSHOW_SB_NEVER, wxScrollbarVisibility::wxSHOW_SB_DEFAULT);
|
||||||
draw_new_table();
|
draw_new_table();
|
||||||
|
|||||||
@@ -391,7 +391,7 @@ ParamsPanel::ParamsPanel( wxWindow* parent, wxWindowID id, const wxPoint& pos, c
|
|||||||
m_page_sizer = new wxBoxSizer(wxVERTICAL);
|
m_page_sizer = new wxBoxSizer(wxVERTICAL);
|
||||||
|
|
||||||
m_page_view->SetSizer(m_page_sizer);
|
m_page_view->SetSizer(m_page_sizer);
|
||||||
m_page_view->SetScrollbars(1, 20, 1, 2);
|
m_page_view->SetScrollbars(1, FromDIP(20), 1, 2);
|
||||||
//m_page_view->SetScrollRate( 5, 5 );
|
//m_page_view->SetScrollRate( 5, 5 );
|
||||||
|
|
||||||
if (m_mode_region)
|
if (m_mode_region)
|
||||||
|
|||||||
@@ -148,7 +148,7 @@ PartSkipDialog::PartSkipDialog(wxWindow *parent) : DPIDialog(parent, wxID_ANY, _
|
|||||||
m_line->SetBackgroundColour(wxColor(238, 238, 238));
|
m_line->SetBackgroundColour(wxColor(238, 238, 238));
|
||||||
|
|
||||||
m_list_view = new wxScrolledWindow(m_book_third_panel, wxID_ANY, wxDefaultPosition, wxSize(267, -1), wxHSCROLL | wxVSCROLL);
|
m_list_view = new wxScrolledWindow(m_book_third_panel, wxID_ANY, wxDefaultPosition, wxSize(267, -1), wxHSCROLL | wxVSCROLL);
|
||||||
m_list_view->SetScrollRate(5, 5);
|
m_list_view->SetScrollRate(5, FromDIP(30));
|
||||||
m_list_view->SetMinSize(wxSize(FromDIP(267), FromDIP(378)));
|
m_list_view->SetMinSize(wxSize(FromDIP(267), FromDIP(378)));
|
||||||
m_list_view->SetMaxSize(wxSize(FromDIP(267), FromDIP(378)));
|
m_list_view->SetMaxSize(wxSize(FromDIP(267), FromDIP(378)));
|
||||||
m_list_view->SetBackgroundColour(*wxWHITE);
|
m_list_view->SetBackgroundColour(*wxWHITE);
|
||||||
|
|||||||
+40
-51
@@ -3049,8 +3049,7 @@ Sidebar::Sidebar(Plater *parent)
|
|||||||
|
|
||||||
// add filament content
|
// add filament content
|
||||||
p->m_panel_filament_content = new wxScrolledWindow(p->m_filament_area_wrapper, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
|
p->m_panel_filament_content = new wxScrolledWindow(p->m_filament_area_wrapper, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
|
||||||
p->m_panel_filament_content->SetScrollbars(0, 100, 1, 2);
|
p->m_panel_filament_content->SetScrollRate(0, FromDIP(20));
|
||||||
p->m_panel_filament_content->SetScrollRate(0, 5);
|
|
||||||
//p->m_panel_filament_content->SetMaxSize(wxSize{-1, FromDIP(174)});
|
//p->m_panel_filament_content->SetMaxSize(wxSize{-1, FromDIP(174)});
|
||||||
p->m_panel_filament_content->SetBackgroundColour(wxColour(255, 255, 255));
|
p->m_panel_filament_content->SetBackgroundColour(wxColour(255, 255, 255));
|
||||||
|
|
||||||
@@ -3142,8 +3141,7 @@ Sidebar::Sidebar(Plater *parent)
|
|||||||
// 3) Mixed filament rows, in their own scroll area so a long mixed list does not
|
// 3) Mixed filament rows, in their own scroll area so a long mixed list does not
|
||||||
// push the physical filament list off screen.
|
// push the physical filament list off screen.
|
||||||
p->m_mixed_scroll_area = new wxScrolledWindow(p->m_filament_area_wrapper, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL);
|
p->m_mixed_scroll_area = new wxScrolledWindow(p->m_filament_area_wrapper, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL);
|
||||||
p->m_mixed_scroll_area->SetScrollbars(0, 100, 1, 2);
|
p->m_mixed_scroll_area->SetScrollRate(0, FromDIP(20));
|
||||||
p->m_mixed_scroll_area->SetScrollRate(0, 5);
|
|
||||||
p->m_mixed_scroll_area->SetBackgroundColour(StateColor::darkModeColorFor(*wxWHITE));
|
p->m_mixed_scroll_area->SetBackgroundColour(StateColor::darkModeColorFor(*wxWHITE));
|
||||||
{
|
{
|
||||||
auto* mix_scroll_sizer = new wxBoxSizer(wxVERTICAL);
|
auto* mix_scroll_sizer = new wxBoxSizer(wxVERTICAL);
|
||||||
@@ -15683,6 +15681,11 @@ void Plater::import_model_id(wxString download_info)
|
|||||||
//wxString sError = error.what();
|
//wxString sError = error.what();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// The name comes from the link: reduce it to a plain file name inside the download folder.
|
||||||
|
filename = from_u8(sanitize_file_basename(into_u8(filename)));
|
||||||
|
if (filename.empty())
|
||||||
|
filename = "untitled.3mf";
|
||||||
|
|
||||||
bool download_ok = false;
|
bool download_ok = false;
|
||||||
int retry_count = 0;
|
int retry_count = 0;
|
||||||
const int max_retries = 3;
|
const int max_retries = 3;
|
||||||
@@ -15724,51 +15727,28 @@ void Plater::import_model_id(wxString download_info)
|
|||||||
|
|
||||||
msg = _L("Preparing 3MF file...");
|
msg = _L("Preparing 3MF file...");
|
||||||
|
|
||||||
//gets the number of files with the same name
|
|
||||||
std::vector<wxString> vecFiles;
|
|
||||||
bool is_already_exist = false;
|
|
||||||
|
|
||||||
|
|
||||||
target_path = fs::path(wxGetApp().app_config->get("download_path"));
|
target_path = fs::path(wxGetApp().app_config->get("download_path"));
|
||||||
|
|
||||||
try
|
//check file suffix
|
||||||
{
|
wxString extension = fs::path(filename.wx_str()).extension().c_str();
|
||||||
vecFiles.clear();
|
if (!extension.Contains(".3mf")) {
|
||||||
wxString extension = fs::path(filename.wx_str()).extension().c_str();
|
msg = _L("Download failed; unknown file format.");
|
||||||
|
return;
|
||||||
|
|
||||||
//check file suffix
|
|
||||||
if (!extension.Contains(".3mf")) {
|
|
||||||
msg = _L("Download failed; unknown file format.");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
auto name = filename.substr(0, filename.length() - extension.length() - 1);
|
|
||||||
|
|
||||||
for (const auto& iter : boost::filesystem::directory_iterator(target_path))
|
|
||||||
{
|
|
||||||
if (boost::filesystem::is_directory(iter.path()))
|
|
||||||
continue;
|
|
||||||
|
|
||||||
wxString sFile = iter.path().filename().string().c_str();
|
|
||||||
if (strstr(sFile.c_str(), name.c_str()) != NULL) {
|
|
||||||
vecFiles.push_back(sFile);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (sFile == filename) is_already_exist = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch (const std::exception&)
|
|
||||||
{
|
|
||||||
//wxString sError = error.what();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//update filename
|
//never replace an existing file
|
||||||
if (is_already_exist && vecFiles.size() >= 1) {
|
std::string unused_filename;
|
||||||
wxString extension = fs::path(filename.wx_str()).extension().c_str();
|
try {
|
||||||
wxString name = filename.substr(0, filename.length() - extension.length());
|
if (!find_unused_filename(target_path, into_u8(filename), {}, unused_filename))
|
||||||
filename = wxString::Format("%s(%d)%s", name, vecFiles.size() + 1, extension).ToStdString();
|
unused_filename.clear();
|
||||||
|
} catch (const std::exception&) {
|
||||||
|
unused_filename.clear();
|
||||||
}
|
}
|
||||||
|
if (unused_filename.empty()) {
|
||||||
|
msg = _L("Importing to Orca Slicer failed. Please download the file and manually import it.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
filename = from_u8(unused_filename);
|
||||||
|
|
||||||
|
|
||||||
msg = _L("Downloading project...");
|
msg = _L("Downloading project...");
|
||||||
@@ -15780,10 +15760,6 @@ void Plater::import_model_id(wxString download_info)
|
|||||||
boost::uuids::uuid uuid = boost::uuids::random_generator()();
|
boost::uuids::uuid uuid = boost::uuids::random_generator()();
|
||||||
std::string unique = to_string(uuid).substr(0, 6);
|
std::string unique = to_string(uuid).substr(0, 6);
|
||||||
|
|
||||||
if (filename.empty()) {
|
|
||||||
filename = "untitled.3mf";
|
|
||||||
}
|
|
||||||
|
|
||||||
//target_path /= (boost::format("%1%_%2%.3mf") % filename % unique).str();
|
//target_path /= (boost::format("%1%_%2%.3mf") % filename % unique).str();
|
||||||
target_path /= fs::path(filename.wc_str());
|
target_path /= fs::path(filename.wc_str());
|
||||||
|
|
||||||
@@ -15832,13 +15808,26 @@ void Plater::import_model_id(wxString download_info)
|
|||||||
cont = false;
|
cont = false;
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
.on_complete([&cont, &download_ok, tmp_path, target_path](std::string body, unsigned /* http_status */) {
|
.on_complete([&cont, &download_ok, &msg, tmp_path, &target_path](std::string body, unsigned /* http_status */) {
|
||||||
fs::fstream file(tmp_path, std::ios::out | std::ios::binary | std::ios::trunc);
|
fs::fstream file(tmp_path, std::ios::out | std::ios::binary | std::ios::trunc);
|
||||||
file.write(body.c_str(), body.size());
|
file.write(body.c_str(), body.size());
|
||||||
file.close();
|
file.close();
|
||||||
fs::rename(tmp_path, target_path);
|
|
||||||
cont = false;
|
cont = false;
|
||||||
download_ok = true;
|
try {
|
||||||
|
// Another file may have taken the name while downloading.
|
||||||
|
std::string unused_filename;
|
||||||
|
if (find_unused_filename(target_path.parent_path(), target_path.filename().string(), {}, unused_filename)) {
|
||||||
|
target_path = target_path.parent_path() / unused_filename;
|
||||||
|
fs::rename(tmp_path, target_path);
|
||||||
|
download_ok = true;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
} catch (const std::exception &e) {
|
||||||
|
BOOST_LOG_TRIVIAL(error) << "import_model_id: failed to move the download into place: " << e.what();
|
||||||
|
}
|
||||||
|
boost::system::error_code ec;
|
||||||
|
fs::remove(tmp_path, ec);
|
||||||
|
msg = _L("Importing to Orca Slicer failed. Please download the file and manually import it.");
|
||||||
}).perform_sync();
|
}).perform_sync();
|
||||||
|
|
||||||
// for break while
|
// for break while
|
||||||
|
|||||||
@@ -1475,7 +1475,7 @@ void PreferencesDialog::create()
|
|||||||
app_config = get_app_config();
|
app_config = get_app_config();
|
||||||
|
|
||||||
m_parent = new MyscrolledWindow(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxVSCROLL);
|
m_parent = new MyscrolledWindow(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxVSCROLL);
|
||||||
m_parent->SetScrollRate(5, 5);
|
m_parent->SetScrollRate(0, FromDIP(20));
|
||||||
m_parent->SetBackgroundColour(*wxWHITE);
|
m_parent->SetBackgroundColour(*wxWHITE);
|
||||||
|
|
||||||
m_sizer_body = new wxBoxSizer(wxVERTICAL);
|
m_sizer_body = new wxBoxSizer(wxVERTICAL);
|
||||||
|
|||||||
@@ -32,7 +32,7 @@ PrintOptionsDialog::PrintOptionsDialog(wxWindow* parent)
|
|||||||
|
|
||||||
|
|
||||||
m_scrollwindow = new wxScrolledWindow(this, wxID_ANY);
|
m_scrollwindow = new wxScrolledWindow(this, wxID_ANY);
|
||||||
m_scrollwindow->SetScrollRate(0, FromDIP(10));
|
m_scrollwindow->SetScrollRate(0, FromDIP(20));
|
||||||
m_scrollwindow->SetBackgroundColour(*wxWHITE);
|
m_scrollwindow->SetBackgroundColour(*wxWHITE);
|
||||||
m_scrollwindow->SetMinSize(wxSize(FromDIP(480), wxDefaultCoord));
|
m_scrollwindow->SetMinSize(wxSize(FromDIP(480), wxDefaultCoord));
|
||||||
m_scrollwindow->SetMaxSize(wxSize(FromDIP(480), wxDefaultCoord));
|
m_scrollwindow->SetMaxSize(wxSize(FromDIP(480), wxDefaultCoord));
|
||||||
|
|||||||
@@ -1225,7 +1225,7 @@ size_t PublishSettingsDialog::category_index_for(
|
|||||||
}
|
}
|
||||||
|
|
||||||
category.scroll = new wxScrolledWindow(category.page, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxVSCROLL);
|
category.scroll = new wxScrolledWindow(category.page, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxVSCROLL);
|
||||||
category.scroll->SetScrollRate(0, 10);
|
category.scroll->SetScrollRate(0, FromDIP(20));
|
||||||
category.scroll->SetBackgroundColour(GetBackgroundColour());
|
category.scroll->SetBackgroundColour(GetBackgroundColour());
|
||||||
category.list_sizer = new wxBoxSizer(wxVERTICAL);
|
category.list_sizer = new wxBoxSizer(wxVERTICAL);
|
||||||
category.scroll->SetSizer(category.list_sizer);
|
category.scroll->SetSizer(category.list_sizer);
|
||||||
|
|||||||
@@ -76,7 +76,7 @@ ReleaseNoteDialog::ReleaseNoteDialog(Plater *plater /*= nullptr*/)
|
|||||||
m_sizer_right->Add(0, 0, 1, wxTOP, FromDIP(15));
|
m_sizer_right->Add(0, 0, 1, wxTOP, FromDIP(15));
|
||||||
|
|
||||||
m_vebview_release_note = new wxScrolledWindow(this, wxID_ANY, wxDefaultPosition, wxSize(FromDIP(560), FromDIP(430)), wxVSCROLL);
|
m_vebview_release_note = new wxScrolledWindow(this, wxID_ANY, wxDefaultPosition, wxSize(FromDIP(560), FromDIP(430)), wxVSCROLL);
|
||||||
m_vebview_release_note->SetScrollRate(5, 5);
|
m_vebview_release_note->SetScrollRate(5, FromDIP(20));
|
||||||
m_vebview_release_note->SetBackgroundColour(wxColour(0xF8, 0xF8, 0xF8));
|
m_vebview_release_note->SetBackgroundColour(wxColour(0xF8, 0xF8, 0xF8));
|
||||||
m_vebview_release_note->SetMaxSize(wxSize(FromDIP(560), FromDIP(430)));
|
m_vebview_release_note->SetMaxSize(wxSize(FromDIP(560), FromDIP(430)));
|
||||||
|
|
||||||
@@ -142,7 +142,7 @@ UpdatePluginDialog::UpdatePluginDialog(wxWindow* parent /*= nullptr*/)
|
|||||||
operation_tips->SetMaxSize(wxSize(FromDIP(260), -1));
|
operation_tips->SetMaxSize(wxSize(FromDIP(260), -1));
|
||||||
|
|
||||||
m_vebview_release_note = new wxScrolledWindow(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxVSCROLL);
|
m_vebview_release_note = new wxScrolledWindow(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxVSCROLL);
|
||||||
m_vebview_release_note->SetScrollRate(5, 5);
|
m_vebview_release_note->SetScrollRate(5, FromDIP(20));
|
||||||
m_vebview_release_note->SetBackgroundColour(wxColour(0xF8, 0xF8, 0xF8));
|
m_vebview_release_note->SetBackgroundColour(wxColour(0xF8, 0xF8, 0xF8));
|
||||||
m_vebview_release_note->SetMinSize(wxSize(FromDIP(260), FromDIP(150)));
|
m_vebview_release_note->SetMinSize(wxSize(FromDIP(260), FromDIP(150)));
|
||||||
m_vebview_release_note->SetMaxSize(wxSize(FromDIP(260), FromDIP(150)));
|
m_vebview_release_note->SetMaxSize(wxSize(FromDIP(260), FromDIP(150)));
|
||||||
@@ -277,7 +277,7 @@ UpdateVersionDialog::UpdateVersionDialog(wxWindow *parent)
|
|||||||
m_simplebook_release_note->SetBackgroundColour(wxColour(0xF8, 0xF8, 0xF8));
|
m_simplebook_release_note->SetBackgroundColour(wxColour(0xF8, 0xF8, 0xF8));
|
||||||
|
|
||||||
m_scrollwindows_release_note = new wxScrolledWindow(m_simplebook_release_note, wxID_ANY, wxDefaultPosition, wxSize(FromDIP(560), FromDIP(430)), wxVSCROLL);
|
m_scrollwindows_release_note = new wxScrolledWindow(m_simplebook_release_note, wxID_ANY, wxDefaultPosition, wxSize(FromDIP(560), FromDIP(430)), wxVSCROLL);
|
||||||
m_scrollwindows_release_note->SetScrollRate(5, 5);
|
m_scrollwindows_release_note->SetScrollRate(5, FromDIP(20));
|
||||||
m_scrollwindows_release_note->SetBackgroundColour(wxColour(0xF8, 0xF8, 0xF8));
|
m_scrollwindows_release_note->SetBackgroundColour(wxColour(0xF8, 0xF8, 0xF8));
|
||||||
|
|
||||||
//webview
|
//webview
|
||||||
@@ -538,7 +538,7 @@ SecondaryCheckDialog::SecondaryCheckDialog(wxWindow* parent, wxWindowID id, cons
|
|||||||
m_sizer_right->Add(0, 0, 1, wxTOP, FromDIP(15));
|
m_sizer_right->Add(0, 0, 1, wxTOP, FromDIP(15));
|
||||||
|
|
||||||
m_vebview_release_note = new wxScrolledWindow(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxVSCROLL);
|
m_vebview_release_note = new wxScrolledWindow(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxVSCROLL);
|
||||||
m_vebview_release_note->SetScrollRate(0, 5);
|
m_vebview_release_note->SetScrollRate(0, FromDIP(20));
|
||||||
m_vebview_release_note->SetBackgroundColour(*wxWHITE);
|
m_vebview_release_note->SetBackgroundColour(*wxWHITE);
|
||||||
m_vebview_release_note->SetMinSize(wxSize(FromDIP(400), FromDIP(380)));
|
m_vebview_release_note->SetMinSize(wxSize(FromDIP(400), FromDIP(380)));
|
||||||
m_sizer_right->Add(m_vebview_release_note, 0, wxEXPAND | wxRIGHT | wxLEFT, FromDIP(15));
|
m_sizer_right->Add(m_vebview_release_note, 0, wxEXPAND | wxRIGHT | wxLEFT, FromDIP(15));
|
||||||
@@ -823,7 +823,7 @@ PrintErrorDialog::PrintErrorDialog(wxWindow* parent, wxWindowID id, const wxStri
|
|||||||
m_sizer_right->Add(0, 0, 1, wxTOP, FromDIP(5));
|
m_sizer_right->Add(0, 0, 1, wxTOP, FromDIP(5));
|
||||||
|
|
||||||
m_vebview_release_note = new wxScrolledWindow(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxVSCROLL);
|
m_vebview_release_note = new wxScrolledWindow(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxVSCROLL);
|
||||||
m_vebview_release_note->SetScrollRate(0, 5);
|
m_vebview_release_note->SetScrollRate(0, FromDIP(20));
|
||||||
m_vebview_release_note->SetBackgroundColour(*wxWHITE);
|
m_vebview_release_note->SetBackgroundColour(*wxWHITE);
|
||||||
m_vebview_release_note->SetMinSize(wxSize(FromDIP(320), FromDIP(250)));
|
m_vebview_release_note->SetMinSize(wxSize(FromDIP(320), FromDIP(250)));
|
||||||
m_sizer_right->Add(m_vebview_release_note, 0, wxEXPAND | wxRIGHT | wxLEFT, FromDIP(15));
|
m_sizer_right->Add(m_vebview_release_note, 0, wxEXPAND | wxRIGHT | wxLEFT, FromDIP(15));
|
||||||
@@ -1122,7 +1122,7 @@ ConfirmBeforeSendDialog::ConfirmBeforeSendDialog(wxWindow* parent, wxWindowID id
|
|||||||
m_sizer_right->Add(0, 0, 1, wxTOP, FromDIP(15));
|
m_sizer_right->Add(0, 0, 1, wxTOP, FromDIP(15));
|
||||||
|
|
||||||
m_vebview_release_note = new wxScrolledWindow(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxVSCROLL);
|
m_vebview_release_note = new wxScrolledWindow(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxVSCROLL);
|
||||||
m_vebview_release_note->SetScrollRate(0, 5);
|
m_vebview_release_note->SetScrollRate(0, FromDIP(20));
|
||||||
m_vebview_release_note->SetBackgroundColour(*wxWHITE);
|
m_vebview_release_note->SetBackgroundColour(*wxWHITE);
|
||||||
m_vebview_release_note->SetMinSize(wxSize(FromDIP(400), FromDIP(380)));
|
m_vebview_release_note->SetMinSize(wxSize(FromDIP(400), FromDIP(380)));
|
||||||
m_sizer_right->Add(m_vebview_release_note, 0, wxEXPAND | wxRIGHT | wxLEFT, FromDIP(15));
|
m_sizer_right->Add(m_vebview_release_note, 0, wxEXPAND | wxRIGHT | wxLEFT, FromDIP(15));
|
||||||
|
|||||||
@@ -31,7 +31,7 @@ SafetyOptionsDialog::SafetyOptionsDialog(wxWindow* parent)
|
|||||||
SetSize(FromDIP(480),FromDIP(320));
|
SetSize(FromDIP(480),FromDIP(320));
|
||||||
|
|
||||||
m_scrollwindow = new wxScrolledWindow(this, wxID_ANY);
|
m_scrollwindow = new wxScrolledWindow(this, wxID_ANY);
|
||||||
m_scrollwindow->SetScrollRate(0, FromDIP(10));
|
m_scrollwindow->SetScrollRate(0, FromDIP(20));
|
||||||
m_scrollwindow->SetBackgroundColour(*wxWHITE);
|
m_scrollwindow->SetBackgroundColour(*wxWHITE);
|
||||||
m_scrollwindow->SetMinSize(wxSize(FromDIP(480), wxDefaultCoord));
|
m_scrollwindow->SetMinSize(wxSize(FromDIP(480), wxDefaultCoord));
|
||||||
m_scrollwindow->SetMaxSize(wxSize(FromDIP(480), wxDefaultCoord));
|
m_scrollwindow->SetMaxSize(wxSize(FromDIP(480), wxDefaultCoord));
|
||||||
@@ -272,4 +272,4 @@ void SafetyOptionsDialog::show_idel_heating_toast(const wxString &text)
|
|||||||
m_idel_heating_toast_timer.StartOnce(3000);
|
m_idel_heating_toast_timer.StartOnce(3000);
|
||||||
}
|
}
|
||||||
|
|
||||||
}} // namespace Slic3r::GUI
|
}} // namespace Slic3r::GUI
|
||||||
|
|||||||
@@ -148,7 +148,7 @@ SelectMachineDialog::SelectMachineDialog(Plater *plater)
|
|||||||
|
|
||||||
wxBoxSizer* m_scroll_sizer = new wxBoxSizer(wxVERTICAL);
|
wxBoxSizer* m_scroll_sizer = new wxBoxSizer(wxVERTICAL);
|
||||||
m_scroll_area = new wxScrolledWindow(this);
|
m_scroll_area = new wxScrolledWindow(this);
|
||||||
m_scroll_area->SetScrollRate(0, 20);
|
m_scroll_area->SetScrollRate(0, FromDIP(20));
|
||||||
m_scroll_area->SetBackgroundColour(m_colour_def_color);
|
m_scroll_area->SetBackgroundColour(m_colour_def_color);
|
||||||
m_scroll_area->SetMinSize(wxSize(FromDIP(700), FromDIP(600)));
|
m_scroll_area->SetMinSize(wxSize(FromDIP(700), FromDIP(600)));
|
||||||
m_scroll_area->SetMaxSize(wxSize(FromDIP(700), FromDIP(600)));
|
m_scroll_area->SetMaxSize(wxSize(FromDIP(700), FromDIP(600)));
|
||||||
@@ -707,7 +707,7 @@ SelectMachineDialog::SelectMachineDialog(Plater *plater)
|
|||||||
//show bind failed info
|
//show bind failed info
|
||||||
m_sw_print_failed_info = new wxScrolledWindow(this, wxID_ANY, wxDefaultPosition, wxSize(SELECT_MACHINE_DIALOG_SIMBOOK_SIZE2.x, FromDIP(125)), wxVSCROLL);
|
m_sw_print_failed_info = new wxScrolledWindow(this, wxID_ANY, wxDefaultPosition, wxSize(SELECT_MACHINE_DIALOG_SIMBOOK_SIZE2.x, FromDIP(125)), wxVSCROLL);
|
||||||
m_sw_print_failed_info->SetBackgroundColour(*wxWHITE);
|
m_sw_print_failed_info->SetBackgroundColour(*wxWHITE);
|
||||||
m_sw_print_failed_info->SetScrollRate(0, 5);
|
m_sw_print_failed_info->SetScrollRate(0, FromDIP(20));
|
||||||
m_sw_print_failed_info->SetMinSize(wxSize(SELECT_MACHINE_DIALOG_SIMBOOK_SIZE2.x, FromDIP(125)));
|
m_sw_print_failed_info->SetMinSize(wxSize(SELECT_MACHINE_DIALOG_SIMBOOK_SIZE2.x, FromDIP(125)));
|
||||||
m_sw_print_failed_info->SetMaxSize(wxSize(SELECT_MACHINE_DIALOG_SIMBOOK_SIZE2.x, FromDIP(125)));
|
m_sw_print_failed_info->SetMaxSize(wxSize(SELECT_MACHINE_DIALOG_SIMBOOK_SIZE2.x, FromDIP(125)));
|
||||||
|
|
||||||
|
|||||||
@@ -327,7 +327,7 @@ SelectMachinePopup::SelectMachinePopup(wxWindow *parent)
|
|||||||
m_scrolledWindow = new wxScrolledWindow(this, wxID_ANY, wxDefaultPosition, SELECT_MACHINE_LIST_SIZE, wxHSCROLL | wxVSCROLL);
|
m_scrolledWindow = new wxScrolledWindow(this, wxID_ANY, wxDefaultPosition, SELECT_MACHINE_LIST_SIZE, wxHSCROLL | wxVSCROLL);
|
||||||
m_scrolledWindow->SetBackgroundColour(*wxWHITE);
|
m_scrolledWindow->SetBackgroundColour(*wxWHITE);
|
||||||
m_scrolledWindow->SetMinSize(SELECT_MACHINE_LIST_SIZE);
|
m_scrolledWindow->SetMinSize(SELECT_MACHINE_LIST_SIZE);
|
||||||
m_scrolledWindow->SetScrollRate(0, 5);
|
m_scrolledWindow->SetScrollRate(0, SELECT_MACHINE_ITEM_SIZE.y);
|
||||||
auto m_sizxer_scrolledWindow = new wxBoxSizer(wxVERTICAL);
|
auto m_sizxer_scrolledWindow = new wxBoxSizer(wxVERTICAL);
|
||||||
m_scrolledWindow->SetSizer(m_sizxer_scrolledWindow);
|
m_scrolledWindow->SetSizer(m_sizxer_scrolledWindow);
|
||||||
m_scrolledWindow->Layout();
|
m_scrolledWindow->Layout();
|
||||||
|
|||||||
@@ -278,7 +278,7 @@ SendMultiMachinePage::SendMultiMachinePage(Plater* plater)
|
|||||||
|
|
||||||
m_main_scroll = new ScrolledWindow(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxVSCROLL);
|
m_main_scroll = new ScrolledWindow(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxVSCROLL);
|
||||||
m_main_scroll->SetBackgroundColour(*wxWHITE);
|
m_main_scroll->SetBackgroundColour(*wxWHITE);
|
||||||
m_main_scroll->SetScrollRate(5, 5);
|
m_main_scroll->SetScrollRate(5, FromDIP(20));
|
||||||
|
|
||||||
m_sizer_body = new wxBoxSizer(wxVERTICAL);
|
m_sizer_body = new wxBoxSizer(wxVERTICAL);
|
||||||
m_main_page = create_page();
|
m_main_page = create_page();
|
||||||
@@ -1353,7 +1353,7 @@ wxPanel* SendMultiMachinePage::create_page()
|
|||||||
|
|
||||||
scroll_macine_list = new wxScrolledWindow(main_page, wxID_ANY, wxDefaultPosition, wxSize(FromDIP(800), FromDIP(300)), wxHSCROLL | wxVSCROLL);
|
scroll_macine_list = new wxScrolledWindow(main_page, wxID_ANY, wxDefaultPosition, wxSize(FromDIP(800), FromDIP(300)), wxHSCROLL | wxVSCROLL);
|
||||||
scroll_macine_list->SetBackgroundColour(*wxWHITE);
|
scroll_macine_list->SetBackgroundColour(*wxWHITE);
|
||||||
scroll_macine_list->SetScrollRate(5, 5);
|
scroll_macine_list->SetScrollRate(5, FromDIP(SEND_ITEM_MAX_HEIGHT));
|
||||||
scroll_macine_list->SetMinSize(wxSize(FromDIP(DEVICE_ITEM_MAX_WIDTH), 10 * FromDIP(SEND_ITEM_MAX_HEIGHT)));
|
scroll_macine_list->SetMinSize(wxSize(FromDIP(DEVICE_ITEM_MAX_WIDTH), 10 * FromDIP(SEND_ITEM_MAX_HEIGHT)));
|
||||||
scroll_macine_list->SetMaxSize(wxSize(FromDIP(DEVICE_ITEM_MAX_WIDTH), 10 * FromDIP(SEND_ITEM_MAX_HEIGHT)));
|
scroll_macine_list->SetMaxSize(wxSize(FromDIP(DEVICE_ITEM_MAX_WIDTH), 10 * FromDIP(SEND_ITEM_MAX_HEIGHT)));
|
||||||
|
|
||||||
|
|||||||
@@ -384,7 +384,7 @@ SendToPrinterDialog::SendToPrinterDialog(Plater *plater)
|
|||||||
//show bind failed info
|
//show bind failed info
|
||||||
m_sw_print_failed_info = new wxScrolledWindow(this, wxID_ANY, wxDefaultPosition, wxSize(FromDIP(380), FromDIP(125)), wxVSCROLL);
|
m_sw_print_failed_info = new wxScrolledWindow(this, wxID_ANY, wxDefaultPosition, wxSize(FromDIP(380), FromDIP(125)), wxVSCROLL);
|
||||||
m_sw_print_failed_info->SetBackgroundColour(*wxWHITE);
|
m_sw_print_failed_info->SetBackgroundColour(*wxWHITE);
|
||||||
m_sw_print_failed_info->SetScrollRate(0, 5);
|
m_sw_print_failed_info->SetScrollRate(0, FromDIP(20));
|
||||||
m_sw_print_failed_info->SetMinSize(wxSize(FromDIP(380), FromDIP(125)));
|
m_sw_print_failed_info->SetMinSize(wxSize(FromDIP(380), FromDIP(125)));
|
||||||
m_sw_print_failed_info->SetMaxSize(wxSize(FromDIP(380), FromDIP(125)));
|
m_sw_print_failed_info->SetMaxSize(wxSize(FromDIP(380), FromDIP(125)));
|
||||||
|
|
||||||
|
|||||||
@@ -1302,7 +1302,7 @@ void PrintingTaskPanel::set_star_count(int star_count)
|
|||||||
StatusBasePanel::StatusBasePanel(wxWindow *parent, wxWindowID id, const wxPoint &pos, const wxSize &size, long style, const wxString &name)
|
StatusBasePanel::StatusBasePanel(wxWindow *parent, wxWindowID id, const wxPoint &pos, const wxSize &size, long style, const wxString &name)
|
||||||
: wxScrolledWindow(parent, id, pos, size, wxHSCROLL | wxVSCROLL)
|
: wxScrolledWindow(parent, id, pos, size, wxHSCROLL | wxVSCROLL)
|
||||||
{
|
{
|
||||||
this->SetScrollRate(25, 25);
|
SetScrollRate(25, FromDIP(20));
|
||||||
Slic3r::DeviceManager* dev = Slic3r::GUI::wxGetApp().getDeviceManager();
|
Slic3r::DeviceManager* dev = Slic3r::GUI::wxGetApp().getDeviceManager();
|
||||||
if (!dev) return;
|
if (!dev) return;
|
||||||
obj = dev->get_selected_machine();
|
obj = dev->get_selected_machine();
|
||||||
|
|||||||
@@ -700,7 +700,7 @@ SyncAmsInfoDialog::SyncAmsInfoDialog(wxWindow *parent, SyncInfo &info) :
|
|||||||
//wxBoxSizer *m_scroll_sizer = new wxBoxSizer(wxVERTICAL);
|
//wxBoxSizer *m_scroll_sizer = new wxBoxSizer(wxVERTICAL);
|
||||||
m_scrolledWindow = new wxScrolledWindow(m_show_page, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxVSCROLL);
|
m_scrolledWindow = new wxScrolledWindow(m_show_page, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxVSCROLL);
|
||||||
m_scrolledWindow->SetBackgroundColour(*wxWHITE);
|
m_scrolledWindow->SetBackgroundColour(*wxWHITE);
|
||||||
m_scrolledWindow->SetScrollRate(0, 20);
|
m_scrolledWindow->SetScrollRate(0, FromDIP(20));
|
||||||
m_scrolledWindow->SetMinSize(wxSize(-1, SyncAmsInfoDialogHeightMAX));
|
m_scrolledWindow->SetMinSize(wxSize(-1, SyncAmsInfoDialogHeightMAX));
|
||||||
m_scrolledWindow->SetMaxSize(wxSize(-1, SyncAmsInfoDialogHeightMAX));
|
m_scrolledWindow->SetMaxSize(wxSize(-1, SyncAmsInfoDialogHeightMAX));
|
||||||
m_scrolledWindow->EnableScrolling(false,true);
|
m_scrolledWindow->EnableScrolling(false,true);
|
||||||
|
|||||||
@@ -534,7 +534,7 @@ public:
|
|||||||
|
|
||||||
m_content = new wxScrolledWindow(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxVSCROLL);
|
m_content = new wxScrolledWindow(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxVSCROLL);
|
||||||
m_content->SetBackgroundColour(pop_bg);
|
m_content->SetBackgroundColour(pop_bg);
|
||||||
m_content->SetScrollRate(0, FromDIP(5));
|
m_content->SetScrollRate(0, FromDIP(20));
|
||||||
auto* outer = new wxBoxSizer(wxVERTICAL);
|
auto* outer = new wxBoxSizer(wxVERTICAL);
|
||||||
|
|
||||||
const int pop_w = std::max(FromDIP(213), popup_width);
|
const int pop_w = std::max(FromDIP(213), popup_width);
|
||||||
@@ -2274,7 +2274,7 @@ void TextureImportDialog::build_mapping_panel(wxWindow* parent, wxSizer* sizer)
|
|||||||
|
|
||||||
m_mapping_scroll = new wxScrolledWindow(parent, wxID_ANY, wxDefaultPosition,
|
m_mapping_scroll = new wxScrolledWindow(parent, wxID_ANY, wxDefaultPosition,
|
||||||
wxSize(-1, FromDIP(300)));
|
wxSize(-1, FromDIP(300)));
|
||||||
m_mapping_scroll->SetScrollRate(0, FromDIP(10));
|
m_mapping_scroll->SetScrollRate(0, FromDIP(20));
|
||||||
m_mapping_scroll->SetBackgroundColour(StateColor::darkModeColorFor(*wxWHITE));
|
m_mapping_scroll->SetBackgroundColour(StateColor::darkModeColorFor(*wxWHITE));
|
||||||
m_mapping_scroll->Bind(wxEVT_MOUSEWHEEL, &TextureImportDialog::dismiss_filament_popup_on_wheel, this);
|
m_mapping_scroll->Bind(wxEVT_MOUSEWHEEL, &TextureImportDialog::dismiss_filament_popup_on_wheel, this);
|
||||||
|
|
||||||
@@ -4335,7 +4335,7 @@ void TextureImportDialog::on_dpi_changed(const wxRect&)
|
|||||||
|
|
||||||
if (m_mapping_scroll) {
|
if (m_mapping_scroll) {
|
||||||
m_mapping_scroll->SetMinSize(wxSize(-1, FromDIP(300)));
|
m_mapping_scroll->SetMinSize(wxSize(-1, FromDIP(300)));
|
||||||
m_mapping_scroll->SetScrollRate(0, FromDIP(10));
|
m_mapping_scroll->SetScrollRate(0, FromDIP(20));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (m_btn_skip) {
|
if (m_btn_skip) {
|
||||||
|
|||||||
@@ -942,7 +942,7 @@ void UnsavedChangesDialog::build(Preset::Type type, PresetCollection *dependent_
|
|||||||
m_sizer_tab->Add(m_table_top, 1, 0, 0);
|
m_sizer_tab->Add(m_table_top, 1, 0, 0);
|
||||||
|
|
||||||
m_scrolledWindow = new wxScrolledWindow(m_panel_tab, wxID_ANY, wxDefaultPosition, UNSAVE_CHANGE_DIALOG_SCROLL_WINDOW_SIZE, wxNO_BORDER|wxVSCROLL);
|
m_scrolledWindow = new wxScrolledWindow(m_panel_tab, wxID_ANY, wxDefaultPosition, UNSAVE_CHANGE_DIALOG_SCROLL_WINDOW_SIZE, wxNO_BORDER|wxVSCROLL);
|
||||||
m_scrolledWindow->SetScrollRate(0, 5);
|
m_scrolledWindow->SetScrollRate(0, FromDIP(20));
|
||||||
m_scrolledWindow->SetBackgroundColour(GREY200);
|
m_scrolledWindow->SetBackgroundColour(GREY200);
|
||||||
m_sizer_bottom = new wxBoxSizer(wxVERTICAL);
|
m_sizer_bottom = new wxBoxSizer(wxVERTICAL);
|
||||||
m_sizer_bottom->Add(m_scrolledWindow, 1, wxEXPAND, 0);
|
m_sizer_bottom->Add(m_scrolledWindow, 1, wxEXPAND, 0);
|
||||||
|
|||||||
@@ -130,7 +130,7 @@ MsgUpdateConfig::MsgUpdateConfig(const std::vector<Update> &updates, bool force_
|
|||||||
m_sizer_right->Add(0, 0, 1, wxTOP, FromDIP(15));
|
m_sizer_right->Add(0, 0, 1, wxTOP, FromDIP(15));
|
||||||
|
|
||||||
auto m_scrollwindw_release_note = new wxScrolledWindow(this, wxID_ANY, wxDefaultPosition, wxSize(FromDIP(560), FromDIP(430)),wxVSCROLL);
|
auto m_scrollwindw_release_note = new wxScrolledWindow(this, wxID_ANY, wxDefaultPosition, wxSize(FromDIP(560), FromDIP(430)),wxVSCROLL);
|
||||||
m_scrollwindw_release_note->SetScrollRate(0, 5);
|
m_scrollwindw_release_note->SetScrollRate(0, FromDIP(20));
|
||||||
m_scrollwindw_release_note->SetBackgroundColour(wxColour(0xF8, 0xF8, 0xF8));
|
m_scrollwindw_release_note->SetBackgroundColour(wxColour(0xF8, 0xF8, 0xF8));
|
||||||
m_scrollwindw_release_note->SetMaxSize(wxSize(FromDIP(560), FromDIP(430)));
|
m_scrollwindw_release_note->SetMaxSize(wxSize(FromDIP(560), FromDIP(430)));
|
||||||
m_scrollwindw_release_note->SetWindowStyle(wxVSCROLL);
|
m_scrollwindw_release_note->SetWindowStyle(wxVSCROLL);
|
||||||
|
|||||||
@@ -1629,7 +1629,7 @@ UpgradePanel::UpgradePanel(wxWindow *parent, wxWindowID id, const wxPoint &pos,
|
|||||||
auto m_main_sizer = new wxBoxSizer(wxVERTICAL);
|
auto m_main_sizer = new wxBoxSizer(wxVERTICAL);
|
||||||
|
|
||||||
m_scrolledWindow = new wxScrolledWindow(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxVSCROLL);
|
m_scrolledWindow = new wxScrolledWindow(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxVSCROLL);
|
||||||
m_scrolledWindow->SetScrollRate(5, 25);
|
m_scrolledWindow->SetScrollRate(5, FromDIP(20));
|
||||||
|
|
||||||
m_machine_list_sizer = new wxBoxSizer(wxVERTICAL);
|
m_machine_list_sizer = new wxBoxSizer(wxVERTICAL);
|
||||||
|
|
||||||
|
|||||||
@@ -62,7 +62,7 @@ CheckList::CheckList(
|
|||||||
|
|
||||||
s_sizer = new wxBoxSizer(wxVERTICAL);
|
s_sizer = new wxBoxSizer(wxVERTICAL);
|
||||||
m_scroll_area = new wxScrolledWindow(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, scroll_style);
|
m_scroll_area = new wxScrolledWindow(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, scroll_style);
|
||||||
m_scroll_area->SetScrollRate(0, 10);
|
m_scroll_area->SetScrollRate(0, FromDIP(20));
|
||||||
m_scroll_area->SetSizer(s_sizer);
|
m_scroll_area->SetSizer(s_sizer);
|
||||||
m_scroll_area->SetBackgroundColour(parent->GetBackgroundColour());
|
m_scroll_area->SetBackgroundColour(parent->GetBackgroundColour());
|
||||||
m_scroll_area->Bind(wxEVT_RIGHT_DOWN, &CheckList::ShowMenu, this);
|
m_scroll_area->Bind(wxEVT_RIGHT_DOWN, &CheckList::ShowMenu, this);
|
||||||
@@ -223,4 +223,4 @@ void CheckList::ShowMenu(wxMouseEvent &evt)
|
|||||||
wxPoint screen_pos = src->ClientToScreen(evt.GetPosition());
|
wxPoint screen_pos = src->ClientToScreen(evt.GetPosition());
|
||||||
wxPoint local_pos = ScreenToClient(screen_pos);
|
wxPoint local_pos = ScreenToClient(screen_pos);
|
||||||
PopupMenu(&m, local_pos);
|
PopupMenu(&m, local_pos);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -199,7 +199,7 @@ bool ProgressDialog::Create(const wxString &title, const wxString &message, int
|
|||||||
m_sizer_main->Add(m_simplebook, 1, wxEXPAND | wxLEFT | wxRIGHT, FromDIP(28));
|
m_sizer_main->Add(m_simplebook, 1, wxEXPAND | wxLEFT | wxRIGHT, FromDIP(28));
|
||||||
} else {
|
} else {
|
||||||
m_msg_scrolledWindow = new wxScrolledWindow( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxVSCROLL );
|
m_msg_scrolledWindow = new wxScrolledWindow( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxVSCROLL );
|
||||||
m_msg_scrolledWindow->SetScrollRate(0,5);
|
m_msg_scrolledWindow->SetScrollRate(0, FromDIP(20));
|
||||||
wxBoxSizer* m_msg_sizer= new wxBoxSizer(wxVERTICAL);
|
wxBoxSizer* m_msg_sizer= new wxBoxSizer(wxVERTICAL);
|
||||||
|
|
||||||
m_msg = new wxStaticText(m_msg_scrolledWindow, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize(PROGRESSDIALOG_SIMPLEBOOK_SIZE.x, -1), 0);
|
m_msg = new wxStaticText(m_msg_scrolledWindow, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize(PROGRESSDIALOG_SIMPLEBOOK_SIZE.x, -1), 0);
|
||||||
|
|||||||
@@ -1222,7 +1222,7 @@ ImageTransientPopup::ImageTransientPopup( wxWindow *parent, bool scrolled, wxBit
|
|||||||
m_panel->SetSize(300, 300);
|
m_panel->SetSize(300, 300);
|
||||||
|
|
||||||
// And also actually enable them.
|
// And also actually enable them.
|
||||||
m_panel->SetScrollRate(10, 10);
|
m_panel->SetScrollRate(10, FromDIP(20));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -152,3 +152,94 @@ TEST_CASE("resolve_cli_input_path leaves inputs that must not be completed uncha
|
|||||||
REQUIRE(resolve_cli_input_path("").empty());
|
REQUIRE(resolve_cli_input_path("").empty());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST_CASE("sanitize_file_basename keeps only a plain file name from an untrusted name", "[Utils]") {
|
||||||
|
const std::string unicode = "\xe6\xa8\xa1\xe5\x9e\x8b \xc3\xa9t\xc3\xa9.3mf"; // UTF-8 CJK and accented Latin
|
||||||
|
const auto [input, expected] = GENERATE_COPY(table<std::string, std::string>({
|
||||||
|
{"normal.3mf", "normal.3mf"},
|
||||||
|
{"../../x.3mf", "x.3mf"},
|
||||||
|
{"..\\..\\x.3mf", "x.3mf"},
|
||||||
|
{"C:\\x.3mf", "x.3mf"},
|
||||||
|
{"C:x.3mf", "C_x.3mf"},
|
||||||
|
{"/etc/x", "x"},
|
||||||
|
{"a/b\\c.gcode", "c.gcode"},
|
||||||
|
{"x:stream", "x_stream"}, // no NTFS alternate data stream
|
||||||
|
{"x.", "x."},
|
||||||
|
{".3mf", ".3mf"},
|
||||||
|
{unicode, unicode},
|
||||||
|
}));
|
||||||
|
CAPTURE(input);
|
||||||
|
CHECK(sanitize_file_basename(input) == expected);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_CASE("sanitize_file_basename rejects names that do not name a file", "[Utils]") {
|
||||||
|
const std::string input = GENERATE(as<std::string>{}, "", ".", "..", "../..", "dir/", "..\\", " ", ". .", "...");
|
||||||
|
CAPTURE(input);
|
||||||
|
CHECK(sanitize_file_basename(input).empty());
|
||||||
|
}
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
void touch(const boost::filesystem::path &path) { std::ofstream(path.string()) << "existing"; }
|
||||||
|
std::string file_contents(const boost::filesystem::path &path)
|
||||||
|
{
|
||||||
|
std::ifstream file(path.string());
|
||||||
|
return std::string(std::istreambuf_iterator<char>(file), std::istreambuf_iterator<char>());
|
||||||
|
}
|
||||||
|
} // namespace
|
||||||
|
|
||||||
|
TEST_CASE("find_unused_filename keeps a name nothing uses", "[Utils]") {
|
||||||
|
ScopedTemporaryDir dir;
|
||||||
|
std::string name;
|
||||||
|
REQUIRE(find_unused_filename(dir.path(), "model.3mf", {}, name));
|
||||||
|
CHECK(name == "model.3mf");
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_CASE("find_unused_filename versions a name an existing file uses", "[Utils]") {
|
||||||
|
ScopedTemporaryDir dir;
|
||||||
|
touch(dir.path() / "model.3mf");
|
||||||
|
std::string name;
|
||||||
|
REQUIRE(find_unused_filename(dir.path(), "model.3mf", {}, name));
|
||||||
|
CHECK(name == "model(1).3mf");
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_CASE("find_unused_filename versions a name that maps onto an existing file once sanitized", "[Utils]") {
|
||||||
|
ScopedTemporaryDir dir;
|
||||||
|
touch(dir.path() / "my_model.3mf");
|
||||||
|
const std::string input = GENERATE(as<std::string>{}, "my?model.3mf", "my:model.3mf", "my*model.3mf");
|
||||||
|
CAPTURE(input);
|
||||||
|
std::string name;
|
||||||
|
REQUIRE(find_unused_filename(dir.path(), input, {}, name));
|
||||||
|
CHECK(name == "my_model(1).3mf");
|
||||||
|
CHECK(file_contents(dir.path() / "my_model.3mf") == "existing");
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_CASE("find_unused_filename treats the marker of another download as used", "[Utils]") {
|
||||||
|
ScopedTemporaryDir dir;
|
||||||
|
touch(download_marker_path(dir.path(), "model.3mf"));
|
||||||
|
std::string name;
|
||||||
|
REQUIRE(find_unused_filename(dir.path(), "model.3mf", {}, name));
|
||||||
|
CHECK(name == "model(1).3mf");
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_CASE("find_unused_filename ignores the marker of the download asking", "[Utils]") {
|
||||||
|
ScopedTemporaryDir dir;
|
||||||
|
const boost::filesystem::path own_marker = download_marker_path(dir.path(), "model.3mf");
|
||||||
|
touch(own_marker);
|
||||||
|
std::string name;
|
||||||
|
REQUIRE(find_unused_filename(dir.path(), "model.3mf", own_marker, name));
|
||||||
|
CHECK(name == "model.3mf");
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_CASE("find_unused_filename gives up after 999 versions", "[Utils]") {
|
||||||
|
ScopedTemporaryDir dir;
|
||||||
|
touch(dir.path() / "model.3mf");
|
||||||
|
for (int version = 1; version < 999; ++version)
|
||||||
|
touch(dir.path() / ("model(" + std::to_string(version) + ").3mf"));
|
||||||
|
std::string name;
|
||||||
|
REQUIRE(find_unused_filename(dir.path(), "model.3mf", {}, name));
|
||||||
|
CHECK(name == "model(999).3mf");
|
||||||
|
|
||||||
|
touch(dir.path() / name);
|
||||||
|
REQUIRE_FALSE(find_unused_filename(dir.path(), "model.3mf", {}, name));
|
||||||
|
CHECK(name == "model(999).3mf");
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user