Skip to content
| Marketplace
Sign in
Visual Studio Code>Visualization>EasyLVGLNew to Visual Studio Code? Get it now.
EasyLVGL

EasyLVGL

Mammut

|
1 install
| (0) | Free
Grafischer Editor für mehrseitige LVGL-Oberflächen: Widgets, Flow-Control, Animationen und Vorschau – erzeugt fertigen C-Code für ESP32, STM32 und PIC32.
Installation
Launch VS Code Quick Open (Ctrl+P), paste the following command, and press enter.
Copied to clipboard
More Info

EasyLVGL

Oberflächen für LVGL zeichnen statt tippen – direkt in VS Code.

EasyLVGL ist ein grafischer Editor für mehrseitige LVGL-Oberflächen – ohne zusätzliches Programm neben VS Code: Sie gestalten Seiten, Widgets, Abläufe und Animationen im Editor und erzeugen daraus mit einem Klick fertigen C-Code für LVGL 8.3/8.4 und 9.x, der ohne Nacharbeit in Ihrem Firmware-Projekt kompiliert – ESP32 (ESP-IDF oder Arduino/PlatformIO), STM32, PIC32/MPLAB Harmony oder generisch.

  • Alles in einer Datei: Ein Projekt ist eine .lvgl-Datei im JSON-Format – versionierbar und im Team zusammenführbar.
  • Sofort lauffähig: generierter Code kompiliert ohne Anpassung; das Hauptprogramm braucht nur ui.h und ui_init().
  • Vom Entwurf bis aufs Gerät: Generieren, Bauen und Flashen mit einem Button.
  • Umsteigen leicht gemacht: Oberflächen aus anderen Quellen (*.spj, *.eez-project, LVGL-JSON) lassen sich importieren.

👉 Ausführliche Anleitung: Button ? Hilfe im Designer, das Fragezeichen in der Seitenleiste oder der Befehl „EasyLVGL: Hilfe“ öffnen das vollständige Handbuch (docs/HILFE.md in der Erweiterung).

Funktionen

Bereich Beschreibung
Seiten Beliebig viele Screens; die erste Seite (★) wird von ui_init() geladen. Duplizieren, sortieren, löschen per Rechtsklick.
Widgets Alle LVGL-Widgets: Basis Container (lv_obj), Label, Button, Bild · Eingabe Slider, Arc, Switch, Checkbox, Dropdown, Roller, Textfeld, Tastatur, Buttonmatrix, Spinbox · Anzeige Bar, LED, Spinner, Skala/Gauge (v9 lv_scale, v8 lv_meter) · Layout Tabview + Tabs, Tileview + Tiles, Fenster, Liste, Menü, Messagebox · Daten Kalender, Diagramm (Serien als ui_<Name>_ser0…), Tabelle, QR-Code, Barcode (v9) · Grafik Linie, Canvas, Bild-Button, Animationsbild, GIF, Lottie (v9 lv_lottie mit ThorVG, v8 lv_rlottie), Span-Text, Bogentext (ab 9.4), Farbrad (nur v8). Der erzeugte Code prüft per #error, ob jedes verwendete Widget in lv_conf.h aktiviert ist. Nicht enthalten (Dateisystem, OpenGL oder Video nötig): 3D-Textur, glTF, FFmpeg-/GStreamer-Player, Datei-Explorer, Pinyin-IME.
Bearbeiten Ein ausgewähltes Element (z. B. im Baum markiert) lässt sich überall in seinem Rahmen ziehen – auch wenn Kinder darüber liegen; ein einfacher Klick wählt weiterhin das Element unter der Maus. Doppelklick bearbeitet Texte/Einträge direkt auf der Fläche (Enter bzw. Strg+Enter übernimmt, Esc bricht ab). Auswahl im Baum scrollt die Fläche zum Element; Tabs/Tiles werden automatisch angezeigt.
Hierarchie Baumansicht mit Drag & Drop (davor / danach / hinein), Sichtbarkeit, Sperren (Schloss immer sichtbar: offen = blass, geschlossen = orange; gesperrte Elemente zusätzlich mit Schloss-Symbol auf der Fläche und Umschalter „Gesperrt/Entsperrt“ im Inspektor). Auf der Fläche: Strg beim Loslassen legt Widgets in einen Container.
Zoom Strg+Mausrad bzw. Touchpad-Pinch zoomt um die Mausposition (10 %–800 %), +/− um die Bildmitte, ⤢ passt ein und zentriert.
Snapping Magnetisches Ausrichten an Kanten und Mitten von Parent und Geschwistern (inkl. Mitte des runden Displays) mit Hilfslinien, optionales Raster. Alt = ohne Einrasten, Shift = nur horizontal/vertikal.
Ausrichten Links / Mitte / Rechts / Oben / Mitte / Unten, Verteilen, gleiche Größe, „Im Parent zentrieren“ (LV_ALIGN_CENTER). Alle 9 LVGL-Align-Modi.
Vorlagen Button ◔ im Bereich „User-Widgets“: 24 fertige User-Widgets in vier Gruppen – Gauges (rund, Bogen, Halbkreis, Thermometer-Balken, Tacho), Karten (Sensor, Wetter, Diagramm, Fortschritt), Bedienelemente (Media-Player, Thermostat, Schalter-Kachel, Regler-Karte, Zifferntastatur, Umschalt-Gruppe), Leisten (Statusleiste, Navigation, Dialog) und Animiert (pulsierender Status-Punkt, Ladeanzeige, Laufschrift, laufender Fortschritt, springender Hinweis, blinkende Alarm-Karte). Aus Standard-Widgets aufgebaut (LVGL 8 und 9), frei anpassbar. Werte über Variablen-Bindung an Elemente der Instanz (z. B. Skala → Wert ← temp, Wert-Label → Text).
User-Widgets Eigene, wiederverwendbare Komponenten (Rechtsklick → „Als User-Widget speichern“ oder +). Erscheinen in der Palette, Texte pro Instanz überschreibbar, Export/Import als .lvglwidget. Code: ui_uw_<Name>_create(parent, &parts).
Bilder Import über eine Auswahlliste aller Bilder/GIFs/Lottie-Dateien im Workspace (Mehrfachauswahl), den Systemdialog („Datei auswählen …“) oder Drag & Drop auf die Fläche (aus dem Dateimanager; aus dem VS-Code-Explorer mit gedrückter Shift-Taste – erzeugt direkt Bild-/GIF-/Lottie-Widgets). PNG/BMP, JPG und GIF als RAW, Lottie-JSON (ui_lottie_<name>.c). Defekte Dateien werden abgewiesen, Fehler im Ausgabekanal „EasyLVGL“ protokolliert. Farbformat pro Bild: RGB565, RGB565+Alpha, RGB888, ARGB8888, XRGB8888, L8, A8, RAW. Wird zu ui_img_<name>.c konvertiert.
Display Beliebige Auflösung, Vorlagen, runde Displays (Maske + Hilfslinie), 16/32 Bit Farbtiefe.
Theme Hell/Dark-Mode, Primär-/Sekundärfarbe, Standardschrift; zur Laufzeit per ui_set_dark_mode() oder Flow-Knoten umschaltbar.
Variablen int, float, bool, string. Bindung an Widget-Eigenschaften (Text mit printf-Format, Wert, Aktiviert, Auswahl, Versteckt, Deaktiviert), Eingabe-Widgets schreiben zurück (⇄). Externe Variablen leben im Hauptprogramm (Getter/Setter), die UI fragt sie zyklisch ab.
Unteres Panel Variablen, Bilder, Main-Code, generierter Code, Meldungen – Höhe über den Trenner ziehbar (Doppelklick = ein-/ausklappen), wird pro Editor gemerkt.
Layout Linke Bereiche (Seiten, User-Widgets, Hierarchie, Widgets) einzeln in der Höhe ziehbar (Doppelklick auf den Trenner = automatisch), Seitenpanels in der Breite. ⟲ Layout bzw. Befehl „EasyLVGL: Editor-Layout zurücksetzen“ stellt Panelgrößen, Bereiche und Zoom wieder her.
Main-Code Tab „Main-Code“: fertige Getter/Setter, Aktionsfunktionen, LVGL-Initialisierung für den Zielcontroller, lv_conf-Einstellungen, Build-Integration – zum Kopieren oder mit ⤓ direkt ins Firmware-Projekt übernehmen: #include ins Hauptprogramm, Getter/Setter und Aktionen nach ui_hooks.c, #defines in die lv_conf.h, lib_deps/build_flags in die platformio.ini. Eigener Code bleibt erhalten (markierte Blöcke), mehrfaches Übernehmen ändert nichts, Strg+Z nimmt alles zurück. Abschnitte, die einen zweiten Einsprungpunkt oder eine bereits vorhandene Funktion anlegen würden, werden übersprungen und gemeldet.
Animationen Pro Widget (Abschnitt „Animation“ im Inspektor): Position X/Y, Breite, Höhe, Deckkraft, Wert (Bar/Slider/Arc), Drehung und Skalierung von Bildern – mit Start-/Endwert, Dauer, Verzögerung, Wiederholung, Hin-und-zurück und Beschleunigungskurve. Erzeugt echte lv_anim-Aufrufe und läuft auch in der ▶ Vorschau.
Flow-Control Knoten-Editor: Auslöser (Widget-Event, Seite geladen, Timer, Variable geändert, Start – mit Wahl der Startseite) → Aktionen (Seite öffnen / Seite schließen (zurück zur vorherigen oder zu einer bestimmten Seite, mit Seitenverlauf; neue Seite direkt im Knoten anlegen), Variable setzen, Eigenschaft setzen, Funktion aufrufen, Dark-Mode, Log, C-Code) und Logik (Bedingung ja/nein, Verzögerung).
Vorschau ▶ Vorschau: bedienbare Simulation (Buttons, Slider, Arc, Switch, Dropdown, Roller, Textfeld, Tastatur), Flows laufen, Variablen live änderbar.
Code-Stand Der Button „Code generieren“ wird orange (●), sobald der Code im Zielverzeichnis nicht mehr zum Design passt (Tooltip nennt die betroffenen Dateien). Flow-Knoten ohne Verbindung zu einem Auslöser werden markiert und gemeldet – sie würden nie ausgeführt.
Build & Upload „Code generieren“ schreibt in das Zielverzeichnis; 🔨 Generieren & Bauen startet zusätzlich den Build (idf.py build, pio run, make oder ein VS-Code-Befehl vscode:…); ⬆ Generieren, Bauen & Übertragen generiert, kompiliert und flasht den Controller (pio run -t upload, idf.py flash monitor, make flash oder vscode:platformio-ide.upload / vscode:espIdf.buildFlashMonitor). Beide Befehle sind frei konfigurierbar (Einstellungen → Build-Befehl / Upload-Befehl); leer = automatisch aus dem erkannten Projekt. Optional: bei jedem Speichern generieren.
Hilfe Button ? Hilfe im Designer, Fragezeichen in der Seitenleiste oder Befehl „EasyLVGL: Hilfe“ öffnet das vollständige Handbuch (docs/HILFE.md) – von der Installation über alle Widgets, Variablen, Flow und Animationen bis zur Einbindung in die Firmware.
Import aus anderen Quellen Befehl „EasyLVGL: Projekt aus einer anderen Quelle importieren“ (auch als ⤓ in der Seitenleiste und im Rechtsklick-Menü einer Projektdatei): übernimmt Seiten, Widget-Hierarchie, Position/Größe/Ausrichtung, Stile (Farben, Verläufe, Radius, Rahmen, Schatten, Schrift), Widget-Eigenschaften, Bilder (werden nach assets/ kopiert), eigene Schriften (*.fcfg → ui_font_*), Variablen, Ereignisse als Flow-Knoten und Animationen als lv_anim. Nicht abbildbare Aktionen werden als C-Code-Knoten mit passendem Aufruf angelegt; alle Abweichungen stehen danach im Ausgabekanal „EasyLVGL“. Unterstützte Dateien: *.spj, *.eez-project und LVGL-JSON.

Seitenleiste (Aktivitätsleiste links)

Das Symbol EasyLVGL in der linken Aktivitätsleiste öffnet die Projektübersicht: alle .lvgl-Projekte im Workspace mit Zielverzeichnis (Klick = ändern), Display, Seiten mit vollständigem Widget-Baum, User-Widgets, Variablen, Bildern und Flow-Knoten. Ein Klick öffnet im Designer direkt die passende Einstellung: Seite → Seiten-Einstellungen, Widget → ausgewählt mit Eigenschaften im Inspektor, User-Widget → Definition, Variable/Bild → hervorgehoben im unteren Panel, Display → Projekteinstellungen, Flow-Knoten → Flow-Editor. Inline-Buttons: Code generieren, Generieren & Bauen und Generieren, Bauen & Übertragen; Rechtsklick: Im Designer / als JSON öffnen, Zielverzeichnis wählen. Oben: + neues UI-Projekt, ⤓ Projekt aus einer anderen Quelle importieren, ↻ aktualisieren. Die Seitenleiste zeigt immer den aktuellen Stand des Designers – auch ungespeicherte Änderungen (Kennzeichnung „● ungespeichert“).

Zielverzeichnis

Der Ordner für den generierten C-Code ist pro Projekt frei wählbar (relativ zur .lvgl-Datei oder absolut):

  • Button 📁 Ziel: …/ in der Werkzeugleiste des Editors (öffnet die Ordnerauswahl),
  • Ordner-Symbol in der Editor-Titelleiste bzw. Befehl „EasyLVGL: Zielverzeichnis für generierten Code wählen“,
  • ⚙ Einstellungen → Zielverzeichnis (Feld + „Wählen…“),
  • VS-Code-Einstellung easylvgl.defaultOutputDir als Vorgabe für neue Projekte (leer = automatisch main/ui, src/ui, Core/Src/ui …).

Existiert der Ordner beim Generieren noch nicht, fragt der Designer nach („Hier erzeugen“ / „Anderes Verzeichnis wählen…“).

Installation

code --install-extension easylvgl-1.1.1.vsix

oder in VS Code: Erweiterungen → … → Aus VSIX installieren…. Danach VS Code neu laden; .lvgl-Dateien öffnen sich automatisch im Designer.

Schnellstart

  1. Befehl „EasyLVGL: Neues UI-Projekt anlegen“ (oder Rechtsklick auf einen Ordner). Zielcontroller, Ausgabeordner und LVGL-Version werden aus dem Projekt erkannt (platformio.ini, ESP-IDF-CMakeLists.txt, .ioc, MPLAB X).
  2. In der .lvgl-Datei Seiten und Widgets gestalten, unter ⚙ Einstellungen Zielverzeichnis, LVGL-Version, Controller, Display und Theme prüfen.
  3. ⟨/⟩ Code generieren → Dateien landen im Zielverzeichnis.
  4. Im Tab Main-Code die Snippets ins Hauptprogramm kopieren (mindestens #include "ui/ui.h" und ui_init() nach der LVGL-/Display-Initialisierung).

Erzeugte Dateien

Datei Inhalt
ui.h Öffentliche API: Seiten-/Widget-Objekte ui_<Name>, Variablen ui_get_/ui_set_<var>(), ui_init(), ui_set_dark_mode(), ui_open_screen() / ui_close_screen() / ui_close_screen_to() (Seitenverlauf, auch aus dem Hauptprogramm nutzbar)
ui.c Theme, Font-Prüfungen, ui_init()
ui_scr_<Seite>.c Aufbau je Seite
ui_userwidgets.c Erzeugungsfunktionen der User-Widgets
ui_vars.c Variablen, Bindungen, Abfrage externer Variablen
ui_flow.c Flow-Control (eine C-Funktion je Knoten)
ui_user.c weak Default-Implementierungen von ui_ext_get/set_* und ui_action_* – eigene Definitionen im Hauptprogramm ersetzen sie automatisch, das Projekt kompiliert daher sofort
ui_img_<name>.c Konvertierte Bilder
CMakeLists.txt optional als ESP-IDF-Komponente

Nicht mehr benötigte, früher generierte Dateien (z.B. nach Umbenennen einer Seite) werden automatisch entfernt. Andere Dateien im Ordner bleiben unberührt.

Hinweise

  • Umlaute / Sonderzeichen: Die in LVGL eingebauten Montserrat-Fonts enthalten nur ASCII, ° und die LVGL-Symbole. Für „ä, ö, ü, ß“ einen eigenen Font mit lv_font_conv / Font-Converter erzeugen, die .c-Datei ins Projekt legen und unter Einstellungen → Eigene Fonts als name:größe eintragen. Der Generator warnt bei fehlenden Zeichen.
  • PlatformIO: Vor dem Bauen prüft der Designer, ob jede [env:…] in platformio.ini LVGL als lib_deps einbindet (sonst: „lvgl.h: No such file or directory“), und trägt lvgl/lvgl@^8.4.0 bzw. @^9.2.2 auf Wunsch automatisch ein.
  • Threads: ui_set_*() nur aus dem LVGL-Kontext bzw. mit gehaltenem LVGL-Lock aufrufen (ESP-IDF: lvgl_port_lock()). Externe Variablen werden automatisch alle n ms abgefragt – dafür ist kein Lock nötig.
  • Lottie: LVGL 9 braucht in lv_conf.h LV_USE_LOTTIE, LV_USE_VECTOR_GRAPHIC, LV_USE_MATRIX, LV_USE_FLOAT, LV_USE_CANVAS und LV_USE_THORVG_INTERNAL (ThorVG ist C++ – ESP-IDF/PlatformIO übersetzen das automatisch). Renderpuffer = Breite × Höhe × 4 Byte RAM. LVGL 8 nutzt lv_rlottie und benötigt die externe Bibliothek rlottie. Im Editor wird ein Platzhalter angezeigt.
  • LVGL 8 + 16 Bit: Bilder werden passend zu LV_COLOR_DEPTH / LV_COLOR_16_SWAP erzeugt; ein #error meldet eine abweichende Konfiguration.
  • Nach dem Installieren einer neuen Version meldet sich die Erweiterung mit „Designer-Tab(s) nicht mehr verbunden – Neu öffnen?“ (Befehl: „EasyLVGL: Nicht verbundene Designer-Tabs neu öffnen“). Sonst offene Designer-Tabs selbst schließen und neu öffnen (oder „Developer: Reload Window“): VS Code startet dabei die Extension neu, bereits offene Tabs sind danach von ihr getrennt. Der Designer erkennt das und zeigt einen roten Hinweis mit „Projektstand kopieren“, damit keine Änderungen verloren gehen.
  • Undo/Redo läuft über das VS-Code-Dokument (Strg+Z / Strg+Y); die .lvgl-Datei ist JSON und versionierbar.

Entwicklung

npm install
npm run compile        # TypeScript -> out/
npm run package        # VSIX erzeugen und für den Marketplace prüfen
npm run check          # nur die Marketplace-Prüfung

F5 in VS Code startet eine Extension-Development-Instanz. Tests (test/):

Skript Prüft
node test/provider_test.js Extension-Provider gegen eine gemockte VS-Code-API
node test/import_test.js Import fremder Projektdateien (inkl. der auf dem Rechner vorhandenen Beispielprojekte)
node test/apply_test.js Übernehmen der Main-Code-Abschnitte in ein Firmware-Projekt
npm run check Marketplace-Vorgaben: Manifest, Symbol, Kategorien, Menüs, Inhalt der .vsix
test/compile_test.sh <8\|9> <lvgl-pfad> Beispielprojekt generieren und mit gcc -Wall -Wextra gegen LVGL-Header prüfen
test/runtime_test.sh <8\|9> <lvgl-pfad> LVGL + generierte UI nativ bauen und Bindungen, Flows, Timer, Seitenwechsel ausführen
npm run test:ui Browser-Tests der Oberfläche (headless Chromium): Palette, Snapping, Baum-Auswahl, Inline-Edit, Zoom, Flow/Vorschau, alle Widgets, Layout
node test/server.js Webview im Browser unter http://localhost:8765/test/harness.html
  • Contact us
  • Jobs
  • Privacy
  • Manage cookies
  • Terms of use
  • Trademarks
  • Your Privacy Choices
  • Consumer Health Privacy
© 2026 Microsoft