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">
9 <book lang=
"&language;">
13 >Руководство
&ksplash;</title>
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"
33 >dolphin210@yandex.ru
</email
37 >Перевод на русский
</contrib
39 ><othercredit role=
"translator"
47 >shafff@ukr.net
</email
51 >Обновление русского перевода
</contrib
61 >Teemu Rytilahti
</holder>
67 >Ravikiran Rajagopal
</holder>
70 >&FDLNotice;</legalnotice>
75 >1.01.00</releaseinfo>
79 >&ksplash; — симпатичный экран, показывающий процесс загрузки приложения
</para>
92 >splashscreen
</keyword>
99 <chapter id=
"introduction">
104 >&ksplash; — симпатичный экран, показывающий процесс загрузки приложения. Вопросы и пожелания отправляйте в списки рассылки
&kde;. Отличительные особенности
&ksplash;:
</para>
107 >Возможность применения тем
</member>
109 >Высокая гибкость в настройке обеспечивается использованием подключаемых модулей
</member>
111 >Программа может быть использована любым приложением, которое работает с DCOP
</member>
115 >Это руководство объясняет, как создавать темы для использования с уже доступными подключаемыми модулями. Если ни один из доступных модулей не удовлетворяет вашему вкусу, вы можете научиться полностью настраивать внешний вид
&ksplash;, создавая подключаемые модули на C++.
</para>
118 <chapter id=
"using-themes">
120 >Использование тем
</title>
123 >Чтобы использовать темы с
<ulink url=
"http://www.kde-look.org"
125 >, скопируйте их в
<filename
126 >~/.kde/apps/ksplash/Themes/
</filename
127 > (для одного пользователя) или в
<filename
130 >/share/apps/ksplash/Themes/
</filename
131 > (чтобы сделать их доступными для всех пользователей вашей системы).
</para>
134 >Чтобы сделать это автоматически, используйте модуль
<guilabel
135 >Экран загрузки
</guilabel
137 >Внешний вид
</guilabel
138 > Центра управления
&kde;.
</para>
140 <sect1 id=
"using-kcontrol-module">
142 >Модуль Центра управления
</title>
145 >Этот модуль позволяет устанавливать, тестировать и удалять темы
&ksplash;.
</para>
148 >Внизу расположен список доступных тем
&ksplash;. При выборе одной из последних, её предварительный просмотр появится в соответствующей части окна. Чтобы активировать тему, нажмите
<guibutton
151 >Применить
</guibutton
155 >Чтобы установить новые модули, нажмите
<guibutton
156 >Добавить...
</guibutton
157 >. Не нужно распаковывать файлы тем, они могут обрабатываться и в сжатом виде.
</para>
160 >Для просмотра анимации темы, нажмите кнопку
<guibutton
165 >Чтобы удалить тему, воспользуйтесь кнопкой
<guibutton
167 >. Если тема установлена для всех пользователей, то удалять её нужно с правами администратора. Также, мы не рекомендуем удалять тему
<guilabel
168 >по умолчанию
</guilabel
175 <chapter id=
"themes">
177 >Как создавать темы для
&ksplash;</title>
178 <sect1 id=
"themes-general">
180 >Основные положения
</title>
182 >Создавать свои собственные темы для
&ksplash; достаточно легко. Когда вы закончили свою тему, вы можете отослать её в
<ulink url=
"http://www.kde-look.org"
184 >, чтобы её могли использовать другие.
</para>
186 <sect2 id=
"theme-syntax">
188 >Определение своей темы
</title>
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
199 >, содержащий настройки темы. Вы можете установить множество особенностей для темы, изменить движок подключаемых модулей и т. д. Не обязательно использовать все доступные настройки, обычно используются только некоторые. Синтаксис записей файла
<filename
202 >[опция] = [значение]
</literal
203 >. В последующих секциях определяется множество опций.
</para>
207 >Простой файл
<filename
211 >[KSplash Theme: MyCoolTheme]
213 Description = Симпатичная тема, использующая движок XpLike
215 Author = Настоящее имя
<имя_пользователя@имя_сервера.домен
>
216 ## Use the XpLike engine for this theme.
219 Welcome Text = Загрузка KDE
224 >После того как вы задали имя, описание и автора темы, вам следует выбрать движок темы (подключаемый модуль). Затем вы сможете настроить разнообразные характеристики движка темы, устанавливая пары опция=значение, как в вышеприведённом файле.
</para>
227 >Важно чтобы имя папки, в которой хранятся файлы темы (
<filename class=
"directory"
228 >~/.kde/apps/ksplash/Themes/MyCoolTheme
</filename
229 >) и идентификатор (
<literal
230 >[KSplash Theme: MyCoolTheme]
</literal
237 <sect2 id=
"theme-files">
242 >При запуске
&ksplash; пытается найти файл фона, соответствующий текущему разрешению экрана (если файл используется движком темы). Формат названия файла фона:
<filename
243 >Background-
<replaceable
244 >WWWxHHH
</replaceable
249 >Например, вам надо использовать файл
<filename
250 >Background-
1024x768
</filename
251 >. Если файл, соответствующий текущему разрешению экрана, не найден, программа пытается изменить размер файла
<filename
252 >Background.png
</filename
253 > (или другого, заданного в
<filename
255 >) так, чтобы он соответствовал разрешению. Изменение размера
<quote
257 > занимает некоторое время, так что вам следует создать файлы как минимум для следующих разрешений экрана:
1280x1024,
1024x768 и
800x600.
</para>
261 <sect1 id=
"theme-engines">
263 >Опции движков тем
</title>
265 <sect2 id=
"standard-themes">
267 >Стандартная тема
</title>
270 >Опции стандартной темы
</title>
284 >Statusbar Position
</entry>
286 >[top/bottom]
</entry>
288 >Определяет расположение индикатора состояния на экране. Значение по умолчанию
— bottom (внизу).
</entry>
292 >Statusbar Visible
</entry>
294 >[true/false]
</entry>
296 >Определяет, будет ли индикатор состояния видимым. Значение по умолчанию
— true (истина).
</entry>
300 >Progress Visible
</entry>
302 >[true/false]
</entry>
304 >Определяет, будет ли показан прогресс загрузки. Значение по умолчанию
— true.
</entry>
309 >Statusbar Font
</entry>
311 >[название_шрифта]
</entry>
313 >Шрифт, используемый в индикаторе состояния (по умолчанию
— Helvetica).
</entry>
317 >Statusbar Font Size
</entry>
321 >Размер шрифта индикатора состояния (по умолчанию
— 16).
</entry>
325 >Statusbar Font Bold
</entry>
327 >[true/false]
</entry>
329 >Определяет, будет ли шрифт индикатора состояния полужирным (по умолчанию
— true).
</entry>
333 >Statusbar Font Italic
</entry>
335 >[true/false]
</entry>
337 >Определяет, будет ли шрифт индикатора состояния наклонным (по умолчанию -true).
</entry>
339 <!-- Misc. things -->
342 >Statusbar Foreground
</entry>
346 >Цвет переднего плана индикатора состояния. Значение по умолчанию
— white (белый).
</entry>
350 >Statusbar Background
</entry>
354 >Цвет фона индикатора состояния. Значение по умолчанию
— black (чёрный).
</entry>
358 >Statusbar Icon
</entry>
360 >[true/false]
</entry>
362 >Определяет, будет ли пиктограмма у индикатора состояния.
</entry>
366 >Icons Visible
</entry>
368 >[true/false]
</entry>
370 >Определяет, будут ли пиктограммы видимыми. Значение по умолчанию
— true.
</entry>
374 >Icons Jumping
</entry>
376 >[true/false]
</entry>
378 >Определяет, будут ли пиктограммы прыгающими. Значение по умолчанию
— true.
</entry>
382 >Icon Position
</entry>
384 >[
0-
3,
10-
13]
</entry>
386 >Расположение пиктограмм (по умолчанию
— вверху слева).
</entry>
390 >Splash Screen
</entry>
394 >Изменяет образ отображаемого экрана.
</entry>
401 <sect2 id=
"redmond-themes">
403 >Тема Redmond
</title>
406 >Опции темы Redmond
</title>
417 <!-- Main elements -->
420 >Background Image
</entry>
424 >Определяемый пользователем фоновый рисунок.
</entry>
432 >Название пиктограммы, отображаемой для пользователя. По умолчанию
— <constant
438 >Welcome Text
</entry>
442 >Текст, отображающийся на экране. По умолчанию
— "Добро пожаловать".
</entry>
446 >Username Text
</entry>
450 >Текст, замещающий имя пользователя.
</entry>
452 <!-- Positioning elements -->
455 >Welcome Text Position
</entry>
459 >Область экрана, в которой отображается текст приглашения (определяемый опцией Welcome Text).
</entry>
463 >Username Text Position
</entry>
467 >Область экрана, в которой отображается имя пользователя.
</entry>
471 >Action Text Position
</entry>
475 >Область экрана, в которой отображается текущее действие.
</entry>
479 >Icon Position
</entry>
483 >Область экрана, в которой отображается пиктограмма пользователя.
</entry>
485 <!-- Show to show.. -->
488 >Show Welcome Text
</entry>
490 >[true/false]
</entry>
492 >Определяет, будет ли отображаться текст приглашения (значение по умолчанию
— true).
</entry>
496 >Show Welcome Shadow
</entry>
498 >[true/false]
</entry>
500 >Определяет, будет ли отображаться тень текста приглашения (значение по умолчанию
— true).
</entry>
504 >Show Username
</entry>
506 >[true/false]
</entry>
508 >Определяет, будет ли отображаться имя пользователя (значение по умолчанию
— true).
</entry>
514 >[true/false]
</entry>
516 >Определяет, будет ли отображаться действие, выполняемое в данный момент. Значение по умолчанию
— true.
</entry>
522 >[true/false]
</entry>
524 >Определяет, будет ли отображаться пиктограмма. Значение по умолчанию
— true.
</entry>
528 >Use KDM User Icon
</entry>
530 >[true/false]
</entry>
532 >Определяет, будет ли использоваться пиктограмма, соответствующая пользователю при входе в систему. Значение по умолчанию
— true.
</entry>
539 <sect2 id=
"macx-themes">
544 >Опции темы MacX
</title>
557 >Icon Size Minimum
</entry>
561 >Минимальный размер пиктограммы (по умолчанию
— 16).
</entry>
565 >Icon Size Maximum
</entry>
569 >Максимальный размер пиктограммы (по умолчанию
— 64).
</entry>
573 >Optimized Icon Rendering
</entry>
575 >[true/false]
</entry>
577 >Будет ли оптимизироваться отрисовка пиктограмм (значение по умолчанию
— true).
</entry>
581 >Progress Bar Visible
</entry>
583 >[true/false]
</entry>
585 >По умолчанию
— true.
</entry>
589 >Progress Bar Position
</entry>
591 >[top/bottom]
</entry>
593 >Определяет расположение индикатора состояния (внизу или вверху). По умолчанию - bottom (внизу).
</entry>
597 >Icons Jumping
</entry>
599 >[true/false]
</entry>
601 >Определяет, будут ли пиктограммы прыгающими (по умолчанию
— false).
</entry>
608 <sect2 id=
"mac-classic-themes">
610 >Тема MacClassic
</title>
613 >Опции темы MacClassic
</title>
626 >Icon Position
</entry>
628 >[
0-
3,
10-
13]
</entry>
630 >Расположение пиктограмм на экране, по умолчанию
— внизу слева.
</entry>
634 >Icons Jumping
</entry>
636 >[true/false]
</entry>
638 >Определяет, будут ли пиктограммы прыгающими (по умолчанию
— false).
</entry>
642 >Icons Visible
</entry>
644 >[true/false]
</entry>
646 >Определяет, будут ли пиктограммы видимыми. Значение по умолчанию
— true.
</entry>
650 >Splash Screen
</entry>
654 >Изменяет образ отображаемого экрана.
</entry>
661 <sect2 id=
"themes-2k">
666 >Опции темы
2k
</title>
679 >Title Background Color
</entry>
683 >Фоновый цвет заголовка, по умолчанию
— dark blue (тёмно-синий).
</entry>
687 >Title Foreground Color
</entry>
691 >Цвет переднего плана заголовка. По умолчанию
— white (белый).
</entry>
695 >Status Text Color
</entry>
699 >Цвет текста состояния. По умолчанию соответствует фоновому тексту заголовка (определяемому опцией Title Background Color).
</entry>
703 >Rotator Color
1</entry>
707 >Определяет цвет индикатора
1. По умолчанию
— dark blue, тёмно-синий.
</entry>
711 >Rotator Color
2</entry>
715 >Определяет цвет индикатора
2, по умолчанию
— светло-серый (cyan).
</entry>
719 >Rotator Speed
</entry>
723 >Определяет скорость индикатора, по умолчанию
— 30.
</entry>
727 >Window Title
</entry>
731 >Определяет текст заголовка окна.
</entry>
739 >Определяет используемый логотип.
</entry>
748 <chapter id=
"from-other-applications">
750 >Использование
&ksplash; в вашем собственном приложении
</title>
753 >В этой главе описывается простой метод использования
&ksplash; в качестве окна-показателя загрузки в вашем приложении для
&kde;. Если вы не разрабатываете приложения для
&kde;, вы можете опустить эту главу.
</para>
755 <sect1 id=
"basic-other-reqs">
757 >Основные требования
</title>
760 >Ваше приложение
&kde; должно работать с
&DCOP;.
&DCOP; — это технология
&kde;, использующаяся для коммуникации между приложениями. Если вы используете
<ulink url=
"http://developer.kde.org"
761 >стандартную структуру приложения
&kde;</ulink
762 >, это обеспечивается автоматически. Чтобы получить информацию о
&DCOP; и связанных технологиях
&kde;, посетите
<ulink url=
"http://developer.kde.org"
763 >сайт разработчиков
&kde;</ulink
767 <sect1 id=
"other-using">
769 >Запуск
&ksplash;</title>
772 >До того, как ваше приложение начнёт вычисления, загрузку подключаемых модулей и т. д., запустите
&ksplash;. Образец:
</para>
775 >DCOPClient *c = kapp-
>dcopClient();
777 QCString KSplashName;
780 args
<< "--theme=MyCoolTheme" << "--managed";
781 if (kapp-
>startServiceByDesktopName(
"ksplash", args,
&error,
&KSplashName,
&pid))
783 KMessageBox::sorry(
0, error,
"Unable to invoke KSplash");
784 // Some error processing here.
789 >Мы предполагаем, что запущено только одно окно
&ksplash;. Другие случаи немного более сложны. Разъяснения см. в документации
&DCOP;.
</para>
792 <sect1 id=
"show-messages">
794 >Отображение сообщений
</title>
797 >Перед отображением сообщений вам необходимо установить число шагов. Например, процедура запуска
&kde; включает
7 этапов.
</para>
801 QDataStream arg(data,IO_WriteOnly);
802 arg
<< someNumber;
803 if (!(c-
>send(KSplashName,
"KSplashIface",
"setStartupItemCount(int)", data))
804 // Здесь проявляется некоторая ошибка.
808 >Если вы хотите, чтобы сообщение отображалось с пиктограммой или без неё, используйте
</para>
811 >arg
<< QString(
"название_пиктограммы")
<< QString(
"название_программы")
<< QString(
"некоторое описание");
812 if (!(c-
>send(KSplashName,
"KSplashIface",
"programStarted(QString,QString,QString)", data))
814 // Здесь проявляется некоторая ошибка.
819 >Каждый раз, когда вы вызываете
<constant
820 >programStarted
</constant
821 >, шаги заканчиваются. Когда ваша программа закончила запуск, выполните следующие команды, чтобы убрать экран загрузки:
</para>
824 >if (!(c-
>send(KSplashName,
"KSplashIface",
"startupComplete()", data))
826 // Здесь проявляется некоторая ошибка.
831 >Это всё, что вам необходимо, чтобы использовать все преимущества
&ksplash;.
</para>
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">
841 >Создание новых подключаемых модулей
&ksplash;</title>
844 >Создавать подключаемые модули
&ksplash; нетрудно. В этой главе мы напишем простой модуль, который эмулирует экран загрузки одной очень известной операционной системы. Предполагается, что вы знакомы с основами языка C++, и хотя бы немного
— с программированием для KDE/Qt.
</para>
846 <sect1 id=
"basic-requirements">
848 >Основные требования
</title>
850 >Мы создадим модуль с названием
<literal
852 >. Название используется во многих местах. Важно не исказить его, чтобы модуль был распознан
&ksplash;. Модули
&ksplash; являются динамически загружаемыми библиотеками со следующими объявлениями:
</para>
855 >Библиотеку следует называть по образцу:
<filename
856 >ksplash+название_темы_в_нижнем_регистре
</filename
857 >. В нашем случае название будет
<filename
861 >Тема должна иметь свой desktop-файл, который следует назвать
<filename
862 >ksplash+название_темы_в_нижнем_регистре.desktop
</filename
863 >. В нашем случае
— <filename
864 >ksplash2k.desktop
</filename
867 >Наконец, библиотека должна возвращать класс с названием
<literal
868 >Theme+название_темы
</literal
869 >, в нашем случае
— <literal
874 >Не беспокойтесь, если вы не поняли всё вышесказанное. Далее мы рассмотрим каждый шаг в деталях. Важной деталью является то, что класс модуля вы должны взять из
<literal
875 >ThemeEngine
</literal
878 <sect1 id=
"skeleton">
880 >Создание основы
</title>
882 >При создании модуля мы будем использовать основу для приложения
&kde;, которая обеспечит независимость от платформы во всех частях нашей работы. Убедитесь, что в вашей системе установлен пакет
<filename
884 >. Выполните команду
<literal
885 >kapptemplate
</literal
886 >, чтобы создать приложение с названием
"2k". Будет создана папка, содержащая основные файлы (такие как AUTHORS и т. п.). Нам нужен подкаталог
<filename class=
"directory"
888 >. Удалите все файлы в нём, и основа готова.
</para>
890 >На следующем этапе вы должны создать файл
<filename
892 >, который, после установки, сообщит
&ksplash;, что подключаемый модуль доступен. В соответствии с правилами наименования файлов, которые даны
<link linkend=
"basic-requirements"
893 >в предыдущей секции
</link
894 >, создайте файл
<filename
895 >ksplash2k.desktop
</filename
896 > (в каталоге /
2k). Он должен содержать следующие строки:
</para>
902 Comment=KSplash Plugin
904 ServiceTypes=KSplash/Plugin
905 X-KDE-Library=ksplash2k
906 X-KSplash-Default=true
907 X-KSplash-PluginName=
2k
908 X-KSplash-ObjectName=Theme2k
920 >ServiceTypes
</literal
921 > одинаковы для всех подключаемых модулей. Название модуля и библиотеки следуют вышеописанным правилам. Опция
<literal
922 >X-KSplash-Default
</literal
923 > может принимать одно из двух значений (true или false). Она определяет, будет ли этот модуль показан в Центре управления как модуль по умолчанию. За исключением некоторых очень редких случаев, его значение должно быть
<constant
927 <sect1 id=
"headerfile">
929 >Объявление класса подключаемого модуля
</title>
931 >Теперь, когда мы закончили подготовительную работу, начинается действительно интересная часть
— создание класса, который обеспечивает нужное поведение модуля. Хотя мы вольны делать с этим классом всё, что хотим, существует несколько ограничений.
</para>
935 >Классы модуля должны соответствовать классу
<constant
936 >ThemeEngine
</constant
941 >Классы модуля следует называть в соответствии с правилом:
<classname
942 >Тема+название_модуля
</classname
947 >Классы модуля должны обеспечивать
<literal
948 >статическую
</literal
949 > функцию с названием
<function
951 >, которая возвращает список названий, под которыми она может быть задействована.
</para
955 >Чтобы модуль можно было настраивать из Центра управления, он должен включать класс, основанный на классе
<literal
956 >ThemeEngineConfig
</literal
961 >Классы модуля должны перекрывать хотя бы одну из следующих виртуальных функций:
<function
962 >slotSetText
</function
964 >slotSetPixmap
</function
966 >slotUpdateProgress
</function
968 >slotUpdateSteps
</function
969 >, чтобы обеспечить возможность использования.
</para
973 >Разработчик должен использовать форму
<literal
974 >ThemeEngine( QWidget *parent, символьную постоянную *name, постоянную QStringList
&args )
</literal
975 >, чтобы модуль можно было использовать с
<classname
976 >KGenericFactory
</classname
981 >Последнее требование может показаться сложным, но, как мы увидим позже, вы можете обычно игнорировать его, добавив одну строку к исходным кодам.
</para>
983 <sect1 id=
"headercode">
985 >Код файла заголовка
</title>
987 >Присвоив значения константам, мы увидим, что файл заголовков
<filename
989 > приобретёт вид вроде этого:
</para>
996 >#ifndef __THEME2K_H__
997 #define __THEME2K_H__
999 #include
<qlabel.h
>
1000 #include
<qwidget.h
>
1002 #include
<kdialogbase.h
>
1003 #include
<kpixmap.h
>
1004 #include
<ksplash/themeengine.h
>
1008 class Cfg2k: public ThemeEngineConfig
1016 class Theme2k: public ThemeEngine
1020 Theme2k( QWidget *, const char *, const QStringList
& );
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()
1033 Names
<< "KSplash2k";
1034 Names
<< "ks2k";
1035 Names
<< "2k";
1036 Names
<< "2000";
1041 inline void slotSetText( const QString
& s )
1043 if( mText
&& mText-
>text() != s ) mText-
>setText( s );
1048 void readSettings();
1051 RotWidget *mRotator;
1052 QColor mTBgColor, mTFgColor, mRotColor1, mRotColor2, mStatusColor;
1054 QString mWndTitle, mLogoFile;
1061 >Давайте проанализируем вышеприведённое. Класс
<classname
1063 >, произведённый от
<classname
1064 >ThemeEngine
</classname
1065 > удовлетворяет объявлениям. Он обеспечивает метод
<methodname
1066 >Theme2k::names()
</methodname
1067 >, и имеет конструктор, который принимает необходимые параметры:
<function
1068 >Theme2k( QWidget *, const char *, const QStringList
& );
</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>
1081 <sect1 id=
"Implementation">
1083 >Реализация подключаемого модуля
</title>
1085 >Мы проверим только связанные части реализации. В приложении находится описание всей реализации. В первую очередь нам необходимо удовлетворить требованиям библиотеки:
</para>
1088 >Требования библиотеки
</title>
1090 >K_EXPORT_COMPONENT_FACTORY( ksplash2k, KGenericFactory
<Theme2k
> );
1094 >Объявление макроса
<constant
1095 >K_EXPORT_COMPONENT_FACTORY
</constant
1096 > содержится в файле
<filename
1097 >kgenericfactory.h
</filename
1098 >. Теперь перейдём к конструктору. Так как подключаемый модуль совсем прост, конструктор тоже несложен.
</para>
1101 >Конструктор подключаемого модуля
</title>
1103 >Theme2k::Theme2k( QWidget *parent, const char *name, const QStringList
&args )
1104 :ThemeEngine( parent, name, args )
1113 >readSettings()
</function
1114 > является иллюстрацией подходящего способа получить настройки темы (вы ведь хотите, чтобы люди могли использовать ваш модуль для своих тем?)
</para>
1117 >Получение настроек темы
</title>
1119 >void Theme2k::readSettings()
1124 KConfig *cfg = mTheme-
>themeConfig();
1128 cfg-
>setGroup( QString(
"KSplash Theme: %1").arg(mTheme-
>theme()) );
1130 QColor DefaultTBgColor( Qt::darkBlue );
1131 QColor DefaultTFgColor( Qt::white );
1133 mTBgColor = cfg-
>readColorEntry(
"Title Background Color",
&DefaultTBgColor );
1134 mTFgColor = cfg-
>readColorEntry(
"Title Foreground Color",
&DefaultTFgColor );
1135 mStatusColor = cfg-
>readColorEntry(
"Status Text Color",
&mTBgColor );
1137 QColor DefaultRot1( Qt::darkBlue );
1138 QColor DefaultRot2( Qt::cyan );
1139 mRotColor1 = cfg-
>readColorEntry(
"Rotator Color 1",
&DefaultRot1 );
1140 mRotColor2 = cfg-
>readColorEntry(
"Rotator Color 2",
&DefaultRot2 );
1142 mRotSpeed = cfg-
>readNumEntry(
"Rotator Speed",
30 );
1143 mWndTitle = cfg-
>readEntry(
"Window Title", i18n(
"Please wait...") );
1144 mLogoFile = cfg-
>readEntry(
"Logo File", QString::null );
1149 >Так как мы работаем для пользователей, следует обеспечить подходящие настройки по умолчанию для параметров, которые не представлены в файле темы. Обратите внимание, что группу следует устанавливать следующим образом:
"KSplash Theme: название_темы", чтобы обеспечить совместимость с будущими спецификациями темы. Метод
<function
1151 > не представляет большого интереса, он просто организует элементы графического интерфейса. Детали см. в приложении.
</para>
1153 <sect1 id=
"compilingfile">
1155 >Компиляция подключаемого модуля
</title>
1157 >Для компиляции модуля мы решили использовать основу
&kde;, поэтому необходимо создать файл
<filename
1158 >Makefile.am
</filename
1159 >. Он должен выглядеть следующим образом:
</para>
1163 >Makefile.am
</filename
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
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
1186 >Чтобы получить дальнейшую информацию по созданию
<filename
1187 >Makefile.am
</filename
1188 >, загляните на
<ulink url=
"http://developer.kde.org/documentation/other/makefile_am_howto.html"
1190 > разработчиков
&kde;. Заметим, что мы создаём тему по умолчанию, основанную на этом модуле, и прилагаем к нему графический файл фона. В качестве жеста вежливости по отношению к пользователям создайте файл
<filename
1192 >, являющийся примером использования опций.
</para>
1198 >Вопросы и ответы
</title>
1199 &reporting.bugs; &updating.documentation;
<qandaset id=
"faqlist">
1203 >Я не могу найти ни одной темы, которая работала бы с
&ksplash;. Почему?
</para>
1207 >Возможно, у вас нет соответствующих подключаемых модулей для тем. Модули содержатся в пакете
<literal
1208 >kde-artwork
</literal
1209 >. Скачайте, установите его и попытайтесь запустить темы снова.
</para>
1215 >Что такое файл
<filename
1217 > и как его создать?
</para>
1223 > — это файл, где вы можете задать настройки темы. Информация по нему находится в разделе
<link linkend=
"themes"
1224 >Как создавать темы для
&ksplash;</link
1231 <chapter id=
"credits">
1233 >Благодарности и лицензирование
</title>
1239 >Авторские права на программу принадлежат
© 2003 &Ravikiran.Rajagopal; &Ravikiran.Rajagopal.mail;
</para>
1243 >Помощь в разработке
</title>
1246 >&Brian.C.Ledbetter; &Brian.C.Ledbetter.mail;
</para>
1251 >Документация
© 2003 &Teemu.Rytilahti; &Teemu.Rytilahti.mail;
</para>
1252 &underFDL; &underGPL; </chapter>
1254 <appendix id=
"installation">
1258 <sect1 id=
"requirements">
1260 >Системные требования
</title>
1263 >Чтобы иметь возможность использовать возможности
&ksplash; вам необходим оконный менеджер
&kde; версии
3.2 или выше. Если тема не работает, свяжитесь с её автором, чтобы выяснить, где можно взять подходящий подключаемый модуль.
</para>
1267 <sect1 id=
"compilation">
1269 >Сборка и установка
</title>
1270 &install.compile.documentation;
</sect1>
1272 <appendix id=
"srccode">
1274 >Исходные коды
</title>
1275 <sect1 id=
"theme2kcpp">
1278 >theme2k.cpp
</filename
1281 >#include
<qlabel.h
>
1282 #include
<qwidget.h
>
1284 #include
<kapplication.h
>
1285 #include
<kconfig.h
>
1286 #include
<kdebug.h
>
1287 #include
<kdialogbase.h
>
1288 #include
<kgenericfactory.h
>
1289 #include
<kglobalsettings.h
>
1290 #include
<klocale.h
>
1291 #include
<ksplash/objkstheme.h
>
1292 #include
<kstandarddirs.h
>
1294 #include
"rotwidget.h"
1295 #include
"theme2k.h"
1296 #include
"theme2k.moc"
1298 K_EXPORT_COMPONENT_FACTORY( ksplash2k, KGenericFactory
<Theme2k
> );
1300 Cfg2k::Cfg2k( KConfig * )
1303 Theme2k::Theme2k( QWidget *parent, const char *name, const QStringList
&args )
1304 :ThemeEngine( parent, name, args )
1310 void Theme2k::initUi()
1312 QVBox *vbox = new QVBox( this );
1313 vbox-
>setFrameShape( QFrame::WinPanel );
1314 vbox-
>setFrameShadow( QFrame::Raised );
1316 QHBox *labelBox = new QHBox( vbox );
1317 labelBox-
>setPalette( mTBgColor );
1318 labelBox-
>setMargin(
1 );
1319 QLabel *lbl = new QLabel( mWndTitle, labelBox );
1320 lbl-
>setFont( QFont(
"Arial",
12, QFont::Bold ) );
1321 lbl-
>setPaletteForegroundColor( mTFgColor );
1323 QLabel *logo = new QLabel( vbox );
1324 logo-
>setPalette( Qt::white );
1326 QString px( locate(
"appdata", mTheme-
>themeDir() + (mLogoFile.isNull()?QString(
"/Logo.png"):mLogoFile) ) );
1328 px = locate(
"appdata",
"Themes/Default/splash_top.png");
1332 logo-
>setPixmap( pix );
1336 logo-
>setText(
"<B>KDE</B>2000" );
1337 logo-
>setAlignment( AlignCenter|AlignVCenter );
1340 mRotator = new RotWidget( vbox, mRotColor1, mRotColor2, mRotSpeed );
1342 QHBox *hbox = new QHBox( vbox );
1343 labelBox-
>setSpacing(
4 );
1344 labelBox-
>setMargin(
4 );
1346 mText = new QLabel( hbox );
1347 mText-
>setPaletteForegroundColor( mStatusColor );
1348 mText-
>setPaletteBackgroundColor( mTFgColor );
1349 mText-
>setText( mWndTitle );
1350 mText-
>setFixedHeight(
48 );
1352 setFixedSize( vbox-
>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()
1363 KConfig *cfg = mTheme-
>themeConfig();
1367 cfg-
>setGroup( QString(
"KSplash Theme: %1").arg(mTheme-
>theme()) );
1369 QColor DefaultTBgColor( Qt::darkBlue );
1370 QColor DefaultTFgColor( Qt::white );
1372 mTBgColor = cfg-
>readColorEntry(
"Title Background Color",
&DefaultTBgColor );
1373 mTFgColor = cfg-
>readColorEntry(
"Title Foreground Color",
&DefaultTFgColor );
1374 mStatusColor = cfg-
>readColorEntry(
"Status Text Color",
&mTBgColor );
1376 QColor DefaultRot1( Qt::darkBlue );
1377 QColor DefaultRot2( Qt::cyan );
1378 mRotColor1 = cfg-
>readColorEntry(
"Rotator Color 1",
&DefaultRot1 );
1379 mRotColor2 = cfg-
>readColorEntry(
"Rotator Color 2",
&DefaultRot2 );
1381 mRotSpeed = cfg-
>readNumEntry(
"Rotator Speed",
30 );
1382 mWndTitle = cfg-
>readEntry(
"Window Title", i18n(
"Please wait...") );
1383 mLogoFile = cfg-
>readEntry(
"Logo File", QString::null );
1387 <sect1 id=
"rotwidgeth">
1390 >rotwidget.h
</filename
1393 >#ifndef __ROTWIDGET_H__
1394 #define __ROTWIDGET_H__
1396 #include
<qlabel.h
>
1397 #include
<qtimer.h
>
1398 #include
<qwidget.h
>
1400 #include
<kdialogbase.h
>
1401 #include
<kpixmap.h
>
1404 * @short Display a rotating-gradient widget.
1406 class RotWidget: public QWidget
1410 RotWidget( QWidget *, const QColor
&, const QColor
&, int );
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
<KPixmap
> m_stepPixmap;
1431 <sect1 id=
"rotwidgetcpp">
1434 >rotwidget.cpp
</filename
1437 >#include
<kdebug.h
>
1438 #include
<kdialogbase.h
>
1439 #include
<kpixmapeffect.h
>
1441 #include
<qlabel.h
>
1442 #include
<qpainter.h
>
1443 #include
<qwidget.h
>
1445 #include
"rotwidget.h"
1446 #include
"rotwidget.moc"
1448 RotWidget::RotWidget( QWidget *parent, const QColor
& c1, const QColor
& c2, int sp )
1449 :QWidget(parent), m_color1(c1), m_color2(c2), m_step(
0), m_speed(sp)
1451 if( (m_speed
<=
0) || (m_speed
> 20) )
1453 setFixedHeight(
6 );
1455 for( int i =
0; i
<= width(); i++ )
1458 m_stepTimer = new QTimer( this );
1459 connect(m_stepTimer, SIGNAL(timeout()), this, SLOT(stepEvent()));
1460 m_stepTimer-
>start(
50 );
1463 RotWidget::~RotWidget()
1467 void RotWidget::stepEvent()
1469 // This is inefficient as we create too many pixmaps, optimize later.
1471 if( m_step
> width() )
1476 // Todo: Optimize drawing.
1477 void RotWidget::paintEvent( QPaintEvent *pe )
1482 QRect r = pe-
>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() );
1487 p.fillRect( rect(), Qt::black );
1491 void RotWidget::resizeEvent( QResizeEvent *re )
1493 m_stepPixmap.clear();
1494 for( int i =
0; i
<= re-
>size().width(); i++ )
1498 void RotWidget::preparePixmap( int step )
1503 // Explicitly draw our first pixmap. The rest we will bitBlt() from here.
1506 KPixmap tmp; tmp.resize( size().width() /
2, size().height() );
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() );
1513 p.drawPixmap(
0,
0, tmp );
1514 p.drawPixmap( size().width()/
2,
0, tmp2 );
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() );
1523 // prev =
"[------------]"
1525 // next =
"------------]["
1526 bitBlt(
&next,
0,
0, prev,
1,
0, prev-
>width()-
1, prev-
>height() );
1527 bitBlt(
&next, width()-
1,
0, prev,
0,
0,
1, prev-
>height() );
1528 KPixmap *n = new KPixmap( next );
1529 m_stepPixmap.append( n );
1536 &documentation.index;
1542 sgml-minimize-attributes:nil
1543 sgml-general-insert-case:lower
1545 sgml-indent-data:nil
1548 vim:tabstop=2:shiftwidth=2:expandtab