erlu/src/plugins/PluginManager.h
Gregory Bednov 630c952382 изменено: CMakeLists.txt
новый файл:    cmake/Info.plist.in
	новый файл:    default.nix
	новый файл:    desktop.nix
	новый файл:    packaging/linux/idef0-editor.desktop
	новый файл:    packaging/linux/idef0.xml
	новый файл:    packaging/windows/idef0-file-association.reg.in
	изменено:      src/MainWindow.cpp
	изменено:      src/MainWindow.h
	изменено:      src/items/ArrowItem.cpp
	изменено:      src/items/ArrowItem.h
	изменено:      src/items/BlockItem.cpp
	изменено:      src/items/BlockItem.h
	изменено:      src/items/DiagramScene.cpp
	изменено:      src/items/DiagramScene.h
	новый файл:    src/plugins/Manual.md
	новый файл:    src/plugins/PluginApi.h
	новый файл:    src/plugins/PluginManager.cpp
	новый файл:    src/plugins/PluginManager.h
	новый файл:    src/plugins/color/ColorsPlugin.cpp
	новый файл:    src/plugins/color/ColorsPlugin.h
	новый файл:    src/plugins/color/translations/colors_en.ts
	новый файл:    src/plugins/color/translations/colors_fr.ts
	новый файл:    src/plugins/color/translations/colors_ru.ts
	новый файл:    translations/README.txt
	новый файл:    translations/idef0_en.ts
	новый файл:    translations/idef0_fr.ts
	новый файл:    translations/idef0_ru.ts
2026-02-25 23:25:45 +03:00

55 lines
1.8 KiB
C++

#pragma once
#include <QObject>
#include <QLibrary>
#include <memory>
#include <vector>
#include "plugins/PluginApi.h"
class QMenu;
class MainWindow;
class DiagramScene;
class PluginManager final : public QObject {
Q_OBJECT
public:
explicit PluginManager(MainWindow* window, QMenu* pluginsMenu, QObject* parent = nullptr);
void loadPlugins();
QMenu* pluginsMenu() const;
DiagramScene* currentScene() const;
QWidget* window() const;
private:
struct HostContext {
PluginManager* manager = nullptr;
QString pluginPath;
QByteArray pluginDirUtf8;
Idef0Host host;
};
struct LoadedPlugin {
std::unique_ptr<QLibrary> lib;
std::unique_ptr<HostContext> ctx;
LoadedPlugin() = default;
LoadedPlugin(std::unique_ptr<QLibrary>&& l, std::unique_ptr<HostContext>&& c)
: lib(std::move(l)), ctx(std::move(c)) {}
LoadedPlugin(LoadedPlugin&&) noexcept = default;
LoadedPlugin& operator=(LoadedPlugin&&) noexcept = default;
LoadedPlugin(const LoadedPlugin&) = delete;
LoadedPlugin& operator=(const LoadedPlugin&) = delete;
};
QStringList pluginSearchPaths() const;
std::unique_ptr<HostContext> makeContext(const QString& pluginPath);
void addAction(const QString& text, Idef0ActionCallback cb, void* userData, HostContext* ctx);
static size_t apiSelectedItems(void* opaque, Idef0SelectedItem* out, size_t max);
static bool apiSetItemColor(void* opaque, int kind, int id, const char* color_hex);
static bool apiClearItemColor(void* opaque, int kind, int id);
static void apiAddMenuAction(void* opaque, const char* text, Idef0ActionCallback cb, void* user_data);
static const char* apiPluginDir(void* opaque);
MainWindow* m_window = nullptr;
QMenu* m_pluginsMenu = nullptr;
std::vector<LoadedPlugin> m_plugins;
};