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 state
A kezdőpanel, pontosan úgy, ahogy a szerkesztő Új panel gombja adja.

Szá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őelemMit 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 state
Lista, amelyhez hozzáadsz, és amelyből érintéssel beszúrsz.

Az 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 state
A kurzornál álló szó cseréje idézőjeles változatra.

A 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"),
    ])
A mező egyenesen abba az állapotkulcsba ír, amelyet megnevezel.

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ó

  • json
  • math
  • random
  • re
  • sys
  • time

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

  1. Nyisd meg az Egyedi panelek részt a Clinkben, és koppints az Új panel gombra.
  2. Írd meg a szkriptet. Mellette előnézet futtatja az igazi panelt, a hibák pedig gépelés közben jelennek meg.
  3. 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 ›
Letöltés az App Store-ból