/*
MIT License

Copyright (c) 2019-2020 Stephane Cuillerdier (aka aiekick)

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
*/

/*
-----------------------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------------------------

github repo : https://github.com/aiekick/ImGuiFileDialog

-----------------------------------------------------------------------------------------------------------------
## Description :
-----------------------------------------------------------------------------------------------------------------

this File Dialog is build on top of DearImGui
(On windows, need te lib Dirent : https://github.com/tronkko/dirent, use the branch 1.23 for avoid any issues)
Complete readme here : https://github.com/aiekick/ImGuiFileDialog/blob/master/README.md)

this filedialog was created principally for have custom pane with widgets accrdoing to file extention.
it was not possible with native filedialog

An example of the File Dialog integrated within the ImGui Demo App

-----------------------------------------------------------------------------------------------------------------
## Features :
-----------------------------------------------------------------------------------------------------------------

- Separate system for call and display
  - can be many func calls with different params for one display func by ex
- Can use custom pane via function binding
  - this pane can block the validation of the dialog
  - can also display different things according to current filter and User Datas
- Support of Filter Custom Coloring / Icons / text
- Multi Selection (ctrl/shift + click) :
  - 0 => infinite
  - 1 => one file (default)
  - n => n files
- Compatible with MacOs, Linux, Win
  - On Win version you can list Drives
- Support of Modal/Standard dialog type
- Support both Mode : File Chooser or Directory Chooser
- Support filter collection / Custom filter name
- Support files Exploring with keys : Up / Down / Enter (open dir) / Backspace (come back)
- Support files Exploring by input char (case insensitive)
- Support bookmark creation/edition/call for directory (can have custom name corresponding to a path)
- Support input path edition by right click on a path button
- Support of a 'Confirm to Overwrite" dialog if File Exist


-----------------------------------------------------------------------------------------------------------------
## NameSpace / SingleTon
-----------------------------------------------------------------------------------------------------------------

Use the Namespace IGFD (for avoid conflict with variables, struct and class names)

you can display only one dialog at a time, this class is a simgleton and must be called like that :
ImGuiFileDialog::Instance()->method_of_your_choice()

-----------------------------------------------------------------------------------------------------------------
## Simple Dialog :
-----------------------------------------------------------------------------------------------------------------

Example code :
void drawGui()
{
  // open Dialog Simple
  if (ImGui::Button("Open File Dialog"))
	ImGuiFileDialog::Instance()->OpenDialog("ChooseFileDlgKey", "Choose File", ".cpp,.h,.hpp", ".");

  // display
  if (ImGuiFileDialog::Instance()->FileDialog("ChooseFileDlgKey"))
  {
	// action if OK
	if (ImGuiFileDialog::Instance()->IsOk == true)
	{
	  std::string filePathName = ImGuiFileDialog::Instance()->GetFilePathName();
	  std::string filePath = ImGuiFileDialog::Instance()->GetCurrentPath();
	  // action
	}
	// close
	ImGuiFileDialog::Instance()->CloseDialog("ChooseFileDlgKey");
  }
}

-----------------------------------------------------------------------------------------------------------------
## Directory Chooser :
-----------------------------------------------------------------------------------------------------------------

For have only a directory chooser, you just need to specify a filter null :

Example code :
ImGuiFileDialog::Instance()->OpenDialog("ChooseDirDlgKey", "Choose a Directory", 0, ".");

In this mode you can select any directory with one click, and open directory with double click

-----------------------------------------------------------------------------------------------------------------
## Dialog with Custom Pane :
-----------------------------------------------------------------------------------------------------------------

Example code :
static bool canValidateDialog = false;
inline void InfosPane(std::string& vFilter, IGFD::UserDatas vUserDatas, bool *vCantContinue) // if vCantContinue is false, the user cant validate the dialog
{
	ImGui::TextColored(ImVec4(0, 1, 1, 1), "Infos Pane");
	ImGui::Text("Selected Filter : %s", vFilter.c_str());
	if (vUserDatas)
		ImGui::Text("UserDatas : %s", vUserDatas);
	ImGui::Checkbox("if not checked you cant validate the dialog", &canValidateDialog);
	if (vCantContinue)
		*vCantContinue = canValidateDialog;
}

void drawGui()
{
  // open Dialog with Pane
  if (ImGui::Button("Open File Dialog with a custom pane"))
	ImGuiFileDialog::Instance()->OpenDialog("ChooseFileDlgKey", "Choose File", ".cpp,.h,.hpp",
			".", "", std::bind(&InfosPane, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3), 350, 1, IGFD::UserDatas("InfosPane"));

  // display and action if ok
  if (ImGuiFileDialog::Instance()->FileDialog("ChooseFileDlgKey"))
  {
	if (ImGuiFileDialog::Instance()->IsOk == true)
	{
		std::string filePathName = ImGuiFileDialog::Instance()->GetFilePathName();
		std::string filePath = ImGuiFileDialog::Instance()->GetCurrentPath();
		std::string filter = ImGuiFileDialog::Instance()->GetCurrentFilter();
		// here convert from string because a string was passed as a userDatas, but it can be what you want
		std::string userDatas;
		if (ImGuiFileDialog::Instance()->GetUserDatas())
			userDatas = std::string((const char*)ImGuiFileDialog::Instance()->GetUserDatas());
		auto selection = ImGuiFileDialog::Instance()->GetSelection(); // multiselection

		// action
	}
	// close
	ImGuiFileDialog::Instance()->CloseDialog("ChooseFileDlgKey");
  }
}

-----------------------------------------------------------------------------------------------------------------
## Filter Infos
-----------------------------------------------------------------------------------------------------------------

You can define color for a filter type
Example code :
ImGuiFileDialog::Instance()->SetExtentionInfos(".cpp", ImVec4(1,1,0, 0.9));
ImGuiFileDialog::Instance()->SetExtentionInfos(".h", ImVec4(0,1,0, 0.9));
ImGuiFileDialog::Instance()->SetExtentionInfos(".hpp", ImVec4(0,0,1, 0.9));
ImGuiFileDialog::Instance()->SetExtentionInfos(".md", ImVec4(1,0,1, 0.9));


![alt text](doc/color_filter.png)

and also specific icons (with icon font files) or file type names :

Example code :
// add an icon for png files
ImGuiFileDialog::Instance()->SetExtentionInfos(".png", ImVec4(0,1,1,0.9), ICON_IMFDLG_FILE_TYPE_PIC);
// add a text for gif files (the default value is [File]
ImGuiFileDialog::Instance()->SetExtentionInfos(".gif", ImVec4(0, 1, 0.5, 0.9), "[GIF]");


![alt text](doc/filter_Icon.png)

-----------------------------------------------------------------------------------------------------------------
## Filter Collections
-----------------------------------------------------------------------------------------------------------------

you can define a custom filter name who correspond to a group of filter

you must use this syntax : custom_name1{filter1,filter2,filter3},custom_name2{filter1,filter2},filter1
when you will select custom_name1, the gorup of filter 1 to 3 will be applied
the reserved char are {}, you cant use them for define filter name.

Example code :
const char *filters = "Source files (*.cpp *.h *.hpp){.cpp,.h,.hpp},Image files (*.png *.gif *.jpg *.jpeg){.png,.gif,.jpg,.jpeg},.md";
ImGuiFileDialog::Instance()->OpenDialog("ChooseFileDlgKey", ICON_IMFDLG_FOLDER_OPEN " Choose a File", filters, ".");

## Multi Selection

You can define in OpenDialog/OpenModal call the count file you wan to select :
- 0 => infinite
- 1 => one file only (default)
- n => n files only

See the define at the end of these funcs after path.

Example code :
ImGuiFileDialog::Instance()->OpenDialog("ChooseFileDlgKey", "Choose File", ".*,.cpp,.h,.hpp", ".");
ImGuiFileDialog::Instance()->OpenDialog("ChooseFileDlgKey", "Choose 1 File", ".*,.cpp,.h,.hpp", ".", 1);
ImGuiFileDialog::Instance()->OpenDialog("ChooseFileDlgKey", "Choose 5 File", ".*,.cpp,.h,.hpp", ".", 5);
ImGuiFileDialog::Instance()->OpenDialog("ChooseFileDlgKey", "Choose many File", ".*,.cpp,.h,.hpp", ".", 0);
ImGuiFileDialog::Instance()->OpenDialog("ChooseFileDlgKey", "Choose File", ".png,.jpg",
   ".", "", std::bind(&InfosPane, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3), 350, 1, "SaveFile"); // 1 file

-----------------------------------------------------------------------------------------------------------------
## File Dialog Constraints
-----------------------------------------------------------------------------------------------------------------

you can define min/max size of the dialog when you display It

by ex :

* MaxSize is the full display size
* MinSize in the half display size.

Example code :
ImVec2 maxSize = ImVec2((float)display_w, (float)display_h);
ImVec2 minSize = maxSize * 0.5f;
ImGuiFileDialog::Instance()->FileDialog("ChooseFileDlgKey", ImGuiWindowFlags_NoCollapse, minSize, maxSize);

-----------------------------------------------------------------------------------------------------------------
## Detail View Mode
-----------------------------------------------------------------------------------------------------------------

You can have tables display like that.

- uncomment "#define USE_IMGUI_TABLES" in you custom config file (CustomImGuiFileDialogConfig.h in this example)

-----------------------------------------------------------------------------------------------------------------
## Exploring by keys
-----------------------------------------------------------------------------------------------------------------

you can activate this feature by uncomment : "#define USE_EXPLORATION_BY_KEYS"
in you custom config file (CustomImGuiFileDialogConfig.h in this example)

you can also uncomment the next lines for define your keys :

* IGFD_KEY_UP => Up key for explore to the top
* IGFD_KEY_DOWN => Down key for explore to the bottom
* IGFD_KEY_ENTER => Enter key for open directory
* IGFD_KEY_BACKSPACE => BackSpace for comming back to the last directory

you can also explore a file list by use the current key char.

as you see the current item is flashed (by default for 1 sec)
you can define the flashing life time by yourself with the function

Example code :
ImGuiFileDialog::Instance()->SetFlashingAttenuationInSeconds(1.0f);

-----------------------------------------------------------------------------------------------------------------
## Bookmarks
-----------------------------------------------------------------------------------------------------------------

you can create/edit/call path bookmarks and load/save them in file

you can activate it by uncomment : "#define USE_BOOKMARK"

in you custom config file (CustomImGuiFileDialogConfig.h in this example)

you can also uncomment the next lines for customize it :
Example code :
#define bookmarkPaneWith 150.0f => width of the bookmark pane
#define IMGUI_TOGGLE_BUTTON ToggleButton => customize the Toggled button (button stamp must be : (const char* label, bool *toggle)
#define bookmarksButtonString "Bookmark" => the text in the toggle button
#define bookmarksButtonHelpString "Bookmark" => the helper text when mouse over the button
#define addBookmarkButtonString "+" => the button for add a bookmark
#define removeBookmarkButtonString "-" => the button for remove the selected bookmark


* you can select each bookmark for edit the displayed name corresponding to a path
* you must double click on the label for apply the bookmark

you can also serialize/deserialize bookmarks by ex for load/save from/to file : (check the app sample by ex)
Example code :
Load => ImGuiFileDialog::Instance()->DeserializeBookmarks(bookmarString);
Save => std::string bookmarkString = ImGuiFileDialog::Instance()->SerializeBookmarks();

-----------------------------------------------------------------------------------------------------------------
## Path Edition :
-----------------------------------------------------------------------------------------------------------------

if you click right on one of any path button, you can input or modify the path pointed by this button.
then press the validate key (Enter by default with GLFW) for validate the new path
or press the escape key (Escape by default with GLFW) for quit the input path edition

see in this gif doc/inputPathEdition.gif :
1) button edition with mouse button right and escape key for quit the edition
2) focus the input and press validation for set path

-----------------------------------------------------------------------------------------------------------------
## Confirm to OverWrite Dialog :
-----------------------------------------------------------------------------------------------------------------

If you want avoid OverWrite your files after confirmation,
you can show a Dialog for confirm or cancel the OverWrite operation.

You just need to define the flag ImGuiFileDialogFlags_ConfirmOverwrite
in your call to OpenDialog/OpenModal

By default this flag is not set, since there is no pre-defined way to
define if a dialog will be for Open or Save behavior. (and its wanted :) )

Example code For Standard Dialog :
Example code :
ImGuiFileDialog::Instance()->OpenDialog("ChooseFileDlgKey",
	ICON_IGFD_SAVE " Choose a File", filters,
	".", "", 1, nullptr, ImGuiFileDialogFlags_ConfirmOverwrite);

Example code For Modal Dialog :
Example code :
ImGuiFileDialog::Instance()->OpenModal("ChooseFileDlgKey",
	ICON_IGFD_SAVE " Choose a File", filters,
	".", "", 1, nullptr, ImGuiFileDialogFlags_ConfirmOverwrite);

This dialog will only verify the file in the file field.
So Not to be used with GetSelection()

The Confirm dialog will be a forced Modal Dialog, not moveable, displayed
in the center of the current FileDialog.

As usual you can customize the dialog,
in you custom config file (CustomImGuiFileDialogConfig.h in this example)

you can  uncomment the next lines for customize it :

Example code :
#define OverWriteDialogTitleString "The file Already Exist !"
#define OverWriteDialogMessageString "Would you like to OverWrite it ?"
#define OverWriteDialogConfirmButtonString "Confirm"
#define OverWriteDialogCancelButtonString "Cancel"

-----------------------------------------------------------------------------------------------------------------
## Flags :
-----------------------------------------------------------------------------------------------------------------

flag must be specified in OpenDialog or OpenModal
* ImGuiFileDialogFlags_ConfirmOverwrite 	=> show confirm to overwrite dialog
* ImGuiFileDialogFlags_DontShowHiddenFiles 	=> dont show hidden file (file starting with a .)

-----------------------------------------------------------------------------------------------------------------
## Open / Save dialog Behavior :
-----------------------------------------------------------------------------------------------------------------

There is no way to distinguish the "open dialog" behavior than "save dialog" behavior.
So you msut adapt the return according to your need :

if you want open file(s) or directory(s), you must use : GetSelection() method. you will obtain a std::map<FileName, FilePathName> of the selection
if you want create a file, you must use : GetFilePathName()/GetCurrentFileName()

the return method's and comments :

Example code :
std::map<std::string, std::string> GetSelection(); // Open File behavior : will return selection via a map<FileName, FilePathName>
std::string GetFilePathName();                     // Create File behavior : will always return the content of the field with current filter extention and current path
std::string GetCurrentFileName();                  // Create File behavior : will always return the content of the field with current filter extention
std::string GetCurrentPath();                      // will return current path
std::string GetCurrentFilter();                    // get selected filter
UserDatas GetUserDatas();                          // get user datas send with Open Dialog

-----------------------------------------------------------------------------------------------------------------
## C API
-----------------------------------------------------------------------------------------------------------------

A C API is available let you include ImGuiFileDialog in your C project.
btw, ImGuiFileDialog depend of ImGui and dirent (for windows)

Sample code with cimgui :

// create ImGuiFileDialog
ImGuiFileDialog *cfileDialog = IGFD_Create();

// open dialog
if (igButton("Open File", buttonSize))
{
	IGFD_OpenDialog(cfiledialog,
		"filedlg",                              // dialog key (make it possible to have different treatment reagrding the dialog key
		"Open a File",                          // dialog title
		"c files(*.c *.h){.c,.h}",              // dialog filter syntax : simple => .h,.c,.pp, etc and collections : text1{filter0,filter1,filter2}, text2{filter0,filter1,filter2}, etc..
		".",                                    // base directory for files scan
		"",                                     // base filename
		0,                                      // a fucntion for display a right pane if you want
		0.0f,                                   // base width of the pane
		0,                                      // count selection : 0 infinite, 1 one file (default), n (n files)
		"User data !",                          // some user datas
		ImGuiFileDialogFlags_ConfirmOverwrite); // ImGuiFileDialogFlags
}

ImGuiIO* ioptr = igGetIO();
ImVec2 maxSize;
maxSize.x = ioptr->DisplaySize.x * 0.8f;
maxSize.y = ioptr->DisplaySize.y * 0.8f;
ImVec2 minSize;
minSize.x = maxSize.x * 0.25f;
minSize.y = maxSize.y * 0.25f;

// display dialog
if (IGFD_DisplayDialog(cfiledialog, "filedlg", ImGuiWindowFlags_NoCollapse, minSize, maxSize))
{
	if (IGFD_IsOk(cfiledialog)) // result ok
	{
		char* cfilePathName = IGFD_GetFilePathName(cfiledialog);
		printf("GetFilePathName : %s\n", cfilePathName);
		char* cfilePath = IGFD_GetCurrentPath(cfiledialog);
		printf("GetCurrentPath : %s\n", cfilePath);
		char* cfilter = IGFD_GetCurrentFilter(cfiledialog);
		printf("GetCurrentFilter : %s\n", cfilter);
		// here convert from string because a string was passed as a userDatas, but it can be what you want
		void* cdatas = IGFD_GetUserDatas(cfiledialog);
		if (cdatas)
			printf("GetUserDatas : %s\n", (const char*)cdatas);
		struct IGFD_Selection csel = IGFD_GetSelection(cfiledialog); // multi selection
		printf("Selection :\n");
		for (int i = 0; i < (int)csel.count; i++)
		{
			printf("(%i) FileName %s => path %s\n", i, csel.table[i].fileName, csel.table[i].filePathName);
		}
		// action

		// destroy
		if (cfilePathName) free(cfilePathName);
		if (cfilePath) free(cfilePath);
		if (cfilter) free(cfilter);

		IGFD_Selection_DestroyContent(&csel);
	}
	IGFD_CloseDialog(cfiledialog);
}

// destroy ImGuiFileDialog
IGFD_Destroy(cfiledialog);

-----------------------------------------------------------------------------------------------------------------
## How to Integrate ImGuiFileDialog in your project
-----------------------------------------------------------------------------------------------------------------

### ImGuiFileDialog require :

* dirent v1.23 (https://github.com/tronkko/dirent/tree/v1.23) lib, only for windows. Successfully tested with version v1.23 only
* Dear ImGui (https://github.com/ocornut/imgui/tree/master) (with/without tables widgets)

### Customize ImGuiFileDialog :

You just need to write your own config file by override the file : ImGuiFileDialog/ImGuiFileDialogConfig.h
like i do here with CustomImGuiFileDialogConfig.h

After that, for let ImGuiFileDialog your own custom file,
you must define the preprocessor directive CUSTOM_IMGUIFILEDIALOG_CONFIG with the path of you custom config file.
This path must be relative to the directory where you put ImGuiFileDialog module.

-----------------------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------------------------

Thats all.

You can check by example in this repo with the file CustomImGuiFileDialogConfig.h :
- this trick was used for have custom icon font instead of labels for buttons or messages titles
- you can also use your custom imgui button, the button call stamp must be same by the way :)

The Custom Icon Font (in CustomFont.cpp and CustomFont.h) was made with ImGuiFontStudio (https://github.com/aiekick/ImGuiFontStudio) i wrote for that :)
ImGuiFontStudio is using also ImGuiFileDialog.

-----------------------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------------------------
*/

#ifndef IMGUIFILEDIALOG_H
#define IMGUIFILEDIALOG_H

#define IMGUIFILEDIALOG_VERSION "v0.5.6"

#ifndef CUSTOM_IMGUIFILEDIALOG_CONFIG
#include "ImGuiFileDialogConfig.h"
#else // CUSTOM_IMGUIFILEDIALOG_CONFIG
#include CUSTOM_IMGUIFILEDIALOG_CONFIG
#endif // CUSTOM_IMGUIFILEDIALOG_CONFIG

typedef int ImGuiFileDialogFlags; // -> enum ImGuiFileDialogFlags_
enum ImGuiFileDialogFlags_
{
	ImGuiFileDialogFlags_None = 0,
	ImGuiFileDialogFlags_ConfirmOverwrite = (1 << 0),		// show confirm to overwrite dialog
	ImGuiFileDialogFlags_DontShowHiddenFiles = (1 << 1),	// dont show hidden file (file starting with a .)
	ImGuiFileDialogFlags_DisableCreateDirectoryButton = (1 << 2), // disable the create directory button
	ImGuiFileDialogFlags_HideColumnType = (1 << 3),	// hide column file type
	ImGuiFileDialogFlags_HideColumnSize = (1 << 4),	// hide column file size
	ImGuiFileDialogFlags_HideColumnDate = (1 << 5),	// hide column file date
	ImGuiFileDialogFlags_Default = ImGuiFileDialogFlags_None // for the moment we have no default options but its comming :)
};

#ifdef __cplusplus

#include <imgui.h>

#include <cfloat>
#include <utility>
#include <fstream>
#include <vector>
#include <string>
#include <set>
#include <map>
#include <unordered_map>
#include <functional>
#include <string>
#include <vector>
#include <list>

namespace IGFD
{
	#ifndef MAX_FILE_DIALOG_NAME_BUFFER 
	#define MAX_FILE_DIALOG_NAME_BUFFER 1024
	#endif // MAX_FILE_DIALOG_NAME_BUFFER

	#ifndef MAX_PATH_BUFFER_SIZE
	#define MAX_PATH_BUFFER_SIZE 1024
	#endif // MAX_PATH_BUFFER_SIZE

	struct FileExtentionInfosStruct
	{
		ImVec4 color = ImVec4(0, 0, 0, 0);
		std::string icon;
		FileExtentionInfosStruct() : color(0, 0, 0, 0) { }
		FileExtentionInfosStruct(const ImVec4& vColor, const std::string& vIcon = "") { color = vColor; icon = vIcon; }
	};

	typedef void* UserDatas;
	typedef std::function<void(const char*, UserDatas, bool*)> PaneFun;
	
	class FileDialog
	{

	///////////////////////////////////////////////////////////////////////////////////////
	/// PRIVATE STRUCTS / ENUMS ///////////////////////////////////////////////////////////
	///////////////////////////////////////////////////////////////////////////////////////

	private:
#ifdef USE_BOOKMARK
		struct BookmarkStruct
		{
			std::string name;
			std::string path;
		};
#endif // USE_BOOKMARK

		enum class SortingFieldEnum
		{
			FIELD_NONE = 0,
			FIELD_FILENAME,
			FIELD_TYPE,
			FIELD_SIZE,
			FIELD_DATE
		};

		struct FileInfoStruct
		{
			char type = ' ';
			std::string filePath;
			std::string fileName;
			std::string fileName_optimized; // optimized for search => insensitivecase
			std::string ext;
			size_t fileSize = 0; // for sorting operations
			std::string formatedFileSize;
			std::string fileModifDate;
		};

		struct FilterInfosStruct
		{
			std::string filter;
			std::set<std::string> collectionfilters;
			void clear() {filter.clear(); collectionfilters.clear();}
			bool empty() const { return filter.empty() && collectionfilters.empty(); }
			bool filterExist(const std::string& vFilter) {return filter == vFilter || collectionfilters.find(vFilter) != collectionfilters.end(); }
		};

	///////////////////////////////////////////////////////////////////////////////////////
	/// PRIVATE VARIABLES /////////////////////////////////////////////////////////////////
	///////////////////////////////////////////////////////////////////////////////////////

	private:
		std::vector<FileInfoStruct> m_FileList;
        std::vector<FileInfoStruct> m_FilteredFileList;
        std::unordered_map<std::string, FileExtentionInfosStruct> m_FileExtentionInfos;
		std::string m_CurrentPath;
		std::vector<std::string> m_CurrentPath_Decomposition;
		std::set<std::string> m_SelectedFileNames;
		std::string m_Name;
		bool m_ShowDialog = false;
		bool m_ShowDrives = false;
		std::string m_LastSelectedFileName; // for shift multi selectio
		std::vector<FilterInfosStruct> m_Filters;
		FilterInfosStruct m_SelectedFilter;
		bool m_InputPathActivated = false; // show input for path edition
        ImGuiListClipper m_FileListClipper;
		ImVec2 m_DialogCenterPos = ImVec2(0, 0); // center pos for display the confirm overwrite dialog
		int m_LastImGuiFrameCount = 0; // to be sure than only one dialog displayed per frame
		float m_FooterHeight = 0.0f;
		bool m_DrivesClicked = false; // events
		bool m_PathClicked = false;// events
		bool m_CanWeContinue = true;// events
		bool m_OkResultToConfirm = false; // to confim if ok for OverWrite
		bool m_IsOk = false;								
		bool m_CreateDirectoryMode = false;					// for create directory mode
		std::string m_HeaderFileName;						// detail view column file
		std::string m_HeaderFileType;						// detail view column type
		std::string m_HeaderFileSize;						// detail view column size
		std::string m_HeaderFileDate;						// detail view column date + time
		bool m_SortingDirection[4] = { true, true, true, true };	// detail view // true => Descending, false => Ascending
		SortingFieldEnum m_SortingField = SortingFieldEnum::FIELD_FILENAME;  // detail view sorting column
		bool m_WantToQuit = false;							// set to true for start the quit process of the dialog, specific behavior for select a file by double click for the moment

		std::string dlg_key;
		std::string dlg_title;
		std::string dlg_filters{};
		std::string dlg_path;
		std::string dlg_defaultFileName;
		std::string dlg_defaultExt;
		ImGuiFileDialogFlags dlg_flags = ImGuiFileDialogFlags_None;
		UserDatas dlg_userDatas = nullptr;
		PaneFun dlg_optionsPane = nullptr;
		float dlg_optionsPaneWidth = 0.0f;
		std::string searchTag;
		size_t dlg_countSelectionMax = 1; // 0 for infinite
		bool dlg_modal = false;

#ifdef USE_EXPLORATION_BY_KEYS
		size_t m_FlashedItem = 0;							// flash when select by char
		float m_FlashAlpha = 0.0f;							// flash when select by char
		float m_FlashAlphaAttenInSecs = 1.0f;				// fps display dependant
		size_t m_LocateFileByInputChar_lastFileIdx = 0;
		ImWchar m_LocateFileByInputChar_lastChar = 0;
		int m_LocateFileByInputChar_InputQueueCharactersSize = 0;
		bool m_LocateFileByInputChar_lastFound = false;
#endif // USE_EXPLORATION_BY_KEYS
#ifdef USE_BOOKMARK
		float m_BookmarkWidth = 200.0f;
        ImGuiListClipper m_BookmarkClipper;
		std::vector<BookmarkStruct> m_Bookmarks;
		bool m_BookmarkPaneShown = false;
#endif // USE_BOOKMARK

	///////////////////////////////////////////////////////////////////////////////////////
	/// PUBLIC PARAMS /////////////////////////////////////////////////////////////////////
	///////////////////////////////////////////////////////////////////////////////////////

	public:
		char InputPathBuffer[MAX_PATH_BUFFER_SIZE] = "";
		char FileNameBuffer[MAX_FILE_DIALOG_NAME_BUFFER] = "";
		char DirectoryNameBuffer[MAX_FILE_DIALOG_NAME_BUFFER] = "";
		char SearchBuffer[MAX_FILE_DIALOG_NAME_BUFFER] = "";
		char VariadicBuffer[MAX_FILE_DIALOG_NAME_BUFFER] = "";

#ifdef USE_BOOKMARK
		char BookmarkEditBuffer[MAX_FILE_DIALOG_NAME_BUFFER] = "";
#endif // USE_BOOKMARK
		bool m_AnyWindowsHovered = false;					// not remember why haha :) todo : to check if we can remove

	///////////////////////////////////////////////////////////////////////////////////////
	/// PUBLIC METHODS/////////////////////////////////////////////////////////////////////
	///////////////////////////////////////////////////////////////////////////////////////

	public: 
		static FileDialog* Instance()								// Singleton for easier accces form anywhere but only one dialog at a time
		{
			static FileDialog _instance;
			return &_instance;
		}

	public:
		FileDialog();												// ImGuiFileDialog Constructor. can be used for have many dialog at same tiem (not possible with singleton)
		virtual ~FileDialog();										// ImGuiFileDialog Destructor

		// standard dialog
		void OpenDialog(											// open simple dialog (path and fileName can be specified)
			const std::string& vKey,								// key dialog
			const std::string& vTitle,								// title
			const char* vFilters,									// filters
			const std::string& vPath,								// path
			const std::string& vFileName,							// defaut file name
			const int& vCountSelectionMax = 1,						// count selection max
			UserDatas vUserDatas = nullptr,							// user datas (can be retrieved in pane)
			ImGuiFileDialogFlags vFlags = 0);						// ImGuiFileDialogFlags 

		void OpenDialog(											// open simple dialog (path and filename are obtained from filePathName)
			const std::string& vKey,								// key dialog
			const std::string& vTitle,								// title
			const char* vFilters,									// filters
			const std::string& vFilePathName,						// file path name (will be decompsoed in path and fileName)
			const int& vCountSelectionMax = 1,						// count selection max
			UserDatas vUserDatas = nullptr,							// user datas (can be retrieved in pane)
			ImGuiFileDialogFlags vFlags = 0);						// ImGuiFileDialogFlags 

		// with pane
		void OpenDialog(											// open dialog with custom right pane (path and fileName can be specified)
			const std::string& vKey,								// key dialog
			const std::string& vTitle,								// title
			const char* vFilters,									// filters
			const std::string& vPath,								// path
			const std::string& vFileName,							// defaut file name
			const PaneFun& vSidePane,								// side pane
			const float& vSidePaneWidth = 250.0f,					// side pane width
			const int& vCountSelectionMax = 1,						// count selection max
			UserDatas vUserDatas = nullptr,							// user datas (can be retrieved in pane)
			ImGuiFileDialogFlags vFlags = 0);						// ImGuiFileDialogFlags 

		void OpenDialog(											// open dialog with custom right pane (path and filename are obtained from filePathName)
			const std::string& vKey,								// key dialog
			const std::string& vTitle,								// title
			const char* vFilters,									// filters
			const std::string& vFilePathName,						// file path name (will be decompsoed in path and fileName)
			const PaneFun& vSidePane,								// side pane
			const float& vSidePaneWidth = 250.0f,					// side pane width
			const int& vCountSelectionMax = 1,						// count selection max
			UserDatas vUserDatas = nullptr,							// user datas (can be retrieved in pane)
			ImGuiFileDialogFlags vFlags = 0);						// ImGuiFileDialogFlags 

		// modal dialog
		void OpenModal(												// open simple modal (path and fileName can be specified)
			const std::string& vKey,								// key dialog
			const std::string& vTitle,								// title
			const char* vFilters,									// filters
			const std::string& vPath,								// path
			const std::string& vFileName,							// defaut file name
			const int& vCountSelectionMax = 1,						// count selection max
			UserDatas vUserDatas = nullptr,							// user datas (can be retrieved in pane)
			ImGuiFileDialogFlags vFlags = 0);						// ImGuiFileDialogFlags 

		void OpenModal(												// open simple modal (path and fielname are obtained from filePathName)
			const std::string& vKey,								// key dialog
			const std::string& vTitle,								// title
			const char* vFilters,									// filters
			const std::string& vFilePathName,						// file path name (will be decompsoed in path and fileName)
			const int& vCountSelectionMax = 1,						// count selection max
			UserDatas vUserDatas = nullptr,							// user datas (can be retrieved in pane)
			ImGuiFileDialogFlags vFlags = 0);						// ImGuiFileDialogFlags 

		// with pane
		void OpenModal(												// open modal with custom right pane (path and filename are obtained from filePathName)
			const std::string& vKey,								// key dialog
			const std::string& vTitle,								// title
			const char* vFilters,									// filters
			const std::string& vPath,								// path
			const std::string& vFileName,							// defaut file name
			const PaneFun& vSidePane,								// side pane
			const float& vSidePaneWidth = 250.0f,					// side pane width
			const int& vCountSelectionMax = 1,						// count selection max
			UserDatas vUserDatas = nullptr,							// user datas (can be retrieved in pane)
			ImGuiFileDialogFlags vFlags = 0);						// ImGuiFileDialogFlags 

		void OpenModal(												// open modal with custom right pane (path and fielname are obtained from filePathName)
			const std::string& vKey,								// key dialog
			const std::string& vTitle,								// title
			const char* vFilters,									// filters
			const std::string& vFilePathName,						// file path name (will be decompsoed in path and fileName)
			const PaneFun& vSidePane,								// side pane
			const float& vSidePaneWidth = 250.0f,					// side pane width
			const int& vCountSelectionMax = 1,						// count selection max
			UserDatas vUserDatas = nullptr,							// user datas (can be retrieved in pane)
			ImGuiFileDialogFlags vFlags = 0);						// ImGuiFileDialogFlags 

		// Display / Close dialog form
		bool Display(												// Display the dialog. return true if a result was obtained (Ok or not)
			const std::string& vKey,								// key dialog to display (if not the same key as defined by OpenDialog/Modal => no opening)
			ImGuiWindowFlags vFlags = ImGuiWindowFlags_NoCollapse,	// ImGuiWindowFlags
			ImVec2 vMinSize = ImVec2(0, 0),							// mininmal size contraint for the ImGuiWindow
			ImVec2 vMaxSize = ImVec2(FLT_MAX, FLT_MAX));			// maximal size contraint for the ImGuiWindow
		void Close();												// close dialog

		// queries
		bool WasOpenedThisFrame(const std::string& vKey);			// say if the dialog key was already opened this frame
		bool WasOpenedThisFrame();									// say if the dialog was already opened this frame
		bool IsOpened(const std::string& vKey);						// say if the key is opened
		bool IsOpened();											// say if the dialog is opened somewhere	
		std::string GetOpenedKey();									// return the dialog key who is opened, return nothing if not opened

		// get result
		bool IsOk();												// true => Dialog Closed with Ok result / false : Dialog closed with cancel result
		std::map<std::string, std::string> GetSelection();			// Open File behavior : will return selection via a map<FileName, FilePathName>
		std::string GetFilePathName();								// Save File behavior : will always return the content of the field with current filter extention and current path
		std::string GetCurrentFileName();							// Save File behavior : will always return the content of the field with current filter extention
		std::string GetCurrentPath();								// will return current path
		std::string GetCurrentFilter();								// will return selected filter
		UserDatas GetUserDatas();									// will return user datas send with Open Dialog/Modal
		
		// extentions displaying
		void SetExtentionInfos(										// SetExtention datas for have custom display of particular file type
			const std::string& vFilter,								// extention filter to tune
			const FileExtentionInfosStruct& vInfos);				// Filter Extention Struct who contain Color and Icon/Text for the display of the file with extention filter
		void SetExtentionInfos(										// SetExtention datas for have custom display of particular file type
			const std::string& vFilter,								// extention filter to tune
			const ImVec4& vColor,									// wanted color for the display of the file with extention filter
			const std::string& vIcon = "");							// wanted text or icon of the file with extention filter
		bool GetExtentionInfos(										// GetExtention datas. return true is extention exist
			const std::string& vFilter,								// extention filter (same as used in SetExtentionInfos)
			ImVec4 *vOutColor,										// color to retrieve
			std::string* vOutIcon = 0);								// icon or text to retrieve
		void ClearExtentionInfos();									// clear extentions setttings

#ifdef USE_EXPLORATION_BY_KEYS
		void SetFlashingAttenuationInSeconds(						// set the flashing time of the line in file list when use exploration keys
			float vAttenValue);										// set the attenuation (from flashed to not flashed) in seconds
#endif // USE_EXPLORATION_BY_KEYS
#ifdef USE_BOOKMARK
		std::string SerializeBookmarks();							// serialize bookmarks : return bookmark buffer to save in a file
		void DeserializeBookmarks(									// deserialize bookmarks : load bookmar buffer to load in the dialog (saved from previous use with SerializeBookmarks())
			const std::string& vBookmarks);							// bookmark buffer to load
#endif // USE_BOOKMARK

	///////////////////////////////////////////////////////////////////////////////////////
	/// PROTECTED'S METHODS ///////////////////////////////////////////////////////////////
	///////////////////////////////////////////////////////////////////////////////////////

	protected: 
		// dialog parts
		virtual void DrawHeader();									// draw header part of the dialog (bookmark btn, dir creation, path composer, search bar)
		virtual void DrawContent();									// draw content part of the dialog (bookmark pane, file list, side pane)
		virtual bool DrawFooter();									// draw footer part of the dialog (file field, fitler combobox, ok/cancel btn's)

		// widgets components
		virtual void DrawDirectoryCreation();						// draw directory creation widget
		virtual void DrawPathComposer();							// draw path composer widget
		virtual void DrawSearchBar();								// draw search bar
		virtual void DrawFileListView(ImVec2 vSize);				// draw file list viexw
		virtual void DrawSidePane(float vHeight);					// draw side pane
#ifdef USE_BOOKMARK
		virtual void DrawBookMark();								// draw bookmark button
#endif // USE_BOOKMARK

		// others
		bool SelectableItem(int vidx, const FileInfoStruct& vInfos, bool vSelected, const char* vFmt, ...);					// selectable item for table
		void ResetEvents();																									// reset events (path, drives, continue)
		void SetDefaultFileName(const std::string& vFileName);																// set default file name
		bool SelectDirectory(const FileInfoStruct& vInfos);																	// enter directory 
		void SelectFileName(const FileInfoStruct& vInfos);																	// select filename
		void RemoveFileNameInSelection(const std::string& vFileName);														// selection : remove a file name
		void AddFileNameInSelection(const std::string& vFileName, bool vSetLastSelectionFileName);							// selection : add a file name
		void SetPath(const std::string& vPath);																				// set the path of the dialog, will launch the directory scan for populate the file listview
		void CompleteFileInfos(FileInfoStruct *vFileInfoStruct);															// set time and date infos of a file (detail view mode)
		void SortFields(SortingFieldEnum vSortingField = SortingFieldEnum::FIELD_NONE, 	bool vCanChangeOrder = false);		// will sort a column
		void ScanDir(const std::string& vPath);																				// scan the directory for retrieve the file list
		void SetCurrentDir(const std::string& vPath);																		// define current directory for scan
		bool CreateDir(const std::string& vPath);																			// create a directory on the file system
		std::string ComposeNewPath(std::vector<std::string>::iterator vIter);												// compose a path from the compose path widget
		void GetDrives();																									// list drives on windows platform
		void ParseFilters(const char* vFilters);																			// parse filter syntax, detect and parse filter collection
		void SetSelectedFilterWithExt(const std::string& vFilter);															// select filter
		static std::string OptimizeFilenameForSearchOperations(std::string vFileName);										// easier the search by lower case all filenames
	    void ApplyFilteringOnFileList();																					// filter the file list accroding to the searh tags
		bool Confirm_Or_OpenOverWriteFileDialog_IfNeeded(bool vLastAction, ImGuiWindowFlags vFlags);						// treatment of the result, start the confirm to overwrite dialog if needed (if defined with flag)
		bool IsFileExist(const std::string& vFile);																			// is file exist

#ifdef USE_EXPLORATION_BY_KEYS
		// file localization by input chat // widget flashing
		void LocateByInputKey();																							// select a file line in listview according to char key
		bool LocateItem_Loop(ImWchar vC);																					// restrat for start of list view if not found a corresponding file
		void ExploreWithkeys();																								// select file/directory line in listview accroding to up/down enter/backspace keys
		static bool FlashableSelectable(																					// custom flashing selectable widgets, for flash the selected line in a short time
			const char* label, bool selected = false, ImGuiSelectableFlags flags = 0,
			bool vFlashing = false, const ImVec2& size = ImVec2(0, 0));
		void StartFlashItem(size_t vIdx);																					// define than an item must be flashed
		bool BeginFlashItem(size_t vIdx);																					// start the flashing of a line in lsit view
		void EndFlashItem();																								// end the fleshing accrdoin to var m_FlashAlphaAttenInSecs
#endif // USE_EXPLORATION_BY_KEYS

#ifdef USE_BOOKMARK
		void DrawBookmarkPane(ImVec2 vSize);																				// draw bookmark pane
#endif // USE_BOOKMARK
	};
}
typedef IGFD::UserDatas IGFDUserDatas;
typedef IGFD::PaneFun IGFDPaneFun;
typedef IGFD::FileDialog ImGuiFileDialog;
#else // __cplusplus
	typedef struct ImGuiFileDialog ImGuiFileDialog;
	typedef struct IGFD_Selection_Pair IGFD_Selection_Pair;
	typedef struct IGFD_Selection IGFD_Selection;
#endif // __cplusplus

// C Interface

#include <stdint.h>

#if defined _WIN32 || defined __CYGWIN__
	#ifdef IMGUIFILEDIALOG_NO_EXPORT
		#define API
	#else // IMGUIFILEDIALOG_NO_EXPORT
		#define API __declspec(dllexport)
	#endif // IMGUIFILEDIALOG_NO_EXPORT
#else // defined _WIN32 || defined __CYGWIN__
	#ifdef __GNUC__
		#define API  __attribute__((__visibility__("default")))
	#else // __GNUC__
		#define API
	#endif // __GNUC__
#endif // defined _WIN32 || defined __CYGWIN__

#ifdef __cplusplus
	#define IMGUIFILEDIALOG_API extern "C" API 
#else // __cplusplus
	#define IMGUIFILEDIALOG_API
#endif // __cplusplus

	////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	///// C API ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

	struct IGFD_Selection_Pair
	{
		char* fileName;
		char* filePathName;
	};

	IMGUIFILEDIALOG_API IGFD_Selection_Pair IGFD_Selection_Pair_Get();										// return an initialized IGFD_Selection_Pair			
	IMGUIFILEDIALOG_API void IGFD_Selection_Pair_DestroyContent(IGFD_Selection_Pair *vSelection_Pair);		// destroy the content of a IGFD_Selection_Pair
	
	struct IGFD_Selection
	{
		IGFD_Selection_Pair* table;	// 0
		size_t count;						// 0U
	};

	IMGUIFILEDIALOG_API IGFD_Selection IGFD_Selection_Get();												// return an initialized IGFD_Selection
	IMGUIFILEDIALOG_API void IGFD_Selection_DestroyContent(IGFD_Selection* vSelection);						// destroy the content of a IGFD_Selection

	// constructor / destructor
	IMGUIFILEDIALOG_API ImGuiFileDialog* IGFD_Create(void);													// create the filedialog context
	IMGUIFILEDIALOG_API void IGFD_Destroy(ImGuiFileDialog *vContext);										// destroy the filedialog context

	typedef void (*IGFD_PaneFun)(const char*, void*, bool*);												// callback fucntion for display the pane
	
	IMGUIFILEDIALOG_API void IGFD_OpenDialog(					// open a standard dialog
		ImGuiFileDialog* vContext,								// ImGuiFileDialog context
		const char* vKey,										// key dialog
		const char* vTitle,										// title
		const char* vFilters,									// filters/filter collections. set it to null for directory mode 
		const char* vPath,										// path
		const char* vFileName,									// defaut file name
		const int vCountSelectionMax,							// count selection max
		void* vUserDatas,										// user datas (can be retrieved in pane)
		ImGuiFileDialogFlags vFlags);							// ImGuiFileDialogFlags 
	
	IMGUIFILEDIALOG_API void IGFD_OpenDialog2(					// open a standard dialog
		ImGuiFileDialog* vContext,								// ImGuiFileDialog context
		const char* vKey,										// key dialog
		const char* vTitle,										// title
		const char* vFilters,									// filters/filter collections. set it to null for directory mode 
		const char* vFilePathName,								// defaut file path name (path and filename witl be extracted from it)
		const int vCountSelectionMax,							// count selection max
		void* vUserDatas,										// user datas (can be retrieved in pane)
		ImGuiFileDialogFlags vFlags);							// ImGuiFileDialogFlags 

	IMGUIFILEDIALOG_API void IGFD_OpenPaneDialog(				// open a standard dialog with pane
		ImGuiFileDialog* vContext,								// ImGuiFileDialog context
		const char* vKey,										// key dialog
		const char* vTitle,										// title
		const char* vFilters,									// filters/filter collections. set it to null for directory mode 
		const char* vPath,										// path
		const char* vFileName,									// defaut file name
		const IGFD_PaneFun vSidePane,							// side pane
		const float vSidePaneWidth,								// side pane base width
		const int vCountSelectionMax,							// count selection max
		void* vUserDatas,										// user datas (can be retrieved in pane)
		ImGuiFileDialogFlags vFlags);							// ImGuiFileDialogFlags 

	IMGUIFILEDIALOG_API void IGFD_OpenPaneDialog2(				// open a standard dialog with pane
		ImGuiFileDialog* vContext,								// ImGuiFileDialog context
		const char* vKey,										// key dialog
		const char* vTitle,										// title
		const char* vFilters,									// filters/filter collections. set it to null for directory mode 
		const char* vFilePathName,								// defaut file name (path and filename witl be extracted from it)
		const IGFD_PaneFun vSidePane,							// side pane
		const float vSidePaneWidth,								// side pane base width
		const int vCountSelectionMax,							// count selection max
		void* vUserDatas,										// user datas (can be retrieved in pane)
		ImGuiFileDialogFlags vFlags);							// ImGuiFileDialogFlags 

	IMGUIFILEDIALOG_API void IGFD_OpenModal(					// open a modal dialog
		ImGuiFileDialog* vContext,								// ImGuiFileDialog context
		const char* vKey,										// key dialog
		const char* vTitle,										// title
		const char* vFilters,									// filters/filter collections. set it to null for directory mode 
		const char* vPath,										// path
		const char* vFileName,									// defaut file name
		const int vCountSelectionMax,							// count selection max
		void* vUserDatas,										// user datas (can be retrieved in pane)
		ImGuiFileDialogFlags vFlags);							// ImGuiFileDialogFlags 

	IMGUIFILEDIALOG_API void IGFD_OpenModal2(					// open a modal dialog
		ImGuiFileDialog* vContext,								// ImGuiFileDialog context
		const char* vKey,										// key dialog
		const char* vTitle,										// title
		const char* vFilters,									// filters/filter collections. set it to null for directory mode 
		const char* vFilePathName,								// defaut file name (path and filename witl be extracted from it)
		const int vCountSelectionMax,							// count selection max
		void* vUserDatas,										// user datas (can be retrieved in pane)
		ImGuiFileDialogFlags vFlags);							// ImGuiFileDialogFlags 

	IMGUIFILEDIALOG_API void IGFD_OpenPaneModal(				// open a modal dialog with pane
		ImGuiFileDialog* vContext,								// ImGuiFileDialog context
		const char* vKey,										// key dialog
		const char* vTitle,										// title
		const char* vFilters,									// filters/filter collections. set it to null for directory mode 
		const char* vPath,										// path
		const char* vFileName,									// defaut file name
		const IGFD_PaneFun vSidePane,							// side pane
		const float vSidePaneWidth,								// side pane base width
		const int vCountSelectionMax,							// count selection max
		void* vUserDatas,										// user datas (can be retrieved in pane)
		ImGuiFileDialogFlags vFlags);							// ImGuiFileDialogFlags 

	IMGUIFILEDIALOG_API void IGFD_OpenPaneModal2(				// open a modal dialog with pane
		ImGuiFileDialog* vContext,								// ImGuiFileDialog context
		const char* vKey,										// key dialog
		const char* vTitle,										// title
		const char* vFilters,									// filters/filter collections. set it to null for directory mode 
		const char* vFilePathName,								// defaut file name (path and filename witl be extracted from it)
		const IGFD_PaneFun vSidePane,							// side pane
		const float vSidePaneWidth,								// side pane base width
		const int vCountSelectionMax,							// count selection max
		void* vUserDatas,										// user datas (can be retrieved in pane)
		ImGuiFileDialogFlags vFlags);							// ImGuiFileDialogFlags 

	IMGUIFILEDIALOG_API bool IGFD_DisplayDialog(				// Display the dialog
		ImGuiFileDialog* vContext,								// ImGuiFileDialog context
		const char* vKey,										// key dialog to display (if not the same key as defined by OpenDialog/Modal => no opening)
		ImGuiWindowFlags vFlags,								// ImGuiWindowFlags
		ImVec2 vMinSize,										// mininmal size contraint for the ImGuiWindow
		ImVec2 vMaxSize);										// maximal size contraint for the ImGuiWindow

	IMGUIFILEDIALOG_API void IGFD_CloseDialog(					// Close the dialog
		ImGuiFileDialog* vContext);								// ImGuiFileDialog context			

	IMGUIFILEDIALOG_API bool IGFD_IsOk(							// true => Dialog Closed with Ok result / false : Dialog closed with cancel result
		ImGuiFileDialog* vContext);								// ImGuiFileDialog context		

	IMGUIFILEDIALOG_API bool IGFD_WasKeyOpenedThisFrame(		// say if the dialog key was already opened this frame
		ImGuiFileDialog* vContext, 								// ImGuiFileDialog context		
		const char* vKey);

	IMGUIFILEDIALOG_API bool IGFD_WasOpenedThisFrame(			// say if the dialog was already opened this frame
		ImGuiFileDialog* vContext);								// ImGuiFileDialog context	

	IMGUIFILEDIALOG_API bool IGFD_IsKeyOpened(					// say if the dialog key is opened
		ImGuiFileDialog* vContext, 								// ImGuiFileDialog context		
		const char* vCurrentOpenedKey);							// the dialog key

	IMGUIFILEDIALOG_API bool IGFD_IsOpened(						// say if the dialog is opened somewhere	
		ImGuiFileDialog* vContext);								// ImGuiFileDialog context		
	
	IMGUIFILEDIALOG_API IGFD_Selection IGFD_GetSelection(		// Open File behavior : will return selection via a map<FileName, FilePathName>
		ImGuiFileDialog* vContext);								// ImGuiFileDialog context		

	IMGUIFILEDIALOG_API char* IGFD_GetFilePathName(				// Save File behavior : will always return the content of the field with current filter extention and current path
		ImGuiFileDialog* vContext);								// ImGuiFileDialog context				

	IMGUIFILEDIALOG_API char* IGFD_GetCurrentFileName(			// Save File behavior : will always return the content of the field with current filter extention
		ImGuiFileDialog* vContext);								// ImGuiFileDialog context				

	IMGUIFILEDIALOG_API char* IGFD_GetCurrentPath(				// will return current path
		ImGuiFileDialog* vContext);								// ImGuiFileDialog context					

	IMGUIFILEDIALOG_API char* IGFD_GetCurrentFilter(			// will return selected filter
		ImGuiFileDialog* vContext);								// ImGuiFileDialog context						

	IMGUIFILEDIALOG_API void* IGFD_GetUserDatas(				// will return user datas send with Open Dialog/Modal
		ImGuiFileDialog* vContext);								// ImGuiFileDialog context											

	IMGUIFILEDIALOG_API void IGFD_SetExtentionInfos(			// SetExtention datas for have custom display of particular file type
		ImGuiFileDialog* vContext,								// ImGuiFileDialog context 
		const char* vFilter,									// extention filter to tune
		ImVec4 vColor,											// wanted color for the display of the file with extention filter
		const char* vIconText);									// wanted text or icon of the file with extention filter (can be sued with font icon)

	IMGUIFILEDIALOG_API void IGFD_SetExtentionInfos2(			// SetExtention datas for have custom display of particular file type
		ImGuiFileDialog* vContext,								// ImGuiFileDialog context 
		const char* vFilter,									// extention filter to tune
		float vR, float vG, float vB, float vA,					// wanted color channels RGBA for the display of the file with extention filter
		const char* vIconText);									// wanted text or icon of the file with extention filter (can be sued with font icon)

	IMGUIFILEDIALOG_API bool IGFD_GetExtentionInfos(
		ImGuiFileDialog* vContext,								// ImGuiFileDialog context 
		const char* vFilter,									// extention filter (same as used in SetExtentionInfos)
		ImVec4* vOutColor,										// color to retrieve
		char** vOutIconText);									// icon or text to retrieve

	IMGUIFILEDIALOG_API void IGFD_ClearExtentionInfos(			// clear extentions setttings
		ImGuiFileDialog* vContext);								// ImGuiFileDialog context

#ifdef USE_EXPLORATION_BY_KEYS
	IMGUIFILEDIALOG_API void IGFD_SetFlashingAttenuationInSeconds(	// set the flashing time of the line in file list when use exploration keys
		ImGuiFileDialog* vContext,									// ImGuiFileDialog context 
		float vAttenValue);											// set the attenuation (from flashed to not flashed) in seconds
#endif

#ifdef USE_BOOKMARK
	IMGUIFILEDIALOG_API char* IGFD_SerializeBookmarks(			// serialize bookmarks : return bookmark buffer to save in a file
		ImGuiFileDialog* vContext);								// ImGuiFileDialog context

	IMGUIFILEDIALOG_API void IGFD_DeserializeBookmarks(			// deserialize bookmarks : load bookmar buffer to load in the dialog (saved from previous use with SerializeBookmarks())
		ImGuiFileDialog* vContext,								// ImGuiFileDialog context 
		const char* vBookmarks);								// bookmark buffer to load 
#endif

	////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

#endif // IMGUIFILEDIALOG_H
