MCPcopy Create free account
hub / github.com/aiekick/ImGuiFileDialog / SelectOrDeselectFileName

Method SelectOrDeselectFileName

ImGuiFileDialog.cpp:2488–2561  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

2486}
2487
2488void 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;

Callers 1

m_SelectableItemMethod · 0.80

Calls 5

endMethod · 0.80
sizeMethod · 0.80
clearMethod · 0.80
SearchForTagMethod · 0.80
emptyMethod · 0.80

Tested by

no test coverage detected