| 2486 | } |
| 2487 | |
| 2488 | void IGFD::FileManager::SelectOrDeselectFileName(const FileDialogInternal& vFileDialogInternal, const std::shared_ptr<FileInfos>& vInfos) { |
| 2489 | if (!vInfos.use_count()) { |
| 2490 | return; |
| 2491 | } |
| 2492 | |
| 2493 | if (ImGui::IsKeyDown(ImGuiMod_Ctrl)) { |
| 2494 | if (dLGcountSelectionMax == 0) { // infinite selection |
| 2495 | if (m_SelectedFileNames.find(vInfos->fileNameExt) == m_SelectedFileNames.end()) { // not found +> add |
| 2496 | m_AddFileNameInSelection(vInfos->fileNameExt, true); |
| 2497 | } else { // found +> remove |
| 2498 | m_RemoveFileNameInSelection(vInfos->fileNameExt); |
| 2499 | } |
| 2500 | } else { // selection limited by size |
| 2501 | if (m_SelectedFileNames.size() < dLGcountSelectionMax) { |
| 2502 | if (m_SelectedFileNames.find(vInfos->fileNameExt) == m_SelectedFileNames.end()) { // not found +> add |
| 2503 | m_AddFileNameInSelection(vInfos->fileNameExt, true); |
| 2504 | } else { // found +> remove |
| 2505 | m_RemoveFileNameInSelection(vInfos->fileNameExt); |
| 2506 | } |
| 2507 | } |
| 2508 | } |
| 2509 | } else if (ImGui::IsKeyDown(ImGuiMod_Shift)) { |
| 2510 | if (dLGcountSelectionMax != 1) { |
| 2511 | m_SelectedFileNames.clear(); |
| 2512 | // we will iterate filelist and get the last selection after the start selection |
| 2513 | bool startMultiSelection = false; |
| 2514 | std::string fileNameToSelect = vInfos->fileNameExt; |
| 2515 | std::string savedLastSelectedFileName; // for invert selection mode |
| 2516 | for (const auto& file : m_FileList) { |
| 2517 | if (!file.use_count()) { |
| 2518 | continue; |
| 2519 | } |
| 2520 | bool canTake = true; |
| 2521 | if (!file->SearchForTag(vFileDialogInternal.searchManager.searchTag)) canTake = false; |
| 2522 | if (canTake) { // if not filtered, we will take files who are filtered by the dialog |
| 2523 | if (file->fileNameExt == m_LastSelectedFileName) { |
| 2524 | startMultiSelection = true; |
| 2525 | m_AddFileNameInSelection(m_LastSelectedFileName, false); |
| 2526 | } else if (startMultiSelection) { |
| 2527 | if (dLGcountSelectionMax == 0) { // infinite selection |
| 2528 | m_AddFileNameInSelection(file->fileNameExt, false); |
| 2529 | } else { // selection limited by size |
| 2530 | if (m_SelectedFileNames.size() < dLGcountSelectionMax) { |
| 2531 | m_AddFileNameInSelection(file->fileNameExt, false); |
| 2532 | } else { |
| 2533 | startMultiSelection = false; |
| 2534 | if (!savedLastSelectedFileName.empty()) m_LastSelectedFileName = savedLastSelectedFileName; |
| 2535 | break; |
| 2536 | } |
| 2537 | } |
| 2538 | } |
| 2539 | |
| 2540 | if (file->fileNameExt == fileNameToSelect) { |
| 2541 | if (!startMultiSelection) { // we are before the last Selected FileName, so we must inverse |
| 2542 | savedLastSelectedFileName = m_LastSelectedFileName; |
| 2543 | m_LastSelectedFileName = fileNameToSelect; |
| 2544 | fileNameToSelect = savedLastSelectedFileName; |
| 2545 | startMultiSelection = true; |
no test coverage detected