<?xml version="1.0" ?>
<!DOCTYPE book PUBLIC "-//KDE//DTD DocBook XML V4.2-Based Variant V1.1//EN" "dtd/kdex.dtd" [
  <!ENTITY kappname "ksplash">
  <!ENTITY package "kdebase">
  <!ENTITY % addindex "IGNORE">
  <!ENTITY % Estonian  "INCLUDE">
]>

<book lang="&language;">

<bookinfo>
<title
>&ksplash;i käsiraamat</title>

<authorgroup>
<author
>&Teemu.Rytilahti; &Teemu.Rytilahti.mail; </author>

<othercredit role="developer"
>&Brian.C.Ledbetter; &Brian.C.Ledbetter.mail; </othercredit>

<othercredit role="developer"
>&Ravikiran.Rajagopal; &Ravikiran.Rajagopal.mail; </othercredit>

<othercredit role="translator"
><firstname
>Marek</firstname
><surname
>Laane</surname
><affiliation
><address
><email
>bald@online.ee</email
></address
></affiliation
><contrib
>Tõlge eesti keelde</contrib
></othercredit
> 

</authorgroup>

<copyright>
<year
>2003</year>
<holder
>Teemu Rytilahti</holder>
</copyright>
<copyright>
<year
>2003</year>
<holder
>Ravikiran Rajagopal</holder>
</copyright>
<legalnotice
>&FDLNotice;</legalnotice>

<date
>2003-01-10</date>
<releaseinfo
>1.01.00</releaseinfo>

<abstract>
<para
>&ksplash; on kena käivitusekraan, mis näitab rakenduse laadimise edenemist.</para>
</abstract>

<keywordset>
<keyword
>KDE</keyword>
<keyword
>kdebase</keyword>
<keyword
>ksplash</keyword>
<keyword
>ksplashml</keyword>
<keyword
>käivitusekraan</keyword>
<keyword
>silmarõõm</keyword>
</keywordset>

</bookinfo>

<chapter id="introduction">
<title
>Sissejuhatus</title>

<para
>&ksplash; on kena käivitusekraan, mis näitab rakenduse laadimise edenemist. Palun anna kõigist probleemidest või mõtetest täiustamise kohta teada &kde; meililistides. &ksplash;i peamised omadused on: </para>
<simplelist>
<member
>Teemade kasutamine</member>
<member
>Pluginate kasutamine (võimaldab täielikku kohandamist oma suva järgi)</member>
<member
>Võimalus kasutada suvalise rakendusega, mis pruugib DCOP-i</member>
</simplelist>

<para
>Käesolev käsiraamat selgitab, kuidas luua teemasid kasutamiseks juba olemasolevate pluginatega. Kui ükski plugin ei suuda sinu tuju järgi olla, võib õppida &ksplash;i välimust igati ja täielikult muutma pluginat ise C++ keeles kirja pannes. </para>
</chapter>

<chapter id="using-themes">
<title
>Teemade kasutamine</title>

<para
>Kui tahad kasutada saidi <ulink url="http://www.kde-look.org"
>KDE-Look</ulink
> teemasid, paki need ainult endale kasutamiseks lahti kataloogi <filename
>~/.kde/share/apps/ksplash/Themes/</filename
> või kataloogi <filename
>$<envar
>KDEDIR</envar
>/share/apps/ksplash/Themes/</filename
>, kui soovid need teha kättesaadavaks kõigile süsteemi kasutajatele. Aga kogu selle vaeva võib lasta automaatselt ära teha ka &kde; juhtimiskeskuse kaardi <guilabel
>Välimus</guilabel
> moodulil <guilabel
>Käivitusekraan</guilabel
>.</para>
</chapter>

<chapter id="themes">
<title
>Kuidas luua teemasid &ksplash;ile</title>
<sect1 id="themes-general">
<title
>Üldine</title>
<para
>Oma teema loomine &ksplash;ile on päris lihtne. Kui oled teema valmis saanud, võid selle postitada veebileheküljele <ulink url="http://www.kde-look.org"
>KDE-Look</ulink
>, et sinu suurepärasest ilumeelest saaksid osa ka teised.</para>

<sect2 id="theme-syntax">
<title
>Teema identifitseerimine</title>

<para
>Võtame ette teema <literal
>MinuLaheTeema</literal
> loomise. Et &ksplash; teemat tunnistaks, tuleb see salvestada kataloogi <filename class="directory"
>MinuLaheTeema</filename
>, mis omakorda paikneb kataloogis <filename class="directory"
>~/.kde/apps/ksplash/Themes/</filename
>. Teemat sisaldab fail nimega <filename
>Theme.rc</filename
>. Selles võib ära määrata terve hulga erilisi omadusi, muuta kasutatavat pluginamootorit ja nii edasi. Kõiki vähegi mõeldavaid seadistusi kasutada ei ole mõistagi kohustuslik, sest tavaliselt on seadistustele määratud üsna mõistlikud vaikeväärtused. Faili <filename
>Theme.rc</filename
> kirjete põhisüntaks on lihtne: <literal
>[võti] = [väärtus]</literal
>. Võtmete definitsioonid leiab käsiraamatu edasistes osades.</para>

<example>
<title
>Lihtne <filename
>Theme.rc</filename
> fail</title>
<programlisting
>[KSplash Theme: MinuLaheTeema]
Name = MinuLaheTeema
Description = Kena XpLike mootorit kasutav teema
Version = 1.0
Author = Tegelik nimi &lt;tegelik_meiliaadress@mail.ee&gt;
## Selle teema puhul kasutatakse XpLike mootorit.
Engine = XpLike
Show Icon = false
Welcome Text = KDE käivitamine
</programlisting>
</example>

<para
>Pärast teema nime, kirjelduse ja autori määramist tuleb valida teema mootor (sageli nimetatakse seda ka pluginaks). Seejärel saab meelepäraseks muuta mootori mitmesugused võimalused, pannes paika võtme-väärtuse paarid, nagu näha toodud näites.</para>

</sect2>

<sect2 id="theme-files">
<title
>Taustafailid</title>

<para
>Kui &ksplash; tööd alustab, püüab ta leida sinu parajasti valitsevale ekraaniresolutsioonile vastavat taustapilti, kui teemamootor seda kasutama peaks. Taustapildi fail peaks kandma järgmises vormingus nime: <filename
>Background<replaceable
>LAIUSxKÕRGUS</replaceable
>.png</filename
>.</para>

<para
>Näiteks <filename
>Background-1024x768</filename
>. Kui resolutsioonile vastavat taustapilti ei leita, püütakse muuta algupärase <filename
>Background.png</filename
> või failis <filename
>Theme.rc</filename
> määratud faili suurust, et see sobiks kokku valitseva resolutsiooniga. Selline lennult suuruse muutmine võib võtta tükk aega, mispärast oleks kasulik omada vähemalt järgmistes mõõtmetes taustapilte: 1280x1024, 1024x768 ja 800x600.</para>
</sect2>
</sect1>

<sect1 id="theme-engines">
<title
>Teemamootorite valikud</title>

<sect2 id="standard-themes">
<title
>Standardteema</title>
<table>
<title
>Standardteema valikud</title>
<tgroup cols="3">
<tbody>
<row>
<entry
>Nimi</entry>
<entry
>Argument</entry>
<entry
>Seletus</entry>
</row>
<!-- Statusbar -->
<row>
<entry
>Statusbar Position</entry>
<entry
>[top/bottom]</entry>
<entry
>Määrab olekuriba asukoha ekraanil. Vaikimisi on see all (bottom).</entry>
</row>
<row>
<entry
>Statusbar Visible</entry>
<entry
>[true/false]</entry>
<entry
>Määrab, kas olekuriba näidata või mitte. Vaikimisi on see väärtus tõene (true).</entry>
</row>
<row>
<entry
>Progress Visible</entry>
<entry
>[true/false]</entry>
<entry
>Määrab, kas laadimise edenemist näidata või mitte. Vaikimisi on see väärtus tõene (true).</entry>
</row>
<!-- Fonts -->
<row>
<entry
>Statusbar Font</entry>
<entry
>[fondinimi]</entry>
<entry
>Olekuribal kasutatav font. Vaikimisi on see Helvetica.</entry>
</row>
<row>
<entry
>Statusbar Font Size</entry>
<entry
>[suurus]</entry>
<entry
>Olekuriba fondi suurus. Vaikimisi on see 16.</entry>
</row>
<row>
<entry
>Statusbar Font Bold</entry>
<entry
>[true/false]</entry>
<entry
>Määrab, kas olekuriba font on rasvases kirjas või mitte. Vaikimisi on see väärtus tõene (true).</entry>
</row>
<row>
<entry
>Statusbar Font Italic</entry>
<entry
>[true/false]</entry>
<entry
>Määrab, kas olekuriba font on kaldkirjas või mitte. Vaikimisi on see väärtus väär (false).</entry>
</row>
<!-- Misc. things -->
<row>
<entry
>Statusbar Foreground</entry>
<entry
>[värv]</entry>
<entry
>Olekuriba esiplaani värv. Vaikimisi on see valge (white).</entry>
</row>
<row>
<entry
>Statusbar Background</entry>
<entry
>[värv]</entry>
<entry
>Olekuriba tausta värv. Vaikimisi on see must (black).</entry>
</row>
<row>
<entry
>Statusbar Icon</entry>
<entry
>[true/false]</entry>
<entry
>Määrab, kas olekuribal peaks olema ikoon või mitte.</entry>
</row>
<row>
<entry
>Icons Visible</entry>
<entry
>[true/false]</entry>
<entry
>Määrab, kas ikoonid on näha või mitte. Vaikimisi on see väärtus tõene (true).</entry>
</row>
<row>
<entry
>Icons Jumping</entry>
<entry
>[true/false]</entry>
<entry
>Määrab, kas ikoonid hüppavad või mitte. Vaikimisi on see väärtus tõene (true).</entry>
</row>
<row>
<entry
>Icon Position</entry>
<entry
>[0-3,10-13]</entry>
<entry
>Asukoht, kus ikoone näidatakse. Vaikimisi all vasakul.</entry>
</row>
<row>
<entry
>Splash Screen</entry>
<entry
>[nimi]</entry>
<entry
>Muudab näidatavat käivituslogo pilti.</entry>
</row>
</tbody>
</tgroup>
</table>
</sect2>

<sect2 id="redmond-themes">
<title
>Redmondi teema</title>
<table>
<title
>Redmondi teema valikud</title>
<tgroup cols="3">
<tbody>
<row>
<entry
>Nimi</entry>
<entry
>Argument</entry>
<entry
>Seletus</entry>
</row>
<!-- Main elements -->
<row>
<entry
>Background Image</entry>
<entry
>[failinimi]</entry>
<entry
>Kasutaja määratud kasutatav taustapilt.</entry>
</row>
<row>
<entry
>User Icon</entry>
<entry
>[ikooninimi]</entry>
<entry
>Kasutajale näidatava standardikooni nimi. Vaikimisi <constant
>go</constant
>.</entry>
</row>
<row>
<entry
>Welcome Text</entry>
<entry
>[tekst]</entry>
<entry
>Käivitusekraanil näidatav tekst. Vaikimisi "Welcome" (inglise keele korral). Eestinduses võiks olla "Tere tulemast".</entry>
</row>
<row>
<entry
>Username Text</entry>
<entry
>[tekst]</entry>
<entry
>Tekst, mida näidatakse kasutaja tegeliku nime asemel.</entry>
</row>
<!-- Positioning elements -->
<row>
<entry
>Welcome Text Position</entry>
<entry
>[x,y]</entry>
<entry
>Asukoht ekraanil, kus näidatakse tervitusteksti.</entry>
</row>
<row>
<entry
>Username Text Position</entry>
<entry
>[x,y]</entry>
<entry
>Asukoht ekraanil, kus näidatakse kasutajanime.</entry>
</row>
<row>
<entry
>Action Text Position</entry>
<entry
>[x,y]</entry>
<entry
>Asukoht ekraanil, kus näidatakse parajasti käivat tegevust.</entry>
</row>
<row>
<entry
>Icon Position</entry>
<entry
>[x,y]</entry>
<entry
>Asukoht ekraanil, kus näidatakse kasutaja ikooni.</entry>
</row>
<!-- Show to show.. -->
<row>
<entry
>Show Welcome Text</entry>
<entry
>[true/false]</entry>
<entry
>Lülitab tervitusteksti näitamist. Vaikimisi tõene (true).</entry>
</row>
<row>
<entry
>Show Welcome Shadow</entry>
<entry
>[true/false]</entry>
<entry
>Lülitab tervitusteksti varju näitamist. Vaikimisi tõene (true).</entry>
</row>
<row>
<entry
>Show Username</entry>
<entry
>[true/false]</entry>
<entry
>Lülitab kasutajanime näitamist. Vaikimisi tõene (true).</entry>
</row>
<row>
<entry
>Show Action</entry>
<entry
>[true/false]</entry>
<entry
>Lülitab parajasti sooritatava tegevuse näitamist. Vaikimisi tõene (true).</entry>
</row>
<row>
<entry
>Show Icon</entry>
<entry
>[true/false]</entry>
<entry
>Määrab, kas ikooni näidata või mitte. Vaikimisi tõene (true).</entry>
</row>
<row>
<entry
>Use KDM User Icon</entry>
<entry
>[true/false]</entry>
<entry
>Kasutaja sisselogimisikooni näitamine. Vaikimisi tõene (true).</entry>
</row>
</tbody>
</tgroup>
</table>
</sect2>

<sect2 id="macx-themes">
<title
>MacX teema</title>
<table>
<title
>MacX teema valikud</title>
<tgroup cols="3">
<tbody>
<row>
<entry
>Nimi</entry>
<entry
>Argument</entry>
<entry
>Seletus</entry>
</row>
<row>
<entry
>Icon Size Minimum</entry>
<entry
>[suurus]</entry>
<entry
>Omistab ikoonidele miinimumsuuruse. Vaikimisi 16.</entry>
</row>
<row>
<entry
>Icon Size Maximum</entry>
<entry
>[suurus]</entry>
<entry
>Omistab ikoonidele maksimumsuuruse. Vaikimisi 64.</entry>
</row>
<row>
<entry
>Optimized Icon Rendering</entry>
<entry
>[true/false]</entry>
<entry
>Optimeerib ikoonide teisendamist. Vaikimisi tõene (true).</entry>
</row>
<row>
<entry
>Progress Bar Visible</entry>
<entry
>[true/false]</entry>
<entry
>Vaikimisi tõene (true).</entry>
</row>
<row>
<entry
>Progress Bar Position</entry>
<entry
>[top/bottom]</entry>
<entry
>Määrab, kas olekuriba asub all (bottom) või ülal (top). Vaikimisi all.</entry>
</row>
<row>
<entry
>Icons Jumping</entry>
<entry
>[true/false]</entry>
<entry
>Määrab, kas ikoonid hüppavad või mitte. Vaikimisi väär (false).</entry>
</row>
</tbody>
</tgroup>
</table>
</sect2>

<sect2 id="mac-classic-themes">
<title
>MacClassic teema</title>
<table>
<title
>MacClassic teema valikud</title>
<tgroup cols="3">
<tbody>
<row>
<entry
>Nimi</entry>
<entry
>Argument</entry>
<entry
>Seletus</entry>
</row>
<row>
<entry
>Icon Position</entry>
<entry
>[0-3,10-13]</entry>
<entry
>Ikoonide asukoht ekraanil. Vaikimisi all vasakul.</entry>
</row>
<row>
<entry
>Icons Jumping</entry>
<entry
>[true/false]</entry>
<entry
>Määrab, kas ikoonid hüppavad või mitte. Vaikimisi väär (false).</entry>
</row>
<row>
<entry
>Icons Visible</entry>
<entry
>[true/false]</entry>
<entry
>Määrab, kas ikoonid on näha või mitte. Vaikimisi on see väärtus tõene (true).</entry>
</row>
<row>
<entry
>Splash Screen</entry>
<entry
>[nimi]</entry>
<entry
>Muudab näidatavat käivituslogo pilti.</entry>
</row>
</tbody>
</tgroup>
</table>
</sect2>

<sect2 id="themes-2k">
<title
>2k teema</title>
<table>
<title
>2k teema valikud</title>
<tgroup cols="3">
<tbody>
<row>
<entry
>Nimi</entry>
<entry
>Argument</entry>
<entry
>Seletus</entry>
</row>
<row>
<entry
>Title Background Color</entry>
<entry
>[värv]</entry>
<entry
>Tiitli tausta värv. Vaikimisi tumesinine (dark blue).</entry>
</row>
<row>
<entry
>Title Foreground Color</entry>
<entry
>[värv]</entry>
<entry
>Tiitli esiplaani värv. Vaikimisi valge (white).</entry>
</row>
<row>
<entry
>Status Text Color</entry>
<entry
>[värv]</entry>
<entry
>Staatusetekstide värv. Vaikimisi sama, mis tiitli tausta värv.</entry>
</row>
<row>
<entry
>Rotator Color 1</entry>
<entry
>[värv]</entry>
<entry
>Määrab esimese rotaatori värvi. Vaikimisi tumesinine (dark blue).</entry>
</row>
<row>
<entry
>Rotator Color 2</entry>
<entry
>[värv]</entry>
<entry
>Määrab teise rotaatori värvi. Vaikimisi tsüaan (cyan).</entry>
</row>
<row>
<entry
>Rotator Speed</entry>
<entry
>[väärtus]</entry>
<entry
>Määrab rotaatori kiiruse. Vaikimisi 30.</entry>
</row>
<row>
<entry
>Window Title</entry>
<entry
>[tekst]</entry>
<entry
>Määrab aknatiitli teksti.</entry>
</row>
<row>
<entry
>Logo File</entry>
<entry
>[failinimi]</entry>
<entry
>Määrab kasutatava logo.</entry>
</row>
</tbody>
</tgroup>
</table>
</sect2>
</sect1>
</chapter>

<chapter id="from-other-applications">
<title
>&ksplash;i kasutamine oma rakendustel</title>

<para
>Selles peatükis kirjeldame lihtsat viisi, kuidas kasutada &ksplash;i oma &kde; rakenduse käivituslogona. Kui sa ei tegele rakenduste arendamisega &kde; tarbeks, võid peatüki ka vahele jätta.</para>

<sect1 id="basic-other-reqs">
<title
>Põhinõuded</title>

<para
>Valitud &kde; rakendus peab olema &DCOP;-teadlik. &DCOP; on &kde; rakendustevahelise suhtlemise tehnoloogia. Kui kasutad standardset <ulink url="http://developer.kde.org"
>&kde; rakenduse raamistikku</ulink
>, peaks selle eest olema automaatselt hoolt kantud. Kui vajad rohkem infot &DCOP;i ja sellega seotud &kde; tehnoloogia kohta, uuri <ulink url="http://developer.kde.org"
>&kde; arendajate kodulehekülge</ulink
>.</para>
</sect1>

<sect1 id="other-using">
<title
>&ksplash;i käivitamine</title>

<para
>Enne seda, kui sinu rakendus alustab arvutikurnamist või pluginate laadimist &etc;, kutsu &ksplash; nii välja:</para>

<programlisting
>DCOPClient *c = kapp-&gt;dcopClient();
QString error;
QCString KSplashName;
int pid = 0;
QStringList args;
args &lt;&lt; "--theme=MyCoolTheme" &lt;&lt; "--managed";
if (kapp-&gt;startServiceByDesktopName("ksplash", args, &amp;error, &amp;KSplashName, &amp;pid))
{
  KMessageBox::sorry(0, error, "Unable to invoke KSplash");
  // Some error processing here.
}
</programlisting>

<para
>Me eeldame, et korraga töötab ainult üks &ksplash;i protsess, muidu lähevad asjad natuke keerulisemaks. Täpsemalt loe selle kohta &DCOP;i dokumentatsioonist.</para>
</sect1>

<sect1 id="show-messages">
<title
>Teadete näitamine</title>

<para
>Enne kui näidata mingeid teateid, tuleb määrata, mitut sammu näidatakse. Näiteks &kde; käivitusprotseduuril on 7 sammu.</para>

<programlisting
>QByteArray data;
    QDataStream arg(data,IO_WriteOnly);
    arg &lt;&lt; someNumber;
    if (!(c-&gt;send(KSplashName, "KSplashIface", "setStartupItemCount(int)", data))
      // Some error processing here.
</programlisting>

<para
>Kui soovid näidata teadet ikooniga või ilma, kasuta</para>

<programlisting
>arg &lt;&lt; QString("ikooniNimi") &lt;&lt; QString("rakenduseNimi") &lt;&lt; QString("Mingi kirjeldus");
    if (!(c-&gt;send(KSplashName, "KSplashIface", "programStarted(QString,QString,QString)", data))
    {
      // Some error processing here.
    }
</programlisting>

<para
>Iga kord, kui kutsuda välja <constant
>programStarted</constant
>, lisatakse uus samm. Kui rakendus on käivitumise lõpetanud, pane käivitulogo kaduma:</para>

<programlisting
>if (!(c-&gt;send(KSplashName, "KSplashIface", "startupComplete()", data))
    {
      // Some error processing here.
    }
</programlisting>

<para
>Ja ongi kõik! Selleks, et osa saada kõigest, mida &ksplash; sulle pakkuda suudab, ei ole vaja midagi rohkem teha.</para>

</sect1>
</chapter>

<!-- FIXME: Better to leave this out until it's written, or the translators -->
<!-- will have to still translate it ... -->

<chapter id="wrplugins">
<title
>Uute &ksplash;i pluginate kirjutamine</title>

<para
>&ksplash;ile uute pluginate kirjutamine pole kuigi raske. Selles peatükis kirjutame lihtsa plugina, mis emuleerib hästi tuntud operatsioonisüsteemi käivitusekraani. Me eeldame, et sa tunned C++ põhialuseid ja oled kas või põgusalt tuttav KDE/Qt programmeerimisega.</para>

<sect1 id="basic-requirements">
<title
>Põhinõuded</title>
<para
>Loome plugina nimetusega <literal
>2k</literal
>. Plugina nime kasutatakse mitmes kohas ning oluline on seda kõikjal ühtmoodi kasutada, et &ksplash; selle ikka ära tunneks. Õigupoolest on &ksplash;i pluginad dünaamiliselt laetavad teegid, mille juures tuleb järgida järgmisi nimekonventsioone: </para>
<simplelist>
<member
>Teek peaks kandma nime <filename
>libksplash+teemanimiväiketähtedega</filename
>. Meie teema puhul siis <filename
>libksplash2k</filename
>.</member>
<member
>Sellele peab vastama töölauafail nimega <filename
>ksplash+teemanimiväiketähtedega.desktop</filename
>, meie juhul siis <filename
>ksplash2k.desktop</filename
>. </member>
<member
>Lõpuks peab teegi tagastatud objekt olema klass nimega <literal
>Theme+teemanimi</literal
>, meie juhul <literal
>Theme2k</literal
>.</member>
</simplelist>
<para
>Ei tasu masendusse langeda, kui sa kõigest kohe aru ei saanud. Hiljem vaatame kõiki punkte lähemalt. Veel üks oluline punkt on see, et pluginaklassi päritolu peab olema <literal
>ThemeEngine</literal
>. </para>
</sect1>
<sect1 id="skeleton">
<title
>Näidisraamistiku loomine</title>
<para
>Me kasutame &kde; rakenduse raamistikku, mis hoolitseb plugina loomise eest ja pakub meile sõltumatust platvormist, ilma et me selleks ise erilisi pingutusi peaksime ette võtma. Selleks kontrolli, et paigaldatud oleks pakett <filename
>kdesdk</filename
>. Anna käsk <literal
>kapptemplate</literal
> rakenduse nimega "2k" tekitamiseks. See loob tipptaseme kataloogi, kus on mitmed üldised failid, näiteks AUTHORS &etc; Meid huvitab kõige enam alamkataloog <filename class="directory"
>2k</filename
>. Mine sellesse alamkataloogi ja kustuta seal kõik failid. Nüüd on meil olemas vajalik "luustik". </para>
<para
>Järgmine samm on luua <filename
>.desktop</filename
>-fail, mis paigaldamise korral teatab &ksplash;ile, et meie plugin on saadaval. Vastavalt <link linkend="basic-requirements"
>eelmises osas</link
> kirjeldatud nimekonventsioonidele loome siin kataloogis faili <filename
>ksplash2k.desktop</filename
>. See peaks sisaldama järgmisi ridu: </para>
<programlisting
><literal>
[Desktop Entry]
Encoding=UTF-8
Type=Service
Comment=KSplash Plugin
Name=KSplash2k
ServiceTypes=KSplash/Plugin
X-KDE-Library=libksplash2k
X-KSplash-Default=true
X-KSplash-PluginName=2k
X-KSplash-ObjectName=Theme2k
</literal
>
</programlisting>
<para
>Kodeering (<literal
>Encoding</literal
>), tüüp (<literal
>Type</literal
>), kommentaar (<literal
>Comment</literal
>) ja teenuse tüüp (<literal
>ServiceTypes</literal
>) on kõigile pluginatele ühesugused. Plugina ja teegi nimi järgivad eespool mainitud nimekonventsiooni. Kirje <literal
>X-KSplash-Default</literal
> kasutab tõeväärtust, mis määrab, kas seda näidatakse vaikimisi juhtimiskeskuse moodulis. Kui mõned harvad erandid kõrvale jätta, peaks see väärtus olema tõene (<constant
>true</constant
>). </para>
</sect1>
<sect1 id="headerfile">
<title
>Pluginaklassi deklaratsioon</title>
<para
>Eeltöö on tehtud, asume nüüd tõeliselt vaimustava osa kallale - looma klassi, mis pakub just sellist käitumist, mida me soovime. Me võime selle klassiga ette võtta küll peaaegu kõike, mida soovime, kuid siiski on siin teatud piirangud.</para>
<orderedlist>
<listitem
><para
>Pluginaklasside päritolu peab olema klass <constant
>ThemeEngine</constant
>.</para
></listitem>
<listitem
><para
>Pluginaklassid peavad kandma nime vastavalt reeglile <classname
>Theme+PluginaNimi</classname
>.</para
></listitem>
<listitem
><para
>Pluginaklassid peavad pakkuma <literal
>staatilise</literal
> funktsiooni <function
>names</function
>, mis tagastab nimede nimekirja, mida see saab välja kutsuda.</para
></listitem>
<listitem
><para
>Kui pluginat saab seadistada juhtimismoodulis, peab see seadistamiseks pakkuma <literal
>ThemeEngineClass</literal
>-põhise klassi.</para
></listitem>
<listitem
><para
>Pluginaklassid peavad tühistama vähemalt ühe virtuaalsetest funktsioonidest <function
>slotSetText</function
>, <function
>slotSetPixmap</function
>, <function
>slotUpdateProgress</function
> ja <function
>slotUpdateSteps</function
>, et see oleks kasutatav.</para
></listitem>
<listitem
><para
>Konstruktor peab olema kujul <literal
>ThemeEngine( QWidget *parent, const char *name, const QStringList &amp;args )</literal
>, et seda saaks kasutada koos klassiga <classname
>KGenericFactory</classname
>.</para
></listitem>
</orderedlist>
<para
>Viimane nõue võib tunduda keerukana, kuid hiljem näeme, et üheainsa rea lisamisega lähtefailidesse võib seda enamasti ignoreerida.</para>
</sect1>
<sect1 id="headercode">
<title
>Päisefaili kood</title>
<para
>Piiranguid arvestades vaatame nüüd, milline näeb välja päisefail <filename
>theme2k.h</filename
>:</para>
<example>
<title
><filename
>theme2k.h</filename
> listing</title>
<programlisting
>#ifndef __THEME2K_H__
#define __THEME2K_H__

#include &lt;qlabel.h&gt;
#include &lt;qwidget.h&gt;

#include &lt;kdialogbase.h&gt;
#include &lt;kpixmap.h&gt;
#include &lt;ksplash/themeengine.h&gt;

class RotWidget;

class Cfg2k: public ThemeEngineConfig
{
  Q_OBJECT
public:
  Cfg2k( KConfig * );
};

class ObjKsTheme;
class Theme2k: public ThemeEngine
{
  Q_OBJECT
public:
  Theme2k( QWidget *, const char *, const QStringList&amp; );

  inline const QString name()
  {
    return( QString("KSplash2k") );
  }
  inline const KDialogBase *config( KConfig *kc )
  {
    return new Cfg2k( kc );
  }
  static QStringList names()
  {
    QStringList Names;
    Names &lt;&lt; "KSplash2k";
    Names &lt;&lt; "ks2k";
    Names &lt;&lt; "2k";
    Names &lt;&lt; "2000";
    return( Names );
  };

public slots:
  inline void slotSetText( const QString&amp; s )
  {
    if( mText &amp;&amp; mText-&gt;text() != s ) mText-&gt;setText( s );
  };

private:
  void initUi();
  void readSettings();

  QLabel *mText;
  RotWidget *mRotator;
  QColor mTBgColor, mTFgColor, mRotColor1, mRotColor2, mStatusColor;
  int mRotSpeed;
  QString mWndTitle, mLogoFile;
};

#endif
</programlisting>
</example>
<para
>Analüüsime nüüd seda listingut. Klass <classname
>Theme2k</classname
> rahuldab nimekonventsiooni ja tema päritolu on <classname
>ThemeEngine</classname
>. Ta pakub <methodname
>Theme2k::names()</methodname
> ja tal on konstruktor, mis võtab soovitavad parameetrid <function
>Theme2k( QWidget *, const char *, const QStringList&amp; );</function
> ning pakub ka lihtsa meetodi <methodname
>Theme2k::slotSetText()</methodname
>. Hetkel ei ole mõtet pead vaevata klassiga <classname
>RotWidget</classname
>. See on väike element, mis pakub kasutajale veidi silmailu. Meie plugin on äärmiselt lihtne ega näita mingeid ikoone või edenemisriba. Kui soovid ikoone näidata, tühista funktsioon <function
>slotSetPixmap</function
>. Sarnased funktsioonid on olemas edenemisriba vahemikule (<function
>slotUpdateSteps</function
>) ja käesoleva sammu kasvamisele (<function
>slotUpdateProgress</function
>). </para>
</sect1>
<sect1 id="Implementation">
<title
>Plugina teostus</title>
<para
>Uurime ainult meile kordaminevaid teostuse osi. Kogu teostuse listingut võib näha lisas. Kõigepealt tuleb välja saada teeginõue:</para>
<example>
<title
>Teeginõue</title>
<programlisting
>K_EXPORT_COMPONENT_FACTORY( libksplash2k, KGenericFactory&lt;Theme2k&gt; );
</programlisting>
</example>
<para
>Makro <constant
>K_EXPORT_COMPONENT_FACTORY</constant
> on deklareeritud failis <filename
>kgenericfactory.h</filename
>. Edasi konstruktori kallale. Kuna see on väga lihtne plugin, on ka konstruktor lihtne ja selge.</para>
<example>
<title
>Plugina konstruktor</title>
<programlisting
>Theme2k::Theme2k( QWidget *parent, const char *name, const QStringList &amp;args  )
    :ThemeEngine( parent, name, args )
{
  readSettings();
  initUi();
}
</programlisting>
</example>
<para
>Meetod <function
>readSettings()</function
> illustreerib korrektset teemaseadistuste hankimise viisi. Sa ju soovid, et inimesed kasutaks sinu pluginaid oma teemades, või kuidas?</para>
<example>
<title
>Teemaseadistuste hankimine</title>
<programlisting
>void Theme2k::readSettings()
{
  if( !mTheme )
    return;

  KConfig *cfg = mTheme-&gt;themeConfig();
  if( !cfg )
    return;

  cfg-&gt;setGroup( QString("KSplash Theme: %1").arg(mTheme-&gt;theme()) );

  QColor DefaultTBgColor( Qt::darkBlue );
  QColor DefaultTFgColor( Qt::white );

  mTBgColor = cfg-&gt;readColorEntry( "Title Background Color", &amp;DefaultTBgColor );
  mTFgColor = cfg-&gt;readColorEntry( "Title Foreground Color", &amp;DefaultTFgColor );
  mStatusColor = cfg-&gt;readColorEntry("Status Text Color", &amp;mTBgColor );

  QColor DefaultRot1( Qt::darkBlue );
  QColor DefaultRot2( Qt::cyan );
  mRotColor1 = cfg-&gt;readColorEntry( "Rotator Color 1", &amp;DefaultRot1 );
  mRotColor2 = cfg-&gt;readColorEntry( "Rotator Color 2", &amp;DefaultRot2 );

  mRotSpeed = cfg-&gt;readNumEntry( "Rotator Speed", 30 );
  mWndTitle = cfg-&gt;readEntry( "Window Title", i18n("Please wait...") );
  mLogoFile = cfg-&gt;readEntry( "Logo File", QString::null );
}
</programlisting>
</example>
<para
>Kuna meile meeldivad meie kasutajad, pakume neile parameetritena mõistlikke vaikeväärtusi, mida teemafailis ei leidu. Pane tähele, et alati tuleb grupiks määrata "KSplash Theme: themename", et ühilduda tulevase teema spetsifikatsiooniga. Meetod <function
>initUI()</function
> meid praegu eriti ei huvita, sest see ainult loob elemente. Selle kohta vaata lähemalt lisast. </para>
</sect1>
<sect1 id="compilingfile">
<title
>Plugina kompileerimine</title>
<para
>Kuna me otsustasime kasutada plugina kompileerimiseks &kde; raamistikku, tuleb meil luua <filename
>Makefile.am</filename
>. See peaks välja nägema nii:</para>
<example>
<title
><filename
>Makefile.am</filename
> listing</title>
<programlisting
>INCLUDES = $(all_includes)

kde_module_LTLIBRARIES = libksplash2k.la

libksplash2k_la_SOURCES = theme2k.cpp rotwidget.cpp
libksplash2k_la_LDFLAGS = $(all_libraries) $(KDE_RPATH)
libksplash2k_la_LIBADD = $(LIB_KDEUI) -lksplashthemes

METASOURCES = AUTO

noinst_HEADERS        = theme2k.h rotwidget.h

servicesdir = $(kde_servicesdir)
services_DATA = ksplash2k.desktop

themedir = $(kde_datadir)/ksplash/Themes/2k
theme_DATA = Theme.rc Preview.png
</programlisting>
</example>
<para
>Rohkem infot <filename
>Makefile.am</filename
> kirjutamise kohta &kde; tarbeks leiab &kde; arendajate <ulink url="http://developer.kde.org/documentation/other/makefile_am_howto.html"
>veebileheküljelt</ulink
>. Ainus asi, mida tasub märkida, on see, et me pakume sellele pluginale põhineva vaiketeema ning sellele ka eelvaatluse. Kasutajate huve silmas pidades tuleks pakkuda näidisfail <filename
>Theme.rc</filename
>, mis illustreerib erinevate valikut kasutamist.</para>
</sect1>
</chapter>

<chapter id="faq">
<title
>Küsimused ja vastused</title>
&reporting.bugs; &updating.documentation; <qandaset id="faqlist">
<qandaentry>
<question>
<para
>Ma ei leia ühtegi teemat, mis &ksplash;is töötaks? Miks?</para>
</question>
<answer>
<para
>Tõenäoliselt ei ole sul teemale korrektseid pluginaid. Pluginad asuvad paketis <literal
>kde-artwork</literal
>. Laadi see alla, paigalda ja proovi uuesti.</para>
</answer>
</qandaentry>
<qandaentry>
<question>
<para
>Mis fail on <filename
>Theme.rc</filename
> ja kuidas seda luua?</para>
</question>
<answer>
<para
><filename
>Theme.rc</filename
> on fail, kus saab määrata teema seadistused. Täpsemat infot vaata osast <link linkend="themes"
>Kuidas luua teemasid &ksplash;ile</link
>. </para>
</answer>
</qandaentry>
</qandaset>
</chapter>

<chapter id="credits">
<title
>Autorid ja litsents</title>

<para
>&ksplash;</para>

<para
>Rakenduse autoriõigus &copy; 2003: &Ravikiran.Rajagopal; &Ravikiran.Rajagopal.mail;</para>

<itemizedlist>
<title
>Kaasautorid</title>
<listitem
><para
>&Brian.C.Ledbetter; &Brian.C.Ledbetter.mail;</para>
</listitem>
</itemizedlist>

<para
>Dokumentatsiooni autoriõigus &copy; 2003: &Teemu.Rytilahti; &Teemu.Rytilahti.mail;</para>
&underFDL; &underGPL; </chapter>

<appendix id="installation">
<title
>Paigaldamine</title>

<sect1 id="requirements">
<title
>Nõuded</title>

<para
>&ksplash;i edukaks kasutamiseks on vajalik &kde; 3.2 või uuem. Mõned teemad võivad nõuda spetsiifilisi pluginaid. Kui teema ei hakka tööle, võta ühendust teema autoriga ja selgita välja, kuidas ja kust hankida vajalik plugin.</para>

</sect1>

<sect1 id="compilation">
<title
>Kompileerimine ja paigaldamine</title>
&install.compile.documentation; </sect1>
</appendix>
<appendix id="srccode">
<title
>Lähtekood</title>
<sect1 id="theme2kcpp">
<title
><filename
>theme2k.cpp</filename
> listing</title>
<programlisting
>#include &lt;qlabel.h&gt;
#include &lt;qwidget.h&gt;

#include &lt;kapplication.h&gt;
#include &lt;kconfig.h&gt;
#include &lt;kdebug.h&gt;
#include &lt;kdialogbase.h&gt;
#include &lt;kgenericfactory.h&gt;
#include &lt;kglobalsettings.h&gt;
#include &lt;klocale.h&gt;
#include &lt;ksplash/objkstheme.h&gt;
#include &lt;kstandarddirs.h&gt;

#include "rotwidget.h"
#include "theme2k.h"
#include "theme2k.moc"

K_EXPORT_COMPONENT_FACTORY( libksplash2k, KGenericFactory&lt;Theme2k&gt; );

Cfg2k::Cfg2k( KConfig * )
{}

Theme2k::Theme2k( QWidget *parent, const char *name, const QStringList &amp;args  )
    :ThemeEngine( parent, name, args )
{
  readSettings();
  initUi();
}

void Theme2k::initUi()
{
  QVBox *vbox = new QVBox( this );
  vbox-&gt;setFrameShape( QFrame::WinPanel );
  vbox-&gt;setFrameShadow( QFrame::Raised );

  QHBox *labelBox = new QHBox( vbox );
  labelBox-&gt;setPalette( mTBgColor );
  labelBox-&gt;setMargin( 1 );
  QLabel *lbl = new QLabel( mWndTitle, labelBox );
  lbl-&gt;setFont( QFont( "Arial", 12, QFont::Bold ) );
  lbl-&gt;setPaletteForegroundColor( mTFgColor );

  QLabel *logo = new QLabel( vbox );
  logo-&gt;setPalette( Qt::white );

  QString px( locate( "appdata", mTheme-&gt;themeDir() + (mLogoFile.isNull()?QString("/Logo.png"):mLogoFile) ) );
  if (px.isNull())
    px = locate("appdata","Themes/Default/splash_top.png");
  if( !px.isNull() )
  {
    QPixmap pix( px );
    logo-&gt;setPixmap( pix );
  }
  else
  {
    logo-&gt;setText( "&lt;B&gt;KDE&lt;/B&gt;2000" );
    logo-&gt;setAlignment( AlignCenter|AlignVCenter );
  }

  mRotator = new RotWidget( vbox, mRotColor1, mRotColor2, mRotSpeed );

  QHBox *hbox = new QHBox( vbox );
  labelBox-&gt;setSpacing( 4 );
  labelBox-&gt;setMargin( 4 );

  mText = new QLabel( hbox );
  mText-&gt;setPaletteForegroundColor( mStatusColor );
  mText-&gt;setPaletteBackgroundColor( mTFgColor );
  mText-&gt;setText( mWndTitle );
  mText-&gt;setFixedHeight( 48 );

  setFixedSize( vbox-&gt;sizeHint() );
  QRect rect(KGlobalSettings::splashScreenDesktopGeometry());
  move( rect.x() + (rect.width() - size().width())/2,
        rect.y() + (rect.height() - size().height())/2 );
}

void Theme2k::readSettings()
{
  if( !mTheme )
    return;

  KConfig *cfg = mTheme-&gt;themeConfig();
  if( !cfg )
    return;

  cfg-&gt;setGroup( QString("KSplash Theme: %1").arg(mTheme-&gt;theme()) );

  QColor DefaultTBgColor( Qt::darkBlue );
  QColor DefaultTFgColor( Qt::white );

  mTBgColor = cfg-&gt;readColorEntry( "Title Background Color", &amp;DefaultTBgColor );
  mTFgColor = cfg-&gt;readColorEntry( "Title Foreground Color", &amp;DefaultTFgColor );
  mStatusColor = cfg-&gt;readColorEntry("Status Text Color", &amp;mTBgColor );

  QColor DefaultRot1( Qt::darkBlue );
  QColor DefaultRot2( Qt::cyan );
  mRotColor1 = cfg-&gt;readColorEntry( "Rotator Color 1", &amp;DefaultRot1 );
  mRotColor2 = cfg-&gt;readColorEntry( "Rotator Color 2", &amp;DefaultRot2 );

  mRotSpeed = cfg-&gt;readNumEntry( "Rotator Speed", 30 );
  mWndTitle = cfg-&gt;readEntry( "Window Title", i18n("Please wait...") );
  mLogoFile = cfg-&gt;readEntry( "Logo File", QString::null );
}
</programlisting>
</sect1>
<sect1 id="rotwidgeth">
<title
><filename
>rotwidget.h</filename
> listing</title>
<programlisting
>#ifndef         __ROTWIDGET_H__
#define         __ROTWIDGET_H__

#include &lt;qlabel.h&gt;
#include &lt;qtimer.h&gt;
#include &lt;qwidget.h&gt;

#include &lt;kdialogbase.h&gt;
#include &lt;kpixmap.h&gt;

/**
 * @short Display a rotating-gradient widget.
 */
class         RotWidget: public QWidget
{
  Q_OBJECT
public:
  RotWidget( QWidget *, const QColor&amp;, const QColor&amp;, int );
  ~RotWidget();

private slots:
  void stepEvent();

protected:
  void        preparePixmap( int );
  void        paintEvent( QPaintEvent * );
  void        resizeEvent( QResizeEvent * );

  QColor m_color1, m_color2;
  int m_step, m_speed;
  QTimer *m_stepTimer;

  QList&lt;KPixmap&gt; m_stepPixmap;
};

#endif
</programlisting>
</sect1>
<sect1 id="rotwidgetcpp">
<title
><filename
>rotwidget.cpp</filename
> listing</title>
<programlisting
>#include &lt;kdebug.h&gt;
#include &lt;kdialogbase.h&gt;
#include &lt;kpixmapeffect.h&gt;

#include &lt;qlabel.h&gt;
#include &lt;qpainter.h&gt;
#include &lt;qwidget.h&gt;

#include "rotwidget.h"
#include "rotwidget.moc"

RotWidget::RotWidget( QWidget *parent, const QColor&amp; c1, const QColor&amp; c2, int sp )
    :QWidget(parent), m_color1(c1), m_color2(c2), m_step(0), m_speed(sp)
{
  if( (m_speed &lt;= 0) || (m_speed &gt; 20) )
    m_speed = 1;
  setFixedHeight( 6 );

  for( int i = 0; i &lt;= width(); i++ )
    preparePixmap( i );

  m_stepTimer = new QTimer( this );
  connect(m_stepTimer, SIGNAL(timeout()), this, SLOT(stepEvent()));
  m_stepTimer-&gt;start( 50 );
}

RotWidget::~RotWidget()
{
}

void RotWidget::stepEvent()
{
  // This is inefficient as we create too many pixmaps, optimize later.
  m_step += m_speed;
  if( m_step &gt; width() )
    m_step = 0;
  repaint( true );
}

// Todo: Optimize drawing.
void RotWidget::paintEvent( QPaintEvent *pe )
{
  QPainter p;
  p.begin( this );

  QRect r = pe-&gt;rect();

  if( m_stepPixmap.at( m_step ) )
    bitBlt( this, r.x(), r.y(), m_stepPixmap.at( m_step ), r.x(), r.y(), r.width(), r.height() );
  else
    p.fillRect( rect(), Qt::black );
  p.end();
}

void RotWidget::resizeEvent( QResizeEvent *re )
{
  m_stepPixmap.clear();
  for( int i = 0; i &lt;= re-&gt;size().width(); i++ )
    preparePixmap( i );
}

void RotWidget::preparePixmap( int step )
{
  if( step &lt; 0 )
    return;

  // Explicitly draw our first pixmap. The rest we will bitBlt() from here.
  if( step == 0 )
  {
    KPixmap tmp; tmp.resize( size().width() / 2, size().height() );
    KPixmap tmp2(tmp);
    KPixmapEffect::gradient( tmp, m_color1, m_color2, KPixmapEffect::HorizontalGradient );
    KPixmapEffect::gradient( tmp2, m_color2, m_color1, KPixmapEffect::HorizontalGradient );
    KPixmap *px = new KPixmap( size() );
    QPainter p;
    p.begin( px );
    p.drawPixmap( 0, 0, tmp );
    p.drawPixmap( size().width()/2, 0, tmp2 );
    p.end();
    m_stepPixmap.append( px );
  }
  else if( m_stepPixmap.at( step-1 ) )
  {
    QPixmap *prev = m_stepPixmap.at( step-1 );
    QPixmap next; next.resize( size() );
    // convert
    // prev = "[------------]"
    // to
    // next = "------------]["
    bitBlt( &amp;next, 0, 0, prev, 1, 0, prev-&gt;width()-1, prev-&gt;height() );
    bitBlt( &amp;next, width()-1, 0, prev, 0, 0, 1, prev-&gt;height() );
    KPixmap *n = new KPixmap( next );
    m_stepPixmap.append( n );
  }
}
</programlisting>
</sect1>
</appendix>

&documentation.index;
</book>

<!--
Local Variables:
mode: xml
sgml-minimize-attributes:nil
sgml-general-insert-case:lower
sgml-indent-step:0
sgml-indent-data:nil
End:

vim:tabstop=2:shiftwidth=2:expandtab
-->
