Плагины, программы и скины от ака Учкун
Вы хотите отреагировать на этот пост ? Создайте аккаунт всего в несколько кликов или войдите на форум.
Плагины, программы и скины от ака Учкун

Форум для владельцев спутниковых ресиверов на enigma2. Ресиверы dreambox, vu-plus и другие. Программы, плагины, скины, локализации от ака Учкун. ExtraChannelSelection
 
ФорумФорум  Последние изображенияПоследние изображения  РегистрацияРегистрация  ВходВход  

 

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

Перейти вниз 
АвторСообщение
ака Учкун
Администратор
Администратор
ака Учкун


Статус : .....
Сообщения : 533
Рейтинг : 33923
Благодарности : 27858
Дата регистрации : 2017-06-29
Возраст : 58
Откуда : Узбекистан

FAQ: Переделка скина для начинающих Empty
СообщениеТема: FAQ: Переделка скина для начинающих   FAQ: Переделка скина для начинающих EmptyЧт 29 Июн - 15:13

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 начнем разбираться в скине в обратном порядке. То есть сначала разберемся в атрибутах и их свойствах.....

Продолжение следует.....
Вернуться к началу Перейти вниз
https://forum-aka-uchkun.forum2x2.ru
ака Учкун
Администратор
Администратор
ака Учкун


Статус : .....
Сообщения : 533
Рейтинг : 33923
Благодарности : 27858
Дата регистрации : 2017-06-29
Возраст : 58
Откуда : Узбекистан

FAQ: Переделка скина для начинающих Empty
СообщениеТема: Re: FAQ: Переделка скина для начинающих   FAQ: Переделка скина для начинающих EmptyЧт 29 Июн - 15:14

Продолжим

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

Код:
<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" />


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

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


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 соответственно наоборот. Здесь конечно есть нюансы. Если в элементе есть вложенные элементы (например конвертер), который не поддерживает
прозрачность, тогда этот параметр бесполезен. Элемент в любом случае будет непрозрачен....

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


Статус : .....
Сообщения : 533
Рейтинг : 33923
Благодарности : 27858
Дата регистрации : 2017-06-29
Возраст : 58
Откуда : Узбекистан

FAQ: Переделка скина для начинающих Empty
СообщениеТема: Re: FAQ: Переделка скина для начинающих   FAQ: Переделка скина для начинающих EmptyЧт 29 Июн - 15:15

Прежде чем приступить к рассмотрению компонентов еще раз о структуре файла скина.
Даже научившись тому, как выводить ту или иную информацию с помощью компонентов, порой начинающим бывает очень трудно отыскать, а собственно куда и в какое место скина это прописывать.
Уже поняли, что файл скина состоит из объявлений (где объявлены цвета и шрифты) и собственно диалоговые окна (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...

Думаю наверно для этого конвертера надобности в скриншотах нет. Все и так понятно.
Здесь важно знать в сочетании с каким сурчом можно применять те или иные параметры....
Вернуться к началу Перейти вниз
https://forum-aka-uchkun.forum2x2.ru
ака Учкун
Администратор
Администратор
ака Учкун


Статус : .....
Сообщения : 533
Рейтинг : 33923
Благодарности : 27858
Дата регистрации : 2017-06-29
Возраст : 58
Откуда : Узбекистан

FAQ: Переделка скина для начинающих Empty
СообщениеТема: Re: FAQ: Переделка скина для начинающих   FAQ: Переделка скина для начинающих EmptyЧт 29 Июн - 15:16

По основным атрибутам прошлись. Но есть еще атрибуты, которыми чаще всего интересуются те, которые переделывают скины под себя. Это свойства списка каналов в 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 - шрифт номера канала;

Разумеется вовсе необязательно прописывать эти атрибуты, если не пропишите их, будут приняты значения по умолчанию.....
Вернуться к началу Перейти вниз
https://forum-aka-uchkun.forum2x2.ru
ака Учкун
Администратор
Администратор
ака Учкун


Статус : .....
Сообщения : 533
Рейтинг : 33923
Благодарности : 27858
Дата регистрации : 2017-06-29
Возраст : 58
Откуда : Узбекистан

FAQ: Переделка скина для начинающих Empty
СообщениеТема: Re: FAQ: Переделка скина для начинающих   FAQ: Переделка скина для начинающих EmptyЧт 29 Июн - 15:17

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

Вот например один интересный нюанс. Вернее особенность работы парсера (парсер это обработчик файлов 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="размер,размер" надо выставить истинные размеры картинки.........
Вернуться к началу Перейти вниз
https://forum-aka-uchkun.forum2x2.ru
ака Учкун
Администратор
Администратор
ака Учкун


Статус : .....
Сообщения : 533
Рейтинг : 33923
Благодарности : 27858
Дата регистрации : 2017-06-29
Возраст : 58
Откуда : Узбекистан

FAQ: Переделка скина для начинающих Empty
СообщениеТема: Re: FAQ: Переделка скина для начинающих   FAQ: Переделка скина для начинающих EmptyЧт 29 Июн - 15:18

Продолжаем.
Был задан вопрос:

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

Отвечаю.
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>

Это в буквальном виде "строительство бордюров окон", то есть картинки для всяких бордюрных частей окон.....
Вернуться к началу Перейти вниз
https://forum-aka-uchkun.forum2x2.ru
ака Учкун
Администратор
Администратор
ака Учкун


Статус : .....
Сообщения : 533
Рейтинг : 33923
Благодарности : 27858
Дата регистрации : 2017-06-29
Возраст : 58
Откуда : Узбекистан

FAQ: Переделка скина для начинающих Empty
СообщениеТема: Re: FAQ: Переделка скина для начинающих   FAQ: Переделка скина для начинающих EmptyЧт 29 Июн - 15:19

Иногда при обновлении скина автор пишет "добавлена поддержка каркасом плагина такого-то...".
Что означают эти загадочные слова?

Это означает, что автор скина добавил в файл skin.xml окно (или несколько окон, бывает плагин имеет не одно окно) плагина в виде Screen конечно.
У новичков сразу может возникнуть вопрос - если не было окна этого плагина в этом скине, как же оно, это окно до сих пор у меня открывалось-то?

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

из <windowstyle type="skinned" id="0">......
 
а бордюрные части из <borderset name="bsWindow">..... и из <borderset name="bsListboxEntry">.....

И именно поэтому все равно не имея поддержки каркасом в скине, окно плагина как бы будет в стиле скина.

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

Решим задачу добавления поддержки каркасом в скин, окна какого-нибудь плагина. На примере скажем плагина ExtraChannelSelection.

В первую очередь открываем файл plugin.py из директории этого плага, то есть отсюда
\usr\lib\enigma2\python\Plugins\SystemPlugins\ExtraChannelSelection\
и находим в нем его окно (а оно только одно) Screen, то есть вот эту часть кода (на самом деле в коде просто ищем класс, где в названии будет слово Screen)

Код:
class ExtraChannelSelectionSetup(Screen, ConfigListScreen):
 skin = """
<screen name="ExtraChannelSelectionSetup" position="center,160" size="650,460" title="ExtraChannelSelection settings">
  <widget position="15,10" size="620,300" name="config" itemHeight="30" foregroundColor="#00ffcc33" font="Regular; 21" scrollbarMode="showOnDemand" />
  <eLabel text="%s" position="370,330" zPosition="2" size="270,25" foregroundColor="#00009a00" halign="right" font="Regular; 22" transparent="1" />
    <ePixmap position="100,418" zPosition="1" size="165,2" pixmap="/usr/lib/enigma2/python/Plugins/SystemPlugins/ExtraChannelSelection/images/red.png" alphatest="blend" />
  <widget source="red_key" render="Label" position="100,388" zPosition="2" size="165,30" font="Regular; 20" halign="center" valign="center" backgroundColor="background" foregroundColor="foreground" transparent="1" />
  <ePixmap position="385,418" zPosition="1" size="165,2" pixmap="/usr/lib/enigma2/python/Plugins/SystemPlugins/ExtraChannelSelection/images/green.png" alphatest="blend" />
  <widget source="green_key" render="Label" position="385,388" zPosition="2" size="165,30" font="Regular; 20" halign="center" valign="center" backgroundColor="background" foregroundColor="foreground" transparent="1" />
</screen>"""

Как видим нужные для нашего скина виджеты и т.д. налицо. Учтите, в некоторых плагинах вот эта часть окна name="ExtraChannelSelectionSetup" может не присутствовать. В плагине писать этот параметр необязательно, название берется из названия самого класса, как видите тут они совпадают.
И в первую очередь открыв файл skin.xml проверяем в каком-нибудь редакторе типа нотепад++ или DCC, а нет ли в скине уже поддержки каркасом. Просто вбиваем в поиск название окна ExtraChannelSelectionSetup в файле skin.xml и нажимаем поиск.
Убедились что нет этого каркаса в скине.
Смотрим на это окно на экране (или в е2скиннере), когда нет поддержки каркасом в скине, вот оно

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

Как видите явно выделяется из стиля самого скина ТехноHD

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

И в итоге добавив все это дело в этом скине я получаю уже такой Screen в коде skin.xml

Код:
<screen name="ExtraChannelSelectionSetup" position="0,0" size="1280,720" title="ExtraChannelSelection settings">
    <ePixmap position="0,-1" zPosition="-1" size="1280,720" pixmap="Techno_hd/style/greymenu_1.png" />
    <ePixmap position="920,440" zPosition="1" size="200,200" pixmap="Techno_hd/menu/hdd.png" alphatest="blend" />
    <widget source="session.VideoPicture" render="Pig" position="806,96" size="428,248" zPosition="3" backgroundColor="transparent2" />
    <widget source="session.Event_Now" render="Label" position="800,390" size="446,48" zPosition="2" halign="center" font="Regular; 20" foregroundColor="color4" backgroundColor="background" transparent="1">
      <convert type="EventName">Name</convert>
    </widget>
    <widget source="session.Event_Now" render="Progress" pixmap="Techno_hd/style/yellowprogress.png" position="866,368" size="310,8" zPosition="2" backgroundColor="background" transparent="1">
      <convert type="EventTime">Progress</convert>
    </widget>
    <eLabel text="ExtraChannelSelection settings" position="50,33" zPosition="2" size="720,44" font="Regular; 30" halign="left" foregroundColor="color1" backgroundColor="background" transparent="1" />
    <widget position="60,100" size="690,500" name="config" itemHeight="30" font="Regular; 21" scrollbarMode="showOnDemand" transparent="1" />
    <eLabel text="a.k.a Uchkun (c)" position="463,606" zPosition="2" size="270,25" foregroundColor="#00009a00" halign="right" font="Regular; 22" transparent="1" />
    <widget source="global.CurrentTime" render="Label" position="1122,38" size="52,36" font="Display; 35" backgroundColor="background" foregroundColor="color1" halign="right" zPosition="1" transparent="1">
      <convert type="ClockToText">Format:%H</convert>
    </widget>
    <eLabel text=":" position="1176,38" size="10,36" font="Display; 34" backgroundColor="background" foregroundColor="grey" halign="center" transparent="1" zPosition="2" />
    <widget source="global.CurrentTime" render="FixedLabel" text=":" position="1176,38" size="10,36" font="Display; 34" backgroundColor="background" foregroundColor="color1" halign="center" transparent="1" zPosition="3">
      <convert type="AlwaysTrue">
      </convert>
      <convert type="ConditionalShowHide">Blink</convert>
    </widget>
    <widget source="global.CurrentTime" render="Label" position="1190,38" size="52,36" font="Display; 35" backgroundColor="background" foregroundColor="color1" halign="left" transparent="1" zPosition="1">
      <convert type="ClockToText">Format:%M</convert>
    </widget>
    <widget source="global.CurrentTime" render="Label" position="768,45" size="350,30" font="Display; 26" backgroundColor="background" halign="right" transparent="1">
      <convert type="ClockToText">Format:%A, %d.%m.%Y</convert>
    </widget>
    <ePixmap position="257,648" size="281,16" zPosition="1" pixmap="Techno_hd/buttons.png" alphatest="blend" />
    <ePixmap position="767,648" size="281,16" zPosition="1" pixmap="Techno_hd/buttons.png" alphatest="blend" />
    <ePixmap position="260,650" size="275,10" pixmap="Techno_hd/buttons/red2.png" alphatest="on" zPosition="2" />
    <ePixmap position="770,650" size="275,10" pixmap="Techno_hd/buttons/green2.png" alphatest="on" zPosition="2" />
    <widget source="red_key" render="Label" position="262,660" zPosition="2" size="271,40" font="Regular; 22" halign="center" valign="center" backgroundColor="background" transparent="1" />
    <widget source="green_key" render="Label" position="772,660" zPosition="2" size="271,40" font="Regular; 22" halign="center" valign="center" backgroundColor="background" transparent="1" />
  </screen>

А на экране это окно уже выглядит так

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

Чтобы название окна было на русском, надо добавить его в перевод имиджа.

Как видите, теперь окно плагина в стиле скина.
Вот для чего и как нужно делать поддержку каркасом в скине тех плагинов, которыми пользуетесь.......
Вернуться к началу Перейти вниз
https://forum-aka-uchkun.forum2x2.ru
ака Учкун
Администратор
Администратор
ака Учкун


Статус : .....
Сообщения : 533
Рейтинг : 33923
Благодарности : 27858
Дата регистрации : 2017-06-29
Возраст : 58
Откуда : Узбекистан

FAQ: Переделка скина для начинающих Empty
СообщениеТема: Re: FAQ: Переделка скина для начинающих   FAQ: Переделка скина для начинающих EmptyЧт 29 Июн - 15:19

Полезно будет вдогонку также ознакомится с документацией Энигма2 (автора не знаю). После прочтения предыдущих постов думаю вам будет теперь все понятно. Перевел на русский язык и добавил от себя кое-какие пояснения



e2-documentation - SKINS

enigma2 скины
=============


Файл скина написан в формате XML. Для лучшего понимания изучите существующий в вашем имидже файл скина.



colors - цвета
===============



В этом в самом первом разделе файла скина вы можете определить любые названия для применяемых в скине цветов. Значения цветов пишутся в формате RGB (hex-значения), то есть #aarrggbb, или можно #rrggbb.
То есть например выбирая желтый цвет можно задать его так
<color name="yellow" value="#00ffff00" />
или же можете и так
<color name="yellow" value="#ffff00" />
Это одно и тоже. Можно и так и этак. При этом как вы наверно поняли, название yellow можете тоже изменить как вам угодно, можете даже abracadabra написать, все равно это будет желтый цвет. И далее в скине в скринах, виджетах и других элементах этот желтый цвет можете прописать под заданным вами названием (yellow или abracadabra) или же можете и подставить и далее hex-значение. Разница будет только в том, что если далее в скине желтый цвет именно по названию будете прописывать (а не по RGB) вы облегчаете код скина и делаете его быстрым......



windowstyle
===========



Здесь вы можете настроить "стиль окна", то есть бордюры вокруг окон.
Об этом мы уже подробно поговорили в одном из предыдущих постов.



screens
=======



Это различные виджеты для экранов. Они могут также быть включены
в скринах самостоятельно.
Тут в документации некоторая неточность. Скрины на самом деле это различные (любые) окна, имеющие элементы не только в виде виджетов. Но это мы тоже уже подробно изучали уже.



pixmap paths - пути к картинкам
=========================



Определенного правила нет, но лучше для пиксмапов выделить одну директорию.
Вы можете например:
- Указать полный путь с косой чертой (пожалуйста не надо!)
- Указать относительный путь без косой черты. Поиск файла будет вестись в папке дефолтного скина. Указывается только название пиксмап-файла
- Относительно каталога скина (с ведущим "~ /"). ~ В этом случае можно рассматривать как "домашний каталог" текущего скина, то есть там где skin.xml есть.

Написано в документации немножко путано, объясню своими словами. Если укажете например вот такой путь к файлу-картинке pixmap="green.png" то парсер будет искать эту картинку в папке дефолтного скина. Я лично не проверял, никогда не применял такой путь.
Если укажете так pixmap="~ /green.png" или же например pixmap="~ /images/green.png" то уже в папке текущего скина.



A NOTE ABOUT PNGs - О формате PNG
=================================



Enigma может потребить либо 32-битный ARGB или 8 битный файл-картинку. Но пока Enigma использует 8 битные PNG файлы в скинах.
Хотя устроить поддержку 32-битных PNG файлов совсем несложно (на опенпли уже реализовано), но эта отличная идея ставит такие вопросы:

а) повышение качества относительное

Вы можете использовать другую палитру для каждого PNG, которая дает Вам уникальные 256 цветов для каждого элемента скина. Если у вас есть очень большой PNG, вы не почувствуете разницу между 32 и 8 бит.

б) 32bit скин не будет совместим с дисплеями 8bit

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

в) 32bit PNG плохо сжимаются

PNG является форматом без потерь. 32bit растровые данные очень трудно сжать без потери. Мы могли бы использовать JPG, но JPG-файлы не предлагают канал прозрачности (transparency), насколько я знаю.


Итак, как сделать чтобы ваши PNG хорошо выглядели?
Это просто. Редактировать их, как 32-битные ARGB (Photoshop, GIMP). Будьте уверены, что если вы хотите alphatest, прозрачность реально может иметь значение альфа-0/255 (то есть крайний).
И в конце используйте pngquant, чтобы обработать ваш PNG для создания совместимости с энигмой.

Примечание:

Если у вас получилось менее 16 цветов в файле PNG, pngquant генерирует 16 цветов (4 бита) PNG, которое на самом деле не то, что мы хотим. Либо добавить больше цветов (неверный путь), исправить Enigma (хорошая идея!) или патч к pngquant, чтобы всегда создавал 8bit PNG.

Прозрачность:

Во-первых, не путать прозрачность с альфа. Я согласен, оба термина означают одно и то же, но в нашем случае, это более сложнее. Пока у нас не работает на ускоренной графике, мы должны различать эти два понятия.
Альфа в нашем контексте, представляет собой соотношение между видео и экранным меню. Альфа = 0 означает, что OSD видно полностью, а не видео, а альфа = 1 (или 0xFF) означает, что есть только видео.
Прозрачность, с другой стороны, только OSD. Когда Вы имеете фон, назначаете цвет, можете смешать фон с картиной. Такое позволит сделать pixmap с непрямоугольной формой.

По причинам скорости мы не используем реальное альфа-смешение, которое не работает с ускорением. Вместо этого мы используем альфа-тестирование. Это означает использование специального цвета "transparent", тогда как всех других цветов нет. То есть цвета *должны быть на индексе 0*. Вы не можете рассчитывать на автоматическое слияние палитры (пиксмапы должны быть только в 8 бит), нужно поставить прозрачный цвет на индекс 0. Так обычно делается, но в случае с transparency не работает правильно, можете проверить.

(*) Заметим, что, технически, если мы начнем с альфа = 1 фона (т.е. только видео), и применим alphablend при этом, этого достаточно , чтобы справиться с обоими случаями. Но в настоящее время, мы должны различать между ними, мы не всегда можем применить alphablend просто из соображений производительности.



lcd:
====



Сейчас большинство LCD-скинов («summary screens") реализуются в отдельном xml. Однако, вы можете переопределить их с помощью текущего скина.
Существует некоторая путаница относительно фактического размера lcd-дисплея. В настоящее время, считаем его 132x64 пикселя, но некоторое (большинство?) оборудование может отображать только либо 128 (Dreambox) или 120 (dbox2, DM8000) пикселей по горизонтали.
Сейчас лишние пиксели обрезаются с правой стороны. Это будет (надеюсь) исправлено ​​в ближайшее время, так чтобы использовать пиксели всегда в центре (возможно уже исправлено?).
Создавайте lcd-скины для 132x64, без важных пунктов (текст и т.д.) и 6 пикселей с каждой стороны. В случае сомнений, оставьте их белыми.



LCD colorspace:
=======



текущее LCD-дисплеи не в состоянии отображать оттенки серого в графике. Однако, скин должен быть рассчитан на 8 бит оттенков серого (и до сих пор хорошо выглядеть в 1 бит!), Потому что некоторые дисплей нового поколения сможет отображать некоторые оттенки серого - скорее всего, не 256, но, возможно, 16 или около того.
Вернуться к началу Перейти вниз
https://forum-aka-uchkun.forum2x2.ru
 
FAQ: Переделка скина для начинающих
Вернуться к началу 
Страница 1 из 1

Права доступа к этому форуму:Вы не можете отвечать на сообщения
Плагины, программы и скины от ака Учкун :: Прочее :: FAQ-
Перейти: