FAQ: Переделка скина для начинающих

Учкун

Профи в Сат-ТВ
По просьбе fanbox исключительно для форума уважаемого мной spartak73 выкладываю свой FAQ для начинающих по модификации скинов для себя.
С некоторыми названиями терминов, примененными в FAQ в данный момент я сам не соглашусь (так как теперь-то поднаторел в питоне) но все по сути правильно.......


FAQ: Переделка скина для начинающих​

Решил написать некий FAQ по модификации скинов под себя, простым понятным языком для начинающих.
То есть для тех, кто никогда не занимался программированием, не изучал никаких языков программирования, даже Turbo Pascal, вобщем для тех у кого нет никаких навыков в этом деле, но у них скажем имеется во-первых ресивер на enigma2 и плюс желание переделать скины под себя. Также разумеется у них должно быть немалое свободное время для этого)))

Сразу хочу сказать, если вы более-менее профессионал и знаете толк в программировании, лучше не читайте эту тему и занимайтесь дальше своим путем. Потому как не найдете здесь тексты, испещренные правильными техническими терминами и понятные вам, но совершенно непонятные для начинающих.
Также и в ситуации наоборот, если ваши мозги устроены совершенно по-другому и еще когда-то в детстве ну никак не могли запомнить-выучить таблицу умножения, вам поверьте тоже не стоит терять свое время. Ну просто другие у вас в жизни интересы, просто устанавливайте скины от других как есть и радуйтесь. Вам в этой теме тоже делать нечего.

Для остальных же начну с подробного объяснения простым языком структуры скина, но дойдем также до того, какие конвертера и рендеры, с какими параметрами и какую информацию могут вывести (не только с примерами кода, но и примерами со скриншотами).....

Для начала я все-таки посоветовал бы начинающим прочесть все же статью в Википедии про XML. Конечно вам совершенно непонятны будут многие термины там, но это очень полезно. Во-первых, хотите-не хотите что-то останется в вашей памяти уже, во-вторых по ходу прочтения данной темы все больше будете вникать и информация от википедии будет как нельзя кстати.
http://ru.wikipedia.org/wiki/XML


Итак, начнем.

Все настройки всех скинов содержатся в одном единственном файле - это skin.xml. Все остальные файлы в скине только вспомогательные - это графические файлы используемые в качестве подложки для тех или иных диалоговых окон, иконки и так далее. Правда некоторые скины имеют еще при себе и собственный плагин для применения переменных настроек в скине.

Таким образом если придете к выводу, что файл skin.xml и есть сам скин, можно сказать это так и есть.
Для того, чтобы легче понять структуру этого файла, представьте себе русскую матрешку.
Точно также, как в русской матрешке в файле скина есть главная матрешка и много вложенных в нее матрешек.
Вот от этой строчки

Код:
<skin>

до этой строчки

Код:
</skin>

это и есть главная матрешка или скин или технически говоря - корневой элемент.

Вложенные матрешки (вложенные элементы) идут от главной отступом.
То есть строчка с отступом (табуляцией) обозначает, что данный элемент является вложенным.
Единственное отличие от матрешки, вложенных элементов вовсе не один.....

Итак выяснили что у скина есть много вложенных элементов, у которых в свою очередь свои вложенные элементы, а у тех опять-таки возможно свои вложенные и так далее.

Итак, у нас образовалось незыблимое правило:
Отступ в коде скина обозначает - что данный элемент (который идет с отступом) является вложенным в свой родительский вышестоящий элемент (который в строчке вверху) и работает только (и только) в пределах своего родительского элемента. И если вы при редактировании нарушите этот отступ, данный элемент перестанет быть вложенным в свой родительский, а станет вложенным в еще более вышестоящий элемент и в итоге вы получите зеленку в определенном диалоговом окне или при определенном действии.

У самого скина только два типа вложенных элементов плюс комментарии. Комментарии - это строки начинающиеся с вот таких знаков

Код:
<!--

и заканчивающиеся так

Код:
-->

Либо начинающиеся со знака решетки.
Комментарии не обрабатываются парсером, их программер пишет только для облегчения прочтения кода или для какого-нибудь объявления, например чтобы заявить свои права на этот труд..... Комментарии можете безболезненно удалять или редактировать как вам угодно, естественно не трогая данные знаки (если редактируете).... Тут кроме моральных, других правил нет....

Первый тип элемента непосредственно скина - объявления. Они идут обязательно в начале скина.
Что такое объявления в скине?
Это всего лишь обозначение цветов (colors) и шрифтов (fonts), примененных в элементах скина.
Шрифты - указывается их название в системной папке (/usr/share/fonts/), либо указывается путь к шрифту, если его в имидже нет, а применяется только в данном скине.

Еще одно незыблымое правило.
Так вот, если вы где-нибудь в каком-нибудь элементе скина примените шрифт или цвет, отсутствующий в этих самих объявлениях, то зеленка вам обеспечена или в случае с опенпли вечный перегруз........

Второй (основной) тип вложенных элементов в корневой элемент скина - это диалоговые окна, скрины (screen).
Это конечно инфобары, всякие меню, диалоговые окна плагинов, сообщения системы и так далее.
Все они идут с отступом от корневого элемента и начинаются так

Код:
<screen name="Element">

и заканчиваются так

Код:
</screen>

Тут же надо сказать еще об одном незыблимом правиле.
Любые элементы (вложенные куда угодно) обязательно должны иметь начальный
Код:
<element .........>
и конечный
Код:
</element>
теги. Обратный слеш является обозначением конечного тега.
Если здесь что-то не так, опять-таки невалидный документ и зеленка....


Ну и уже в этих скринах - Screen (диалоговое окно) имеются свои вложенные элементы - виджеты, графика и тексты.
Графика - epixmap, это картинки и иконки в теле диалогового окна, что будет видно на экране.
Здесь важны технически характеристики картинок. Имидж понимает только определенные биты и цветность. Если имидж посчитает эти технические характеристики неприемлемыми (а у разных имиджей это может быть разные требования), то сколько не пытайтесь, вы эту картинку на экран не выведете...

Тексты - eLabel, это пометка, чаще всего это просто статические тексты, выводимые в диалоговом окне, например это может быть оглавление окна....

А виджеты (widget) - это элементы, выводящие различную информацию (в том числе картинки, пиконы...) на экран. Начиная от статического текста до переменной информации.
То есть просто при помощи конвертера или рендера вы не выведете ту или иную информацию в экран. Вы обязаны вложить это дело в тело виджета, придав ему соответствующие атрибуты....

Тут мы подходим как-раз таки к атрибутам. Любой элемент в скине сообщает информацию о себе имиджу через свои атрибуты.
Например свое местоположение на экране, что он выводит на экран и так далее...

Далее, в продолжении FAQ начнем разбираться в скине в обратном порядке. То есть сначала разберемся в атрибутах и их свойствах.....

Продолжение следует.....

---------- Сообщение добавлено в 13:24 ---------- Предыдущее сообщение размещено в 13:22 ----------

Продолжим

Любой элемент через свои атрибуты сообщает имиджу информацию о себе.
Посмотрим вот такой элемент в скине, который просто выводит статический текст на экран.

Код:
<eLabel text="Green Panel" zPosition="2" position="80,30" size="450,36" font="Replacement;28" halign="left" valign="center" foregroundColor="un3ab297" backgroundColor="transpBlack" transparent="1" />

Набравшись опыта, быстро разберетесь в таком коде, и прочтете, что это элемент Пометка (eLabel) выводящий надпись (текст) Green Panel на участке размером 450,36 в диалоговом окне (смотри родительский элемент) с координатами 80,30, шрифт текста такой-то, цвет текста такой-то с выравниванием к левому краю участка....

Пока же разберемся в атрибутах.

text="Green Panel" поняли это просто текст, если он идет внутри элемента eLabel, значит просто выводится на экран.

zPosition - загадочный для начинающих атрибут. Обозначает в каком слое этот элемент находится.
То есть, представьте трехмерное пространство, где x - это позиция по горизонтали, y - по вертикали, а z - в глубину (если минус) или в выпуклости (если плюс).
Думаю представили и поняли, что если присвоить одному элементу значение zPosition равный ="-2", а второму значение ="2", то второй элемент будет находиться в более верхнем слое, чем первый. И если вы не разведете эти элементы по горизонтали и вертикали, то второй элемент будет перекрывать первый.
Рассмотрим на примере. По данному коду видно, что два текстовых элемента находяться в одном и том же месте родительского элемента, но с разными значениями zPosition.

Код:
<eLabel text="Install extensions" position="200,350" zPosition="-1" size="400,34" font="Regular;28" halign="center" transparent="1" />
<eLabel text="Information" position="200,350" zPosition="0" size="300,34" font="Regular;28" halign="center" foregroundColor="red" transparent="1" />


Отсюда вывод, второй элемент должен перекрывать первый элемент (то есть быть как бы сверху) при условии прозрачности второго элемента.
Смотрим скриншот, так и есть

bc77b2d21d4e.jpg



position - атрибут, который указывает элементу его позицию внутри родительского элемента по горизонтали (первая цифра) и по вертикали (вторая цифра).
Координаты привязаны в левом верхнем углу элемента.
То есть если допустим это позиция какого-то скрина (диалогового окна), тогда например position="80,30" будет означать, что левый верхний угол данного элемента будет находиться в 80 единицах от левого края экрана, и в 30 единицах от верхнего края экрана.
Если же этот элемент является вложенным в скрине (например в нашем случае), то тогда левый верхний угол данного элемента будет находиться в 80 единицах от левого края скрина (а не экрана - не путать!), и в 30 единицах от верхнего края скрина.

size - понятное дело размеры данного элемента.

font - шрифт текста, напоминаю, должен быть объявлен в начале скина.

halign - это словосочетание из двух слов horizontal и align, обозначающее горизонтальное выравнивание.
Может иметь три значения:

center
left
right


Значение center будет означать, что текст будет выравнен по центру выделенного участка этому элементу. Допустим в данном случае длина текста составила 300 единиц (зависит от шрифта), а длина участка выделенного элементу составляет (из атрибута size="450,36") 450 единиц, соответственно от левого и правого краев выделенного участка текст будет находиться на расстоянии 75 единиц.

Значение left будет означать, что текст будет привязан к левому краю выделенного участка этому элементу.

Значение right будет означать, что текст будет привязан к правому краю выделенного участка этому элементу.


valign - соответственно является атрибутом, указывающим элементу те же самые позиции, но уже по вертикали.
Имеет также три значения
center
top
bottom


transparent="1" - атрибут, определяющий прозрачность фона элемента, единица будет означать полную прозрачность (в пределах выделенного ему участка).
Значение 0 соответственно наоборот. Здесь конечно есть нюансы. Если в элементе есть вложенные элементы (например конвертер), который не поддерживает
прозрачность, тогда этот параметр бесполезен. Элемент в любом случае будет непрозрачен....

Конечно атрибутов, которые могут иметь элементы еще много, но эти самые распространенные, а остальные будем изучать по мере их применения....
Далее начнем рассматривать на конкретных примерах виджетов, работу с конвертерами и рендерами (далее компоненты), какие параметры может воспринимать тот или иной компонент и какую информацию в каком виде они выводят. И как эти параметры прописать в виджетах. Постараюсь также простым языком объяснить, как открыть конвертер и прочитать при всех этих непонятных кодах параметры ввода-вывода. Постараюсь со скриншотами.
Продолжение следует.....
 
Последнее редактирование:

Учкун

Профи в Сат-ТВ
Прежде чем приступить к рассмотрению компонентов еще раз о структуре файла скина.
Даже научившись тому, как выводить ту или иную информацию с помощью компонентов, порой начинающим бывает очень трудно отыскать, а собственно куда и в какое место скина это прописывать.
Уже поняли, что файл скина состоит из объявлений (где объявлены цвета и шрифты) и собственно диалоговые окна (Screen).
Поэтому в принципе все просто. Все что видите на экране ТВ (кроме базового изображения видеокартинки), менюшки ли это, сообщения системы, окна плагинов и т.д. , все это прописано в элементах скина под названием Screen.
Рассмотрим способы, как можно отыскать искомый нужный нам Screen, в элементах которого хотим редактировать.
Первый самый легкий способ - это пооткрывать все эти элементы по очереди в окне программы E2Skinner. В левом окне этой программы понажимаем на названия элементов Screen (диалоговых окон) а в правом окне при включенной кнопке Designer смотрим собственно как выглядит этот screen.
Этот способ легкий, но не эффективный. Конечно найти окна инфобаров и чаннел селекшн таким образом нетрудно, но более мудреные окна отыскать в е2скиннере непросто. Так как многие окна схожи по форме.
Тут должно придти вам на помощь базовое знание английского языка, если таковое у вас имеется.
Более эффективным способом считаю, это просто открыть файл скина в продвинутом текстовом редакторе, понимающим отступы (табуляции) и питон-формат, например в нотепад++. Почти всегда для удобства чтения скиномастер перед каждым окном пишет его название в виде комментария. Вот по этим названиям и надо искать включив как говорится свою интуицию. На самом деле все интуитивно понятно.
Необходимо также учесть, что в скине есть универсальные окна. Это например окна Setup, ChoiceBox и InputBox, которые применяются неоднократно и не для одного случая. Я сам например долго искал некое окно какого-то плагина, пока не дошло, что пользуется в этом случае именно один из универсальных скринов ChoiceBox.
Вот теперь я думаю можно приступить к изучению конкретных конвертеров.

Начну с конвертера EventName2.
Здесь тоже нужно сделать лирическое отступление. Никогда не пугайтесь открыть исходник конвертера (файл с расширением py) и заглянуть в потроха конвертера (или рендера). На самом деле не так страшен python, как его малюют. Поверьте даже при отсутствии специальных навыков вам под силу более-менее прочесть этот самый код и сделать для себя нужные выводы, что же делает этот конвертер, какие параметры в качестве ввода понимает (т.е. что нужно прописать в виджете) и какую информацию и в каком виде при этом он выводит. Это называется параметр ввода-вывода для компонента.
Поэтому сначала несколько слов о структуре уже файла конвертера для облегчения его прочтения.
Сначала там идет как бы перечень откуда из имиджа компонент будет черпать информацию.
Вот например в случае с конвертером EventName2.
(Этот конвертер будем рассматривать с примерами кода для более глубокого понимания вопроса, а в остальные конвертера будете лезть сами, там будем приводить только примеры виджета.)

Код:
from Components.Converter.Converter import Converter
from Components.Element import cached
from enigma import eEPGCache
from time import localtime

Это всего-навсего обозначает, что конвертер будет черпать информацию (from - это значит из) из системных конвертеров, из системного кеша (cashe), из системного кеша телегида (eEPGCache) а также из системной службы времени (localtime).

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

Значит вот это уже объявления

Код:
			 NAME = 0
	SHORT_DESCRIPTION = 1
	EXTENDED_DESCRIPTION = 2
	FULL_DESCRIPTION = 3
	ID = 4
	NEXT_NAME = 5
	NEXT_DESCRIPTION = 6
	NEXT_NAMEWT = 7

Вам это только для сведения, что в конвертере так "обозвано" то, что он будет выводит.
В таком виде никуда в скин это прописывать не надо.

А вот дальше уже идут два раздела нужных нам.

Первая дефка это _init_
Init значит всего лишь инициализация.
Вот тут прописаны параметры ввода.

Код:
def __init__(self, type):
		Converter.__init__(self, type)
		self.epgcache = eEPGCache.getInstance()
		if type == "Description" or type == "Short":
			self.type = self.SHORT_DESCRIPTION
		elif type == "ExtendedDescription":
			self.type = self.EXTENDED_DESCRIPTION
		elif type == "FullDescription" or type == "ShortOrExtendedDescription":
			self.type = self.FULL_DESCRIPTION
		elif type == "ID":
			self.type = self.ID
		elif type == "NextName":
			self.type = self.NEXT_NAME
		elif type == "NextNameWithOutTime":
			self.type = self.NEXT_NAMEWT
		elif type == "NextDescription" or type == "NextEvent":
			self.type = self.NEXT_DESCRIPTION
		else:
			self.type = self.NAME

if type == "Description" or type == "Short":
self.type = self.SHORT_DESCRIPTION

означает, что если в виджете введете параметр Description или Short, то конвертер вернет вам SHORT_DESCRIPTION,
а как он это будет делать уже прописано в следующей дефке:

def getText(self):
event = self.source.event
if event is None:
return ""
if self.type == self.NAME:
return event.getEventName()
elif self.type == self.SHORT_DESCRIPTION:
return event.getShortDescription()
..............................


То есть получив команду Short из виджета конвертер обратится к системному eEPGCache (как прописано в начале конвертера) с "просьбой" event.getShortDescription() и если такой параметр имеется у системного eEPGCache он и возвратит ему это дело и на экран выведется результат....

Если кому-то это сложно, просто вызубрывайте тогда параметры, что далее буду приводить.....


Значит для конвертера EventName2 приемлемы следующие параметры ввода:

Description или Short - выведет краткую информацию о событии (телегида)

В паре с указанием конвертера прописывается так:

Код:
<convert type="EventName2">Description</convert>

либо

Код:
<convert type="EventName2">Short[</convert>

И естественно вставляется в тело виджета:

Код:
<widget source="session.Event_Now" render="ScrollLabel" position="824,390" zPosition="1" size="420,190" font="Regular;20" foregroundColor="white" backgroundColor="transpBlack" transparent="1">
	  <convert type="EventName2">FullDescription</convert>
	</widget>

Атрибуты самого виджета как выставлять вы уже поняли. Здесь нужно знать только через какой сурч (source) можно выводить эту информацию. source="session.Event_Now" означает что, обращаемся к системе требуя информацию о текущем событии.

Также конвертер понимает следующие параметры ввода.

ExtendedDescription - выведет расширенную информацию о событии

FullDescription или ShortOrExtendedDescription - выведет полную (краткую плюс расширенную) информацию о событии.

ID - выведет ID канала

Name и NextName - выведет название текущего события и соответственно следующего, применяется с сурчом ServiceEvent кроме названия выводит и начало и продолжительность собитыя (применять не в инфобаре)

NextNameWithOutTime - следующее событие без времени....

NextDescription или NextEvent - следующее событие с кратким описанием применяется с сурчом ServiceEvent...

Думаю наверно для этого конвертера надобности в скриншотах нет. Все и так понятно.
Здесь важно знать в сочетании с каким сурчом можно применять те или иные параметры....

---------- Сообщение добавлено в 13:26 ---------- Предыдущее сообщение размещено в 13:25 ----------

По основным атрибутам прошлись. Но есть еще атрибуты, которыми чаще всего интересуются те, которые переделывают скины под себя. Это свойства списка каналов в Channel Selection, то есть в списке каналов. Эти атрибуты востребованы, так как окно списка каналов вместе с инфобарами пожалуй наиболее часто используемая "картинка" на экране телевизора.

Настройки списка каналов в скине находятся в разделе, то есть скрине

Код:
<screen name="ChannelSelection".......

и в этом скрине ищем виджет list

Код:
<widget name="list"........

Вот именно здесь и настраиваем шрифты и цвета имени канала, названия событий, номера канала. Причем можем настроить так, что например цвет элемента который в данный момент выбран будет отличаться от цвета невыбранного.....
А названия атрибутов можно самостоятельно посмотреть в исходниках.
Например в имидже VTI эти настройки находятся в файле ServiceList.py, который в свою очередь находится по пути
/usr/lib/enigma2/Components/
Открываем этот файл и находим все возможные атрибуты, которые может иметь селектор каналов

Код:
for (attrib, value) in self.skinAttributes:
				if attrib == "foregroundColorMarked":
					self.l.setColor(eListboxServiceContent.markedForeground, parseColor(value))
				elif attrib == "foregroundColorMarkedSelected":
					self.l.setColor(eListboxServiceContent.markedForegroundSelected, parseColor(value))
				elif attrib == "backgroundColorMarked":
					self.l.setColor(eListboxServiceContent.markedBackground, parseColor(value))
				elif attrib == "backgroundColorMarkedSelected":
					self.l.setColor(eListboxServiceContent.markedBackgroundSelected, parseColor(value))
				elif attrib == "foregroundColorServiceNotAvail":
					self.l.setColor(eListboxServiceContent.serviceNotAvail, parseColor(value))
				elif attrib == "colorEventProgressbar":
					self.l.setColor(eListboxServiceContent.serviceEventProgressbarColor, parseColor(value))
				elif attrib == "colorEventProgressbarSelected":
					self.l.setColor(eListboxServiceContent.serviceEventProgressbarColorSelected, parseColor(value))
				elif attrib == "colorEventProgressbarBorder":
					self.l.setColor(eListboxServiceContent.serviceEventProgressbarBorderColor, parseColor(value))
				elif attrib == "colorEventProgressbarBorderSelected":
					self.l.setColor(eListboxServiceContent.serviceEventProgressbarBorderColorSelected, parseColor(value))
				elif attrib == "colorServiceDescription":
					self.l.setColor(eListboxServiceContent.serviceDescriptionColor, parseColor(value))
				elif attrib == "colorServiceDescriptionSelected":
					self.l.setColor(eListboxServiceContent.serviceDescriptionColorSelected, parseColor(value))
				elif attrib == "picServiceEventProgressbar":
					pic = LoadPixmap(resolveFilename(SCOPE_CURRENT_SKIN, value))
					if pic:
						self.l.setPixmap(self.l.picServiceEventProgressbar, pic)
				elif attrib == "serviceItemHeight":
					self.ItemHeight = int(value)
				elif attrib == "serviceNameFont":
					self.ServiceNameFont = parseFont(value, ((1,1),(1,1)))
				elif attrib == "serviceInfoFont":
					self.ServiceInfoFont = parseFont(value, ((1,1),(1,1)))
				elif attrib == "serviceNumberFont":

Рассмотрим по очереди. В принципе если у вас есть базовое знание английского все интуитивно просто.

Атрибут foregroundColorMarked - цвет элементов, если не выберите другие атрибуты, то это будет цветом всех элементов списка каналов;

Атрибут foregroundColorMarkedSelected - цвет элементов, которые в данный момент выбраны, если не выберите цвета для отдельных выбранных элементов, то это будет цветом всех выбранных элементов;

Атрибут backgroundColorMarked - то же самое, что и первый атрибут, только это цвет фона;

Атрибут backgroundColorMarkedSelected - то же самое, что и второй атрибут, только это цвет фона;

Атрибут foregroundColorServiceNotAvail - честно говоря сам ломал голову что это за атрибут, затем понял, это цвет сервиса, который не существует, то есть нет сигнала на этом транспондере или по каким другим причинам (то есть NotAvailable), рекомендуется конечно делать темнее;

Атрибут colorEventProgressbar - цвет прогресс-бара;

Атрибут colorEventProgressbarSelected - цвет выбранного на данный момент прогресс-бара;

Атрибут colorEventProgressbarBorder - цвет границы прогресс-бара;

Атрибут colorEventProgressbarBorderSelected - цвет границы выбранного на данный момент прогресс-бара;

Атрибут colorServiceDescription - цвет названия передачи;

Атрибут colorServiceDescriptionSelected - цвет названия выбранного на данный момент передачи;

Атрибут picServiceEventProgressbar - интересный атрибут, здесь вы можете предложить свой собственный рисунок прогресс-бара. Конечно размер и битность файла картинки должны быть соответствующими. Просто указываете путь к файлу-картинке;

Атрибут serviceItemHeight - это высота строчки в списке каналов, по умолчанию равна 30 единицам (если не укажете отдельно);

Атрибут serviceNameFont - шрифт имени канала;

Атрибут serviceInfoFont - шрифт названия передачи;

Атрибут serviceNumberFont - шрифт номера канала;

Разумеется вовсе необязательно прописывать эти атрибуты, если не пропишите их, будут приняты значения по умолчанию.....

---------- Сообщение добавлено в 13:26 ---------- Предыдущее сообщение размещено в 13:26 ----------

Углубляемся дальше в лес. Все хочу приступить к описанию конвертеров и их параметров ввода-вывода, но получается есть еще нюансы, которые необходимо знать тем, кто собрался переделать под себя или "оживить" скин....

Вот например один интересный нюанс. Вернее особенность работы парсера (парсер это обработчик файлов xml), как он считывает файл skin.xml при загрузке системы.

Довольно распространена такая ситуация, особенно на имидже опенпли. Запускаем какой-то скин. Он удачно грузится. Но открываем например инфобар, а он совершенно пуст. Сразу недоуменный вопрос. Как же так может быть? Неужели все диалоговое окно (Screen) не подходит этому имиджу? А ведь в инфобаре с десяток и даже больше виджетов, елейблов, епиксмапов. Неужели все они неправильные для этого имиджа?
Конечно же нет. Тогда почему инфобар совершенно пуст, то есть ни один из элементов инфобара не заработал (кроме подложки), несмотря на то, что правильные для этого имиджа виджеты там присутствуют. И компонент там правильный (конвертер-рендер) и атрибуты там правильные.
Это и есть как раз таки особенность работы парсера. Дело в том что парсер считывает файл skin.xml строго последовательно. То есть с первого до последнего элемента строго по очереди их вписывания в файле.
И если при этом в каком-нибудь вложенном элементе он встретит препятствие в виде невозможности выполнения команды, то он откажется читать дальше весь родительский элемент и перескачет на следующее диалоговое окно. Подчеркиваю, именно встретив КОМАНДУ, КОТОРУЮ НЕ МОЖЕТ ВЫПОЛНИТЬ. Конечно если это препятствие будет в виде невалидности документа (т.е. незаявленные шрифт или цвет, отсутствующий или лишний тег, отсутствующий пробел и т.д.) то имидж просто кинется в зеленку или откажется загружаться.
А командой, которую он не может выполнить (при валидности документа), могут быть например такие. В виджете прописан конвертер, в котором есть параметры невыполнимые для данного имиджа, возможно конвертер из другого имиджа например.
Или же невыполнимой командой может быть просто команда вывести картинку с несоответствующими битами или цветностью.

То есть, вы поняли, если на вашем экране инфобар (или любое другое окно) совершенно пуст, ищите проблему именно в самом первом элементе данного Screen в скине. И вполне даже возможно, что устранив одну единственную проблему вы сразу получите полностью работающий инфобар например.

Это так к сведению, но думаю очень полезное знание особенности работы парсера. И я в начале (когда еще не углубился в питон) было дело встретившись с пустым окном, терял уйму времени в поисках проблемы в элементах этого окна, не догадавшись заглянуть в самый первый.

Ну и конечно другая похожая ситуация, часть элементов окна работает, а часть нет.
Самый легкий и быстрый вариант отыскания проблем в этом случае это открыть скин в e2skinner и включив это окно параллельно на экране ТВ, проверять все элементы Screen, но работая как и парсер, строго последовательно, пройти по очереди по элементам.
Нажимаем на первый элемент, смотрим в окно e2skinner, узнаем месторасположение элемента, смотрим на экран ТВ, ага этот элемент работает, пробуем второй и так далее, пока не увидим пустое место на экране ТВ, и таким образом быстро находим неработающий элемент в Screen и уже потом будем копаться в этом элементе - виджете, елейбле или епиксмапе.........

Теперь научимся добавлять иконки для элементов главного меню (можно и в других меню).
Потому как обычно в скинах такие иконки присутствуют, но только на обычные элементы меню, и то иногда на элементы старых версии имиджа. Не говоря о том, что в разных имиджах элементы меню могут отличаться.
Иконки в меню имидж выводит только по их идентификационному имени, то есть это параметр естественно entryID.
То есть нам всего лишь нужно узнать это самое идентификационное имя элемента, для которого хотим добавить иконку в меню.
Где искать эти самые entryID? Некоторые ищут в других скинах, надеясь что кто-то уже добавил. Но этот способ совершенно непродуктивен. Мало того, что потеряете уйму времени, даже если и найдете, вы просто ни на шаг не продвинетесь в углублении изучения скиноделия. Такие действия извините я называю тупым времяпровождением.
Не чурайтесь, лезьте в исходники, таким образом вы только будете продвигаться в своих знаниях и умениях.
Первое место где нужно искать идентификационные имена элементов меню это файл menu.xml (находится в /usr/share/enigma2/). И ищем параметр entryID, соответствующий этому элементу. Если там нет, нужно уже искать в соответствующих исходниках.
Например это какой-нибудь плагин. Допустим пусть это будет плагин MediaPlayer. Идем по пути /usr/lib/enigma2/python/Plugins/ и там уже в одной из двух папок SystemPlugins или Extensions находим искомую папку плагина MediaPlayer и открываем файл plugin.py. И ищем дефку menu, то есть def menu и вот там в параметре возврата return автор плагина и прописывает имя отображаемое в меню и его идентификационное имя. В данном случае нашли вот такую строчку

Код:
		return [(_("Media player"), main, "media_player", 45)]

Значит entryID плагина media_player
И прописываем это дело виджетом посредством сурча menu и рендера Pixmap (так как это картинка), с помощью конвертеров MenuEntryCompare и ConditionalShowHide
И конечно прописывается в Screen menu_mainmenu

Код:
<widget source="menu" render="Pixmap" pixmap="путь_к_файлу_картинке" position="размер,размер" size="размер,размер" alphatest="blend" transparent="1">
	  <convert type="MenuEntryCompare">media_player</convert>
	  <convert type="ConditionalShowHide" />

Естественно подбираете картинку по своему усмотрению. Размер картинки, внешний вид зависит только от вашего воображения и вкуса и вовсе не должны совпадать с другими иконками меню. Только в атрибуте size="размер,размер" надо выставить истинные размеры картинки.........
 

Учкун

Профи в Сат-ТВ
Продолжаем.
Был задан вопрос:

.......как делается адаптация шкуры (скина) под имидж

Отвечаю.
1. Конечно же это в первую очередь замена компонентов (конвертеры, рендеры) под конкретный имидж. Потому что в скинах есть компоненты, которые работают в одном имидже, а в другом не работают.
2. Но в немалой степени адаптация это подгонка окон (скринов) под конкретный имидж. Вроде в имиджах большинство окон выглядят одинаково, но прописаны они в исходниках зачастую по-другому. Иногда просто несколько букв другие. Например в имидже БлекХол в названии окон во многих случаях присутствует буквосочетание BH. Соответственно, если не измените названия окон в скринах (окнах) они не будут работать. Плюс еще в различных имиджах также внутри скринов отличаются и элементы-виджеты. Значит нужно копаться и в них.

Как эту задачу выполнить эффективно? То есть потратить как можно меньше времени и плюс не допустить ошибок при этом?
Для этого берем встроенный стандартный HD-скин имиджа и работаем по нему как по образцу. То есть из него узнаем названия окон данного имиджа и большинство применяемых компонентов. А такие дефолтные скины есть у каждого имиджа. На опенпли это Pli-HD, на блекхоле это новые скины Army, а на VTI скины от Maggy.....
Также полное свое внимание обратите на свежую версию библиотеки Гисклаба. Компоненты этой библиотеки работают в любом имидже........
Конечно при более продвинутом варианте адаптации (как например делаю я) нужно залезть в исходники имиджа и уже оттуда узнавать и все возможности окон и все возможности компонентов имиджа......

Также обратите особое внимание на ту статью из википедии, на которую я давал ссылку в самом начале. Особенно актуально для имиджа ОпенПли. Дело в том, что это самый продвинутый имидж и даже способен проглатывать некоторые ваши ошибки в скинах и все равно запустить скин. Но при этом это отразится конечно в быстрой работе скина.

Также обязательно удаляйте из скина окна, которые никак не задействованы в данном имидже.
Да, вам могут сказать, что мол "если даже есть лишние окна в скине, это имеет значение только для скорости загрузки имиджа и далее они совсем не действуют".
Это в корне неправильное утверждение. Объясню. Да эти окна загружаются только при старте энигмы и далее бездействуют. Но при этом-то они ЗАГРУЗИЛИСЬ В ОПЕРАТИВНУЮ ПАМЯТЬ и лежат без действия там. И какая разница при этом, что эта часть скина бездействует? Если она при этом занимает часть оперативной памяти системы и таким образом все равно оказывает воздействие на быстроту работы имиджа.
То есть удаляйте весь мусор из скина и не слушайте никаких утверждений, что это не мешает имиджу, мешает и еще как, одним только своим присутствием мертвым грузом в оперативной памяти (особенно при слабых системах)........


Только недавно понял, что рассматривая структура скина в предыдущих уроках я упустил одну его важную часть.
Мы рассмотрели объявления (шрифты и цвета), комментарии и собственно окна (скрины), но забыли про общий для всех окон стили, которые тоже объявляются в начале скина. То есть вот это дело


Код:
<windowstyle type="skinned" id="0">    
<title offset="30,12" font="Regular;26" />    
<color name="Background" color="black" />    
<color name="LabelForeground" color="white" />    
<color name="ListboxBackground" color="black" />    
<color name="ListboxForeground" color="color2" />    
<color name="ListboxSelectedBackground" color="color5" />    
<color name="ListboxSelectedForeground" color="color4" />    
<color name="ListboxMarkedBackground" color="black" />    
<color name="ListboxMarkedForeground" color="unffff" />    
<color name="ListboxMarkedAndSelectedBackground" color="black" />    
<color name="ListboxMarkedAndSelectedForeground" color="un800000" />    
<color name="WindowTitleForeground" color="color1" />    
<color name="WindowTitleBackground" color="black" />

Это есть общий стиль для всех окон в имидже, в том числе будут действовать и на те окна, поддержки каркасом которых нет в скине. То есть в неком плагине есть свое окно (прописан скажем в plugin.py) но поддержка этого окна не придумана в скине. Тогда размеры окна и параметры берутся из плагина, но стиль окна берется отсюда уже.....
Также разумеется эти атрибуты действуют и на все окна, которые есть в скине, но с меньшим приоритетом. Что это значит? Это значит что эти атрибуты для окон (скринов) действуют только в том случае, если иное не описано внутри самих скринов.

Теперь о самих этих атрибутах.
windowstyle type="skinned" id="0"
- skinned это и значит, что будет действовать для любых возможных окон в имидже.
- id="0" цифра 0 означает что атрибуты для окон на экране ТВ. То есть если встретите в скинах еще один стиль под id="1" это будет для LCD (актуально для больших дисплеев).

<title offset="30,12" font="Regular;26" />
Параметры оглавления окна. Только тех окон, которые не на весь экран. И только в том случае, когда окно с бордюром (Border). То есть если в скрине-окне применить атрибут flags="wfNoBorder" этот параметр не действует.

<color name="Background" color="black" />
Цвет фона окна бордюра.

<color name="LabelForeground" color="white" />
Цвет текстов в окне, если иное не предусмотрено в скрине. То есть если в самом скрине-окне для текстов отсутствует атрибут foregroundColor, то цвет текста берется отсюда.

<color name="ListboxBackground" color="black" />
Цвет фона всяких меню Listbox, где применены сурчи list и config, опять-таки если иное не предусмотрено в скрине-окне.

<color name="ListboxForeground" color="color2" />
Цвет текста во всяких меню Listbox, где применены сурчи list и config, опять-таки если иное не предусмотрено в скрине-окне.

<color name="ListboxSelectedBackground" color="color5" />
Цвет фона выбранной строки во всяких меню Listbox, где применены сурчи list и config, опять-таки если иное не предусмотрено в скрине-окне.

<color name="ListboxSelectedForeground" color="color4" />
Цвет текста выбранной строки во всяких меню Listbox, где применены сурчи list и config, опять-таки если иное не предусмотрено в скрине-окне.

<color name="ListboxMarkedBackground" color="black" />
<color name="ListboxMarkedForeground" color="unffff" />

Цвет фона или соответственно текста замаркированной строки во всяких меню Listbox, где применены сурчи list и config, опять-таки если иное не предусмотрено в скрине-окне.

<color name="ListboxMarkedAndSelectedBackground" color="black" />
<color name="ListboxMarkedAndSelectedForeground" color="un800000" />

Думаю, понятно два предыдущих понятия вместе.....

<color name="WindowTitleBackground" color="black" />
Цвет фона заголовка окна, для тех окон, которые не на весь экран. И только в том случае, когда окно с бордюром (Border). То есть если в скрине-окне применить атрибут flags="wfNoBorder" этот параметр не действует.

<color name="WindowTitleForeground" color="color1" />
Цвет текста заголовка окна, для тех окон, которые не на весь экран. И только в том случае, когда окно с бордюром (Border). То есть если в скрине-окне применить атрибут flags="wfNoBorder" этот параметр не действует.


А вот эти строчки в скине

Код:
<borderset name="bsWindow">      
<pixmap pos="bpTopLeft" filename="Apfel_HD/bs_tl.png" />      
<pixmap pos="bpTop" filename="Apfel_HD/bs_t.png" />      
<pixmap pos="bpTopRight" filename="Apfel_HD/bs_tr.png" />      
<pixmap pos="bpLeft" filename="Apfel_HD/bs_l.png" />      
<pixmap pos="bpRight" filename="Apfel_HD/bs_r.png" />      
<pixmap pos="bpBottomLeft" filename="Apfel_HD/bs_bl.png" />      
<pixmap pos="bpBottom" filename="Apfel_HD/bs_b.png" />      
<pixmap pos="bpBottomRight" filename="Apfel_HD/bs_br.png" />    
</borderset>    
<borderset name="bsListboxEntry">      
<pixmap pos="bpTopLeft" filename="Apfel_HD/white.png" />      
<pixmap pos="bpTop" filename="Apfel_HD/h-white.png" />      
<pixmap pos="bpTopRight" filename="Apfel_HD/white.png" />      
<pixmap pos="bpLeft" filename="Apfel_HD/v-white.png" />      
<pixmap pos="bpRight" filename="Apfel_HD/v-white.png" />      
<pixmap pos="bpBottomLeft" filename="Apfel_HD/white.png" />      
<pixmap pos="bpBottom" filename="Apfel_HD/h-white.png" />      
<pixmap pos="bpBottomRight" filename="Apfel_HD/white.png" />    
</borderset>

Это в буквальном виде "строительство бордюров окон", то есть картинки для всяких бордюрных частей окон.....
 

fanbox

Профи в Сат-ТВ
Учкун, Спасибо большое, очень полезная работа.
 

burewestnik

Пользователь
Привет! А есть возможность сделать текст описания передачи бегущий медленно наверх?
Я имею ввиду, когда нажимаю кнопку на пульте вверх или вниз то рядом со списком каналов имеется описание маркированого канала,но когда текст слишком длинный он не весь виден. Было бы не плохо, если бы он медленно двигался наверх для его полного прочтения.
 
Сверху