GUI: fix IGFD glitch when opening empty dir

This commit is contained in:
tildearrow 2023-03-24 00:52:11 -05:00
parent caa2a71d39
commit 6f8cfa42ea
2 changed files with 35 additions and 7 deletions

View File

@ -26,6 +26,7 @@ SOFTWARE.
*/ */
#include "ImGuiFileDialog.h" #include "ImGuiFileDialog.h"
#include "../../src/ta-log.h"
#ifdef __cplusplus #ifdef __cplusplus
@ -1202,11 +1203,13 @@ namespace IGFD
SetDefaultFileName("."); SetDefaultFileName(".");
else else
SetDefaultFileName(""); SetDefaultFileName("");
logV("IGFD: OpenCurrentPath()");
ScanDir(vFileDialogInternal, GetCurrentPath()); ScanDir(vFileDialogInternal, GetCurrentPath());
} }
void IGFD::FileManager::SortFields(const FileDialogInternal& vFileDialogInternal, const SortingFieldEnum& vSortingField, const bool vCanChangeOrder) void IGFD::FileManager::SortFields(const FileDialogInternal& vFileDialogInternal, const SortingFieldEnum& vSortingField, const bool vCanChangeOrder)
{ {
logV("IGFD: SortFields()");
if (vSortingField != SortingFieldEnum::FIELD_NONE) if (vSortingField != SortingFieldEnum::FIELD_NONE)
{ {
puHeaderFileName = tableHeaderFileNameString; puHeaderFileName = tableHeaderFileNameString;
@ -1216,10 +1219,17 @@ namespace IGFD
#ifdef USE_THUMBNAILS #ifdef USE_THUMBNAILS
puHeaderFileThumbnails = tableHeaderFileThumbnailsString; puHeaderFileThumbnails = tableHeaderFileThumbnailsString;
#endif // #ifdef USE_THUMBNAILS #endif // #ifdef USE_THUMBNAILS
} } else {
logV("IGFD: sorting by NONE!");
}
if (prFileList.empty()) {
logV("IGFD: with an empty file list?");
}
if (vSortingField == SortingFieldEnum::FIELD_FILENAME) if (vSortingField == SortingFieldEnum::FIELD_FILENAME)
{ {
logV("IGFD: sorting by name");
if (vCanChangeOrder && puSortingField == vSortingField) { if (vCanChangeOrder && puSortingField == vSortingField) {
//printf("Change the sorting\n"); //printf("Change the sorting\n");
puSortingDirection[0] = true;//!puSortingDirection[0]; puSortingDirection[0] = true;//!puSortingDirection[0];
@ -1289,6 +1299,7 @@ namespace IGFD
} }
else if (vSortingField == SortingFieldEnum::FIELD_TYPE) else if (vSortingField == SortingFieldEnum::FIELD_TYPE)
{ {
logV("IGFD: sorting by type");
if (vCanChangeOrder && puSortingField == vSortingField) if (vCanChangeOrder && puSortingField == vSortingField)
puSortingDirection[1] = !puSortingDirection[1]; puSortingDirection[1] = !puSortingDirection[1];
@ -1327,6 +1338,7 @@ namespace IGFD
} }
else if (vSortingField == SortingFieldEnum::FIELD_SIZE) else if (vSortingField == SortingFieldEnum::FIELD_SIZE)
{ {
logV("IGFD: sorting by size");
if (vCanChangeOrder && puSortingField == vSortingField) if (vCanChangeOrder && puSortingField == vSortingField)
puSortingDirection[2] = !puSortingDirection[2]; puSortingDirection[2] = !puSortingDirection[2];
@ -1367,6 +1379,7 @@ namespace IGFD
} }
else if (vSortingField == SortingFieldEnum::FIELD_DATE) else if (vSortingField == SortingFieldEnum::FIELD_DATE)
{ {
logV("IGFD: sorting by date");
if (vCanChangeOrder && puSortingField == vSortingField) if (vCanChangeOrder && puSortingField == vSortingField)
puSortingDirection[3] = !puSortingDirection[3]; puSortingDirection[3] = !puSortingDirection[3];
@ -1458,6 +1471,8 @@ namespace IGFD
puSortingField = vSortingField; puSortingField = vSortingField;
} }
logV("IGFD: applying filtering on file list");
ApplyFilteringOnFileList(vFileDialogInternal); ApplyFilteringOnFileList(vFileDialogInternal);
} }
@ -1518,14 +1533,17 @@ namespace IGFD
void IGFD::FileManager::ScanDir(const FileDialogInternal& vFileDialogInternal, const std::string& vPath) void IGFD::FileManager::ScanDir(const FileDialogInternal& vFileDialogInternal, const std::string& vPath)
{ {
std::string path = vPath; std::string path = vPath;
logV("IGFD: ScanDir(%s)",vPath);
if (prCurrentPathDecomposition.empty()) if (prCurrentPathDecomposition.empty())
{ {
logV("IGFD: the current path decomposition is empty. setting.");
SetCurrentDir(path); SetCurrentDir(path);
} }
if (!prCurrentPathDecomposition.empty()) if (!prCurrentPathDecomposition.empty())
{ {
logV("IGFD: the current path decomposition is not empty. trying.");
#ifdef WIN32 #ifdef WIN32
if (path == puFsRoot) if (path == puFsRoot)
path += std::string(1u, PATH_SEP); path += std::string(1u, PATH_SEP);
@ -1553,6 +1571,7 @@ namespace IGFD
#else // dirent #else // dirent
struct dirent** files = nullptr; struct dirent** files = nullptr;
int n = scandir(path.c_str(), &files, nullptr, inAlphaSort); int n = scandir(path.c_str(), &files, nullptr, inAlphaSort);
logV("IGFD: %d entries in directory",n);
if (n>0) if (n>0)
{ {
int i; int i;
@ -1620,11 +1639,18 @@ namespace IGFD
} }
free(files); free(files);
} } else {
logV("IGFD: it's empty");
}
#endif // USE_STD_FILESYSTEM #endif // USE_STD_FILESYSTEM
logV("IGFD: sorting fields...");
SortFields(vFileDialogInternal, puSortingField, false); SortFields(vFileDialogInternal, puSortingField, false);
} } else {
logE("IGFD: current path decomposition is empty!");
}
fileListActuallyEmpty=prFileList.empty();
} }
bool IGFD::FileManager::GetDrives() bool IGFD::FileManager::GetDrives()
@ -2436,7 +2462,7 @@ namespace IGFD
void IGFD::FileDialogInternal::ResetForNewDialog() void IGFD::FileDialogInternal::ResetForNewDialog()
{ {
puFileManager.fileListActuallyEmpty=false;
} }
///////////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////////
@ -3737,16 +3763,17 @@ namespace IGFD
fdFilter.SetDefaultFilterIfNotDefined(); fdFilter.SetDefaultFilterIfNotDefined();
// init list of files // init list of files
if (fdFile.IsFileListEmpty() && !fdFile.puShowDrives) if (fdFile.IsFileListEmpty() && !fdFile.puShowDrives && !fdFile.fileListActuallyEmpty)
{ {
IGFD::Utils::ReplaceString(fdFile.puDLGDefaultFileName, fdFile.puDLGpath, ""); // local path IGFD::Utils::ReplaceString(fdFile.puDLGDefaultFileName, fdFile.puDLGpath, ""); // local path
if (!fdFile.puDLGDefaultFileName.empty()) if (!fdFile.puDLGDefaultFileName.empty())
{ {
fdFile.SetDefaultFileName(fdFile.puDLGDefaultFileName); fdFile.SetDefaultFileName(fdFile.puDLGDefaultFileName);
fdFilter.SetSelectedFilterWithExt(fdFilter.puDLGdefaultExt); fdFilter.SetSelectedFilterWithExt(fdFilter.puDLGdefaultExt);
} } else if (fdFile.puDLGDirectoryMode) { // directory mode
else if (fdFile.puDLGDirectoryMode) // directory mode
fdFile.SetDefaultFileName("."); fdFile.SetDefaultFileName(".");
}
logV("IGFD: fdFile.IsFileListEmpty() and !fdFile.puShowDrives");
fdFile.ScanDir(prFileDialogInternal, fdFile.puDLGpath); fdFile.ScanDir(prFileDialogInternal, fdFile.puDLGpath);
} }

View File

@ -875,6 +875,7 @@ namespace IGFD
#endif #endif
SortingFieldEnum puSortingField = SortingFieldEnum::FIELD_FILENAME; // detail view sorting column SortingFieldEnum puSortingField = SortingFieldEnum::FIELD_FILENAME; // detail view sorting column
bool puShowDrives = false; // drives are shown (only on os windows) bool puShowDrives = false; // drives are shown (only on os windows)
bool fileListActuallyEmpty = false;
std::string puDLGpath; // base path set by user when OpenDialog/OpenModal was called std::string puDLGpath; // base path set by user when OpenDialog/OpenModal was called
std::string puDLGDefaultFileName; // base default file path name set by user when OpenDialog/OpenModal was called std::string puDLGDefaultFileName; // base default file path name set by user when OpenDialog/OpenModal was called