AG_FileDlg
— agar
file browser widget
#include <agar/core.h>
#include <agar/gui.h>
AG_FileDlg
is a traditional file selection
widget. It displays a list of directories and shortcuts at the left, a list
of files at the right and an input textbox and file type selector at the
bottom. If supports filesystem monitoring via
AG_AddEventSink(3).
On platforms with
glob(3)
support, glob patterns may be entered in the input textbox.
Although AG_FileDlg
is most often used to
implement "Load" or "Save as..." dialog windows, it may
also be embedded into any arbitrary container widget. User-specified actions
(with optional parameters) can be tied to specific file extensions.
For selecting directories, the
AG_DirDlg(3)
widget may be used instead.
AG_FileDlg *
AG_FileDlgNew
(AG_Widget
*parent, Uint
flags);
AG_FileDlg *
AG_FileDlgNewMRU
(AG_Widget
*parent, const char
*mruKey, Uint
flags);
AG_FileDlg *
AG_FileDlgNewCompact
(AG_Widget
*parent, const char
*label, Uint
flags);
AG_FileDlg *
AG_FileDlgNewCompactMRU
(AG_Widget
*parent, const char
*label, const char
*mruKey, Uint
flags);
char *
AG_FileDlgGetDirectory
(AG_FileDlg
*fd);
AG_Size
AG_FileDlgCopyDirectory
(AG_FileDlg
*fd, char *dst,
AG_Size size);
int
AG_FileDlgSetDirectory
(AG_FileDlg
*fd, const char
*format, ...);
int
AG_FileDlgSetDirectoryS
(AG_FileDlg
*fd, const char
*path);
void
AG_FileDlgSetDirectoryMRU
(AG_FileDlg
*fd, const char
*mruKey, const char
*defaultDir);
char *
AG_FileDlgGetFilename
(AG_FileDlg
*fd);
AG_Size
AG_FileDlgCopyFilename
(AG_FileDlg
*fd, char *dst,
AG_Size size);
void
AG_FileDlgSetFilename
(AG_FileDlg
*fd, const char
*format, ...);
void
AG_FileDlgSetFilenameS
(AG_FileDlg
*fd, const char
*filename);
AG_FileType *
AG_FileDlgAddType
(AG_FileDlg
*fd, const char
*descr, const char
*exts, void
(*fn)(AG_Event *), const
char *fnArgs,
...);
void
AG_FileDlgAddImageTypes
(AG_FileDlg
*fd, void (*fn)(AG_Event
*), const char
*fnArgs, ...);
void
AG_FileDlgCopyTypes
(AG_FileDlg
*dst, const AG_FileDlg
*src);
void
AG_FileDlgRefresh
(AG_FileDlg
*fd);
AG_FileDlgNew
()
allocates, initializes, and attaches a new
AG_FileDlg
.
The
AG_FileDlgNewMRU
()
variant calls AG_FileDlgSetDirectoryMRU
() with
mruKey. Unless
AG_FileDlgSetDirectory
() is used (see below), the
default directory is set according to the
AG_CONFIG_PATH_DATA
setting of
AG_Config(3).
AG_FileDlgNewCompact
()
and AG_FileDlgNewCompactMRU
() implicitely set the
AG_FILEDLG_COMPACT
flag as well as the contents of
the display label.
Acceptable flags include:
- AG_FILEDLG_COMPACT
- Proxy mode. Collapse to a single-line textbox and "..." button.
The expand button shows a regular
AG_FileDlg
in a
new window. If the user selects a file and clicks "OK", the file
path is copied to the textbox of the compact
AG_FileDlg
.
- AG_FILEDLG_MASK_EXT
- Mask unknown files by extension.
- AG_FILEDLG_MASK_HIDDEN
- Mask hidden files.
- AG_FILEDLG_MULTI
- Allow multiple files to be selected at once.
- AG_FILEDLG_CLOSEWIN
- Automatically close the
AG_FileDlg
widget's parent
window when a file is selected.
- AG_FILEDLG_LOAD
- The selected file must exist and be readable or an error is returned to
the user.
- AG_FILEDLG_SAVE
- The selected file must be writeable or an error is returned to the
user.
- AG_FILEDLG_ASYNC
- Load/save routines will be executed in a separate thread. This flag is
available only if agar was compiled with threads support.
- AG_FILEDLG_NOMASKOPTS
- Don't display "Mask files by extension" and "Mask hidden
files" checkboxes.
- AG_FILEDLG_NOTYPESELECT
- Don't display the "Type:" selector dropbox.
- AG_FILEDLG_NOBUTTONS
- Don't display "OK" and "Cancel" buttons.
- AG_FILEDLG_HFILL
- Expand horizontally in parent container.
- AG_FILEDLG_VFILL
- Expand vertically in parent container.
- AG_FILEDLG_EXPAND
- Shorthand for
AG_FILEDLG_HFILL
|
AG_FILEDLG_VFILL
.
The working directory can be
retrieved as a newly-allocated string using
AG_FileDlgGetDirectory
(),
or copied into a fixed-size buffer with
AG_FileDlgCopyDirectory
().
AG_FileDlgSetDirectory
().
AG_FileDlgSetDirectoryMRU
()
sets the working directory according to an
AG_Config(3)
parameter named mruKey. If the parameter does not
exist, it will be set to defaultDir (it is customary
to use a name such as ‘myapp.mru.foofiles’). If
AG_FileDlgSetDirectoryMRU
() is used, subsequent
directory changes will cause the current
AG_Config(3)
settings to be saved automatically.
The current filename can be retrieved
as a newly-allocated string using
AG_FileDlgGetFilename
(),
or copied into a fixed-size buffer with
AG_FileDlgCopyFilename
().
The
AG_FileDlgSetFilename
()
function sets the filename to initially display in the textbox. It is
typically used in file saving dialogs.
AG_FileDlgAddType
()
registers a new type-specific event handler for a given file format (and
associated set of filename extensions). If fn is
non-NULL, it sets a type-specific callback to invoke when a file of the
selected type is selected by the user. descr is a
description of the file format and exts is a
comma-separated list of filename extensions or special directives (enclosed
in "<>"). Syntax for extensions include:
- .txt or *.txt
- Match all files ending in ".txt".
- <-x>
- Match all files that are executable by the effective owner of the process
(using
AG_GetFileInfo(3)).
- <=hello.txt>
- Only match hello.txt (case-sensitive exact
match).
- <=hello.txt/i>
- Match hello.txt,
Hello.txt, etc (case-insensitive).
Type-specific handlers do not override the general
"file-chosen" event handler when one exists (if both are set then
the type-specific handler is run first, followed by
"file-chosen").
AG_FileDlgAddImageTypes
()
registers a common handler for all image types recognized by
AG_SurfaceFromFile(3)
(such as BMP, PNG and JPEG).
AG_FileDlgCopyTypes
()
copies the set of AG_FileType (and any associated
type-specific options), from one AG_FileDlg
to
another.
The
AG_FileDlgRefresh
()
function updates the displayed directory structure and current directory
contents.
By default, selecting a file will trigger the following
checks:
- If
AG_FILEDLG_LOAD
or
AG_FILEDLG_SAVE
is set, check whether the file is
readable or writeable.
- If
AG_FILEDLG_SAVE
is set and a file exists,
display a "Replace file?" prompt.
- Execute the format-specific callback, as
previously configured with
AG_FileDlgAddType
().
- If
AG_FILEDLG_CLOSEWIN
is set, close the parent
window.
The default action performed when a user clicks on
"Cancel" is simply to close the parent window if
AG_FILEDLG_CLOSEWIN
is set.
These default actions can be overridden using the functions
below:
void
AG_FileDlgOkAction
(AG_FileDlg
*fd, void (*fn)(AG_Event
*), const char
*fmt, ...);
void
AG_FileDlgCancelAction
(AG_FileDlg
*fd, void (*fn)(AG_Event
*), const char
*fmt, ...);
int
AG_FileDlgCheckReadAccess
(AG_FileDlg
*fd);
int
AG_FileDlgCheckWriteAccess
(AG_FileDlg
*fd);
The
AG_FileDlgOkAction
()
function configures an event handler function to invoke when a file is
selected, overriding the default behavior. The event handler will be passed
a string argument containing the absolute path to the selected file,
followed by a pointer to the AG_FileType structure for
the file type selected by the user (see
STRUCTURE DATA for details).
AG_FileDlgCancelAction
()
overrides the default behavior of the "Cancel" button.
AG_FileDlgCheckReadAccess
()
and AG_FileDlgCheckWriteAccess
() evaluate whether
the selected file is readable or writeable.
When we are using AG_FileDlg
to load and
save files, we may want to provide the user with format-specific options
that will affect the loading or saving process. Format-specific options are
associated with a file type (an AG_FileType as
returned by AG_FileDlgAddType
()). When a file type
is selected, AG_FileDlg
displays basic widgets
enabling the user to manipulate those options.
void
AG_FileDlgSetOptionContainer
(AG_FileDlg
*fd, AG_Widget
*container);
AG_FileOption *
AG_FileOptionNewBool
(AG_FileType
*type, const char
*descr, const char
*key, int
default);
AG_FileOption *
AG_FileOptionNewInt
(AG_FileType
*type, const char
*descr, const char
*key, int default,
int min,
int max);
AG_FileOption *
AG_FileOptionNewFlt
(AG_FileType
*type, const char
*descr, const char
*key, float
default, float min,
float max,
const char *unit);
AG_FileOption *
AG_FileOptionNewDbl
(AG_FileType
*type, const char
*descr, const char
*key, double
default, double
min, double max,
const char *unit);
AG_FileOption *
AG_FileOptionGet
(AG_FileType
*type, const char
*key);
int
AG_FileOptionBool
(AG_FileType
*type, const char
*key);
int
AG_FileOptionInt
(AG_FileType
*type, const char
*key);
float
AG_FileOptionFlt
(AG_FileType
*type, const char
*key);
double
AG_FileOptionDbl
(AG_FileType
*type, const char
*key);
AG_FileDlgSetOptionContainer
()
arranges for the given container widget to hold the control widgets that
will be dynamically created.
AG_FileOptionNewBool
()
registers a boolean option, manipulated by an
AG_Checkbox(3).
descr is a description string and
key is a handle that the save/load routine will use to
retrieve the option. default indicates the initial
value of the option (1 = true, 0 = false).
AG_FileOptionNewInt
()
registers an integer option, manipulated by an
AG_Numerical(3).
default is the initial value,
min and max define the
bounds.
AG_FileOptionNewFlt
()
and AG_FileOptionNewDbl
() register single and double
precision floating-point options, using
AG_Numerical(3).
default is the initial value,
min and max define the bounds
and unit, if not NULL, is the unit system to use (see
AG_Units(3)).
AG_FileOptionGet
()
returns a pointer to the AG_FileOption structure for
the given option name, or NULL if there is no such option.
AG_FileOptionBool
(),
AG_FileOptionInt
(),
AG_FileOptionFlt
() and
AG_FileOptionDbl
() return the value of the given
option.
The AG_FileDlg
widget does not provide any
bindings.
The AG_FileDlg
widget generates the
following events:
file-chosen
(char
*path, AG_FileType *type)
- User has selected the given file. path is the full
pathname to the file. If not NULL, type describes
the matching type of the file.
file-selected
(char
*path)
- User has moved selection over the given file, where
path is the full pathname to it. This event is
useful for things like previewing file contents using an external
widget.
dir-selected
(char
*path)
- The given directory was selected.
For the AG_FileDlg object:
- char cwd[AG_PATHNAME_MAX]
- Absolute path of current working directory.
- char cfile[AG_PATHNAME_MAX]
- Absolute path of last selected file.
For the AG_FileType
structure (as returned by
AG_FileDlgAddType
()):
- AG_FileDlg *fd
- Back pointer to the parent AG_FileDlg
(read-only).
- char **exts
- List of associated file extensions.
- Uint nExts
- Count of file extensions.
- const char *descr
- Description string (read-only).
- AG_Event *action
- Callback function (as returned by
AG_SetEvent(3))
to invoke when a file of this type is selected for a load/save
operation.
See tests/loader.c in the Agar source
distribution.
The AG_FileDlg
widget first appeared in
Agar 1.0. The AG_FILEDLG_COMPACT
option as well as
AG_FileDlgNewCompact
(),
AG_FileDlgNewCompactMRU
(),
AG_FileDlgGetDirectory
(),
AG_FileDlgCopyDirectory
(),
AG_FileDlgGetFilename
(),
AG_FileDlgCopyFilename
(),
AG_FileDlgCopyTypes
() and
AG_FileDlgAddImageTypes
() routines appeared in Agar
1.6.0.