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