From 633d14e7116680f706259103924d6bf8a8050b91 Mon Sep 17 00:00:00 2001 From: "chunmao.guo" Date: Sun, 9 Oct 2022 10:46:52 +0800 Subject: [PATCH] FIX: crash when delete media file in PrinterFileSystem Change-Id: I9783bbfc9c9979b6da662b917b6f5cf4db04aa69 --- src/slic3r/GUI/ImageGrid.cpp | 11 ++++++++--- src/slic3r/GUI/Printer/PrinterFileSystem.cpp | 16 ++++++++-------- 2 files changed, 16 insertions(+), 11 deletions(-) diff --git a/src/slic3r/GUI/ImageGrid.cpp b/src/slic3r/GUI/ImageGrid.cpp index d604a1faa..25f2fd50f 100644 --- a/src/slic3r/GUI/ImageGrid.cpp +++ b/src/slic3r/GUI/ImageGrid.cpp @@ -188,8 +188,10 @@ void ImageGrid::UpdateLayout() if (!m_file_sys) return; wxSize size = GetClientSize(); wxSize mask_size{0, 60 * em_unit(this) / 10}; - if (m_file_sys->GetGroupMode() == PrinterFileSystem::G_NONE) + if (m_file_sys->GetGroupMode() == PrinterFileSystem::G_NONE) { mask_size.y = 20 * em_unit(this) / 10; + size.y -= mask_size.y; + } int cell_width = m_cell_size.GetWidth(); int cell_height = m_cell_size.GetHeight(); int ncol = (size.GetWidth() - cell_width + m_image_size.GetWidth()) / cell_width; @@ -365,13 +367,16 @@ void ImageGrid::paintEvent(wxPaintEvent& evt) size_t Slic3r::GUI::ImageGrid::firstItem(wxSize const &size, wxPoint &off) { + int size_y = size.y; + if (m_file_sys->GetGroupMode() == PrinterFileSystem::G_NONE) + size_y -= m_mask.GetHeight(); int offx = (size.x - (m_col_count - 1) * m_cell_size.GetWidth() - m_image_size.GetWidth()) / 2; int offy = (m_row_offset + 1 < m_row_count || m_row_count == 0) ? m_cell_size.GetHeight() - m_image_size.GetHeight() - m_row_offset * m_cell_size.GetHeight() / 4 + m_row_offset / 4 * m_cell_size.GetHeight() : - size.y - (size.y + m_image_size.GetHeight() - 1) / m_cell_size.GetHeight() * m_cell_size.GetHeight(); + size_y - (size_y + m_image_size.GetHeight() - 1) / m_cell_size.GetHeight() * m_cell_size.GetHeight(); int index = (m_row_offset + 1 < m_row_count || m_row_count == 0) ? m_row_offset / 4 * m_col_count : - ((m_file_sys->GetCount() + m_col_count - 1) / m_col_count - (size.y + m_image_size.GetHeight() - 1) / m_cell_size.GetHeight()) * m_col_count; + ((m_file_sys->GetCount() + m_col_count - 1) / m_col_count - (size_y + m_image_size.GetHeight() - 1) / m_cell_size.GetHeight()) * m_col_count; if (m_file_sys->GetGroupMode() == PrinterFileSystem::G_NONE) offy += m_mask.GetHeight(); off = wxPoint{offx, offy}; diff --git a/src/slic3r/GUI/Printer/PrinterFileSystem.cpp b/src/slic3r/GUI/Printer/PrinterFileSystem.cpp index f14ce46c8..20cd478ef 100644 --- a/src/slic3r/GUI/Printer/PrinterFileSystem.cpp +++ b/src/slic3r/GUI/Printer/PrinterFileSystem.cpp @@ -320,7 +320,7 @@ void PrinterFileSystem::DeleteFilesContinue() std::vector indexes; std::vector names; for (size_t i = 0; i < m_file_list.size(); ++i) - if ((m_file_list[i].flags & FF_SELECT) && !m_file_list[i].name.empty()) { + if ((m_file_list[i].flags & FF_DELETED) && !m_file_list[i].name.empty()) { indexes.push_back(i); names.push_back(m_file_list[i].name); if (names.size() >= 64) @@ -338,7 +338,7 @@ void PrinterFileSystem::DeleteFilesContinue() FILE_DEL, req, nullptr, [indexes, names, this](int, Void const &) { // TODO: - for (size_t i = indexes.size() - 1; i >= 0; --i) + for (size_t i = indexes.size() - 1; i != size_t(-1); --i) FileRemoved(indexes[i], names[i]); SendChangedEvent(EVT_FILE_CHANGED); DeleteFilesContinue(); @@ -363,11 +363,11 @@ void PrinterFileSystem::DownloadNextFile(std::string const &path) SendChangedEvent(EVT_DOWNLOAD, index, m_file_list[index].name); struct Download { - int index; - std::string name; - std::string path; + size_t index; + std::string name; + std::string path; boost::filesystem::ofstream ofs; - boost::uuids::detail::md5 boost_md5; + boost::uuids::detail::md5 boost_md5; }; std::shared_ptr download(new Download); download->index = index; @@ -412,9 +412,9 @@ void PrinterFileSystem::DownloadNextFile(std::string const &path) return result; }, [this, download](int result, Progress const &data) { - if (download->index >= 0) + if (download->index != size_t(-1)) download->index = FindFile(download->index, download->name); - if (download->index >= 0) { + if (download->index != size_t(-1)) { int progress = data.size * 100 / data.total; if (result > CONTINUE) progress = -2;