-- read namespace from global env local _G = _G local Grichelde = _G.Grichelde local unpack, join, toString = Grichelde.functions.unpack, Grichelde.functions.join, Grichelde.functions.toString function Grichelde:CreateOptionsUI() return { name = self:Format(self.L.Options_Title, self.L.AddonName), type = "group", childGroups = "tab", set = function(info, val) self:SyncToDatabase(info, val) end, get = function(info) return self:ReadFromDatabase(info) end, hidden = false, disabled = function(info) return self:IsDisabled(info) end, args = { enabled = { order = 0, type = "toggle", name = self.L.Options_Enabled_Name, desc = self:Format(self.L.Options_Enabled_Desc, self.L.AddonName), disabled = false, }, channels = { order = 2, type = "group", name = self.L.Options_Channels_Group_Name, desc = self:Format(self.L.Options_Channels_Group_Desc, self.L.AddonName), args = { say = { order = 0, type = "toggle", name = self.L.Options_Channels_ChannelSay_Name, desc = self:Format(self.L.Options_Channels_ChannelSay_Desc, self.L.AddonName), }, emote = { order = 1, type = "toggle", name = self.L.Options_Channels_ChannelEmote_Name, desc = self:Format(self.L.Options_Channels_ChannelEmote_Desc, self.L.AddonName), }, yell = { order = 2, type = "toggle", name = self.L.Options_Channels_ChannelYell_Name, desc = self:Format(self.L.Options_Channels_ChannelYell_Desc, self.L.AddonName), }, party = { order = 3, type = "toggle", name = self.L.Options_Channels_ChannelParty_Name, desc = self:Format(self.L.Options_Channels_ChannelParty_Desc, self.L.AddonName), }, partyLeader = { order = 4, type = "toggle", name = self.L.Options_Channels_ChannelPartyLeader_Name, desc = self:Format(self.L.Options_Channels_ChannelPartyLeader_Desc, self.L.AddonName), }, guild = { order = 5, type = "toggle", name = self.L.Options_Channels_ChannelGuild_Name, desc = self:Format(self.L.Options_Channels_ChannelGuild_Desc, self.L.AddonName), }, officer = { order = 6, type = "toggle", name = self.L.Options_Channels_ChannelOfficer_Name, desc = self:Format(self.L.Options_Channels_ChannelOfficer_Desc, self.L.AddonName), }, raid = { order = 7, type = "toggle", name = self.L.Options_Channels_ChannelRaid_Name, desc = self:Format(self.L.Options_Channels_ChannelRaid_Desc, self.L.AddonName), }, raidLeader = { order = 8, type = "toggle", name = self.L.Options_Channels_ChannelRaidLeader_Name, desc = self:Format(self.L.Options_Channels_ChannelRaidLeader_Desc, self.L.AddonName), }, raidWarning = { order = 9, type = "toggle", name = self.L.Options_Channels_ChannelRaidWarning_Name, desc = self:Format(self.L.Options_Channels_ChannelRaidWarning_Desc, self.L.AddonName), }, instance = { order = 10, type = "toggle", name = self.L.Options_Channels_ChannelInstance_Name, desc = self:Format(self.L.Options_Channels_ChannelInstance_Desc, self.L.AddonName), }, battleground = { order = 11, type = "toggle", name = self.L.Options_Channels_ChannelBattleground_Name, desc = self:Format(self.L.Options_Channels_ChannelBattleground_Desc, self.L.AddonName), }, whisper = { order = 12, type = "toggle", name = self.L.Options_Channels_ChannelWhisper_Name, desc = self:Format(self.L.Options_Channels_ChannelWhisper_Desc, self.L.AddonName), }, } }, replacements = { order = 3, type = "group", name = self.L.Options_Replacements_Group_Name, desc = self.L.Options_Replacements_Group_Desc, args = { add = { order = 0, type = "execute", name = self.L.Options_Replacements_Add_Name, desc = self.L.Options_Replacements_Add_Desc, }, deleteAll = { order = 0, type = "execute", confirm = "", name = self.L.Options_Replacements_DeleteAll_Name, desc = self.L.Options_Replacements_DeleteAll_Desc, }, replacement_0 = { order = 0, type = "group", name = self.L.Options_Replacement_Group_Name, desc = self.L.Options_Replacement_Group_Desc, childGroups = "tree", args = { searchText = { order = 0, type = "input", name = self.L.Options_Replacement_SearchText_Name, desc = self.L.Options_Replacement_SearchText_Desc, }, replaceText = { order = 1, type = "input", name = self.L.Options_Replacement_ReplaceText_Name, desc = self.L.Options_Replacement_ReplaceText_Desc, }, caseSensitive = { order = 2, type = "toggle", name = self.L.Options_Replacement_CaseSensitive_Name, desc = self.L.Options_Replacement_CaseSensitive_Desc, }, consolidate = { order = 3, type = "toggle", name = self.L.Options_Replacement_Consolidate_Name, desc = self.L.Options_Replacement_Consolidate_Desc, width = 2 }, deleteAll = { order = 4, type = "execute", confirm = "", name = self.L.Options_Replacement_Delete_Name, desc = self.L.Options_Replacement_Delete_Desc, }, } } } } } } end function Grichelde:LoadDatabase() -- Called when the addon is loaded self.db = LibStub("AceDB-3.0"):New(self.name .."DB", self.defaultConfig, true) -- todo: is this really needed? self.db.RegisterCallback(self, "OnProfileChanged", function (event) self:PrefixedPrint(self.L.Profiles_Loaded, self.COLOR_CODES.GREEN .. self.db:GetCurrentProfile() .. self.COLOR_CODES.CLOSE) end) self.db.RegisterCallback(self, "OnProfileCopied", function(event) self:PrefixedPrint(self.L.Profiles_Copied, self.COLOR_CODES.GREEN .. self.db:GetCurrentProfile() .. self.COLOR_CODES.CLOSE) end) self.db.RegisterCallback(self, "OnProfileReset", function(event) self:PrefixedPrint(self.L.Profiles_Reset, self.COLOR_CODES.GREEN .. self.db:GetCurrentProfile() .. self.COLOR_CODES.CLOSE) end) end function Grichelde:SetupOptions() -- add DB-backed profiles to UI options self.options = self:CreateOptionsUI() self.options.args.profiles = LibStub("AceDBOptions-3.0"):GetOptionsTable(self.db) self.options.args.profiles.disabled = false local activeProfile = self.db:GetCurrentProfile() self:PrefixedPrint(self.L.Profiles_Loaded, self.COLOR_CODES.GREEN .. activeProfile .. self.COLOR_CODES.CLOSE) self:tPrint(self.db.profile) -- Adding options to blizzard frame LibStub("AceConfig-3.0"):RegisterOptionsTable(self.name, self.options) LibStub("AceConfigDialog-3.0"):AddToBlizOptions(self.name, self.L.AddonName) end function Grichelde:SyncToDatabase(info, val) local option = self.db.profile local path = 1 while ( path < #info) do option = option[info[path]] -- or nil path = path + 1 end local optionPath = join(".", unpack(info, 1, #info)) self:DebugPrint("change option \"%s\" from %s to %s", optionPath, toString(option[info[path]]), toString(val)) option[info[path]] = val end function Grichelde:ReadFromDatabase(info) local option = self.db.profile local path = 1 while (path <= #info) do option = option[info[path]] -- or nil path = path + 1 end local optionPath = join(".", unpack(info, 1, #info)) self:DebugPrint("read option \"%s\": %s", optionPath, toString(option)) return option end function Grichelde:IsDisabled(info) if info.option.type == "group" then return false end return not self.db.profile.enabled end