@@ -9,18 +9,18 @@ type ToolbarButton = Types.ToolbarButton
99local PluginManager = {}
1010PluginManager .Plugins = {} :: { Plugin }
1111local IsPluginManagementWindowOpen = false
12- local PluginSettings : { [string ]: { Enabled : boolean } } = {}
12+ local PluginSettings : { [string ]: { Enabled : boolean }? } = {}
1313
1414local PLUGIN_SETTINGS_PATH = "./editor/plugin-settings.json"
1515
16- local function getPluginSettings (plugin : Plugin ): index < typeof ( PluginSettings ), string >
16+ local function getPluginSettings (plugin : Plugin )
1717 local settings = PluginSettings [plugin .Path ]
1818 if not settings then
1919 settings = { Enabled = true }
2020 PluginSettings [plugin .Path ] = settings
2121 end
2222
23- return settings
23+ return assert ( settings )
2424end
2525
2626local function renderPluginManagement ()
@@ -80,32 +80,56 @@ local function renderPluginManagement()
8080 end
8181end
8282
83- local function loadPluginsRecursive (ParentPath )
83+ local function setPluginAlias (ParentPath : string ? )
84+ if ParentPath then
85+ fs .definealias ("plugin" , ParentPath )
86+ end
87+ end
88+
89+ local function loadPlugin (Path , ParentPath : string ? )
90+ local co , err = task .loadfile (Path )
91+
92+ if co then
93+ local success , data : Plugin = coroutine.resume (co )
94+
95+ if success then
96+ data .Path = Path :sub (assert ((Path :find ("/plugins" ))) + 1 , # Path )
97+ data .ParentPath = ParentPath
98+ --table.freeze(data)
99+
100+ if typeof (data .Icon ) == "string" then
101+ setPluginAlias (ParentPath )
102+ data .Icon = fs .resolvepath (data .Icon )
103+ fs .removealias ("plugin" )
104+ end
105+
106+ table.insert (PluginManager .Plugins , data )
107+
108+ if getPluginSettings (data ).Enabled and data .OnLoad then
109+ data :OnLoad ()
110+ end
111+ else
112+ warn (`PluginManager: Failed to load-execute plugin { Path }: { data }` )
113+ end
114+ else
115+ warn (`PluginManager: Failed to load plugin { Path }: { err }` )
116+ end
117+ end
118+
119+ local function loadPlugins (ParentPath )
84120 for path , type in fs .listdir (ParentPath ) do
85121 if type == "f" then
86122 if path :sub (# path - 4 , # path ) == ".luau" then
87- local co , err = task .loadfile (path )
88-
89- if co then
90- local success , data : Plugin = coroutine.resume (co )
91-
92- if success then
93- data .Path = path :sub (assert ((path :find ("/plugins" ))) + 1 , # path )
94- --table.freeze(data)
95- table.insert (PluginManager .Plugins , data )
96-
97- if getPluginSettings (data ).Enabled and data .OnLoad then
98- data :OnLoad ()
99- end
100- else
101- print (`Failed to load-execute plugin {path }: {data }` )
102- end
103- else
104- print (`Failed to load plugin {path }: {err }` )
105- end
123+ loadPlugin (path )
106124 end
107125 else
108- loadPluginsRecursive (path )
126+ local mainScriptPath = path .. "/Main.luau"
127+
128+ if fs .isfile (mainScriptPath ) then
129+ loadPlugin (mainScriptPath , path )
130+ else
131+ warn (`PluginManager: Expected { mainScriptPath } to be valid` )
132+ end
109133 end
110134 end
111135end
@@ -116,16 +140,24 @@ function PluginManager.Load()
116140 end
117141
118142 if fs .isfile (PLUGIN_SETTINGS_PATH ) then
119- PluginSettings = json .parse (fs .read (PLUGIN_SETTINGS_PATH ) or "" ) or {}
143+ local settings = json .parse (fs .read (PLUGIN_SETTINGS_PATH ) or "" )
144+
145+ if typeof (settings ) == "table" then
146+ PluginSettings = settings :: { [string ]: { Enabled : boolean }? }
147+ else
148+ warn (`PluginManager: Settings file corrupt: '{ settings }' ({ typeof (settings ) })` )
149+ end
120150 end
121151
122- loadPluginsRecursive ("./plugins" )
152+ loadPlugins ("./plugins" )
123153end
124154
125155function PluginManager .Shutdown ()
126156 for _ , plugin in PluginManager .Plugins do
127157 if plugin .OnShutdown then
158+ setPluginAlias (plugin .ParentPath )
128159 plugin :OnShutdown ()
160+ fs .removealias ("plugin" )
129161 end
130162 end
131163
@@ -135,15 +167,19 @@ end
135167function PluginManager .OnEditorStageChanged (OldStage : EditorStage , NewStage : EditorStage )
136168 for _ , plugin in PluginManager .Plugins do
137169 if getPluginSettings (plugin ).Enabled and plugin .OnEditorStageChanged and table.find (plugin .ActiveStages , NewStage ) then
170+ setPluginAlias (plugin .ParentPath )
138171 plugin :OnEditorStageChanged (OldStage , NewStage )
172+ fs .removealias ("plugin" )
139173 end
140174 end
141175end
142176
143177function PluginManager .OnUpdate (DeltaTime : number , CurrentStage : EditorStage )
144178 for _ , plugin in PluginManager .Plugins do
145179 if getPluginSettings (plugin ).Enabled and plugin .OnUpdate and table.find (plugin .ActiveStages , CurrentStage ) then
180+ setPluginAlias (plugin .ParentPath )
146181 plugin :OnUpdate (DeltaTime )
182+ fs .removealias ("plugin" )
147183 end
148184 end
149185
@@ -180,6 +216,12 @@ function PluginManager.GetToolbarButtons(CurrentStage: EditorStage): { ToolbarBu
180216 for _ , plugin in PluginManager .Plugins do
181217 if getPluginSettings (plugin ).Enabled and table.find (plugin .ActiveStages , CurrentStage ) then
182218 for _ , t in plugin .ToolbarButtons do
219+ if t .Icon and t .Icon :find ("@" ) then
220+ setPluginAlias (plugin .ParentPath )
221+ t .Icon = fs .resolvepath (t .Icon )
222+ fs .removealias ("plugin" )
223+ end
224+
183225 table.insert (buttons , t )
184226 end
185227 end
0 commit comments