1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
|
<?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 "tdebase">
<!ENTITY % addindex "IGNORE">
<!ENTITY % German "INCLUDE">
]>
<book lang="&language;">
<bookinfo>
<title>Das Handbuch zu &ksplash;</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>Stephan</firstname><surname>Johach</surname><affiliation><address><email>[email protected]</email></address></affiliation><contrib>Übersetzung</contrib></othercredit><othercredit role="translator"><firstname>Thomas</firstname><surname>Reitelbach</surname><affiliation><address><email>[email protected]</email></address></affiliation><contrib>Übersetzung</contrib></othercredit>
</authorgroup>
<copyright>
<year>2003</year>
<holder>Teemu Rytilahti</holder>
</copyright>
<copyright>
<year>2003-04</year>
<holder>Ravikiran Rajagopal</holder>
</copyright>
<legalnotice>&FDLNotice;</legalnotice>
<date>2003-01-10</date>
<releaseinfo>1.01.00</releaseinfo>
<abstract>
<para>&ksplash; ist ein Begrüßungsbildschirm, der den Fortschritt beim Start einer Anwendung anzeigt.</para>
</abstract>
<keywordset>
<keyword>KDE</keyword>
<keyword>tdebase</keyword>
<keyword>ksplash</keyword>
<keyword>ksplashml</keyword>
<keyword>splashscreen</keyword>
<keyword>eye candy</keyword>
</keywordset>
</bookinfo>
<chapter id="introduction">
<title>Einleitung</title>
<para>&ksplash; ist ein netter Begrüßungsbildschirm, der während dem Startvorgang eines Programms angezeigt wird. Falls Sie Fehler finden oder neue Funktionen benötigen, melden Sie diese bitte an die &kde;-Mailinglisten. &ksplash; enthält die folgenden Funktionen: </para>
<simplelist>
<member>Verschiedene Designs</member>
<member>Kann mittels Modulen erweitert und angepasst werden</member>
<member>Kann von jedem DCOP-fähigen Programm genutzt werden</member>
</simplelist>
<para>Dieses Handbuch zeigt Ihnen, wie Sie ein Design entwerfen können und es mit den derzeit verfügbaren Modulen verwenden. Falls keines der Module Ihren Ansprüchen genügt, können Sie auch lernen, wie &ksplash; angepasst wird. Dazu schreiben Sie ein kleines Programm in C++. </para>
</chapter>
<chapter id="using-themes">
<title>Designs verwenden</title>
<para>Um fertige Designs von <ulink url="http://www.kde-look.org">KDE-Look</ulink> zu verwenden, entpacken Sie diese bitte nach <filename>~/.trinity/share/apps/ksplash/Themes/</filename> oder für die systemweite Verwendung nach <filename>$<envar>TDEDIR</envar>/share/apps/ksplash/Themes/</filename>.</para>
<para>Diesen Schritt können Sie natürlich auch einfach über das Kontrollzentrum-Modul <guilabel>Startbildschirm</guilabel> unter <guilabel>Erscheindungsbild</guilabel> erledigen.</para>
<sect1 id="using-kcontrol-module">
<title>Verwendung des &kcontrol;-Moduls</title>
<para>Mit dem &kcontrol;-Modul können Sie &ksplash;-Designs installieren, testen und auch wieder entfernen.</para>
<para>An der linken Seite des Moduls sehen Sie eine Liste der verfügbaren &ksplash;-Designs. Wenn Sie eines auswählen, wird auf der rechten Seite ein Vorschaubild angezeigt. Wenn Sie sich ein Design ausgesucht haben, das Sie gerne benutzen möchten, dann drücken Sie <guibutton>Ok</guibutton> oder <guibutton>Anwenden</guibutton>. Wenn Sie <guibutton>Abbrechen</guibutton> drücken, wird das Modul geschlossen ohne irgendwelche Änderungen vorzunehmen. Zuguterletzt bewirkt der Knopf <guibutton>Voreinstellungen</guibutton>, dass der voreingstellte Startbildschirm aktiviert wird.</para>
<para>Um ein neues Design zu installieren, drücken Sie bitte auf <guibutton>Hinzufügen ...</guibutton> und suchen Sie das heruntergeladene Design heraus. Sie müssen die Design-Datei nicht erst entpacken. Nur das reine Installieren eines Designs aktiviert es noch nicht. Wenn Sie das neu installierte Design auch benutzen möchten, dann wählen Sie es bitte in der linken Liste aus und drücken <guibutton>Ok</guibutton> oder <guibutton>Anwenden</guibutton>.</para>
<para>Zwar sehen Sie das Vorschaubild auf der rechten Seite, aber wahrscheinlich möchten Sie auch sehen, wie der Startbildschirm in Aktion aussieht. Sie können den Startbildschirm testen, indem Sie auf den Knopf <guibutton>Test</guibutton> drücken.</para>
<para>Natürlich können Sie nicht benutzte Designs auch wieder entfernen. Wählen Sie das entsprechende Design aus und drücken dann <guibutton>Entfernen</guibutton>. Unter Umständen hat allerdings Ihr Benutzerkonto keine ausreichenden Berechtigungen, um ein systemweites Design zu entfernen. Außerdem kann das Design "Standard" nicht entfernt werden.</para>
</sect1>
</chapter>
<chapter id="themes">
<title>Wie man Designs für &ksplash; erstellt</title>
<sect1 id="themes-general">
<title>Allgemeines</title>
<para>Es ist nicht schwer, ein Design für &ksplash; zu erstellen. Wenn Sie ein Design fertiggestellt haben, können Sie es auf <ulink url="http://www.kde-look.org">KDE-Look</ulink> hochladen und somit anderen zur Verfügung stellen.</para>
<sect2 id="theme-syntax">
<title>Einen Namen für das Design festlegen</title>
<para>Lassen Sie uns ein Design mit dem Namen <literal>MeinDesign</literal> erstellen. Damit &ksplash; Ihr Design finden kann, muss es in einem Ordner mit dem Namen <filename class="directory">MeinDesign</filename> unter <filename class="directory">~/.trinity/apps/ksplash/Themes/</filename> gespeichert werden. Der Ordner muss die Datei <filename>Theme.rc</filename> enthalten; sie enthält die Einstellungen für Ihre Design. Sie können viele Einstellungen festlegen, &zb; welche Erweiterung Ihr Design verwenden soll. Sie müssen natürlich nicht alle Einstellungen selbst machen, die Voreinstellungen funktionieren meist recht gut. Die grundlegende Syntax für Ihre Einstellungen lautet <literal>[option] = [wert]</literal>. Die Definitionen für die möglichen Optionen finden Sie in den folgenden Abschnitten.</para>
<example>
<title>Eine einfache <filename>Theme.rc</filename>-Datei</title>
<programlisting>[KSplash Theme: MeinDesign]
Name = MeinDesign
Description = Ein Design, das die Erweiterung XpLike benutzt
Version = 1.0
Author = Mein Name <[email protected]>
## Das Darstellungsmodul XpLike verwenden.
Engine = XpLike
Show Icon = false
Welcome Text = KDE wird gestartet
</programlisting>
</example>
<para>Nachdem Sie den Namen, die Beschreibung und den Autor des Designs festgelegt haben, sollten Sie als nächstes ein Darstellungsmodul wählen. Dann können Sie die verschiedenen Einstellungen für das Modul einrichten.</para>
<important>
<para>Stellen Sie bitte sicher, dass der Ordnername für das Design (<filename class="directory">~/.trinity/apps/ksplash/Themes/MeinDesign</filename>) und der Bezeichner des Designs (<literal>[KSplash Theme: MyCoolTheme]</literal>) in <filename>Theme.rc</filename> identisch sind. Ansonsten wird &ksplash; Ihr Design nicht anzeigen.</para>
</important>
</sect2>
<sect2 id="theme-files">
<title>Hintergrundbilder</title>
<para>Beim Start versucht &ksplash;, ein Hintergrundbild für die aktuelle Bildschirmauflösung zu finden (wenn das Darstellungsmodul eines verwendet). Das Hintergrundbild muss mit diesem Namensschema gespeichert werden: <filename>Background-<replaceable>BBBxHHH</replaceable>.png</filename>.</para>
<para>Sie könnten &zb; eine Datei mit dem Namen <filename>Background-1024x768.png</filename> verwenden. Wenn kein Hintergrundbild für Ihre Auflösung auffindbar ist, dann wird das Originalbild <filename>Background.png</filename> bzw. die in <filename>Theme.rc</filename> angegebene Datei in der Größe angepasst. Das Anpassen der Dateigröße nimmt natürlich ein paar Sekunden Zeit in Anspruch, daher sollten Sie zumindest Hintergrundbilder in den Auflösungen 1280x1024, 1024x768 und 800x600 zur Verfügung stellen.</para>
</sect2>
</sect1>
<sect1 id="theme-engines">
<title>Optionen für die Darstellungsmodule</title>
<sect2 id="default-themes">
<title>Standard-Design</title>
<table>
<title>Optionen für das Standard-Design</title>
<tgroup cols="3">
<tbody>
<row>
<entry>Name</entry>
<entry>Argument</entry>
<entry>Erklärung</entry>
</row>
<!-- Statusbar -->
<row>
<entry>Always Show Progress</entry>
<entry>[true/false]</entry>
<entry>Legt fest, ob der Fortschritt des Startvorgangs angezeigt werden soll. Voreinstellung ist true.</entry>
</row>
<row>
<entry>Label Foreground</entry>
<entry>[farbe]</entry>
<entry>Legt fest, welche Farbe für den Text in der Statusleiste benutzt werden soll. Voreinstellung ist #FFFFFF (weiß).</entry>
</row>
<!-- Misc. things -->
<row>
<entry>Icons Flashing</entry>
<entry>[true/false]</entry>
<entry>Legt fest, ob Symbole <quote>blinken</quote> sollen oder nicht. Voreinstellung ist true.</entry>
</row>
</tbody>
</tgroup>
</table>
</sect2>
<sect2 id="standard-themes">
<title>Standard-Design</title>
<table>
<title>Optionen für das Standard-Design</title>
<tgroup cols="3">
<tbody>
<row>
<entry>Name</entry>
<entry>Argument</entry>
<entry>Erklärung</entry>
</row>
<!-- Statusbar -->
<row>
<entry>Statusbar Position</entry>
<entry>[top/bottom]</entry>
<entry>Legt die Position der Statusleiste fest. Voreinstellung ist bottom.</entry>
</row>
<row>
<entry>Statusbar Visible</entry>
<entry>[true/false]</entry>
<entry>Legt fest, ob eine Statusleiste angezeigt werden soll. Voreinstellung ist true.</entry>
</row>
<row>
<entry>Progress Visible</entry>
<entry>[true/false]</entry>
<entry>Legt fest, ob der Fortschritt des Startvorgangs angezeigt werden soll. Voreinstellung ist true.</entry>
</row>
<!-- Fonts -->
<row>
<entry>Statusbar Font</entry>
<entry>[schriftname]</entry>
<entry>Die in der Statusleiste benutzte Schriftart. Voreinstellung ist Helvetica.</entry>
</row>
<row>
<entry>Statusbar Font Size</entry>
<entry>[größe]</entry>
<entry>Die Schriftgröße in der Statusleiste. Voreinstellung ist 16.</entry>
</row>
<row>
<entry>Statusbar Font Bold</entry>
<entry>[true/false]</entry>
<entry>Legt fest, ob die Schrift in der Statusleiste fett sein soll. Voreinstellung ist true.</entry>
</row>
<row>
<entry>Statusbar Font Italic</entry>
<entry>[true/false]</entry>
<entry>Legt fest, ob die Schrift in der Statusleiste kursiv sein soll. Voreinstellung ist false.</entry>
</row>
<!-- Misc. things -->
<row>
<entry>Statusbar Foreground</entry>
<entry>[farbe]</entry>
<entry>Die Vordergrundfarbe der Statusleiste. Voreinstellung ist weiß.</entry>
</row>
<row>
<entry>Statusbar Background</entry>
<entry>[farbe]</entry>
<entry>Die Hintergrundfarbe der Statusleiste. Voreinstellung ist schwarz.</entry>
</row>
<row>
<entry>Statusbar Icon</entry>
<entry>[true/false]</entry>
<entry>Legt fest, ob die Statusleiste ein Symbol anzeigen soll.</entry>
</row>
<row>
<entry>Icons Visible</entry>
<entry>[true/false]</entry>
<entry>Legt fest, ob Symbole angezeigt werden sollen. Voreinstellung ist true.</entry>
</row>
<row>
<entry>Icons Jumping</entry>
<entry>[true/false]</entry>
<entry>Legt fest, ob die Symbole hüpfen sollen. Voreinstellung ist true.</entry>
</row>
<row>
<entry>Icon Position</entry>
<entry>[0-3,10-13]</entry>
<entry>Die Position, an der die Symbole angezeigt werden. Voreinstellung ist unten-links.</entry>
</row>
<row>
<entry>Splash Screen</entry>
<entry>[name]</entry>
<entry>Legt das angezeigte Startbild fest.</entry>
</row>
</tbody>
</tgroup>
</table>
</sect2>
<sect2 id="redmond-themes">
<title>Redmond-Design</title>
<table>
<title>Optionen für das Redmond-Design</title>
<tgroup cols="3">
<tbody>
<row>
<entry>Name</entry>
<entry>Argument</entry>
<entry>Erklärung</entry>
</row>
<!-- Main elements -->
<row>
<entry>Background Image</entry>
<entry>[dateiname]</entry>
<entry>Legt das zu verwendende benutzerdefiniertes Hintergrundbild fest.</entry>
</row>
<row>
<entry>User Icon</entry>
<entry>[symbolname]</entry>
<entry>Legt den Namen des Standard-Symbols für Benutzer fest. Voreinstellung ist <constant>go</constant>.</entry>
</row>
<row>
<entry>Welcome Text</entry>
<entry>[text]</entry>
<entry>Der im Startbildschirm angezeigte Willkommenstext. Voreinstellung ist "Willkommen".</entry>
</row>
<row>
<entry>Username Text</entry>
<entry>[text]</entry>
<entry>Dieser Text wird anstelle des Benutzernamens angezeigt.</entry>
</row>
<!-- Positioning elements -->
<row>
<entry>Welcome Text Position</entry>
<entry>[x,y]</entry>
<entry>Die Bildschirmposition, an der der Willkommenstext angezeigt wird.</entry>
</row>
<row>
<entry>Username Text Position</entry>
<entry>[x,y]</entry>
<entry>Die Bildschirmposition, an der der Benutzername angezeigt wird.</entry>
</row>
<row>
<entry>Action Text Position</entry>
<entry>[x,y]</entry>
<entry>Die Bildschirmposition des Textes, der die derzeit laufende Aktivität anzeigt.</entry>
</row>
<row>
<entry>Icon Position</entry>
<entry>[x,y]</entry>
<entry>Die Bildschirmposition, an der das Benutzersymbol angezeigt wird.</entry>
</row>
<!-- Show to show.. -->
<row>
<entry>Show Welcome Text</entry>
<entry>[true/false]</entry>
<entry>Legt fest, ob der Willkommenstext angezeigt wird oder nicht. Voreinstellung ist true.</entry>
</row>
<row>
<entry>Show Welcome Shadow</entry>
<entry>[true/false]</entry>
<entry>Legt fest, ob der Willkommenstext einen Schatten werfen soll. Voreinstellung ist true.</entry>
</row>
<row>
<entry>Show Username</entry>
<entry>[true/false]</entry>
<entry>Legt fest, ob der Benutzername angezeigt werden soll. Voreinstellung ist true.</entry>
</row>
<row>
<entry>Show Action</entry>
<entry>[true/false]</entry>
<entry>Legt fest, ob die derzeit laufende Aktivität angezeigt werden soll. Voreinstellung ist true.</entry>
</row>
<row>
<entry>Show Icon</entry>
<entry>[true/false]</entry>
<entry>Legt fest, ob das Symbol angezeigt werden soll. Voreinstellung ist true.</entry>
</row>
<row>
<entry>Use TDM User Icon</entry>
<entry>[true/false]</entry>
<entry>Legt fest, ob das Anmeldebild von TDM benutzt werden soll. Voreinstellung ist true.</entry>
</row>
</tbody>
</tgroup>
</table>
</sect2>
<sect2 id="macx-themes">
<title>MacX-Design</title>
<table>
<title>Optionen für das MacX-Design</title>
<tgroup cols="3">
<tbody>
<row>
<entry>Name</entry>
<entry>Argument</entry>
<entry>Erklärung</entry>
</row>
<row>
<entry>Icon Size Minimum</entry>
<entry>[größe]</entry>
<entry>Legt die Minimalgröße für Symbole fest. Voreinstellung ist 16 Pixel.</entry>
</row>
<row>
<entry>Icon Size Maximum</entry>
<entry>[größe]</entry>
<entry>Legt die Maximalgröße für Symbole fest. Voreinstellung ist 64 Pixel.</entry>
</row>
<row>
<entry>Optimized Icon Rendering</entry>
<entry>[true/false]</entry>
<entry>Legt fest, ob die Darstellung von Symbolen optimiert werden soll. Voreinstellung ist true.</entry>
</row>
<row>
<entry>Progress Bar Visible</entry>
<entry>[true/false]</entry>
<entry>Voreinstellung ist true.</entry>
</row>
<row>
<entry>Progress Bar Position</entry>
<entry>[top/bottom]</entry>
<entry>Legt fest, ob die Fortschrittsanzeige oben oder unten angezeigt werden soll. Voreinstellung ist unten.</entry>
</row>
<row>
<entry>Icons Jumping</entry>
<entry>[true/false]</entry>
<entry>Legt fest, ob die Symbole hüpfen sollen. Voreinstellung ist nein.</entry>
</row>
</tbody>
</tgroup>
</table>
</sect2>
<sect2 id="mac-classic-themes">
<title>MacClassic-Design</title>
<table>
<title>Optionen für das MacClassic-Design</title>
<tgroup cols="3">
<tbody>
<row>
<entry>Name</entry>
<entry>Argument</entry>
<entry>Erklärung</entry>
</row>
<row>
<entry>Icon Position</entry>
<entry>[0-3,10-13]</entry>
<entry>Die Bildschirmposition der Symbole. Voreinstellung ist links-unten.</entry>
</row>
<row>
<entry>Icons Jumping</entry>
<entry>[true/false]</entry>
<entry>Legt fest, ob die Symbole hüpfen sollen. Voreinstellung ist nein.</entry>
</row>
<row>
<entry>Icons Visible</entry>
<entry>[true/false]</entry>
<entry>Legt fest, ob Symbole angezeigt werden sollen. Voreinstellung ist true.</entry>
</row>
<row>
<entry>Splash Screen</entry>
<entry>[name]</entry>
<entry>Legt das angezeigte Startbild fest.</entry>
</row>
</tbody>
</tgroup>
</table>
</sect2>
<sect2 id="themes-2k">
<title>2k-Design</title>
<table>
<title>Optionen für das 2k-Design</title>
<tgroup cols="3">
<tbody>
<row>
<entry>Name</entry>
<entry>Argument</entry>
<entry>Erklärung</entry>
</row>
<row>
<entry>Title Background Color</entry>
<entry>[farbe]</entry>
<entry>Die Hintergrundfarbe für den Titel. Voreinstellung ist dunkelblau.</entry>
</row>
<row>
<entry>Title Foreground Color</entry>
<entry>[farbe]</entry>
<entry>Die Vordergrundfarbe für den Titel. Voreinstellung ist weiß.</entry>
</row>
<row>
<entry>Status Text Color</entry>
<entry>[farbe]</entry>
<entry>Die Farbe des Status-Textes. Die Voreinstellung ist dasselbe wie die Titel-Hintergrundfarbe.</entry>
</row>
<row>
<entry>Rotator Color 1</entry>
<entry>[farbe]</entry>
<entry>Legt die Farbe für Rotator 1 fest. Voreinstellung ist dunkelblau.</entry>
</row>
<row>
<entry>Rotator Color 2</entry>
<entry>[farbe]</entry>
<entry>Legt die Farbe für Rotator 2 fest. Voreinstellung ist cyan.</entry>
</row>
<row>
<entry>Rotator Speed</entry>
<entry>[wert]</entry>
<entry>Legt die Geschwindigkeit des Rotators fest. Voreinstellung ist 30.</entry>
</row>
<row>
<entry>Window Title</entry>
<entry>[text]</entry>
<entry>Legt den Text des Fenstertitels fest.</entry>
</row>
<row>
<entry>Logo File</entry>
<entry>[dateiname]</entry>
<entry>Legt das benutzte Logo fest.</entry>
</row>
</tbody>
</tgroup>
</table>
</sect2>
</sect1>
</chapter>
<chapter id="from-other-applications">
<title>&ksplash; in eigenen Programmen</title>
<para>In diesem Kapitel wird beschrieben, wie Sie &ksplash; als Startbild für Ihr &kde;-Programm benutzen können. Wenn Sie keine Programme für &kde; entwickeln, können Sie diesen Abschnitt überspringen.</para>
<sect1 id="basic-other-reqs">
<title>Grundvoraussetzungen</title>
<para>Ihr Programm muss mit &DCOP; umgehen können. &DCOP; ist die &kde;-Technologie, die Programme zur Kommunikation untereinander verwenden. Wenn Sie das übliche <ulink url="http://developer.kde.org">&kde; Entwickler-Grundgerüst</ulink> verwenden, brauchen Sie sich darum nicht weiter kümmern. Informationen über &DCOP; und verwandte &kde;-Technologien finden Sie in der <ulink url="http://developer.kde.org">&kde; Entwicklerecke</ulink>.</para>
</sect1>
<sect1 id="other-using">
<title>Der Aufruf von &ksplash;</title>
<para>Bevor Ihr Programm seine eigentliche Arbeit beginnt oder bevor &zb; Module und Erweiterungen geladen werden, starten Sie &ksplash;:</para>
<programlisting>DCOPClient *c = kapp->dcopClient();
QString error;
QCString KSplashName;
int pid = 0;
QStringList args;
args << "--theme=MeinDesign" << "--managed";
if (kapp->startServiceByDesktopName("ksplash", args, &error,
&KSplashName, &pid))
{
KMessageBox::sorry(0, error, "Unable to invoke KSplash");
// Some error processing here.
}
</programlisting>
<para>Wir gehen in diesem Fall davon aus, dass nur eine Instanz von &ksplash; gleichzeitig läuft. Andere Fälle sind etwas komplizierter. Lesen Sie dazu bitte die &DCOP;-Dokumentation.</para>
</sect1>
<sect1 id="show-messages">
<title>Anzeigen von Meldungen</title>
<para>Bevor Sie irgendwelche Meldungen anzeigen können, müssen Sie die Anzahl der anzuzeigenden Schritte festlegen. Der &kde;-Start &zb; benutzt sieben Schritte.</para>
<programlisting>QByteArray data;
QDataStream arg(data,IO_WriteOnly);
arg << eineZahl;
if (!(c->send(KSplashName, "KSplashIface", "setStartupItemCount(int)",
data))
// Some error processing here.
</programlisting>
<para>Immer wenn Sie eine Meldung mit oder ohne Symbol anzeigen möchten, verwenden Sie </para>
<programlisting>arg << QString("symbolName") << QString("programmName") <<
QString("Eine Beschreibung");
if (!(c->send(KSplashName, "KSplashIface",
"programStarted(QString,QString,QString)", data))
{
// Some error processing here.
}
</programlisting>
<para>Jedesmal wenn Sie <constant>programStarted</constant> aufrufen, wird ein Schritt als abgeschlossen markiert und inkrementiert. Wenn Ihr Programm mit dem Start fertig ist, können Sie den Startbildschirm auf diese Weise wieder ausblenden:</para>
<programlisting>if (!(c->send(KSplashName, "KSplashIface", "startupComplete()", data))
{
// Some error processing here.
}
</programlisting>
<para>Das ist alles! Mehr ist nicht nötig, um von &ksplash;s Möglichkeiten zu profitieren :)</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>Erstellen eines Moduls für &ksplash;</title>
<para>Es ist nicht schwer, ein Darstellungsmodul für &ksplash; zu schreiben. In diesem Abschnitt beschäftigen wir uns mit diesem Thema und schreiben ein Modul, das den Startbildschirm eines sehr bekannten Betriebssystems emuliert. In diesem Abschnitt wird vorausgesetzt, dass Sie mit den Grundlagen von C++ sowie KDE/Qt-Programmierung vertraut sind.</para>
<sect1 id="basic-requirements">
<title>Grundvoraussetzungen</title>
<para>Wir erzeugen ein Darstellungsmodul mit dem Namen <literal>2k</literal>. Der Modulname wird an vielen Stellen verwendet und es ist wichtig, dass Sie den Namen durchgängig korrekt verwenden, damit &ksplash; Ihr Modul finden und benutzen kann. &ksplash;s Darstellungsmodule sind dynamisch ladbare Bibliotheken und folgen dieser Namenskonvention: </para>
<simplelist>
<member>Die Bibliothek sollte den Namen <filename>ksplash+designname</filename> tragen. Verwenden Sie keine Großbuchstaben! In unserem Beispiel lautet der Name <filename>ksplash2k</filename>.</member>
<member>Außerdem benötigt Ihr Modul eine Desktop-Datei mit dem Namen <filename>ksplash+designname.desktop</filename>. Hier dürfen ebenfalls keine Großbuchstaben verwendet werden. In unserem Beispiel heißt die Datei <filename>ksplash2k.desktop</filename>. </member>
<member>Schlussendlich muss das von der Bibliothek zurückgegebene Objekt eine Klasse mit dem Namen <literal>Theme+designname</literal> sein. In unserem Beispiel als <literal>Theme2k</literal>.</member>
</simplelist>
<para>Ein weiterer wichtiger Punkt ist, dass Ihre Modulklasse von <literal>ThemeEngine</literal> abgeleitet sein muss. Falls Ihnen von den obigen Dingen noch etwas unklar sein sollte, brauchen Sie sich erstmal keine Gedanken zu machen. Wir werden später noch auf jeden Punkt im einzelnen eingehen. </para>
</sect1>
<sect1 id="skeleton">
<title>Erstellen des Grundgerüstes</title>
<para>Wir benutzen das &kde; application framework, welches sich um den Bau des Moduls und um Plattformunabhängigkeit kümmert, ohne das wir selber etwas dazu tun müssen. Dafür müssen Sie das Paket <filename>tdesdk</filename> installiert haben. Führen Sie den Befehl <literal>kapptemplate</literal> aus und erzeugen Sie ein Programm mit dem Namen "2k". Für Sie wird ein Basisordner erzeugt, der allgemeine Dateien wie &zb; AUTHORS etc. enthält. Unser Interesse gilt nun aber erstmal nur dem Unterordner <filename class="directory">2k</filename>. Wechseln Sie in diesen Ordner und löschen Sie dort alle Dateien. Nun haben wir das benötigte Grundgerüst. </para>
<para>Als nächsten Schritt erzeugen wir eine <filename>.desktop</filename>-Datei. Wenn diese installiert wird, weiß &ksplash;, dass Ihr Darstellungsmodul verfügbar ist. Nach den beschriebenen Namenskonventionen aus dem <link linkend="basic-requirements">vorigen Kapitel</link> erzeugen Sie nun eine Datei mit dem Namen <filename>ksplash2k.desktop</filename>. Sie sollte folgenden Inhalt haben: </para>
<programlisting><literal>
[Desktop Entry]
Encoding=UTF-8
Type=Service
Comment=KSplash Plugin
Name=KSplash2k
ServiceTypes=KSplash/Plugin
X-TDE-Library=ksplash2k
X-KSplash-Default=true
X-KSplash-PluginName=2k
X-KSplash-ObjectName=Theme2k
</literal>
</programlisting>
<para>Die Einträge <literal>Encoding</literal>, <literal>Type</literal>, <literal>Comment</literal> und <literal>ServiceTypes</literal> sind für alle Darstellungsmodule gleich. Der Modul- und Bibliotheksname folgen den vorher genannten Namenskonventionen. Der Eintrag <literal>X-KSplash-Default</literal> kann einen Wahrheitswert enthalten und legt fest, ob das Modul im Kontrollzentrum angezeigt wird. Normalerweise ist der Wert hier <constant>true</constant>; es gibt nur ganz wenige Ausnahmen. </para>
</sect1>
<sect1 id="headerfile">
<title>Deklaration der Modul-Klasse</title>
<para>Nun haben wir die Vorbereitungen abgeschlossen und können mit dem schönen Teil beginnen - dem Erzeugen einer Klasse die das gewünschte Verhalten festlegt. Die Klasse kann im Grunde alles tun, was wir möchten, mit ein paar wenigen Einschränkungen:</para>
<orderedlist>
<listitem><para>Modul-Klassen müssen von der Klasse <constant>ThemeEngine</constant> abgeleitet sein.</para></listitem>
<listitem><para>Modul-Klassen müssen die Namenskonvention <classname>Theme+DesignName</classname> einhalten. (Das "+" muss ausgelassen werden.)</para></listitem>
<listitem><para>Modul-Klassen müssen eine <literal>static</literal>-Funktion namens <function>names</function> enthalten, die eine Liste der Namen zurückgibt, mit denen sie aufgerufen werden kann.</para></listitem>
<listitem><para>Falls das Modul im Kontrollzentrum eingerichtet werden kann, muss es eine von <literal>ThemeEngineConfig</literal> abgeleitete Klasse zur Einrichtung enthalten.</para></listitem>
<listitem><para>Modul-Klassen müssen mindestens eine der virtuellen Funktionen <function>slotSetText</function>, <function>slotSetPixmap</function>, <function>slotUpdateProgress</function> und <function>slotUpdatSteps</function> überschreiben.</para></listitem>
<listitem><para>Der Konstruktor sollte die Form <literal>ThemeEngine( QWidget *parent, const char *name, const QStringList &args)</literal> haben, damit es mit <classname>KGenericFactory</classname> genutzt werden kann.</para></listitem>
</orderedlist>
<para>Die letzte Anforderung scheint kompliziert zu sein, aber Sie werden später feststellen, dass dies durch nur eine einzige Zeile im Quelltext erledigt werden kann.</para>
</sect1>
<sect1 id="headercode">
<title>Der Quelltext der Headerdatei</title>
<para>Nachdem wir nun diese Bedingungen kennen, lassen Sie uns schauen, wie die Headerdatei <filename>theme2k.h</filename> aussieht:</para>
<example>
<title>Quelltext für <filename>theme2k.h</filename></title>
<programlisting>#ifndef __THEME2K_H__
#define __THEME2K_H__
#include <qlabel.h>
#include <qwidget.h>
#include <kdialogbase.h>
#include <kpixmap.h>
#include <ksplash/themeengine.h>
class RotWidget;
class Cfg2k: public ThemeEngineConfig
{
Q_OBJECT
public:
Cfg2k( TDEConfig * );
};
class ObjKsTheme;
class Theme2k: public ThemeEngine
{
Q_OBJECT
public:
Theme2k( QWidget *, const char *, const QStringList& );
inline const QString name()
{
return( QString("KSplash2k") );
}
inline const KDialogBase *config( TDEConfig *kc )
{
return new Cfg2k( kc );
}
static QStringList names()
{
QStringList Names;
Names << "KSplash2k";
Names << "ks2k";
Names << "2k";
Names << "2000";
return( Names );
};
public slots:
inline void slotSetText( const QString& s )
{
if( mText && mText->text() != s ) mText->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>Nun gut, gehen wir die obige Auflistung durch: Die Klasse <classname>Theme2k</classname> ist von <classname>ThemeEngine</classname> abgeleitet und erfüllt die Namenskonvention. Sie enthält die Funktion <methodname>Theme2k::names()</methodname> und hat einen Konstruktor mit den benötigten Parametern: <function>Theme2k( QWidget *, const char *, const QStringList& );</function> und enthält eine einfache Methode <methodname>Theme2k::slotSetText()</methodname>. Kümmern Sie sich erstmal nicht um die Klasse <classname>RotWidget</classname>; sie erzeugt nur ein hübsches Bildschirmelement. Unser Modul ist sehr einfach gehalten und zeigt keine Symbole oder eine Fortschrittsanzeige an. Wenn Sie das möchten, überschreiben Sie die Funktion <function>slotSetPixmap</function>. Ähnliche Funktionen gibt es auch für die Schritte der Fortschrittsanzeige (<function>slotUpdateSteps</function>) und zum Inkrementieren (<function>slotUpdateProgress</function>) des aktuellen Schrittes. </para>
</sect1>
<sect1 id="Implementation">
<title>Die Implementierung des Moduls</title>
<para>Wir schauen uns nun die wichtigsten Teile der Implementation an. Eine Auflistung des gesamten Codes finden Sie im Anhang. Als erstes schauen wir uns die Voraussetzungen für die Bibliothek an:</para>
<example>
<title>Voraussetzung für die Bibliothek</title>
<programlisting>K_EXPORT_COMPONENT_FACTORY( ksplash2k, KGenericFactory<Theme2k> );
</programlisting>
</example>
<para>Das Makro <constant>K_EXPORT_COMPONENT_FACTORY</constant> ist in <filename>kgenericfactory.h</filename> deklariert. Gut, nun weiter zum Konstruktor! Weil es sich hier um ein sehr einfaches Modul handelt, ist der Konstruktor ebenso einfach.</para>
<example>
<title>Der Konstruktor des Moduls</title>
<programlisting>Theme2k::Theme2k( QWidget *parent, const char *name, const QStringList &args
)
:ThemeEngine( parent, name, args )
{
readSettings();
initUi();
}
</programlisting>
</example>
<para>Die Methode <function>readSettings()</function> zeigt, wie Sie die Design-Einstellungen einlesen. (Sie wollen ja schließlich, dass Ihr Modul auch von Designs verwendet wird, richtig?)</para>
<example>
<title>Das Einlesen der Design-Einstellungen</title>
<programlisting>void Theme2k::readSettings()
{
if( !mTheme )
return;
TDEConfig *cfg = mTheme->themeConfig();
if( !cfg )
return;
cfg->setGroup( QString("KSplash Theme: %1").arg(mTheme->theme()) );
QColor DefaultTBgColor( Qt::darkBlue );
QColor DefaultTFgColor( Qt::white );
mTBgColor = cfg->readColorEntry( "Title Background Color",
&DefaultTBgColor );
mTFgColor = cfg->readColorEntry( "Title Foreground Color",
&DefaultTFgColor );
mStatusColor = cfg->readColorEntry("Status Text Color", &mTBgColor );
QColor DefaultRot1( Qt::darkBlue );
QColor DefaultRot2( Qt::cyan );
mRotColor1 = cfg->readColorEntry( "Rotator Color 1", &DefaultRot1 );
mRotColor2 = cfg->readColorEntry( "Rotator Color 2", &DefaultRot2 );
mRotSpeed = cfg->readNumEntry( "Rotator Speed", 30 );
mWndTitle = cfg->readEntry( "Window Title", i18n("Please wait...") );
mLogoFile = cfg->readEntry( "Logo File", QString::null );
}
</programlisting>
</example>
<para>Weil wir unseren Benutzern wohlgesonnen sind, legen wir sinnvolle Voreinstellungen fest. Wir stellen unsere Gruppe immer auf "KSplash Theme: designname" ein, um mit zukünftigen Design-Spezifikationen kompatibel zu sein. Die Methode <function>initUI()</function> ist nicht sonderlich interessant, denn Sie erzeugt nur die Bildschirmelemente. Details finden Sie im Anhang. </para>
</sect1>
<sect1 id="compilingfile">
<title>Das Kompilieren des Moduls</title>
<para>Weil wir uns für das &kde; application framework entschieden haben, müssen wir die Datei <filename>Makefile.am</filename> erstellen. Sie sollte so aussehen:</para>
<example>
<title>Quelltext von <filename>Makefile.am</filename></title>
<programlisting>INCLUDES = $(all_includes)
kde_module_LTLIBRARIES = ksplash2k.la
ksplash2k_la_SOURCES = theme2k.cpp rotwidget.cpp
ksplash2k_la_LDFLAGS = $(all_libraries) $(KDE_RPATH)
ksplash2k_la_LIBADD = $(LIB_TDEUI) -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>Informationen, wie man <filename>Makefile.am</filename>-Dateien für &kde; schreibt, finden Sie auf der &kde; <ulink url="http://developer.kde.org/documentation/other/makefile_am_howto.html">Webseite</ulink>. Das einzig zu beachtende hier ist, dass wir ein Standard-Design bereitstellen, das unser Modul benutzt, sowie ein Vorschaubild dafür. Um den Benutzern einen Gefallen zu tun, sollten Sie eine Beispieldatei <filename>Theme.rc</filename> bereitstellen, die die verschiedenen Optionen aufzeigt.</para>
</sect1>
</chapter>
<chapter id="faq">
<title>Fragen und Antworten</title>
&reporting.bugs; &updating.documentation; <qandaset id="faqlist">
<qandaentry>
<question>
<para>Ich kann keine Designs finden, die mit &ksplash; funktionieren. Warum?</para>
</question>
<answer>
<para>Wahrscheinlich haben Sie nicht die korrekten Darstellungsmodule installiert. Die Module befinden sich im Paket <literal>tdeartwork</literal>. Laden Sie es herunter und installieren Sie es. Danach versuchen Sie es erneut.</para>
</answer>
</qandaentry>
<qandaentry>
<question>
<para>Was ist die Datei <filename>Theme.rc</filename> und wie kann ich eine erstellen?</para>
</question>
<answer>
<para><filename>Theme.rc</filename> ist die Datei, in der Sie die Einstellungen eines Designs festlegen. Weitere Informationen finden Sie im Kapitel <link linkend="themes">Erstellen von Designs für &ksplash;</link>. </para>
</answer>
</qandaentry>
</qandaset>
</chapter>
<chapter id="credits">
<title>Mitwirkende und Lizenz</title>
<para>&ksplash;</para>
<para>Copyright des Programms © 2003 &Ravikiran.Rajagopal; &Ravikiran.Rajagopal.mail;</para>
<itemizedlist>
<title>Beiträge</title>
<listitem><para>&Brian.C.Ledbetter; &Brian.C.Ledbetter.mail;</para>
</listitem>
</itemizedlist>
<para>Copyright der Dokumentation © 2003 &Teemu.Rytilahti; &Teemu.Rytilahti.mail;</para>
&underFDL; &underGPL; </chapter>
<appendix id="installation">
<title>Installation</title>
<sect1 id="requirements">
<title>Voraussetzungen</title>
<para>&ksplash; benötigt &kde; in der Version 3.2 oder höher. Einige Designs können spezielle Module benötigen. Funktioniert ein Design nicht, setzen Sie sich mit dem Autor des Designs in Verbindung, um herauszufinden wo Sie das benötigte Modul erhalten können.</para>
</sect1>
<sect1 id="compilation">
<title>Kompilierung und Installation</title>
&install.compile.documentation; </sect1>
</appendix>
<appendix id="srccode">
<title>Quelltext</title>
<sect1 id="theme2kcpp">
<title>Quelltext von <filename>theme2k.cpp</filename></title>
<programlisting>#include <qlabel.h>
#include <qwidget.h>
#include <tdeapplication.h>
#include <tdeconfig.h>
#include <kdebug.h>
#include <kdialogbase.h>
#include <kgenericfactory.h>
#include <tdeglobalsettings.h>
#include <tdelocale.h>
#include <ksplash/objkstheme.h>
#include <kstandarddirs.h>
#include "rotwidget.h"
#include "theme2k.h"
#include "theme2k.moc"
K_EXPORT_COMPONENT_FACTORY( ksplash2k, KGenericFactory<Theme2k> );
Cfg2k::Cfg2k( TDEConfig * )
{}
Theme2k::Theme2k( QWidget *parent, const char *name, const QStringList &args
)
:ThemeEngine( parent, name, args )
{
readSettings();
initUi();
}
void Theme2k::initUi()
{
QVBox *vbox = new QVBox( this );
vbox->setFrameShape( QFrame::WinPanel );
vbox->setFrameShadow( QFrame::Raised );
QHBox *labelBox = new QHBox( vbox );
labelBox->setPalette( mTBgColor );
labelBox->setMargin( 1 );
QLabel *lbl = new QLabel( mWndTitle, labelBox );
lbl->setFont( QFont( "Arial", 12, QFont::Bold ) );
lbl->setPaletteForegroundColor( mTFgColor );
QLabel *logo = new QLabel( vbox );
logo->setPalette( Qt::white );
QString px( locate( "appdata", mTheme->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->setPixmap( pix );
}
else
{
logo->setText( "<B>KDE</B>2000" );
logo->setAlignment( AlignCenter|AlignVCenter );
}
mRotator = new RotWidget( vbox, mRotColor1, mRotColor2, mRotSpeed );
QHBox *hbox = new QHBox( vbox );
labelBox->setSpacing( 4 );
labelBox->setMargin( 4 );
mText = new QLabel( hbox );
mText->setPaletteForegroundColor( mStatusColor );
mText->setPaletteBackgroundColor( mTFgColor );
mText->setText( mWndTitle );
mText->setFixedHeight( 48 );
setFixedSize( vbox->sizeHint() );
QRect rect(TDEGlobalSettings::splashScreenDesktopGeometry());
move( rect.x() + (rect.width() - size().width())/2,
rect.y() + (rect.height() - size().height())/2 );
}
void Theme2k::readSettings()
{
if( !mTheme )
return;
TDEConfig *cfg = mTheme->themeConfig();
if( !cfg )
return;
cfg->setGroup( QString("KSplash Theme: %1").arg(mTheme->theme()) );
QColor DefaultTBgColor( Qt::darkBlue );
QColor DefaultTFgColor( Qt::white );
mTBgColor = cfg->readColorEntry( "Title Background Color",
&DefaultTBgColor );
mTFgColor = cfg->readColorEntry( "Title Foreground Color",
&DefaultTFgColor );
mStatusColor = cfg->readColorEntry("Status Text Color", &mTBgColor );
QColor DefaultRot1( Qt::darkBlue );
QColor DefaultRot2( Qt::cyan );
mRotColor1 = cfg->readColorEntry( "Rotator Color 1", &DefaultRot1 );
mRotColor2 = cfg->readColorEntry( "Rotator Color 2", &DefaultRot2 );
mRotSpeed = cfg->readNumEntry( "Rotator Speed", 30 );
mWndTitle = cfg->readEntry( "Window Title", i18n("Please wait...") );
mLogoFile = cfg->readEntry( "Logo File", QString::null );
}
</programlisting>
</sect1>
<sect1 id="rotwidgeth">
<title>Quelltext von <filename>rotwidget.h</filename></title>
<programlisting>#ifndef __ROTWIDGET_H__
#define __ROTWIDGET_H__
#include <qlabel.h>
#include <qtimer.h>
#include <qwidget.h>
#include <kdialogbase.h>
#include <kpixmap.h>
/**
* @short Display a rotating-gradient widget.
*/
class RotWidget: public QWidget
{
Q_OBJECT
public:
RotWidget( QWidget *, const QColor&, const QColor&, 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<KPixmap> m_stepPixmap;
};
#endif
</programlisting>
</sect1>
<sect1 id="rotwidgetcpp">
<title>Quelltext von <filename>rotwidget.cpp</filename></title>
<programlisting>#include <kdebug.h>
#include <kdialogbase.h>
#include <kpixmapeffect.h>
#include <qlabel.h>
#include <qpainter.h>
#include <qwidget.h>
#include "rotwidget.h"
#include "rotwidget.moc"
RotWidget::RotWidget( QWidget *parent, const QColor& c1, const QColor&
c2, int sp )
:QWidget(parent), m_color1(c1), m_color2(c2), m_step(0), m_speed(sp)
{
if( (m_speed <= 0) || (m_speed > 20) )
m_speed = 1;
setFixedHeight( 6 );
for( int i = 0; i <= width(); i++ )
preparePixmap( i );
m_stepTimer = new QTimer( this );
connect(m_stepTimer, SIGNAL(timeout()), this, SLOT(stepEvent()));
m_stepTimer->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 > width() )
m_step = 0;
repaint( true );
}
// Todo: Optimize drawing.
void RotWidget::paintEvent( QPaintEvent *pe )
{
QPainter p;
p.begin( this );
QRect r = pe->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 <= re->size().width(); i++ )
preparePixmap( i );
}
void RotWidget::preparePixmap( int step )
{
if( step < 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( &next, 0, 0, prev, 1, 0, prev->width()-1, prev->height()
);
bitBlt( &next, width()-1, 0, prev, 0, 0, 1, prev->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
-->
|