С этого поста я начну пошагово рассказывать как писать плагин для плагина в
leechcraft . У всех постов будет тег LeechcraftDevBlog.
Это все я буду рассказывать на примере написания плагина OnlineBookmarks для Poshuku. Это плагин нужен для возможности отправлять свои закладки на сервисы типа
delicious или
readitlater , а так же для синхронизации локальных закладок с закладками на этих сервисах. Каждый сервис будет реализован как отдельный полноценный плагин.
Так как я сам все это буду осваивать так же постепенно и с нуля, как и читатели данного блога, то возможны ошибки и возвращения, и переделывания плагина по несколько раз. И так приступим.
1. Создание основы для плагина
Первым делом переходим в директорию leechcraft/plugins/poshuku/plugins и создаем там директорию для нашего плагина. Директория называется по имени плагина в нижнем регистре - onlinebookmarks. Далее идем к файлу CMakeLists.txt в плагине Poshuku и редактируем его следующим образом.
Добавляем строчку:
OPTION (ENABLE_POSHUKU_ONLINEBOOKMARKS "Build support of online bookmark synchronization for Poshuku browser" OFF)
Первый параметр является опцией для cmake для сборки данного плагина.
Второй - описание опции.
Третий - включен или нет данный плагин по умолчанию. Все новые плагины по умолчанию должны быть off .
Далее добавляем:
IF (ENABLE_POSHUKU_ONLINEBOOKMARKS)
ADD_SUBDIRECTORY (plugins/onlinebookmarks)
ENDIF (ENABLE_POSHUKU_ONLINEBOOKMARKS)
Это указывает cmake где именно находится исходный код нашего плагина.
Далее нам необходимо создать CMakeLists.txt для своего плагина. Для личкрафтов он практически типовой для всех плагино в:
copy to clipboard
подсветка кода - SET (CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake")
-
- INCLUDE_DIRECTORIES (${POSHUKU_INCLUDE_DIR}
- ${CMAKE_CURRENT_BINARY_DIR}
- ${CMAKE_CURRENT_SOURCE_DIR}
- )
-
- SET (ONLINEBOOKMARKS_SRCS
- )
-
- SET (ONLINEBOOKMARKS_HEADERS
- )
-
- QT4_WRAP_CPP (ONLINEBOOKMARKS_MOC_SRCS ${ONLINEBOOKMARKS_HEADERS})
-
- ADD_LIBRARY (leechcraft_poshuku_onlinebookmarks SHARED
- ${ONLINEBOOKMARKS_SRCS}
- ${ONLINEBOOKMARKS_MOC_SRCS}
- )
-
- TARGET_LINK_LIBRARIES (leechcraft_poshuku_onlinebookmarks
- ${QT_LIBRARIES}
- ${LEECHCRAFT_LIBRARIES}
- )
-
- INSTALL (TARGETS leechcraft_poshuku_onlinebookmarks DESTINATION ${LC_PLUGINS_DEST})
2. Создание базового класса
Теперь нам необходимо создать базовый класс для нашего плагина. Истрически сложилось, что базовый класс называется Plugin, но файлы называются по имени плагина. Структура базового класса для плагина тоже типовая. Стоит обратить внимание на то, что #ifdef гарды пишутся по полному пути к файлу, а namespace - по ключевым директориям. Поэтому получаем такой onlineboormarks.h:
copy to clipboard
подсветка кода - #ifndef PLUGINS_POSHUKU_PLUGINS_ONLINEBOOKMARKS_ONLINEBOOKMARKS_H
- #define PLUGINS_POSHUKU_PLUGINS_ONLINEBOOKMARKS_ONLINEBOOKMARKS_H
-
- #include
- #include
- #include
- #include
-
- namespace LeechCraft
- {
- namespace Poshuku
- {
- namespace OnlineBookmarks
- {
- class Plugin : public QObject
- , public IInfo
- , public IPlugin2
- {
- Q_OBJECT
- Q_INTERFACES (IInfo IPlugin2)
-
- boost::shared_ptr Translator_;
- public:
- void Init (ICoreProxy_ptr);
- void SecondInit ();
- void Release ();
- QByteArray GetUniqueID () const;
- QString GetName () const;
- QString GetInfo () const;
- QIcon GetIcon () const;
- QSet GetPluginClasses () const;
- };
- }
- }
- }
-
- #endif // PLUGINS_POSHUKU_PLUGINS_ONLINEBOOKMARKS_ONLINEBOOKMARKS_H
Как мы видим, плагин отнаследован от IInfo (все плагин должны быть отнаследованы от него) и IPlugin2 (все плагины для плагинов должны быть отнаследованы от этого интерфейса).
QTranslator необходим для будущих переводов. Если в вашем плагине нечего будет локализовывать, то он не нужен.
Класс onlinebookmarks.cpp выглядит так:
copy to clipboard
подсветка кода - #include "onlinebookmarks.h"
- #include
-
- namespace LeechCraft
- {
- namespace Poshuku
- {
- namespace OnlineBookmarks
- {
- void Plugin::Init (ICoreProxy_ptr proxy)
- {
- }
-
- void Plugin::SecondInit ()
- {
- }
-
- void Plugin::Release ()
- {
- }
-
- QByteArray Plugin::GetUniqueID () const
- {
- return "org.LeechCraft.Poshuku.OnlineBookmarks";
- }
-
- QString Plugin::GetName () const
- {
- return "Poshuku OnlineBookmarks";
- }
-
- QString Plugin::GetInfo () const
- {
- return tr ("Sync local bookmarks with your account in online bookmark services like Read It Later");
- }
-
- QIcon Plugin::GetIcon () const
- {
- return QIcon ();
- }
-
- QSet Plugin::GetPluginClasses () const
- {
- QSet result;
- result << "org.LeechCraft.Poshuku.Plugins/1.0";
- return result;
- }
- }
- }
- }
-
- Q_EXPORT_PLUGIN2 (leechcraft_poshuku_onlinebookmarks,
- LeechCraft::Poshuku::OnlineBookmarks::Plugin);
-
Итак теперь мы можем скомпилировать leechcraft и убедиться, что все прошло удачно. Плагин OnlineBookmarks появился в списке плагинов в настройках.2.1 Добавление иконки к плагину.
Конечно было бы не плохо бы добавить к своему плагину иконку. Для этого создаем директорию в корне плагина: resources/images/ и помещаем туда иконку в формате svg с именем соответствующим плагину (в нашем случае onlinebookmarks.svg).
Далее необходимо создать файл ресурсов с именем: <имя_родительского_плагина><имя_плагина>resources.qrc. Итак наша файл ресурсов выглядит следующим образом -
poshukuonlinebookmarksresources.qrc
copy to clipboard
подсветка кода -
- "/plugins/poshuku/plugins/onlinebookmarks" >
- resources/images/onlinebookmarks.svg
-
-
Далее необходимо изменить CMakeLists.txt плагина добавив в него:
SET (ONLINEBOOKMARKS_RESOURCES poshukuonlinebookmarksresources.qrc)
QT4_ADD_RESOURCES (ONLINEBOOKMARKS_RCCS ${ONLINEBOOKMARKS_RESOURCES})
И добавить в разделе ADD_LIBRARY строчку ${ONLINEBOOKMARKS_RCCS} и в итоге наш ADD_LIBRARY выглядит следующим образом:
copy to clipboard
подсветка кода - ADD_LIBRARY (leechcraft_poshuku_onlinebookmarks SHARED
- ${ONLINEBOOKMARKS_SRCS}
- ${ONLINEBOOKMARKS_MOC_SRCS}
- ${ONLINEBOOKMARKS_RCCS})
Теперь нам необходимо указать плагину, что именно эту иконку мы будем использовать для него. Для этого приводим метод QIcon Plugin::GetIcon () const к следующему виду:
copy to clipboard
подсветка кода - QIcon Plugin::GetIcon () const
- {
- return QIcon (":/plugins/poshuku/plugins/onlinebookmarks/resources/images/onlinebookmarks.svg");
- }
Теперь базовый плагин готов. В слудующем посте я расскажу о добавлении настроек к плагину.