Писане на плъгин за XBMC със собствен интерфейс част I

Това е част I от поредица от статии за писане на добавки за XBMC със собствен интерфейс. Ще покрие основната информация за създаването на интерфейс на плъгин и ще даде примитивен пример. В част II планирам да дам малко повече теория и малко по-сложен пример. Част III ще даде пример за труден плъгин, който използва микро-рамка, която съм написал, която опростява оформлението на интерфейса.

В първата си статия, Подробна анатомия на прост XBMC плъгин, се опитах да опиша конструкцията на XBMC плъгин възможно най-подробно. Освен това се опитах да ви кажа разликата между плъгините за източник на съдържание и плъгините за скриптове. За тези, които са забравили, позволете ми да ви напомня, че плъгините за източници на съдържание формират многостепенни списъци (директории) със съдържание с помощта на функцията addDirectoryItem(). Тоест, ние стъпка по стъпка „захранваме“ елементите на списъка към функцията и XBMC се занимават един с друг - показване на списъка, обработка на събития при избиране на елементи от списък и т.н. От своя страна плъгините за скриптове са лишени от такава привилегия и в тях всички горепосочени задачи падат върху разработчика. Позволете ми също да ви напомня, че подобно на изходните приставки, скриптовете могат да се показват в секциите „Видео“, „Музика“ и / или „Снимки“, ако изпълняват определени задачи за работа с определеното съдържание, или в секцията „Програми“, ако това са приставки за скриптове с общо предназначение. Освен това приставките за скриптове могат също да изтеглят субтитри, да работят като фонови услуги и т.н. Функцията на приставката се определя от тагове във файла Addon.xml, който съдържа цялата информация за нашата приставка.

За да разберете тези статии, е много желателно да имате отлични познания по тезите на ООП и писането на GUI приложения на Python (наричан по-нататък Python).

Главна информация

За работата с интерфейса отговаря модулът xbmcgui, който е част от API на XBMC Python. Този модул съдържа общи класове контейнери, както и класове, отговорни за различни елементи на интерфейса. За съжаление интерфейсната част на API е по-малко удобна от обикновените GUI библиотеки на Python, а документацията е пълна с неточности. Препоръчвам да използвате модулите за зареждане, за които писах в предишната си статия. В допълнение към комфорта на разработката, те съдържат и по-актуална информация: както за набора от класове, методи и функции, така и за тяхното използване (в документните низове).

Компоненти на интерфейса на добавките

За да създадем интерфейса на плъгина, модулът xbmcgui ни предоставя различни компоненти: - контейнерни класове (класът Window и неговите наследници); - уиджети или в терминологията на XBMC контроли (контроли), отговорни за различни елементи на интерфейса (класове наследници на Control); - диалози, които служат за обобщаване на информация и взаимодействие с потребителя (методи на класа Dialog и други).

Нека разгледаме по-подробно първите 2 точки.

Класове WindowXML и WindowXMLDialog

Както подсказват имената им, тези контейнерни класове използват интерфейсен скелет, написан на XML и подобен по дизайн на XBMC кожите. Тоест, всъщност интерфейсът, базиран на тези класове, има своя лична миникожа. Не искам да се ровя в гъсталаците на писането на кожата (в което, признавам, разбирам зле), затова няма да се спирам подробно на тези класове.

Класове Window и WindowDialog

Класовете Window и WindowDialog са родителски контейнери, които хостват други интерфейсни елементи - контроли. За да поставят контроли, тези класове осигуряват координатна мрежа,започвайки от горния ляв ъгъл на екрана. По подразбиране разделителната способност на видимата мрежа е 1280 x 720 пиксела. Тази разделителна способност е позволено да се променя, но лично аз не виждам особен смисъл в това, така че примерите ще използват стандартната разделителна способност на видимата област. Не напразно използвах термина "видима зона". Контролните координати могат да имат всякакви стойности, включително отрицателни, но на екрана ще се вижда само това, което попада във видимата област. Това е моно текст с механични прекъсвания на редовете. Няма превъртане и текстът, който не се побира в текстовото поле, се отрязва.

Контролно изображение

Снимка. Поддържат се основните файлови формати на изображения (jpg, png, gif). PNG и gif файловете поддържат прозрачност (ако има такава). По подразбиране картината се вписва в определеното пространство с изкривяване на пропорциите, но методът на прилягане може да бъде зададен.

Контролен бутон

Бутон. Манипулаторът за щракване върху бутон е написан в метода onControl() на класа контейнер.

ControlRadioButton и ControlCheckMark

Радио бутон и поле за отметка. Функционално те са напълно сходни и се различават само по външен вид. Използва се като превключвател с две положения.

ControlEdit

Поле за въвеждане на текст. Избирането отваря екранна клавиатура, която ви позволява да въведете желания текст. Ако посочите параметъра isPassword=True, въведеният текст ще бъде заменен със звездички.

Контролен списък

списък. Разрешено е добавянето на примитивни текстови низове към списъка, но всъщност всеки елемент от списъка е екземпляр на класа ListItem. Позволете ми да ви напомня, че списъците в добавките за източници на съдържание се състоят от едни и същи елементи. Въпреки това, за разлика от изходните добавки, в ControlList функционалността на елементите от списъкаограничен. Всъщност се поддържат само текстови надписи и малки икони (thumbnailImage). Останалата логика, да речем действието при избор на елемент от списъка, трябва да се реализира от вас самите. Контролата изисква текстура за стилизиране на списъка.

Ако всички елементи от списъка не се поберат в определеното място, списъкът се превърта.

ControlSlider

Плъзгач с мащаб. Служи за плавно регулиране на всеки параметър. Изисква ясни текстури.

Примери за контроли, проектирани с помощта на текстурите на кожата Confluence, могат да се видят на екранната снимка по-долу.

xbmc

ControlButton, ControlCheckMark, ControlEdit, ControlList и ControlSlider са интерактивни контроли, които променят външния си вид, когато бъдат избрани. Теоретично е позволено да се предпочита всеки контрол, да речем ControlLabel, но няма да има визуална обратна връзка.

За да навигирате в интерфейса на приставката с помощта на клавишите със стрелки на клавиатурата или дистанционното управление, на всяка контрола трябва да бъдат присвоени съседи, върху които ще се премести фокусът, когато се натисне съответният клавиш със стрелка. Това се прави с помощта на методите setNavigation, както и с controlUp, controlDown, controlLeft и controlRight, наследени от Control. Освен това, за да работи навигацията, когато интерфейсът се показва първоначално, не забравяйте да поставите фокуса върху един от контролите.

Контролите се добавят с помощта на метода addControl на контейнерния клас. В същото време контролите, добавени по-късно, се показват върху добавените по-рано. Да кажем, че можем първо да покажем картина, която ще служи като фон, и да поставим всички други контроли върху нея.

Сега да преминем към утилитарни примери. Да започнем, разбира се, с класическото „Здравей, свят!“, Или вБългарска версия на "Hello world!".

Плъгин "Здравей свят!"

Както казах по-подробно в първата си статия, всеки плъгин се нуждае от незаменим работещ addon.xml файл.

кажете ни (и XBMC), че това е плъгин за софтуерен скрипт, този, който ще бъде наличен в раздела „Програми“.

Сега спокойно нашият плъгин код е:

Редове 8, 9: Тук задаваме константите, съответстващи на цифровите ключови кодове на събития, използвани от XBMC. Пълен списък със събития на клавиатурата може да се намери в източниците на XBMC. Съответствието между събитията на клавиатурата и клавишите на клавиатурата, дистанционното управление или друго управление се задава в конфигурационния файл keyboard.xml

13-25: описваме класа, който имплементира нашия интерфейс. В този случай класът наследява от Window. Нашият интерфейс съдържа ексклузивен контрол - ControlLabel със съответния надпис. Моля, обърнете внимание, че първите 4 параметъра на контролата са нейните координати и размери в ширина и височина в пиксели на координатната мрежа. Тези параметри са незаменими. Координатите и размерите могат да бъдат променени по-късно, ако е необходимо. Ако искаме да направим контрола, но поставим нейния резултат на екрана, тогава е позволено да посочим фалшиви координати и/или размери и да зададем реалните параметри по-късно от показването на контролата. Методът addControl() на родителския клас отговаря за добавянето на контроли към контейнера.

В метода onAction ние прихващаме събития от клавиатурата, съответстващи на клавишите ESC и Backspace, за да можем да излезем от нашия плъгин. Още веднъж, скрипт на плъгин, който използва класовете Window или WindowDialog, със сигурност трябва да има код, който ви позволява да излезете от него, без да прибягвате до радикални мерки, като мениджър на задачи. Забележка: независимо от съвпадението с цели числачисла, параметърът за действие всъщност е екземпляр на класа на помощната програма Action.

32: Методът doModal() показва интерфейса, който направихме на екрана. Този метод е подобен на mainloop() в Tkinter.Tk или show() в QWidget. Интерфейсът ще се визуализира, докато методът close() не бъде извикан.

34: защо да изтривам екземпляр на клас в края на работата, честно казано не знам. Видях това в пример в официалната WiKi.

Ако всичко е направено както трябва, трябва да видим

xbmc

Съгласете се, не много красиво шоу. Както беше посочено по-горе, класът Window има черен непрозрачен фон. Затова в следващия пример ще се опитаме да украсим малко нашия интерфейс и също така да добавим някои интерактивни елементи.

От любопитство опитайте да наследите от WindowDialog. С тази опция надписът ще се появи в горната част на интерфейса на XBMC.

Готов плъгин "Hello world!" разрешено изтегляне otsel. Нека ви напомня, че можете да инсталирате плъгина от менюто "Система" > Добавки > "Инсталирай