-- Widget is based on the AceGUIWidget-DropDown.lua supplied with AceGUI-3.0 -- Widget created by Yssaril local AceGUI = LibStub("AceGUI-3.0") local Media = LibStub("LibSharedMedia-3.0") local AGSMW = LibStub("AceGUISharedMediaWidgets-1.0") do local widgetType = "LSM30_Sound" local widgetVersion = 11 local contentFrameCache = {} local function ReturnSelf(self) self:ClearAllPoints() self:Hide() self.check:Hide() table.insert(contentFrameCache, self) end local function ContentOnClick(this, button) local self = this.obj self:Fire("OnValueChanged", this.text:GetText()) if self.dropdown then self.dropdown = AGSMW:ReturnDropDownFrame(self.dropdown) end end local function ContentSpeakerOnClick(this, button) local self = this.frame.obj local sound = this.frame.text:GetText() PlaySoundFile(self.list[sound] ~= sound and self.list[sound] or Media:Fetch('sound',sound), "Master") end local function GetContentLine() local frame if next(contentFrameCache) then frame = table.remove(contentFrameCache) else frame = CreateFrame("Button", nil, UIParent) --frame:SetWidth(200) frame:SetHeight(18) frame:SetHighlightTexture([[Interface\QuestFrame\UI-QuestTitleHighlight]], "ADD") frame:SetScript("OnClick", ContentOnClick) local check = frame:CreateTexture("OVERLAY") check:SetWidth(16) check:SetHeight(16) check:SetPoint("LEFT",frame,"LEFT",1,-1) check:SetTexture("Interface\\Buttons\\UI-CheckBox-Check") check:Hide() frame.check = check local soundbutton = CreateFrame("Button", nil, frame) soundbutton:SetWidth(16) soundbutton:SetHeight(16) soundbutton:SetPoint("RIGHT",frame,"RIGHT",-1,0) soundbutton.frame = frame soundbutton:SetScript("OnClick", ContentSpeakerOnClick) frame.soundbutton = soundbutton local speaker = soundbutton:CreateTexture(nil, "BACKGROUND") speaker:SetTexture("Interface\\Common\\VoiceChat-Speaker") speaker:SetAllPoints(soundbutton) frame.speaker = speaker local speakeron = soundbutton:CreateTexture(nil, "HIGHLIGHT") speakeron:SetTexture("Interface\\Common\\VoiceChat-On") speakeron:SetAllPoints(soundbutton) frame.speakeron = speakeron local text = frame:CreateFontString(nil,"OVERLAY","GameFontWhite") text:SetPoint("TOPLEFT", check, "TOPRIGHT", 1, 0) text:SetPoint("BOTTOMRIGHT", soundbutton, "BOTTOMLEFT", -2, 0) text:SetJustifyH("LEFT") text:SetText("Test Test Test Test Test Test Test") frame.text = text frame.ReturnSelf = ReturnSelf end frame:Show() return frame end local function OnAcquire(self) self:SetHeight(44) self:SetWidth(200) end local function OnRelease(self) self:SetText("") self:SetLabel("") self:SetDisabled(false) self.value = nil self.list = nil self.open = nil self.hasClose = nil self.frame:ClearAllPoints() self.frame:Hide() end local function SetValue(self, value) -- Set the value to an item in the List. if self.list then self:SetText(value or "") end self.value = value end local function GetValue(self) return self.value end local function SetList(self, list) -- Set the list of values for the dropdown (key => value pairs) self.list = list or Media:HashTable("sound") end local function SetText(self, text) -- Set the text displayed in the box. self.frame.text:SetText(text or "") end local function SetLabel(self, text) -- Set the text for the label. self.frame.label:SetText(text or "") end local function AddItem(self, key, value) -- Add an item to the list. self.list = self.list or {} self.list[key] = value end local SetItemValue = AddItem -- Set the value of a item in the list. <<same as adding a new item>> local function SetMultiselect(self, flag) end -- Toggle multi-selecting. <<Dummy function to stay inline with the dropdown API>> local function GetMultiselect() return false end-- Query the multi-select flag. <<Dummy function to stay inline with the dropdown API>> local function SetItemDisabled(self, key) end-- Disable one item in the list. <<Dummy function to stay inline with the dropdown API>> local function SetDisabled(self, disabled) -- Disable the widget. self.disabled = disabled if disabled then self.frame:Disable() self.speaker:SetDesaturated(true) self.speakeron:SetDesaturated(true) else self.frame:Enable() self.speaker:SetDesaturated(false) self.speakeron:SetDesaturated(false) end end local function textSort(a,b) return string.upper(a) < string.upper(b) end local sortedlist = {} local function ToggleDrop(this) local self = this.obj if self.dropdown then self.dropdown = AGSMW:ReturnDropDownFrame(self.dropdown) AceGUI:ClearFocus() else AceGUI:SetFocus(self) self.dropdown = AGSMW:GetDropDownFrame() local width = self.frame:GetWidth() self.dropdown:SetPoint("TOPLEFT", self.frame, "BOTTOMLEFT") self.dropdown:SetPoint("TOPRIGHT", self.frame, "BOTTOMRIGHT", width < 160 and (160 - width) or 0, 0) for k, v in pairs(self.list) do sortedlist[#sortedlist+1] = k end table.sort(sortedlist, textSort) for i, k in ipairs(sortedlist) do local f = GetContentLine() f.text:SetText(k) if k == self.value then f.check:Show() end f.obj = self self.dropdown:AddFrame(f) end wipe(sortedlist) end end local function ClearFocus(self) if self.dropdown then self.dropdown = AGSMW:ReturnDropDownFrame(self.dropdown) end end local function OnHide(this) local self = this.obj if self.dropdown then self.dropdown = AGSMW:ReturnDropDownFrame(self.dropdown) end end local function Drop_OnEnter(this) this.obj:Fire("OnEnter") end local function Drop_OnLeave(this) this.obj:Fire("OnLeave") end local function WidgetPlaySound(this) local self = this.obj local sound = self.frame.text:GetText() PlaySoundFile(self.list[sound] ~= sound and self.list[sound] or Media:Fetch('sound',sound), "Master") end local function Constructor() local frame = AGSMW:GetBaseFrame() local self = {} self.type = widgetType self.frame = frame frame.obj = self frame.dropButton.obj = self frame.dropButton:SetScript("OnEnter", Drop_OnEnter) frame.dropButton:SetScript("OnLeave", Drop_OnLeave) frame.dropButton:SetScript("OnClick",ToggleDrop) frame:SetScript("OnHide", OnHide) local soundbutton = CreateFrame("Button", nil, frame) soundbutton:SetWidth(16) soundbutton:SetHeight(16) soundbutton:SetPoint("LEFT",frame.DLeft,"LEFT",26,1) soundbutton:SetScript("OnClick", WidgetPlaySound) soundbutton.obj = self self.soundbutton = soundbutton frame.text:SetPoint("LEFT",soundbutton,"RIGHT",2,0) local speaker = soundbutton:CreateTexture(nil, "BACKGROUND") speaker:SetTexture("Interface\\Common\\VoiceChat-Speaker") speaker:SetAllPoints(soundbutton) self.speaker = speaker local speakeron = soundbutton:CreateTexture(nil, "HIGHLIGHT") speakeron:SetTexture("Interface\\Common\\VoiceChat-On") speakeron:SetAllPoints(soundbutton) self.speakeron = speakeron self.alignoffset = 31 self.OnRelease = OnRelease self.OnAcquire = OnAcquire self.ClearFocus = ClearFocus self.SetText = SetText self.SetValue = SetValue self.GetValue = GetValue self.SetList = SetList self.SetLabel = SetLabel self.SetDisabled = SetDisabled self.AddItem = AddItem self.SetMultiselect = SetMultiselect self.GetMultiselect = GetMultiselect self.SetItemValue = SetItemValue self.SetItemDisabled = SetItemDisabled self.ToggleDrop = ToggleDrop AceGUI:RegisterAsWidget(self) return self end AceGUI:RegisterWidgetType(widgetType, Constructor, widgetVersion) end