You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
221 lines
6.5 KiB
221 lines
6.5 KiB
-- ========================================================================= --
|
|
-- SylingTracker --
|
|
-- https://www.curseforge.com/wow/addons/sylingtracker --
|
|
-- --
|
|
-- Repository: --
|
|
-- https://github.com/Skamer/SylingTracker --
|
|
-- --
|
|
-- ========================================================================= --
|
|
Syling "SylingTracker.Core.Settings" ""
|
|
-- ========================================================================= --
|
|
namespace "SLT"
|
|
-- ========================================================================= --
|
|
class "Setting" (function(_ENV)
|
|
-----------------------------------------------------------------------------
|
|
-- Properties --
|
|
-----------------------------------------------------------------------------
|
|
property "ID" {
|
|
type = String
|
|
}
|
|
|
|
property "Default" {
|
|
type = Any
|
|
}
|
|
|
|
property "Func" {
|
|
type = Callable + String
|
|
}
|
|
-----------------------------------------------------------------------------
|
|
-- Meta-Methods --
|
|
-----------------------------------------------------------------------------
|
|
function __call(self, ...)
|
|
if self.Func then
|
|
if type(self.Func) == "string" then
|
|
CallbackManager.Call(self.Func, ...)
|
|
else
|
|
self.Func(...)
|
|
end
|
|
end
|
|
end
|
|
-----------------------------------------------------------------------------
|
|
-- Constructors --
|
|
-----------------------------------------------------------------------------
|
|
__Arguments__ { String, Any, Variable.Optional(Callable + String) }
|
|
function Setting(self, id, default, func)
|
|
self.ID = id
|
|
self.Default = default
|
|
self.Func = func
|
|
end
|
|
end)
|
|
|
|
class "Settings" (function(_ENV)
|
|
SETTINGS = Dictionary()
|
|
|
|
__Static__() function SelectCurrentProfile()
|
|
-- Get the current profile for this character
|
|
local dbUsed = Settings.GetCurrentProfile()
|
|
|
|
if dbUsed == "spec" then
|
|
Database.SelectRootSpec()
|
|
elseif dbUsed == "char" then
|
|
Database.SelectRootChar()
|
|
else
|
|
Database.SelectRoot()
|
|
end
|
|
end
|
|
|
|
__Arguments__ { String }
|
|
__Static__() function Get(setting)
|
|
-- select the current profile (global, char or spec)
|
|
Profiles.PrepareDatabase()
|
|
|
|
if Database.SelectTable(false, "settings") then
|
|
local value = Database.GetValue(setting)
|
|
if value ~= nil then
|
|
return value
|
|
end
|
|
end
|
|
|
|
if SETTINGS[setting] then
|
|
return SETTINGS[setting].Default
|
|
end
|
|
end
|
|
|
|
__Arguments__ { String }
|
|
__Static__() function Exists(setting)
|
|
-- select the current profile (global, char or spec)
|
|
Profiles.PrepareDatabase()
|
|
|
|
if Database.SelectTable(false, "settings") then
|
|
local value = Database.GetValue(setting)
|
|
if value then
|
|
return true
|
|
end
|
|
end
|
|
return false
|
|
end
|
|
|
|
__Arguments__ { String, Variable.Optional(), Variable.Optional(Boolean, true), Variable.Optional(Boolean, true)}
|
|
__Static__() function Set(setting, value, useHandler, passValue)
|
|
-- select the current profile (global, char or spec)
|
|
Profiles.PrepareDatabase()
|
|
|
|
Database.SelectTable("settings")
|
|
local oldValue = Database.GetValue(setting)
|
|
local newValue = value
|
|
local defaultValue = SETTINGS[setting] and SETTINGS[setting].Default
|
|
|
|
if oldValue == nil then
|
|
oldValue = defaultValue
|
|
end
|
|
|
|
if value and value == defaultValue then
|
|
Database.SetValue(setting, nil)
|
|
else
|
|
Database.SetValue(setting, value)
|
|
end
|
|
|
|
if newValue == nil then
|
|
newValue = defaultValue
|
|
end
|
|
|
|
if newValue ~= oldValue then
|
|
-- TODO: Broadcast this changed to ISettingsListener
|
|
-- Frame:BroadcastSetting(setting, newValue, oldValue)
|
|
Scorpio.FireSystemEvent("SLT_SETTING_CHANGED", setting, newValue, oldValue)
|
|
end
|
|
|
|
-- Call the handler if needed
|
|
if useHandler then
|
|
local opt = SETTINGS[setting]
|
|
if opt then
|
|
if passValue then
|
|
opt(value)
|
|
else
|
|
opt()
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
__Arguments__ { String, Any, Variable.Optional(Callable + String) }
|
|
__Static__() function Register(setting, default, func)
|
|
Settings.Register(Setting(setting, default, func))
|
|
end
|
|
|
|
__Arguments__ { Setting }
|
|
__Static__() function Register(setting)
|
|
SETTINGS[setting.ID] = setting
|
|
end
|
|
|
|
__Arguments__ { Variable.Optional(String, "global") }
|
|
__Static__() function SelectProfile(profile)
|
|
Database.SelectRoot()
|
|
Database.SelectTable("dbUsed")
|
|
|
|
local name, realm = UnitFullName("player")
|
|
name = realm .. "-" .. name
|
|
|
|
Database.SetValue(name, profile)
|
|
end
|
|
|
|
__Arguments__ { ClassType }
|
|
__Static__() function GetCurrentProfile(self)
|
|
Database.SelectRoot()
|
|
if Database.SelectTable(false, "dbUsed") then
|
|
local name = UnitFullName("player")
|
|
local realm = GetRealmName()
|
|
name = realm .. "-" .. name
|
|
local dbUsed = Database.GetValue(name)
|
|
if dbUsed then
|
|
return dbUsed
|
|
end
|
|
end
|
|
return "global"
|
|
end
|
|
|
|
__Arguments__ { String }
|
|
function ResetSetting(id)
|
|
Settings.Set(id, nil)
|
|
end
|
|
end)
|
|
|
|
|
|
__SystemEvent__()
|
|
function SLT_PROFILE_CHANGED(profile, oldProfile)
|
|
local oldProfileData = DiffMap()
|
|
Profiles.PrepareDatabase(oldProfile)
|
|
|
|
if Database.SelectTable(false, "settings") then
|
|
for k, v in Database:IterateTable() do
|
|
oldProfileData:SetValue(k, v)
|
|
end
|
|
end
|
|
|
|
local newProfileData = DiffMap()
|
|
Profiles.PrepareDatabase(profile)
|
|
|
|
if Database.SelectTable(false, "settings") then
|
|
for k, v in Database.IterateTable() do
|
|
newProfileData:SetValue(k, v)
|
|
end
|
|
end
|
|
|
|
local diff = oldProfileData:Diff(newProfileData)
|
|
for index, setting in ipairs(diff) do
|
|
local value = Settings.Get(setting)
|
|
-- if setting == "theme-selected" then
|
|
-- Themes:Select(value, false)
|
|
-- else
|
|
-- Frame:BroadcastSetting(setting, value)
|
|
-- end
|
|
end
|
|
end
|
|
|
|
|
|
__SystemEvent__()
|
|
function SLT_COPY_PROFILE_PROCESS(sourceDB, destDB, destProfile)
|
|
if sourceDB["settings"] then
|
|
destDB["settings"] = sourceDB["settings"]
|
|
end
|
|
end
|