----------------------------------------------------------------------- --- Provides several dropdown item types that can be used with AceGUI-3.0's -- AceGUIWidget-DropDown in order to style font, statusbar and sound-dropdowns -- properly, making it easier for the user to select the preferred item. -- -- LibDDI can also be used with AceConfig option tables with the 'select' type, -- using the itemControl property. -- -- The following item types are available: DDI-Font, DDI-Statusbar, DDI-Sound and DDI-RaidIcon. -- -- Pull LibDDI-1.0 in via your TOC/embeds.xml and make sure it's loaded after -- AceGUI-3.0 and LibSharedMedia-3.0, and it's ready to be used. There's no real -- API; LibDDI just provides a few widget types for AceGUI. -- -- @usage -- -- If you're using AceOptions tables; -- local fonts = LibStub("LibSharedMedia-3.0"):List("font") -- local option = { -- type = "select", -- name = "Font", -- values = fonts, -- get = function() -- for i, v in next, fonts do -- if v == db.font then return i end -- end -- end, -- set = function(_, value) -- db.font = fonts[value] -- end, -- itemControl = "DDI-Font", -- } -- -- If you're using AceGUI-3.0 directly; -- local dropdown = AceGUI:Create("Dropdown") -- dropdown:SetLabel("Font") -- dropdown:SetList(fonts, nil, "DDI-Font") -- dropdown:SetCallback("OnValueChanged", function(_, _, value) -- db.font = fonts[value] -- end) -- for i, v in next, fonts do -- if v == db.font then -- dropdown:SetValue(i) -- break -- end -- end -- @class file -- @name LibDDI-1.0 local ddiVersion = 2 local prototype = LibStub("AceGUI-3.0-DropDown-ItemBase"):GetItemBase() local version = ddiVersion + prototype.version if _G.AGUILSMDDI10 and _G.AGUILSMDDI10 >= version then return end _G.AGUILSMDDI10 = version local media = LibStub("LibSharedMedia-3.0") local gui = LibStub("AceGUI-3.0") ----------------------------------------------------------------------- -- Common -- local function updateToggle(self) if self.value then self.check:Show() else self.check:Hide() end end local function onRelease(self) prototype.OnRelease(self) self:SetValue(nil) end local function onClick(frame) local self = frame.obj if self.disabled then return end self.value = not self.value if self.value then PlaySound(856) -- SOUNDKIT.IG_MAINMENU_OPTION_CHECKBOX_ON else PlaySound(857) -- SOUNDKIT.IG_MAINMENU_OPTION_CHECKBOX_OFF end updateToggle(self) self:Fire("OnValueChanged", self.value) end local function setValue(self, value) self.value = value updateToggle(self) end local function getValue(self) return self.value end local function commonConstructor(type) local self = prototype.Create(type) self.frame:SetScript("OnClick", onClick) self.SetValue = setValue self.GetValue = getValue self.OnRelease = onRelease return self end ----------------------------------------------------------------------- -- Raid icon -- do local icons = { [RAID_TARGET_1] = 1, Star = 1, [RAID_TARGET_2] = 2, Circle = 2, Orange = 2, Nipple = 2, [RAID_TARGET_3] = 3, Diamond = 3, [RAID_TARGET_4] = 4, Triangle = 4, [RAID_TARGET_5] = 5, Moon = 5, [RAID_TARGET_6] = 6, Square = 6, [RAID_TARGET_7] = 7, Cross = 7, [RAID_TARGET_8] = 8, Skull = 8, } local widgetType = "DDI-RaidIcon" local function setText(self, text) if icons[text] then self.icon:SetTexture(icons[text] + 137000) -- Texture id list for raid icons 1-8 is 137001-137008. Base texture path is Interface\\TARGETINGFRAME\\UI-RaidTargetingIcon_%d else self.icon:SetTexture() end self.text:SetText(text) end local function constructor() local self = commonConstructor(widgetType) local frame = self.frame local icon = frame:CreateTexture(nil, "ARTWORK") icon:SetWidth(16) icon:SetHeight(16) icon:SetPoint("LEFT", frame, "LEFT", 18, 0) self.icon = icon local text = self.text text:ClearAllPoints() text:SetPoint("LEFT", icon, "RIGHT", 4, 0) text:SetPoint("RIGHT", frame, "RIGHT", -8, 0) text:SetPoint("TOP", frame) text:SetPoint("BOTTOM", frame) self.SetText = setText gui:RegisterAsWidget(self) return self end gui:RegisterWidgetType(widgetType, constructor, version) end ----------------------------------------------------------------------- -- Sound -- do local widgetType = "DDI-Sound" local function onClick(self) local snd = media:Fetch("sound", self.sound:GetText()) if snd then PlaySoundFile(snd, "Master") end end local function constructor() local self = commonConstructor(widgetType) local frame = self.frame local sndButton = CreateFrame("Button", nil, frame) sndButton:SetWidth(16) sndButton:SetHeight(16) sndButton:SetPoint("RIGHT", frame, "RIGHT", -3, -1) sndButton:SetScript("OnClick", onClick) sndButton.sound = frame.obj.text local icon = sndButton:CreateTexture(nil, "BACKGROUND") icon:SetTexture(130979) --"Interface\\Common\\VoiceChat-Speaker" icon:SetAllPoints(sndButton) local highlight = sndButton:CreateTexture(nil, "HIGHLIGHT") highlight:SetTexture(130977) --"Interface\\Common\\VoiceChat-On" highlight:SetAllPoints(sndButton) gui:RegisterAsWidget(self) return self end gui:RegisterWidgetType(widgetType, constructor, version) end ----------------------------------------------------------------------- -- Font -- do local widgetType = "DDI-Font" local function setText(self, text) local _, size, flags = self.text:GetFont() local font = media:Fetch("font", text) if font then self.text:SetFont(font, size, flags) end self.text:SetText(text) end local function constructor() local self = commonConstructor(widgetType) self.SetText = setText gui:RegisterAsWidget(self) return self end gui:RegisterWidgetType(widgetType, constructor, version) end ----------------------------------------------------------------------- -- Statusbar -- do local widgetType = "DDI-Statusbar" local function setText(self, text) self.text:SetText(text) local texture = media:Fetch("statusbar", text) if texture then self.bar:SetTexture(texture) end end local function constructor() local self = commonConstructor(widgetType) local frame = self.frame local bar = frame:CreateTexture(nil, "ARTWORK") bar:SetPoint("TOPLEFT", frame, "TOPLEFT", 3, -1) bar:SetPoint("BOTTOMRIGHT", frame, "BOTTOMRIGHT", -8, 1) self.bar = bar self.SetText = setText gui:RegisterAsWidget(self) return self end gui:RegisterWidgetType(widgetType, constructor, version) end