A ciklus
Egy panel meghatározza a view(state) függvényt, és tetszés szerint az initial(), on_open(state) és on_action(action, state) függvényeket. A Clink egyszer hívja meg az initial() függvényt a kiinduló állapothoz, az on_open függvényt minden megjelenéskor, majd a view(state) függvényt a felület felépítéséhez. Egy vezérlő vagy beszúr szöveget oda, ahol írsz, vagy új állapotot állít be, vagy megnevez egy műveletet az on_action számára, és a nézet újra felépül.
def initial():
return {"count": 0, "step": 1}
def view(state):
return vstack([
text(f"{state['count']}", size=34, weight="bold", align="center"),
segmented(["1", "5", "10"], value=str(state["step"]), action="step"),
hstack([
button("−", "bump", value=-1),
button("+", "bump", value=1, style="primary"),
]),
button("Type it", "type", icon="keyboard"),
])
def on_action(action, value, state):
if action == "bump":
state["count"] = state["count"] + value * state["step"]
elif action == "step":
state["step"] = int(value)
elif action == "type":
insert(str(state["count"]))
close()
return stateSzámológépek, snippet-táblák, választók: a paneljeid a billentyűzet panel gombja mögött jelennek meg.
Építőelemek
A view(state) olyan csomópontokat ad vissza, amelyeket ez a 19 függvény hoz létre. Ágyazd őket szabadon: a kötegek és a rácsok gyermekek listáját várják.
| Építőelem | Mit rajzol |
|---|---|
vstack(children, spacing=6, align="leading") | Lefelé rendezi a gyermekeit a panelen. |
hstack(children, spacing=6, align="center") | Vízszintesen rendezi a gyermekeit. |
grid(children, columns=4, spacing=6) | Egyenlő oszlopokba tördeli a gyermekeit. |
wrap(children, spacing=6) | Elrendezi az elemeit a panel szélességében, majd új sorba tördel. |
scroll(children, spacing=6) | Saját görgethető terület olyan listához, amely hosszabb a panelnél. |
card(children, padding=10, color="") | Egy felületen fogja össze az elemeit, körben térközzel. |
spacer(size=0) | A mögötte állót a széléig tolja. |
divider() | Hajszálvékony vonal a sorok között. |
text(s, size=17, weight="regular", color="", align="leading", lines=0, mono=False) | Egy szövegsor. A weight lehet regular, medium, semibold, bold, heavy, light vagy thin; az align lehet leading, center vagy trailing; a lines korlátozza a tördelt sorok számát; a color színnevet vagy #RRGGBB értéket vesz. |
icon(name, size=20, color="") | Egy SF Symbol, a neve alapján. |
badge(s, color="") | Rövid szó színezett kapszulában. |
progress(value, total=1, label="") | Sáv, amely value / total arányban van kitöltve. |
button(label, action="", value=None, insert="", set=None, style="plain", icon="", enabled=True) | Egy gomb. Az insert beírja a szövegét oda, ahol éppen írsz, a set kulcsokat olvaszt az állapotba, az action pedig kezelőt nevez meg az on_action számára. A style lehet plain, primary, tinted, quiet vagy destructive. |
row(title, subtitle="", detail="", icon="", action="", value=None, insert="") | Megérinthető sor: cím, második sor, ikon és jobbra egy részlet. |
toggle(label, on=False, key="", action="") | Kapcsoló. A key True vagy False értéket ír az adott állapotkulcsba. |
slider(value, min=0, max=100, step=1, label="", key="", action="") | Csúszka min és max között. A key az állást írja az adott állapotkulcsba. |
stepper(value, min=0, max=100, step=1, label="", key="", action="") | Egy érték − és + gombbal, min és max között. |
segmented(options, value=None, key="", action="") | Egy választás egy listából. A key a kiválasztott elemet írja az állapotkulcsba. |
field(key, placeholder="", action="", submit="") | Szövegdoboz, amely a state[key] kulcshoz kötődik. Megérintve a billentyűk abba a kulcsba írnak; a submit nevezi meg az Enterre futó kezelőt. |
Egy egyszerű karakterlánc ott is megáll, ahol egy csomópont: alapértelmezett méretű szövegként jelenik meg.
Érintés kezelése
Az a vezérlő, amelynek ki kell számolnia valamit, egy action nevet ad meg a fix set helyett. A Clink ekkor meghívja az on_action(action, state) függvényt, vagy az on_action(action, value, state) alakot, ha a vezérlő értékére is szükséged van. Az állapot közönséges szótár: módosíthatod helyben és nem adsz vissza semmit, vagy visszaadsz egy újat.
def initial():
return {"items": [], "draft": ""}
def view(state):
return vstack([
field("draft", placeholder="Add one…", submit="add"),
scroll([row(item, action="use", value=item) for item in state["items"]]),
])
def on_action(action, value, state):
if action == "add" and value:
state["items"].append(value)
state["draft"] = ""
elif action == "use":
insert(value)
close()
return stateAz on_open(state) minden megjelenéskor lefut; itt veheti a panel a kiindulást abból, amit éppen írsz.
Kérés a billentyűzethez
Az on_action és az on_open függvényből a panel olyasmit kérhet a billentyűzettől, amit egy visszatérési érték nem tud kifejezni. Minden hívást feljegyzünk, és csak a függvény lefutása után hajtunk végre, így a panel sosem írja a mezőt, miközben a saját nézete épül.
Parancsok
insert()backspace()delete_word()replace()move_cursor()copy()close()haptic()toast()
def on_action(action, state):
if action == "quote":
word = context()["word"]
replace(len(word), "“" + word + "”")
haptic("light")
return stateA context() azt olvassa, ami a kurzor körül van: before, selected, after, word, clipboard, locale, language, full_access és time. Pillanatkép a hívás kezdetéről, így renderelés közben nem változhat meg a kezed alatt.
Állapot
Az állapot közönséges szótár, és mindent tárol, amit egy szkript felépíthet: számokat, sztringeket, logikai értékeket, None-t, valamint ezek listáit és szótárait. Minden híváskor visszakapod, így az a lista, amelyhez az egyik érintéskor hozzáfűztél, a következőnél is megvan.
def initial():
return {"name": ""}
def view(state):
return vstack([
field("name", placeholder="Who?"),
button("Greet", insert="Hi " + state["name"] + "!", style="primary"),
])Az Állapot megjegyzése megőrzi a panel tartalmát a megnyitások között és a billentyűzet újraindítása után is. Számológépnél hagyd kikapcsolva, listánál kapcsold be.
Az állapot addig él, amíg a billentyűzet a képernyőn van, és tovább, ha a panel megjegyzi. A panel a context() függvénnyel elolvashatja a kurzor körüli szöveget; másat nem tud meg rólad.
Korlátok
A billentyűzet egy alkalmazás memóriájának töredékét kapja, ezért a panelek korlátozottak, nem pedig bizalmi alapon futnak. Minden kirajzolás 2 000 000 értelmezőlépést kap, és az elszabadult ciklus hibaüzenettel ér véget a képernyőn, nem pedig egy billentyűzettel, amely nem válaszol többé.
A fájlként vagy tárolóból érkező panelt tárolás előtt ellenőrizzük. 48 000 bájt és 1200 sor alatt kell maradnia, definiálnia kell a következőt: def view(, minden import csak a homokozóban lévő névterek egyikét nevezheti meg. Ezeket a részleteket pedig kereken elutasítjuk:
Megosztott panelben elutasítva
__exec(eval(open(compile(
Megosztott panelben importálható
jsonmathrandomresystime
Az alkalmazásban írt panelekre ez a lista nem vonatkozik. Ilyenkor egy elszabadult ciklust már csak a lépéskeret állít meg, ezért hagyj neki kiutat.
Elhelyezés
Adj minden panelnek saját gombot a választóban, ahelyett hogy egy Panelek gomb mögé zsúfolnád őket. Az egyes panelek felülírhatják ezt a saját szerkesztőjükben.
Az Alapértelmezett ezt a kapcsolót követi, az Önálló mindig saját gombot kap, a Csoportosított pedig mindig beágyazódik.
Írj egyet
- Nyisd meg az Egyedi panelek részt a Clinkben, és koppints az Új panel gombra.
- Írd meg a szkriptet. Mellette előnézet futtatja az igazi panelt, a hibák pedig gépelés közben jelennek meg.
- Mentsd el, kapcsold be a panelt, majd nyisd meg a billentyűzet panelgombját.
A Megosztás panel .clinkpanel fájlt ír, ami JSON. Ha visszanyitod a Clinkben, friss azonosítóval mentődik, így ugyanannak a panelnek a kétszeri importálása sosem írja felül az elsőt.
Műhely ›