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.
220 lines
7.2 KiB
220 lines
7.2 KiB
|
5 years ago
|
|
||
|
|
--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
|