Translation by Artem Sereda with my minor changes
[kde-ru.git] / docs / kdebase / ksplashml / index.docbook
blob795ca569d7ebd08909b9e7c2c85dc2ff78e4c843
1 <?xml version="1.0" ?>
2 <!DOCTYPE book PUBLIC "-//KDE//DTD DocBook XML V4.2-Based Variant V1.1//EN" "dtd/kdex.dtd" [
3 <!ENTITY kappname "&ksplash;">
4 <!ENTITY package "kdebase">
5 <!ENTITY % addindex "IGNORE">
6 <!ENTITY % Russian "INCLUDE">
7 ]>
9 <book lang="&language;">
11 <bookinfo>
12 <title
13 >Руководство &ksplash;</title>
15 <authorgroup>
16 <author
17 >&Teemu.Rytilahti; &Teemu.Rytilahti.mail; </author>
19 <othercredit role="developer"
20 >&Brian.C.Ledbetter; &Brian.C.Ledbetter.mail; </othercredit>
22 <othercredit role="developer"
23 >&Ravikiran.Rajagopal; &Ravikiran.Rajagopal.mail; </othercredit>
25 <othercredit role="translator"
26 ><firstname
27 >Иван</firstname
28 ><surname
29 >Кашуков</surname
30 ><affiliation
31 ><address
32 ><email
33 >dolphin210@yandex.ru</email
34 ></address
35 ></affiliation
36 ><contrib
37 >Перевод на русский</contrib
38 ></othercredit
39 ><othercredit role="translator"
40 ><firstname
41 >Николай</firstname
42 ><surname
43 >Шафоростов</surname
44 ><affiliation
45 ><address
46 ><email
47 >shafff@ukr.net</email
48 ></address
49 ></affiliation
50 ><contrib
51 >Обновление русского перевода</contrib
52 ></othercredit
55 </authorgroup>
57 <copyright>
58 <year
59 >2003</year>
60 <holder
61 >Teemu Rytilahti</holder>
62 </copyright>
63 <copyright>
64 <year
65 >2003-04</year>
66 <holder
67 >Ravikiran Rajagopal</holder>
68 </copyright>
69 <legalnotice
70 >&FDLNotice;</legalnotice>
72 <date
73 >2003-01-10</date>
74 <releaseinfo
75 >1.01.00</releaseinfo>
77 <abstract>
78 <para
79 >&ksplash; &mdash; симпатичный экран, показывающий процесс загрузки приложения</para>
80 </abstract>
82 <keywordset>
83 <keyword
84 >KDE</keyword>
85 <keyword
86 >kdebase</keyword>
87 <keyword
88 >ksplash</keyword>
89 <keyword
90 >ksplashml</keyword>
91 <keyword
92 >splashscreen</keyword>
93 <keyword
94 >eye candy</keyword>
95 </keywordset>
97 </bookinfo>
99 <chapter id="introduction">
100 <title
101 >Введение</title>
103 <para
104 >&ksplash; &mdash; симпатичный экран, показывающий процесс загрузки приложения. Вопросы и пожелания отправляйте в списки рассылки &kde;. Отличительные особенности &ksplash;: </para>
105 <simplelist>
106 <member
107 >Возможность применения тем</member>
108 <member
109 >Высокая гибкость в настройке обеспечивается использованием подключаемых модулей</member>
110 <member
111 >Программа может быть использована любым приложением, которое работает с DCOP</member>
112 </simplelist>
114 <para
115 >Это руководство объясняет, как создавать темы для использования с уже доступными подключаемыми модулями. Если ни один из доступных модулей не удовлетворяет вашему вкусу, вы можете научиться полностью настраивать внешний вид &ksplash;, создавая подключаемые модули на C++. </para>
116 </chapter>
118 <chapter id="using-themes">
119 <title
120 >Использование тем</title>
122 <para
123 >Чтобы использовать темы с <ulink url="http://www.kde-look.org"
124 >KDE-Look</ulink
125 >, скопируйте их в <filename
126 >~/.kde/apps/ksplash/Themes/</filename
127 > (для одного пользователя) или в <filename
128 >$<envar
129 >KDEDIR</envar
130 >/share/apps/ksplash/Themes/</filename
131 > (чтобы сделать их доступными для всех пользователей вашей системы).</para>
133 <para
134 >Чтобы сделать это автоматически, используйте модуль <guilabel
135 >Экран загрузки</guilabel
136 > раздела <guilabel
137 >Внешний вид</guilabel
138 > Центра управления &kde;.</para>
140 <sect1 id="using-kcontrol-module">
141 <title
142 >Модуль Центра управления</title>
144 <para
145 >Этот модуль позволяет устанавливать, тестировать и удалять темы &ksplash;.</para>
147 <para
148 >Внизу расположен список доступных тем &ksplash;. При выборе одной из последних, её предварительный просмотр появится в соответствующей части окна. Чтобы активировать тему, нажмите <guibutton
149 >OK</guibutton
150 > или <guibutton
151 >Применить</guibutton
152 >.</para>
154 <para
155 >Чтобы установить новые модули, нажмите <guibutton
156 >Добавить...</guibutton
157 >. Не нужно распаковывать файлы тем, они могут обрабатываться и в сжатом виде.</para>
159 <para
160 >Для просмотра анимации темы, нажмите кнопку<guibutton
161 >Тест</guibutton
162 >.</para>
164 <para
165 >Чтобы удалить тему, воспользуйтесь кнопкой <guibutton
166 >Удалить</guibutton
167 >. Если тема установлена для всех пользователей, то удалять её нужно с правами администратора. Также, мы не рекомендуем удалять тему <guilabel
168 >по умолчанию</guilabel
169 >.</para>
171 </sect1>
173 </chapter>
175 <chapter id="themes">
176 <title
177 >Как создавать темы для &ksplash;</title>
178 <sect1 id="themes-general">
179 <title
180 >Основные положения</title>
181 <para
182 >Создавать свои собственные темы для &ksplash; достаточно легко. Когда вы закончили свою тему, вы можете отослать её в <ulink url="http://www.kde-look.org"
183 >KDE-Look</ulink
184 >, чтобы её могли использовать другие.</para>
186 <sect2 id="theme-syntax">
187 <title
188 >Определение своей темы</title>
190 <para
191 >Давайте создадим тему под названием <literal
192 >MyCoolTheme</literal
193 >. Чтобы тема была распознана &ksplash;, следует поместить её в папку <filename class="directory"
194 >MyCoolTheme</filename
195 > в каталоге <filename class="directory"
196 >~/.kde/apps/ksplash/Themes/</filename
197 >. В ней должен содержаться файл <filename
198 >Theme.rc</filename
199 >, содержащий настройки темы. Вы можете установить множество особенностей для темы, изменить движок подключаемых модулей и т. д. Не обязательно использовать все доступные настройки, обычно используются только некоторые. Синтаксис записей файла <filename
200 >Theme.rc</filename
201 >: <literal
202 >[опция] = [значение]</literal
203 >. В последующих секциях определяется множество опций.</para>
205 <example>
206 <title
207 >Простой файл <filename
208 >Theme.rc</filename
209 ></title>
210 <programlisting
211 >[KSplash Theme: MyCoolTheme]
212 Name = MyCoolTheme
213 Description = Симпатичная тема, использующая движок XpLike
214 Version = 1.0
215 Author = Настоящее имя &lt;имя_пользователя@имя_сервера.домен&gt;
216 ## Use the XpLike engine for this theme.
217 Engine = XpLike
218 Show Icon = false
219 Welcome Text = Загрузка KDE
220 </programlisting>
221 </example>
223 <para
224 >После того как вы задали имя, описание и автора темы, вам следует выбрать движок темы (подключаемый модуль). Затем вы сможете настроить разнообразные характеристики движка темы, устанавливая пары опция=значение, как в вышеприведённом файле.</para>
226 <para
227 >Важно чтобы имя папки, в которой хранятся файлы темы (<filename class="directory"
228 >~/.kde/apps/ksplash/Themes/MyCoolTheme</filename
229 >) и идентификатор (<literal
230 >[KSplash Theme: MyCoolTheme] </literal
231 >) в <filename
232 >Theme.rc</filename
233 > совпадали. </para>
235 </sect2>
237 <sect2 id="theme-files">
238 <title
239 >Файлы фона</title>
241 <para
242 >При запуске &ksplash; пытается найти файл фона, соответствующий текущему разрешению экрана (если файл используется движком темы). Формат названия файла фона: <filename
243 >Background-<replaceable
244 >WWWxHHH</replaceable
245 >.png</filename
246 >.</para>
248 <para
249 >Например, вам надо использовать файл <filename
250 >Background-1024x768</filename
251 >. Если файл, соответствующий текущему разрешению экрана, не найден, программа пытается изменить размер файла <filename
252 >Background.png</filename
253 > (или другого, заданного в <filename
254 >Theme.rc</filename
255 >) так, чтобы он соответствовал разрешению. Изменение размера <quote
256 >на лету</quote
257 > занимает некоторое время, так что вам следует создать файлы как минимум для следующих разрешений экрана: 1280x1024, 1024x768 и 800x600.</para>
258 </sect2>
259 </sect1>
261 <sect1 id="theme-engines">
262 <title
263 >Опции движков тем</title>
265 <sect2 id="standard-themes">
266 <title
267 >Стандартная тема</title>
268 <table>
269 <title
270 >Опции стандартной темы</title>
271 <tgroup cols="3">
272 <tbody>
273 <row>
274 <entry
275 >Название</entry>
276 <entry
277 >Аргумент</entry>
278 <entry
279 >Значение</entry>
280 </row>
281 <!-- Statusbar -->
282 <row>
283 <entry
284 >Statusbar Position</entry>
285 <entry
286 >[top/bottom]</entry>
287 <entry
288 >Определяет расположение индикатора состояния на экране. Значение по умолчанию &mdash; bottom (внизу).</entry>
289 </row>
290 <row>
291 <entry
292 >Statusbar Visible</entry>
293 <entry
294 >[true/false]</entry>
295 <entry
296 >Определяет, будет ли индикатор состояния видимым. Значение по умолчанию &mdash; true (истина).</entry>
297 </row>
298 <row>
299 <entry
300 >Progress Visible</entry>
301 <entry
302 >[true/false]</entry>
303 <entry
304 >Определяет, будет ли показан прогресс загрузки. Значение по умолчанию &mdash; true.</entry>
305 </row>
306 <!-- Fonts -->
307 <row>
308 <entry
309 >Statusbar Font</entry>
310 <entry
311 >[название_шрифта]</entry>
312 <entry
313 >Шрифт, используемый в индикаторе состояния (по умолчанию &mdash; Helvetica).</entry>
314 </row>
315 <row>
316 <entry
317 >Statusbar Font Size</entry>
318 <entry
319 >[размер]</entry>
320 <entry
321 >Размер шрифта индикатора состояния (по умолчанию &mdash; 16).</entry>
322 </row>
323 <row>
324 <entry
325 >Statusbar Font Bold</entry>
326 <entry
327 >[true/false]</entry>
328 <entry
329 >Определяет, будет ли шрифт индикатора состояния полужирным (по умолчанию &mdash; true).</entry>
330 </row>
331 <row>
332 <entry
333 >Statusbar Font Italic</entry>
334 <entry
335 >[true/false]</entry>
336 <entry
337 >Определяет, будет ли шрифт индикатора состояния наклонным (по умолчанию -true).</entry>
338 </row>
339 <!-- Misc. things -->
340 <row>
341 <entry
342 >Statusbar Foreground</entry>
343 <entry
344 >[цвет]</entry>
345 <entry
346 >Цвет переднего плана индикатора состояния. Значение по умолчанию &mdash; white (белый).</entry>
347 </row>
348 <row>
349 <entry
350 >Statusbar Background</entry>
351 <entry
352 >[цвет]</entry>
353 <entry
354 >Цвет фона индикатора состояния. Значение по умолчанию &mdash; black (чёрный).</entry>
355 </row>
356 <row>
357 <entry
358 >Statusbar Icon</entry>
359 <entry
360 >[true/false]</entry>
361 <entry
362 >Определяет, будет ли пиктограмма у индикатора состояния.</entry>
363 </row>
364 <row>
365 <entry
366 >Icons Visible</entry>
367 <entry
368 >[true/false]</entry>
369 <entry
370 >Определяет, будут ли пиктограммы видимыми. Значение по умолчанию &mdash; true.</entry>
371 </row>
372 <row>
373 <entry
374 >Icons Jumping</entry>
375 <entry
376 >[true/false]</entry>
377 <entry
378 >Определяет, будут ли пиктограммы прыгающими. Значение по умолчанию &mdash; true.</entry>
379 </row>
380 <row>
381 <entry
382 >Icon Position</entry>
383 <entry
384 >[0-3, 10-13]</entry>
385 <entry
386 >Расположение пиктограмм (по умолчанию &mdash; вверху слева).</entry>
387 </row>
388 <row>
389 <entry
390 >Splash Screen</entry>
391 <entry
392 >[название]</entry>
393 <entry
394 >Изменяет образ отображаемого экрана.</entry>
395 </row>
396 </tbody>
397 </tgroup>
398 </table>
399 </sect2>
401 <sect2 id="redmond-themes">
402 <title
403 >Тема Redmond</title>
404 <table>
405 <title
406 >Опции темы Redmond</title>
407 <tgroup cols="3">
408 <tbody>
409 <row>
410 <entry
411 >Название</entry>
412 <entry
413 >Аргумент</entry>
414 <entry
415 >Значение</entry>
416 </row>
417 <!-- Main elements -->
418 <row>
419 <entry
420 >Background Image</entry>
421 <entry
422 >[имя_файла]</entry>
423 <entry
424 >Определяемый пользователем фоновый рисунок.</entry>
425 </row>
426 <row>
427 <entry
428 >User Icon</entry>
429 <entry
430 >[название]</entry>
431 <entry
432 >Название пиктограммы, отображаемой для пользователя. По умолчанию &mdash; <constant
433 >go</constant
434 >.</entry>
435 </row>
436 <row>
437 <entry
438 >Welcome Text</entry>
439 <entry
440 >[текст]</entry>
441 <entry
442 >Текст, отображающийся на экране. По умолчанию &mdash; "Добро пожаловать".</entry>
443 </row>
444 <row>
445 <entry
446 >Username Text</entry>
447 <entry
448 >[текст]</entry>
449 <entry
450 >Текст, замещающий имя пользователя.</entry>
451 </row>
452 <!-- Positioning elements -->
453 <row>
454 <entry
455 >Welcome Text Position</entry>
456 <entry
457 >[x,y]</entry>
458 <entry
459 >Область экрана, в которой отображается текст приглашения (определяемый опцией Welcome Text).</entry>
460 </row>
461 <row>
462 <entry
463 >Username Text Position</entry>
464 <entry
465 >[x,y]</entry>
466 <entry
467 >Область экрана, в которой отображается имя пользователя.</entry>
468 </row>
469 <row>
470 <entry
471 >Action Text Position</entry>
472 <entry
473 >[x,y]</entry>
474 <entry
475 >Область экрана, в которой отображается текущее действие.</entry>
476 </row>
477 <row>
478 <entry
479 >Icon Position</entry>
480 <entry
481 >[x,y]</entry>
482 <entry
483 >Область экрана, в которой отображается пиктограмма пользователя.</entry>
484 </row>
485 <!-- Show to show.. -->
486 <row>
487 <entry
488 >Show Welcome Text</entry>
489 <entry
490 >[true/false]</entry>
491 <entry
492 >Определяет, будет ли отображаться текст приглашения (значение по умолчанию &mdash; true).</entry>
493 </row>
494 <row>
495 <entry
496 >Show Welcome Shadow</entry>
497 <entry
498 >[true/false]</entry>
499 <entry
500 >Определяет, будет ли отображаться тень текста приглашения (значение по умолчанию &mdash; true).</entry>
501 </row>
502 <row>
503 <entry
504 >Show Username</entry>
505 <entry
506 >[true/false]</entry>
507 <entry
508 >Определяет, будет ли отображаться имя пользователя (значение по умолчанию &mdash; true).</entry>
509 </row>
510 <row>
511 <entry
512 >Show Action</entry>
513 <entry
514 >[true/false]</entry>
515 <entry
516 >Определяет, будет ли отображаться действие, выполняемое в данный момент. Значение по умолчанию &mdash; true.</entry>
517 </row>
518 <row>
519 <entry
520 >Show Icon</entry>
521 <entry
522 >[true/false]</entry>
523 <entry
524 >Определяет, будет ли отображаться пиктограмма. Значение по умолчанию &mdash; true.</entry>
525 </row>
526 <row>
527 <entry
528 >Use KDM User Icon</entry>
529 <entry
530 >[true/false]</entry>
531 <entry
532 >Определяет, будет ли использоваться пиктограмма, соответствующая пользователю при входе в систему. Значение по умолчанию &mdash; true.</entry>
533 </row>
534 </tbody>
535 </tgroup>
536 </table>
537 </sect2>
539 <sect2 id="macx-themes">
540 <title
541 >Тема MacX</title>
542 <table>
543 <title
544 >Опции темы MacX</title>
545 <tgroup cols="3">
546 <tbody>
547 <row>
548 <entry
549 >Название</entry>
550 <entry
551 >Аргумент</entry>
552 <entry
553 >Значение</entry>
554 </row>
555 <row>
556 <entry
557 >Icon Size Minimum</entry>
558 <entry
559 >[размер]</entry>
560 <entry
561 >Минимальный размер пиктограммы (по умолчанию &mdash; 16).</entry>
562 </row>
563 <row>
564 <entry
565 >Icon Size Maximum</entry>
566 <entry
567 >[размер]</entry>
568 <entry
569 >Максимальный размер пиктограммы (по умолчанию &mdash; 64).</entry>
570 </row>
571 <row>
572 <entry
573 >Optimized Icon Rendering</entry>
574 <entry
575 >[true/false]</entry>
576 <entry
577 >Будет ли оптимизироваться отрисовка пиктограмм (значение по умолчанию &mdash; true).</entry>
578 </row>
579 <row>
580 <entry
581 >Progress Bar Visible</entry>
582 <entry
583 >[true/false]</entry>
584 <entry
585 >По умолчанию &mdash; true.</entry>
586 </row>
587 <row>
588 <entry
589 >Progress Bar Position</entry>
590 <entry
591 >[top/bottom]</entry>
592 <entry
593 >Определяет расположение индикатора состояния (внизу или вверху). По умолчанию - bottom (внизу).</entry>
594 </row>
595 <row>
596 <entry
597 >Icons Jumping</entry>
598 <entry
599 >[true/false]</entry>
600 <entry
601 >Определяет, будут ли пиктограммы прыгающими (по умолчанию &mdash; false).</entry>
602 </row>
603 </tbody>
604 </tgroup>
605 </table>
606 </sect2>
608 <sect2 id="mac-classic-themes">
609 <title
610 >Тема MacClassic</title>
611 <table>
612 <title
613 >Опции темы MacClassic</title>
614 <tgroup cols="3">
615 <tbody>
616 <row>
617 <entry
618 >Название</entry>
619 <entry
620 >Аргумент</entry>
621 <entry
622 >Значение</entry>
623 </row>
624 <row>
625 <entry
626 >Icon Position</entry>
627 <entry
628 >[0-3, 10-13]</entry>
629 <entry
630 >Расположение пиктограмм на экране, по умолчанию &mdash; внизу слева.</entry>
631 </row>
632 <row>
633 <entry
634 >Icons Jumping</entry>
635 <entry
636 >[true/false]</entry>
637 <entry
638 >Определяет, будут ли пиктограммы прыгающими (по умолчанию &mdash; false).</entry>
639 </row>
640 <row>
641 <entry
642 >Icons Visible</entry>
643 <entry
644 >[true/false]</entry>
645 <entry
646 >Определяет, будут ли пиктограммы видимыми. Значение по умолчанию &mdash; true.</entry>
647 </row>
648 <row>
649 <entry
650 >Splash Screen</entry>
651 <entry
652 >[название]</entry>
653 <entry
654 >Изменяет образ отображаемого экрана.</entry>
655 </row>
656 </tbody>
657 </tgroup>
658 </table>
659 </sect2>
661 <sect2 id="themes-2k">
662 <title
663 >Тема 2k</title>
664 <table>
665 <title
666 >Опции темы 2k</title>
667 <tgroup cols="3">
668 <tbody>
669 <row>
670 <entry
671 >Название</entry>
672 <entry
673 >Аргумент</entry>
674 <entry
675 >Значение</entry>
676 </row>
677 <row>
678 <entry
679 >Title Background Color</entry>
680 <entry
681 >[цвет]</entry>
682 <entry
683 >Фоновый цвет заголовка, по умолчанию &mdash; dark blue (тёмно-синий).</entry>
684 </row>
685 <row>
686 <entry
687 >Title Foreground Color</entry>
688 <entry
689 >[цвет]</entry>
690 <entry
691 >Цвет переднего плана заголовка. По умолчанию &mdash; white (белый).</entry>
692 </row>
693 <row>
694 <entry
695 >Status Text Color</entry>
696 <entry
697 >[цвет]</entry>
698 <entry
699 >Цвет текста состояния. По умолчанию соответствует фоновому тексту заголовка (определяемому опцией Title Background Color).</entry>
700 </row>
701 <row>
702 <entry
703 >Rotator Color 1</entry>
704 <entry
705 >[цвет]</entry>
706 <entry
707 >Определяет цвет индикатора 1. По умолчанию &mdash; dark blue, тёмно-синий.</entry>
708 </row>
709 <row>
710 <entry
711 >Rotator Color 2</entry>
712 <entry
713 >[цвет]</entry>
714 <entry
715 >Определяет цвет индикатора 2, по умолчанию &mdash; светло-серый (cyan).</entry>
716 </row>
717 <row>
718 <entry
719 >Rotator Speed</entry>
720 <entry
721 >[значение]</entry>
722 <entry
723 >Определяет скорость индикатора, по умолчанию &mdash; 30.</entry>
724 </row>
725 <row>
726 <entry
727 >Window Title</entry>
728 <entry
729 >[текст]</entry>
730 <entry
731 >Определяет текст заголовка окна.</entry>
732 </row>
733 <row>
734 <entry
735 >Logo File</entry>
736 <entry
737 >[имя_файла]</entry>
738 <entry
739 >Определяет используемый логотип.</entry>
740 </row>
741 </tbody>
742 </tgroup>
743 </table>
744 </sect2>
745 </sect1>
746 </chapter>
748 <chapter id="from-other-applications">
749 <title
750 >Использование &ksplash; в вашем собственном приложении</title>
752 <para
753 >В этой главе описывается простой метод использования &ksplash; в качестве окна-показателя загрузки в вашем приложении для &kde;. Если вы не разрабатываете приложения для &kde;, вы можете опустить эту главу.</para>
755 <sect1 id="basic-other-reqs">
756 <title
757 >Основные требования</title>
759 <para
760 >Ваше приложение &kde; должно работать с &DCOP;. &DCOP; &mdash; это технология &kde;, использующаяся для коммуникации между приложениями. Если вы используете <ulink url="http://developer.kde.org"
761 >стандартную структуру приложения &kde;</ulink
762 >, это обеспечивается автоматически. Чтобы получить информацию о &DCOP; и связанных технологиях &kde;, посетите <ulink url="http://developer.kde.org"
763 >сайт разработчиков &kde;</ulink
764 >.</para>
765 </sect1>
767 <sect1 id="other-using">
768 <title
769 >Запуск &ksplash;</title>
771 <para
772 >До того, как ваше приложение начнёт вычисления, загрузку подключаемых модулей и т. д., запустите &ksplash;. Образец:</para>
774 <programlisting
775 >DCOPClient *c = kapp-&gt;dcopClient();
776 QString error;
777 QCString KSplashName;
778 int pid = 0;
779 QStringList args;
780 args &lt;&lt; "--theme=MyCoolTheme" &lt;&lt; "--managed";
781 if (kapp-&gt;startServiceByDesktopName("ksplash", args, &amp;error, &amp;KSplashName, &amp;pid))
783 KMessageBox::sorry(0, error, "Unable to invoke KSplash");
784 // Some error processing here.
786 </programlisting>
788 <para
789 >Мы предполагаем, что запущено только одно окно &ksplash;. Другие случаи немного более сложны. Разъяснения см. в документации &DCOP;.</para>
790 </sect1>
792 <sect1 id="show-messages">
793 <title
794 >Отображение сообщений</title>
796 <para
797 >Перед отображением сообщений вам необходимо установить число шагов. Например, процедура запуска &kde; включает 7 этапов.</para>
799 <programlisting
800 >QByteArray data;
801 QDataStream arg(data,IO_WriteOnly);
802 arg &lt;&lt; someNumber;
803 if (!(c-&gt;send(KSplashName, "KSplashIface", "setStartupItemCount(int)", data))
804 // Здесь проявляется некоторая ошибка.
805 </programlisting>
807 <para
808 >Если вы хотите, чтобы сообщение отображалось с пиктограммой или без неё, используйте</para>
810 <programlisting
811 >arg &lt;&lt; QString("название_пиктограммы") &lt;&lt; QString("название_программы") &lt;&lt; QString("некоторое описание");
812 if (!(c-&gt;send(KSplashName, "KSplashIface", "programStarted(QString,QString,QString)", data))
814 // Здесь проявляется некоторая ошибка.
816 </programlisting>
818 <para
819 >Каждый раз, когда вы вызываете <constant
820 >programStarted</constant
821 >, шаги заканчиваются. Когда ваша программа закончила запуск, выполните следующие команды, чтобы убрать экран загрузки:</para>
823 <programlisting
824 >if (!(c-&gt;send(KSplashName, "KSplashIface", "startupComplete()", data))
826 // Здесь проявляется некоторая ошибка.
828 </programlisting>
830 <para
831 >Это всё, что вам необходимо, чтобы использовать все преимущества &ksplash;.</para>
833 </sect1>
834 </chapter>
836 <!-- FIXME: Better to leave this out until it's written, or the translators -->
837 <!-- will have to still translate it ... -->
839 <chapter id="wrplugins">
840 <title
841 >Создание новых подключаемых модулей &ksplash;</title>
843 <para
844 >Создавать подключаемые модули &ksplash; нетрудно. В этой главе мы напишем простой модуль, который эмулирует экран загрузки одной очень известной операционной системы. Предполагается, что вы знакомы с основами языка C++, и хотя бы немного &mdash; с программированием для KDE/Qt.</para>
846 <sect1 id="basic-requirements">
847 <title
848 >Основные требования</title>
849 <para
850 >Мы создадим модуль с названием <literal
851 >2k</literal
852 >. Название используется во многих местах. Важно не исказить его, чтобы модуль был распознан &ksplash;. Модули &ksplash; являются динамически загружаемыми библиотеками со следующими объявлениями: </para>
853 <simplelist>
854 <member
855 >Библиотеку следует называть по образцу: <filename
856 >ksplash+название_темы_в_нижнем_регистре</filename
857 >. В нашем случае название будет <filename
858 >ksplash2k</filename
859 >.</member>
860 <member
861 >Тема должна иметь свой desktop-файл, который следует назвать <filename
862 >ksplash+название_темы_в_нижнем_регистре.desktop</filename
863 >. В нашем случае &mdash; <filename
864 >ksplash2k.desktop</filename
865 >. </member>
866 <member
867 >Наконец, библиотека должна возвращать класс с названием <literal
868 >Theme+название_темы</literal
869 >, в нашем случае &mdash; <literal
870 >Theme2k</literal
871 >.</member>
872 </simplelist>
873 <para
874 >Не беспокойтесь, если вы не поняли всё вышесказанное. Далее мы рассмотрим каждый шаг в деталях. Важной деталью является то, что класс модуля вы должны взять из <literal
875 >ThemeEngine</literal
876 >. </para>
877 </sect1>
878 <sect1 id="skeleton">
879 <title
880 >Создание основы</title>
881 <para
882 >При создании модуля мы будем использовать основу для приложения &kde;, которая обеспечит независимость от платформы во всех частях нашей работы. Убедитесь, что в вашей системе установлен пакет <filename
883 >kdesdk</filename
884 >. Выполните команду <literal
885 >kapptemplate</literal
886 >, чтобы создать приложение с названием "2k". Будет создана папка, содержащая основные файлы (такие как AUTHORS и т. п.). Нам нужен подкаталог <filename class="directory"
887 >2k</filename
888 >. Удалите все файлы в нём, и основа готова. </para>
889 <para
890 >На следующем этапе вы должны создать файл <filename
891 >.desktop</filename
892 >, который, после установки, сообщит &ksplash;, что подключаемый модуль доступен. В соответствии с правилами наименования файлов, которые даны <link linkend="basic-requirements"
893 >в предыдущей секции</link
894 >, создайте файл <filename
895 >ksplash2k.desktop</filename
896 > (в каталоге /2k). Он должен содержать следующие строки: </para>
897 <programlisting
898 ><literal>
899 [Desktop Entry]
900 Encoding=UTF-8
901 Type=Service
902 Comment=KSplash Plugin
903 Name=KSplash2k
904 ServiceTypes=KSplash/Plugin
905 X-KDE-Library=ksplash2k
906 X-KSplash-Default=true
907 X-KSplash-PluginName=2k
908 X-KSplash-ObjectName=Theme2k
909 </literal
911 </programlisting>
912 <para
913 >Опции <literal
914 >Encoding</literal
915 >, <literal
916 >Type</literal
917 >, <literal
918 >Comment</literal
919 > и <literal
920 >ServiceTypes</literal
921 > одинаковы для всех подключаемых модулей. Название модуля и библиотеки следуют вышеописанным правилам. Опция <literal
922 >X-KSplash-Default</literal
923 > может принимать одно из двух значений (true или false). Она определяет, будет ли этот модуль показан в Центре управления как модуль по умолчанию. За исключением некоторых очень редких случаев, его значение должно быть <constant
924 >true</constant
925 >. </para>
926 </sect1>
927 <sect1 id="headerfile">
928 <title
929 >Объявление класса подключаемого модуля</title>
930 <para
931 >Теперь, когда мы закончили подготовительную работу, начинается действительно интересная часть &mdash; создание класса, который обеспечивает нужное поведение модуля. Хотя мы вольны делать с этим классом всё, что хотим, существует несколько ограничений.</para>
932 <orderedlist>
933 <listitem
934 ><para
935 >Классы модуля должны соответствовать классу <constant
936 >ThemeEngine</constant
937 >.</para
938 ></listitem>
939 <listitem
940 ><para
941 >Классы модуля следует называть в соответствии с правилом: <classname
942 >Тема+название_модуля</classname
943 >.</para
944 ></listitem>
945 <listitem
946 ><para
947 >Классы модуля должны обеспечивать <literal
948 >статическую</literal
949 > функцию с названием <function
950 >names</function
951 >, которая возвращает список названий, под которыми она может быть задействована.</para
952 ></listitem>
953 <listitem
954 ><para
955 >Чтобы модуль можно было настраивать из Центра управления, он должен включать класс, основанный на классе <literal
956 >ThemeEngineConfig</literal
957 >.</para
958 ></listitem>
959 <listitem
960 ><para
961 >Классы модуля должны перекрывать хотя бы одну из следующих виртуальных функций: <function
962 >slotSetText</function
963 >, <function
964 >slotSetPixmap</function
965 >, <function
966 >slotUpdateProgress</function
967 > и <function
968 >slotUpdateSteps</function
969 >, чтобы обеспечить возможность использования.</para
970 ></listitem>
971 <listitem
972 ><para
973 >Разработчик должен использовать форму <literal
974 >ThemeEngine( QWidget *parent, символьную постоянную *name, постоянную QStringList &amp;args )</literal
975 >, чтобы модуль можно было использовать с <classname
976 >KGenericFactory</classname
977 >.</para
978 ></listitem>
979 </orderedlist>
980 <para
981 >Последнее требование может показаться сложным, но, как мы увидим позже, вы можете обычно игнорировать его, добавив одну строку к исходным кодам.</para>
982 </sect1>
983 <sect1 id="headercode">
984 <title
985 >Код файла заголовка</title>
986 <para
987 >Присвоив значения константам, мы увидим, что файл заголовков <filename
988 >theme2k.h</filename
989 > приобретёт вид вроде этого:</para>
990 <example>
991 <title
992 >Файл <filename
993 >theme2k.h</filename
994 ></title>
995 <programlisting
996 >#ifndef __THEME2K_H__
997 #define __THEME2K_H__
999 #include &lt;qlabel.h&gt;
1000 #include &lt;qwidget.h&gt;
1002 #include &lt;kdialogbase.h&gt;
1003 #include &lt;kpixmap.h&gt;
1004 #include &lt;ksplash/themeengine.h&gt;
1006 class RotWidget;
1008 class Cfg2k: public ThemeEngineConfig
1010 Q_OBJECT
1011 public:
1012 Cfg2k( KConfig * );
1015 class ObjKsTheme;
1016 class Theme2k: public ThemeEngine
1018 Q_OBJECT
1019 public:
1020 Theme2k( QWidget *, const char *, const QStringList&amp; );
1022 inline const QString name()
1024 return( QString("KSplash2k") );
1026 inline const KDialogBase *config( KConfig *kc )
1028 return new Cfg2k( kc );
1030 static QStringList names()
1032 QStringList Names;
1033 Names &lt;&lt; "KSplash2k";
1034 Names &lt;&lt; "ks2k";
1035 Names &lt;&lt; "2k";
1036 Names &lt;&lt; "2000";
1037 return( Names );
1040 public slots:
1041 inline void slotSetText( const QString&amp; s )
1043 if( mText &amp;&amp; mText-&gt;text() != s ) mText-&gt;setText( s );
1046 private:
1047 void initUi();
1048 void readSettings();
1050 QLabel *mText;
1051 RotWidget *mRotator;
1052 QColor mTBgColor, mTFgColor, mRotColor1, mRotColor2, mStatusColor;
1053 int mRotSpeed;
1054 QString mWndTitle, mLogoFile;
1057 #endif
1058 </programlisting>
1059 </example>
1060 <para
1061 >Давайте проанализируем вышеприведённое. Класс <classname
1062 >Theme2k</classname
1063 >, произведённый от <classname
1064 >ThemeEngine</classname
1065 > удовлетворяет объявлениям. Он обеспечивает метод <methodname
1066 >Theme2k::names()</methodname
1067 >, и имеет конструктор, который принимает необходимые параметры: <function
1068 >Theme2k( QWidget *, const char *, const QStringList&amp; );</function
1069 >, и к тому же обеспечивает простой метод <methodname
1070 >Theme2k::slotSetText()</methodname
1071 >. На данном этапе вам не следует беспокоиться насчёт класса <classname
1072 >RotWidget</classname
1073 >. Это небольшой элемент графического интерфейса, который делает программу более наглядной для пользователя. Наш подключаемый модуль очень прост: он не отображает ни пиктограмм, ни шкалы загрузки. Если вы хотите использовать пиктограммы, перекройте функцию <function
1074 >slotSetPixmap</function
1075 >. Подобные функции есть для установки шкалы загрузки (<function
1076 >slotUpdateSteps</function
1077 >) и увеличения счётчика (<function
1078 >slotUpdateProgress</function
1079 >) текущего шага. </para>
1080 </sect1>
1081 <sect1 id="Implementation">
1082 <title
1083 >Реализация подключаемого модуля</title>
1084 <para
1085 >Мы проверим только связанные части реализации. В приложении находится описание всей реализации. В первую очередь нам необходимо удовлетворить требованиям библиотеки:</para>
1086 <example>
1087 <title
1088 >Требования библиотеки</title>
1089 <programlisting
1090 >K_EXPORT_COMPONENT_FACTORY( ksplash2k, KGenericFactory&lt;Theme2k&gt; );
1091 </programlisting>
1092 </example>
1093 <para
1094 >Объявление макроса <constant
1095 >K_EXPORT_COMPONENT_FACTORY</constant
1096 > содержится в файле <filename
1097 >kgenericfactory.h</filename
1098 >. Теперь перейдём к конструктору. Так как подключаемый модуль совсем прост, конструктор тоже несложен.</para>
1099 <example>
1100 <title
1101 >Конструктор подключаемого модуля</title>
1102 <programlisting
1103 >Theme2k::Theme2k( QWidget *parent, const char *name, const QStringList &amp;args )
1104 :ThemeEngine( parent, name, args )
1106 readSettings();
1107 initUi();
1109 </programlisting>
1110 </example>
1111 <para
1112 >Метод <function
1113 >readSettings()</function
1114 > является иллюстрацией подходящего способа получить настройки темы (вы ведь хотите, чтобы люди могли использовать ваш модуль для своих тем?)</para>
1115 <example>
1116 <title
1117 >Получение настроек темы</title>
1118 <programlisting
1119 >void Theme2k::readSettings()
1121 if( !mTheme )
1122 return;
1124 KConfig *cfg = mTheme-&gt;themeConfig();
1125 if( !cfg )
1126 return;
1128 cfg-&gt;setGroup( QString("KSplash Theme: %1").arg(mTheme-&gt;theme()) );
1130 QColor DefaultTBgColor( Qt::darkBlue );
1131 QColor DefaultTFgColor( Qt::white );
1133 mTBgColor = cfg-&gt;readColorEntry( "Title Background Color", &amp;DefaultTBgColor );
1134 mTFgColor = cfg-&gt;readColorEntry( "Title Foreground Color", &amp;DefaultTFgColor );
1135 mStatusColor = cfg-&gt;readColorEntry("Status Text Color", &amp;mTBgColor );
1137 QColor DefaultRot1( Qt::darkBlue );
1138 QColor DefaultRot2( Qt::cyan );
1139 mRotColor1 = cfg-&gt;readColorEntry( "Rotator Color 1", &amp;DefaultRot1 );
1140 mRotColor2 = cfg-&gt;readColorEntry( "Rotator Color 2", &amp;DefaultRot2 );
1142 mRotSpeed = cfg-&gt;readNumEntry( "Rotator Speed", 30 );
1143 mWndTitle = cfg-&gt;readEntry( "Window Title", i18n("Please wait...") );
1144 mLogoFile = cfg-&gt;readEntry( "Logo File", QString::null );
1146 </programlisting>
1147 </example>
1148 <para
1149 >Так как мы работаем для пользователей, следует обеспечить подходящие настройки по умолчанию для параметров, которые не представлены в файле темы. Обратите внимание, что группу следует устанавливать следующим образом: "KSplash Theme: название_темы", чтобы обеспечить совместимость с будущими спецификациями темы. Метод <function
1150 >initUI()</function
1151 > не представляет большого интереса, он просто организует элементы графического интерфейса. Детали см. в приложении. </para>
1152 </sect1>
1153 <sect1 id="compilingfile">
1154 <title
1155 >Компиляция подключаемого модуля</title>
1156 <para
1157 >Для компиляции модуля мы решили использовать основу &kde;, поэтому необходимо создать файл <filename
1158 >Makefile.am</filename
1159 >. Он должен выглядеть следующим образом:</para>
1160 <example>
1161 <title
1162 >Файл <filename
1163 >Makefile.am</filename
1164 ></title>
1165 <programlisting
1166 >INCLUDES = $(all_includes)
1168 kde_module_LTLIBRARIES = ksplash2k.la
1170 ksplash2k_la_SOURCES = theme2k.cpp rotwidget.cpp
1171 ksplash2k_la_LDFLAGS = $(all_libraries) $(KDE_RPATH)
1172 ksplash2k_la_LIBADD = $(LIB_KDEUI) -lksplashthemes
1174 METASOURCES = AUTO
1176 noinst_HEADERS = theme2k.h rotwidget.h
1178 servicesdir = $(kde_servicesdir)
1179 services_DATA = ksplash2k.desktop
1181 themedir = $(kde_datadir)/ksplash/Themes/2k
1182 theme_DATA = Theme.rc Preview.png
1183 </programlisting>
1184 </example>
1185 <para
1186 >Чтобы получить дальнейшую информацию по созданию <filename
1187 >Makefile.am</filename
1188 >, загляните на <ulink url="http://developer.kde.org/documentation/other/makefile_am_howto.html"
1189 >веб-сайт</ulink
1190 > разработчиков &kde;. Заметим, что мы создаём тему по умолчанию, основанную на этом модуле, и прилагаем к нему графический файл фона. В качестве жеста вежливости по отношению к пользователям создайте файл <filename
1191 >Theme.rc</filename
1192 >, являющийся примером использования опций.</para>
1193 </sect1>
1194 </chapter>
1196 <chapter id="faq">
1197 <title
1198 >Вопросы и ответы</title>
1199 &reporting.bugs; &updating.documentation; <qandaset id="faqlist">
1200 <qandaentry>
1201 <question>
1202 <para
1203 >Я не могу найти ни одной темы, которая работала бы с &ksplash;. Почему?</para>
1204 </question>
1205 <answer>
1206 <para
1207 >Возможно, у вас нет соответствующих подключаемых модулей для тем. Модули содержатся в пакете <literal
1208 >kde-artwork</literal
1209 >. Скачайте, установите его и попытайтесь запустить темы снова.</para>
1210 </answer>
1211 </qandaentry>
1212 <qandaentry>
1213 <question>
1214 <para
1215 >Что такое файл <filename
1216 >Theme.rc</filename
1217 > и как его создать?</para>
1218 </question>
1219 <answer>
1220 <para
1221 ><filename
1222 >Theme.rc</filename
1223 > &mdash; это файл, где вы можете задать настройки темы. Информация по нему находится в разделе <link linkend="themes"
1224 >Как создавать темы для &ksplash;</link
1225 >. </para>
1226 </answer>
1227 </qandaentry>
1228 </qandaset>
1229 </chapter>
1231 <chapter id="credits">
1232 <title
1233 >Благодарности и лицензирование</title>
1235 <para
1236 >&ksplash;</para>
1238 <para
1239 >Авторские права на программу принадлежат &copy; 2003 &Ravikiran.Rajagopal; &Ravikiran.Rajagopal.mail;</para>
1241 <itemizedlist>
1242 <title
1243 >Помощь в разработке</title>
1244 <listitem
1245 ><para
1246 >&Brian.C.Ledbetter; &Brian.C.Ledbetter.mail;</para>
1247 </listitem>
1248 </itemizedlist>
1250 <para
1251 >Документация &copy; 2003 &Teemu.Rytilahti; &Teemu.Rytilahti.mail;</para>
1252 &underFDL; &underGPL; </chapter>
1254 <appendix id="installation">
1255 <title
1256 >Установка</title>
1258 <sect1 id="requirements">
1259 <title
1260 >Системные требования</title>
1262 <para
1263 >Чтобы иметь возможность использовать возможности &ksplash; вам необходим оконный менеджер &kde; версии 3.2 или выше. Если тема не работает, свяжитесь с её автором, чтобы выяснить, где можно взять подходящий подключаемый модуль.</para>
1265 </sect1>
1267 <sect1 id="compilation">
1268 <title
1269 >Сборка и установка</title>
1270 &install.compile.documentation; </sect1>
1271 </appendix>
1272 <appendix id="srccode">
1273 <title
1274 >Исходные коды</title>
1275 <sect1 id="theme2kcpp">
1276 <title
1277 >Файл <filename
1278 >theme2k.cpp</filename
1279 ></title>
1280 <programlisting
1281 >#include &lt;qlabel.h&gt;
1282 #include &lt;qwidget.h&gt;
1284 #include &lt;kapplication.h&gt;
1285 #include &lt;kconfig.h&gt;
1286 #include &lt;kdebug.h&gt;
1287 #include &lt;kdialogbase.h&gt;
1288 #include &lt;kgenericfactory.h&gt;
1289 #include &lt;kglobalsettings.h&gt;
1290 #include &lt;klocale.h&gt;
1291 #include &lt;ksplash/objkstheme.h&gt;
1292 #include &lt;kstandarddirs.h&gt;
1294 #include "rotwidget.h"
1295 #include "theme2k.h"
1296 #include "theme2k.moc"
1298 K_EXPORT_COMPONENT_FACTORY( ksplash2k, KGenericFactory&lt;Theme2k&gt; );
1300 Cfg2k::Cfg2k( KConfig * )
1303 Theme2k::Theme2k( QWidget *parent, const char *name, const QStringList &amp;args )
1304 :ThemeEngine( parent, name, args )
1306 readSettings();
1307 initUi();
1310 void Theme2k::initUi()
1312 QVBox *vbox = new QVBox( this );
1313 vbox-&gt;setFrameShape( QFrame::WinPanel );
1314 vbox-&gt;setFrameShadow( QFrame::Raised );
1316 QHBox *labelBox = new QHBox( vbox );
1317 labelBox-&gt;setPalette( mTBgColor );
1318 labelBox-&gt;setMargin( 1 );
1319 QLabel *lbl = new QLabel( mWndTitle, labelBox );
1320 lbl-&gt;setFont( QFont( "Arial", 12, QFont::Bold ) );
1321 lbl-&gt;setPaletteForegroundColor( mTFgColor );
1323 QLabel *logo = new QLabel( vbox );
1324 logo-&gt;setPalette( Qt::white );
1326 QString px( locate( "appdata", mTheme-&gt;themeDir() + (mLogoFile.isNull()?QString("/Logo.png"):mLogoFile) ) );
1327 if (px.isNull())
1328 px = locate("appdata","Themes/Default/splash_top.png");
1329 if( !px.isNull() )
1331 QPixmap pix( px );
1332 logo-&gt;setPixmap( pix );
1334 else
1336 logo-&gt;setText( "&lt;B&gt;KDE&lt;/B&gt;2000" );
1337 logo-&gt;setAlignment( AlignCenter|AlignVCenter );
1340 mRotator = new RotWidget( vbox, mRotColor1, mRotColor2, mRotSpeed );
1342 QHBox *hbox = new QHBox( vbox );
1343 labelBox-&gt;setSpacing( 4 );
1344 labelBox-&gt;setMargin( 4 );
1346 mText = new QLabel( hbox );
1347 mText-&gt;setPaletteForegroundColor( mStatusColor );
1348 mText-&gt;setPaletteBackgroundColor( mTFgColor );
1349 mText-&gt;setText( mWndTitle );
1350 mText-&gt;setFixedHeight( 48 );
1352 setFixedSize( vbox-&gt;sizeHint() );
1353 QRect rect(KGlobalSettings::splashScreenDesktopGeometry());
1354 move( rect.x() + (rect.width() - size().width())/2,
1355 rect.y() + (rect.height() - size().height())/2 );
1358 void Theme2k::readSettings()
1360 if( !mTheme )
1361 return;
1363 KConfig *cfg = mTheme-&gt;themeConfig();
1364 if( !cfg )
1365 return;
1367 cfg-&gt;setGroup( QString("KSplash Theme: %1").arg(mTheme-&gt;theme()) );
1369 QColor DefaultTBgColor( Qt::darkBlue );
1370 QColor DefaultTFgColor( Qt::white );
1372 mTBgColor = cfg-&gt;readColorEntry( "Title Background Color", &amp;DefaultTBgColor );
1373 mTFgColor = cfg-&gt;readColorEntry( "Title Foreground Color", &amp;DefaultTFgColor );
1374 mStatusColor = cfg-&gt;readColorEntry("Status Text Color", &amp;mTBgColor );
1376 QColor DefaultRot1( Qt::darkBlue );
1377 QColor DefaultRot2( Qt::cyan );
1378 mRotColor1 = cfg-&gt;readColorEntry( "Rotator Color 1", &amp;DefaultRot1 );
1379 mRotColor2 = cfg-&gt;readColorEntry( "Rotator Color 2", &amp;DefaultRot2 );
1381 mRotSpeed = cfg-&gt;readNumEntry( "Rotator Speed", 30 );
1382 mWndTitle = cfg-&gt;readEntry( "Window Title", i18n("Please wait...") );
1383 mLogoFile = cfg-&gt;readEntry( "Logo File", QString::null );
1385 </programlisting>
1386 </sect1>
1387 <sect1 id="rotwidgeth">
1388 <title
1389 >Файл <filename
1390 >rotwidget.h</filename
1391 ></title>
1392 <programlisting
1393 >#ifndef __ROTWIDGET_H__
1394 #define __ROTWIDGET_H__
1396 #include &lt;qlabel.h&gt;
1397 #include &lt;qtimer.h&gt;
1398 #include &lt;qwidget.h&gt;
1400 #include &lt;kdialogbase.h&gt;
1401 #include &lt;kpixmap.h&gt;
1404 * @short Display a rotating-gradient widget.
1406 class RotWidget: public QWidget
1408 Q_OBJECT
1409 public:
1410 RotWidget( QWidget *, const QColor&amp;, const QColor&amp;, int );
1411 ~RotWidget();
1413 private slots:
1414 void stepEvent();
1416 protected:
1417 void preparePixmap( int );
1418 void paintEvent( QPaintEvent * );
1419 void resizeEvent( QResizeEvent * );
1421 QColor m_color1, m_color2;
1422 int m_step, m_speed;
1423 QTimer *m_stepTimer;
1425 QList&lt;KPixmap&gt; m_stepPixmap;
1428 #endif
1429 </programlisting>
1430 </sect1>
1431 <sect1 id="rotwidgetcpp">
1432 <title
1433 >Файл <filename
1434 >rotwidget.cpp</filename
1435 ></title>
1436 <programlisting
1437 >#include &lt;kdebug.h&gt;
1438 #include &lt;kdialogbase.h&gt;
1439 #include &lt;kpixmapeffect.h&gt;
1441 #include &lt;qlabel.h&gt;
1442 #include &lt;qpainter.h&gt;
1443 #include &lt;qwidget.h&gt;
1445 #include "rotwidget.h"
1446 #include "rotwidget.moc"
1448 RotWidget::RotWidget( QWidget *parent, const QColor&amp; c1, const QColor&amp; c2, int sp )
1449 :QWidget(parent), m_color1(c1), m_color2(c2), m_step(0), m_speed(sp)
1451 if( (m_speed &lt;= 0) || (m_speed &gt; 20) )
1452 m_speed = 1;
1453 setFixedHeight( 6 );
1455 for( int i = 0; i &lt;= width(); i++ )
1456 preparePixmap( i );
1458 m_stepTimer = new QTimer( this );
1459 connect(m_stepTimer, SIGNAL(timeout()), this, SLOT(stepEvent()));
1460 m_stepTimer-&gt;start( 50 );
1463 RotWidget::~RotWidget()
1467 void RotWidget::stepEvent()
1469 // This is inefficient as we create too many pixmaps, optimize later.
1470 m_step += m_speed;
1471 if( m_step &gt; width() )
1472 m_step = 0;
1473 repaint( true );
1476 // Todo: Optimize drawing.
1477 void RotWidget::paintEvent( QPaintEvent *pe )
1479 QPainter p;
1480 p.begin( this );
1482 QRect r = pe-&gt;rect();
1484 if( m_stepPixmap.at( m_step ) )
1485 bitBlt( this, r.x(), r.y(), m_stepPixmap.at( m_step ), r.x(), r.y(), r.width(), r.height() );
1486 else
1487 p.fillRect( rect(), Qt::black );
1488 p.end();
1491 void RotWidget::resizeEvent( QResizeEvent *re )
1493 m_stepPixmap.clear();
1494 for( int i = 0; i &lt;= re-&gt;size().width(); i++ )
1495 preparePixmap( i );
1498 void RotWidget::preparePixmap( int step )
1500 if( step &lt; 0 )
1501 return;
1503 // Explicitly draw our first pixmap. The rest we will bitBlt() from here.
1504 if( step == 0 )
1506 KPixmap tmp; tmp.resize( size().width() / 2, size().height() );
1507 KPixmap tmp2(tmp);
1508 KPixmapEffect::gradient( tmp, m_color1, m_color2, KPixmapEffect::HorizontalGradient );
1509 KPixmapEffect::gradient( tmp2, m_color2, m_color1, KPixmapEffect::HorizontalGradient );
1510 KPixmap *px = new KPixmap( size() );
1511 QPainter p;
1512 p.begin( px );
1513 p.drawPixmap( 0, 0, tmp );
1514 p.drawPixmap( size().width()/2, 0, tmp2 );
1515 p.end();
1516 m_stepPixmap.append( px );
1518 else if( m_stepPixmap.at( step-1 ) )
1520 QPixmap *prev = m_stepPixmap.at( step-1 );
1521 QPixmap next; next.resize( size() );
1522 // convert
1523 // prev = "[------------]"
1524 // to
1525 // next = "------------]["
1526 bitBlt( &amp;next, 0, 0, prev, 1, 0, prev-&gt;width()-1, prev-&gt;height() );
1527 bitBlt( &amp;next, width()-1, 0, prev, 0, 0, 1, prev-&gt;height() );
1528 KPixmap *n = new KPixmap( next );
1529 m_stepPixmap.append( n );
1532 </programlisting>
1533 </sect1>
1534 </appendix>
1536 &documentation.index;
1537 </book>
1539 <!--
1540 Local Variables:
1541 mode: xml
1542 sgml-minimize-attributes:nil
1543 sgml-general-insert-case:lower
1544 sgml-indent-step:0
1545 sgml-indent-data:nil
1546 End:
1548 vim:tabstop=2:shiftwidth=2:expandtab