121 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
		
		
			
		
	
	
			121 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
|   | ## Portable File Dialogs documentation
 | ||
|  | 
 | ||
|  | The library can be used either as a [header-only library](https://en.wikipedia.org/wiki/Header-only), | ||
|  | or as a [single file library](https://github.com/nothings/single_file_libs). | ||
|  | 
 | ||
|  | ### Use as header-only library
 | ||
|  | 
 | ||
|  | Just include the main header file wherever needed: | ||
|  | 
 | ||
|  | ```cpp | ||
|  | #include "portable-file-dialogs.h"
 | ||
|  | 
 | ||
|  | /* ... */ | ||
|  | 
 | ||
|  |     pfd::message::message("Hello", "This is a test"); | ||
|  | 
 | ||
|  | /* ... */ | ||
|  | ``` | ||
|  | 
 | ||
|  | ### Use as a single-file library
 | ||
|  | 
 | ||
|  | Defining the `PFD_SKIP_IMPLEMENTATION` macro before including `portable-file-dialogs.h` will | ||
|  | skip all the implementation code and reduce compilation times. You still need to include the | ||
|  | header without the macro at least once, typically in a `pfd-impl.cpp` file. | ||
|  | 
 | ||
|  | ```cpp | ||
|  | // In pfd-impl.cpp | ||
|  | #include "portable-file-dialogs.h"
 | ||
|  | ``` | ||
|  | 
 | ||
|  | ```cpp | ||
|  | // In all other files | ||
|  | #define PFD_SKIP_IMPLEMENTATION 1
 | ||
|  | #include "portable-file-dialogs.h"
 | ||
|  | ``` | ||
|  | 
 | ||
|  | ### General concepts
 | ||
|  | 
 | ||
|  | Dialogs inherit from `pfd::dialog` and are created by calling their class constructor. Their | ||
|  | destructor will block until the window is closed by user interaction. So for instance this | ||
|  | will block until the end of the line: | ||
|  | 
 | ||
|  | ```cpp | ||
|  | pfd::message::message("Hi", "there"); | ||
|  | ``` | ||
|  | 
 | ||
|  | Whereas this will only block until the end of the scope, allowing the program to perform | ||
|  | additional operations while the dialog is open: | ||
|  | 
 | ||
|  | ```cpp | ||
|  | { | ||
|  |     auto m = pfd::message::message("Hi", "there"); | ||
|  | 
 | ||
|  |     // ... perform asynchronous operations here | ||
|  | } | ||
|  | ``` | ||
|  | 
 | ||
|  | It is possible to call `bool pfd::dialog::ready(timeout)` on the dialog in order to query its | ||
|  | status and perform asynchronous operations as long as the user has not interacted: | ||
|  | 
 | ||
|  | ```cpp | ||
|  | { | ||
|  |     auto m = pfd::message::message("Hi", "there"); | ||
|  | 
 | ||
|  |     while (!m.ready()) | ||
|  |     { | ||
|  |         // ... perform asynchronous operations here | ||
|  |     } | ||
|  | } | ||
|  | ``` | ||
|  | 
 | ||
|  | If necessary, a dialog can be forcibly closed using `bool pfd::dialog::kill()`. Note that this | ||
|  | may be confusing to the user and should only be used in very specific situations. It is also not | ||
|  | possible to close a Windows message box that provides no _Cancel_ button. | ||
|  | 
 | ||
|  | ```cpp | ||
|  | { | ||
|  |     auto m = pfd::message::message("Hi", "there"); | ||
|  | 
 | ||
|  |     while (!m.ready()) | ||
|  |     { | ||
|  |         // ... perform asynchronous operations here | ||
|  | 
 | ||
|  |         if (too_much_time_has_passed()) | ||
|  |             m.kill(); | ||
|  |     } | ||
|  | } | ||
|  | ``` | ||
|  | 
 | ||
|  | Finally, the user response can be retrieved using `pfd::dialog::result()`. The return value of | ||
|  | this function depends on which dialog is being used. See their respective documentation for more | ||
|  | information: | ||
|  | 
 | ||
|  |   * [`pfd::message`](message.md) (message box) | ||
|  |   * [`pfd::notify`](notify.md) (notification) | ||
|  |   * [`pfd::open_file`](open_file.md) (file open) | ||
|  |   * [`pfd::save_file`](save_file.md) (file save) | ||
|  |   * [`pfd::select_folder`](select_folder.md) (folder selection) | ||
|  | 
 | ||
|  | ### Settings
 | ||
|  | 
 | ||
|  | The library can be queried and configured through the `pfd::settings` class. | ||
|  | 
 | ||
|  | ```cpp | ||
|  | bool pfd::settings::available(); | ||
|  | void pfd::settings::verbose(bool value); | ||
|  | void pfd::settings::rescan(); | ||
|  | ``` | ||
|  | 
 | ||
|  | The return value of `pfd::settings::available()` indicates whether a suitable dialog backend (such | ||
|  | as Zenity or KDialog on Linux) has been found. If not, the library will not work and all dialog | ||
|  | invocations will be no-ops. The program will not crash but you should account for this situation | ||
|  | and add a fallback mechanism or exit gracefully. | ||
|  | 
 | ||
|  | Calling `pfd::settings::rescan()` will force a rescan of available backends. This may change the | ||
|  | result of `pfd::settings::available()` if a backend was installed on the system in the meantime. | ||
|  | This is probably only useful for debugging purposes. | ||
|  | 
 | ||
|  | Calling `pfd::settings::verbose(true)` may help debug the library. It will output debug information | ||
|  | to `std::cout` about some operations being performed. |