diff --git a/src/slic3r/GUI/ImageGrid.cpp b/src/slic3r/GUI/ImageGrid.cpp index ae0722b76..90544c4a8 100644 --- a/src/slic3r/GUI/ImageGrid.cpp +++ b/src/slic3r/GUI/ImageGrid.cpp @@ -171,11 +171,11 @@ void Slic3r::GUI::ImageGrid::DoAction(size_t index, int action) return; } #ifdef __WXMSW__ - auto wfile = boost::filesystem::path(file.path).wstring(); + auto wfile = boost::filesystem::path(file.local_path).wstring(); SHELLEXECUTEINFO info{sizeof(info), 0, NULL, NULL, wfile.c_str(), L"", SW_HIDE}; ::ShellExecuteEx(&info); #else - wxShell("open " + file.path); + wxShell("open " + file.local_path); #endif } else { m_file_sys->DownloadCancel(index); @@ -197,9 +197,9 @@ void Slic3r::GUI::ImageGrid::DoAction(size_t index, int action) return; } #ifdef __WIN32__ - wxExecute(L"explorer.exe /select," + from_u8(file.path)); + wxExecute(L"explorer.exe /select," + from_u8(file.local_path)); #elif __APPLE__ - openFolderForFile(from_u8(file.path)); + openFolderForFile(from_u8(file.local_path)); #else #endif } diff --git a/src/slic3r/GUI/Printer/PrinterFileSystem.cpp b/src/slic3r/GUI/Printer/PrinterFileSystem.cpp index 8915e5f78..739d510a0 100644 --- a/src/slic3r/GUI/Printer/PrinterFileSystem.cpp +++ b/src/slic3r/GUI/Printer/PrinterFileSystem.cpp @@ -46,7 +46,7 @@ PrinterFileSystem::PrinterFileSystem() for (int i = 0; i < 100; ++i) { auto name = wxString::Format(L"img-%03d.jpg", i + 1); wxImage im(L"D:\\work\\pic\\" + name); - m_file_list.push_back({name.ToUTF8().data(), time.GetTicks(), 26937, i > 3 ? im : default_thumbnail, i < 20 ? FF_DOWNLOAD : 0, i * 10 - 40 - 1}); + m_file_list.push_back({name.ToUTF8().data(), "", time.GetTicks(), 26937, i > 3 ? im : default_thumbnail, i < 20 ? FF_DOWNLOAD : 0, i * 10 - 40 - 1}); time.Add(wxDateSpan::Days(-1)); } m_file_list[0].thumbnail = default_thumbnail; @@ -99,10 +99,11 @@ void PrinterFileSystem::ListAllFiles() SendRequest(LIST_INFO, req, [this](json const& resp, FileList & list, auto) { json files = resp["file_lists"]; for (auto& f : files) { - std::string name = f["name"]; - time_t time = f.value("time", 0); + std::string name = f["name"]; + std::string path = f.value("path", ""); + time_t time = f.value("time", 0); boost::uint64_t size = f["size"]; - File ff = {name, time, size, default_thumbnail}; + File ff = {name, path, time, size, default_thumbnail}; list.push_back(ff); } return 0; @@ -120,7 +121,7 @@ void PrinterFileSystem::ListAllFiles() if (!iter1->thumbnail.IsOk()) iter1->flags &= ~FF_THUMNAIL; iter1->progress = iter2->progress; - iter1->path = iter2->path; + iter1->local_path = iter2->local_path; ++iter1; ++iter2; } else if (*iter1 < *iter2) { ++iter1; @@ -174,7 +175,7 @@ void PrinterFileSystem::DownloadFiles(size_t index, std::string const &path) if ((file.flags & FF_DOWNLOAD) != 0 && file.progress >= 0) continue; file.flags |= FF_DOWNLOAD; file.progress = -1; - file.path = (boost::filesystem::path(path) / file.name).string(); + file.local_path = (boost::filesystem::path(path) / file.name).string(); ++n; } if (n == 0) return; @@ -186,7 +187,7 @@ void PrinterFileSystem::DownloadFiles(size_t index, std::string const &path) return; file.flags |= FF_DOWNLOAD; file.progress = -1; - file.path = (boost::filesystem::path(path) / file.name).string(); + file.local_path = (boost::filesystem::path(path) / file.name).string(); } if ((m_task_flags & FF_DOWNLOAD) == 0) DownloadNextFile(); @@ -202,7 +203,7 @@ void PrinterFileSystem::DownloadCheckFiles(std::string const &path) if (boost::filesystem::file_size(path2, ec) == file.size) { file.flags |= FF_DOWNLOAD; file.progress = 100; - file.path = path2.string(); + file.local_path = path2.string(); } } } @@ -212,11 +213,11 @@ bool PrinterFileSystem::DownloadCheckFile(size_t index) if (index >= m_file_list.size()) return false; auto &file = m_file_list[index]; if ((file.flags & FF_DOWNLOAD) == 0) return false; - if (!boost::filesystem::exists(file.path)) { + if (!boost::filesystem::exists(file.local_path)) { file.flags &= ~FF_DOWNLOAD; file.progress = 0; - file.path.clear(); - SendChangedEvent(EVT_DOWNLOAD, index, file.path); + file.local_path.clear(); + SendChangedEvent(EVT_DOWNLOAD, index, file.local_path); return false; } return true; @@ -243,7 +244,7 @@ size_t PrinterFileSystem::GetCount() const size_t PrinterFileSystem::GetIndexAtTime(boost::uint32_t time) { - auto iter = std::upper_bound(m_file_list.begin(), m_file_list.end(), File{"", time}); + auto iter = std::upper_bound(m_file_list.begin(), m_file_list.end(), File{"", "", time}); size_t n = std::distance(m_file_list.begin(), iter) - 1; if (m_group_mode == G_NONE) { return n; @@ -440,27 +441,37 @@ void PrinterFileSystem::DeleteFilesContinue() { std::vector indexes; std::vector names; + std::vector paths; for (size_t i = 0; i < m_file_list.size(); ++i) 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) + auto &file = m_file_list[i]; + if (file.path.empty()) + names.push_back(file.name); + else + paths.push_back(file.path); + if (names.size() >= 64 || paths.size() >= 64) break; } m_task_flags &= ~FF_DELETED; - if (names.empty()) + if (names.empty() && paths.empty()) return; json req; json arr; - for (auto &name : names) arr.push_back(name); - req["delete"] = arr; + if (paths.empty()) { + for (auto &name : names) arr.push_back(name); + req["delete"] = arr; + } else { + for (auto &path : paths) arr.push_back(path); + req["paths"] = arr; + } m_task_flags |= FF_DELETED; SendRequest( FILE_DEL, req, nullptr, - [indexes, names, this](int, Void const &) { + [indexes, names = paths.empty() ? names : paths, bypath = !paths.empty(), this](int, Void const &) { // TODO: for (size_t i = indexes.size() - 1; i != size_t(-1); --i) - FileRemoved(indexes[i], names[i]); + FileRemoved(indexes[i], names[i], bypath); SendChangedEvent(EVT_FILE_CHANGED, indexes.size()); DeleteFilesContinue(); }); @@ -479,7 +490,10 @@ void PrinterFileSystem::DownloadNextFile() if (index >= m_file_list.size()) return; json req; - req["file"] = m_file_list[index].name; + if (m_file_list[index].path.empty()) + req["file"] = m_file_list[index].name; + else + req["path"] = m_file_list[index].path; m_file_list[index].progress = 0; SendChangedEvent(EVT_DOWNLOAD, index, m_file_list[index].name); struct Download @@ -487,13 +501,15 @@ void PrinterFileSystem::DownloadNextFile() size_t index; std::string name; std::string path; + std::string local_path; boost::filesystem::ofstream ofs; boost::uuids::detail::md5 boost_md5; }; std::shared_ptr download(new Download); download->index = index; - download->name = m_file_list[index].name; - download->path = m_file_list[index].path; + download->name = m_file_list[index].name; + download->path = m_file_list[index].path; + download->local_path = m_file_list[index].local_path; m_task_flags |= FF_DOWNLOAD; m_download_seq = SendRequest( FILE_DOWNLOAD, req, @@ -503,7 +519,7 @@ void PrinterFileSystem::DownloadNextFile() prog.size = resp["offset"]; prog.total = resp["total"]; if (prog.size == 0) { - download->ofs.open(download->path, std::ios::binary); + download->ofs.open(download->local_path, std::ios::binary); if (!download->ofs) return FILE_OPEN_ERR; } // receive data @@ -528,13 +544,13 @@ void PrinterFileSystem::DownloadNextFile() } if (result != 0) { boost::system::error_code ec; - boost::filesystem::remove(download->path, ec); + boost::filesystem::remove(download->local_path, ec); } return result; }, [this, download](int result, Progress const &data) { - if (download->index != size_t(-1)) - download->index = FindFile(download->index, download->name); + if (download->index != size_t(-1)) + download->index = FindFile(download->index, download->path.empty() ? download->name : download->path, !download->path.empty()); if (download->index != size_t(-1)) { int progress = data.size * 100 / data.total; auto & file = m_file_list[download->index]; @@ -542,7 +558,7 @@ void PrinterFileSystem::DownloadNextFile() file.flags &= ~FF_DOWNLOAD; else if (file.progress != progress) { file.progress = progress; - SendChangedEvent(EVT_DOWNLOAD, download->index, file.path, result); + SendChangedEvent(EVT_DOWNLOAD, download->index, file.local_path, result); } } if (result != CONTINUE) DownloadNextFile(); @@ -557,20 +573,29 @@ void PrinterFileSystem::UpdateFocusThumbnail() size_t start = m_lock_start; size_t end = std::min(m_lock_end, GetCount()); std::vector names; + std::vector paths; for (; start < end; ++start) { auto &file = GetFile(start); if ((file.flags & FF_THUMNAIL) == 0) { - names.push_back(file.name); - if (names.size() >= 5) + if (file.path.empty()) + names.push_back(file.name); + else + paths.push_back(file.path + "#thumbnail"); + if (names.size() >= 5 || paths.size() >= 5) break; } } - if (names.empty()) + if (names.empty() && paths.empty()) return; json req; json arr; - for (auto &name : names) arr.push_back(name); - req["files"] = arr; + if (paths.empty()) { + for (auto &name : names) arr.push_back(name); + req["files"] = arr; + } else { + for (auto &path : paths) arr.push_back(path); + req["paths"] = arr; + } m_task_flags |= FF_THUMNAIL; SendRequest( THUMBNAIL, req, @@ -578,9 +603,11 @@ void PrinterFileSystem::UpdateFocusThumbnail() // in work thread, continue recv // receive data wxString mimetype = resp.value("mimetype", "image/jpeg"); - std::string thumbnail = resp["thumbnail"]; + std::string thumbnail = resp.value("thumbnail", ""); + std::string path = resp.value("path", ""); boost::uint32_t size = resp["size"]; - thumb.name = thumbnail; + thumb.name = thumbnail; + thumb.path = path; if (size > 0) { wxMemoryInputStream mis(data, size); thumb.thumbnail = wxImage(mis, mimetype); @@ -590,7 +617,10 @@ void PrinterFileSystem::UpdateFocusThumbnail() [this](int result, Thumbnail const &thumb) { auto n = thumb.name.find_last_of('.'); auto name = n == std::string::npos ? thumb.name : thumb.name.substr(0, n); - auto iter = std::find_if(m_file_list.begin(), m_file_list.end(), [&name](auto &f) { return boost::algorithm::starts_with(f.name, name); }); + n = thumb.path.find_last_of('#'); + auto path = n == std::string::npos ? thumb.path : thumb.path.substr(0, n); + auto iter = path.empty() ? std::find_if(m_file_list.begin(), m_file_list.end(), [&name](auto &f) { return boost::algorithm::starts_with(f.name, name); }) : + std::find_if(m_file_list.begin(), m_file_list.end(), [&path](auto &f) { return f.path == path; }); if (iter != m_file_list.end()) { iter->flags |= FF_THUMNAIL; // DOTO: retry on fail if (thumb.thumbnail.IsOk()) { @@ -604,19 +634,20 @@ void PrinterFileSystem::UpdateFocusThumbnail() }); } -size_t PrinterFileSystem::FindFile(size_t index, std::string const &name) +size_t PrinterFileSystem::FindFile(size_t index, std::string const &name, bool by_path) { - if (index >= m_file_list.size() || m_file_list[index].name != name) { - auto iter = std::find_if(m_file_list.begin(), m_file_list.end(), [name](File &f) { return f.name == name; }); + if (index >= m_file_list.size() || (by_path ? m_file_list[index].path : m_file_list[index].name) != name) { + auto iter = std::find_if(m_file_list.begin(), m_file_list.end(), + [name, by_path](File &f) { return (by_path ? f.path : f.name) == name; }); if (iter == m_file_list.end()) return -1; index = std::distance(m_file_list.begin(), iter); } return index; } -void PrinterFileSystem::FileRemoved(size_t index, std::string const &name) +void PrinterFileSystem::FileRemoved(size_t index, std::string const &name, bool by_path) { - index = FindFile(index, name); + index = FindFile(index, name, by_path); if (index == size_t(-1)) return; auto removeFromGroup = [](std::vector &group, size_t index, int total) { @@ -778,6 +809,8 @@ void PrinterFileSystem::RecvMessageThread() l.lock(); if (n == 0) { HandleResponse(l, sample); + } else if (n == Bambu_stream_end) { + Reconnect(l, 3); } else if (n == Bambu_would_block) { m_cond.timed_wait(l, boost::posix_time::milliseconds(m_messages.empty() && m_callbacks.empty() ? 1000 : 20)); } else { diff --git a/src/slic3r/GUI/Printer/PrinterFileSystem.h b/src/slic3r/GUI/Printer/PrinterFileSystem.h index 66e41f2d6..c40ae2d25 100644 --- a/src/slic3r/GUI/Printer/PrinterFileSystem.h +++ b/src/slic3r/GUI/Printer/PrinterFileSystem.h @@ -91,12 +91,13 @@ public: struct File { std::string name; + std::string path; time_t time = 0; boost::uint64_t size = 0; wxBitmap thumbnail; int flags = 0; int progress = -1; // -1: waiting - std::string path; + std::string local_path; bool IsSelect() const { return flags & FF_SELECT; } bool IsDownload() const { return flags & FF_DOWNLOAD; } @@ -111,6 +112,7 @@ public: struct Thumbnail { std::string name; + std::string path; wxBitmap thumbnail; }; @@ -180,9 +182,9 @@ private: void UpdateFocusThumbnail(); - void FileRemoved(size_t index, std::string const &name); + void FileRemoved(size_t index, std::string const &name, bool by_path); - size_t FindFile(size_t index, std::string const &name); + size_t FindFile(size_t index, std::string const &name, bool by_path); void SendChangedEvent(wxEventType type, size_t index = (size_t)-1, std::string const &str = {}, long extra = 0);