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.
							 |