Ga naar inhoud

mte.ui — bouwers van formulierspecificaties

Elk interfacevlak uit fase 3 — ctx.docks.add_panel en ctx.settings_page.register — neemt een formulierspecificatie: een gewoon woordenboek dat een widgetboom beschrijft. Bouw die specificaties met de hulpjes mte.ui.*, zodat u de JSON niet met de hand hoeft te schrijven.

from mte.ui import (
    Column, Row, Group,
    Label, Button, Checkbox, LineEdit, NumberSpin, ComboBox, List,
)

Niets in mte.ui praat met Qt of PySide — elk hulpje levert een woordenboek op dat het draadschema volgt dat de C++-formulierontleder van de host verwacht. Combineer ze gerust, voeg lijsten in of genereer ze programmatisch:

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)])

De specificatie wordt aan de kant van de host gevalideerd; onbekende besturingssoorten of ontbrekende verplichte velden leveren een fout InvalidParams op die u in het logboek ziet.

De labels in een formulierspecificatie worden niet vertaald

Elk bijschrift dat u in een specificatie zet — paneeltitels, labels van vinkjes, groepskoppen — wordt precies getoond zoals u het schreef, wat de taal van de interface ook is. Het zijn gegevens die uw plug-in naar de editor stuurt, geen tekenreeksen die de editor in een vertaalcatalogus kan opzoeken. Moet uw plug-in meer dan één taal spreken, kies de teksten dan zelf voordat u register aanroept; de huidige taal van de interface is ctx.app_settings.get_string(mte.keys.UI_LANGUAGE) (leeg betekent «volg het systeem»). Hetzelfde geldt voor de name en description die uw plugin.json op Voorkeuren ▸ Plug-ins toont.


Indelingen

Indelingsbouwers nemen een lijst met woordenboeken van kinderen en schikken die verticaal of horizontaal.

Column(children)

Stapelt de kinderen van boven naar beneden met een rek aan het einde — de besturingselementen houden hun natuurlijke hoogte in plaats van op te zwellen om een hoog dok te vullen.

Row(children)

Hetzelfde idee, van links naar rechts, met een horizontale rek aan het einde.

Group(children, *, title="")

Een kader met een titel (weergegeven als QGroupBox) dat een verticale stapel bevat. Gebruik het om verwante besturingselementen visueel te groeperen:

Group([
    Checkbox(id="cs", label="Case sensitive", binds="settings:cs"),
    Checkbox(id="ww", label="Whole words",    binds="settings:ww"),
], title="Search options")

Indelingen nestelen vrijelijk — een Row binnen een Column binnen een Group is prima.


Bladbesturingselementen

Elk blad aanvaardt via benoemde argumenten dezelfde vier gedeelde koppelingen:

Argument Betekenis
id= Stabiele id die ctx.ui.get / ctx.ui.set en (impliciet) binds gebruiken.
binds= "settings:<key>" — bewaart automatisch via ctx.settings.
on_click= Id van de opdracht die aangeroepen wordt — alleen voor Buttons.
on_change= Id van de afhandelaar (ctx.docks.on_change(...)) — voor elk ander besturingselement.

Alleen bladeren die een «waarde» blootleggen ondersteunen binds en on_change.

Label(*, text="", id=None)

Statische tekst.

Button(*, text, on_click=None, id=None)

Een drukknop. on_click laten afgaan roept de geregistreerde opdracht aan; wilt u de knop met iets anders gelijk houden, dan kunt u met ctx.ui.set zijn text zetten.

Checkbox(*, label="", default=False, id=None, binds=None, on_change=None)

Booleaans besturingselement. default is de beginstaat; binds overschrijft die met de bewaarde waarde wanneer die bestaat.

LineEdit(*, placeholder="", default="", id=None, binds=None, on_change=None)

Tekstinvoer op één regel.

NumberSpin(*, default=0, min=None, max=None, step=1, id=None, binds=None, on_change=None)

Draaivak voor gehele getallen. min en max klemmen het bereik (beide optioneel; de onderliggende QSpinBox gebruikt zijn standaardbereik wanneer ze niet gezet zijn). step is de stap op de pijltjes.

int-bereik

NumberSpin steunt op QSpinBox, dat een int (32 bits) bewaart. Waarden buiten -2_147_483_648 … 2_147_483_647 verzadigen op de grens van het platform.

ComboBox(*, items, default="", id=None, binds=None, on_change=None)

Uitklaplijst. items is een lijst — elk item mag ofwel een gewone tekenreeks zijn, ofwel een object als {"value": "cpp", "label": "C++"} (vandaag wordt alleen value gebruikt; label is voor een latere verfijning gereserveerd).

List(*, items, id=None, on_change=None)

Lijstwidget met enkelvoudige selectie. on_change gaat af met de tekst van het zojuist geselecteerde item. Geen binds — bewaar de selectie zelf als u haar nodig hebt.


Toegang tijdens het draaien

Zodra het paneel geregistreerd is, stuurt u het vanuit elke opdracht aan:

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)

Zie ctx.ui voor de volledige naslag.


Waarden bewaren

binds="settings:<key>" is de kortste manier om de waarde van een besturingselement te bewaren:

  • Bij het bouwen van het paneel leest de widget zijn beginwaarde uit ctx.settings.get(key, <default>).
  • Bij elke bewerking van de gebruiker schrijft de widget terug via ctx.settings.set(key, new_value).

Omdat zowel panelen als Voorkeurenpagina's ctx.settings delen, spiegelen twee besturingselementen met dezelfde binds-tekenreeks elkaar in real time. Zo houden het dok en de Voorkeurenpagina van HelloPython het vinkje «Loud» gelijk.

Moet u iets bewaren dat het vocabulaire niet dekt (bijvoorbeeld de selectie van een List), lees en schrijf dan rechtstreeks via ctx.settings in een callback on_change.