Polyphase Game Engine
Loading...
Searching...
No Matches
AddonManager.h
Go to the documentation of this file.
1#pragma once
2
3#if EDITOR
4
5#include "../ProjectSelect/TemplateData.h"
6#include <string>
7#include <vector>
8
15class AddonManager
16{
17public:
18 static void Create();
19 static void Destroy();
20 static AddonManager* Get();
21
23 std::string GetAddonCacheDirectory();
24
26 std::string GetSettingsPath();
27
29 std::string GetInstalledAddonsPath();
30
31 // Repository management
32 void LoadSettings();
33 void SaveSettings();
34 void AddRepository(const std::string& url);
35 void RemoveRepository(const std::string& url);
36 const std::vector<AddonRepository>& GetRepositories() const { return mRepositories; }
37
38 // Addon discovery
39 void RefreshAllRepositories();
40 void RefreshRepository(const std::string& url);
41 const std::vector<Addon>& GetAvailableAddons() const { return mAvailableAddons; }
42 const std::vector<AddonCategory>& GetCategories() const { return mCategories; }
43
44 // Installation
45 bool DownloadAddon(const Addon& addon, std::string& outError);
46 bool InstallAddon(const std::string& addonCachePath, const std::string& addonId, std::string& outError);
47 bool UninstallAddon(const std::string& addonId);
48
49 // Fetch an addon from an arbitrary URL (GitHub repo or direct .zip), unzip it,
50 // and install into the current project's Packages/. Used by the dependency resolver.
51 bool DownloadAndInstallFromUrl(const std::string& addonId,
52 const std::string& url,
53 const std::string& ref,
54 std::string& outError);
55
56 // Auto-resolve declared dependencies on install / project load.
57 bool GetAutoResolveDependencies() const { return mAutoResolveDeps; }
58 void SetAutoResolveDependencies(bool v) { mAutoResolveDeps = v; SaveSettings(); }
59
60 // Tracking
61 void LoadInstalledAddons();
62 void SaveInstalledAddons();
63 const std::vector<InstalledAddon>& GetInstalledAddons() const { return mInstalledAddons; }
64 std::vector<InstalledAddon>& GetInstalledAddonsMutable() { return mInstalledAddons; }
65 bool IsAddonInstalled(const std::string& addonId) const;
66 bool HasUpdate(const std::string& addonId) const;
67 std::string GetInstalledVersion(const std::string& addonId) const;
68 bool SetInstalledAddonNativeMode(const std::string& addonId, NativeAddonResolveMode mode);
69 bool SyncNativeAddonBinary(const std::string& addonId, std::string& outError);
70
71 // Find addon by ID
72 const Addon* FindAddon(const std::string& addonId) const;
73
74private:
75 static AddonManager* sInstance;
76 AddonManager();
77 ~AddonManager();
78
80 void EnsureCacheDirectory();
81
90 bool FetchManifest(const std::string& url, const std::string& branch, bool& outFound);
91
92 bool FetchRepositoryManifest(const std::string& url, AddonRepository& outRepo, const std::string& branch);
94 bool FetchAddonMetadata(const std::string& repoUrl, const std::string& addonId, Addon& outAddon, const std::string& branch);
95
97 bool MergeAddonIntoProject(const std::string& addonPath, std::string& outError);
98
100 bool DownloadFile(const std::string& url, const std::string& destPath, std::string& outError);
101
103 bool ExtractZip(const std::string& zipPath, const std::string& destDir, std::string& outError);
104
105 std::string NormalizePath(const std::string& in);
106
108 std::string ConvertToRawUrl(const std::string& gitHubUrl, const std::string& filePath, const std::string& branch);
109
111 std::string ConvertToDownloadUrl(const std::string& gitHubUrl, const std::string& branch);
112
114 std::string GetCurrentTimestamp();
115
116 std::vector<AddonRepository> mRepositories;
117 std::vector<Addon> mAvailableAddons;
118 std::vector<AddonCategory> mCategories; // Registry categories from manifest.json
119 std::vector<InstalledAddon> mInstalledAddons;
120 bool mAutoResolveDeps = true;
121};
122
123#endif