mte.ui — byggere for skjemabeskrivelser¶
Hver grensesnittflate fra fase 3 — ctx.docks.add_panel og
ctx.settings_page.register — tar en skjemabeskrivelse:
en alminnelig ordbok som beskriver et kontrolltre. Bygg disse beskrivelsene med
mte.ui.*-hjelperne, så du slipper å skrive JSON-en for hånd.
from mte.ui import (
Column, Row, Group,
Label, Button, Checkbox, LineEdit, NumberSpin, ComboBox, List,
)
Ingenting i mte.ui snakker med Qt eller PySide — hver hjelper gir en ordbok tilbake som
følger det formatet vertens skjematolker i C++ venter. Du kan gjerne sette dem sammen,
skjøte inn lister eller lage dem programmatisk:
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)])
Beskrivelsen kontrolleres på vertssiden; ukjente kontrolltyper eller manglende påkrevde
felter gir en InvalidParams-feil som du vil se i loggen.
Merkelappene i en skjemabeskrivelse oversettes ikke
Hver overskrift du setter i en beskrivelse — paneltitler, avkrysningsmerkelapper,
gruppeoverskrifter — vises nøyaktig slik du skrev den, uansett hvilket språk
grensesnittet har. De er data programtillegget ditt sender til redigereren, og ikke
tekststrenger redigereren kan slå opp i en oversettelseskatalog. Skal programtillegget
ditt snakke mer enn ett språk, så velg tekststrengene selv før du kaller register;
det gjeldende språket i grensesnittet er
ctx.app_settings.get_string(mte.keys.UI_LANGUAGE) (tomt betyr «følg systemet»). Det
samme gjelder det name og den description plugin.json-en din viser på
Innstillinger ▸ Programtillegg.
Oppsett¶
Oppsettsbyggerne tar en liste av underordnede ordbøker og stiller dem opp loddrett eller vannrett.
Column(children)¶
Stabler de underordnede ovenfra og ned med en strekk til slutt — kontrollene beholder sin naturlige høyde i stedet for å svulme opp og fylle et høyt panel.
Row(children)¶
Samme tanke, fra venstre mot høyre, med en vannrett strekk til slutt.
Group(children, *, title="")¶
En ramme med tittel (gjengitt som en QGroupBox) som inneholder en loddrett stabel. Bruk
den til å samle beslektede kontroller visuelt:
Group([
Checkbox(id="cs", label="Case sensitive", binds="settings:cs"),
Checkbox(id="ww", label="Whole words", binds="settings:ww"),
], title="Search options")
Oppsett kan nøstes fritt — en Row inne i en Column inne i en Group er helt greit.
Enkeltkontroller¶
Hver enkeltkontroll tar imot de samme fire felles bindingene som nøkkelordargumenter:
| Argument | Betydning |
|---|---|
id= |
En stabil id som ctx.ui.get / ctx.ui.set og (underforstått) binds bruker. |
binds= |
"settings:<key>" — lagres av seg selv gjennom ctx.settings. |
on_click= |
Id-en til den kommandoen som skal kalles — bare knapper. |
on_change= |
Behandler-id (ctx.docks.on_change(...)) — hver annen kontroll. |
Bare enkeltkontroller som blottlegger en «verdi», støtter binds og on_change.
Label(*, text="", id=None)¶
Fast tekst.
Button(*, text, on_click=None, id=None)¶
En trykknapp. Å utløse on_click kaller den registrerte kommandoen; vil du holde knappen i
takt med noe annet, kan du bruke ctx.ui.set på text-en dens.
Checkbox(*, label="", default=False, id=None, binds=None, on_change=None)¶
En boolsk kontroll. default er starttilstanden; binds overstyrer den med den lagrede
verdien hvis det finnes en.
LineEdit(*, placeholder="", default="", id=None, binds=None, on_change=None)¶
Et tekstfelt på én linje.
NumberSpin(*, default=0, min=None, max=None, step=1, id=None, binds=None, on_change=None)¶
En tallboks med piler. min og max begrenser området (begge valgfrie; den underliggende
QSpinBox bruker standardområdet sitt når de ikke er satt). step er spranget på pilene.
Tallområde
NumberSpin bygger på QSpinBox, som lagrer en int (32 bit). Verdier utenfor
-2_147_483_648 … 2_147_483_647 mettes ved plattformens grense.
ComboBox(*, items, default="", id=None, binds=None, on_change=None)¶
En rulleliste. items er en liste — hver post kan enten være en alminnelig tekststreng
eller et objekt som {"value": "cpp", "label": "C++"} (bare value brukes i dag; label
er reservert for en senere forfining).
List(*, items, id=None, on_change=None)¶
En listekontroll der det kan merkes én om gangen. on_change utløses med teksten på den
nylig merkede posten. Ingen binds — lagre merkingen selv om du trenger det.
Tilgang under kjøringen¶
Når panelet er registrert, kan du styre det fra en hvilken som helst kommando:
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 for hele dokumentasjonen.
Å lagre verdier¶
binds="settings:<key>" er den korteste veien til å lagre en kontrolls verdi:
- Når panelet bygges, leser kontrollen startverdien sin fra
ctx.settings.get(key, <default>). - Ved hver endring fra brukeren skriver kontrollen tilbake gjennom
ctx.settings.set(key, new_value).
Fordi både paneler og innstillingssider deler ctx.settings, speiler to kontroller med den
samme binds-tekststrengen hverandre med det samme. Det er slik HelloPythons panel og
innstillingsside holder avkrysningsboksen «Loud» i takt.
Trenger du å lagre noe ordforrådet ikke dekker (for eksempel en merking i en List), så
les og skriv direkte gjennom ctx.settings i et on_change-tilbakekall.