Help:Howto/Разработка скинов для Modern Contact List

From Miranda NG
Jump to navigation Jump to search
Important
Todo:
Некоторая информация может оказаться устаревшей.

Основные понятия

В основу скин-движка положены следующие определения и понятия:

  • объект — элемент скина. Все объекты скина создаются при загрузке модуля. Объект описывает что и каким образом необходимо нарисовать на соответствующий запрос.
  • глиф (glyph) — некоторый рисунок. В настоящий момент поддерживаются форматы BMP, JPG и PNG (c прозрачностью). Размеры глифа определяются размерами рисунка. Изображение глифа загружается в память только при первой попытке нарисовать его и остаётся в памяти до выгрузки модуля или загрузки нового скина.
  • правило — строка с условиями отбора объекта.
  • запрос — требование нарисовать соответствующий объект, который удовлетворяет запрашиваемой строке в соответствии с правилами в определённом месте и с указанными размерами.

Алгоритм работы

Принцип работы следующий:

  1. При необходимости нарисовать некоторый объект окна, модуль формирует запрос. Запрос содержит координаты прямоугольника, в котором необходимо нарисовать объект. Но наиболее важным параметром является «строка запроса».
  2. Получив запрос, движок ищет в списке первое правило, под которое подойдёт переданная строка запроса и выбирает соответствующий найденному правилу объект.
  3. Если найденный объект относится к типу «сплошная заливка» то в ответ на запрос указанный рисунок заполняется соответствующим цветом и прозрачностью. Если же объект является глифом, то прямоугольник заполняется трансформированным по размерам до размеров требуемого прямоугольника глифом.

Правила и строки запросов, принцип отбора объектов

Правило состоит из следующих частей:

  1. Порядковый номер правила
  2. Имя соответствующего правилу объекта
  3. Набор параметров правила разделённые запятыми

Каждый параметр состоит из

  • имени параметра
  • условия (соответствует (=) и не соответствует (^)).
  • проверяемого значения параметра

Строка запроса имеет те же части, что и правила, за исключением порядкового номера.

Строка запроса и правило считаются подходящими друг другу если:

  1. Все параметры правила есть в запросе.
  2. Все значения параметров правила с условием «соответствует (=)» соответствуют значениям этих параметров в запросе, а также все значения параметров правила с условием «не соответствует (^)» не соответствуют значениям этих параметров в запросе.

Значение параметра правила может быть задано в виде маски содержащей символы: «*» — любое количество (в том числе и отсутствие) любых символов и «?» — один любой символ. Длина имён параметров и значений не могут превышать 24 символа. Значения не могут содержать знак «запятая» (заменяется на «точка»). Имена параметров и их значения чувствительны к регистру букв. Имя первого параметра не указывается и всегда равно «Module».

Масштабирование (трансформация) глифов

Рассмотрим следующий пример. Необходимо нарисовать глиф размером 70х70 в прямоугольнике размером 100х100. Зададим ширину четырех полей для глифа: лево, верх, право и низ.

Эти поля делят рисунок глифа на 9 частей:

  1. 4 угла
  2. 4 края
  3. центр

Glyph.png

При трансформации:

  1. Угловые части глифа рисуются в прямоугольнике назначения «как есть» без изменений размеров.
  2. Краевые части рисуются масштабированными в соответствии с заданным режимом вдоль своего края. Перпендикулярный к краю размер не изменяется.
  3. Центр масштабируется по обоим направлениям.

После трансформации (режим StretchBoth):

Glyph (stretched).png

Режимов трансформации четыре:

  1. StretchBoth – растянуть по обоим направлениям.
  2. TileHorz – мозаика по горизонтали, растянуть по вертикали.
  3. TileVert – мозаика по вертикали, растянуть по горизонтали.
  4. TileBoth – мозаика по обоим направлениям.

Формат скина

Скин представляет собой совокупность файла описания скина (.msf) и папки с необходимыми графическими ресурсами. Имя папки должно быть таким же, как и имя файла описателя без расширения. Внутри файла описателя ссылки на графические ресурсы идут без указания путей.

Файл описатель имеет структуру полностью аналогичную ini файлам. Все описания могут быть напрямую импортированы в базу. Формат файла следующий:

[имя_секции_базы данных]
; комментарий
;комментарий
  КлючСекции=#Значение
  КлючСекции2=#Значение2

Здесь вместо знака «#» подразумевается указание одного из типов значения ключа:

  1. «b» - BYTE – один байт
  2. «w» - WORD – слово, два байта
  3. «d» - DWORD – двойное слово, четыре байта
  4. «s» - STRING – произвольная текстовая строка

Все данные об объектах скина хранятся в секции базы данных [ModernSkin] в ключах строкового типа.

Описание объектов

Скин состоит из нескольких частей. Первая из них описывает объекты. Объект описывается следующим образом:

$имя_объекта=sGlyph,тип_объекта,параметры,…

  • имя_объкта – собственно имя объекта, используемое при ссылке из правил
  • тип_объекта – один из типов Image или Solid
  • параметры,… – перечень параметров порядок которых определяется в зависимости от типа объекта:

для типа Solid:
$имя_объекта=sGlyph,Solid,RedValue,GreenValue,BlueValue,AlphaValue

для типа Image:
$имя_объекта=sGlyph,Image,File_Name,Fit_Mode,Left,Top,Right,Bottom,AlphaValue

где RedValue, GreenValue, BlueValue, AlphaValue – интенсивности соответственно красного, зеленого, синего и канала прозрачности.
File_Name – имя файла рисунка с расширением, без пути, сам рисунок должен находится в одноименной с описателем папке.
Fit_Mode – один из режимов трансформации: StretchBoth, TileHorz, TileVert, TileBoth.
Left, Top, Right, Bottom – поля трансформации.

Примеры:
$window=sGlyph,Image,back.bmp,TileBoth,1,1,1,1,150
$closed_miranda_group=sGlyph,Solid,0,0,255,200

Описание правил

Вторая часть описывает правила. Правило описывается следующим образом:

@номер_правила=s$имя_объекта:знач_парам_Module,имя_парам=значение,имя_парам^значение …

Здесь: номер_правила – число. Номера правил должны начинаться с 0 и идти без пропусков.

Примеры:
@0=s$window:Main,ID=Background
@1=s$closed_miranda_group:CL,ID=Row,Type=Group,Open^True,Name=Mir*a*

Соответственно объект $window (рисунок back.bmp) будет нарисован если строка запроса будет содержать первым параметром «Main» и значение параметра «ID» будет равно «Background».

Объект $closed_miranda_group (заливка синим с прозрачностью 200) будет нарисован если зарос будет содержать первый параметр «CL», «ID» равным «Row», «Type» равным «Group», параметр «Open» НЕ равным «True» и параметр «Name» подходящим под маску «Mir*a*» (например «Miranda-NG»).

Описание кнопок

Третья часть описывает кнопки

; Format is (Push type): #name=sPush,ServiceNameToCall,fromLeft,fromTop,fromRight,fromBottom,TopLeftCornerRelativeTo,BottomRightCornerRelativeTo,MinWindowWidth,MinWindowHeigh,HintText

Таблица имен и значений параметров формируемых модулем

Параметр Допустимые значения Описание
Module Main Основные объекты окна
ID Background

StatusBar

FrameCaption

Фон окна

Фон статусной строки

Фон заголовка фрейма

ID ScrollBar Полоса прокрутки
Part Back

UpLineButton

Элементы полосы прокрутки: фон, кнопки вверх и вниз, ползунок
DownLineButton

Thumb

Module CL Объекты списка
ID Row Модуль формирует запрос на рисование каждой строки списка контактов с ключом ID=Row
Type Group

Contact

MetaContact

SubContact

Divider

Info

Тип строки списка контактов, группа, контакт, мета- или субконтакт, разделитель отключенных или информационный контакт (например «все контакты» на настройке «Игнорировать»)
GroupPos

SubPos

First

First-Single

Middle

Last

Положение группы/контакта в родительской группе.

Для субконтакта: GroupPos — положение родительского метаконтата в группе, SubPos — положение субконтакта в метаконтакте

Open

Selected

Hot

Odd

True

False

Развернутость, выбраннось, подсвеченность, нечётность строки
Index

Indent

Number Номер строки в списке

Уровень вложения

Status OFFLINE

ONLINE

Статус контакта
Protocol

Name

GroupName

text Имена протокола, текст строки и имя родительской группы (запятая заменяется на точку).
ID GreyAlternate

Selection

HotTracking

После запроса на рисование фона под строкой идет дополнительный запрос на отрисовку: нечетности, выделения и подсветки.
Module MButton Модуль кнопок
ID text Имя кнопки (без знака #)
Down

Hovered

0

1

Кнопка может быть нажата и подсвечена