diff --git a/Libs/AceGUI-3.0-SharedMediaWidgets/BackgroundWidget.lua b/Libs/AceGUI-3.0-SharedMediaWidgets/BackgroundWidget.lua new file mode 100644 index 0000000..0b75952 --- /dev/null +++ b/Libs/AceGUI-3.0-SharedMediaWidgets/BackgroundWidget.lua @@ -0,0 +1,235 @@ +-- 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_Background" + 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 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 + + 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 font, size = text:GetFont() + text:SetFont(font,size,"OUTLINE") + + text:SetPoint("TOPLEFT", check, "TOPRIGHT", 1, 0) + text:SetPoint("BOTTOMRIGHT", frame, "BOTTOMRIGHT", -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("background") + 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) + + 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 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.frame.displayButton:SetBackdropColor(.2,.2,.2,1) + else + self.frame:Enable() + self.frame.displayButton:SetBackdropColor(1,1,1,1) + 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) + --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 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 Constructor() + local frame = AGSMW:GetBaseFrameWithWindow() + 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 diff --git a/Libs/AceGUI-3.0-SharedMediaWidgets/BorderWidget.lua b/Libs/AceGUI-3.0-SharedMediaWidgets/BorderWidget.lua new file mode 100644 index 0000000..0cd2959 --- /dev/null +++ b/Libs/AceGUI-3.0-SharedMediaWidgets/BorderWidget.lua @@ -0,0 +1,230 @@ +-- 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_Border" + 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 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 + + 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("TOPLEFT", check, "TOPRIGHT", 1, 0) + text:SetPoint("BOTTOMRIGHT", frame, "BOTTOMRIGHT", -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("border") + 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) + + 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 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) + --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 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 Constructor() + local frame = AGSMW:GetBaseFrameWithWindow() + 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 diff --git a/Libs/AceGUI-3.0-SharedMediaWidgets/FontWidget.lua b/Libs/AceGUI-3.0-SharedMediaWidgets/FontWidget.lua new file mode 100644 index 0000000..eadf35f --- /dev/null +++ b/Libs/AceGUI-3.0-SharedMediaWidgets/FontWidget.lua @@ -0,0 +1,216 @@ +-- 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_Font" + 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 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("TOPLEFT", check, "TOPRIGHT", 1, 0) + text:SetPoint("BOTTOMRIGHT", frame, "BOTTOMRIGHT", -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("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 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() + 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 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 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 diff --git a/Libs/AceGUI-3.0-SharedMediaWidgets/SoundWidget.lua b/Libs/AceGUI-3.0-SharedMediaWidgets/SoundWidget.lua new file mode 100644 index 0000000..1d39c28 --- /dev/null +++ b/Libs/AceGUI-3.0-SharedMediaWidgets/SoundWidget.lua @@ -0,0 +1,264 @@ +-- 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 diff --git a/Libs/AceGUI-3.0-SharedMediaWidgets/StatusbarWidget.lua b/Libs/AceGUI-3.0-SharedMediaWidgets/StatusbarWidget.lua new file mode 100644 index 0000000..2d0e32c --- /dev/null +++ b/Libs/AceGUI-3.0-SharedMediaWidgets/StatusbarWidget.lua @@ -0,0 +1,233 @@ +-- 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_Statusbar" + 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 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("TOPLEFT", check, "TOPRIGHT", 3, 0) + text:SetPoint("BOTTOMRIGHT", frame, "BOTTOMRIGHT", -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("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 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) + --print(k) + if k == self.value then + f.check:Show() + end + + 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 + 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 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, "OVERLAY") + bar:SetPoint("TOPLEFT", frame,"TOPLEFT",6,-25) + bar:SetPoint("BOTTOMRIGHT", frame,"BOTTOMRIGHT", -21, 5) + bar:SetAlpha(0.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 diff --git a/Libs/AceGUI-3.0-SharedMediaWidgets/prototypes.lua b/Libs/AceGUI-3.0-SharedMediaWidgets/prototypes.lua new file mode 100644 index 0000000..14ccd59 --- /dev/null +++ b/Libs/AceGUI-3.0-SharedMediaWidgets/prototypes.lua @@ -0,0 +1,275 @@ +-- Widget created by Yssaril +--[===[@debug@ +local DataVersion = 9001 -- dev version always overwrites everything else :) +--@end-debug@]===] +--@non-debug@ +local DataVersion = 51 +--@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) + frame:SetFrameStrata(self:GetFrameStrata()) + frame:SetFrameLevel(self:GetFrameLevel() + 100) + + 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:SetPoint("BOTTOMRIGHT", self, "BOTTOMRIGHT", -28, 12) + 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:SetPoint("BOTTOMRIGHT", self, "BOTTOMRIGHT", -14, 12) + 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:SetWidth(160) + scrollframe:SetPoint("TOPLEFT", frame, "TOPLEFT", 14, -13) + scrollframe:SetPoint("BOTTOMRIGHT", frame, "BOTTOMRIGHT", -14, 12) + scrollframe:SetScrollChild(contentframe) + frame.scrollframe = scrollframe + + contentframe:SetPoint("TOPLEFT", scrollframe) + contentframe:SetPoint("TOPRIGHT", 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 diff --git a/Libs/AceGUI-3.0-SharedMediaWidgets/widget.xml b/Libs/AceGUI-3.0-SharedMediaWidgets/widget.xml new file mode 100644 index 0000000..15cd102 --- /dev/null +++ b/Libs/AceGUI-3.0-SharedMediaWidgets/widget.xml @@ -0,0 +1,9 @@ +<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="prototypes.lua" /> + <Script file="FontWidget.lua" /> + <Script file="SoundWidget.lua" /> + <Script file="StatusbarWidget.lua" /> + <Script file="BorderWidget.lua" /> + <Script file="BackgroundWidget.lua" /> +</Ui> \ No newline at end of file diff --git a/Libs/CallbackHandler-1.0/CallbackHandler-1.0.lua b/Libs/CallbackHandler-1.0/CallbackHandler-1.0.lua new file mode 100644 index 0000000..675d7b0 --- /dev/null +++ b/Libs/CallbackHandler-1.0/CallbackHandler-1.0.lua @@ -0,0 +1,238 @@ +--[[ $Id: CallbackHandler-1.0.lua 1131 2015-06-04 07:29:24Z nevcairiel $ ]] +local MAJOR, MINOR = "CallbackHandler-1.0", 6 +local CallbackHandler = LibStub:NewLibrary(MAJOR, MINOR) + +if not CallbackHandler then return end -- No upgrade needed + +local meta = {__index = function(tbl, key) tbl[key] = {} return tbl[key] end} + +-- Lua APIs +local tconcat = table.concat +local assert, error, loadstring = assert, error, loadstring +local setmetatable, rawset, rawget = setmetatable, rawset, rawget +local next, select, pairs, type, tostring = next, select, pairs, type, tostring + +-- Global vars/functions that we don't upvalue since they might get hooked, or upgraded +-- List them here for Mikk's FindGlobals script +-- GLOBALS: geterrorhandler + +local xpcall = xpcall + +local function errorhandler(err) + return geterrorhandler()(err) +end + +local function CreateDispatcher(argCount) + local code = [[ + local next, xpcall, eh = ... + + local method, ARGS + local function call() method(ARGS) end + + local function dispatch(handlers, ...) + local index + index, method = next(handlers) + if not method then return end + local OLD_ARGS = ARGS + ARGS = ... + repeat + xpcall(call, eh) + index, method = next(handlers, index) + until not method + ARGS = OLD_ARGS + end + + return dispatch + ]] + + local ARGS, OLD_ARGS = {}, {} + for i = 1, argCount do ARGS[i], OLD_ARGS[i] = "arg"..i, "old_arg"..i end + code = code:gsub("OLD_ARGS", tconcat(OLD_ARGS, ", ")):gsub("ARGS", tconcat(ARGS, ", ")) + return assert(loadstring(code, "safecall Dispatcher["..argCount.."]"))(next, xpcall, errorhandler) +end + +local Dispatchers = setmetatable({}, {__index=function(self, argCount) + local dispatcher = CreateDispatcher(argCount) + rawset(self, argCount, dispatcher) + return dispatcher +end}) + +-------------------------------------------------------------------------- +-- CallbackHandler:New +-- +-- target - target object to embed public APIs in +-- RegisterName - name of the callback registration API, default "RegisterCallback" +-- UnregisterName - name of the callback unregistration API, default "UnregisterCallback" +-- UnregisterAllName - name of the API to unregister all callbacks, default "UnregisterAllCallbacks". false == don't publish this API. + +function CallbackHandler:New(target, RegisterName, UnregisterName, UnregisterAllName) + + RegisterName = RegisterName or "RegisterCallback" + UnregisterName = UnregisterName or "UnregisterCallback" + if UnregisterAllName==nil then -- false is used to indicate "don't want this method" + UnregisterAllName = "UnregisterAllCallbacks" + end + + -- we declare all objects and exported APIs inside this closure to quickly gain access + -- to e.g. function names, the "target" parameter, etc + + + -- Create the registry object + local events = setmetatable({}, meta) + local registry = { recurse=0, events=events } + + -- registry:Fire() - fires the given event/message into the registry + function registry:Fire(eventname, ...) + if not rawget(events, eventname) or not next(events[eventname]) then return end + local oldrecurse = registry.recurse + registry.recurse = oldrecurse + 1 + + Dispatchers[select('#', ...) + 1](events[eventname], eventname, ...) + + registry.recurse = oldrecurse + + if registry.insertQueue and oldrecurse==0 then + -- Something in one of our callbacks wanted to register more callbacks; they got queued + for eventname,callbacks in pairs(registry.insertQueue) do + local first = not rawget(events, eventname) or not next(events[eventname]) -- test for empty before. not test for one member after. that one member may have been overwritten. + for self,func in pairs(callbacks) do + events[eventname][self] = func + -- fire OnUsed callback? + if first and registry.OnUsed then + registry.OnUsed(registry, target, eventname) + first = nil + end + end + end + registry.insertQueue = nil + end + end + + -- Registration of a callback, handles: + -- self["method"], leads to self["method"](self, ...) + -- self with function ref, leads to functionref(...) + -- "addonId" (instead of self) with function ref, leads to functionref(...) + -- all with an optional arg, which, if present, gets passed as first argument (after self if present) + target[RegisterName] = function(self, eventname, method, ... --[[actually just a single arg]]) + if type(eventname) ~= "string" then + error("Usage: "..RegisterName.."(eventname, method[, arg]): 'eventname' - string expected.", 2) + end + + method = method or eventname + + local first = not rawget(events, eventname) or not next(events[eventname]) -- test for empty before. not test for one member after. that one member may have been overwritten. + + if type(method) ~= "string" and type(method) ~= "function" then + error("Usage: "..RegisterName.."(\"eventname\", \"methodname\"): 'methodname' - string or function expected.", 2) + end + + local regfunc + + if type(method) == "string" then + -- self["method"] calling style + if type(self) ~= "table" then + error("Usage: "..RegisterName.."(\"eventname\", \"methodname\"): self was not a table?", 2) + elseif self==target then + error("Usage: "..RegisterName.."(\"eventname\", \"methodname\"): do not use Library:"..RegisterName.."(), use your own 'self'", 2) + elseif type(self[method]) ~= "function" then + error("Usage: "..RegisterName.."(\"eventname\", \"methodname\"): 'methodname' - method '"..tostring(method).."' not found on self.", 2) + end + + if select("#",...)>=1 then -- this is not the same as testing for arg==nil! + local arg=select(1,...) + regfunc = function(...) self[method](self,arg,...) end + else + regfunc = function(...) self[method](self,...) end + end + else + -- function ref with self=object or self="addonId" or self=thread + if type(self)~="table" and type(self)~="string" and type(self)~="thread" then + error("Usage: "..RegisterName.."(self or \"addonId\", eventname, method): 'self or addonId': table or string or thread expected.", 2) + end + + if select("#",...)>=1 then -- this is not the same as testing for arg==nil! + local arg=select(1,...) + regfunc = function(...) method(arg,...) end + else + regfunc = method + end + end + + + if events[eventname][self] or registry.recurse<1 then + -- if registry.recurse<1 then + -- we're overwriting an existing entry, or not currently recursing. just set it. + events[eventname][self] = regfunc + -- fire OnUsed callback? + if registry.OnUsed and first then + registry.OnUsed(registry, target, eventname) + end + else + -- we're currently processing a callback in this registry, so delay the registration of this new entry! + -- yes, we're a bit wasteful on garbage, but this is a fringe case, so we're picking low implementation overhead over garbage efficiency + registry.insertQueue = registry.insertQueue or setmetatable({},meta) + registry.insertQueue[eventname][self] = regfunc + end + end + + -- Unregister a callback + target[UnregisterName] = function(self, eventname) + if not self or self==target then + error("Usage: "..UnregisterName.."(eventname): bad 'self'", 2) + end + if type(eventname) ~= "string" then + error("Usage: "..UnregisterName.."(eventname): 'eventname' - string expected.", 2) + end + if rawget(events, eventname) and events[eventname][self] then + events[eventname][self] = nil + -- Fire OnUnused callback? + if registry.OnUnused and not next(events[eventname]) then + registry.OnUnused(registry, target, eventname) + end + end + if registry.insertQueue and rawget(registry.insertQueue, eventname) and registry.insertQueue[eventname][self] then + registry.insertQueue[eventname][self] = nil + end + end + + -- OPTIONAL: Unregister all callbacks for given selfs/addonIds + if UnregisterAllName then + target[UnregisterAllName] = function(...) + if select("#",...)<1 then + error("Usage: "..UnregisterAllName.."([whatFor]): missing 'self' or \"addonId\" to unregister events for.", 2) + end + if select("#",...)==1 and ...==target then + error("Usage: "..UnregisterAllName.."([whatFor]): supply a meaningful 'self' or \"addonId\"", 2) + end + + + for i=1,select("#",...) do + local self = select(i,...) + if registry.insertQueue then + for eventname, callbacks in pairs(registry.insertQueue) do + if callbacks[self] then + callbacks[self] = nil + end + end + end + for eventname, callbacks in pairs(events) do + if callbacks[self] then + callbacks[self] = nil + -- Fire OnUnused callback? + if registry.OnUnused and not next(callbacks) then + registry.OnUnused(registry, target, eventname) + end + end + end + end + end + end + + return registry +end + + +-- CallbackHandler purposefully does NOT do explicit embedding. Nor does it +-- try to upgrade old implicit embeds since the system is selfcontained and +-- relies on closures to work. + diff --git a/Libs/CallbackHandler-1.0/CallbackHandler-1.0.xml b/Libs/CallbackHandler-1.0/CallbackHandler-1.0.xml new file mode 100644 index 0000000..876df83 --- /dev/null +++ b/Libs/CallbackHandler-1.0/CallbackHandler-1.0.xml @@ -0,0 +1,4 @@ +<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="CallbackHandler-1.0.lua"/> +</Ui> \ No newline at end of file diff --git a/Libs/LibSharedMedia-3.0/LibSharedMedia-3.0.lua b/Libs/LibSharedMedia-3.0/LibSharedMedia-3.0.lua new file mode 100644 index 0000000..ce5ff14 --- /dev/null +++ b/Libs/LibSharedMedia-3.0/LibSharedMedia-3.0.lua @@ -0,0 +1,292 @@ +--[[ +Name: LibSharedMedia-3.0 +Revision: $Revision: 91 $ +Author: Elkano (elkano@gmx.de) +Inspired By: SurfaceLib by Haste/Otravi (troeks@gmail.com) +Website: http://www.wowace.com/projects/libsharedmedia-3-0/ +Description: Shared handling of media data (fonts, sounds, textures, ...) between addons. +Dependencies: LibStub, CallbackHandler-1.0 +License: LGPL v2.1 +]] + +local MAJOR, MINOR = "LibSharedMedia-3.0", 6010002 -- 6.1.0 v2 / increase manually on changes +local lib = LibStub:NewLibrary(MAJOR, MINOR) + +if not lib then return end + +local _G = getfenv(0) + +local pairs = _G.pairs +local type = _G.type + +local band = _G.bit.band + +local table_insert = _G.table.insert +local table_sort = _G.table.sort + +local locale = GetLocale() +local locale_is_western +local LOCALE_MASK = 0 +lib.LOCALE_BIT_koKR = 1 +lib.LOCALE_BIT_ruRU = 2 +lib.LOCALE_BIT_zhCN = 4 +lib.LOCALE_BIT_zhTW = 8 +lib.LOCALE_BIT_western = 128 + +local CallbackHandler = LibStub:GetLibrary("CallbackHandler-1.0") + +lib.callbacks = lib.callbacks or CallbackHandler:New(lib) + +lib.DefaultMedia = lib.DefaultMedia or {} +lib.MediaList = lib.MediaList or {} +lib.MediaTable = lib.MediaTable or {} +lib.MediaType = lib.MediaType or {} +lib.OverrideMedia = lib.OverrideMedia or {} + +local defaultMedia = lib.DefaultMedia +local mediaList = lib.MediaList +local mediaTable = lib.MediaTable +local overrideMedia = lib.OverrideMedia + + +-- create mediatype constants +lib.MediaType.BACKGROUND = "background" -- background textures +lib.MediaType.BORDER = "border" -- border textures +lib.MediaType.FONT = "font" -- fonts +lib.MediaType.STATUSBAR = "statusbar" -- statusbar textures +lib.MediaType.SOUND = "sound" -- sound files + +-- populate lib with default Blizzard data +-- BACKGROUND +if not lib.MediaTable.background then lib.MediaTable.background = {} end +lib.MediaTable.background["None"] = [[]] +lib.MediaTable.background["Blizzard Collections Background"] = [[Interface\Collections\CollectionsBackgroundTile]] +lib.MediaTable.background["Blizzard Dialog Background"] = [[Interface\DialogFrame\UI-DialogBox-Background]] +lib.MediaTable.background["Blizzard Dialog Background Dark"] = [[Interface\DialogFrame\UI-DialogBox-Background-Dark]] +lib.MediaTable.background["Blizzard Dialog Background Gold"] = [[Interface\DialogFrame\UI-DialogBox-Gold-Background]] +lib.MediaTable.background["Blizzard Garrison Background"] = [[Interface\Garrison\GarrisonUIBackground]] +lib.MediaTable.background["Blizzard Garrison Background 2"] = [[Interface\Garrison\GarrisonUIBackground2]] +lib.MediaTable.background["Blizzard Garrison Background 3"] = [[Interface\Garrison\GarrisonMissionUIInfoBoxBackgroundTile]] +lib.MediaTable.background["Blizzard Low Health"] = [[Interface\FullScreenTextures\LowHealth]] +lib.MediaTable.background["Blizzard Marble"] = [[Interface\FrameGeneral\UI-Background-Marble]] +lib.MediaTable.background["Blizzard Out of Control"] = [[Interface\FullScreenTextures\OutOfControl]] +lib.MediaTable.background["Blizzard Parchment"] = [[Interface\AchievementFrame\UI-Achievement-Parchment-Horizontal]] +lib.MediaTable.background["Blizzard Parchment 2"] = [[Interface\AchievementFrame\UI-GuildAchievement-Parchment-Horizontal]] +lib.MediaTable.background["Blizzard Rock"] = [[Interface\FrameGeneral\UI-Background-Rock]] +lib.MediaTable.background["Blizzard Tabard Background"] = [[Interface\TabardFrame\TabardFrameBackground]] +lib.MediaTable.background["Blizzard Tooltip"] = [[Interface\Tooltips\UI-Tooltip-Background]] +lib.MediaTable.background["Solid"] = [[Interface\Buttons\WHITE8X8]] +lib.DefaultMedia.background = "None" + +-- BORDER +if not lib.MediaTable.border then lib.MediaTable.border = {} end +lib.MediaTable.border["None"] = [[]] +lib.MediaTable.border["Blizzard Achievement Wood"] = [[Interface\AchievementFrame\UI-Achievement-WoodBorder]] +lib.MediaTable.border["Blizzard Chat Bubble"] = [[Interface\Tooltips\ChatBubble-Backdrop]] +lib.MediaTable.border["Blizzard Dialog"] = [[Interface\DialogFrame\UI-DialogBox-Border]] +lib.MediaTable.border["Blizzard Dialog Gold"] = [[Interface\DialogFrame\UI-DialogBox-Gold-Border]] +lib.MediaTable.border["Blizzard Party"] = [[Interface\CHARACTERFRAME\UI-Party-Border]] +lib.MediaTable.border["Blizzard Tooltip"] = [[Interface\Tooltips\UI-Tooltip-Border]] +lib.DefaultMedia.border = "None" + +-- FONT +if not lib.MediaTable.font then lib.MediaTable.font = {} end +local SML_MT_font = lib.MediaTable.font +--[[ +All font files are currently in all clients, the following table depicts which font supports which charset as of 5.0.4 +Fonts were checked using langcover.pl from DejaVu fonts (http://sourceforge.net/projects/dejavu/) and FontForge (http://fontforge.org/) +latin means check for: de, en, es, fr, it, pt + +file name latin koKR ruRU zhCN zhTW +2002.ttf 2002 X X X - - +2002B.ttf 2002 Bold X X X - - +ARHei.ttf AR CrystalzcuheiGBK Demibold X - X X X +ARIALN.TTF Arial Narrow X - X - - +ARKai_C.ttf AR ZhongkaiGBK Medium (Combat) X - X X X +ARKai_T.ttf AR ZhongkaiGBK Medium X - X X X +bHEI00M.ttf AR Heiti2 Medium B5 - - - - X +bHEI01B.ttf AR Heiti2 Bold B5 - - - - X +bKAI00M.ttf AR Kaiti Medium B5 - - - - X +bLEI00D.ttf AR Leisu Demi B5 - - - - X +FRIZQT__.TTF Friz Quadrata TT X - - - - +FRIZQT___CYR.TTF FrizQuadrataCTT x - X - - +K_Damage.TTF YDIWingsM - X X - - +K_Pagetext.TTF MoK X X X - - +MORPHEUS.TTF Morpheus X - - - - +MORPHEUS_CYR.TTF Morpheus X - X - - +NIM_____.ttf Nimrod MT X - X - - +SKURRI.TTF Skurri X - - - - +SKURRI_CYR.TTF Skurri X - X - - + +WARNING: Although FRIZQT___CYR is available on western clients, it doesn't support special European characters e.g. é, ï, ö +Due to this, we cannot use it as a replacement for FRIZQT__.TTF +]] + +if locale == "koKR" then + LOCALE_MASK = lib.LOCALE_BIT_koKR +-- + SML_MT_font["굵은 글꼴"] = [[Fonts\2002B.TTF]] + SML_MT_font["기본 글꼴"] = [[Fonts\2002.TTF]] + SML_MT_font["데미지 글꼴"] = [[Fonts\K_Damage.TTF]] + SML_MT_font["퀘스트 글꼴"] = [[Fonts\K_Pagetext.TTF]] +-- + lib.DefaultMedia["font"] = "기본 글꼴" -- someone from koKR please adjust if needed +-- +elseif locale == "zhCN" then + LOCALE_MASK = lib.LOCALE_BIT_zhCN +-- + SML_MT_font["伤害数字"] = [[Fonts\ARKai_C.ttf]] + SML_MT_font["默认"] = [[Fonts\ARKai_T.ttf]] + SML_MT_font["聊天"] = [[Fonts\ARHei.ttf]] +-- + lib.DefaultMedia["font"] = "默认" -- someone from zhCN please adjust if needed +-- +elseif locale == "zhTW" then + LOCALE_MASK = lib.LOCALE_BIT_zhTW +-- + SML_MT_font["提示訊息"] = [[Fonts\bHEI00M.ttf]] + SML_MT_font["聊天"] = [[Fonts\bHEI01B.ttf]] + SML_MT_font["傷害數字"] = [[Fonts\bKAI00M.ttf]] + SML_MT_font["預設"] = [[Fonts\bLEI00D.ttf]] +-- + lib.DefaultMedia["font"] = "預設" -- someone from zhTW please adjust if needed + +elseif locale == "ruRU" then + LOCALE_MASK = lib.LOCALE_BIT_ruRU +-- + SML_MT_font["2002"] = [[Fonts\2002.TTF]] + SML_MT_font["2002 Bold"] = [[Fonts\2002B.TTF]] + SML_MT_font["AR CrystalzcuheiGBK Demibold"] = [[Fonts\ARHei.TTF]] + SML_MT_font["AR ZhongkaiGBK Medium (Combat)"] = [[Fonts\ARKai_C.TTF]] + SML_MT_font["AR ZhongkaiGBK Medium"] = [[Fonts\ARKai_T.TTF]] + SML_MT_font["Arial Narrow"] = [[Fonts\ARIALN.TTF]] + SML_MT_font["Friz Quadrata TT"] = [[Fonts\FRIZQT___CYR.TTF]] + SML_MT_font["MoK"] = [[Fonts\K_Pagetext.TTF]] + SML_MT_font["Morpheus"] = [[Fonts\MORPHEUS_CYR.TTF]] + SML_MT_font["Nimrod MT"] = [[Fonts\NIM_____.ttf]] + SML_MT_font["Skurri"] = [[Fonts\SKURRI_CYR.TTF]] +-- + lib.DefaultMedia.font = "Friz Quadrata TT" +-- +else + LOCALE_MASK = lib.LOCALE_BIT_western + locale_is_western = true +-- + SML_MT_font["2002"] = [[Fonts\2002.TTF]] + SML_MT_font["2002 Bold"] = [[Fonts\2002B.TTF]] + SML_MT_font["AR CrystalzcuheiGBK Demibold"] = [[Fonts\ARHei.TTF]] + SML_MT_font["AR ZhongkaiGBK Medium (Combat)"] = [[Fonts\ARKai_C.TTF]] + SML_MT_font["AR ZhongkaiGBK Medium"] = [[Fonts\ARKai_T.TTF]] + SML_MT_font["Arial Narrow"] = [[Fonts\ARIALN.TTF]] + SML_MT_font["Friz Quadrata TT"] = [[Fonts\FRIZQT__.TTF]] + SML_MT_font["MoK"] = [[Fonts\K_Pagetext.TTF]] + SML_MT_font["Morpheus"] = [[Fonts\MORPHEUS_CYR.TTF]] + SML_MT_font["Nimrod MT"] = [[Fonts\NIM_____.ttf]] + SML_MT_font["Skurri"] = [[Fonts\SKURRI_CYR.TTF]] +-- + lib.DefaultMedia.font = "Friz Quadrata TT" +-- +end + +-- STATUSBAR +if not lib.MediaTable.statusbar then lib.MediaTable.statusbar = {} end +lib.MediaTable.statusbar["Blizzard"] = [[Interface\TargetingFrame\UI-StatusBar]] +lib.MediaTable.statusbar["Blizzard Character Skills Bar"] = [[Interface\PaperDollInfoFrame\UI-Character-Skills-Bar]] +lib.MediaTable.statusbar["Blizzard Raid Bar"] = [[Interface\RaidFrame\Raid-Bar-Hp-Fill]] +lib.DefaultMedia.statusbar = "Blizzard" + +-- SOUND +if not lib.MediaTable.sound then lib.MediaTable.sound = {} end +lib.MediaTable.sound["None"] = [[Interface\Quiet.ogg]] -- Relies on the fact that PlaySound[File] doesn't error on non-existing input. +lib.DefaultMedia.sound = "None" + +local function rebuildMediaList(mediatype) + local mtable = mediaTable[mediatype] + if not mtable then return end + if not mediaList[mediatype] then mediaList[mediatype] = {} end + local mlist = mediaList[mediatype] + -- list can only get larger, so simply overwrite it + local i = 0 + for k in pairs(mtable) do + i = i + 1 + mlist[i] = k + end + table_sort(mlist) +end + +function lib:Register(mediatype, key, data, langmask) + if type(mediatype) ~= "string" then + error(MAJOR..":Register(mediatype, key, data, langmask) - mediatype must be string, got "..type(mediatype)) + end + if type(key) ~= "string" then + error(MAJOR..":Register(mediatype, key, data, langmask) - key must be string, got "..type(key)) + end + mediatype = mediatype:lower() + if mediatype == lib.MediaType.FONT and ((langmask and band(langmask, LOCALE_MASK) == 0) or not (langmask or locale_is_western)) then return false end + if mediatype == lib.MediaType.SOUND and type(data) == "string" then + local path = data:lower() + -- Only ogg and mp3 are valid sounds. + if not path:find(".ogg", nil, true) and not path:find(".mp3", nil, true) then + return false + end + end + if not mediaTable[mediatype] then mediaTable[mediatype] = {} end + local mtable = mediaTable[mediatype] + if mtable[key] then return false end + + mtable[key] = data + rebuildMediaList(mediatype) + self.callbacks:Fire("LibSharedMedia_Registered", mediatype, key) + return true +end + +function lib:Fetch(mediatype, key, noDefault) + local mtt = mediaTable[mediatype] + local overridekey = overrideMedia[mediatype] + local result = mtt and ((overridekey and mtt[overridekey] or mtt[key]) or (not noDefault and defaultMedia[mediatype] and mtt[defaultMedia[mediatype]])) or nil + return result ~= "" and result or nil +end + +function lib:IsValid(mediatype, key) + return mediaTable[mediatype] and (not key or mediaTable[mediatype][key]) and true or false +end + +function lib:HashTable(mediatype) + return mediaTable[mediatype] +end + +function lib:List(mediatype) + if not mediaTable[mediatype] then + return nil + end + if not mediaList[mediatype] then + rebuildMediaList(mediatype) + end + return mediaList[mediatype] +end + +function lib:GetGlobal(mediatype) + return overrideMedia[mediatype] +end + +function lib:SetGlobal(mediatype, key) + if not mediaTable[mediatype] then + return false + end + overrideMedia[mediatype] = (key and mediaTable[mediatype][key]) and key or nil + self.callbacks:Fire("LibSharedMedia_SetGlobal", mediatype, overrideMedia[mediatype]) + return true +end + +function lib:GetDefault(mediatype) + return defaultMedia[mediatype] +end + +function lib:SetDefault(mediatype, key) + if mediaTable[mediatype] and mediaTable[mediatype][key] and not defaultMedia[mediatype] then + defaultMedia[mediatype] = key + return true + else + return false + end +end diff --git a/Libs/LibSharedMedia-3.0/lib.xml b/Libs/LibSharedMedia-3.0/lib.xml new file mode 100644 index 0000000..34aa874 --- /dev/null +++ b/Libs/LibSharedMedia-3.0/lib.xml @@ -0,0 +1,4 @@ +<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="LibSharedMedia-3.0.lua" /> +</Ui> \ No newline at end of file diff --git a/TDDps.toc b/TDDps.toc index f59568b..5ba0b02 100644 --- a/TDDps.toc +++ b/TDDps.toc @@ -1,16 +1,21 @@ ## Title: TDDps ## Notes: Rotation helper framework. -## Version: 1.9 +## Version: 1.10 ## Author: Kaminaris ## Interface: 60200 ## SavedVariables: TDDps_Options ## OptionalDependencies: Bartender4, ElvUI, ButtonForge Libs\LibStub\LibStub.lua +Libs\CallbackHandler-1.0\CallbackHandler-1.0.xml +Libs\CallbackHandler-1.0\CallbackHandler-1.0.lua Libs\AceGUI-3.0\AceGUI-3.0.xml Libs\AceGUI-3.0\AceGUI-3.0.lua +Libs\AceGUI-3.0-SharedMediaWidgets\widget.xml +Libs\LibSharedMedia-3.0\lib.xml Libs\AceConfig-3.0\AceConfig-3.0.xml Libs\AceConfig-3.0\AceConfig-3.0.lua + TDSettings.lua TDButtons.lua TDHelper.lua