Разработка плагина OnlineBookmarks. Part 1: "Base plugin"

Sep 17, 2011 17:30


С этого поста я начну пошагово рассказывать как писать плагин для плагина в 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подсветка кода
  1. SET (CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake")  
  2. INCLUDE_DIRECTORIES (${POSHUKU_INCLUDE_DIR}  
  3.     ${CMAKE_CURRENT_BINARY_DIR}  
  4.     ${CMAKE_CURRENT_SOURCE_DIR}  
  5.     )  
  6. SET (ONLINEBOOKMARKS_SRCS  
  7.     )  
  8. SET (ONLINEBOOKMARKS_HEADERS  
  9.     )  
  10. QT4_WRAP_CPP (ONLINEBOOKMARKS_MOC_SRCS ${ONLINEBOOKMARKS_HEADERS})  
  11.  
  12. ADD_LIBRARY (leechcraft_poshuku_onlinebookmarks SHARED  
  13.     ${ONLINEBOOKMARKS_SRCS}  
  14.     ${ONLINEBOOKMARKS_MOC_SRCS}  
  15.     )  
  16. TARGET_LINK_LIBRARIES (leechcraft_poshuku_onlinebookmarks  
  17.     ${QT_LIBRARIES}  
  18.     ${LEECHCRAFT_LIBRARIES}  
  19.     )  
  20. INSTALL (TARGETS leechcraft_poshuku_onlinebookmarks DESTINATION ${LC_PLUGINS_DEST})  
2. Создание базового класса

Теперь нам необходимо создать базовый класс для нашего плагина. Истрически сложилось, что базовый класс называется Plugin, но файлы называются по имени плагина. Структура базового класса для плагина тоже типовая. Стоит обратить внимание на то, что #ifdef гарды пишутся по полному пути к файлу, а namespace - по ключевым директориям. Поэтому получаем такой onlineboormarks.h:

copy to clipboardподсветка кода
  1. #ifndef PLUGINS_POSHUKU_PLUGINS_ONLINEBOOKMARKS_ONLINEBOOKMARKS_H  
  2. #define PLUGINS_POSHUKU_PLUGINS_ONLINEBOOKMARKS_ONLINEBOOKMARKS_H  
  3. #include   
  4. #include   
  5. #include   
  6. #include   
  7.  
  8. namespace LeechCraft  
  9. {  
  10. namespace Poshuku  
  11. {  
  12. namespace OnlineBookmarks  
  13. {  
  14.     class Plugin   : public QObject  
  15.                             , public IInfo  
  16.                             , public IPlugin2  
  17.     {  
  18.         Q_OBJECT  
  19.         Q_INTERFACES (IInfo IPlugin2)  
  20.         boost::shared_ptr Translator_;  
  21.     public:  
  22.         void Init (ICoreProxy_ptr);  
  23.         void SecondInit ();  
  24.         void Release ();  
  25.         QByteArray GetUniqueID () const;  
  26.         QString GetName () const;  
  27.         QString GetInfo () const;  
  28.         QIcon GetIcon () const;  
  29.         QSet GetPluginClasses () const;  
  30.     };  
  31. }  
  32. }  
  33. }  
  34.  
  35. #endif // PLUGINS_POSHUKU_PLUGINS_ONLINEBOOKMARKS_ONLINEBOOKMARKS_H

Как мы видим, плагин отнаследован от IInfo (все плагин должны быть отнаследованы от него) и IPlugin2 (все плагины для плагинов должны быть отнаследованы от этого интерфейса).
QTranslator необходим для будущих переводов. Если в вашем плагине нечего будет локализовывать, то он не нужен.
Класс onlinebookmarks.cpp выглядит так:

copy to clipboardподсветка кода
  1. #include "onlinebookmarks.h"
  2. #include  
  3. namespace LeechCraft  
  4. {  
  5. namespace Poshuku  
  6. {  
  7. namespace OnlineBookmarks  
  8. {  
  9.     void Plugin::Init (ICoreProxy_ptr proxy)  
  10.     {  
  11.     }  
  12.     void Plugin::SecondInit ()  
  13.     {  
  14.     }  
  15.     void Plugin::Release ()  
  16.     {  
  17.     }  
  18.     QByteArray Plugin::GetUniqueID () const  
  19.     {  
  20.         return "org.LeechCraft.Poshuku.OnlineBookmarks";  
  21.     }  
  22.     QString Plugin::GetName () const  
  23.     {  
  24.         return "Poshuku OnlineBookmarks";  
  25.     }  
  26.     QString Plugin::GetInfo () const  
  27.     {     
  28. return tr ("Sync local bookmarks with your account in online bookmark services like Read It Later");  
  29.     }  
  30.     QIcon Plugin::GetIcon () const  
  31.     {  
  32.         return QIcon ();  
  33.     }  
  34.     QSet Plugin::GetPluginClasses () const  
  35.     {  
  36.         QSet result;  
  37.         result << "org.LeechCraft.Poshuku.Plugins/1.0";  
  38.         return result;  
  39.     }  
  40. }  
  41. }  
  42. }  
  43. Q_EXPORT_PLUGIN2 (leechcraft_poshuku_onlinebookmarks,  
  44.         LeechCraft::Poshuku::OnlineBookmarks::Plugin);  
  45.   
Итак теперь мы можем скомпилировать leechcraft и убедиться, что все прошло удачно. Плагин OnlineBookmarks появился в списке плагинов в настройках.2.1 Добавление иконки к плагину.

Конечно было бы не плохо бы добавить к своему плагину иконку. Для этого создаем директорию в корне плагина: resources/images/  и помещаем туда иконку в формате svg с именем соответствующим плагину (в нашем случае onlinebookmarks.svg).

Далее необходимо создать файл ресурсов с именем: <имя_родительского_плагина><имя_плагина>resources.qrc. Итак наша файл ресурсов выглядит следующим образом -

poshukuonlinebookmarksresources.qrc

copy to clipboardподсветка кода
  1.   
  2.   "/plugins/poshuku/plugins/onlinebookmarks" >  
  3.     resources/images/onlinebookmarks.svg  
  4.     
  5.   

Далее необходимо изменить CMakeLists.txt плагина добавив в него:

SET (ONLINEBOOKMARKS_RESOURCES poshukuonlinebookmarksresources.qrc)

QT4_ADD_RESOURCES (ONLINEBOOKMARKS_RCCS ${ONLINEBOOKMARKS_RESOURCES})

И добавить в разделе ADD_LIBRARY строчку ${ONLINEBOOKMARKS_RCCS} и в итоге наш ADD_LIBRARY выглядит следующим образом:

copy to clipboardподсветка кода
  1. ADD_LIBRARY (leechcraft_poshuku_onlinebookmarks SHARED  
  2.     ${ONLINEBOOKMARKS_SRCS}  
  3.     ${ONLINEBOOKMARKS_MOC_SRCS}  
  4.     ${ONLINEBOOKMARKS_RCCS})  

Теперь нам необходимо указать плагину, что именно эту иконку мы будем использовать для него. Для этого приводим метод QIcon Plugin::GetIcon () const к следующему виду:

copy to clipboardподсветка кода
  1. QIcon Plugin::GetIcon () const  
  2. {  
  3.     return QIcon (":/plugins/poshuku/plugins/onlinebookmarks/resources/images/onlinebookmarks.svg");  
  4. }  

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

программирование, plugins, leechcraftdevblog, qt, coding is my life, opensource, С++, leechcraft

Previous post Next post
Up