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.

219 lines
7.2 KiB

--stopped doing the duplicate savedTable
local DF = _G ["DetailsFramework"]
if (not DF or not DetailsFrameworkCanLoad) then
return
end
--create namespace
DF.SavedVars = {}
function DF.SavedVars.CreateNewSavedTable(dbTable, savedTableName)
local defaultVars = dbTable.defaultSavedVars
local newSavedTable = DF.table.deploy({}, defaultVars)
dbTable.profiles[savedTableName] = newSavedTable
return newSavedTable
end
function DF.SavedVars.GetOrCreateAddonSavedTablesPlayerList(addonFrame)
local addonGlobalSavedTable = _G[addonFrame.__savedVarsName]
--player list
local playerList = addonGlobalSavedTable.__savedVarsByGUID
if (not playerList) then
addonGlobalSavedTable.__savedVarsByGUID = {}
end
--saved variables table
if (not addonGlobalSavedTable.__savedVars) then
addonGlobalSavedTable.__savedVars = {}
end
return addonGlobalSavedTable.__savedVarsByGUID
end
--addon statup
function DF.SavedVars.LoadSavedVarsForPlayer(addonFrame)
local playerSerial = UnitGUID("player")
--savedTableObject is equivalent of "addon.db"
local dbTable = DF.SavedVars.CreateSavedVarsTable(addonFrame, addonFrame.__savedVarsDefaultTemplate)
addonFrame.__savedVarsDefaultTemplate = nil
addonFrame.db = dbTable
--load players list
local savedVarsName = DF.SavedVars.GetOrCreateAddonSavedTablesPlayerList(addonFrame)
local playerSavedTableName = savedVarsName[playerSerial]
if (not playerSavedTableName) then
savedVarsName[playerSerial] = "Default"
playerSavedTableName = savedVarsName[playerSerial]
end
local savedTable = addonFrame.db:GetSavedTable(playerSavedTableName)
if (not savedTable) then
--create a new saved table for this character
savedTable = addonFrame.db:CreateNewSavedTable(playerSavedTableName)
end
DF.SavedVars.SetSavedTable(dbTable, playerSavedTableName, true, true)
return savedTable
end
function DF.SavedVars.TableCleanUpRecursive(t, default)
for key, value in pairs(t) do
if (type(value) == "table") then
DF.SavedVars.TableCleanUpRecursive(value, default[key])
else
if (value == default[key]) then
t[key] = nil
end
end
end
end
function DF.SavedVars.CloseSavedTable(dbTable)
local currentSavedTable = dbTable:GetSavedTable(dbTable:GetCurrentSavedTableName())
local default = dbTable.defaultSavedVars
if (type(currentSavedTable) == "table") then
DF.SavedVars.TableCleanUpRecursive(currentSavedTable, default)
--save
local addonGlobalSavedTable = _G[dbTable.addonFrame.__savedVarsName]
addonGlobalSavedTable.__savedVars[dbTable:GetCurrentSavedTableName()] = currentSavedTable
end
end
--base functions
function DF.SavedVars.SetSavedTable(dbTable, savedTableName, createIfNonExistant, isFromInit)
local savedTableToBeApplied = dbTable:GetSavedTable(savedTableName)
if (savedTableToBeApplied) then
if (not isFromInit) then
--callback unload profile table
local currentSavedTable = dbTable:GetSavedTable(dbTable:GetCurrentSavedTableName())
dbTable:TriggerCallback("OnProfileUnload", currentSavedTable)
DF.SavedVars.CloseSavedTable(dbTable, currentSavedTable)
end
dbTable.profile = savedTableToBeApplied
dbTable.currentSavedTableName = savedTableName
dbTable:TriggerCallback("OnProfileLoad", savedTableToBeApplied)
else
if (createIfNonExistant) then
local newSavedTable = dbTable:CreateNewSavedTable(savedTableName)
--callback unload profile table
local currentSavedTable = dbTable:GetSavedTable(dbTable:GetCurrentSavedTableName())
dbTable:TriggerCallback("OnProfileUnload", currentSavedTable)
DF.SavedVars.CloseSavedTable(dbTable, currentSavedTable)
dbTable.profile = newSavedTable
dbTable.currentSavedTableName = savedTableName
dbTable:TriggerCallback("OnProfileLoad", newSavedTable)
else
DF:Msg("profile does not exists", savedTableName)
return
end
end
end
function DF.SavedVars.GetSavedTables(dbTable)
return dbTable.profiles
end
function DF.SavedVars.GetSavedTable(dbTable, savedTableName)
local profiles = dbTable:GetSavedTables()
return profiles[savedTableName]
end
function DF.SavedVars.GetCurrentSavedTableName(dbTable)
return dbTable.currentSavedTableName
end
--duplicate savedTable
function DF.SavedVars.DuplicateSavedTable(dbTable, savedTableName)
local originalSavedTable = dbTable:GetSavedTable(savedTableName)
if (originalSavedTable) then
local newSavedTable = DF.table.copy({}, originalSavedTable)
end
end
--callbacks
function DF.SavedVars.TriggerCallback(dbTable, callbackName, savedTable)
local registeredCallbacksTable = dbTable.registeredCallbacks[callbackName]
for i = 1, #registeredCallbacksTable do
local callback = registeredCallbacksTable[i]
DF:CoreDispatch(dbTable.addonFrame.__name, callback.func, savedTable, unpack(callback.payload))
end
end
function DF.SavedVars.RegisterCallback(dbTable, callbackName, func, ...)
local registeredCallbacksTable = dbTable.registeredCallbacks[callbackName]
if (registeredCallbacksTable) then
--check for duplicates
for i = 1, #registeredCallbacksTable do
if (registeredCallbacksTable[i].func == func) then
return
end
end
--register
registeredCallbacksTable[#registeredCallbacksTable+1] = {func = func, payload = {...}}
return true
end
end
function DF.SavedVars.UnregisterCallback(dbTable, callbackName, func)
local registeredCallbacksTable = dbTable.registeredCallbacks[callbackName]
if (registeredCallbacksTable) then
for i = 1, #registeredCallbacksTable do
if (registeredCallbacksTable[i].func == func) then
tremove(registeredCallbacksTable, i)
return true
end
end
end
end
function DF.SavedVars.CreateSavedVarsTable(addonFrame, templateTable)
local dbTable = {
profiles = {},
defaultSavedVars = templateTable,
currentSavedTableName = "",
addonFrame = addonFrame,
--methods
GetSavedTable = DF.SavedVars.GetSavedTable,
SetSavedTable = DF.SavedVars.SetSavedTable,
GetSavedTables = DF.SavedVars.GetSavedTables,
GetCurrentSavedTableName = DF.SavedVars.GetCurrentSavedTableName,
CreateNewSavedTable = DF.SavedVars.CreateNewSavedTable,
TriggerCallback = DF.SavedVars.TriggerCallback,
--back compatibility with ace3DB
GetCurrentProfile = DF.SavedVars.GetCurrentSavedTableName,
GetProfile = DF.SavedVars.GetSavedTable,
GetProfiles = DF.SavedVars.GetSavedTables,
SetProfile = DF.SavedVars.SetSavedTable,
RegisterCallback = DF.SavedVars.RegisterCallback,
registeredCallbacks = {
["OnProfileLoad"] = {},
["OnProfileUnload"] = {},
["OnProfileCopied"] = {},
["OnProfileReset"] = {},
["OnDatabaseLoad"] = {},
["OnDatabaseShutdown"] = {},
},
}
return dbTable
end