#ifndef PLUGINMANAGER_H_
#define PLUGINMANAGER_H_

#include "PluginManagerAPI.h"
#include "DataProperty/DataBase.h"
#include "pluginBase.h"
#include <QList>

namespace GUI
{
	class MainWindow;
}

namespace Plugins
{
	class PluginBase;

	class PLUGINMANAGERAPI PluginManager : public DataProperty::DataBase
	{
		Q_OBJECT
	public:
		static PluginManager* getInstance();

		//获取加载的插件个数
		int getPluginsCount();
		//加载插件
		void loadPlugs(GUI::MainWindow* m);
		//加载单个插件
		bool loadPlugin(QString name);
		//卸载插件
		bool releasePlugin(QString name);
		//卸载插件
		void releasePlugs();
		//翻译
		void reTranslate(QString lang);
		//获取插件
		PluginBase* getPluginByDescribe(QString des);
		//根据类型获取插件
		QList<PluginBase*> getPluginsByType(PluginType t);
		//写出工程文件
		QDomElement& writeToProjectFile(QDomDocument* doc, QDomElement* parent) override;
		//从工程文件读入
		void readDataFromProjectFile(QDomElement* e) override;
		//是否有数据需要保存到工程文件
		bool hasInfoToSave();
		/**
		 * @brief 文件是否已经被加载
		 * 
		 * @param fileName 要判断的文件名称   XXXX.dll 或者 XXXX.so
		 * @return true    文件已经被加载
		 * @return false   文件未被加载
		 */
		bool isFileLoaded(const QString fileName);

	signals:
		void updateActionStates();
	
	public slots:
		void manage();

	private:
		PluginManager() = default;
		~PluginManager() = default;

	private:
		static PluginManager* _instance;
		GUI::MainWindow* _mainWindow{};

		QList<PluginBase*> _pluginList{};

	};
}



#endif

