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.

231 lines
6.3 KiB

-----------------------------------------------------------------------
--- 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