Skip to content
This repository has been archived by the owner on Jul 15, 2021. It is now read-only.

[FR] 2.1 Créer le projet (Partie 2) : création de plugin

Feldrise edited this page Nov 20, 2018 · 4 revisions

Créer le projet (Partie 2) : création de plugin

Créer l'interface

Une fois que vous avez votre projet de prêt, il va falloir y mettre un interface à Sielo. C'est cette classe qui permettra la communication avec le navigateur et elle doit hériter à la fois de QObject et de PluginInterface.

Code de base de l'interface

MyPlugin.hpp

#include "Plugins/PluginInterface.hpp"

#include <QObject>

namespace Sn
{
class MyPlugin: public QObject, public PluginInterface {
	Q_OBJECT
        Q_INTERFACES(Sn::PluginInterface)
	Q_PLUGIN_METADATA(IID "com.me.MyPlugin")

public:
	MyPlugin();

	PluginProp pluginProp();
	void init(InitState state, const QString& settingsPath);
	void unload();
	bool testPlugin();
};
}

MyPlugin.cpp

#include "MyPlugin.hpp"

#include "Application.hpp"

MyPlugin::MyPlugin()
{
	// Empty
}

PluginProp MyPlugin::pluginProp()
{
	PluginProp props{};

	props.name = "My Plugin";
	props.info = "Short plugin description";
	props.desc = "Plugin description";
	props.icon = ":images/icon.png"
	props.version = "1.0.0";
	props.author = "Victor DENIS <victordenis01@gmail.com";
	props.hasSettings = false;

	return props;
}

void MyPlugin::init(InitState state, const QString& settingsPath)
{
	// ...
}

void MyPlugin::unload()
{
	// ...
}

bool MyPlugin::testPlugin()
{
	return Application::currentVersion == "1.17.04";
}

Décomposons

Q_INTERFACES(Sn::PluginInterface)
Q_PLUGIN_METADATA(IID "com.me.MyPlugin")

Qu'est-ce que c'est que ça pour commencer ? Et bien, c'est ce qui indique que votre classe est une interface de plugin de Sielo. L'interface est la même pour tous les plugin, mais vous pouvez changer l'IID (qui correspond à l'identifiant du plugin) de façon à ce qu'il soit unique à votre plugin.

MyPlugin();

PluginProp pluginProp();
void init(InitState state, const QString& settingsPath);
void unload();
bool testPlugin();

Ce sont les fonctions minimale de l'interface. L'interface hérite d'une classe abstraite, ce qui veut dire que toutes les fonctions citées ci-dessus doivent être implémenté !

MyPlugin()

Le constructeur de l'interface. On évite d'y faire des opérations lourdes car ils sera toujours appelé, y compris quand l'utilisateur n'a pas choisi de le charger.

PluginProp MyPlugin::pluginProp()
{
	PluginProp props{};

	props.name = "My Plugin";
	props.info = "Short plugin description";
	props.desc = "Plugin description";
	props.icon = ":images/icon.png"
	props.version = "1.0.0";
	props.author = "Victor DENIS <victordenis01@gmail.com";
	props.hasSettings = false;

	return props;
}

Cette fonction donne à Sielo tout ce qu'il y a à savoir sur votre plugin. il faut bien faire attention à retourner l'objet créé ! L'icone n'est pas obligatoire.

void init(InitState state, const QString& settingsPath)

C'est la fonction qui est appelée quand le plugin est chargé. On verra plus tard que c'est ici qu'on enregistre les événements que l'on souhaite récupérer où que l'on créer les SideBar.

void unload()

C'est ici qu'il faudra penser à détruire les objets qu'il faut détruire.

bool MyPlugin::testPlugin()
{
	return Application::currentVersion == "1.17.04";
}

Cela permet à Sielo de savoir s'il peut charger le plugin où non. Si la fonction retourne true alors Sielo peut utiliser le plugin, si elle retourne false alors le plugin ne sera pas chargé. Généralement on teste la version pour savoir si l'API utilisé par le plugin correspond à celle utilisé par le navigateur du client.