Главная
Блог разработчиков phpBB
 
+ 17 предустановленных модов
+ SEO-оптимизация форума
+ авторизация через соц. сети
+ защита от спама

Пишем плагин для XBMC с собственным интерфейсом: часть I — теория и примитивный пример

Anna | 16.06.2014 | нет комментариев

Введение

Это I часть цикла статей, посвященных написанию плагинов для XBMC с собственным интерфейсом. В ней будет рассмотрена основная информация о создании интерфейса плагина и приведен примитивный пример.
Во II части я планирую дать еще немножко теории и чуть больше трудный пример.
В III части будет дан пример трудного плагина, тот, что использует написанный мной микро-фреймоворк, упрощающий компоновку интерфейса.

В своей первой статье «Подробная анатомия простого плагина для XBMC» я попытался максимально детально описать конструкцию плагина для XBMC. Помимо того, я постарался рассказать, чем отличаются плагина-источники контента и плагины скрипты. Для тех, кто позабыл, напомню, что плагины-источники контента формируют многоуровневые списки (каталоги) контента при помощи функции addDirectoryItem(). Т. е. мы ступенчато «скармливаем» функции элементы списка, а каждому остальным — отображением списка, обработкой событий при выборе элементов списка и т. п. — занимается XBMC. В свою очередь, плагины-скрипты лишены такой привилегии, и в них все упомянутые задачи ложатся на разработчика. Также напомню, что, как и плагины-источники, скрипты могут отображаться в разделах «Видео», «Музыка» и/или «Фото», если они исполняют некие задачи по работе с указанным контентом, либо же в разделе «Программы», если это плагины-скрипты всеобщего назначения. Помимо того, плагины-скрипты также могут скачивать субтитры, трудиться как фоновые службы и т. п. Функция плагина определяется тэгами в файле Addon.xml, содержащем всю информацию о нашем плагине.

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

Для понимания этих статей крайне желанно отличное познание тезисов ООП и написания GUI-приложений на языке Python (дальше — Питон).

Всеобщая информация

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

Компоненты интерфейса плагина

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

Разглядим первые 2 пункта подробнее.

Классы WindowXML и WindowXMLDialog

Как следует из наименований, эти классы-контейнеры применяют скелет интерфейса, написанный на XML и имеющий конструкцию, аналогичную структуре скинов XBMC. Т. е. по сути интерфейс на базе этих классов имеет свой личный мини-скин. Углубляться в заросли скинописательства (в котором я, сознаться, разбираюсь слабо) я не хочу, следственно останавливаться детально на этих классах я не буду.

Классы Window и WindowDialog

Классы Window и WindowDialog представляют собой родительские контейнеры, в которых размещаются другие элементы интерфейса — контролы. Для размещения контролов эти классы предоставляют координатную сетку, начинающуюся от левого верхнего угла экрана. По умолчанию разрешение видимой области координатной сетки равно 1280 х 720 пикселей. Это разрешение дозволено менять, но лично я не вижу в этом специального смысла, следственно в примерах будет применяться стандартное разрешение видимой области. Я не напрасно употребил термин «видимая область». Координаты контролов могут иметь всякие значения, в т. ч. и негативные, но на экране будет видно только то, что попадает в видимую область. Это монный текст с механическим переносом строк. Прокрутки нет, и текст, тот, что не поместился в текстовое окно, обрезается.

ControlImage

Картинка. Поддерживаются основные форматы файлов изображений (jpg, png, gif). В файлах png и gif поддерживается прозрачность (если есть). По умолчанию картинка вписывается в отведенное место с искажением пропорций, но метод вписывания дозволено задавать.

ControlButton

Кнопка. Обработчик нажатия на кнопку прописывается в способе onControl() класса-контейнера.

ControlRadioButton и ControlCheckMark

Радиокнопка и флажок («галочка»). Функционально всецело аналогичны и отличаются только внешним видом. Применяются в качестве переключателя с двумя состояниями.

ControlEdit

Поле для ввода текста. При выборе открывается экранная клавиатура, дозволяющая ввести необходимый текст. Если указать параметр isPassword=True, вводимый текст будет заменяться звездочками.

ControlList

Список. В список дозволено добавлять примитивные текстовые строки, но на самом деле всякий элемент списка представляет собой экземпляр класса ListItem. Напомню, что из таких же элементов состоят списки в плагинах-источниках контента. Впрочем, в различие от плагинов-источников, в ControlList функциональность элементов списка ограничена. Реально поддерживаются только текстовые подписи и маленькие иконки (thumbnailImage). Всю остальную логику, скажем действие при выборе элемента списка, необходимо реализовывать самому. Контрол требует текстуры для оформления списка.

Если все элементы списка не помещаются в отведенное место, список прокручивается.

ControlSlider

Ползунок со шкалой. Служит для плавной регулировки какого-либо параметра. Требует очевидного указания текстур.

Примеры контролов, оформленных с применением текстур скина Confluence, дозволено увидеть на скриншоте ниже.

Основные контролы интерфейса плагина

ControlButton, ControlCheckMark, ControlEdit, ControlList и ControlSlider представляют собой интерактивные элементы, которые меняют свой вид при их выборе. Теоретически предпочесть дозволено всякий контрол, скажем, ControlLabel, но при этом не будет никакой визуальной обратной связи.

Для навигации по интерфейсу плагина при помощи клавиш со стрелками на клавиатуре либо пульте ДУ всякому контролу необходимо назначить соседей, на которых будет перемещаться фокус при нажатии соответствующей клавиши со стрелкой. Для этого служат способы setNavigation, а также controlUp, controlDown, controlLeft и controlRight, унаследованные от Control.
Помимо того, Дабы навигация работала, при исходном отображении интерфейса не забываем установить фокус на один из контролов.

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

Сейчас перейдем к утилитарным примерам. Начнем, безусловно же, с классического «Hello, World!», либо в русском варианте «Здравствуй, мир!».

Плагин «Здравствуй, мир!»

Как я теснее говорил в своей первой статье, для всякого плагина необходим непременный рабочий файл addon.xml.

Содержимое addon.xml

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<addon id="script.test"
   name="Test script"
   version="0.0.1"
   provider-name="Roman_V_M">
  <requires>
    <import addon="xbmc.python" version="2.0"/>
  </requires>
  <extension point="xbmc.python.script" library="default.py">
    <provides>executable</provides>
  </extension>
  <extension point="xbmc.addon.metadata">
    <platform>all</platform>
    <summary lang="en">Test script</summary>
    <description lang="en">My test script.</description>
  </extension>
</addon>

Строки

<extension point="xbmc.python.script" library="default.py">
    <provides>executable</provides>
  </extension>

говорят нам (и XBMC) о том, что это программный плагин-скрипт, тот, что будет доступен в разделе «Программы».

Сейчас непринужденно код нашего плагина:

Содержимое default.py

# -*- coding: utf-8 -*-
# Licence: GPL v.3 http://www.gnu.org/licenses/gpl.html

# Импортируем необходимый модуль
import xbmcgui

# Коды клавиатурных действий
ACTION_PREVIOUS_MENU = 10 # По умолчанию - ESC
ACTION_NAV_BACK = 92 # По умолчанию - Backspace

# Основной класс-контейнер
class MyAddon(xbmcgui.Window):

    def __init__(self):
        # Создаем текстовую надпись.
        label = xbmcgui.ControlLabel(550, 300, 200, 50, u'Здравствуй, мир!')
        # Добавляем наддпись в контейнер
        self.addControl(label)

    def onAction(self, action):
        # Если нажали ESC либо Backspace...
        if action == ACTION_NAV_BACK or action == ACTION_PREVIOUS_MENU:
            # ...закрываем плагин.
            self.close()

if __name__ == '__main__':
    # Создаем экземпляр класса-контейнера.
    addon = MyAddon()
    # Выводим контейнер на экран.
    addon.doModal()
    # По заключении удаляем экземпляр.
    del addon

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

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

13—25: описываем класс, реализующий наш интерфейс. В данном случае класс наследует от Window. Наш интерфейс содержит исключительный контрол — ControlLabel с соответствующей надписью. Обратите внимание, что первые 4 параметра контрола — его координаты и размеры по ширине и высоте в пикселях координатной сетки. Эти параметры являются непременными. Координаты и размеры дозволено позднее менять при необходимости. Если мы хотим сделать контрол, но отложить его итог на экран, то дозволено указать фальшивые координаты и/или размеры, а настоящие параметры задавать позже отображения контрола.
За добавление контролов в контейнер отвечает способ addControl() родительского класса.

В способе onAction мы перехватываем клавиатурные события, соответствующие клавишам ESC и Backspace, Дабы иметь вероятность выйти из нашего плагина. Еще раз повторюсь, плагин-скрипт, использующий классы Window либо WindowDialog, должен непременно иметь код, дозволяющий выйти из него, не прибегая к коренным мерам, как бы диспетчера задач.
Примечание: невзирая на сопоставление с целыми числами, параметр action на самом деле представляет собой экземпляр служебного класса Action.

32: способ doModal() выводит сделанный нами интерфейс на экран. Данный способ аналогичен способам mainloop() в Tkinter.Tk либо show() в QWidget. Интерфейс будет отображаться до тех пор, пока не будет вызван способ close().

34: для чего удалять экземпляр класса по заключении работы я, Добросовестно говоря, не знаю. Это я увидел в примере в официальной WiKi.

Если всё сделано верно, мы обязаны увидеть

вот такую картинку.

Согласитесь, не дюже симпатичное представление. Как сказано выше, класс Window имеет черный непрозрачный фон. Следственно в дальнейшем примере мы попытаемся немножко украсить наш интерфейс, а также добавить некоторые интерактивные элементы.

Ради любопытства испробуйте наследовать от WindowDialog. При таком варианте надпись появится поверх интерфейса XBMC.

Готовый плагин «Здравствуй, мир!» дозволено скачать отсель. Напомню, что установить плагин дозволено из меню «Система» > «Дополнения» > «Установить

Источник: programmingmaster.ru
Оставить комментарий
Форум phpBB, русская поддержка форума phpBB
Рейтинг@Mail.ru 2008 - 2017 © BB3x.ru - русская поддержка форума phpBB