Watchmaker – Oživte ciferníky skripty

Minule jsme si ukázali, jak vyrobit vlastní ciferník v aplikaci Watchmaker. Dnes bychom mohli zabrousit do trochu pokročilejších technik, a to jsou skripty.

Tento díl předpokládá aspoň základní znalosti programování.

Jdeme do aplikace, vybereme ciferník, zvolíme Customize Watch. Když odscrolujeme trochu dolů, vidíme pole Script.
Skripty se píší v jazyce Lua.
Skripty lze volat jako událost při klepnutí na nějaký element, případně jde volat funkci např. místo vepsání konkrétního textu. Větší celky se píší do již zmíněného pole Script a volají se odkud je třeba.

Zobrazení datumu

Mějme ciferník, kde chceme zobrazit text ve tvaru: den v týdnu, den v měsící. měsíc. Např. čt, 21.2.

To jde udělat celkem přímočaře tak, že vytvoříme textové pole, do kterého vložíme potřebné elementy, tzn.:

{ddw2}, {dd}. {dn}.

A nebo zavoláme funkci, která vrátí potřebný text: var_getDatum(). Její definici vidíme na třetím obrázku:

function var_getDatum()
return {ddw2} .. ', ' .. {dd} .. '. ' .. {dn} .. '.'
end

Funkce je vlastně kus kódu, který na konci může vrátit výsledek. V tomto případě jsme si poskládali potřebný text ručně. Zde je vidět, že se elementy chovají ve skriptech jinak, než v textových polích. V textovém poli se za sebe jednotlivé elementy skládají automaticky a jde je kombinovat s textem, ale ve skriptech musíme říct, že je to text. Pokud chceme za sebe poskládat několik textových elementů, spojovací příkaz je .. (dvě tečky za sebou). Text je ohraničen znakem ‘ (apostrof).

Dobře, pro zobrazení datumu asi nemá cenu volat skript, ale co kdybychom chtěli, aby se zobrazil den velkými písmeny, ale jen když je zrovna čtvrtek? Tzn. st, 20. 2., ale ČT, 21. 2. (čtvrtek, protože je zrovna dnes čtvrtek, nic jiného v tom nehledejte Jinak by dávala smysl spíš neděle…)

Tohle už napřímo nejde nebo aspoň ne jednoduše, ale ve skriptu jsme přidali jen jednu podmínku.

No jo, ale není ten text nějaký divný? Je, vybraný font totiž nepodporuje dobře diakritiku. Řešením by bylo buď změnit font nebo… odebrat diakritiku:

function var_ToASCII(strText)
a=strText
a=string.gsub(a, "á", "a")
a=string.gsub(a, "č", "c")
a=string.gsub(a, "ď", "d")
a=string.gsub(a, "é", "e")
a=string.gsub(a, "ě", "e")
a=string.gsub(a, "í", "i")
a=string.gsub(a, "ň", "n")
a=string.gsub(a, "ó", "o")
a=string.gsub(a, "ř", "r")
a=string.gsub(a, "š", "s")
a=string.gsub(a, "ť", "t")
a=string.gsub(a, "ú", "u")
a=string.gsub(a, "ů", "u")
a=string.gsub(a, "ý", "y")
a=string.gsub(a, "ž", "z")
a=string.gsub(a, "Á", "A")
a=string.gsub(a, "Č", "C")
a=string.gsub(a, "Ď", "D")
a=string.gsub(a, "É", "E")
a=string.gsub(a, "Ě", "E")
a=string.gsub(a, "Í", "I")
a=string.gsub(a, "Ň", "N")
a=string.gsub(a, "Ó", "O")
a=string.gsub(a, "Ř", "R")
a=string.gsub(a, "Š", "S")
a=string.gsub(a, "Ť", "T")
a=string.gsub(a, "Ú", "U")
a=string.gsub(a, "Ů", "U")
a=string.gsub(a, "Ý", "Y")
a=string.gsub(a, "Ž", "Z")
return a
end

V tomto případě by stačilo hlídat písmenka, která se mohou vyskytovat v názvech dnů, ale když už nějakou funkci děláme, tak pořádně.

Co kdybychom chtěli zobrazit, kdo má dnes svátek?

function var_get_svatek()
md={31,28,31,30,31,30,31,31,30,31,30,31}
m1 = {"Nový rok","Karina","Radmila","Diana","Dalimil","Tři Králové","Vilma","Čestmír","Vladan","Břetislav","Bohdana","Pravoslav","Edita","Radovan","Alice","Ctirad","Drahoslav","Vladislav","Doubravka","Ilona","Běla","Slavomír","Zdeněk","Milena","Miloš","Zora","Ingrid","Otýlie","Zdislava","Robin","Marika",}
m2 = {"Hynek","Nela","Blažej","Jarmila","Dobromila","Vanda","Veronika","Milada","Apolena","Mojmír","Božena","Slavěna","Věnceslav","Valentýn","Jiřina","Ljuba","Miloslava","Gizela","Patrik","Oldřich","Lenka","Petr","Svatopluk","Matěj","Liliana","Dorota","Alexandr","Lumír","Horymír"}
m3 = {"Bedřich","Anežka","Kamil","Stela","Kazimír","Miroslav","Tomáš","Gabriela","Františka","Viktorie","Anděla","Řehoř","Růžena","Rút","Ida","Elena","Vlastimil","Eduard","Josef","Světlana","Radek","Leona","Ivona","Gabriel","Marián","Emanuel","Dita","Soňa","Taťána","Arnošt","Kvido",}
m4 = {"Hugo","Erika","Richard","Ivana","Miroslava","Vendula","Heřman / Hermína","Ema","Dušan","Darja","Izabela","Julius","Aleš","Vincenc","Anastázie","Irena","Rudolf","Valérie","Rostislav","Marcela","Alexandra","Evženie","Vojtěch","Jiří","Marek","Oto","Jaroslav","Vlastislav","Robert","Blahoslav",}
m5 = {"1. máj","Zikmund","Alexej","Květoslav","Klaudie","Radoslav","Stanislav","Osvobození od fašismu","Ctibor","Blažena","Svatava","Pankrác","Servác","Bonifác","Žofie","Přemysl","Aneta","Nataša","Ivo","Zbyšek","Monika","Emil","Vladimír","Jana","Viola","Filip","Valdemar","Vilém","Maxim","Ferdinand","Kamila",}
m6 = {"Laura","Jarmil","Tamara","Dalibor","Dobroslav","Norbert","Iveta","Medard","Stanislava","Gita","Bruno","Antonie","Antonín","Roland","Vít","Zbyněk","Adolf","Milan","Leoš","Květa","Alois","Pavla","Zdeňka","Jan","Ivan","Adriana","Ladislav","Lubomír","Petr a Pavel","Šárka",}
m7 = {"Jaroslava","Patricie","Radomír","Prokop","Cyrila a Metoděje","mistr Jan Hus","Bohuslava","Nora","Drahoslava","Libuše","Olga","Bořek","Markéta","Karolína","Jindřich","Luboš","Martina","Drahomíra","Čeněk","Ilja","Vítězslav","Magdaléna","Libor","Kristýna","Jakub","Anna","Věroslav","Viktor","Marta","Bořivoj","Ignác",}
m8 = {"Oskar","Gustav","Miluše","Dominik","Kristián","Oldřiška","Lada","Soběslav","Roman","Vavřinec","Zuzana","Klára","Alena","Alan","Hana","Jáchym","Petra","Helena","Ludvík","Bernard","Johana","Bohuslav","Sandra","Bartoloměj","Radim","Luděk","Otakar","Augustýn","Evelína","Vladěna","Pavlína",}
m9 = {"Linda / Samuel","Adéle","Bronislav","Jindřiška","Boris","Boleslav","Regina","Mariana","Daniela","Irma","Denisa","Marie","Lubor","Radka","Jolana","Ludmila","Naděžda","Kryštof","Zita","Oleg","Matouš","Darina","Berta","Jaromír","Zlata","Andrea","Jonáš","Václav","Michal","Jeroným",}
m10 = {"Igor","Olívei / Galina","Bohumil","František","Eliška","Hanuš","Justýna","Věra","Štefan / Sára","Marina","Andrej","Marcel","Renáta","Agáta","Tereza","Havel","Hedvika","Lukáš","Michaela","Vendelín","Brigita","Sabina","Teodor","Nina","Beata","Erik","Šarlota / Zoe","Den vzniku československého státu","Silvie","Tadeáš","Štěpánka",}
m11 = {"Fenix","Památka zesnulých","Hubert","Karel","Miriam","Liběna","Saskie","Bohumír","Bohdan","Evžen","Martin","Benedikt","Tibor","Sáva","Leopold","Otmar","Den boje studentů za svobodu","Romana","Alžběta","Nikola","Albert","Cecílie","Klement","Emílie","Kateřina","Artur","Xenie","René","Zina","Ondřej",}
m12 = {"Iva","Blanka","Svatoslav","Barbora","Jitka","Mikuláš","Ambrož","Květoslava","Vratislav","Julie","Dana","Simona","Lucie","Lýdie","Radana","Albína","Daniel","Miloslav","Ester","Dagmar","Natálie","Šimon","Vlasta","Adam a Eva","1.svátek vánoční","2.svátek vánoční / Štěpán","Žaneta","Bohumila","Judita","David","Silvestr",}
svatky = {m1,m2,m3,m4,m5,m6,m7,m8,m9,m10,m11,m12}
m={dn}
d={dd}
month = svatky[m]
day = month[d]
return string.sub(day, 1, 15)
end

Na konci vracím jen prvních 15 znaků textu, to proto, že moc dlouhý text by mohl rozbíjet rozvržení ciferníku (prostě se tam nevleze).

Dočasné skrytí prvku

Mějme ciferník se spoustou informací a analogovými ručičkami. Ty mohou nějaké informace zakrývat, proto by se hodilo mít možnost je dočasně schovat.

K tomu si vytvoříme skrytý element, který bude volat funkci, která schová ručičky. Demonstrovat si to budeme na textu se svátkem.

Element bude kruh, bude v místě, kde je nápis se svátkem, bude nahoře a bude mít viditelnost (opacity) 0. Viditelnost 1-100 udává, že prvek je viditelný, 0 není vidět, ale reaguje na klepnutí, -1 je neviditelný a nereaguje ani na klepnutí.

Vytvořili jsme si dvě pomocné proměnné, var_s_hidden a var_s_time. První určuje, jestli je jméno skryté (viz podmínka v opacity) a druhé, jak dlouho má být ještě skryté.

Dále máme funkci var_hideName(), která provede skrytí (nastaví var_s_hidden na 1 a var_s_time na 3 sekundy). Tato funkce se automaticky volá každou sekundu, ale jen pokud je rozsvícený displej. Ještě je k dispozici funkce on_milisecond, která se volá každou milisekundu.

Je zde zajímavé omezení, kdy tyto funkce mohou přistupovat ke všem proměnným, ale měnit mohou jen ty, jejichž název začíná na var_s_ (on_second) nebo var_ms_ (on_milisecond).

var_s_hidden = 0
var_s_time = 0

function var_hideName()
   var_s_hidden = 1
   var_s_time = 3
end

function on_second(dt)
   if var_s_hidden == 1 then
       var_s_time = var_s_time - 1
       if var_s_time == 0 then var_s_hidden = 0 end
   end
end

To by bylo pro dnešek vše.

Soubor s demo ciferníkem si můžete stáhnout.

Za opsání českých svátků do souboru děkuji své sestře Katce.


Categories:


Comments

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *