49#define IGFD_VERSION "v0.6.9 WIP"
50#define IGFD_IMGUI_SUPPORTED_VERSION "1.92.3"
53#ifndef CUSTOM_IMGUIFILEDIALOG_CONFIG
56#include CUSTOM_IMGUIFILEDIALOG_CONFIG
176struct IGFD_Thumbnail_Info {
177 int isReadyToDisplay = 0;
178 int isReadyToUpload = 0;
179 int isLoadingOrLoaded = 0;
180 int textureWidth = 0;
181 int textureHeight = 0;
182 int textureChannels = 0;
183 unsigned char* textureFileDatas = 0;
194#ifndef IMGUI_DEFINE_MATH_OPERATORS
195#define IMGUI_DEFINE_MATH_OPERATORS
199#include IMGUI_INCLUDE
210#include <condition_variable>
219#include <unordered_map>
221#ifndef defaultSortField
222#define defaultSortField FIELD_FILENAME
225#ifndef defaultSortOrderFilename
226#define defaultSortOrderFilename true
228#ifndef defaultSortOrderType
229#define defaultSortOrderType true
231#ifndef defaultSortOrderSize
232#define defaultSortOrderSize true
234#ifndef defaultSortOrderDate
235#define defaultSortOrderDate true
237#ifndef defaultSortOrderThumbnails
238#define defaultSortOrderThumbnails true
241#ifndef MAX_FILE_DIALOG_NAME_BUFFER
242#define MAX_FILE_DIALOG_NAME_BUFFER 1024
245#ifndef MAX_PATH_BUFFER_SIZE
246#define MAX_PATH_BUFFER_SIZE 1024
250#define EXT_MAX_LEVEL 10U
256class SearchableVector {
258 std::unordered_map<T, size_t> m_Dico;
259 std::vector<T> m_Array;
267 return m_Array.empty();
269 size_t size()
const {
270 return m_Array.size();
272 T& operator[](
const size_t& vIdx) {
273 return m_Array[vIdx];
275 T& at(
const size_t& vIdx) {
276 return m_Array.at(vIdx);
278 typename std::vector<T>::iterator begin() {
279 return m_Array.begin();
281 typename std::vector<T>::const_iterator begin()
const {
282 return m_Array.begin();
284 typename std::vector<T>::iterator end() {
285 return m_Array.end();
287 typename std::vector<T>::const_iterator end()
const {
288 return m_Array.end();
291 bool try_add(T vKey) {
293 m_Dico[vKey] = m_Array.size();
294 m_Array.push_back(vKey);
300 bool try_set_existing(T vKey) {
302 auto row = m_Dico.at(vKey);
309 bool exist(
const std::string& vKey)
const {
310 return (m_Dico.find(vKey) != m_Dico.end());
318 friend class TestUtils;
329 static bool ImSplitter(
bool split_vertically,
float thickness,
float* size1,
float* size2,
float min_size1,
float min_size2,
float splitter_long_axis_size = -1.0f);
330 static bool ReplaceString(std::string& str,
const std::string& oldStr,
const std::string& newStr,
const size_t& vMaxRecursion = 10U);
331 static void AppendToBuffer(
char* vBuffer,
size_t vBufferLen,
const std::string& vStr);
332 static void ResetBuffer(
char* vBuffer);
333 static void SetBuffer(
char* vBuffer,
size_t vBufferLen,
const std::string& vStr);
334 static std::string UTF8Encode(
const std::wstring& wstr);
335 static std::wstring UTF8Decode(
const std::string& str);
336 static std::vector<std::string> SplitStringToVector(
const std::string& vText,
const std::string& vDelimiterPattern,
const bool vPushEmpty);
337 static std::vector<std::string> SplitStringToVector(
const std::string& vText,
const char& vDelimiter,
const bool vPushEmpty);
338 static std::string LowerCaseString(
const std::string& vString);
339 static size_t GetCharCountInString(
const std::string& vString,
const char& vChar);
340 static size_t GetLastCharPosWithMinCharCount(
const std::string& vString,
const char& vChar,
const size_t& vMinCharCount);
341 static std::string GetPathSeparator();
342 static std::string RoundNumber(
double vvalue,
int n);
343 static std::pair<std::string, std::string> FormatFileSize(
size_t vByteSize);
344 static bool NaturalCompare(
const std::string& vA,
const std::string& vB,
bool vInsensitiveCase,
bool vDescending);
347 static bool M_IsAValidCharExt(
const char& c);
348 static bool M_IsAValidCharSuffix(
const char& c);
349 static bool M_ExtractNumFromStringAtPos(
const std::string& str,
size_t& pos,
double& vOutNum);
354 typedef std::function<bool(
const FileInfos&, FileStyle&)> FileStyleFunctor;
357 ImVec4
color = ImVec4(0, 0, 0, 0);
359 ImFont* font =
nullptr;
364 FileStyle(
const FileStyle& vStyle);
365 FileStyle(
const ImVec4& vColor,
const std::string& vIcon =
"", ImFont* vFont =
nullptr);
370 std::string searchTag;
371 char searchBuffer[MAX_FILE_DIALOG_NAME_BUFFER] =
"";
372 bool searchInputIsActive =
false;
376 void DrawSearchBar(FileDialogInternal& vFileDialogInternal);
384 std::string empty_string;
388 SearchableVector<std::string> filters;
389 SearchableVector<std::string> filters_optimized;
390 std::vector<std::regex> filters_regex;
391 size_t count_dots = 0U;
396 const std::string& getFirstFilter()
const;
397 bool regexExist(
const std::string& vFilter)
const;
398 bool exist(
const FileInfos& vFileInfos,
bool vIsCaseInsensitive)
const;
399 void setCollectionTitle(
const std::string& vTitle);
400 void addFilter(
const std::string& vFilter,
const bool vIsRegex);
401 void addCollectionFilter(
const std::string& vFilter,
const bool vIsRegex);
402 static std::string transformAsteriskBasedFilterToRegex(
const std::string& vFilter);
406 friend class TestFilterManager;
408 std::vector<FilterInfos> m_ParsedFilters;
409 std::unordered_map<IGFD_FileStyleFlags, std::unordered_map<std::string, std::shared_ptr<FileStyle> > > m_FilesStyle;
411 std::vector<FileStyle::FileStyleFunctor> m_FilesStyleFunctors;
412 FilterInfos m_SelectedFilter;
415 std::string dLGFilters;
416 std::string dLGdefaultExt;
419 const FilterInfos& GetSelectedFilter()
const;
420 void ParseFilters(
const char* vFilters);
421 void SetSelectedFilterWithExt(
const std::string& vFilter);
422 bool FillFileStyle(std::shared_ptr<FileInfos> vFileInfos)
const;
423 void SetFileStyle(
const IGFD_FileStyleFlags& vFlags,
const char* vCriteria,
const FileStyle& vInfos);
424 void SetFileStyle(
const IGFD_FileStyleFlags& vFlags,
const char* vCriteria,
const ImVec4& vColor,
const std::string& vIcon,
426 void SetFileStyle(FileStyle::FileStyleFunctor vFunctor);
427 bool GetFileStyle(
const IGFD_FileStyleFlags& vFlags,
const std::string& vCriteria, ImVec4* vOutColor, std::string* vOutIcon,
429 void ClearFilesStyle();
430 bool IsCoveredByFilters(
const FileInfos& vFileInfos,
431 bool vIsCaseInsensitive)
const;
432 float GetFilterComboBoxWidth()
const;
433 bool DrawFilterComboBox(FileDialogInternal& vFileDialogInternal);
434 std::string ReplaceExtentionWithCurrentFilterIfNeeded(
const std::string& vFileName,
436 void SetDefaultFilterIfNotDefined();
441 enum class ContentType {
450 ContentType m_Content = ContentType::Invalid;
451 bool m_Symlink =
false;
455 FileType(
const ContentType& vContentType,
const bool vIsSymlink);
457 void SetContent(
const ContentType& vContentType);
458 void SetSymLink(
const bool vIsSymlink);
460 bool isValid()
const;
463 bool isLinkToUnknown()
const;
464 bool isSymLink()
const;
469 bool operator<(
const FileType& rhs)
const;
470 bool operator>(
const FileType& rhs)
const;
475 static std::shared_ptr<FileInfos> create();
480 std::array<std::string, EXT_MAX_LEVEL> fileExtLevels;
481 std::array<std::string, EXT_MAX_LEVEL> fileExtLevels_optimized;
483 std::array<std::string, EXT_MAX_LEVEL> fileNameLevels;
484 std::array<std::string, EXT_MAX_LEVEL> fileNameLevels_optimized;
485 size_t countExtDot = 0U;
487 std::string filePath;
488 std::string fileName;
489 std::string fileNameExt;
490 std::string fileNameExt_optimized;
491 std::string deviceInfos;
492 std::string tooltipMessage;
493 int32_t tooltipColumn = -1;
494 size_t fileSize = 0U;
495 std::pair<std::string, std::string> formatedFileSize;
496 std::string fileModifDate;
497 std::shared_ptr<FileStyle> fileStyle =
nullptr;
499 IGFD_Thumbnail_Info thumbnailInfo;
503 bool SearchForTag(
const std::string& vTag)
const;
504 bool SearchForExt(
const std::string& vExt,
const bool vIsCaseInsensitive,
505 const size_t& vMaxLevel = EXT_MAX_LEVEL)
const;
506 bool SearchForExts(
const std::string& vComaSepExts,
const bool vIsCaseInsensitive,
507 const size_t& vMaxLevel = EXT_MAX_LEVEL)
const;
508 bool FinalizeFileTypeParsing(
const size_t& vMaxDotToExtract);
511typedef std::pair<std::string, std::string> PathDisplayedName;
515 virtual ~IFileSystem() =
default;
517 virtual bool IsDirectoryCanBeOpened(
const std::string& vName) = 0;
519 virtual bool IsDirectoryExist(
const std::string& vName) = 0;
521 virtual bool IsFileExist(
const std::string& vName) = 0;
523 virtual bool CreateDirectoryIfNotExist(
const std::string& vName) = 0;
525 virtual IGFD::Utils::PathStruct ParsePathFileName(
const std::string& vPathFileName) = 0;
527 virtual std::vector<IGFD::FileInfos> ScanDirectory(
const std::string& vPath) = 0;
529 virtual bool IsDirectory(
const std::string& vFilePathName) = 0;
531 virtual std::vector<IGFD::PathDisplayedName> GetDevicesList() = 0;
533 virtual void GetFileDateAndSize(
const std::string& vFilePathName,
const IGFD::FileType& vFileType, std::string& voDate,
size_t& voSize) = 0;
537 friend class TestFileManager;
539 enum class SortingFieldEnum {
549 std::string m_CurrentPath;
550 std::vector<std::string> m_CurrentPathDecomposition;
551 std::vector<std::shared_ptr<FileInfos> > m_FileList;
552 std::vector<std::shared_ptr<FileInfos> > m_FilteredFileList;
553 std::vector<std::shared_ptr<FileInfos> > m_PathList;
554 std::vector<std::shared_ptr<FileInfos> > m_FilteredPathList;
555 std::vector<std::string>::iterator m_PopupComposedPath;
556 std::string m_LastSelectedFileName;
557 std::set<std::string> m_SelectedFileNames;
558 bool m_CreateDirectoryMode =
false;
559 std::string m_FileSystemName;
560 std::unique_ptr<IFileSystem> m_FileSystemPtr =
nullptr;
563 bool inputPathActivated =
false;
564 bool devicesClicked =
false;
565 bool pathClicked =
false;
566 char inputPathBuffer[MAX_PATH_BUFFER_SIZE] =
"";
567 char variadicBuffer[MAX_FILE_DIALOG_NAME_BUFFER] =
"";
568 char fileNameBuffer[MAX_FILE_DIALOG_NAME_BUFFER] =
"";
569 char directoryNameBuffer[MAX_FILE_DIALOG_NAME_BUFFER] =
"";
570 std::string headerFileName;
571 std::string headerFileType;
572 std::string headerFileSize;
573 std::string headerFileDate;
575 std::string headerFileThumbnails;
576 bool sortingDirection[5] = {
577 defaultSortOrderFilename, defaultSortOrderType, defaultSortOrderSize, defaultSortOrderDate, defaultSortOrderThumbnails};
579 bool sortingDirection[4] = {
580 defaultSortOrderFilename, defaultSortOrderType, defaultSortOrderSize, defaultSortOrderDate};
582 SortingFieldEnum sortingField = SortingFieldEnum::FIELD_FILENAME;
583 bool showDevices =
false;
586 std::string dLGDefaultFileName;
587 size_t dLGcountSelectionMax = 1U;
588 bool dLGDirectoryMode =
false;
593 void m_CompleteFileInfos(
const std::shared_ptr<FileInfos>& vInfos);
594 void m_RemoveFileNameInSelection(
const std::string& vFileName);
595 void m_AddFileNameInSelection(
const std::string& vFileName,
bool vSetLastSelectionFileName);
596 void m_AddFile(
const FileDialogInternal& vFileDialogInternal,
const std::string& vPath,
const std::string& vFileName,
597 const FileType& vFileType);
598 void m_AddPath(
const FileDialogInternal& vFileDialogInternal,
const std::string& vPath,
const std::string& vFileName,
599 const FileType& vFileType);
600 void m_ScanDirForPathSelection(
const FileDialogInternal& vFileDialogInternal,
601 const std::string& vPath);
602 void m_OpenPathPopup(
const FileDialogInternal& vFileDialogInternal,
603 std::vector<std::string>::iterator vPathIter);
604 void m_SetCurrentPath(std::vector<std::string>::iterator vPathIter);
605 void m_ApplyFilteringOnFileList(
const FileDialogInternal& vFileDialogInternal, std::vector<std::shared_ptr<FileInfos> >& vFileInfosList, std::vector<std::shared_ptr<FileInfos> >& vFileInfosFilteredList);
606 static bool M_SortStrings(
const FileDialogInternal& vFileDialogInternal,
607 const bool vInsensitiveCase,
const bool vDescendingOrder,
608 const std::string& vA,
const std::string& vB);
609 void m_SortFields(
const FileDialogInternal& vFileDialogInternal, std::vector<std::shared_ptr<FileInfos> >& vFileInfosList,
610 std::vector<std::shared_ptr<FileInfos> >& vFileInfosFilteredList);
611 bool m_CompleteFileInfosWithUserFileAttirbutes(
const FileDialogInternal& vFileDialogInternal,
const std::shared_ptr<FileInfos>& vInfos);
615 bool IsComposerEmpty()
const;
616 size_t GetComposerSize()
const;
617 bool IsFileListEmpty()
const;
618 bool IsPathListEmpty()
const;
619 bool IsFilteredListEmpty()
const;
620 bool IsPathFilteredListEmpty()
const;
621 size_t GetFullFileListSize()
const;
622 std::shared_ptr<FileInfos> GetFullFileAt(
size_t vIdx);
623 size_t GetFilteredListSize()
const;
624 size_t GetPathFilteredListSize()
const;
625 std::shared_ptr<FileInfos> GetFilteredFileAt(
size_t vIdx);
626 std::shared_ptr<FileInfos> GetFilteredPathAt(
size_t vIdx);
627 std::vector<std::string>::iterator GetCurrentPopupComposedPath()
const;
628 bool IsFileNameSelected(
const std::string& vFileName);
629 std::string GetBack();
630 void ClearComposer();
631 void ClearFileLists();
632 void ClearPathLists();
634 void ApplyFilteringOnFileList(
const FileDialogInternal& vFileDialogInternal);
635 void SortFields(
const FileDialogInternal& vFileDialogInternal);
636 void OpenCurrentPath(
const FileDialogInternal& vFileDialogInternal);
638 bool CreateDir(
const std::string& vPath);
639 std::string ComposeNewPath(std::vector<std::string>::iterator vIter);
640 bool SetPathOnParentDirectoryIfAny();
641 std::string GetCurrentPath();
642 void SetCurrentPath(
const std::string& vCurrentPath);
643 void SetDefaultFileName(
const std::string& vFileName);
644 bool SelectDirectory(
const std::shared_ptr<FileInfos>& vInfos);
645 void SelectAllFileNames();
646 void SelectFileName(
const std::shared_ptr<FileInfos>& vInfos);
647 void SelectOrDeselectFileName(
const FileDialogInternal& vFileDialogInternal,
const std::shared_ptr<FileInfos>& vInfos);
648 void SetCurrentDir(
const std::string& vPath);
649 void ScanDir(
const FileDialogInternal& vFileDialogInternal,
650 const std::string& vPath);
651 std::string GetResultingPath();
652 std::string GetResultingFileName(FileDialogInternal& vFileDialogInternal,
IGFD_ResultMode vFlag);
653 std::string GetResultingFilePathName(FileDialogInternal& vFileDialogInternal,
IGFD_ResultMode vFlag);
654 std::map<std::string, std::string> GetResultingSelection(FileDialogInternal& vFileDialogInternal,
IGFD_ResultMode vFlag);
656 void DrawDirectoryCreation(
const FileDialogInternal& vFileDialogInternal);
657 void DrawPathComposer(
const FileDialogInternal& vFileDialogInternal);
659 IFileSystem* GetFileSystemInstance()
const {
660 return m_FileSystemPtr.get();
662 const std::string& GetFileSystemName()
const {
663 return m_FileSystemName;
667typedef void* UserDatas;
668typedef std::function<void(
const char*, UserDatas,
bool*)> PaneFun;
669typedef std::function<bool(FileInfos*, UserDatas)> UserFileAttributesFun;
673 std::string fileName;
674 std::string filePathName;
675 int32_t countSelectionMax = 1;
676 UserDatas userDatas =
nullptr;
679 float sidePaneWidth = 250.0f;
680 UserFileAttributesFun userFileAttributes;
685 FileManager fileManager;
686 FilterManager filterManager;
687 SearchManager searchManager;
691 bool showDialog =
false;
692 ImVec2 dialogCenterPos = ImVec2(0, 0);
693 int lastImGuiFrameCount = 0;
694 float footerHeight = 0.0f;
695 bool canWeContinue =
true;
696 bool okResultToConfirm =
false;
698 bool fileInputIsActive =
false;
699 bool fileListViewIsActive =
false;
701 std::string dLGtitle;
702 bool needToExitDialog =
false;
703 bool puUseCustomLocale =
false;
704 int localeCategory = LC_ALL;
705 std::string localeBegin;
706 std::string localeEnd;
709 FileDialogConfig m_DialogConfig;
714 void ResetForNewDialog();
716 void configureDialog(
717 const std::string& vKey,
718 const std::string& vTitle,
719 const char* vFilters,
720 const FileDialogConfig& vConfig);
721 const FileDialogConfig& getDialogConfig()
const;
722 FileDialogConfig& getDialogConfigRef();
730 void m_NewThumbnailFrame(FileDialogInternal& vFileDialogInternal);
731 void m_EndThumbnailFrame(FileDialogInternal& vFileDialogInternal);
732 void m_QuitThumbnailFrame(FileDialogInternal& vFileDialogInternal);
736 typedef std::function<void(IGFD_Thumbnail_Info*)> CreateThumbnailFun;
737 typedef std::function<void(IGFD_Thumbnail_Info*)> DestroyThumbnailFun;
740 enum class DisplayModeEnum { FILE_LIST = 0, THUMBNAILS_LIST, THUMBNAILS_GRID };
743 uint32_t m_CountFiles = 0U;
744 bool m_IsWorking =
false;
745 std::shared_ptr<std::thread> m_ThumbnailGenerationThread =
nullptr;
746 std::list<std::shared_ptr<FileInfos> > m_ThumbnailFileDatasToGet;
747 std::mutex m_ThumbnailFileDatasToGetMutex;
748 std::condition_variable m_ThumbnailFileDatasToGetCv;
749 std::list<std::shared_ptr<FileInfos> > m_ThumbnailToCreate;
750 std::mutex m_ThumbnailToCreateMutex;
751 std::list<IGFD_Thumbnail_Info> m_ThumbnailToDestroy;
752 std::mutex m_ThumbnailToDestroyMutex;
754 CreateThumbnailFun m_CreateThumbnailFun =
nullptr;
755 DestroyThumbnailFun m_DestroyThumbnailFun =
nullptr;
758 DisplayModeEnum m_DisplayMode = DisplayModeEnum::FILE_LIST;
761 void m_VariadicProgressBar(
float fraction,
const ImVec2& size_arg,
const char* fmt, ...);
765 void m_StartThumbnailFileDatasExtraction();
766 bool m_StopThumbnailFileDatasExtraction();
767 void m_ThreadThumbnailFileDatasExtractionFunc();
768 void m_DrawThumbnailGenerationProgress();
769 void m_AddThumbnailToLoad(
const std::shared_ptr<FileInfos>& vFileInfos);
770 void m_AddThumbnailToCreate(
const std::shared_ptr<FileInfos>& vFileInfos);
771 void m_AddThumbnailToDestroy(
const IGFD_Thumbnail_Info& vIGFD_Thumbnail_Info);
772 void m_DrawDisplayModeToolBar();
773 void m_ClearThumbnails(FileDialogInternal& vFileDialogInternal);
776 void SetCreateThumbnailCallback(
const CreateThumbnailFun& vCreateThumbnailFun);
777 void SetDestroyThumbnailCallback(
const DestroyThumbnailFun& vCreateThumbnailFun);
780 void ManageGPUThumbnails();
788#ifdef USE_PLACES_FEATURE
794 bool canBeSaved =
true;
796 float thickness = 0.0f;
800 bool canBeSaved =
false;
801 size_t displayOrder = 0U;
802 bool defaultOpened =
false;
803 bool canBeEdited =
false;
804 char editBuffer[MAX_FILE_DIALOG_NAME_BUFFER] =
"";
805 int32_t selectedPlaceForEdition = -1;
806 ImGuiTreeNodeFlags collapsingHeaderFlag = ImGuiTreeNodeFlags_None;
807 ImGuiListClipper clipper;
809 std::vector<PlaceStruct> places;
811 const std::string& vPlaceName,
812 const std::string& vPlacePath,
813 const bool vCanBeSaved,
814 const FileStyle& vStyle = {});
815 void AddPlaceSeparator(
const float& vThickness = 1.0f);
817 const std::string& vPlaceName);
821 std::unordered_map<std::string, std::shared_ptr<GroupStruct> > m_Groups;
822 std::map<size_t, std::weak_ptr<GroupStruct> > m_OrderedGroups;
825 float m_PlacesPaneWidth = 200.0f;
826 bool m_PlacesPaneShown =
false;
829 void m_InitPlaces(FileDialogInternal& vFileDialogInternal);
830 void m_DrawPlacesButton();
831 bool m_DrawPlacesPane(FileDialogInternal& vFileDialogInternal,
const ImVec2& vSize);
834 std::string SerializePlaces(
835 const bool vForceSerialisationForAll =
true);
836 void DeserializePlaces(
837 const std::string& vPlaces);
839 const std::string& vGroupName,
840 const size_t& vDisplayOrder,
841 const bool vCanBeEdited =
false,
842 const bool vOpenedByDefault =
true);
843 bool RemovePlacesGroup(
const std::string& vGroupName);
844 GroupStruct* GetPlacesGroupPtr(
const std::string& vGroupName);
851 KeyExplorerFeature();
853#ifdef USE_EXPLORATION_BY_KEYS
855 bool m_LocateFileByInputChar_lastFound =
false;
856 ImWchar m_LocateFileByInputChar_lastChar = 0;
857 float m_FlashAlpha = 0.0f;
858 float m_FlashAlphaAttenInSecs = 1.0f;
859 int m_LocateFileByInputChar_InputQueueCharactersSize = 0;
860 size_t m_FlashedItem = 0;
861 size_t m_LocateFileByInputChar_lastFileIdx = 0;
864 void m_LocateByInputKey(FileDialogInternal& vFileDialogInternal);
865 bool m_LocateItem_Loop(FileDialogInternal& vFileDialogInternal,
867 void m_ExploreWithkeys(FileDialogInternal& vFileDialogInternal,
868 ImGuiID vListViewID);
869 void m_StartFlashItem(
size_t vIdx);
870 bool m_BeginFlashItem(
size_t vIdx);
871 static void m_EndFlashItem();
872 static bool m_FlashableSelectable(
const char* label,
bool selected =
false, ImGuiSelectableFlags flags = 0,
bool vFlashing =
false,
873 const ImVec2& size = ImVec2(0, 0));
876 void SetFlashingAttenuationInSeconds(
881class IGFD_API FileDialog :
public PlacesFeature,
public KeyExplorerFeature,
public ThumbnailFeature {
883 FileDialogInternal m_FileDialogInternal;
884 ImGuiListClipper m_FileListClipper;
885 ImGuiListClipper m_PathListClipper;
886 float prOkCancelButtonWidth = 0.0f;
887 ImGuiWindowFlags m_CurrentDisplayedFlags;
893 static FileDialog* Instance(FileDialog* vCopy =
nullptr,
bool vForce =
false) {
894 static FileDialog _instance;
895 static FileDialog* _instance_copy =
nullptr;
896 if (vCopy || vForce) {
897 _instance_copy = vCopy;
899 if (_instance_copy) {
900 return _instance_copy;
905 static std::unique_ptr<FileDialog>& initSingleton(FileDialog* vCopy =
nullptr,
bool vForce =
false) {
906 static auto mp_instance = std::unique_ptr<FileDialog>(
new FileDialog());
907 static std::unique_ptr<FileDialog> mp_instance_copy;
908 if (vCopy !=
nullptr || vForce) {
909 if (vCopy !=
nullptr) {
910 mp_instance_copy = std::unique_ptr<FileDialog>(vCopy);
912 mp_instance_copy.release();
915 if (mp_instance_copy !=
nullptr) {
916 return mp_instance_copy;
920 static FileDialog& ref() {
return *initSingleton().get(); }
921 static void unitSingleton() {
922 initSingleton(
nullptr,
true);
923 initSingleton().reset();
929 virtual ~FileDialog();
932 virtual void OpenDialog(
933 const std::string& vKey,
934 const std::string& vTitle,
935 const char* vFilters,
936 const FileDialogConfig& vConfig = {});
940 const std::string& vKey,
941 ImGuiWindowFlags vFlags = ImGuiWindowFlags_NoCollapse,
942 ImVec2 vMinSize = ImVec2(0, 0),
943 ImVec2 vMaxSize = ImVec2(FLT_MAX, FLT_MAX));
948 bool WasOpenedThisFrame(
const std::string& vKey)
const;
949 bool WasOpenedThisFrame()
const;
950 bool IsOpened(
const std::string& vKey)
const;
951 bool IsOpened()
const;
952 std::string GetOpenedKey()
const;
960 std::string GetCurrentPath();
961 std::string GetCurrentFilter();
962 UserDatas GetUserDatas()
const;
967 const char* vCriteria,
968 const FileStyle& vInfos);
972 const char* vCriteria,
973 const ImVec4& vColor,
974 const std::string& vIcon =
"",
975 ImFont* vFont =
nullptr);
976 void SetFileStyle(FileStyle::FileStyleFunctor vFunctor);
979 const std::string& vCriteria,
981 std::string* vOutIcon =
nullptr,
982 ImFont** vOutFont =
nullptr);
983 void ClearFilesStyle();
986 const int& vLocaleCategory,
987 const std::string& vLocaleBegin,
988 const std::string& vLocaleEnd);
996 bool m_Confirm_Or_OpenOverWriteFileDialog_IfNeeded(
bool vLastAction, ImGuiWindowFlags vFlags);
1000 virtual void m_DrawHeader();
1001 virtual void m_DrawContent();
1002 virtual bool m_DrawFooter();
1005 virtual void m_DisplayPathPopup(ImVec2 vSize);
1006 virtual bool m_DrawValidationButtons();
1007 virtual bool m_DrawOkButton();
1008 virtual bool m_DrawCancelButton();
1009 virtual void m_DrawSidePane(
float vHeight);
1010 virtual bool m_Selectable(
int vRowIdx,
const char* vLabel,
bool vSelected, ImGuiSelectableFlags vFlags,
const ImVec2& vSizeArg);
1011 virtual void m_SelectableItem(
int vRowIdx, std::shared_ptr<FileInfos> vInfos,
bool vSelected,
const char* vFmt, ...);
1012 virtual void m_drawColumnText(
int vColIdx,
const char* vFmt,
const char* vLabel,
bool vSelected,
bool vHovered);
1013 virtual void m_rightAlignText(
const char* text,
const char* maxWidthText);
1014 virtual void m_DrawFileListView(ImVec2 vSize);
1016#ifdef USE_THUMBNAILS
1017 virtual void m_DrawThumbnailsListView(ImVec2 vSize);
1018 virtual void m_DrawThumbnailsGridView(ImVec2 vSize);
1025 void m_BeginFileColorIconStyle(std::shared_ptr<FileInfos> vFileInfos,
bool& vOutShowColor, std::string& vOutStr,
1027 void m_EndFileColorIconStyle(
const bool vShowColor, ImFont* vFont);
1029 void m_DisplayFileInfosTooltip(
const int32_t& vRowIdx,
const int32_t& vColumnIdx, std::shared_ptr<FileInfos> vFileInfos);
1041#define IGFD_C_API extern "C" IGFD_API
1042typedef IGFD::UserDatas IGFDUserDatas;
1043typedef IGFD::PaneFun IGFDPaneFun;
1086#ifdef USE_THUMBNAILS
1087typedef void (*IGFD_CreateThumbnailFun)(IGFD_Thumbnail_Info*);
1088typedef void (*IGFD_DestroyThumbnailFun)(IGFD_Thumbnail_Info*);
1095 const char* vFilters,
1101 ImGuiWindowFlags vFlags,
1120 const char* vCurrentOpenedKey);
1151 const char* vFilter,
1153 const char* vIconText,
1159 const char* vFilter,
1160 float vR,
float vG,
float vB,
1162 const char* vIconText,
1167 const char* vFilter,
1169 char** vOutIconText,
1177 const int vCategory,
1178 const char* vBeginLocale,
1179 const char* vEndLocale);
1181#ifdef USE_EXPLORATION_BY_KEYS
1182IGFD_C_API void IGFD_SetFlashingAttenuationInSeconds(
1188#ifdef USE_PLACES_FEATURE
1192 bool vDontSerializeCodeBasedPlaces);
1197 const char* vPlaces);
1201 const char* vGroupName,
1202 size_t vDisplayOrder,
1207 const char* vGroupName);
1211 const char* vGroupName,
1212 const char* vPlaceName,
1213 const char* vPlacePath,
1215 const char* vIconText);
1219 const char* vGroupName,
1220 const char* vPlaceName);
1224#ifdef USE_THUMBNAILS
1227 IGFD_CreateThumbnailFun vCreateThumbnailFun);
1231 IGFD_DestroyThumbnailFun vDestroyThumbnailFun);
IGFD_C_API IGFD_FileDialog_Config IGFD_FileDialog_Config_Get()
Definition ImGuiFileDialog.cpp:4881
IGFD_C_API void SetLocales(ImGuiFileDialog *vContextPtr, const int vCategory, const char *vBeginLocale, const char *vEndLocale)
Definition ImGuiFileDialog.cpp:5194
int ImGuiFileDialogFlags
Definition ImGuiFileDialog.h:85
IGFD_C_API void IGFD_Selection_Pair_DestroyContent(IGFD_Selection_Pair *vSelection_Pair)
Definition ImGuiFileDialog.cpp:4903
IGFD_C_API IGFD_Selection IGFD_GetSelection(ImGuiFileDialog *vContextPtr, IGFD_ResultMode vMode)
Definition ImGuiFileDialog.cpp:5012
IGFD_C_API void * IGFD_GetUserDatas(ImGuiFileDialog *vContextPtr)
Definition ImGuiFileDialog.cpp:5144
IGFD_C_API void IGFD_SetFileStyle2(ImGuiFileDialog *vContextPtr, IGFD_FileStyleFlags vFileStyleFlags, const char *vFilter, float vR, float vG, float vB, float vA, const char *vIconText, ImFont *vFont)
Definition ImGuiFileDialog.cpp:5160
IGFD_C_API char * IGFD_GetFilePathName(ImGuiFileDialog *vContextPtr, IGFD_ResultMode vMode)
Definition ImGuiFileDialog.cpp:5056
IGFD_FileStyleFlags_
Definition ImGuiFileDialog.h:75
@ IGFD_FileStyleByTypeLink
Definition ImGuiFileDialog.h:79
@ IGFD_FileStyleByTypeFile
Definition ImGuiFileDialog.h:77
@ IGFD_FileStyleByTypeDir
Definition ImGuiFileDialog.h:78
@ IGFD_FileStyleByExtention
Definition ImGuiFileDialog.h:80
@ IGFD_FileStyleByContainedInFullName
Definition ImGuiFileDialog.h:82
@ IGFD_FileStyleByFullName
Definition ImGuiFileDialog.h:81
@ IGFD_FileStyle_None
Definition ImGuiFileDialog.h:76
struct ImGuiFileDialog ImGuiFileDialog
Definition ImGuiFileDialog.h:1047
IGFD_C_API bool IGFD_IsOk(ImGuiFileDialog *vContextPtr)
Definition ImGuiFileDialog.cpp:4974
IGFD_C_API ImGuiFileDialog * IGFD_Create(void)
Definition ImGuiFileDialog.cpp:4929
#define IGFD_API
Definition ImGuiFileDialog.h:65
IGFD_C_API IGFD_Selection IGFD_Selection_Get()
Definition ImGuiFileDialog.cpp:4911
IGFD_C_API void IGFD_ClearFilesStyle(ImGuiFileDialog *vContextPtr)
Definition ImGuiFileDialog.cpp:5188
IGFD_C_API bool IGFD_IsKeyOpened(ImGuiFileDialog *vContextPtr, const char *vCurrentOpenedKey)
Definition ImGuiFileDialog.cpp:4996
IGFD_ResultMode_
Definition ImGuiFileDialog.h:113
@ IGFD_ResultMode_AddIfNoFileExt
Definition ImGuiFileDialog.h:130
@ IGFD_ResultMode_OverwriteFileExt
Definition ImGuiFileDialog.h:152
@ IGFD_ResultMode_KeepInputFile
Definition ImGuiFileDialog.h:168
IGFD_C_API void IGFD_Destroy(ImGuiFileDialog *vContextPtr)
Definition ImGuiFileDialog.cpp:4934
IGFD_C_API char * IGFD_GetCurrentPath(ImGuiFileDialog *vContextPtr)
Definition ImGuiFileDialog.cpp:5100
IGFD_C_API void SetLocales(ImGuiFileDialog *vContextPtr, const int vCategory, const char *vBeginLocale, const char *vEndLocale)
Definition ImGuiFileDialog.cpp:5194
IGFD_C_API bool IGFD_GetFileStyle(ImGuiFileDialog *vContextPtr, IGFD_FileStyleFlags vFileStyleFlags, const char *vFilter, ImVec4 *vOutColor, char **vOutIconText, ImFont **vOutFont)
Definition ImGuiFileDialog.cpp:5166
#define IGFD_C_API
Definition ImGuiFileDialog.h:1046
IGFD_C_API char * IGFD_GetCurrentFileName(ImGuiFileDialog *vContextPtr, IGFD_ResultMode vMode)
Definition ImGuiFileDialog.cpp:5078
int IGFD_FileStyleFlags
Definition ImGuiFileDialog.h:73
IGFD_C_API void IGFD_CloseDialog(ImGuiFileDialog *vContextPtr)
Definition ImGuiFileDialog.cpp:4968
ImGuiFileDialogFlags_
Definition ImGuiFileDialog.h:86
@ ImGuiFileDialogFlags_OptionalFileName
Definition ImGuiFileDialog.h:103
@ ImGuiFileDialogFlags_DisableCreateDirectoryButton
Definition ImGuiFileDialog.h:90
@ ImGuiFileDialogFlags_ConfirmOverwrite
Definition ImGuiFileDialog.h:88
@ ImGuiFileDialogFlags_Modal
Definition ImGuiFileDialog.h:97
@ ImGuiFileDialogFlags_ReadOnlyFileNameField
Definition ImGuiFileDialog.h:95
@ ImGuiFileDialogFlags_CaseInsensitiveExtentionFiltering
Definition ImGuiFileDialog.h:96
@ ImGuiFileDialogFlags_DisableThumbnailMode
Definition ImGuiFileDialog.h:98
@ ImGuiFileDialogFlags_HideColumnSize
Definition ImGuiFileDialog.h:92
@ ImGuiFileDialogFlags_ShowDevicesButton
Definition ImGuiFileDialog.h:101
@ ImGuiFileDialogFlags_Default
Definition ImGuiFileDialog.h:106
@ ImGuiFileDialogFlags_None
Definition ImGuiFileDialog.h:87
@ ImGuiFileDialogFlags_HideColumnType
Definition ImGuiFileDialog.h:91
@ ImGuiFileDialogFlags_NoDialog
Definition ImGuiFileDialog.h:94
@ ImGuiFileDialogFlags_DisableQuickPathSelection
Definition ImGuiFileDialog.h:100
@ ImGuiFileDialogFlags_HideColumnDate
Definition ImGuiFileDialog.h:93
@ ImGuiFileDialogFlags_DisablePlaceMode
Definition ImGuiFileDialog.h:99
@ ImGuiFileDialogFlags_DontShowHiddenFiles
Definition ImGuiFileDialog.h:89
@ ImGuiFileDialogFlags_NaturalSorting
Definition ImGuiFileDialog.h:102
int IGFD_ResultMode
Definition ImGuiFileDialog.h:112
IGFD_C_API void IGFD_OpenDialog(ImGuiFileDialog *vContextPtr, const char *vKey, const char *vTitle, const char *vFilters, const struct IGFD_FileDialog_Config vConfig)
Definition ImGuiFileDialog.cpp:4941
IGFD_C_API bool IGFD_IsOpened(ImGuiFileDialog *vContextPtr)
Definition ImGuiFileDialog.cpp:5004
IGFD_C_API char * IGFD_GetCurrentFilter(ImGuiFileDialog *vContextPtr)
Definition ImGuiFileDialog.cpp:5122
IGFD_C_API void IGFD_SetFileStyle(ImGuiFileDialog *vContextPtr, IGFD_FileStyleFlags vFileStyleFlags, const char *vFilter, ImVec4 vColor, const char *vIconText, ImFont *vFont)
Definition ImGuiFileDialog.cpp:5152
void(* IGFD_PaneFun)(const char *, void *, bool *)
Definition ImGuiFileDialog.h:1052
IGFD_C_API IGFD_Selection_Pair IGFD_Selection_Pair_Get()
Definition ImGuiFileDialog.cpp:4895
IGFD_C_API bool IGFD_WasOpenedThisFrame(ImGuiFileDialog *vContextPtr)
Definition ImGuiFileDialog.cpp:4988
IGFD_C_API bool IGFD_DisplayDialog(ImGuiFileDialog *vContextPtr, const char *vKey, ImGuiWindowFlags vFlags, ImVec2 vMinSize, ImVec2 vMaxSize)
Definition ImGuiFileDialog.cpp:4961
IGFD_C_API void IGFD_Selection_DestroyContent(IGFD_Selection *vSelection)
Definition ImGuiFileDialog.cpp:4916
IGFD_C_API bool IGFD_WasKeyOpenedThisFrame(ImGuiFileDialog *vContextPtr, const char *vKey)
Definition ImGuiFileDialog.cpp:4981
@ Invalid
Definition vertexlayout.h:50
Math::vec3 color
Definition volumetricfogcontext.cc:42
IM3D_API void NewFrame()
Definition im3d.h:812
IM3D_API void EndFrame()
Definition im3d.h:813
void Clear(void *ptr, size_t numBytes)
Overwrite a chunk of memory with 0's.
Definition osxmemory.cc:229
Math::float2 size
Definition histogramcontext.cc:43
Definition ImGuiFileDialog.h:1054
void * userDatas
Definition ImGuiFileDialog.h:1059
ImGuiFileDialogFlags flags
Definition ImGuiFileDialog.h:1062
float sidePaneWidth
Definition ImGuiFileDialog.h:1061
const char * fileName
Definition ImGuiFileDialog.h:1056
const char * path
Definition ImGuiFileDialog.h:1055
int32_t countSelectionMax
Definition ImGuiFileDialog.h:1058
IGFD_PaneFun sidePane
Definition ImGuiFileDialog.h:1060
const char * filePathName
Definition ImGuiFileDialog.h:1057
Definition ImGuiFileDialog.h:1066
char * filePathName
Definition ImGuiFileDialog.h:1068
char * fileName
Definition ImGuiFileDialog.h:1067
Definition ImGuiFileDialog.h:1074
size_t count
Definition ImGuiFileDialog.h:1076
IGFD_Selection_Pair * table
Definition ImGuiFileDialog.h:1075
bool operator>(const TiXmlString &a, const TiXmlString &b)
Definition tinystr.h:283
bool operator<(const TiXmlString &a, const TiXmlString &b)
Definition tinystr.h:277
bool operator==(const TiXmlString &a, const TiXmlString &b)
Definition tinystr.h:272
bool operator!=(const TiXmlString &a, const TiXmlString &b)
Definition tinystr.h:282