docs/src/auxiliary-modules/file_explorer.rst
.. _file_explorer:
lv_file_explorer provides a UI enabling the end user to browse the contents of a
file system. Its main area is called the "Browsing Area" and provides the list of
files contained in the currently-viewed directory.
When enabled, there is also a "Quick-Access" panel on the left, which provides a convenient way to reach parts of the file system that are frequently accessed. Available "Quick-Access" destinations are:
You specify what paths these lead to during lv_file_explorer\ 's initialization.
lv_file_explorer only provides the file browsing and events caused by user
activity (e.g. clicking a file), but does not provide the actual file operations.
Client code must hook various events and decide what to do when they are emitted
(e.g. a click or double-click on a file). The actions taken might to open the file,
display it, send it to some other part of the application, etc..
lv_file_explorer passes the full path and name of file that was clicked to the
event callback functions. What happens next is up to the application designer.
lv_file_explorer uses the :ref:lv_table Widget for the "Browsing Area", and the
:ref:lv_list Widget for the "Quick-Access" panel when it is enabled. Thus,
:c:macro:LV_USE_TABLE macro must be set to a non-zero value in lv_conf.h in
order to use lv_file_explorer, and and :c:macro:LV_USE_LIST must be set to a
non-zero value to use the "Quick-Access" panel.
.. note::
In order to use File Explorer, :ref:`file_system` has to be set up and
know about all the drive letters you use when passing paths to File System
(described below).
Prerequisites
If you haven't already done so, you will need to learn about the LVGL :ref:File System abstraction <file_system>, since it must be set up and be functional
for File Explorer to work.
.. _file_explorer_usage:
Usage
Set :c:macro:LV_USE_FILE_EXPLORER to a non-zero value in lv_conf.h.
First use :cpp:expr:lv_file_explorer_create(lv_screen_active()) to create a File
Explorer. The default size is the screen size. After that, you can
customize the style like any Widget.
The size of the current_path buffer is set by :c:macro:LV_FILE_EXPLORER_PATH_MAX_LEN
in lv_conf.h.
The object hierarchy of a freshly-created File Explorer looks like this:
File Explorer: occupies full area of parent Widget, typically a Screen (Flex-Flow COLUMN)
Container: occupies full area of File Explorer (Flex grow 1)
Quick-Access Panel:
Device List: grows to accommodate children
File System: buttonPlaces List: grows to accommodate children
HOME: buttonVideo: buttonPictures: buttonMusic: buttonDocuments: buttonBrowser Panel:
Header: 14% of Browser Panel height
Current Path: labelFile Table: with 1 column, 86% of Browser Panel height
Fields:
home_dir = NULLvideo_dir = NULLpictures_dir = NULLmusic_dir = NULLdocs_dir = NULLfs_dir = NULLcurrent_path = [empty buffer]sel_fn (selected file)sort (default :cpp:enumerator:LV_EXPLORER_SORT_NONE)This list of functions provides access to the parts shown in diagram above:
lv_file_explorer_get_selected_file_name(explorer) (pointer
to NUL-terminated string containing file-path user selected; typically used inside
an :cpp:enumerator:LV_EVENT_CLICKED event)lv_file_explorer_get_current_path(explorer) (pointer to current_path char buffer)lv_file_explorer_get_file_table(explorer) (pointer to File Table :ref:lv_table Widget)lv_file_explorer_get_header(explorer) (pointer to Header :ref:base_widget Widget)lv_file_explorer_get_path_label(explorer) (pointer to Current Path Label :ref:lv_label Widget)lv_file_explorer_get_quick_access_area(explorer) (pointer to Quick-Access Panel :ref:base_widget)lv_file_explorer_get_places_list(explorer) (pointer to Places List :ref:lv_list Widget)lv_file_explorer_get_device_list(explorer) (pointer to Device List :ref:lv_list Widget)The Quick-Access Panel behaves like a typical navigation panel and appears on the
left, while the Browser Panel appears on the right
This panel is optional. If you set :c:macro:LV_FILE_EXPLORER_QUICK_ACCESS to 0
in lv_conf.h, the Quick-Access Panel will not be created. This saves only a
little bit of memory.
Soon after the File Explorer is created, you typically use
:cpp:expr:lv_file_explorer_set_quick_access_path(explorer, LV_EXPLORER_XXX_DIR, "path")
to set the path that will be navigated to when the buttons in the Quick-Access Panel
are clicked, which is currently a fixed list. The corresponding values you will need
to pass as the 2nd argument are the following:
LV_EXPLORER_HOME_DIRLV_EXPLORER_MUSIC_DIRLV_EXPLORER_PICTURES_DIRLV_EXPLORER_VIDEO_DIRLV_EXPLORER_DOCS_DIRLV_EXPLORER_FS_DIR.. _file_explorer_sort:
You can use
:cpp:expr:lv_file_explorer_set_sort(explorer, LV_EXPLORER_SORT_XX) to set
the sorting method.
These are the possible sorting methods:
LV_EXPLORER_SORT_NONE (default)LV_EXPLORER_SORT_KIND:cpp:expr:lv_file_explorer_get_sort(explorer) returns the current sorting method.
.. _file_explorer_events:
Events
:cpp:enumerator:LV_EVENT_READY Sent when a directory is opened, which can happen:
Quick-Access Panel navigation button, andBrowser Panel.You can use it to, for example, customize the file sort.
:cpp:enumerator:LV_EVENT_VALUE_CHANGED Sent once when any item (file) in the
Browser Panel\ 's file list is clicked.
:cpp:enumerator:LV_EVENT_CLICKED Sent twice when an item in the Browser Panel
is clicked: once as a result of the input-device :cpp:enumerator:LV_EVENT_RELEASED
event and a second as a result of the input device :cpp:enumerator:LV_EVENT_CLICKED
event. This applies to files, directories, and the "< Back" item in the Browser Panel.
In these events you can use :cpp:func:lv_file_explorer_get_current_path to get the
current path and :cpp:func:lv_file_explorer_get_selected_file_name to get the name
of the currently selected file in the event processing function. For example:
.. code-block:: c
static void file_explorer_event_handler(lv_event_t * e) { lv_event_code_t code = lv_event_get_code(e); lv_obj_t * obj = lv_event_get_target(e);
if(code == LV_EVENT_VALUE_CHANGED) {
char * cur_path = lv_file_explorer_get_current_path(widget);
char * sel_fn = lv_file_explorer_get_selected_file_name(widget);
LV_LOG_USER("%s%s", cur_path, sel_fn);
}
}
You can also save the obtained path and file name into an array
through functions such as :cpp:func:strcpy and :cpp:func:strcat for later use.
.. _file_explorer_example:
Examples
.. include:: /examples/others/file_explorer/index.rst
.. _file_explorer_api:
API