How to create panel plugin (rus)

SokoloffA edited this page Apr 5, 2012 · 5 revisions

#How to по написанию плагинов для панели. ##Немного теории. Плагин для панели - это библиотека написаная на C++. Еще одна обязательная вещь - это desktop-файл описывающий этот плагин. Так же могут быть дополнительные файлы, вроде переводов. Сами плагины будут установлены в /usr/local/lib/razor-panel или /usr/lib/razor-panel (зависит от опции -DCMAKE_INSTALL_PREFIX у cmake). Desktop файлы устанавливаются в /usr/local/share/razor/razor-panel, переводы в /usr/local/share/razor/razor-panel/ИМЯ_ПЛАГИНА.

Для сборки Вам нужно дерево исходников, последнюю версию можно взять из GIT git clone git://github.com/Razor-qt/razor-qt.git или как архив отсюда. Исходники плагинов для панели находятся в поддиректории razorqt-panel.

Давайте напишем простейший плагин - helloworld. Создаем директорию razorqt-panel/plugin-helloworld. Cmake проект не может иметь два подпроекта с одинаковыми именами, а один подпроект helloworld уже есть, поэтому нам придется использовать жутковатое "panelhelloworld".

##CMake. Копируем CMakeLists.txt от плагина часов, и правим его:

cmake_minimum_required(VERSION 2.6)

set(PLUGIN "panelhelloworld")

set(HEADERS
    razorhelloworld.h
)

set(SOURCES
    razorhelloworld.cpp
)

set(MOCS
    razorhelloworld.h
)

set(UIS
)

#*******************************************
include ("../BuildPlugin.cmake")
BUILD_RAZOR_PLUGIN(${PLUGIN})

И добавим наш плагин в общую систему сборки. Для этого добавим несколько строк в razorqt-panel/CMakeLists.txt

...
# *******************************************************************
# What plugins will be built, by default.
# You can enable/disable building of the plugin using cmake options.
#    cmake -DCLOCK_PLUGIN=Yes .. # Enable clock plugin
#    cmake -DCLOCK_PLUGIN=No ..  # Disable clock plugin

...
setByDefault(HELLOWORLD_PLUGIN Yes)
# *******************************************************************
...
if (HELLOWORLD_PLUGIN)
    set(ENABLED_PLUGINS ${ENABLED_PLUGINS}   "HelloWorld")
    add_subdirectory(plugin-helloworld)
endif (HELLOWORLD_PLUGIN)

##Desktop файл. Чтоб отобразить список доступных плагинов, панели нужно знать какие вообще плагины установлены и как они называются. Для этого каждый плагин предоставляет .desktop-файл со своим описанием. Опять за основу возьмем файл от часов. Создаем поддиректорию razorqt-panel/plugin-helloworld/resources и копируем в нее desktop-файл под именем panelhelloworld.desktop, и приводим его к виду:

[Desktop Entry]
Type=Service
ServiceTypes=RazorPanel/Plugin

Name=Hell World
Comment=A "hello world" super plugin.

Name[ru]=Привет мир
Comment[ru]=Супер плагин "Привет Мир".

##Код. Наконец дошло дело до кода. Плагин - это класс наследник RazorPanelPlugin. Который в свою очередь наследник QWidget-а. Создаем 2 файла - razorhelloworld.h и razorhelloworld.cpp. Они не большие приведу их полностью.

razorqt-panel/plugin-helloworld/razorhelloworld.h
01 /* BEGIN_COMMON_COPYRIGHT_HEADER
02  * (c)LGPL2+
03  *
04  * Razor - a lightweight, Qt based, desktop toolset
05  * http://razor-qt.org
06  *
07  * Copyright: 2012 Razor team
08  * Authors:
09  *   Alexander Sokoloff <sokoloff.a@gmail.com>
10  *
11  * This program or library is free software; you can redistribute it
12  * and/or modify it under the terms of the GNU Lesser General Public
13  * License as published by the Free Software Foundation; either
14  * version 2.1 of the License, or (at your option) any later version.
15  *
16  * This library is distributed in the hope that it will be useful,
17  * but WITHOUT ANY WARRANTY; without even the implied warranty of
18  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
19  * Lesser General Public License for more details.
20  *
21  * You should have received a copy of the GNU Lesser General
22  * Public License along with this library; if not, write to the
23  * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
24  * Boston, MA 02110-1301 USA
25  *
26  * END_COMMON_COPYRIGHT_HEADER */
27
28 #ifndef RAZORHELLOWORLD_H
29 #define RAZORHELLOWORLD_H
30
31 #include "../panel/razorpanelplugin.h"
32 #include <QtGui/QPushButton>
33
34 class RazorHelloWorld : public RazorPanelPlugin
35 {
36    Q_OBJECT
37 public:
38     RazorHelloWorld(const RazorPanelPluginStartInfo* startInfo, QWidget* parent = 0);
39     ~RazorHelloWorld();
40
41     virtual RazorPanelPlugin::Flags flags() const { return PreferRightAlignment; }
42
43 private slots:
44     void showMessage();
45 
46 private:
47     QPushButton mButton;
48 };
49
50 EXPORT_RAZOR_PANEL_PLUGIN_H
51
52 #endif // RAZORHELLOWORLD_H

razorqt-panel/plugin-helloworld/razorhelloworld.cpp

01 /* BEGIN_COMMON_COPYRIGHT_HEADER
02  * (c)LGPL2+
03  *
04  * Razor - a lightweight, Qt based, desktop toolset
05  * http://razor-qt.org
06  *
07  * Copyright: 2012 Razor team
08  * Authors:
09  *   Alexander Sokoloff <sokoloff.a@gmail.com>
10  *
11  * This program or library is free software; you can redistribute it
12  * and/or modify it under the terms of the GNU Lesser General Public
13  * License as published by the Free Software Foundation; either
14  * version 2.1 of the License, or (at your option) any later version.
15  *
16  * This library is distributed in the hope that it will be useful,
17  * but WITHOUT ANY WARRANTY; without even the implied warranty of
18  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
19  * Lesser General Public License for more details.
20  *
21  * You should have received a copy of the GNU Lesser General
22  * Public License along with this library; if not, write to the
23  * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
24  * Boston, MA 02110-1301 USA
25  *
26  * END_COMMON_COPYRIGHT_HEADER */
27
28 #include "razorhelloworld.h"
29 #include <QtGui/QMessageBox>
30 
31 EXPORT_RAZOR_PANEL_PLUGIN_CPP(RazorHelloWorld)
32 
33 RazorHelloWorld::RazorHelloWorld(const RazorPanelPluginStartInfo* startInfo, QWidget* parent):
34     RazorPanelPlugin(startInfo, parent)
35 {
36     setObjectName("HelloWorld");
37 
38     mButton.setText(tr("HW"));
39     addWidget(&mButton);
40     connect(&mButton, SIGNAL(clicked()), this, SLOT(showMessage()));
41 }

42 RazorHelloWorld::~RazorHelloWorld()
43 {
44 }

45 void RazorHelloWorld::showMessage()
46 {
47     QMessageBox::information(0, tr("Panel"), tr("Hello, World!"));
48 }

Первые 26 строк - лицензия, предпочтительно использовать LGPL2+ как наиболее либеральную из GPL.

Строка 31 в H-файле - Подключаем заголовочный файл с RazorPanelPlugin.

Конструктор (стр. 32 в H и 33-34 в CPP) - вам не надо парится о параметрах, RazorPanelPlugin сам обработает параметры.

Обязательно задайте ObjectName для плагина (стр. 36 в CPP), оно используется в файле темы.

Интересна функция Flags (41 в H), она возваращает набор флагов для вашего плагина, сейчас есть всего 2 флага

  • PreferRightAlignment - когда пользователь добавляет плагин на панель, он может добавится или слева или справа. Этот флаг учитывается только при добавлении плагина, в дальнейшем используются настройки пользователя. Скорее всего, Вам надо выставить его.

  • HaveConfigDialog - плагин имеет диалог настроек, у нас его нет.

##Сборка В корне дерева создаем директорию для сборки. Переходим в нее и запускаем cmake.

$ mkdir build
$ cd build
$ cmake -DCMAKE_BUILD_TYPE=Debug ..

Запускаем сборку и установку:

$ make && sudo make install

Проверить можно запустив новую панель и указав отдельный конфиг (панель автоматически создаст его):

$ razor-panel testplugin

Панель будет пустой и тонкой, не проглядите ее. Добавьте новый плагин через меню и наслаждайтесь :)


Полезная статья о том как создавать "Pull request'ы на GitHub"