Не так давно в leechcraft появился новый вид "плагинов" - кварки. Управлением и отображением кварков занимается плагин SB2. В общем плане все кварки можно разделить на 3 вида:
- Кварк-плагин
- Кварк-часть-плагина.
- Кварк-дополнение.
1. Кварк-плагин.
Ключевая особенностьэтого вида кварков в том, что они являются полноценными плагинами - компилируются в динамические библиотеки, распространяются наравне с обыными плагинами для leechcraft через репозитории дистрибутивов. Пример: TPI.
2. Кварк-часть-плагина.
Этот вид кварков скорее виртуальный, чем реальный. Просто некоторые плагины отображают какие-то свои события или что-то еще в sb2, как это делает kbswitch (флаг текущей раскладки - это и есть кварк), или, например, GMailNotifier (отображает кварк в случае наличия непрочитанных сообщений)
3. Кварк-дополнение.
Ближайшая аналогия - дополнения в firefox. Устанавливается через LackMan, а значит не является бинарным файлом. В данный момент наилучшим вариантом для создания таких кварков является QML. Именно на этом варианте кварков я остановлюсь более подробно.
Создание кварка-дополнения.
Для того, что бы у нас появился рабочий кварк нам необходимо 2 файла: файл кварка и манифест. Файл кварка именуется как QuarkName.qml, а манифест - QuarkName.qml.manifest соответственно.
Для начала рассмотрим синтаксис файла-манифеста.
{
"quarkName": "Meteor",
"description": "Weather forecast quark",
"icon": "weather-clouds",
"areas": [ "panel" ]
}
Ну, с quarkname и description - все понятно. С icon тоже (иконка кварка из системной темы, которая будет отображаться в панели.) Еще может быть поле quarkID, но я пока не понял является ли оно обязательным или нет. Без него все работает. areas - задает список допустимых позиций для кварка. На данный момент поддерживается только panel, которая указывает на то, что кварк может быть встроен в sb2-панель. Еще одно допустимое значение - dashboard, но в данный момент оно игнорируется в связи с отсутствием этого самого dashboard.
Теперь сокращенный вид моего главного файла кварка - Meteor.qml
import QtQuick 1.1
import org.LC.common 1.0
Item
{
id: rootRect
implicitWidth: parent.quarkBaseSize
implicitHeight: parent.quarkBaseSize
ActionButton
{
id: weatherButton
anchors.fill: parent
}
}
На что тут стоит обратить в первую очередь внимание? На размер кварка: implicitWidth и implicitHeight. Значения для них берутся из SB2 и хранятся в параметре quarkBaseSize.
Вообще многие необходимые вещи уже созданы или определены в SB2. В конце я дам ссылки на файлы и опишу, что там можно найти полезного.
Собственно, самый простейший, ничего не делающий кварк создан.Настройки кварка.
Что нам делать, если для кварка нам необходимы настройки? Разработчики и об этом тоже позаботились. Достаточно создать файл QuarkName.qml.settings, а внутри него описать настройки в обычном для личкрафтов
xsd-формате.
Все параметры-ключи настроек становятся доступны в кварке, как параметры. Например, это часть настроек Meteor.qml.settings
А в коде это используется так:
Timer
{
id: updateTimer
interval: UpdateTemperatureInterval *60*1000
repeat: true
running: true
triggeredOnStart: true
onTriggered:
{
requestNewWeather ();
requestWeatherForecast ();
}
}
Как мы видим - ничего сложного. Это что касательно чтения настроек.
Для записи имеется специальный объект QuarkName_Settings у которого есть метод setSettingsValue (key, value);
Открытие дополнительных окон
Часто возникает необходимость открыть какое-то окошко или просто показать расширенный тултип с картинками и текстом. В этом нам поможет quarkProxy и его метод openWindow
В моем кварке по клику открывается окошко с прогнозом погоды. Выглядит вызов следующим образом:
onTriggered:
{
var global= commonJS.getTooltipPos (rootRect);
var params = {
x: global.x,
y: global.y,
existing: "toggle",
weatherIcon: weatherButton.actionIconURL,
weatherScaleImage: useSystemIconSet,
weatherInfo: rootRect.weatherData,
forecastInfo: rootRect.weatherForecastData,
TemperatureUnit: TemperatureUnit,
PressureUnit: PressureUnit,
WindSpeedUnit: WindSpeedUnit,
UseSystemIconSet: UseSystemIconSet,
ForecastDaysCount: ForecastDaysCount,
Meteor_Settings: Meteor_Settings
};
showForecastWindow = !showForecastWindow;
rootRect.forecastWindow = quarkProxy.openWindow(sourceURL,
"MeteorForecastWindow.qml", params);
}
Тут стоит обратить внимание на несколько ключевых моментов.
- Нам нужно получить позиции, где показывать окно. В этом нам помогает getTooltipPos.
- Необходтимо передать все необходимые параметры в новое окно. Обратите внимание, что так же передаются все параметры настроек, потому что иначе в новом окне настройки будут не доступны.
- Стоит обратить внимание на параметр existing. Если он равен 'toggle" или вообще отсутствует, то при повторном вызове метода openWindow с этим же параметром закроет окно.
"Новое окно" должно так же иметь сигнал closeRequested () и функцию beforeDelete (). Функция beforeDelete () вызывается перед удалением окна и позволяет подчистить или подрпавить какие-то параметры. closeRequested я так и не понял когда надо излучать, но раз требуется, значит требуется.Внешний вид
Главное условие - не забываем использовать личкрафтовые темы для градиентов и цветов.Заключение
Вот собственно все ключевые моменты я описал. Ничего очень сложного нету. Сейчас я приведу ссылки на файлы, которые по-моему полезны для разработки кварков:
- сolorthemeproxy.h - тут можно посмотреть все возможные параметры для задания цветов.
- quarksettingsmanager.h - тут методы для работы с настройками для кварков.
- quarkproxy.h - а это проксик для кварков. Методы октрытия окон и всякое другое. Не менее полезен, чем предыдущие.
- Ну и конечно лучшим подспорьем всегда будет уже готовый кварк. В репозитории есть AnalogClock или посмотрите кварки в GMailNotifier или KBSwith
Надеюсь все, что я тут написал, поможет кому-то в создании своих кварков.
Posted via LeechCraft Blogique.