2024-01-04 07:25:13 +01:00
|
|
|
.. _flex:
|
|
|
|
|
2023-04-27 06:42:02 -06:00
|
|
|
====
|
|
|
|
Flex
|
|
|
|
====
|
|
|
|
|
|
|
|
Overview
|
|
|
|
********
|
|
|
|
|
|
|
|
The Flexbox (or Flex for short) is a subset of `CSS Flexbox <https://css-tricks.com/snippets/css/a-guide-to-flexbox/>`__.
|
|
|
|
|
|
|
|
It can arrange items into rows or columns (tracks), handle wrapping,
|
|
|
|
adjust the spacing between the items and tracks, handle *grow* to make
|
|
|
|
the item(s) fill the remaining space with respect to min/max width and
|
|
|
|
height.
|
|
|
|
|
|
|
|
To make an object flex container call
|
2024-01-04 07:25:13 +01:00
|
|
|
:cpp:expr:`lv_obj_set_layout(obj, LV_LAYOUT_FLEX)`.
|
2023-04-27 06:42:02 -06:00
|
|
|
|
|
|
|
Note that the flex layout feature of LVGL needs to be globally enabled
|
|
|
|
with :c:macro:`LV_USE_FLEX` in ``lv_conf.h``.
|
|
|
|
|
|
|
|
Terms
|
|
|
|
*****
|
|
|
|
|
2024-01-06 08:34:02 +01:00
|
|
|
- **tracks**: the rows or columns
|
|
|
|
- **main direction**: row or column, the direction in which the items are
|
2023-04-27 06:42:02 -06:00
|
|
|
placed
|
2024-01-06 08:34:02 +01:00
|
|
|
- **cross direction**: perpendicular to the main direction
|
|
|
|
- **wrap**: if there is no more space in the track a new track is started
|
|
|
|
- **grow**: if set on an item it will grow to fill the remaining space on
|
2023-04-27 06:42:02 -06:00
|
|
|
the track. The available space will be distributed among items
|
|
|
|
respective to their grow value (larger value means more space)
|
2024-01-06 08:34:02 +01:00
|
|
|
- **gap**: the space between the rows and columns or the items on a track
|
2023-04-27 06:42:02 -06:00
|
|
|
|
|
|
|
Simple interface
|
|
|
|
****************
|
|
|
|
|
|
|
|
With the following functions you can set a Flex layout on any parent.
|
|
|
|
|
2024-01-04 07:25:13 +01:00
|
|
|
.. _flex_flow:
|
|
|
|
|
2023-04-27 06:42:02 -06:00
|
|
|
Flex flow
|
|
|
|
---------
|
|
|
|
|
2024-01-04 07:25:13 +01:00
|
|
|
:cpp:expr:`lv_obj_set_flex_flow(obj, flex_flow)`
|
2023-04-27 06:42:02 -06:00
|
|
|
|
|
|
|
The possible values for ``flex_flow`` are:
|
|
|
|
|
2024-01-04 07:25:13 +01:00
|
|
|
- :cpp:enumerator:`LV_FLEX_FLOW_ROW`: Place the children in a row without wrapping
|
|
|
|
- :cpp:enumerator:`LV_FLEX_FLOW_COLUMN`: Place the children in a column without wrapping
|
|
|
|
- :cpp:enumerator:`LV_FLEX_FLOW_ROW_WRAP`: Place the children in a row with wrapping
|
|
|
|
- :cpp:enumerator:`LV_FLEX_FLOW_COLUMN_WRAP`: Place the children in a column with wrapping
|
|
|
|
- :cpp:enumerator:`LV_FLEX_FLOW_ROW_REVERSE`: Place the children in a row without wrapping but in reversed order
|
|
|
|
- :cpp:enumerator:`LV_FLEX_FLOW_COLUMN_REVERSE`: Place the children in a column without wrapping but in reversed order
|
|
|
|
- :cpp:enumerator:`LV_FLEX_FLOW_ROW_WRAP_REVERSE`: Place the children in a row with wrapping but in reversed order
|
|
|
|
- :cpp:enumerator:`LV_FLEX_FLOW_COLUMN_WRAP_REVERSE`: Place the children in a column with wrapping but in reversed order
|
|
|
|
|
|
|
|
.. _flex_align:
|
2023-04-27 06:42:02 -06:00
|
|
|
|
|
|
|
Flex align
|
|
|
|
----------
|
|
|
|
|
|
|
|
To manage the placement of the children use
|
2024-01-04 07:25:13 +01:00
|
|
|
:cpp:expr:`lv_obj_set_flex_align(obj, main_place, cross_place, track_cross_place)`
|
2023-04-27 06:42:02 -06:00
|
|
|
|
|
|
|
- ``main_place`` determines how to distribute the items in their track
|
2024-01-04 07:25:13 +01:00
|
|
|
on the main axis. E.g. flush the items to the right on :cpp:enumerator:`LV_FLEX_FLOW_ROW_WRAP`. (It's called
|
2023-04-27 06:42:02 -06:00
|
|
|
``justify-content`` in CSS)
|
|
|
|
- ``cross_place`` determines how to distribute the items in their track
|
|
|
|
on the cross axis. E.g. if the items have different height place them
|
2023-04-27 11:47:13 -06:00
|
|
|
to the bottom of the track. (It's called ``align-items`` in CSS)
|
|
|
|
- ``track_cross_place`` determines how to distribute the tracks (It's
|
2023-04-27 06:42:02 -06:00
|
|
|
called ``align-content`` in CSS)
|
|
|
|
|
|
|
|
The possible values are:
|
|
|
|
|
2024-01-06 08:34:02 +01:00
|
|
|
- :cpp:enumerator:`LV_FLEX_ALIGN_START`: means left on a horizontally and top vertically (default)
|
2024-01-04 07:25:13 +01:00
|
|
|
- :cpp:enumerator:`LV_FLEX_ALIGN_END`: means right on a horizontally and bottom vertically
|
|
|
|
- :cpp:enumerator:`LV_FLEX_ALIGN_CENTER`: simply center
|
|
|
|
- :cpp:enumerator:`LV_FLEX_ALIGN_SPACE_EVENLY`: items are distributed so
|
2023-04-27 06:42:02 -06:00
|
|
|
that the spacing between any two items (and the space to the edges) is
|
|
|
|
equal. Does not apply to ``track_cross_place``.
|
2024-01-04 07:25:13 +01:00
|
|
|
- :cpp:enumerator:`LV_FLEX_ALIGN_SPACE_AROUND`: items are evenly
|
2023-04-27 06:42:02 -06:00
|
|
|
distributed in the track with equal space around them. Note that
|
2023-04-27 11:47:13 -06:00
|
|
|
visually the spaces aren't equal, since all the items have equal space
|
2023-04-27 06:42:02 -06:00
|
|
|
on both sides. The first item will have one unit of space against the
|
|
|
|
container edge, but two units of space between the next item because
|
|
|
|
that next item has its own spacing that applies. Not applies to
|
|
|
|
``track_cross_place``.
|
2024-01-04 07:25:13 +01:00
|
|
|
- :cpp:enumerator:`LV_FLEX_ALIGN_SPACE_BETWEEN`: items are evenly distributed in
|
2023-04-27 06:42:02 -06:00
|
|
|
the track: first item is on the start line, last item on the end line. Not applies to ``track_cross_place``.
|
|
|
|
|
2024-01-04 07:25:13 +01:00
|
|
|
.. _flex_grow:
|
|
|
|
|
2023-04-27 06:42:02 -06:00
|
|
|
Flex grow
|
|
|
|
---------
|
|
|
|
|
|
|
|
Flex grow can be used to make one or more children fill the available
|
|
|
|
space on the track. When more children have grow parameters, the
|
|
|
|
available space will be distributed proportionally to the grow values.
|
2024-01-04 07:25:13 +01:00
|
|
|
For example, there is 400 px remaining space and 4 objects with grow:
|
|
|
|
|
|
|
|
- ``A`` with grow = 1
|
|
|
|
- ``B`` with grow = 1
|
|
|
|
- ``C`` with grow = 2
|
2023-04-27 06:42:02 -06:00
|
|
|
|
|
|
|
``A`` and ``B`` will have 100 px size, and ``C`` will have 200 px size.
|
|
|
|
|
|
|
|
Flex grow can be set on a child with
|
2024-01-04 07:25:13 +01:00
|
|
|
:cpp:expr:`lv_obj_set_flex_grow(child, value)`. ``value`` needs to be >
|
2023-04-27 06:42:02 -06:00
|
|
|
1 or 0 to disable grow on the child.
|
|
|
|
|
2024-01-04 07:25:13 +01:00
|
|
|
.. _flex_style:
|
|
|
|
|
2023-04-27 06:42:02 -06:00
|
|
|
Style interface
|
|
|
|
***************
|
|
|
|
|
|
|
|
All the Flex-related values are style properties under the hood and you
|
2024-01-06 08:34:02 +01:00
|
|
|
can use them similarly to any other style property.
|
|
|
|
|
|
|
|
The following flex related style properties exist:
|
2023-04-27 06:42:02 -06:00
|
|
|
|
2024-01-04 07:25:13 +01:00
|
|
|
- :cpp:enumerator:`FLEX_FLOW`
|
|
|
|
- :cpp:enumerator:`FLEX_MAIN_PLACE`
|
|
|
|
- :cpp:enumerator:`FLEX_CROSS_PLACE`
|
|
|
|
- :cpp:enumerator:`FLEX_TRACK_PLACE`
|
|
|
|
- :cpp:enumerator:`FLEX_GROW`
|
|
|
|
|
|
|
|
.. _flex_padding:
|
2023-04-27 06:42:02 -06:00
|
|
|
|
|
|
|
Internal padding
|
|
|
|
----------------
|
|
|
|
|
|
|
|
To modify the minimum space flexbox inserts between objects, the
|
|
|
|
following properties can be set on the flex container style:
|
|
|
|
|
|
|
|
- ``pad_row`` Sets the padding between the rows.
|
|
|
|
|
|
|
|
- ``pad_column`` Sets the padding between the columns.
|
|
|
|
|
2023-04-27 11:47:13 -06:00
|
|
|
These can for example be used if you don't want any padding between your
|
2024-01-04 07:25:13 +01:00
|
|
|
objects: :cpp:expr:`lv_style_set_pad_column(&row_container_style,0)`
|
|
|
|
|
|
|
|
.. _flex_other:
|
2023-04-27 06:42:02 -06:00
|
|
|
|
|
|
|
Other features
|
|
|
|
**************
|
|
|
|
|
|
|
|
RTL
|
|
|
|
---
|
|
|
|
|
|
|
|
If the base direction of the container is set the
|
2024-01-04 07:25:13 +01:00
|
|
|
:cpp:enumerator:`LV_BASE_DIR_RTL` the meaning of
|
|
|
|
:cpp:enumerator:`LV_FLEX_ALIGN_START` and
|
|
|
|
:cpp:enumerator:`LV_FLEX_ALIGN_END` is swapped on ``ROW`` layouts. I.e.
|
2023-04-27 06:42:02 -06:00
|
|
|
``START`` will mean right.
|
|
|
|
|
|
|
|
The items on ``ROW`` layouts, and tracks of ``COLUMN`` layouts will be
|
|
|
|
placed from right to left.
|
|
|
|
|
|
|
|
New track
|
|
|
|
---------
|
|
|
|
|
|
|
|
You can force Flex to put an item into a new line with
|
2024-01-04 07:25:13 +01:00
|
|
|
:cpp:expr:`lv_obj_add_flag(child, LV_OBJ_FLAG_FLEX_IN_NEW_TRACK)`.
|
|
|
|
|
|
|
|
.. _flex_example:
|
2023-04-27 06:42:02 -06:00
|
|
|
|
|
|
|
Example
|
|
|
|
*******
|
|
|
|
|
|
|
|
.. include:: ../examples/layouts/flex/index.rst
|
|
|
|
|
2024-01-04 07:25:13 +01:00
|
|
|
.. _flex_api:
|
|
|
|
|
2023-04-27 06:42:02 -06:00
|
|
|
API
|
|
|
|
***
|