mirror of
https://github.com/rojo-rbx/rojo.git
synced 2026-04-21 13:15:50 +00:00
When enabled, the `baseurl` of the session is written to
`workspace:SetAttribute("__Rojo_ConnectionUrl")` so that the test server
can connect to that session automatically.
This works for Play Solo and Local Test Server. It is marked
experimental for now (and disabled by default) since connecting during a
playtest session is... not polished. Rojo may overwrite things and cause
headaches. Further work can be done later.
109 lines
2.6 KiB
Lua
109 lines
2.6 KiB
Lua
--[[
|
|
Persistent plugin settings.
|
|
]]
|
|
|
|
local plugin = plugin or script:FindFirstAncestorWhichIsA("Plugin")
|
|
local Rojo = script:FindFirstAncestor("Rojo")
|
|
local Packages = Rojo.Packages
|
|
|
|
local Log = require(Packages.Log)
|
|
local Roact = require(Packages.Roact)
|
|
|
|
local defaultSettings = {
|
|
openScriptsExternally = false,
|
|
twoWaySync = false,
|
|
showNotifications = true,
|
|
syncReminder = true,
|
|
autoConnectPlaytestServer = false,
|
|
confirmationBehavior = "Initial",
|
|
largeChangesConfirmationThreshold = 5,
|
|
playSounds = true,
|
|
typecheckingEnabled = false,
|
|
logLevel = "Info",
|
|
priorEndpoints = {},
|
|
}
|
|
|
|
local Settings = {}
|
|
|
|
Settings._values = table.clone(defaultSettings)
|
|
Settings._updateListeners = {}
|
|
Settings._bindings = {}
|
|
|
|
if plugin then
|
|
for name, defaultValue in pairs(Settings._values) do
|
|
local savedValue = plugin:GetSetting("Rojo_" .. name)
|
|
|
|
if savedValue == nil then
|
|
-- plugin:SetSetting hits disc instead of memory, so it can be slow. Spawn so we don't hang.
|
|
task.spawn(plugin.SetSetting, plugin, "Rojo_" .. name, defaultValue)
|
|
Settings._values[name] = defaultValue
|
|
else
|
|
Settings._values[name] = savedValue
|
|
end
|
|
end
|
|
Log.trace("Loaded settings from plugin store")
|
|
end
|
|
|
|
function Settings:get(name)
|
|
if defaultSettings[name] == nil then
|
|
error("Invalid setings name " .. tostring(name), 2)
|
|
end
|
|
|
|
return self._values[name]
|
|
end
|
|
|
|
function Settings:set(name, value)
|
|
self._values[name] = value
|
|
if self._bindings[name] then
|
|
self._bindings[name].set(value)
|
|
end
|
|
|
|
if plugin then
|
|
-- plugin:SetSetting hits disc instead of memory, so it can be slow. Spawn so we don't hang.
|
|
task.spawn(plugin.SetSetting, plugin, "Rojo_" .. name, value)
|
|
end
|
|
|
|
if self._updateListeners[name] then
|
|
for callback in pairs(self._updateListeners[name]) do
|
|
task.spawn(callback, value)
|
|
end
|
|
end
|
|
|
|
Log.trace(string.format("Set setting '%s' to '%s'", name, tostring(value)))
|
|
end
|
|
|
|
function Settings:onChanged(name, callback)
|
|
local listeners = self._updateListeners[name]
|
|
if listeners == nil then
|
|
listeners = {}
|
|
self._updateListeners[name] = listeners
|
|
end
|
|
listeners[callback] = true
|
|
|
|
Log.trace(string.format("Added listener for setting '%s' changes", name))
|
|
|
|
return function()
|
|
listeners[callback] = nil
|
|
Log.trace(string.format("Removed listener for setting '%s' changes", name))
|
|
end
|
|
end
|
|
|
|
function Settings:getBinding(name)
|
|
local cached = self._bindings[name]
|
|
if cached then
|
|
return cached.bind
|
|
end
|
|
|
|
local bind, set = Roact.createBinding(self._values[name])
|
|
self._bindings[name] = {
|
|
bind = bind,
|
|
set = set,
|
|
}
|
|
|
|
Log.trace(string.format("Created binding for setting '%s'", name))
|
|
|
|
return bind
|
|
end
|
|
|
|
return Settings
|