mte.ui — byggare av formulärspecifikationer¶
Varje gränssnittsyta från fas 3 — ctx.docks.add_panel och
ctx.settings_page.register — tar en
formulärspecifikation: en vanlig ordbok som beskriver ett widgetträd. Bygg de
specifikationerna med hjälparna mte.ui.* så att du slipper skriva JSON för hand.
from mte.ui import (
Column, Row, Group,
Label, Button, Checkbox, LineEdit, NumberSpin, ComboBox, List,
)
Inget i mte.ui talar med Qt eller PySide — varje hjälpare returnerar en ordbok
som följer det protokollschema värdens C++-formulärtolk förväntar sig. Kombinera dem
gärna, foga in listor, eller generera dem programmatiskt:
from mte.ui import Column, Row, Label, Button
def make_toolbar(commands):
return Row([Button(text=c["label"], on_click=c["id"])
for c in commands])
form = Column([Label(text="Actions:"),
make_toolbar(my_commands)])
Specifikationen valideras på värdsidan; okända kontrolltyper eller saknade
obligatoriska fält ger ett fel InvalidParams som du ser i loggen.
Etiketterna i en formulärspecifikation översätts inte
Varje etikett du lägger i en specifikation — paneltitlar, kryssrutsetiketter,
grupprubriker — visas exakt som du skrev den, vilket gränssnittsspråket än är.
De är data som din insticksmodul skickar till redigeraren, inte strängar som
redigeraren kan slå upp i en översättningskatalog. Ska din modul tala mer än ett
språk, välj strängarna själv innan du anropar register; det aktuella
gränssnittsspråket är
ctx.app_settings.get_string(mte.keys.UI_LANGUAGE) (tomt betyder «följ
systemet»). Detsamma gäller name och description som din plugin.json visar
i Inställningar ▸ Insticksmoduler.
Layouter¶
Layoutbyggarna tar en lista med barnordböcker och ordnar dem lodrätt eller vågrätt.
Column(children)¶
Staplar barnen uppifrån och ned med en avslutande sträckning — kontrollerna behåller sin naturliga höjd i stället för att svälla för att fylla en hög docka.
Row(children)¶
Samma idé, från vänster till höger, med en avslutande vågrät sträckning.
Group(children, *, title="")¶
En ram med titel (återgiven som QGroupBox) som innehåller en lodrät stapel.
Använd den för att visuellt gruppera besläktade kontroller:
Group([
Checkbox(id="cs", label="Case sensitive", binds="settings:cs"),
Checkbox(id="ww", label="Whole words", binds="settings:ww"),
], title="Search options")
Layouter nästlas fritt — en Row inuti en Column inuti en Group går bra.
Lövkontroller¶
Varje löv godtar samma fyra delade bindningar genom namngivna argument:
| Argument | Betydelse |
|---|---|
id= |
Stabilt id som ctx.ui.get / ctx.ui.set och (underförstått) binds använder. |
binds= |
"settings:<key>" — sparas automatiskt genom ctx.settings. |
on_click= |
Id för det kommando som anropas — endast för Button. |
on_change= |
Id för hanteraren (ctx.docks.on_change(...)) — för varje annan kontroll. |
Bara löv som exponerar ett «värde» stöder binds och on_change.
Label(*, text="", id=None)¶
Statisk text.
Button(*, text, on_click=None, id=None)¶
En tryckknapp. Att utlösa on_click anropar det registrerade kommandot; vill du
hålla knappen i takt med något annat kan du sätta dess text med ctx.ui.set.
Checkbox(*, label="", default=False, id=None, binds=None, on_change=None)¶
Boolesk kontroll. default är starttillståndet; binds åsidosätter det med det
sparade värdet om ett sådant finns.
LineEdit(*, placeholder="", default="", id=None, binds=None, on_change=None)¶
Textinmatning på en rad.
NumberSpin(*, default=0, min=None, max=None, step=1, id=None, binds=None, on_change=None)¶
Snurrruta för heltal. min och max klämmer intervallet (båda valfria; den
underliggande QSpinBox använder sitt standardintervall när de inte är satta).
step är steget på pilarna.
int-intervall
NumberSpin bygger på QSpinBox, som lagrar en int (32 bitar). Värden
utanför -2_147_483_648 … 2_147_483_647 mättas vid plattformens gräns.
ComboBox(*, items, default="", id=None, binds=None, on_change=None)¶
Rullgardinslista. items är en lista — varje post får vara antingen en vanlig
sträng eller ett objekt som {"value": "cpp", "label": "C++"} (i dag används bara
value; label är reserverat för en framtida förfining).
List(*, items, id=None, on_change=None)¶
Listwidget med enkelmarkering. on_change utlöses med texten i den nyss markerade
posten. Inget binds — spara markeringen själv om du behöver den.
Åtkomst under körning¶
När panelen väl är registrerad styr du den från vilket kommando som helst:
panel_id = ctx.docks.add_panel(id="my.panel", ..., form=Column([
LineEdit(id="needle"),
Checkbox(id="cs"),
]))
# Read current values
needle = ctx.ui.get(panel_id, "needle")
cs = ctx.ui.get(panel_id, "cs") == "true"
# Write values (does NOT fire on_change)
ctx.ui.set(panel_id, "needle", "hello")
ctx.ui.set(panel_id, "cs", True)
Se ctx.ui för hela referensen.
Spara värden¶
binds="settings:<key>" är det kortaste sättet att spara en kontrolls värde:
- När panelen byggs läser widgeten sitt startvärde från
ctx.settings.get(key, <default>). - Vid varje användarändring skriver widgeten tillbaka genom
ctx.settings.set(key, new_value).
Eftersom både paneler och Inställningssidor delar ctx.settings speglar två
kontroller med samma binds-sträng varandra i realtid. Det är så HelloPythons
docka och Inställningssida håller kryssrutan «Loud» i takt.
Behöver du spara något som vokabulären inte täcker (till exempel markeringen i en
List), läs och skriv direkt genom ctx.settings i ett återanrop on_change.