Разработка виджетов Plasma - часть 1

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


Инструменты, которые рекомендую использовать (есть аналоги, но если вы без опыта, то это быстрее):

1. QtCreator - IDE специально для Qt, имеет самую лучшую поддержку языка QML (альтернатива - Kdevelop). Во многих дистрибутивах идет в комплекте по-умолчанию - если нет, установите с помощью пакетного менеджера вашего дистрибутива.

2. Plasmoidviewer (входит в пакет plasma-sdk) - очень рекомендую, дабы не перезапускать Plasmashell при тестировании виджета. Позволяет тестировать виджет в отдельном окне (альтернатива - plasmawindowed, но меньше настроек).

3. Любая консоль (для чтения логов во время тестирования).

4. Настоятельно рекомендую ознакомится с QML и QtQuick (именно на нем будет происходить вся магия + JS). Язык очень простой, но некоторые вещи неочевидны. Ссылка - https://doc.qt.io/qt-5/qtquick-qmlmodule.html


Самый простой способ обучения - это посмотреть исходный код других виджетов. Встроенные виджеты (или добавленные мейнтейнерами вашего дистрибутива) находятся в /usr/share/plasma/plasmoids/, а сторонние (отдельно установленные для пользователя) в /home/%username%/.local/share/plasma/plasmoids/ (я сам лично начинал именно так, потому что документации практически никакой, а та, которую нашел была очень устаревшей - сейчас понемногу ситуация исправляется).


Структура файлов плазмоида: Уникальное имя папки (например: com.mydomain.myplasmoid), внутри это:

├── contents

│ ├── ui

│ │ ├── main.qml

│ │ └── configGeneral.qml

│ └── config

│ ├── config.qml

│ └── main.xml

└── metadata.desktop


Начнем с описания виджета (файл metadata.desktop). Этот файл необходим для работы виджета и определения его системой. Вот примерное его содержание:


[Desktop Entry]

Name=My Plasmoid

Comment=A widget to take over the world!

Type=Service

Icon=battery

X-KDE-ServiceTypes=Plasma/Applet

X-Plasma-API=declarativeappletscript

X-Plasma-MainScript=ui/main.qml

X-KDE-PluginInfo-Author=My Name

X-KDE-PluginInfo-Email=myemail@gmail.com

X-KDE-PluginInfo-Name=com.mydomain.myplasmoid

X-KDE-PluginInfo-Version=1

X-KDE-PluginInfo-Website=https://github.com/username/myplasmoid

X-KDE-PluginInfo-Category=System Information


Кратко пройдусь по основным строкам:


Name - название плазмоида

Comment - описание виджета (опционально)

Type (тут точно Service, т.к. не является отдельным приложением)

Icon - иконка для отображения при установке (название берется из темы, путь прописать пока нельзя)

X-KDE-ServiceTypes=Plasma/Applet, X-Plasma-API=declarativeappletscript - оставляем как есть

X-Plasma-MainScript - путь к исполняемому файлу (с него начинается выполнение)

X-KDE-PluginInfo-Author, X-KDE-PluginInfo-Email - данные автора виджета

X-KDE-PluginInfo-Name - ВАЖНО - должно совпадать с названием основной папки виджета

X-KDE-PluginInfo-Version - используется во внутренних процессах, например для отображения версии клиенту (стоит менять при обновлении)

X-KDE-PluginInfo-Website - ссылка на исходник (опционально)

X-KDE-PluginInfo-Category - используется для определения категории в репозитории store.kde.orgpling.com) Примеры категорий здесь: https://techbase.kde.org/Projects/Plasma/PIG


Содержимое main.qml (далее немного копипасты, если непонятно, пишите в комментариях) -

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

У вас может быть виджет на панели, который представляет собой просто значок, при нажатии на который будет отображаться всплывающее окно.

Вы также можете разместить его на рабочем столе как виджет рабочего стола, размер которого может быть изменен пользователем. Как виджет рабочего стола, он может переключаться между «видом значков», когда он меньше (который открывает всплывающее окно), и прямым отображением содержимого всплывающего окна на рабочем столе, когда достаточно места.

Вы также можете разместить виджет внутри другого виджета (контейнера), такого как системный трей или сама панель.


Пример самого простого файла main.qml:


import QtQuick 2.0

import org.kde.plasma.components 2.0 as PlasmaComponents

PlasmaComponents.Label {

text: "Hello world in Plasma 5 ";

color: "black";

}


Если вы ранее пользовались QtQuick, то все должно быть понятно, если нет, научиться несложно, там очень простой синтаксис для построения интерфейсов (ссылка в начале поста). Дополнение: PlasmaComponents - отдельный класс для Plasma (обычно наследуется от QtQuickControls - позже опишу чуть подробнее).


Остальные файлы и папки в структуре необязательны (но без них не сделать что-то полезное), опишу в следующих постах.


Если вы сделали уникальное имя папки плазмоида, указали ее название в metadata.desktop и существует файл main.qml (название и путь может отличаться, настраивается в metadata.desktop) - вы уже можете скопировать корневую папку в /home/%username%/.local/share/plasma/plasmoids/ и добавить ваш виджет на панель или рабочий стол. Самым лучшим способом тестирования является plasmoidviewer (как я писал выше). Запустите в консоли команду plasmoidviewer -a com.mydomain.myplasmoid (укажите атрибут X-KDE-PluginInfo-Name вместо com.mydomain.myplasmoid) и вы увидите результат в отдельном окне (позже я покажу несколько атрибутов команды plasmoidviewer, для опытных man plasmoidviewer).


Пока на этом все, продолжение следует.

Не стесняйтесь задавать вопросы в комментариях )


GNU/Linux

1K поста15.5K подписчиков

Добавить пост

Правила сообщества

Все дистрибутивы хороши.

Будьте людьми.