Element Loading System
Basalt's Element Loading System allows you to load elements from different sources: local files, disk mounts, and even directly from the web.
Getting the Element Manager
lua
local basalt = require("basalt")
local elementManager = basalt.getElementManager()Configuration
Configure the loading behavior:
lua
elementManager.configure({
autoLoadMissing = true, -- Auto-load elements that aren't found
allowRemoteLoading = true, -- Enable loading from URLs
allowDiskLoading = true, -- Enable loading from disk mounts
useGlobalCache = true, -- Cache loaded elements in _G
globalCacheName = "_BASALT_CACHE" -- Name of the global cache variable
})Loading from Disk
Register disk mount points to load elements from external locations:
lua
-- Register a disk mount
elementManager.registerDiskMount("/disk/basalt-elements")
-- Elements in /disk/basalt-elements/elements/ are now available
local main = basalt.getMainFrame()
local customButton = main:addCustomButton() -- Loads from diskLoading from Remote URLs
Load elements directly from the web:
lua
-- Enable remote loading
elementManager.configure({
allowRemoteLoading = true
})
-- Register a remote source
elementManager.registerRemoteSource(
"CustomElement",
"https://example.com/elements/CustomElement.lua"
)
-- Use the element
local main = basalt.getMainFrame()
local custom = main:addCustomElement()Manual Element Loading
Load elements manually when needed:
lua
-- Load a specific element
elementManager.loadElement("Button")
-- Get an element (loads it if not already loaded)
local ButtonClass = elementManager.getElement("Button")
-- Check if an element exists
if elementManager.hasElement("CustomWidget") then
elementManager.loadElement("CustomWidget")
end
-- Check if an element is loaded
if not elementManager.isElementLoaded("Label") then
elementManager.loadElement("Label")
endPreloading Elements
Preload multiple elements at startup for better performance:
lua
-- Preload commonly used elements
elementManager.preloadElements({
"Button",
"Label",
"Frame",
"Input"
})Cache Management
When using useGlobalCache, elements are cached in _G for reuse:
lua
-- Get cache statistics
local stats = elementManager.getCacheStats()
print("Cached elements: " .. stats.size)
for _, name in ipairs(stats.elements) do
print("- " .. name)
end
-- Clear the cache
elementManager.clearGlobalCache()Complete Example
lua
local basalt = require("basalt")
local elementManager = basalt.getElementManager()
-- Configure loading system
elementManager.configure({
autoLoadMissing = true,
allowRemoteLoading = true,
allowDiskLoading = true,
useGlobalCache = true
})
-- Register disk mount for custom elements
if fs.exists("/disk") then
elementManager.registerDiskMount("/disk")
end
-- Register remote element
elementManager.registerRemoteSource(
"SpecialButton",
"https://raw.githubusercontent.com/user/repo/main/SpecialButton.lua"
)
-- Preload common elements
elementManager.preloadElements({"Button", "Label", "Frame"})
-- Use elements normally
local main = basalt.getMainFrame()
local btn = main:addButton()
:setText("Standard Button")
:setPosition(2, 2)
-- This will be loaded from disk or remote if available
local special = main:addSpecialButton()
:setText("Special Button")
:setPosition(2, 4)
basalt.run()Use Cases
Remote Element Library
Load elements from a central repository:
lua
local repository = "https://raw.githubusercontent.com/Basalt2/main/src/elements/"
elementManager.configure({allowRemoteLoading = true})
elementManager.registerRemoteSource("Chart", repository .. "Chart.lua")
elementManager.registerRemoteSource("DataGrid", repository .. "DataGrid.lua")Notes
- Remote loading requires HTTP API to be enabled in CC:Tweaked config
- Disk loading looks for
elements/subfolder in the mount path - Elements must follow Basalt's element structure
- Global cache persists across
basalt.run()calls if not cleared - Auto-loading tries disk mounts first, then remote sources