47

Разработка виджетов 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

1.2K поста15.6K подписчиков

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

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

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

Вы смотрите срез комментариев. Показать все
0
DELETED
Автор поста оценил этот комментарий

Кстати, а что там с обещаниями Qt Project не открывать исходники версий в open-source в течение 12 месяцев с релиза? Есть какие-то подвижки, или KDE всё так же в напряженном ожидании?

раскрыть ветку (4)
0
Автор поста оценил этот комментарий

Там вроде порешали полюбовно (KDE Foundation не коснется).

раскрыть ветку (3)
0
DELETED
Автор поста оценил этот комментарий

Че-то я не видел этого полюбовного решения. Насколько я понял, вопрос завис в воздухе, а само KDE могут очень так сильно опрокинуть, потому что Qt ориентируется теперь в основном на Android и automotive.

Я по этой причине перестал рассматривать Qt для своих open-source поделок.

раскрыть ветку (2)
0
Автор поста оценил этот комментарий

Вкратце: Qt решила закрутить гайки поиметь максимально золота от KDE (по договору сотрудничества). В ответ они получили много говна ответной реакции в виде "так делать не надо" (причем не только от KDE). После этого Qt заявили, что ничего такого не планировалось и это все происки нечистой силы слухи.

раскрыть ветку (1)
0
DELETED
Автор поста оценил этот комментарий

После этого Qt заявили, что ничего такого не планировалось

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

Вы смотрите срез комментариев. Чтобы написать комментарий, перейдите к общему списку