Gå til innhold

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.