diff options
Diffstat (limited to 'tde-i18n-ru/docs/kdebase/ksplashml/index.docbook')
-rw-r--r-- | tde-i18n-ru/docs/kdebase/ksplashml/index.docbook | 1629 |
1 files changed, 1629 insertions, 0 deletions
diff --git a/tde-i18n-ru/docs/kdebase/ksplashml/index.docbook b/tde-i18n-ru/docs/kdebase/ksplashml/index.docbook new file mode 100644 index 00000000000..9ff7e3e7924 --- /dev/null +++ b/tde-i18n-ru/docs/kdebase/ksplashml/index.docbook @@ -0,0 +1,1629 @@ +<?xml version="1.0" ?> +<!DOCTYPE book PUBLIC "-//KDE//DTD DocBook XML V4.2-Based Variant V1.1//EN" +"dtd/kdex.dtd" [ + <!ENTITY kappname "&ksplash;"> + <!ENTITY package "kdebase"> + <!ENTITY % addindex "IGNORE"> + <!ENTITY % Russian "INCLUDE"> +]> + +<book lang="&language;"> + +<bookinfo> +<title +>Руководство пользователя &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 +>Иван</firstname +><surname +>Кашуков</surname +><affiliation +><address +><email +>dolphin210@yandex.ru</email +></address +></affiliation +><contrib +>Перевод на русский язык</contrib +></othercredit +><othercredit role="translator" +><firstname +>Николай</firstname +><surname +>Шафоростов</surname +><affiliation +><address +><email +>shafff@ukr.net</email +></address +></affiliation +><contrib +>Обновление перевода</contrib +></othercredit +> <othercredit role="translator" +><firstname +>Виктор</firstname +><surname +>Ерёмин </surname +><affiliation +><address +><email +>ErV2005@rambler.ru</email +></address +></affiliation +><contrib +>Перевод на русский язык</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; — симпатичный экран, показывающий процесс загрузки среды KDE.</para> +</abstract> + +<keywordset> +<keyword +>KDE</keyword> +<keyword +>kdebase</keyword> +<keyword +>ksplash</keyword> +<keyword +>ksplashml</keyword> +<keyword +>заставка</keyword> +<keyword +>украшение</keyword> +</keywordset> + +</bookinfo> + +<chapter id="introduction"> +<title +>Введение</title> + +<para +>&ksplash; — симпатичный экран, показывающий процесс загрузки KDE. Вопросы и пожелания отправляйте в списки рассылки &kde;. Отличительные особенности &ksplash;: </para> +<simplelist> +<member +>Возможность применения тем</member> +<member +>Высокая гибкость в настройке обеспечивается использованием подключаемых модулей</member> +<member +>Программа может быть использована любым приложением, которое работает с DCOP</member> +</simplelist> + +<para +>Это руководство объясняет, как создавать темы для использования с уже доступными подключаемыми модулями. Если ни один из доступных модулей не удовлетворяет вашему вкусу, вы можете научиться полностью настраивать внешний вид &ksplash;, создавая подключаемые модули на C++. </para> +</chapter> + +<chapter id="using-themes"> +<title +>Использование тем</title> + +<para +>Чтобы использовать темы с <ulink url="http://www.kde-look.org" +>KDE-Look</ulink +>, скопируйте их в <filename +>~/.kde/apps/ksplash/Themes/</filename +> (для одного пользователя) или в <filename +>$<envar +>KDEDIR</envar +>/share/apps/ksplash/Themes/</filename +> (чтобы сделать их доступными для всех пользователей вашей системы).</para> + +<para +>Чтобы сделать это автоматически, используйте модуль <guilabel +>Заставка</guilabel +> раздела <guilabel +>Внешний вид и темы</guilabel +> Центра управления &kde;.</para> + +<sect1 id="using-kcontrol-module"> +<title +>Модуль Центра управления</title> + +<para +>Этот модуль позволяет устанавливать, проверять и удалять темы &ksplash;.</para> + +<para +>Внизу расположен список доступных тем &ksplash;. При выборе одной из последних, её предварительный просмотр появится в соответствующей части окна. Чтобы активировать тему, нажмите <guibutton +>OK</guibutton +> или <guibutton +>Применить</guibutton +>.</para> + +<para +>Чтобы установить новые модули, нажмите <guibutton +>Добавить...</guibutton +>. Не нужно распаковывать файлы тем, они могут обрабатываться и в сжатом виде.</para> + +<para +>Для просмотра анимации темы, нажмите кнопку<guibutton +>Тест</guibutton +>.</para> + +<para +>Чтобы удалить тему, воспользуйтесь кнопкой <guibutton +>Удалить</guibutton +>. Если тема установлена для всех пользователей, то удалять её нужно с правами администратора. Также, мы не рекомендуем удалять тему «<guilabel +>По умолчанию</guilabel +>».</para> + +</sect1> + +</chapter> + +<chapter id="themes"> +<title +>Как создавать темы для &ksplash;</title> +<sect1 id="themes-general"> +<title +>Основные положения</title> +<para +>Создавать свои собственные темы для &ksplash; достаточно легко. Когда вы закончили свою тему, вы можете отправить её на <ulink url="http://www.kde-look.org" +>KDE-Look</ulink +>, чтобы её могли использовать другие.</para> + +<sect2 id="theme-syntax"> +<title +>Определение своей темы</title> + +<para +>Давайте создадим тему под названием <literal +>MyCoolTheme</literal +>. Чтобы тема была найдена &ksplash;, следует поместить её в папку <filename class="directory" +>MyCoolTheme</filename +> в папке <filename class="directory" +>~/.kde/apps/ksplash/Themes/</filename +>. В ней должен содержаться файл <filename +>Theme.rc</filename +>, содержащий настройки темы. Вы можете установить множество особенностей для темы, изменить движок подключаемых модулей и т. д. Не обязательно использовать все доступные параметры, обычно используются только некоторые. Синтаксис записей файла <filename +>Theme.rc</filename +>: <literal +>[параметр] = [значение]</literal +>. Параметры описаны в следующих разделах.</para> + +<example> +<title +>Простой файл <filename +>Theme.rc</filename +></title> +<programlisting +>[KSplash Theme: MyCoolTheme] +Name = MyCoolTheme +Description = Симпатичная тема, использующая движок XpLike +Version = 1.0 +Author = Имя автора <realmail@mail.com> +## Используйте движок XpLike для этой темы. +Engine = XpLike +Show Icon = false +Welcome Text = Загрузка KDE +</programlisting> +</example> + +<para +>После того как вы задали имя, описание и автора темы, вам следует выбрать движок темы (подключаемый модуль). Затем вы сможете настроить разнообразные характеристики движка темы, устанавливая пары параметр=значение, как в вышеприведённом файле.</para> + +<important> +<para +>Важно, чтобы имя папки, в которой хранятся файлы темы (<filename class="directory" +>~/.kde/apps/ksplash/Themes/MyCoolTheme</filename +> в данном примере) и идентификатор (<literal +>[KSplash Theme: MyCoolTheme] </literal +> в данном примере) в <filename +>Theme.rc</filename +> совпадали. В противном случае, &ksplash; не распознает тему.</para> +</important> + +</sect2> + +<sect2 id="theme-files"> +<title +>Файлы фона</title> + +<para +>При запуске &ksplash; пытается найти файл фона, соответствующий текущему разрешению экрана (если файл используется движком темы). Формат названия файла фона: <filename +>Background-<replaceable +>WWWxHHH</replaceable +>.png</filename +>, где WWW-ширина, а HHH-высота изображения.</para> + +<para +>Например, вам надо использовать файл <filename +>Background-1024x768</filename +>. Если файл, соответствующий текущему разрешению экрана, не найден, программа пытается изменить размер файла <filename +>Background.png</filename +> (или другого, заданного в <filename +>Theme.rc</filename +>) так, чтобы он соответствовал разрешению. Изменение размера <quote +>на лету</quote +> занимает некоторое время, так что вам следует создать файлы как минимум для следующих разрешений экрана: 1280x1024, 1024x768 и 800x600.</para> +</sect2> +</sect1> + +<sect1 id="theme-engines"> +<title +>Параметры движков тем</title> + +<sect2 id="default-themes"> +<title +>Тема, используемая по умолчанию</title> +<table> +<title +>Настройка темы по умолчанию</title> +<tgroup cols="3"> +<tbody> +<row> +<entry +>Параметр</entry> +<entry +>Значение</entry> +<entry +>Описание</entry> +</row> +<!-- Statusbar --> +<row> +<entry +>Always Show Progress</entry> +<entry +>[true/false]</entry> +<entry +>Определяет, будет ли показан прогресс загрузки. Значение по умолчанию — true.</entry> +</row> +<row> +<entry +>Label Foreground</entry> +<entry +>[цвет]</entry> +<entry +>Цвет текста индикатора состояния. Значение по умолчанию — white (белый, #FFFFFF).</entry> +</row> +<!-- Misc. things --> +<row> +<entry +>Icons Flashing</entry> +<entry +>[true/false]</entry> +<entry +>Определяет, будут ли мерцать значки. По умолчанию — true (да).</entry> +</row> +</tbody> +</tgroup> +</table> +</sect2> + +<sect2 id="standard-themes"> +<title +>Стандартная тема</title> +<table> +<title +>Параметры стандартной темы</title> +<tgroup cols="3"> +<tbody> +<row> +<entry +>Параметр</entry> +<entry +>Значение</entry> +<entry +>Описание</entry> +</row> +<!-- Statusbar --> +<row> +<entry +>Statusbar Position</entry> +<entry +>[top/bottom]</entry> +<entry +>Определяет расположение индикатора состояния на экране. Значение по умолчанию — bottom (внизу).</entry> +</row> +<row> +<entry +>Statusbar Visible</entry> +<entry +>[true/false]</entry> +<entry +>Определяет, будет ли индикатор состояния видимым. Значение по умолчанию — true (да).</entry> +</row> +<row> +<entry +>Progress Visible</entry> +<entry +>[true/false]</entry> +<entry +>Определяет, будет ли показан прогресс загрузки. Значение по умолчанию — true.</entry> +</row> +<!-- Fonts --> +<row> +<entry +>Statusbar Font</entry> +<entry +>[шрифт]</entry> +<entry +>Шрифт, используемый в индикаторе состояния. Значение по умолчанию — Helvetica.</entry> +</row> +<row> +<entry +>Statusbar Font Size</entry> +<entry +>[размер]</entry> +<entry +>Размер шрифта индикатора состояния. Значение по умолчанию — 16 пт.</entry> +</row> +<row> +<entry +>Statusbar Font Bold</entry> +<entry +>[true/false]</entry> +<entry +>Определяет, будет ли шрифт индикатора состояния полужирным. Значение по умолчанию — true (да).</entry> +</row> +<row> +<entry +>Statusbar Font Italic</entry> +<entry +>[true/false]</entry> +<entry +>Определяет, будет ли шрифт индикатора состояния курсивным. Значение по умолчанию — false (нет).</entry> +</row> +<!-- Misc. things --> +<row> +<entry +>Statusbar Foreground</entry> +<entry +>[цвет]</entry> +<entry +>Цвет переднего плана индикатора состояния. Значение по умолчанию — white (белый).</entry> +</row> +<row> +<entry +>Statusbar Background</entry> +<entry +>[цвет]</entry> +<entry +>Цвет фона индикатора состояния. Значение по умолчанию — black (чёрный).</entry> +</row> +<row> +<entry +>Statusbar Icon</entry> +<entry +>[true/false]</entry> +<entry +>Определяет, будет ли значок у индикатора состояния.</entry> +</row> +<row> +<entry +>Icons Visible</entry> +<entry +>[true/false]</entry> +<entry +>Определяет, будут ли значки видимыми. Значение по умолчанию — true (да).</entry> +</row> +<row> +<entry +>Icons Jumping</entry> +<entry +>[true/false]</entry> +<entry +>Определяет, будут ли прыгать значки. Значение по умолчанию — true (да).</entry> +</row> +<row> +<entry +>Icon Position</entry> +<entry +>[0-3, 10-13]</entry> +<entry +>Расположение значков. Значение по умолчанию — вверху слева.</entry> +</row> +<row> +<entry +>Splash Screen</entry> +<entry +>[название]</entry> +<entry +>Название заставки.</entry> +</row> +</tbody> +</tgroup> +</table> +</sect2> + +<sect2 id="redmond-themes"> +<title +>Тема Redmond</title> +<table> +<title +>Параметры темы Redmond</title> +<tgroup cols="3"> +<tbody> +<row> +<entry +>Параметр</entry> +<entry +>Значение</entry> +<entry +>Описание</entry> +</row> +<!-- Main elements --> +<row> +<entry +>Background Image</entry> +<entry +>[имя_файла]</entry> +<entry +>Определяемое пользователем фоновое изображение.</entry> +</row> +<row> +<entry +>User Icon</entry> +<entry +>[имя_значка]</entry> +<entry +>Имя значка пользователя. Значение по умолчанию — <constant +>go</constant +>.</entry> +</row> +<row> +<entry +>Welcome Text</entry> +<entry +>[текст]</entry> +<entry +>Текст, показываемый на экране. Значение по умолчанию — «Добро пожаловать».</entry> +</row> +<row> +<entry +>Username Text</entry> +<entry +>[текст]</entry> +<entry +>Текст, замещающий имя пользователя.</entry> +</row> +<!-- Positioning elements --> +<row> +<entry +>Welcome Text Position</entry> +<entry +>[x,y]</entry> +<entry +>Область экрана, в которой показывается текст приглашения (определяемый параметром «Welcome Text»).</entry> +</row> +<row> +<entry +>Username Text Position</entry> +<entry +>[x,y]</entry> +<entry +>Область экрана, в которой показывается имя пользователя.</entry> +</row> +<row> +<entry +>Action Text Position</entry> +<entry +>[x,y]</entry> +<entry +>Область экрана, в которой показывается текущее действие.</entry> +</row> +<row> +<entry +>Icon Position</entry> +<entry +>[x,y]</entry> +<entry +>Область экрана, в которой показывается значок пользователя.</entry> +</row> +<!-- Show to show.. --> +<row> +<entry +>Show Welcome Text</entry> +<entry +>[true/false]</entry> +<entry +>Определяет, будет ли показываться текст приглашения. Значение по умолчанию — true (да).</entry> +</row> +<row> +<entry +>Show Welcome Shadow</entry> +<entry +>[true/false]</entry> +<entry +>Определяет, будет ли показываться тень под текстом приглашения. Значение по умолчанию — true (да).</entry> +</row> +<row> +<entry +>Show Username</entry> +<entry +>[true/false]</entry> +<entry +>Определяет, будет ли показываться имя пользователя. Значение по умолчанию — true (да).</entry> +</row> +<row> +<entry +>Show Action</entry> +<entry +>[true/false]</entry> +<entry +>Определяет, будет ли показываться действие, выполняемое в данный момент. Значение по умолчанию — true (да).</entry> +</row> +<row> +<entry +>Show Icon</entry> +<entry +>[true/false]</entry> +<entry +>Определяет, будет ли показываться значок пользователя. Значение по умолчанию — true (да).</entry> +</row> +<row> +<entry +>Use KDM User Icon</entry> +<entry +>[true/false]</entry> +<entry +>Определяет, будет ли использоваться значок, соответствующий пользователю при входе в систему. Значение по умолчанию — true (да).</entry> +</row> +</tbody> +</tgroup> +</table> +</sect2> + +<sect2 id="macx-themes"> +<title +>Тема MacX</title> +<table> +<title +>Параметры темы MacX</title> +<tgroup cols="3"> +<tbody> +<row> +<entry +>Параметр</entry> +<entry +>Значение</entry> +<entry +>Описание</entry> +</row> +<row> +<entry +>Icon Size Minimum</entry> +<entry +>[размер]</entry> +<entry +>Минимальный размер значков. Значение по умолчанию — 16 пикселей.</entry> +</row> +<row> +<entry +>Icon Size Maximum</entry> +<entry +>[размер]</entry> +<entry +>Максимальный размер значков. Значение по умолчанию — 64 пикселя.</entry> +</row> +<row> +<entry +>Optimized Icon Rendering</entry> +<entry +>[true/false]</entry> +<entry +>Будет ли оптимизироваться отрисовка значков. Значение по умолчанию — true (да).</entry> +</row> +<row> +<entry +>Progress Bar Visible</entry> +<entry +>[true/false]</entry> +<entry +>По умолчанию — true (да).</entry> +</row> +<row> +<entry +>Progress Bar Position</entry> +<entry +>[top/bottom]</entry> +<entry +>Определяет расположение индикатора состояния (внизу или вверху). По умолчанию - bottom (внизу).</entry> +</row> +<row> +<entry +>Icons Jumping</entry> +<entry +>[true/false]</entry> +<entry +>Определяет, будут ли прыгать значки. Значение по умолчанию — false (нет).</entry> +</row> +</tbody> +</tgroup> +</table> +</sect2> + +<sect2 id="mac-classic-themes"> +<title +>Тема MacClassic</title> +<table> +<title +>Параметры темы MacClassic</title> +<tgroup cols="3"> +<tbody> +<row> +<entry +>Параметр</entry> +<entry +>Значение</entry> +<entry +>Описание</entry> +</row> +<row> +<entry +>Icon Position</entry> +<entry +>[0-3, 10-13]</entry> +<entry +>Расположение значков на экране. Значение по умолчанию — внизу слева.</entry> +</row> +<row> +<entry +>Icons Jumping</entry> +<entry +>[true/false]</entry> +<entry +>Определяет, будут ли прыгать значки. Значение по умолчанию — false (нет).</entry> +</row> +<row> +<entry +>Icons Visible</entry> +<entry +>[true/false]</entry> +<entry +>Определяет, будут ли значки видимыми. Значение по умолчанию — true (да).</entry> +</row> +<row> +<entry +>Splash Screen</entry> +<entry +>[название]</entry> +<entry +>Название заставки.</entry> +</row> +</tbody> +</tgroup> +</table> +</sect2> + +<sect2 id="themes-2k"> +<title +>Тема 2k</title> +<table> +<title +>Параметры темы 2k</title> +<tgroup cols="3"> +<tbody> +<row> +<entry +>Параметр</entry> +<entry +>Значение</entry> +<entry +>Описание</entry> +</row> +<row> +<entry +>Title Background Color</entry> +<entry +>[цвет]</entry> +<entry +>Фоновый цвет заголовка. Значение по умолчанию — dark blue (тёмно-синий).</entry> +</row> +<row> +<entry +>Title Foreground Color</entry> +<entry +>[цвет]</entry> +<entry +>Цвет переднего плана заголовка. Значение по умолчанию — white (белый).</entry> +</row> +<row> +<entry +>Status Text Color</entry> +<entry +>[цвет]</entry> +<entry +>Цвет текста состояния. По умолчанию соответствует фоновому тексту заголовка (определяемому параметром «Title Background Color»).</entry> +</row> +<row> +<entry +>Rotator Color 1</entry> +<entry +>[цвет]</entry> +<entry +>Определяет цвет индикатора 1. Значение по умолчанию — dark blue (тёмно-синий).</entry> +</row> +<row> +<entry +>Rotator Color 2</entry> +<entry +>[цвет]</entry> +<entry +>Определяет цвет индикатора 2. Значение по умолчанию — cyan (циан).</entry> +</row> +<row> +<entry +>Rotator Speed</entry> +<entry +>[значение]</entry> +<entry +>Определяет скорость индикатора. Значение по умолчанию — 30.</entry> +</row> +<row> +<entry +>Window Title</entry> +<entry +>[текст]</entry> +<entry +>Определяет текст заголовка окна.</entry> +</row> +<row> +<entry +>Logo File</entry> +<entry +>[имя_файла]</entry> +<entry +>Определяет используемый логотип.</entry> +</row> +</tbody> +</tgroup> +</table> +</sect2> +</sect1> +</chapter> + +<chapter id="from-other-applications"> +<title +>Использование &ksplash; в вашем собственном приложении</title> + +<para +>В этой главе описывается простой метод использования &ksplash; в качестве заставки для вашего приложения &kde;. Если вы не разрабатываете приложения для &kde;, вы можете опустить эту главу.</para> + +<sect1 id="basic-other-reqs"> +<title +>Основные требования</title> + +<para +>Ваше приложение &kde; должно работать с &DCOP;. &DCOP; — это технология &kde;, использующаяся для коммуникации между приложениями. Если вы используете <ulink url="http://developer.kde.org" +>стандартную структуру приложения &kde;</ulink +>, это обеспечивается автоматически. Чтобы получить информацию о &DCOP; и связанных технологиях &kde;, посетите <ulink url="http://developer.kde.org" +>сайт разработчиков &kde;</ulink +>.</para> +</sect1> + +<sect1 id="other-using"> +<title +>Запуск &ksplash;</title> + +<para +>До того, как ваше приложение начнёт вычисления, загрузку подключаемых модулей и т.д., запустите &ksplash;. Образец:</para> + +<programlisting +>DCOPClient *c = kapp->dcopClient(); +QString error; +QCString KSplashName; +int pid = 0; +QStringList args; +args << "--theme=MyCoolTheme" << "--managed"; +if (kapp->startServiceByDesktopName("ksplash", args, &error, +&KSplashName, &pid)) +{ + KMessageBox::sorry(0, error, "Невозможно запустить KSplash"); + //обработка ошибок. +} +</programlisting> + +<para +>Мы предполагаем, что запущено только одно окно &ksplash;. Другие случаи немного более сложны. Разъяснения смотрите в документации &DCOP;.</para> +</sect1> + +<sect1 id="show-messages"> +<title +>Показ сообщений</title> + +<para +>Перед показом сообщений вам необходимо установить число шагов. Например, процедура запуска &kde; включает 7 этапов.</para> + +<programlisting +>QByteArray data; + QDataStream arg(data,IO_WriteOnly); + arg << someNumber; + if (!(c->send(KSplashName, "KSplashIface", "setStartupItemCount(int)", +data)) + // Обработка ошибок. +</programlisting> + +<para +>Если вы хотите, чтобы сообщение связывалось с соответствующим значком или без него, используйте</para> + +<programlisting +>arg << QString("имя_значка") << QString("название_программы") << +QString("какое-то описание"); + if (!(c->send(KSplashName, "KSplashIface", +"programStarted(QString,QString,QString)", data)) + { + // Обработка ошибок. + } +</programlisting> + +<para +>Каждый раз, когда вы вызываете <constant +>programStarted</constant +>, шаги заканчиваются. Когда ваша программа закончила запуск, выполните следующие команды, чтобы убрать заставку:</para> + +<programlisting +>if (!(c->send(KSplashName, "KSplashIface", "startupComplete()", data)) + { + // Обработка ошибок. + } +</programlisting> + +<para +>Это всё, что вам необходимо, чтобы использовать все преимущества &ksplash;.</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 +>Создание новых подключаемых модулей &ksplash;</title> + +<para +>Создавать подключаемые модули &ksplash; нетрудно. В этой главе мы напишем простой модуль, который эмулирует экран загрузки одной очень известной операционной системы. Предполагается, что вы знакомы с основами языка C++ и хотя бы немного — с программированием для KDE/Qt.</para> + +<sect1 id="basic-requirements"> +<title +>Основные требования</title> +<para +>Мы создадим модуль с названием <literal +>2k</literal +>. Название используется во многих местах. Важно не исказить его, чтобы модуль был распознан &ksplash;. Модули &ksplash; являются динамически загружаемыми библиотеками со следующими объявлениями: </para> +<simplelist> +<member +>Библиотеку следует называть по образцу: <filename +>ksplash+название_темы_в_нижнем_регистре</filename +>. В нашем случае название будет <filename +>ksplash2k</filename +>.</member> +<member +>Тема должна иметь свой файл desktop, который следует назвать <filename +>ksplash+название_темы_в_нижнем_регистре.desktop</filename +>. В нашем случае — <filename +>ksplash2k.desktop</filename +>. </member> +<member +>Наконец, библиотека должна возвращать класс с названием <literal +>Theme+название_темы</literal +>, в нашем случае — <literal +>Theme2k</literal +>.</member> +</simplelist> +<para +>Не беспокойтесь, если вы не поняли всё вышесказанное. Далее мы рассмотрим каждый шаг в деталях. Важной деталью является то, что класс модуля вы должны взять из <literal +>ThemeEngine</literal +>. </para> +</sect1> +<sect1 id="skeleton"> +<title +>Создание основы</title> +<para +>При создании модуля мы будем использовать основу для приложения &kde;, которая обеспечит независимость от платформы во всех частях нашей работы. Убедитесь, что в вашей системе установлен пакет <filename +>kdesdk</filename +>. Выполните команду <literal +>kapptemplate</literal +>, чтобы создать приложение с названием "2k". Будет создана папка, содержащая основные файлы (такие как AUTHORS и т.п.). Нам нужна подпапка <filename class="directory" +>2k</filename +>. Удалите все файлы в ней, и основа готова. </para> +<para +>На следующем этапе вы должны создать файл <filename +>.desktop</filename +>, который, после установки, сообщит &ksplash;, что подключаемый модуль доступен. В соответствии с правилами наименования файлов, которые даны <link linkend="basic-requirements" +>в предыдущей секции</link +>, создайте файл <filename +>ksplash2k.desktop</filename +>. Он должен содержать следующие строки: </para> +<programlisting +><literal> +[Desktop Entry] +Encoding=UTF-8 +Type=Service +Comment=KSplash Plugin +Name=KSplash2k +ServiceTypes=KSplash/Plugin +X-KDE-Library=ksplash2k +X-KSplash-Default=true +X-KSplash-PluginName=2k +X-KSplash-ObjectName=Theme2k +</literal +> +</programlisting> +<para +>Параметры <literal +>Encoding</literal +>, <literal +>Type</literal +>, <literal +>Comment</literal +> и <literal +>ServiceTypes</literal +> одинаковы для всех подключаемых модулей. Название модуля и библиотеки следуют вышеописанным правилам. Параметр <literal +>X-KSplash-Default</literal +> может принимать одно из двух значений (true или false). Он определяет, будет ли этот модуль показан в Центре управления KDE. За исключением некоторых очень редких случаев, его значение должно быть <constant +>true</constant +>. </para> +</sect1> +<sect1 id="headerfile"> +<title +>Объявление класса подключаемого модуля</title> +<para +>Теперь, когда мы закончили подготовительную работу, начинается действительно интересная часть — создание класса, который обеспечивает нужное поведение модуля. Хотя мы вольны делать с этим классом всё, что хотим, существует несколько ограничений.</para> +<orderedlist> +<listitem +><para +>Классы модуля должны наследоваться от класса <constant +>ThemeEngine</constant +>.</para +></listitem> +<listitem +><para +>Классы модуля следует называть в соответствии с правилом: <classname +>Theme+название_модуля</classname +>.</para +></listitem> +<listitem +><para +>Классы модуля должны обеспечивать <literal +>статическую</literal +> функцию с названием <function +>names</function +>, которая возвращает список названий, под которыми она может быть задействована.</para +></listitem> +<listitem +><para +>Чтобы модуль можно было настраивать из Центра управления KDE, он должен включать класс, основанный на классе <literal +>ThemeEngineConfig</literal +>.</para +></listitem> +<listitem +><para +>Классы модуля должны перекрывать хотя бы одну из следующих виртуальных функций: <function +>slotSetText</function +>, <function +>slotSetPixmap</function +>, <function +>slotUpdateProgress</function +> и <function +>slotUpdateSteps</function +>, чтобы обеспечить возможность использования.</para +></listitem> +<listitem +><para +>Разработчик должен создать конструктор <literal +>ThemeEngine( QWidget *parent, const char *name, const QStringList &args )</literal +>, чтобы модуль можно было использовать из <classname +>KGenericFactory</classname +>.</para +></listitem> +</orderedlist> +<para +>Последнее требование может показаться сложным, но, как мы увидим позже, вы можете обычно игнорировать его, добавив одну строку к исходному коду.</para> +</sect1> +<sect1 id="headercode"> +<title +>Код файла заголовка</title> +<para +>Присвоив значения константам, мы увидим, что файл заголовков <filename +>theme2k.h</filename +> приобретёт вид вроде этого:</para> +<example> +<title +>Файл <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( KConfig * ); +}; + +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( KConfig *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 +>Давайте проанализируем вышеприведённое. Класс <classname +>Theme2k</classname +>, унаследованный от <classname +>ThemeEngine</classname +> удовлетворяет объявлениям. Он обеспечивает метод <methodname +>Theme2k::names()</methodname +>, и имеет конструктор, который принимает необходимые параметры: <function +>Theme2k( QWidget *, const char *, const QStringList& );</function +>, и к тому же обеспечивает простой метод <methodname +>Theme2k::slotSetText()</methodname +>. На данном этапе вам не следует беспокоиться насчёт класса <classname +>RotWidget</classname +>. Это небольшой элемент графического интерфейса, который делает программу более наглядной для пользователя. Наш подключаемый модуль очень прост: он не показывает ни значков, ни индикатора загрузки. Если вы хотите использовать значки, перекройте функцию <function +>slotSetPixmap</function +>. Подобные функции есть для установки индикатора загрузки (<function +>slotUpdateSteps</function +>) и увеличения счётчика (<function +>slotUpdateProgress</function +>) текущего шага. </para> +</sect1> +<sect1 id="Implementation"> +<title +>Реализация подключаемого модуля</title> +<para +>Мы проверим только связанные части реализации. В приложении находится описание всей реализации. В первую очередь нам необходимо удовлетворить требованиям библиотеки:</para> +<example> +<title +>Требования библиотеки</title> +<programlisting +>K_EXPORT_COMPONENT_FACTORY( ksplash2k, KGenericFactory<Theme2k> ); +</programlisting> +</example> +<para +>Объявление макроса <constant +>K_EXPORT_COMPONENT_FACTORY</constant +> содержится в файле <filename +>kgenericfactory.h</filename +>. Теперь перейдём к конструктору. Так как подключаемый модуль совсем прост, конструктор тоже несложен.</para> +<example> +<title +>Конструктор подключаемого модуля</title> +<programlisting +>Theme2k::Theme2k( QWidget *parent, const char *name, const QStringList &args + ) + :ThemeEngine( parent, name, args ) +{ + readSettings(); + initUi(); +} +</programlisting> +</example> +<para +>Метод <function +>readSettings()</function +> является иллюстрацией подходящего способа получить параметры темы (вы ведь хотите, чтобы люди могли использовать ваш модуль для своих тем?)</para> +<example> +<title +>Получение параметров темы</title> +<programlisting +>void Theme2k::readSettings() +{ + if( !mTheme ) + return; + + KConfig *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 +>Так как мы работаем для пользователей, следует обеспечить подходящие параметры по умолчанию для параметров, которые не представлены в файле темы. Обратите внимание, что группу следует устанавливать следующим образом: "KSplash Theme: название_темы", чтобы обеспечить совместимость с будущими спецификациями темы. Метод <function +>initUI()</function +> не представляет большого интереса, он просто организует элементы графического интерфейса. Детали указаны в приложении. </para> +</sect1> +<sect1 id="compilingfile"> +<title +>Компиляция подключаемого модуля</title> +<para +>Для компиляции модуля мы решили использовать основу &kde;, поэтому необходимо создать файл <filename +>Makefile.am</filename +>. Он должен выглядеть следующим образом:</para> +<example> +<title +>Файл <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_KDEUI) -lksplashthemes + +METASOURCES = AUTO + +noinst_HEADERS = theme2k.h rotwidget.h + +servicesdir = $(kde_servicesdir) +services_DATA = ksplash2k.desktop + +themedir = $(kde_datadir)/ksplash/Themes/2k +theme_DATA = Theme.rc Preview.png +</programlisting> +</example> +<para +>Чтобы получить дальнейшую информацию по созданию <filename +>Makefile.am</filename +>, загляните на <ulink url="http://developer.kde.org/documentation/other/makefile_am_howto.html" +>веб-сайт</ulink +> разработчиков &kde;. Заметим, что мы создаём тему по умолчанию, основанную на этом модуле, и прилагаем к нему графический файл фона. В качестве жеста доброй воли по отношению к пользователям создайте файл <filename +>Theme.rc</filename +>, иллюстрирующий примеры использования различных параметров.</para> +</sect1> +</chapter> + +<chapter id="faq"> +<title +>Вопросы и ответы</title> +&reporting.bugs; &updating.documentation; <qandaset id="faqlist"> +<qandaentry> +<question> +<para +>Я не могу найти ни одной темы, которая работала бы с &ksplash;. Почему?</para> +</question> +<answer> +<para +>Возможно, у вас нет соответствующих подключаемых модулей для тем. Модули содержатся в пакете <literal +>kdeartwork</literal +>. Скачайте, установите его и попытайтесь запустить темы снова.</para> +</answer> +</qandaentry> +<qandaentry> +<question> +<para +>Что такое файл <filename +>Theme.rc</filename +> и как его создать?</para> +</question> +<answer> +<para +><filename +>Theme.rc</filename +> — это файл, где вы можете задать параметры темы. Информация по нему находится в разделе <link linkend="themes" +>Как создавать темы для &ksplash;</link +>. </para> +</answer> +</qandaentry> +</qandaset> +</chapter> + +<chapter id="credits"> +<title +>Благодарности и лицензирование</title> + +<para +>&ksplash;</para> + +<para +>Программа: © &Ravikiran.Rajagopal; &Ravikiran.Rajagopal.mail;, 2003.</para> + +<itemizedlist> +<title +>Помощь в разработке</title> +<listitem +><para +>&Brian.C.Ledbetter; &Brian.C.Ledbetter.mail;</para> +</listitem> +</itemizedlist> + +<para +>Документация: © &Teemu.Rytilahti; &Teemu.Rytilahti.mail;, 2003.</para> +&underFDL; &underGPL; </chapter> + +<appendix id="installation"> +<title +>Установка</title> + +<sect1 id="requirements"> +<title +>Системные требования</title> + +<para +>Чтобы иметь возможность использовать возможности &ksplash; вам необходим &kde; версии 3.2 или выше. Если тема не работает, свяжитесь с её автором, чтобы выяснить, где можно взять подходящий подключаемый модуль.</para> + +</sect1> + +<sect1 id="compilation"> +<title +>Сборка и установка</title> +&install.compile.documentation; </sect1> +</appendix> +<appendix id="srccode"> +<title +>Исходные коды</title> +<sect1 id="theme2kcpp"> +<title +>Файл <filename +>theme2k.cpp</filename +></title> +<programlisting +>#include <qlabel.h> +#include <qwidget.h> + +#include <kapplication.h> +#include <kconfig.h> +#include <kdebug.h> +#include <kdialogbase.h> +#include <kgenericfactory.h> +#include <kglobalsettings.h> +#include <klocale.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( KConfig * ) +{} + +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(KGlobalSettings::splashScreenDesktopGeometry()); + move( rect.x() + (rect.width() - size().width())/2, + rect.y() + (rect.height() - size().height())/2 ); +} + +void Theme2k::readSettings() +{ + if( !mTheme ) + return; + + KConfig *cfg = mTheme->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 +>Файл <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 +>Файл <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 +--> |