Das Aussehen liegt nicht im Code der Controls, sondern in Themes. Weil Vega alles selbst zeichnet, bestimmt ein Theme wirklich alles — bis hinunter zur Titelleiste, die sonst der Fenstermanager malen würde.
| Ebene | Was sie bestimmt | Wo |
|---|---|---|
TTheme | Grundfarben, Schriftgröße, Metriken, Skalierung | Vega/Theme.lyx |
| Stylesheet | Regeln je Controltyp, Zustand, Rolle, Klasse, Teil | Vega/Style.lyx |
Ein Control fragt zuerst das Stylesheet (ResolvedStyle), und was dort
nicht steht, kommt aus dem Theme:
var st: TStyleSet := self.ResolvedStyle();
canvas.FillRect(r, st.GetOr(SP_BACKGROUND, self.Color));
st.Destroy();
Eine Regel greift nach fünf Merkmalen:
button, listView, toolBar, …hover, pressed, checked, disabled,
focused, selected
role primary, frei vergebbarclass gefaehrlich, frei vergebbarpart header, part thumb, … für Controls ausmehreren Flächen
Zustände dürfen geschachtelt werden; daraus wird eine Regel, die beide verlangt:
checked { hover { background: #222222 } }
Ein Teil erbt vom Control: was es nicht selbst sagt, kommt von dort.
Ausdrücklich nicht vorhanden und nicht geplant: Selektorenketten und Rechnungen.
theme "firma.dunkel" extends "vega.dark" {
version 1
mode dark
tokens {
colors { marke: #0057B8 markeHover: #00468F }
metrics { rund: 4 }
}
button {
background: {colors.marke}
hover { background: {colors.markeHover} }
role primary { background: #C00000 }
}
listView {
background: #FFFFFF
part header {
background: #EAEAEA
hover { background: #DCDCDC }
}
}
}
extends — alles, was nicht dasteht, kommt vom Basistheme. EineDatei muss also nicht vollständig sein.
steht. Eingesetzt wird beim Laden, zur Laufzeit stehen überall
fertige Werte; die Kaskade wird dadurch nicht langsamer. * **Farben** als ''#RRGGBB'' oder ''#RRGGBBAA'', dazu ''rgba(r,g,b,a)''.
RegisterThemeFile("themes/mein.vtheme", true); // true = strenger Modus
UseTheme("firma.dunkel");
Im strengen Modus ist ein Tippfehler ein Fehler mit Zeilennummer. Im toleranten wird die Zeile übersprungen und der Rest geladen. Beim Entwickeln streng, im Auslieferzustand tolerant — dieselbe Zweiteilung wie beim LFM-Lader.
themes/template.vtheme listet jeden bekannten Typ, Zustand und Teil
als Kommentar. Sie wird erzeugt, nicht von Hand gepflegt:
./.build/gen-theme-template > themes/template.vtheme
Ein fertiges Beispiel liegt in themes/corporate.vtheme, und
examples/theming.lyx zeigt das Umschalten zur Laufzeit.