Первым делом нам необходимо указать в CMakeLists.txt OnlineBookmarks, что он может иметь плагины и где их искать. Делается это так:
copy to clipboard
подсветка кода
-
SET (ONLINEBOOKMARKS_INCLUDE_DIR ${CURRENT_SOURCE_DIR})
-
-
OPTION (ENABLE_ONLINEBOOKMARKS_READITLATER "Build plugin for service Read It Later for OnlineBookmarks" ON)
-
-
IF (ENABLE_ONLINEBOOKMARKS_READITLATER)
-
ADD_SUBDIRECTORY (plugins/readitlater)
-
ENDIF (ENABLE_ONLINEBOOKMARKS_READITLATER)
Теперь OnlineBookmarks знает, что если при сборке было передано -DENABLE_ONLINEBOOKMARKS_READITLATER, то плагин следует искать в plugins/readitlater.
Cоздадим типовой CMakeLists.txt и класс Plugin для нашего плагина ReadItLater:
CMakeLists.txt:
copy to clipboard
подсветка кода
-
SET (CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake")
-
-
INCLUDE_DIRECTORIES (${ONLINEBOOKMARKS_INCLUDE_DIR}
-
${CMAKE_CURRENT_BINARY_DIR}
-
${CMAKE_CURRENT_SOURCE_DIR}
-
)
-
-
SET (READITLATER_SRCS
-
readitlater.cpp
-
)
-
-
SET (READITLATER_HEADERS
-
readitlater.h
-
)
-
-
QT4_WRAP_CPP (READITLATER_MOC_SRCS ${READITLATER_HEADERS})
-
-
ADD_LIBRARY (leechcraft_poshuku_onlinebookmarks_readitlater SHARED
-
${READITLATER_SRCS}
-
${READITLATER_MOC_SRCS}
-
)
-
-
TARGET_LINK_LIBRARIES (leechcraft_poshuku_onlinebookmarks_readitlater
-
${QT_LIBRARIES}
-
${LEECHCRAFT_LIBRARIES}
-
)
-
-
INSTALL (TARGETS leechcraft_poshuku_onlinebookmarks_readitlater DESTINATION ${LC_PLUGINS_DEST})
Тут стоит обратить внимание на параметр INCLUDE_DIRECTORIES - первой директорие мы передаем ${ONLINEBOOKMARKS_INCLUDE_DIR}, которую добавили в CMakeLists.txt плагина OnlineBookmarks (SET (ONLINEBOOKMARKS_INCLUDE_DIR ${CURRENT_SOURCE_DIR})).
И типовая база класса Plugin:
readitlater.h:
copy to clipboard
подсветка кода
-
#ifndef PLUGINS_POSHUKU_PLUGINS_ONLINEBOOKMARKS_READITLATER_READITLATER_H
-
#define PLUGINS_POSHUKU_PLUGINS_ONLINEBOOKMARKS_READITLATER_READITLATER_H
-
-
#include
-
#include
-
#include
-
-
namespace LeechCraft
-
{
-
namespace Poshuku
-
{
-
namespace OnlineBookmarks
-
{
-
namespace ReadItLater
-
{
-
class Plugin : public QObject
-
, public IPlugin2
-
, public IInfo
-
{
-
Q_OBJECT
-
Q_INTERFACES (IInfo IPlugin2)
-
public:
-
void Init (ICoreProxy_ptr proxy);
-
void SecondInit ();
-
void Release ();
-
QByteArray GetUniqueID() const;
-
QString GetName() const;
-
QString GetInfo() const;
-
QIcon GetIcon() const;
-
QSet GetPluginClasses () const;
-
};
-
}
-
}
-
}
-
}
-
-
#endif // PLUGINS_POSHUKU_PLUGINS_ONLINEBOOKMARKS_READITLATER_READITLATER_H
readitlater.cpp:
copy to clipboard
подсветка кода
-
#include "readitlater.h"
-
#include
-
-
namespace LeechCraft
-
{
-
namespace Poshuku
-
{
-
namespace OnlineBookmarks
-
{
-
namespace ReadItLater
-
{
-
void Plugin::Init (ICoreProxy_ptr proxy)
-
{
-
}
-
-
void Plugin::SecondInit ()
-
{
-
}
-
-
void Plugin::Release ()
-
{
-
}
-
-
QByteArray Plugin::GetUniqueID () const
-
{
-
return "org.LeechCraft.Poshuku.OnlineBookmarks.ReadItLater";
-
}
-
-
QString Plugin::GetName () const
-
{
-
return "Poshuku OB: Read It Later";
-
}
-
-
QString Plugin::GetInfo () const
-
{
-
return tr ("Sync local bookmarks with your account in Read It Later");
-
}
-
-
QIcon Plugin::GetIcon () const
-
{
-
return QIcon ();
-
}
-
-
QSet Plugin::GetPluginClasses () const
-
{
-
QSet classes;
-
classes << "org.LeechCraft.Plugins.Poshuku.Plugins.OnlineBookmarks.IGeneralPlugin";
-
return classes;
-
}
-
-
}
-
}
-
}
-
}
-
-
Q_EXPORT_PLUGIN2 (leechcraft_poshuku_onlinebookmarks_readitlater,
-
LeechCraft::Poshuku::OnlineBookmarks::ReadItLater::Plugin);
Плагин для плагина обязательно должен быть отнаследован от IPlugin2, который в свою очередь требует переопределения QSet Plugin::GetPluginClasses (). Что должен возвращать этот метод? Вот тут и заключается связь плагинов по иерархичной лестнице - он должен возвращать одну из строк, которые у нас используются в методе OnlineBookmarks - QSet Plugin::GetExpectedPluginClasses () const.
Теперь все это можно скомпилировать и запустить. В настройках мы можем в разделе модули видеть наш плагин. Вот и все. Плагины для плагинов создавать не сложно, если они не требуют каких-то сложных вещей, типа доступа к ядру личкрафтов.
Далее мы будем создавать свой интерфейс, стараясь сделать его по-максимуму универсальным.