Sekalaiset Sivukartta

MUIkeita käyttöliittymiä
Ilkka Lehtoranta <ilkleht@isoveli.org>

Amigalla käyttöliittymän rakentamisessa on aina ollut monta mutkaa. Alun perin käyttöjärjestelmä tarjosi vain minimaalisen tuen käyttöliittymän rakentamiseen, eivätkä myöhemmät päivitykset tuoneet paljon apua.

Usein käyttöliittymä oli suunniteltu toimimaan yhdellä ainoalla fontilla ja resoluutiolla. Toisaalta käyttöliittymän ohjelmoiminen oli tuhottoman hankalaa, aikaa vievää ja kulutti resursseja tärkeämmiltä asioilta. Lääkkeeksi ongelmaan Stefan Stuntz kehitti uuden oliopohjaisen käyttöliittymäkirjaston: Magic User Interface oli syntynyt. Olio-ominaisuuksiensa ansiosta MUI on helposti laajennettavissa, eikä ohjelmoijan tarvitse välttämättä jäädä jumiin, jos jotakin puuttuu. Olioihin voi helposti lisätä toimintoja tai vaikka rakentaa siitä täysin uudenlaisen nappulatyypin. Ohjelmoijan ei tarvitse kuitenkaan sisäistää olio-ohjelmoinnin alkeita, jos tyytyy käyttämään valmisluokkia, ja kuka tahansa ohjelmointitaitoinen voi oppia hyödyntämään MUIta. Käyttäjillekin MUI on yleensä mieluisin vaihtoehto.

Käyttöliittymän tekeminen
MUI-käyttöliittymä koostuu yhdestä isosta oliopuusta. Puun juurena toimii aina Application-objekti ja tämän alle tulevat ikkunat. Ikkunoiden alle tulevat taas varsinaiset käyttöliittymäoliot. Ikkunoiden määrää ei ole millään tavalla rajoitettu, mutta ikkunat voivat tulla vain ohjelmaolion alle. Yksittäiseen ikkunaan taas voi liittää vain yhden GUI-komponentin, VGroup- tai HGroup-olion. Vasta tämän Group-olion alle määritellään varsinainen käyttöliittymä. Nimensä mukaisesti Group on ryhmäolio, jonka alle voi laittaa loputtoman määrän omia GUI-komponentteja. Riippuen siitä, onko kyseessä VGroup tai HGroup (vertical, horizontal), oliot piirretään joko allekkain tai rinnakkain määrittelyjärjestyksessä. Tärkeimpiä Area-luokasta periytyviä komponentteja:
Luokka | Perillisiä | Selitys
--- | --- | ---
Balance | - | Antaa käyttäjän muuttaa ryhmien välisiä suhteita
Gauge | - | Edistymismittari
Gadget | String, Boopsi, Prop | Intuitionin komponentteja
Group | Katso oheinen taulukko | Kerää muita GUI-komponentteja
Image | - | Kuvat
List | Floattext, Volumelist, Dirlist | Kaikenlaiset listat, vaatii isännäksi Listviewin
Numeric | Knob, Slider | Hissimäiset liukupainikkeet
Pendisplay | Poppen | Värivalitsin (piirtokynä)
Text | - | Näyttää tekstiä
Rectangle | - | Tekee tyhjiä alueita
Group-luokasta periytyviä uusia komponentteja:
Luokka | Selitys
--- | ---
Cycle | Perinteinen kääntönappi
Listview | List-luokan isäntä
Popstring | Erityyppiset ponnahdusikkunat
Radio | Radiopainikkeet
Register | Kokoaa komponentit erillisiksi sivuiksi
Scrollbar | Vieritysnappulat
Virtgroup | Eräänlainen virtuaalinäyttö
Listaus Esimerkki1.c toteuttaa yksinkertainen MUI-ohjelman käyttäen vain muutamaa oliota. Listauksessa komponentit on ryhmitetty ikkunaan VGroupin alle, joten oliot tulevat allekkain. HGroupilla voisimme laittaa ne vastaavasti riviin ja Groupiin voi lisätä myös muita ryhmiä. Näin voidaan helposti rakentaa hyvinkin monimutkaisia (ja joskus raskaita) käyttöliittymiä. Kaikkein vaikeinta on muistaa laittaa End oikeisiin paikkoihin. End lopettaa aina sisimmän oliomäärityksen, mutta pitkässä listauksessa voi olla vaikea hahmottaa, mikä End kuuluu millekin oliolle. Onkin hyvä opetella käyttämään sisennystä heti alusta pitäen.

Tapahtumien käsitteleminen
Jos satuit kokeilemaan ensimmäistä ohjelmalistausta, huomasit varmaan, ettei sitä voinut sulkea vasemmasta yläkulmasta eikä tekemämme painikekaan reagoinut. Tämä siksi, koska emme määrittäneet yhtään tapahtumaa käsiteltäväksi. Ohjelman saa lopetettua ainoastaan Exchangella tai ARexxilla. Tapahtumakäsittelijä voidaan liittää olioon MUIM_Notify-metodilla: DoMethod(obj, MUIM_Notify, ULONG TrigAttr, ULONG TrigVal, APTR DestObj, ULONG FollowParams, /* ... */); TrigAttr on attribuutti jota valvotaan ja TrigVal arvo joka käynnistää tapahtumakäsittelijän. Esimerkiksi ikkunaluokan attribuutti CloseRequest on TRUE kun ikkunansulkunappia on painettu: DoMethod(mainwindow, MUIM_Notify, MUIA_Window_CloseRequest, TRUE, MUIV_Notify_Application, 2, MUIM_Application_ReturnID, MUIV_Application_ReturnID_Quit); Loput parametrit kertovat mitä tehdään ja kuka tekee jos tapahtumakäsittelijä käynnistetään. MUIV_Notify_Application kertoo, että metodi halutaan kutsuttavaksi ohjelmaoliossa. Jos se olisi jotain muuta, kutsuttava olio ei tunnistaisi ohjelmaluokkaan kuuluvaa metodia. Seuraava arvo (2 tässä tapauksessa) kertoo parametrien määrän toimintametodista alkaen. On tärkeää laittaa se oikein, ettei MUI kopioi liikaa muistia asettaessaan käsittelijää! Vasta tämän jälkeen tulevat varsinainen kutsuttava metodi ja sen parametrit. Eräs hyvin yleinen tapa lisätä tapahtumakäsittelijä on käyttää apuna CallHook-metodia kuten listauksessa Esimerkki2.c on tehty: DoMethod(button, MUIM_Notify, MUIA_Pressed, FALSE, MUIV_Notify_Self, 2, MUIM_CallHook, &ButtonHook); ButtonHook on tässä osoitin Amigan Hook-struktuuriin. Kun nappula painetaan alas, attribuutti MUIA_Pressed saa arvon TRUE ja ylöstullessaan se muuttuu takaisin FALSE:ksi ja laukaisee tapahtuman. Tällöin MUI suorittaa CallHook-metodin oliossa parametrinaan osoitin ButtonHookiin, ja lopulta suoritus ohjautuu omaan koodiin.

Lopuksi
Viimeiseen esimerkkilistaukseen, Esimerkki3.c, olen lisännyt kaksi uutta komponenttia: Dirlistin ja Balancen. Nyt ohjelma alkaa jo näyttää joltain, ja parilla lisäyksellä GUI:n toiminnallisuus kasvoi huomattavasti. Ensimmäistä MUI-ohjelmaa tehdessään kannattaa kokeilla muuttaa valmista esimerkkiä ja tutkia, kuinka eri komponentit muuttavat käyttöliittymän toimintaa. Siitä voi alkaa kehitellä omia suurohjelmiaan, ja nälkähän tunnetusti kasvaa syödessä... Katso myös jutun mukana tuleva makefile.

Sekalaiset Sivun alkuun Sivukartta