Die App-Seite

Hallo Welt

Das kleinste AURA-Programm liegt in examples/hello/ und baut nur gegen aura-*:

cmake
add_executable(aura-hello main.cpp)
aura_add_ui(aura-hello FILES hello.aura)    # Standardkontext
target_link_libraries(aura-hello PRIVATE aura::ui)
cpp
#include <aura.h>
#include "aura_ui.h"	// generiert aus hello.aura

int main()
{
	AuraApplication app({.title = "Hello"});
	if (!app.init()) {
		return 1;
	}
	AuraBasicContext<> ctx(app);
	auto ui = views::Hello::build(app.addFrame(), ctx);
	return app.run();
}

aura-hello --render datei.png zeichnet ohne Fenster (ctest aura_hello). Ohne registrierte Schriften nimmt Text die Standardschrift (unter Linux über fontconfig).

aura.h: AURA ohne Namespaces

#include <aura.h> (liegt bei aura-core) bringt alle öffentlichen Klassen mit Präfix Aura, wie Qt mit Q: AuraApplication, AuraTextNode, AuraImage, AuraTaskRunner, AuraWebApp, AuraScriptContext, AuraRemoteController, ... Eingebunden werden nur die Module, gegen die das Programm linkt (__has_include). Regeln:

Der Kontext

Der Kontexttyp (CONTEXT_TYPE) leitet von aura::ui::Context (AuraContext) ab (aura/ui/context.h). Beide Modi rufen dieselben Namen auf:

Kontext AURA Standard in Context
width, height screen.width, screen.height 0
animator animate:, enter:, exit:, spin:, Rive keiner: Werte springen
tr(id, text) tr("id", "Text") text
fontSize(px) font:, fit:, fontSize() px
image(name), svg(name) source: file(name) über Resources
file(name) source: von Rive erste Datei in assetDirs
propertyBool/Number/String(id) props.bool/int/string("ID") false, 0, ""
themeValue(name) theme.<name> (nur geladen) unbekannt
theme (Member der App) theme.<name> (kompiliert) –
cpp
static const aura::ui::ThemeTable<Theme> table{
	{"mainColor", &Theme::mainColor},	// Farbe
	{"textFont", &Theme::textFont},		// Schrift
	{"largeRadius", Theme::largeRadius},	// Konstante
};

Neue Theme-Werte kommen in Theme und in diese Tabelle. Fehlt der Eintrag in der Tabelle, meldet der Loader „unknown theme value“ und nimmt die kompilierte Fassung. Die VS-Code-Erweiterung bekommt die Namen für die Vervollständigung von der laufenden Vorschau (Host::themeValues()).

Ohne eigenen Kontext: aura_add_ui ohne CONTEXT_INCLUDE nimmt aura::ui::BasicContext<> (aura/ui/basic_context.h): Größe und Animator aus der Application, Bilder aus assetDirs, ein Theme vom Typ des Template-Arguments (BasicContext<MyTheme> mit themeTable).

cpp
aura::ui::BasicContext<> ctx(app);
ctx.assetDirs = {"assets"};

Daten aus dem Hintergrund

Was dauert (Netz, Dekodieren), läuft auf einem aura::TaskRunner der Anwendung; das Ergebnis kommt im UI-Thread an und geht über einen Setter in die UI. Für Aufgaben, bei denen nur die neueste zählt, gibt es latest():

cpp
// _orderLookup (aura::Latest): ein neuer Auftrag stoppt den alten
_tasks.latest(_orderLookup,
	// im Pool
	[url](std::stop_token stop) { return fetchHtml(url, stop); },
	// im UI-Thread, nur das neueste Ergebnis
	[this](const std::string& html) { _ui->setResult(html); });

Ein „lädt noch“ ist einfach Zustand (property bool waiting, if waiting { … }). Ein Setter mit unverändertem Wert tut nichts, die App muss also nicht selbst vergleichen.

Laufzeit: Timer, Prozesse, Zeit, Geräte

Bausteine von aura-core ohne Grafik (auch in aura.h als AuraTimer, AuraProcess, AuraTime, …):

Beobachtbare Modelle

Daten, die mehrere Stellen zeigen, hält das Modell beobachtbar (aura/core/observable.h, ohne Grafik):

cpp
// Application data and generated UI setters stay separate.
aura::List<std::string> items;
aura::Subscription changed = items.observe([&](const auto& values) {
    ui->setItems(values); // generated for: property strings items
});
items.erase(index);

Was in AURA steht und was in C++

AURA C++ (App)
Aufbau, Aussehen, Texte, Anordnung, Layouts woher die Daten kommen, was ein Signal bewirkt
Zustände über Properties (gewählt, gedrückt, Fehler) Ablauf (Arbeitsabläufe und Sitzungen)
Listen über Datensätze, Bilder der App (image) was die App selbst zeichnet (Fotos mit Beschnitt), in benannte Slots
Rahmen von Dialogen und Flyouts als Komponenten, Animationen (animate, enter, loop, Ripple) mehrstufige Übergänge, Video, Scroll-Griff

Listen: Listen der App sind Datensätze mit repeat in AURA; die App liefert die Daten und reagiert auf Signale mit einem Index oder einer Aktion:

Ausgerichtete Spalten ohne Tabellen-Layout: Die Preisliste misst die Spaltentitel unsichtbar mit (Text titleProbe { visible: false }) und macht jede Zelle so breit; eine Row mit Abstand ergibt die Spalten.

Dokumentationsquelle: docs/aura.md · Markdown herunterladen

Suche nach Themen, Widgets oder APIs.