Introducing LVGL's UI editor (Preview of v0.1)

Hi Guys,

I’m happy to share that we have published a detailed video about our UI editor:

image

The main features of this tool include:

  • Component-oriented: Various elements of the UI can be implemented as reusable components.
  • XML-based: The components are described in an HTML-like form.
  • Instant preview: The components can be previewed as you edit them.
  • Figma support: LVGL’s Figma plugin helps to quickly extract styles from any Figma elements.
  • Online preview: A CI action converts the XML files into a website where they can be previewed.
  • Custom widget creation: Unlike components, widgets have C logic. You can recompile the editor to make it contain the new widgets’ code.
  • C export: Both components and widgets can be exported to C, enabling seamless integration into your application, just like handwritten code.
  • Runtime XML loading: Components can be loaded from XML at runtime without recompiling the firmware.

The target release date of v0.1 is 2025 January. v1.0 is planned at 2025 September.

We would love to hear what you think about this tool and concept. Please leave your feedback here: Issues · lvgl/lvgl_editor · GitHub

6 Likes

Hi @kisvegabor,

Congratulations on the LVGL’s UI editor.

One question, can I make a discrete slider with the value displayed on top of the thumb ?
Both in the UI editor and manual code typing ?!

Example:
Android dev: Material Design

Let’s say I did it in percentage in range 0% to 100% value.
In 0% i would put OFF and in 100% put FULL, in the middle steps 10%.
Would show on top of thumb: OFF, 10%, 20%, 30%, … , 90%, FULL

Thank’s.

1 Like

Thank you for the great question!

Here you can create a custom widget, similar to the dark_slider in the video. Set the range to 0…10 and in the event callback you can do something like:

value = value * 10; /*0..10 -> 0..100*/
if(value == 0) text = "OFF";
else if(value == 100) text = "FULL";
else text = to_string(value); /*to_string is just an example function*/

draw_text(text);

I see, but I think that the rendering on top of the thumb shouldn’t be so trivial right ?

Here is the related code: lvgl_editor/examples/widgets/dark_slider/dark_slider.c at master · lvgl/lvgl_editor · GitHub

Not trivial but not super complicated either.

1 Like

Hi, awesome work congratulations.

Where can I download and try the UI editor?

I’m not able to run it on macOS Apple Silicon, the docker desktop requires WSL2 which is not supported by Paralells Desktop.

AppImage encounted exe format error on the Virtual Ubuntu as well.

Do you have any plan to release macOS version or Linux ARM64 version? I’m willing to try it. Thank you.

Hey all,

In case someone missed it, v0.1 is out and can be downloaded and tried out.

Unfortunately the Mac version is not available yet. Releasing apps for Mac is well… complicated…
But we are on it!

I have watched several videos on that GUI… Is fantastic if you wish to hand code items and have an advanced degree in XML. A lot of us coders wish to have a drop and drag and customize the flow / actions…

@kbrussow In my first experience with the Editor I indeed had a learning curve with XML and the overall Editor user experience. But as I tried making more progress with it, trying to make different UI components, the relation between XML and LVGL C properties of widgets started to make more sense to me.

I find the componentization part of it really useful. Imagine there is a company that has many different embedded UI projects and the styling of the UI needs to keep a standard. The XML components come to solve it. Just exchange/handle the same button.xml between projects for example.

I was using EEZ studio to create my screens. worked ok for layout but in that it had to interact with my code, I had to use several work arounds
Example:
in the screens.c file I had to add
lv_obj_set_name(obj, “scan_button_label”);
objects.lblbut_scan = obj;
lv_obj_set_pos(obj, -1, 0);
lv_obj_set_name(obj, “scan_button_label”); << added
by doing that I was able to
lv_label_set_text(objbuttontxt, “scanning…”);
more code was required but there are 2 steps needed

FYI, after v1.0 the first thing will work on is a drag and drop interface. For that the XML provides a very good go foundation.