Preskočiť na obsah

mte.ui — tvorcovia špecifikácií formulárov

Každá plocha rozhrania z fázy 3 — ctx.docks.add_panel a ctx.settings_page.register — prijíma špecifikáciu formulára: obyčajný slovník opisujúci strom widgetov. Tieto špecifikácie zostavujte pomocníkmi mte.ui.*, aby ste JSON nemuseli písať ručne.

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

Nič v mte.ui nekomunikuje s Qt ani s PySide — každý pomocník vracia slovník podľa prenosovej schémy, akú očakáva parser formulárov v C++ na strane hostiteľa. Pokojne ich skladajte, vkladajte do zoznamov alebo generujte programovo:

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

Špecifikácia sa overuje na strane hostiteľa; neznáme typy ovládacích prvkov alebo chýbajúce povinné polia vyvolajú chybu InvalidParams, ktorú uvidíte v logu.

Popisy v špecifikácii formulára sa neprekladajú

Každý popis, ktorý do špecifikácie vložíte — názvy panelov, popisy začiarkavacích políčok, nadpisy skupín — sa zobrazí presne tak, ako ste ho napísali, nech je jazyk rozhrania akýkoľvek. Sú to údaje, ktoré váš modul posiela editoru, nie reťazce, ktoré by editor vedel vyhľadať v prekladovom katalógu. Ak má váš modul hovoriť viac než jedným jazykom, zvoľte reťazce sami pred volaním register; aktuálny jazyk rozhrania získate cez ctx.app_settings.get_string(mte.keys.UI_LANGUAGE) (prázdna hodnota znamená „riadiť sa systémom“). To isté platí pre name a description, ktoré váš plugin.json zobrazuje v Predvoľby ▸ Zásuvné moduly.


Rozloženia

Tvorcovia rozložení prijímajú zoznam podriadených slovníkov a usporiadajú ich zvislo alebo vodorovne.

Column(children)

Ukladá podriadené prvky zhora nadol s koncovou výplňou — ovládacie prvky si tak ponechajú prirodzenú výšku, namiesto aby sa nafúkli a vyplnili vysoký panel.

Row(children)

Tá istá myšlienka zľava doprava, s koncovou vodorovnou výplňou.

Group(children, *, title="")

Rámček s názvom (vykreslený ako QGroupBox) obsahujúci zvislý stĺpec. Použite ho na vizuálne zoskupenie súvisiacich ovládacích prvkov:

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

Rozloženia sa dajú voľne vnárať — Row vnútri Column vnútri Group je v poriadku.


Koncové ovládacie prvky

Každý koncový prvok prijíma cez kľúčové argumenty tie isté štyri spoločné väzby:

Argument Význam
id= Stabilné id používané metódami ctx.ui.get a ctx.ui.set a (implicitne) väzbou binds.
binds= "settings:<key>" — automatické uchovanie cez ctx.settings.
on_click= Id príkazu, ktorý sa má vyvolať — iba pri tlačidlách.
on_change= Id obslužného kódu (ctx.docks.on_change(...)) — pri každom inom ovládacom prvku.

binds a on_change podporujú iba koncové prvky, ktoré sprístupňujú „hodnotu“.

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

Statický text.

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

Tlačidlo. Vyvolaním on_click sa spustí zaregistrovaný príkaz; ak chcete tlačidlo držať v súlade s niečím iným, môžete mu cez ctx.ui.set nastaviť text.

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

Logický ovládací prvok. default je počiatočný stav; binds ho prekryje uchovanou hodnotou, ak nejaká existuje.

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

Jednoriadkové textové pole.

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

Číselné pole pre celé čísla. min a max orezávajú rozsah (obidva voliteľné; keď nie sú nastavené, použije podkladový QSpinBox svoj predvolený rozsah). step je prírastok pri šípkach.

Rozsah typu int

NumberSpin stojí na QSpinBox, ktorý uchováva int (32-bitový). Hodnoty mimo -2_147_483_648 … 2_147_483_647 sa nasýtia na limite platformy.

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

Rozbaľovací zoznam. items je zoznam — každá položka môže byť buď obyčajným reťazcom, alebo objektom ako {"value": "cpp", "label": "C++"} (dnes sa používa iba value; label je vyhradené pre budúce spresnenie).

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

Zoznamový widget s jednoduchým výberom. on_change sa vyvolá s textom novo vybranej položky. Bez binds — ak výber potrebujete uchovať, urobte to sami.


Prístup za behu

Keď je panel zaregistrovaný, ovládajte ho z ktoréhokoľvek príkazu:

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)

Úplnú referenciu nájdete v ctx.ui.


Uchovávanie hodnôt

binds="settings:<key>" je najkratšou cestou, ako uchovať hodnotu ovládacieho prvku:

  • Pri zostavení panela si widget načíta počiatočnú hodnotu z ctx.settings.get(key, <default>).
  • Pri každej úprave používateľom widget zapíše späť cez ctx.settings.set(kľúč, nová_hodnota).

Keďže panely aj stránky Predvolieb zdieľajú ctx.settings, dva ovládacie prvky s rovnakým reťazcom binds sa navzájom zrkadlia v reálnom čase. Presne takto drží HelloPython svoj panel a stránku Predvolieb v súlade pri začiarkavacom políčku „Loud“.

Ak potrebujete uchovať niečo, čo slovník nepokrýva (napríklad výber v List), čítajte a zapisujte priamo cez ctx.settings v obslužnom kóde on_change.