28.10.2014 Views

1tgD67B

1tgD67B

1tgD67B

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

Label {<br />

id: result<br />

text: " "<br />

font.pixelSize: Theme.fontSizeHuge<br />

horizontalAlignment: Text.AlignHCenter<br />

width: parent.width<br />

}<br />

Label {<br />

id: dice_rolls<br />

text: " "<br />

font.pixelSize: Theme.fontSizeExtraSmall<br />

horizontalAlignment: Text.AlignHCenter<br />

width: parent.width<br />

height: 20<br />

wrapMode: Text.Wrap<br />

maximumLineCount: 2<br />

}<br />

Slider {<br />

id: nod<br />

label: "Number of dice"<br />

minimumValue: 1<br />

maximumValue: 10<br />

stepSize: 1<br />

value: 1<br />

valueText: value<br />

width: parent.width<br />

}<br />

Listaus 3. Sovelluksen pääsivun Label- ja Sliderkomponenttien<br />

sisältö.<br />

kymmeneen. Nykyinen arvo kerrotaan<br />

sovelluksen käyttäjälle valueText-ominaisuuden<br />

avulla. Sen arvo viittaa suoraan<br />

value-ominaisuuteen, jonka arvo puolestaan<br />

päivittyy automaattisesti, kun liukua<br />

siirretään.<br />

Loput pääsivun toiminnot ovat listauksessa<br />

4. Grid-komponentin avulla<br />

napit sijoitetaan ruudukkoon, jossa on<br />

kaksi saraketta ja neljä riviä. Grid sijoittaa<br />

alikomponenttinsa järjestyksessä<br />

vasemman ylänurkan solusta alkaen.<br />

Koska ruudukossa on yhteensä kahdeksan<br />

solua, pitää Grid-komponentilla olla<br />

kahdeksan alikomponenttia. Listauksesta<br />

kuitenkin nähdään, että niitä on vain<br />

kolme. Ruudukko täytetäänkin Repeaterkomponentin<br />

avulla.<br />

Repeater luo jokaista mallin alkiota<br />

kohden yhden edustajan (delegate). Mallin<br />

dataan päästään käsiksi modelDataominaisuuden<br />

avulla, jota voi käyttää<br />

edustajan määrittelyssä. Lisäksi edustajassa<br />

voi käyttää ominaisuutta index,<br />

joka kertoo data-alkion sijoituksen mallissa.<br />

Repeater-komponentti käytännössä<br />

korvaa sen, että painikekomponentti<br />

Button olisi toistettu kuusi kertaa hieman<br />

erilaisella nopan sivumäärällä.<br />

Button-komponentti on Silican painike.<br />

Yleensä sille asetetaan kolme ominaisuutta:<br />

leveys, teksti ja suoritettava<br />

toiminto, kun painallus havaitaan. Tässä<br />

tapauksessa painalluksen seurauksena<br />

kutsutaan funktiota roll_dice, joka arpoo<br />

noppien silmäluvut ja sijoittaa arvot<br />

Label-komponentteihin. Funktio näkyy<br />

listauksessa 5.<br />

Listauksessa 4 olevat kaksi viimeistä<br />

komponenttia muodostavat käyttäjän<br />

määrittämän nopan. Button-komponentti<br />

on muuten samanlainen kuin edelläkin,<br />

mutta nopan sivumäärä haetaan tällä<br />

kertaa erillisestä TextField-komponentista<br />

ja sen text-ominaisuudesta.<br />

TextField perii QML:n peruskomponentin<br />

TextInput, joten niiden ominaisuudet<br />

vastaavat pääosin toisiaan. Esimerkiksi<br />

syötteentarkistus voidaan hoitaa<br />

samalla tavalla eli käyttämällä IntValidator-,<br />

DoubleValidator- tai RegExpValidator-komponenttia.<br />

Noppasovelluksessa<br />

halutaan kokonaislukuja, joten käytetään<br />

IntValidatoria ja määritellään lukualueeksi<br />

2–10 000.<br />

TextField-komponentin hyödyllisiä<br />

ominaisuuksia ovat myös inputMethodHints<br />

ja placeholderText. Näistä<br />

ensimmäinen antaa virtuaalinäppäimistölle<br />

ohjeita, millaista syötettä odotetaan.<br />

Esimerkkisovelluksessa käytetty<br />

Qt.ImhDigitsOnly kertoo, että tekstikenttä<br />

hyväksyy vain numeroita, joten Sailfish<br />

tuo esiin numeronäppäimistön, kun<br />

tekstikenttä aktivoidaan. Ominaisuus<br />

placeholderText puolestaan asettaa tekstin,<br />

joka näytetään tekstikentän ollessa<br />

tyhjänä. Sen avulla voi vihjata käyttäjälle,<br />

mitä sisältöä kenttään halutaan.<br />

Sovelluskansi – vuorovaikutteinen<br />

kiiltokuva<br />

Katsotaan seuraavaksi, miten sovelluskansi<br />

toteutetaan. Kansi otetaan käyttöön<br />

ApplicationWindow-komponentin coverominaisuuden<br />

avulla. Suositeltavaa on<br />

käyttää kannen toteutuksessa Cover-<br />

Background-komponenttia, joka sisältää<br />

esimerkiksi logiikkaa kannen sijoittamiseen<br />

kotinäkymässä.<br />

Noppasovelluksen kanteen haluamme<br />

viimeisimmän nopanheiton tuloksen<br />

sekä pyyhkäisytoiminnon, jolla noppaa<br />

voi heittää suoraan kannesta käsin. Listauksessa<br />

6 on varsinainen kannen määrittely.<br />

Listauksen alussa määritellään<br />

pari ominaisuutta ja signaali, jotka auttavat<br />

pyyhkäisytoiminnon toteutuksessa.<br />

Kannessa näytettävät tekstit on toteutettu<br />

Label-komponenteilla, jotka puolestaan<br />

ovat sijoittelusta vastaavan Columnkomponentin<br />

sisällä.<br />

Kannen pyyhkäisytoiminnot määritellään<br />

CoverActionList-komponentin<br />

alikomponentteina, joita voi olla enintään<br />

kaksi. Ensimmäinen CoverActionalikomponentti<br />

tulee näkyviin kannen<br />

Grid {<br />

columns: 2<br />

rows: 4<br />

spacing: Theme.paddingLarge<br />

rowSpacing: Theme.paddingLarge<br />

Repeater {<br />

model: [4, 6, 8, 10, 12, 20]<br />

delegate: Button {<br />

text: "D" + modelData<br />

onClicked: roll_dice(modelData)<br />

width: base.button_width<br />

}<br />

}<br />

TextField {<br />

id: custom_dice<br />

text: "100"<br />

placeholderText: "Sides count"<br />

validator: IntValidator { bottom: 2; top: 10000 }<br />

inputMethodHints: Qt.ImhDigitsOnly<br />

width: base.button_width<br />

}<br />

Button {<br />

text: "D" + custom_dice.text<br />

onClicked: roll_dice(custom_dice.text)<br />

width: base.button_width<br />

}<br />

}<br />

Listaus 4. Sovelluksen pääsivun loppuosa eli Grid-komponentti ja sen alikomponentit.<br />

function roll_dice (max) {<br />

root.lastDiceMax = max<br />

var sum = 0<br />

var all_rolls = " "<br />

for (var i = 1; i 1) {<br />

if (i == 1) {<br />

all_rolls = roll.toString()<br />

} else {<br />

all_rolls = all_rolls + " + " + roll<br />

}<br />

}<br />

}<br />

result.text = sum<br />

root.lastThrow = nod.sliderValue + "d" + max + ": " + sum<br />

dice_rolls.text = all_rolls<br />

if(root.diceIsThrown === false) {<br />

root.diceIsThrown = true<br />

}<br />

return 0<br />

}<br />

Listaus 5. Nopan silmäluvun arvonnasta vastaava roll_dice-funktio.<br />

44 2014.2

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!