/trunk/Who Framed Watcher Wabbit/libs/AceGUI-3.0-SharedMediaWidgets
local AceGUI = LibStub("AceGUI-3.0") |
local Media = LibStub("LibSharedMedia-3.0") |
local AGSMW = LibStub("AceGUISharedMediaWidgets-1.0") |
do |
local min, max, floor = math.min, math.max, math.floor |
local fixlevels = AceGUISharedMediaWidgets.fixlevels |
local OnItemValueChanged = AceGUISharedMediaWidgets.OnItemValueChanged |
local widgetType = "LSM30_Sound" |
local widgetVersion = 9 |
do |
local widgetType = "LSM30_Sound_Item_Select" |
local widgetVersion = 1 |
local contentFrameCache = {} |
local function ReturnSelf(self) |
self:ClearAllPoints() |
self:Hide() |
self.check:Hide() |
table.insert(contentFrameCache, self) |
end |
local function Frame_OnEnter(this) |
local self = this.obj |
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 |
if self.useHighlight then |
self.highlight:Show() |
end |
self:Fire("OnEnter") |
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)) |
end |
if self.specialOnEnter then |
self.specialOnEnter(self) |
end |
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 function Frame_OnLeave(this) |
local self = this.obj |
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 |
self.highlight:Hide() |
self:Fire("OnLeave") |
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 |
if self.specialOnLeave then |
self.specialOnLeave(self) |
end |
local text = frame:CreateFontString(nil,"OVERLAY","GameFontWhite") |
text:SetPoint("LEFT", check, "RIGHT", 1, 0) |
text:SetPoint("RIGHT", soundbutton, "LEFT", -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.frame:SetToplevel(true) |
self.frame:SetFrameStrata("FULLSCREEN_DIALOG") |
end |
local function OnAcquire(self) |
self:SetHeight(44) |
self:SetWidth(200) |
end |
local function OnRelease(self) |
self.pullout = nil |
self.frame:SetParent(nil) |
self.frame:ClearAllPoints() |
self.frame:Hide() |
end |
local function OnRelease(self) |
self:SetText("") |
self:SetLabel("") |
self:SetDisabled(false) |
local function SetPullout(self, pullout) |
self.pullout = pullout |
self.value = nil |
self.list = nil |
self.open = nil |
self.hasClose = nil |
self.frame:SetParent(nil) |
self.frame:SetParent(pullout.itemFrame) |
self.parent = pullout.itemFrame |
fixlevels(pullout.itemFrame, pullout.itemFrame:GetChildren()) |
end |
self.frame:ClearAllPoints() |
self.frame:Hide() |
end |
local function SetText(self, text) |
self.sound = text or '' |
self.text:SetText(text or "") |
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 GetText(self) |
return self.text:GetText() |
end |
local function GetValue(self) |
return self.value |
end |
local function SetPoint(self, ...) |
self.frame:SetPoint(...) |
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 Show(self) |
self.frame:Show() |
end |
local function SetText(self, text) -- Set the text displayed in the box. |
self.frame.text:SetText(text or "") |
end |
local function Hide(self) |
self.frame:Hide() |
end |
local function SetLabel(self, text) -- Set the text for the label. |
self.frame.label:SetText(text or "") |
end |
local function SetDisabled(self, disabled) |
self.disabled = disabled |
if disabled then |
self.useHighlight = false |
self.text:SetTextColor(.5, .5, .5) |
else |
self.useHighlight = true |
self.text:SetTextColor(1, 1, 1) |
end |
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 SetOnLeave(self, func) |
self.specialOnLeave = func |
end |
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 SetOnEnter(self, func) |
self.specialOnEnter = func |
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 UpdateToggle(self) |
if self.value then |
self.check:Show() |
else |
self.check:Hide() |
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() |
self.dropdown:SetPoint("TOPLEFT", self.frame, "BOTTOMLEFT") |
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 Frame_OnClick(this, button) |
local self = this.obj |
self.value = not self.value |
UpdateToggle(self) |
self:Fire("OnValueChanged", self.value) |
local function ClearFocus(self) |
if self.dropdown then |
self.dropdown = AGSMW:ReturnDropDownFrame(self.dropdown) |
end |
end |
local function Speaker_OnClick(this, button) |
local self = this.obj |
PlaySoundFile(Media:Fetch('sound',self.sound)) |
local function OnHide(this) |
local self = this.obj |
if self.dropdown then |
self.dropdown = AGSMW:ReturnDropDownFrame(self.dropdown) |
end |
end |
local function SetValue(self, value) |
self.value = value |
UpdateToggle(self) |
end |
local function Drop_OnEnter(this) |
this.obj:Fire("OnEnter") |
end |
local function Constructor() |
local count = AceGUI:GetNextWidgetNum(type) |
local frame = CreateFrame("Frame", "LSM30_Sound_DropDownItem"..count) |
local self = {} |
self.frame = frame |
frame.obj = self |
self.type = type |
local function Drop_OnLeave(this) |
this.obj:Fire("OnLeave") |
end |
self.useHighlight = true |
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)) |
end |
frame:SetHeight(17) |
frame:SetFrameStrata("FULLSCREEN_DIALOG") |
local function Constructor() |
local frame = AGSMW:GetBaseFrame() |
local self = {} |
local button = CreateFrame("Button", nil, frame) |
button:SetPoint("BOTTOMRIGHT",frame,"BOTTOMRIGHT",-22,0) |
button:SetPoint("TOPLEFT",frame,"TOPLEFT",0,0) |
self.button = button |
button.obj = 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 speakerbutton = CreateFrame("Button", nil, frame) |
speakerbutton:SetWidth(16) |
speakerbutton:SetHeight(16) |
speakerbutton:SetPoint("RIGHT",frame,"RIGHT",-6,0) |
self.speakerbutton = speakerbutton |
speakerbutton.obj = self |
local speaker = frame:CreateTexture(nil, "BACKGROUND") |
speaker:SetTexture("Interface\\Common\\VoiceChat-Speaker") |
speaker:SetAllPoints(speakerbutton) |
self.speaker = speaker |
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 speakeron = speakerbutton:CreateTexture(nil, "HIGHLIGHT") |
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(speakerbutton) |
self.speakeron = speakeron |
speakeron:SetAllPoints(soundbutton) |
self.speakeron = speakeron |
local text = frame:CreateFontString(nil,"OVERLAY","GameFontNormalSmall") |
text:SetTextColor(1,1,1) |
text:SetJustifyH("LEFT") |
text:SetPoint("TOPLEFT",frame,"TOPLEFT",18,0) |
text:SetPoint("BOTTOMRIGHT",frame,"BOTTOMRIGHT",-24,0) |
self.text = text |
self.alignoffset = 31 |
local highlight = button:CreateTexture(nil, "OVERLAY") |
highlight:SetTexture("Interface\\QuestFrame\\UI-QuestTitleHighlight") |
highlight:SetBlendMode("ADD") |
highlight:SetHeight(14) |
highlight:ClearAllPoints() |
highlight:SetPoint("RIGHT",frame,"RIGHT",-19,0) |
highlight:SetPoint("LEFT",frame,"LEFT",5,0) |
highlight:Hide() |
self.highlight = highlight |
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 |
local check = frame:CreateTexture("OVERLAY") |
check:SetWidth(16) |
check:SetHeight(16) |
check:SetPoint("LEFT",frame,"LEFT",3,-1) |
check:SetTexture("Interface\\Buttons\\UI-CheckBox-Check") |
check:Hide() |
self.check = check |
local sub = frame:CreateTexture("OVERLAY") |
sub:SetWidth(16) |
sub:SetHeight(16) |
sub:SetPoint("RIGHT",frame,"RIGHT",-3,-1) |
sub:SetTexture("Interface\\ChatFrame\\ChatFrameExpandArrow") |
sub:Hide() |
self.sub = sub |
button:SetScript("OnEnter", Frame_OnEnter) |
button:SetScript("OnLeave", Frame_OnLeave) |
self.OnAcquire = OnAcquire |
self.OnRelease = OnRelease |
self.SetPullout = SetPullout |
self.GetText = GetText |
self.SetText = SetText |
self.SetDisabled = SetDisabled |
self.SetPoint = SetPoint |
self.Show = Show |
self.Hide = Hide |
self.SetOnLeave = SetOnLeave |
self.SetOnEnter = SetOnEnter |
self.button:SetScript("OnClick", Frame_OnClick) |
self.speakerbutton:SetScript("OnClick", Speaker_OnClick) |
self.SetValue = SetValue |
AceGUI:RegisterAsWidget(self) |
return self |
end |
AceGUI:RegisterWidgetType(widgetType, Constructor, widgetVersion) |
AceGUI:RegisterAsWidget(self) |
return self |
end |
do |
local widgetType = "LSM30_Sound" |
local widgetVersion = 3 |
AceGUI:RegisterWidgetType(widgetType, Constructor, widgetVersion) |
local function AddListItem(self, value, text) |
local item = AceGUI:Create("LSM30_Sound_Item_Select") |
item:SetText(text) |
item.userdata.obj = self |
item.userdata.value = value |
item:SetCallback("OnValueChanged", OnItemValueChanged) |
self.pullout:AddItem(item) |
end |
local function SetList(self, list) |
self.list = list or Media:HashTable("sound") |
self.pullout:Clear() |
if self.multiselect then |
AddCloseButton() |
end |
end |
local sortlist = {} |
local function ParseListItems(self) |
for v in pairs(self.list) do |
sortlist[#sortlist + 1] = v |
end |
table.sort(sortlist) |
for i, value in pairs(sortlist) do |
AddListItem(self, value, value) |
sortlist[i] = nil |
end |
end |
local function Constructor() |
local self = AceGUI:Create("Dropdown") |
self.type = widgetType |
self.SetList = SetList |
self.SetValue = AceGUISharedMediaWidgets.SetValue |
local clickscript = self.button:GetScript("OnClick") |
self.button:SetScript("OnClick", function(...) |
self.pullout:Clear() |
ParseListItems(self) |
clickscript(...) |
end) |
return self |
end |
AceGUI:RegisterWidgetType(widgetType, Constructor, widgetVersion) |
end |
end |
local AceGUI = LibStub("AceGUI-3.0") |
local Media = LibStub("LibSharedMedia-3.0") |
local AGSMW = LibStub("AceGUISharedMediaWidgets-1.0") |
do |
local min, max, floor = math.min, math.max, math.floor |
local fixlevels = AceGUISharedMediaWidgets.fixlevels |
local OnItemValueChanged = AceGUISharedMediaWidgets.OnItemValueChanged |
local widgetType = "LSM30_Statusbar" |
local widgetVersion = 9 |
do |
local widgetType = "LSM30_Statusbar_Item_Select" |
local widgetVersion = 1 |
local contentFrameCache = {} |
local function ReturnSelf(self) |
self:ClearAllPoints() |
self:Hide() |
self.check:Hide() |
table.insert(contentFrameCache, self) |
end |
local function SetText(self, text) |
if text and text ~= '' then |
self.texture:SetTexture(Media:Fetch('statusbar',text)) |
self.texture:SetVertexColor(.5,.5,.5) |
end |
self.text:SetText(text or "") |
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 Constructor() |
local self = AceGUI:Create("Dropdown-Item-Toggle") |
self.type = widgetType |
self.SetText = SetText |
local texture = self.frame:CreateTexture(nil, "BACKGROUND") |
texture:SetTexture(0,0,0,0) |
texture:SetPoint("BOTTOMRIGHT",self.frame,"BOTTOMRIGHT",-4,1) |
texture:SetPoint("TOPLEFT",self.frame,"TOPLEFT",6,-1) |
self.texture = texture |
return self |
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 bar = frame:CreateTexture("ARTWORK") |
bar:SetHeight(16) |
bar:SetPoint("LEFT",check,"RIGHT",1,0) |
bar:SetPoint("RIGHT",frame,"RIGHT",-1,0) |
frame.bar = bar |
local text = frame:CreateFontString(nil,"OVERLAY","GameFontWhite") |
local font, size = text:GetFont() |
text:SetFont(font,size,"OUTLINE") |
text:SetPoint("LEFT", check, "RIGHT", 3, 0) |
text:SetPoint("RIGHT", frame, "RIGHT", -2, 0) |
text:SetJustifyH("LEFT") |
text:SetText("Test Test Test Test Test Test Test") |
frame.text = text |
frame.ReturnSelf = ReturnSelf |
end |
AceGUI:RegisterWidgetType(widgetType, Constructor, widgetVersion) |
frame:Show() |
return frame |
end |
do |
local widgetType = "LSM30_Statusbar" |
local widgetVersion = 3 |
local function OnAcquire(self) |
self:SetHeight(44) |
self:SetWidth(200) |
end |
local function SetText(self, text) |
if text and text ~= '' then |
self.texture:SetTexture(Media:Fetch('statusbar',text)) |
self.texture:SetVertexColor(.5,.5,.5) |
end |
self.text:SetText(text or "") |
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 AddListItem(self, value, text) |
local item = AceGUI:Create("LSM30_Statusbar_Item_Select") |
item:SetText(text) |
item.userdata.obj = self |
item.userdata.value = value |
item:SetCallback("OnValueChanged", OnItemValueChanged) |
self.pullout:AddItem(item) |
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("statusbar") |
end |
local function SetText(self, text) -- Set the text displayed in the box. |
self.frame.text:SetText(text or "") |
local statusbar = self.list[text] ~= text and self.list[text] or Media:Fetch('statusbar',text) |
self.bar:SetTexture(statusbar) |
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() |
else |
self.frame:Enable() |
end |
end |
local function SetList(self, list) |
self.list = list or Media:HashTable("statusbar") |
self.pullout:Clear() |
if self.multiselect then |
AddCloseButton() |
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() |
self.dropdown:SetPoint("TOPLEFT", self.frame, "BOTTOMLEFT") |
for k, v in pairs(self.list) do |
sortedlist[#sortedlist+1] = k |
end |
end |
table.sort(sortedlist, textSort) |
for i, k in ipairs(sortedlist) do |
local f = GetContentLine() |
f.text:SetText(k) |
--print(k) |
if k == self.value then |
f.check:Show() |
end |
local sortlist = {} |
local function ParseListItems(self) |
for v in pairs(self.list) do |
sortlist[#sortlist + 1] = v |
local statusbar = self.list[k] ~= k and self.list[k] or Media:Fetch('statusbar',k) |
f.bar:SetTexture(statusbar) |
f.obj = self |
f.dropdown = self.dropdown |
self.dropdown:AddFrame(f) |
end |
table.sort(sortlist) |
for i, value in pairs(sortlist) do |
AddListItem(self, value, value) |
sortlist[i] = nil |
end |
wipe(sortedlist) |
end |
end |
local function Constructor() |
local self = AceGUI:Create("Dropdown") |
self.type = widgetType |
self.SetText = SetText |
self.SetList = SetList |
self.SetValue = AceGUISharedMediaWidgets.SetValue |
local function ClearFocus(self) |
if self.dropdown then |
self.dropdown = AGSMW:ReturnDropDownFrame(self.dropdown) |
end |
end |
local left = _G[self.dropdown:GetName() .. "Left"] |
local middle = _G[self.dropdown:GetName() .. "Middle"] |
local right = _G[self.dropdown:GetName() .. "Right"] |
local function OnHide(this) |
local self = this.obj |
if self.dropdown then |
self.dropdown = AGSMW:ReturnDropDownFrame(self.dropdown) |
end |
end |
local texture = self.dropdown:CreateTexture(nil, "ARTWORK") |
texture:SetPoint("BOTTOMRIGHT", right, "BOTTOMRIGHT" ,-39, 26) |
texture:SetPoint("TOPLEFT", left, "TOPLEFT", 24, -24) |
self.texture = texture |
local function Drop_OnEnter(this) |
this.obj:Fire("OnEnter") |
end |
local clickscript = self.button:GetScript("OnClick") |
self.button:SetScript("OnClick", function(...) |
self.pullout:Clear() |
ParseListItems(self) |
clickscript(...) |
end) |
local function Drop_OnLeave(this) |
this.obj:Fire("OnLeave") |
end |
return self |
end |
AceGUI:RegisterWidgetType(widgetType, Constructor, widgetVersion) |
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 bar = frame:CreateTexture(nil, "ARTWORK") |
bar:SetPoint("TOPLEFT", frame,"TOPLEFT",6,-25) |
bar:SetPoint("BOTTOMRIGHT", frame,"BOTTOMRIGHT", -21, 5) |
self.bar = bar |
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 |
local AceGUI = LibStub("AceGUI-3.0") |
local Media = LibStub("LibSharedMedia-3.0") |
local AGSMW = LibStub("AceGUISharedMediaWidgets-1.0") |
do |
local min, max, floor = math.min, math.max, math.floor |
local fixlevels = AceGUISharedMediaWidgets.fixlevels |
local OnItemValueChanged = AceGUISharedMediaWidgets.OnItemValueChanged |
local widgetType = "LSM30_Border" |
local widgetVersion = 9 |
do |
local widgetType = "LSM30_Border_Item_Select" |
local widgetVersion = 1 |
local contentFrameCache = {} |
local function ReturnSelf(self) |
self:ClearAllPoints() |
self:Hide() |
self.check:Hide() |
table.insert(contentFrameCache, self) |
end |
local function Frame_OnEnter(this) |
local self = this.obj |
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 |
if self.useHighlight then |
self.highlight:Show() |
self.border:Show() |
end |
self:Fire("OnEnter") |
local function ContentOnEnter(this, button) |
local self = this.obj |
local text = this.text:GetText() |
local border = self.list[text] ~= text and self.list[text] or Media:Fetch('border',text) |
this.dropdown:SetBackdrop({edgeFile = border, |
bgFile=[[Interface\DialogFrame\UI-DialogBox-Background-Dark]], |
tile = true, tileSize = 16, edgeSize = 16, |
insets = { left = 4, right = 4, top = 4, bottom = 4 }}) |
end |
if self.specialOnEnter then |
self.specialOnEnter(self) |
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) |
frame:SetScript("OnEnter", ContentOnEnter) |
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 text = frame:CreateFontString(nil,"OVERLAY","GameFontWhite") |
text:SetPoint("LEFT", check, "RIGHT", 1, 0) |
text:SetPoint("RIGHT", frame, "RIGHT", -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 Frame_OnLeave(this) |
local self = this.obj |
self.border:Hide() |
self.highlight:Hide() |
self:Fire("OnLeave") |
local function OnAcquire(self) |
self:SetHeight(44) |
self:SetWidth(200) |
end |
if self.specialOnLeave then |
self.specialOnLeave(self) |
end |
end |
local function OnRelease(self) |
self:SetText("") |
self:SetLabel("") |
self:SetDisabled(false) |
local function SetText(self, text) |
if text and text ~= '' then |
local backdropTable = self.border:GetBackdrop() |
backdropTable.edgeFile = Media:Fetch('border',text) |
self.border:SetBackdrop(backdropTable) |
end |
self.text:SetText(text or "") |
end |
self.value = nil |
self.list = nil |
self.open = nil |
self.hasClose = nil |
local function Constructor() |
local self = AceGUI:Create("Dropdown-Item-Toggle") |
self.type = widgetType |
self.SetText = SetText |
local border = CreateFrame('Frame') |
border:SetFrameStrata("TOOLTIP") |
border:SetWidth(64) |
border:SetHeight(32) |
border:SetPoint("LEFT",self.frame,"RIGHT",5,0) |
border:SetBackdrop({bgFile = "Interface/Tooltips/UI-Tooltip-Background", |
tile = true, tileSize = 16, edgeSize = 16, |
insets = { left = 4, right = 4, top = 4, bottom = 4 }}) |
self.border = border |
border:Hide() |
self.frame:SetScript("OnEnter", Frame_OnEnter) |
self.frame:SetScript("OnLeave", Frame_OnLeave) |
return self |
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 |
AceGUI:RegisterWidgetType(widgetType, Constructor, widgetVersion) |
self.value = value |
end |
do |
local widgetType = "LSM30_Border" |
local widgetVersion = 3 |
local function GetValue(self) |
return self.value |
end |
local function Frame_OnEnter(this) |
local self = this.obj |
local text = self.text:GetText() |
if text ~= nil and text ~= '' then |
self.borderframe:Show() |
end |
end |
local function SetList(self, list) -- Set the list of values for the dropdown (key => value pairs) |
self.list = list or Media:HashTable("border") |
end |
local function Frame_OnLeave(this) |
local self = this.obj |
self.borderframe:Hide() |
end |
local function AddListItem(self, value, text) |
local item = AceGUI:Create("LSM30_Border_Item_Select") |
item:SetText(text) |
item.userdata.obj = self |
item.userdata.value = value |
item:SetCallback("OnValueChanged", OnItemValueChanged) |
self.pullout:AddItem(item) |
end |
local function SetText(self, text) -- Set the text displayed in the box. |
self.frame.text:SetText(text or "") |
local border = self.list[text] ~= text and self.list[text] or Media:Fetch('border',text) |
local function SetList(self, list) |
self.list = list or Media:HashTable("border") |
self.pullout:Clear() |
if self.multiselect then |
AddCloseButton() |
end |
self.frame.displayButton:SetBackdrop({edgeFile = border, |
bgFile=[[Interface\DialogFrame\UI-DialogBox-Background-Dark]], |
tile = true, tileSize = 16, edgeSize = 16, |
insets = { left = 4, right = 4, top = 4, bottom = 4 }}) |
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() |
else |
self.frame:Enable() |
end |
end |
local sortlist = {} |
local function ParseListItems(self) |
for v in pairs(self.list) do |
sortlist[#sortlist + 1] = v |
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() |
self.dropdown:SetPoint("TOPLEFT", self.frame, "BOTTOMLEFT") |
for k, v in pairs(self.list) do |
sortedlist[#sortedlist+1] = k |
end |
table.sort(sortlist) |
for i, value in pairs(sortlist) do |
AddListItem(self, value, value) |
sortlist[i] = nil |
table.sort(sortedlist, textSort) |
for i, k in ipairs(sortedlist) do |
local f = GetContentLine() |
f.text:SetText(k) |
--print(k) |
if k == self.value then |
f.check:Show() |
end |
f.obj = self |
f.dropdown = self.dropdown |
self.dropdown:AddFrame(f) |
end |
wipe(sortedlist) |
end |
end |
local function SetText(self, text) |
if text and text ~= '' then |
local backdropTable = self.borderframe:GetBackdrop() |
backdropTable.edgeFile = Media:Fetch('border',text) |
self.borderframe:SetBackdrop(backdropTable) |
end |
self.text:SetText(text or "") |
local function ClearFocus(self) |
if self.dropdown then |
self.dropdown = AGSMW:ReturnDropDownFrame(self.dropdown) |
end |
end |
local function Constructor() |
local self = AceGUI:Create("Dropdown") |
self.type = widgetType |
self.SetList = SetList |
self.SetText = SetText |
self.SetValue = AceGUISharedMediaWidgets.SetValue |
local function OnHide(this) |
local self = this.obj |
if self.dropdown then |
self.dropdown = AGSMW:ReturnDropDownFrame(self.dropdown) |
end |
end |
local left = _G[self.dropdown:GetName() .. "Left"] |
local middle = _G[self.dropdown:GetName() .. "Middle"] |
local right = _G[self.dropdown:GetName() .. "Right"] |
local function Drop_OnEnter(this) |
this.obj:Fire("OnEnter") |
end |
local borderframe = CreateFrame('Frame') |
borderframe:SetFrameStrata("TOOLTIP") |
borderframe:SetWidth(64) |
borderframe:SetHeight(32) |
borderframe:SetPoint("LEFT",right,"RIGHT",-15,0) |
borderframe:SetBackdrop({bgFile = "Interface/Tooltips/UI-Tooltip-Background", |
tile = true, tileSize = 16, edgeSize = 16, |
insets = { left = 4, right = 4, top = 4, bottom = 4 }}) |
self.borderframe = borderframe |
borderframe:Hide() |
local function Drop_OnLeave(this) |
this.obj:Fire("OnLeave") |
end |
self.dropdown:EnableMouse(true) |
self.dropdown:SetScript("OnEnter", Frame_OnEnter) |
self.dropdown:SetScript("OnLeave", Frame_OnLeave) |
local function Constructor() |
local frame = AGSMW:GetBaseFrameWithWindow() |
local self = {} |
local clickscript = self.button:GetScript("OnClick") |
self.button:SetScript("OnClick", function(...) |
self.pullout:Clear() |
ParseListItems(self) |
clickscript(...) |
end) |
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) |
return self |
end |
AceGUI:RegisterWidgetType(widgetType, Constructor, widgetVersion) |
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 |
<Ui xmlns="http://www.blizzard.com/wow/ui/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.blizzard.com/wow/ui/ |
..\FrameXML\UI.xsd"> |
<Script file="SharedFunctions.lua" /> |
<Script file="prototypes.lua" /> |
<Script file="FontWidget.lua" /> |
<Script file="SoundWidget.lua" /> |
<Script file="StatusbarWidget.lua" /> |
local AceGUI = LibStub("AceGUI-3.0") |
local Media = LibStub("LibSharedMedia-3.0") |
local AGSMW = LibStub("AceGUISharedMediaWidgets-1.0") |
do |
local min, max, floor = math.min, math.max, math.floor |
local fixlevels = AceGUISharedMediaWidgets.fixlevels |
local OnItemValueChanged = AceGUISharedMediaWidgets.OnItemValueChanged |
local widgetType = "LSM30_Background" |
local widgetVersion = 9 |
do |
local widgetType = "LSM30_Background_Item_Select" |
local widgetVersion = 1 |
local contentFrameCache = {} |
local function ReturnSelf(self) |
self:ClearAllPoints() |
self:Hide() |
self.check:Hide() |
table.insert(contentFrameCache, self) |
end |
local function Frame_OnEnter(this) |
local self = this.obj |
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 |
if self.useHighlight then |
self.highlight:Show() |
self.texture:Show() |
end |
self:Fire("OnEnter") |
local function ContentOnEnter(this, button) |
local self = this.obj |
local text = this.text:GetText() |
local background = self.list[text] ~= text and self.list[text] or Media:Fetch('background',text) |
self.dropdown.bgTex:SetTexture(background) |
end |
if self.specialOnEnter then |
self.specialOnEnter(self) |
end |
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) |
frame:SetScript("OnEnter", ContentOnEnter) |
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 text = frame:CreateFontString(nil,"OVERLAY","GameFontWhite") |
local function Frame_OnLeave(this) |
local self = this.obj |
self.texture:Hide() |
self.highlight:Hide() |
self:Fire("OnLeave") |
local font, size = text:GetFont() |
text:SetFont(font,size,"OUTLINE") |
if self.specialOnLeave then |
self.specialOnLeave(self) |
end |
text:SetPoint("LEFT", check, "RIGHT", 1, 0) |
text:SetPoint("RIGHT", frame, "RIGHT", -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 SetText(self, text) |
if text and text ~= '' then |
self.texture:SetTexture(Media:Fetch('background',text)) |
end |
self.text:SetText(text or "") |
end |
local function OnAcquire(self) |
self:SetHeight(44) |
self:SetWidth(200) |
end |
local function Constructor() |
local self = AceGUI:Create("Dropdown-Item-Toggle") |
self.type = widgetType |
self.SetText = SetText |
local textureframe = CreateFrame('Frame') |
textureframe:SetFrameStrata("TOOLTIP") |
textureframe:SetWidth(128) |
textureframe:SetHeight(128) |
textureframe:SetPoint("LEFT",self.frame,"RIGHT",5,0) |
self.textureframe = textureframe |
local texture = textureframe:CreateTexture(nil, "OVERLAY") |
texture:SetTexture(0,0,0,0) |
texture:SetAllPoints(textureframe) |
texture:Hide() |
self.texture = texture |
self.frame:SetScript("OnEnter", Frame_OnEnter) |
self.frame:SetScript("OnLeave", Frame_OnLeave) |
return self |
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 |
AceGUI:RegisterWidgetType(widgetType, Constructor, widgetVersion) |
self.value = value |
end |
do |
local widgetType = "LSM30_Background" |
local widgetVersion = 3 |
local function GetValue(self) |
return self.value |
end |
local function Frame_OnEnter(this) |
local self = this.obj |
local text = self.text:GetText() |
if text ~= nil and text ~= '' then |
self.textureframe:Show() |
end |
end |
local function SetList(self, list) -- Set the list of values for the dropdown (key => value pairs) |
self.list = list or Media:HashTable("background") |
end |
local function Frame_OnLeave(this) |
local self = this.obj |
self.textureframe:Hide() |
end |
local function SetText(self, text) |
if text and text ~= '' then |
self.texture:SetTexture(Media:Fetch('background',text)) |
end |
self.text:SetText(text or "") |
end |
local function SetText(self, text) -- Set the text displayed in the box. |
self.frame.text:SetText(text or "") |
local background = self.list[text] ~= text and self.list[text] or Media:Fetch('background',text) |
local function AddListItem(self, value, text) |
local item = AceGUI:Create("LSM30_Background_Item_Select") |
item:SetText(text) |
item.userdata.obj = self |
item.userdata.value = value |
item:SetCallback("OnValueChanged", OnItemValueChanged) |
self.pullout:AddItem(item) |
end |
self.frame.displayButton:SetBackdrop({bgFile = background, |
edgeFile = "Interface/Tooltips/UI-Tooltip-Border", |
edgeSize = 16, |
insets = { left = 4, right = 4, top = 4, bottom = 4 }}) |
end |
local function SetList(self, list) |
self.list = list or Media:HashTable("background") |
self.pullout:Clear() |
local function SetLabel(self, text) -- Set the text for the label. |
self.frame.label:SetText(text or "") |
end |
if self.multiselect then |
AddCloseButton() |
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.frame.displayButton:SetBackdropColor(.2,.2,.2,1) |
else |
self.frame:Enable() |
self.frame.displayButton:SetBackdropColor(1,1,1,1) |
end |
end |
local sortlist = {} |
local function ParseListItems(self) |
for v in pairs(self.list) do |
sortlist[#sortlist + 1] = v |
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() |
self.dropdown:SetPoint("TOPLEFT", self.frame, "BOTTOMLEFT") |
for k, v in pairs(self.list) do |
sortedlist[#sortedlist+1] = k |
end |
table.sort(sortlist) |
for i, value in pairs(sortlist) do |
AddListItem(self, value, value) |
sortlist[i] = nil |
table.sort(sortedlist, textSort) |
for i, k in ipairs(sortedlist) do |
local f = GetContentLine() |
f.text:SetText(k) |
--print(k) |
if k == self.value then |
f.check:Show() |
end |
f.obj = self |
f.dropdown = self.dropdown |
self.dropdown:AddFrame(f) |
end |
wipe(sortedlist) |
end |
end |
local function Constructor() |
local self = AceGUI:Create("Dropdown") |
self.type = widgetType |
self.SetText = SetText |
self.SetList = SetList |
self.SetValue = AceGUISharedMediaWidgets.SetValue |
local function ClearFocus(self) |
if self.dropdown then |
self.dropdown = AGSMW:ReturnDropDownFrame(self.dropdown) |
end |
end |
local left = _G[self.dropdown:GetName() .. "Left"] |
local middle = _G[self.dropdown:GetName() .. "Middle"] |
local right = _G[self.dropdown:GetName() .. "Right"] |
local function OnHide(this) |
local self = this.obj |
if self.dropdown then |
self.dropdown = AGSMW:ReturnDropDownFrame(self.dropdown) |
end |
end |
local textureframe = CreateFrame('Frame') |
textureframe:SetFrameStrata("TOOLTIP") |
textureframe:SetWidth(128) |
textureframe:SetHeight(128) |
textureframe:SetPoint("LEFT",right,"RIGHT",-15,0) |
self.textureframe = textureframe |
local texture = textureframe:CreateTexture(nil, "OVERLAY") |
texture:SetTexture(0,0,0,0) |
texture:SetAllPoints(textureframe) |
textureframe:Hide() |
self.texture = texture |
local function Drop_OnEnter(this) |
this.obj:Fire("OnEnter") |
end |
self.dropdown:EnableMouse(true) |
self.dropdown:SetScript("OnEnter", Frame_OnEnter) |
self.dropdown:SetScript("OnLeave", Frame_OnLeave) |
local function Drop_OnLeave(this) |
this.obj:Fire("OnLeave") |
end |
local clickscript = self.button:GetScript("OnClick") |
self.button:SetScript("OnClick", function(...) |
self.pullout:Clear() |
ParseListItems(self) |
clickscript(...) |
end) |
local function Constructor() |
local frame = AGSMW:GetBaseFrameWithWindow() |
local self = {} |
return self |
end |
AceGUI:RegisterWidgetType(widgetType, Constructor, widgetVersion) |
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) |
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 |
-- Widget created by Yssaril |
--[===[@debug@ |
local DataVersion = 9001 -- dev version always overwrites everything else :) |
--@end-debug@]===] |
--@non-debug@ |
local DataVersion = 42 |
--@end-non-debug@ |
local AGSMW = LibStub:NewLibrary("AceGUISharedMediaWidgets-1.0", DataVersion) |
if not AGSMW then |
return -- already loaded and no upgrade necessary |
end |
LoadAddOn("LibSharedMedia-3.0") |
local AceGUI = LibStub("AceGUI-3.0") |
local Media = LibStub("LibSharedMedia-3.0") |
AGSMW = AGSMW or {} |
AceGUIWidgetLSMlists = { |
['font'] = Media:HashTable("font"), |
['sound'] = Media:HashTable("sound"), |
['statusbar'] = Media:HashTable("statusbar"), |
['border'] = Media:HashTable("border"), |
['background'] = Media:HashTable("background"), |
} |
do |
local function disable(frame) |
frame.label:SetTextColor(.5,.5,.5) |
frame.text:SetTextColor(.5,.5,.5) |
frame.dropButton:Disable() |
if frame.displayButtonFont then |
frame.displayButtonFont:SetTextColor(.5,.5,.5) |
frame.displayButton:Disable() |
end |
end |
local function enable(frame) |
frame.label:SetTextColor(1,.82,0) |
frame.text:SetTextColor(1,1,1) |
frame.dropButton:Enable() |
if frame.displayButtonFont then |
frame.displayButtonFont:SetTextColor(1,1,1) |
frame.displayButton:Enable() |
end |
end |
local displayButtonBackdrop = { |
edgeFile = "Interface/Tooltips/UI-Tooltip-Border", |
tile = true, tileSize = 16, edgeSize = 16, |
insets = { left = 4, right = 4, top = 4, bottom = 4 }, |
} |
-- create or retrieve BaseFrame |
function AGSMW:GetBaseFrame() |
local frame = CreateFrame("Frame", nil, UIParent) |
frame:SetHeight(44) |
frame:SetWidth(200) |
frame:SetPoint("CENTER", UIParent, "CENTER") |
local label = frame:CreateFontString(nil,"OVERLAY","GameFontNormalSmall") |
label:SetPoint("TOPLEFT",frame,"TOPLEFT",0,0) |
label:SetPoint("TOPRIGHT",frame,"TOPRIGHT",0,0) |
label:SetJustifyH("LEFT") |
label:SetHeight(18) |
label:SetText("") |
frame.label = label |
local DLeft = frame:CreateTexture(nil, "ARTWORK") |
DLeft:SetWidth(25) |
DLeft:SetHeight(64) |
DLeft:SetPoint("BOTTOMLEFT", frame, "BOTTOMLEFT", -17, -21) |
DLeft:SetTexture([[Interface\Glues\CharacterCreate\CharacterCreate-LabelFrame]]) |
DLeft:SetTexCoord(0, 0.1953125, 0, 1) |
frame.DLeft = DLeft |
local DRight = frame:CreateTexture(nil, "ARTWORK") |
DRight:SetWidth(25) |
DRight:SetHeight(64) |
DRight:SetPoint("TOP", DLeft, "TOP") |
DRight:SetPoint("RIGHT", frame, "RIGHT", 17, 0) |
DRight:SetTexture([[Interface\Glues\CharacterCreate\CharacterCreate-LabelFrame]]) |
DRight:SetTexCoord(0.8046875, 1, 0, 1) |
frame.DRight = DRight |
local DMiddle = frame:CreateTexture(nil, "ARTWORK") |
DMiddle:SetHeight(64) |
DMiddle:SetPoint("TOP", DLeft, "TOP") |
DMiddle:SetPoint("LEFT", DLeft, "RIGHT") |
DMiddle:SetPoint("RIGHT", DRight, "LEFT") |
DMiddle:SetTexture([[Interface\Glues\CharacterCreate\CharacterCreate-LabelFrame]]) |
DMiddle:SetTexCoord(0.1953125, 0.8046875, 0, 1) |
frame.DMiddle = DMiddle |
local text = frame:CreateFontString(nil,"OVERLAY","GameFontHighlightSmall") |
text:SetPoint("RIGHT",DRight,"RIGHT",-43,1) |
text:SetPoint("LEFT",DLeft,"LEFT",26,1) |
text:SetJustifyH("RIGHT") |
text:SetHeight(18) |
text:SetText("") |
frame.text = text |
local dropButton = CreateFrame("Button", nil, frame) |
dropButton:SetWidth(24) |
dropButton:SetHeight(24) |
dropButton:SetPoint("TOPRIGHT", DRight, "TOPRIGHT", -16, -18) |
dropButton:SetNormalTexture([[Interface\ChatFrame\UI-ChatIcon-ScrollDown-Up]]) |
dropButton:SetPushedTexture([[Interface\ChatFrame\UI-ChatIcon-ScrollDown-Down]]) |
dropButton:SetDisabledTexture([[Interface\ChatFrame\UI-ChatIcon-ScrollDown-Disabled]]) |
dropButton:SetHighlightTexture([[Interface\Buttons\UI-Common-MouseHilight]], "ADD") |
frame.dropButton = dropButton |
frame.Disable = disable |
frame.Enable = enable |
return frame |
end |
function AGSMW:GetBaseFrameWithWindow() |
local frame = self:GetBaseFrame() |
local displayButton = CreateFrame("Button", nil, frame) |
displayButton:SetHeight(42) |
displayButton:SetWidth(42) |
displayButton:SetPoint("TOPLEFT", frame, "TOPLEFT", 1, -2) |
displayButton:SetBackdrop(displayButtonBackdrop) |
displayButton:SetBackdropBorderColor(.5, .5, .5) |
frame.displayButton = displayButton |
frame.label:SetPoint("TOPLEFT",displayButton,"TOPRIGHT",1,2) |
frame.DLeft:SetPoint("BOTTOMLEFT", displayButton, "BOTTOMRIGHT", -17, -20) |
return frame |
end |
end |
do |
local sliderBackdrop = { |
["bgFile"] = [[Interface\Buttons\UI-SliderBar-Background]], |
["edgeFile"] = [[Interface\Buttons\UI-SliderBar-Border]], |
["tile"] = true, |
["edgeSize"] = 8, |
["tileSize"] = 8, |
["insets"] = { |
["left"] = 3, |
["right"] = 3, |
["top"] = 3, |
["bottom"] = 3, |
}, |
} |
local frameBackdrop = { |
bgFile=[[Interface\DialogFrame\UI-DialogBox-Background-Dark]], |
edgeFile = [[Interface\DialogFrame\UI-DialogBox-Border]], |
tile = true, tileSize = 32, edgeSize = 32, |
insets = { left = 11, right = 12, top = 12, bottom = 9 }, |
} |
local function OnMouseWheel(self, dir) |
self.slider:SetValue(self.slider:GetValue()+(15*dir*-1)) |
end |
local function AddFrame(self, frame) |
frame:SetParent(self.contentframe) |
local strata = self:GetFrameStrata() |
frame:SetFrameStrata(strata) |
local level = self:GetFrameLevel() + 100 |
frame:SetFrameLevel(level) |
if next(self.contentRepo) then |
frame:SetPoint("TOPLEFT", self.contentRepo[#self.contentRepo], "BOTTOMLEFT", 0, 0) |
frame:SetPoint("RIGHT", self.contentframe, "RIGHT", 0, 0) |
self.contentframe:SetHeight(self.contentframe:GetHeight() + frame:GetHeight()) |
self.contentRepo[#self.contentRepo+1] = frame |
else |
self.contentframe:SetHeight(frame:GetHeight()) |
frame:SetPoint("TOPLEFT", self.contentframe, "TOPLEFT", 0, 0) |
frame:SetPoint("RIGHT", self.contentframe, "RIGHT", 0, 0) |
self.contentRepo[1] = frame |
end |
if self.contentframe:GetHeight() > UIParent:GetHeight()*2/5 - 20 then |
self.scrollframe:SetWidth(146) |
self:SetHeight(UIParent:GetHeight()*2/5) |
self.slider:Show() |
self:SetScript("OnMouseWheel", OnMouseWheel) |
self.scrollframe:UpdateScrollChildRect() |
self.slider:SetMinMaxValues(0, self.contentframe:GetHeight()-self.scrollframe:GetHeight()) |
else |
self.scrollframe:SetWidth(160) |
self:SetHeight(self.contentframe:GetHeight()+25) |
self.slider:Hide() |
self:SetScript("OnMouseWheel", nil) |
self.scrollframe:UpdateScrollChildRect() |
self.slider:SetMinMaxValues(0, 0) |
end |
self.contentframe:SetWidth(self.scrollframe:GetWidth()) |
end |
local function ClearFrames(self) |
for i, frame in ipairs(self.contentRepo) do |
frame:ReturnSelf() |
self.contentRepo[i] = nil |
end |
end |
local function slider_OnValueChanged(self, value) |
self.frame.scrollframe:SetVerticalScroll(value) |
end |
local DropDownCache = {} |
function AGSMW:GetDropDownFrame() |
local frame |
if next(DropDownCache) then |
frame = table.remove(DropDownCache) |
else |
frame = CreateFrame("Frame", nil, UIParent) |
frame:SetClampedToScreen(true) |
frame:SetWidth(188) |
frame:SetBackdrop(frameBackdrop) |
frame:SetFrameStrata("TOOLTIP") |
frame:EnableMouseWheel(true) |
local contentframe = CreateFrame("Frame", nil, frame) |
contentframe:SetWidth(160) |
contentframe:SetHeight(0) |
frame.contentframe = contentframe |
local scrollframe = CreateFrame("ScrollFrame", nil, frame) |
scrollframe:SetPoint("TOPLEFT", frame, "TOPLEFT", 14, -13) |
scrollframe:SetPoint("BOTTOM", frame, "BOTTOM", 0, 12) |
scrollframe:SetWidth(160) |
scrollframe:SetScrollChild(contentframe) |
frame.scrollframe = scrollframe |
local bgTex = frame:CreateTexture(nil, "ARTWORK") |
bgTex:SetAllPoints(scrollframe) |
frame.bgTex = bgTex |
frame.AddFrame = AddFrame |
frame.ClearFrames = ClearFrames |
frame.contentRepo = {} -- store all our frames in here so we can get rid of them later |
local slider = CreateFrame("Slider", nil, scrollframe) |
slider:SetOrientation("VERTICAL") |
slider:SetPoint("TOPRIGHT", frame, "TOPRIGHT", -14, -10) |
slider:SetPoint("BOTTOMRIGHT", frame, "BOTTOMRIGHT", -14, 10) |
slider:SetBackdrop(sliderBackdrop) |
slider:SetThumbTexture([[Interface\Buttons\UI-SliderBar-Button-Vertical]]) |
slider:SetMinMaxValues(0, 1) |
--slider:SetValueStep(1) |
slider:SetWidth(12) |
slider.frame = frame |
slider:SetScript("OnValueChanged", slider_OnValueChanged) |
frame.slider = slider |
end |
frame:SetHeight(UIParent:GetHeight()*2/5) |
frame.slider:SetValue(0) |
frame:Show() |
return frame |
end |
function AGSMW:ReturnDropDownFrame(frame) |
ClearFrames(frame) |
frame:ClearAllPoints() |
frame:Hide() |
frame:SetBackdrop(frameBackdrop) |
frame.bgTex:SetTexture(nil) |
table.insert(DropDownCache, frame) |
return nil |
end |
end |
local AceGUI = LibStub("AceGUI-3.0") |
local Media = LibStub("LibSharedMedia-3.0") |
local AGSMW = LibStub("AceGUISharedMediaWidgets-1.0") |
do |
local min, max, floor = math.min, math.max, math.floor |
local fixlevels = AceGUISharedMediaWidgets.fixlevels |
local OnItemValueChanged = AceGUISharedMediaWidgets.OnItemValueChanged |
local widgetType = "LSM30_Font" |
local widgetVersion = 9 |
do |
local widgetType = "LSM30_Font_Item_Select" |
local widgetVersion = 1 |
local contentFrameCache = {} |
local function ReturnSelf(self) |
self:ClearAllPoints() |
self:Hide() |
self.check:Hide() |
table.insert(contentFrameCache, self) |
end |
local function SetText(self, text) |
if text and text ~= '' then |
local _, size, outline= self.text:GetFont() |
self.text:SetFont(Media:Fetch('font',text),size,outline) |
end |
self.text:SetText(text or "") |
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 Constructor() |
local self = AceGUI:Create("Dropdown-Item-Toggle") |
self.type = widgetType |
self.SetText = SetText |
return self |
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 text = frame:CreateFontString(nil,"OVERLAY","GameFontWhite") |
text:SetPoint("LEFT", check, "RIGHT", 1, 0) |
text:SetPoint("RIGHT", frame, "RIGHT", -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 |
AceGUI:RegisterWidgetType(widgetType, Constructor, widgetVersion) |
local function OnAcquire(self) |
self:SetHeight(44) |
self:SetWidth(200) |
end |
do |
local widgetType = "LSM30_Font" |
local widgetVersion = 3 |
local function OnRelease(self) |
self:SetText("") |
self:SetLabel("") |
self:SetDisabled(false) |
local function SetText(self, text) |
if text and text ~= '' then |
local _, size, outline= self.text:GetFont() |
self.text:SetFont(Media:Fetch('font',text),size,outline) |
end |
self.text:SetText(text or "") |
end |
self.value = nil |
self.list = nil |
self.open = nil |
self.hasClose = nil |
local function AddListItem(self, value, text) |
local item = AceGUI:Create("LSM30_Font_Item_Select") |
item:SetText(text) |
item.userdata.obj = self |
item.userdata.value = value |
item:SetCallback("OnValueChanged", OnItemValueChanged) |
self.pullout:AddItem(item) |
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 SetList(self, list) |
self.list = list or Media:HashTable("font") |
self.pullout:Clear() |
if self.multiselect then |
AddCloseButton() |
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("font") |
end |
local function SetText(self, text) -- Set the text displayed in the box. |
self.frame.text:SetText(text or "") |
local font = self.list[text] ~= text and self.list[text] or Media:Fetch('font',text) |
local _, size, outline= self.frame.text:GetFont() |
self.frame.text:SetFont(font,size,outline) |
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() |
else |
self.frame:Enable() |
end |
end |
local sortlist = {} |
local function ParseListItems(self) |
for v in pairs(self.list) do |
sortlist[#sortlist + 1] = v |
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() |
self.dropdown:SetPoint("TOPLEFT", self.frame, "BOTTOMLEFT") |
for k, v in pairs(self.list) do |
sortedlist[#sortedlist+1] = k |
end |
table.sort(sortlist) |
for i, value in pairs(sortlist) do |
AddListItem(self, value, value) |
sortlist[i] = nil |
table.sort(sortedlist, textSort) |
for i, k in ipairs(sortedlist) do |
local f = GetContentLine() |
local _, size, outline= f.text:GetFont() |
local font = self.list[k] ~= k and self.list[k] or Media:Fetch('font',k) |
f.text:SetFont(font,size,outline) |
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 Constructor() |
local self = AceGUI:Create("Dropdown") |
self.type = widgetType |
self.SetText = SetText |
self.SetValue = AceGUISharedMediaWidgets.SetValue |
self.SetList = SetList |
local function ClearFocus(self) |
if self.dropdown then |
self.dropdown = AGSMW:ReturnDropDownFrame(self.dropdown) |
end |
end |
local clickscript = self.button:GetScript("OnClick") |
self.button:SetScript("OnClick", function(...) |
self.pullout:Clear() |
ParseListItems(self) |
clickscript(...) |
end) |
return self |
local function OnHide(this) |
local self = this.obj |
if self.dropdown then |
self.dropdown = AGSMW:ReturnDropDownFrame(self.dropdown) |
end |
end |
AceGUI:RegisterWidgetType(widgetType, Constructor, widgetVersion) |
local function Drop_OnEnter(this) |
this.obj:Fire("OnEnter") |
end |
local function Drop_OnLeave(this) |
this.obj:Fire("OnLeave") |
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) |
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 |