/
SC.OTHER['AS']['obj']:SetAlpha(value/100) |
end |
function SliceCommander:TestBF() |
if SC.SET.display.BFICON then |
local name = SliceCommander:UnitAura("player", SC_SPELLID['BF'], "HELPFUL PLAYER") |
if name and not SC.OTHER['BF']['obj']:IsVisible() then |
SC.OTHER['BF']['obj']:Show() |
elseif not name and SC.OTHER['BF']['obj']:IsVisible() then |
if SC.SET.IsLocked == true then |
SC.OTHER['BF']['obj']:Hide() |
end |
end |
else |
if SC.SET.IsLocked == true then |
SC.OTHER['BF']['obj']:Hide() |
end |
end |
end |
function SliceCommander:TestBB() |
if SC.SET.display.BB then |
local id = GetSpellTexture(SC_SPELL['PS']) |
if id and id == 135616 then |
if not SC.OTHER['BB']['obj']:IsVisible() then |
SC.OTHER['BB']['obj']:Show() |
end |
elseif SC.OTHER['BB']['obj']:IsVisible() then |
if SC.SET.IsLocked == true then |
SC.OTHER['BB']['obj']:Hide() |
end |
end |
else |
if SC.SET.IsLocked == true then |
SC.OTHER['BB']['obj']:Hide() |
end |
end |
end |
function SliceCommander:TestDP() |
local combat = UnitAffectingCombat("player") |
if SC.SET.display.DPICON then --and GetSpecialization() == 1 |
end |
end |
function SliceCommander:TestSOTD() |
if SC.SET.display.SOTD then |
local name, _, _, count = SliceCommander:UnitAura("player", SC_SPELLID['SOTD'], "HELPFUL PLAYER") |
if name and count >= 29 then |
if not SC.OTHER['SOTD']['obj']:IsVisible() then |
SC.OTHER['SOTD']['obj']:Show() |
end |
SC.OTHER['SOTD']['obj'].iconTxt:SetText(count) |
elseif SC.OTHER['SOTD']['obj']:IsVisible() then |
if SC.SET.IsLocked == true then |
SC.OTHER['SOTD']['obj']:Hide() |
end |
SC.OTHER['SOTD']['obj'].iconTxt:SetText('') |
end |
else |
if SC.SET.IsLocked == true then |
SC.OTHER['SOTD']['obj']:Hide() |
end |
SC.OTHER['SOTD']['obj'].iconTxt:SetText('') |
end |
end |
function SliceCommander:UnitAura(target, spell, filter) |
local i, name, icon, count, debuffType, duration, expirationTime, unitCaster, canStealOrPurge, nameplateShowPersonal, spellId, canApplyAura, isBossDebuff, isCastByPlayer, nameplateShowAll, timeMod |
i = 1 |
Shortcut_BE = SliceCommander:getShortcutSetting("SliceCommander_Outlaw", "Skills", "BE"), |
Shortcut_GHCD = SliceCommander:getShortcutSetting("SliceCommander_Outlaw", "Skills", "GHCD"), |
Shortcut_OP = SliceCommander:getShortcutSetting("SliceCommander_Outlaw", "Skills", "OP"), |
Shortcut_GG = SliceCommander:getShortcutSetting("SliceCommander_Outlaw", "Skills", "GG"), |
RB = { |
name = SC_SPELL['RB'], |
type = "group", |
} |
) |
}, |
BF = { |
order = SliceCommander:getOrder(), |
name = SC_SPELL['BF'], |
type = "group", |
args = { |
header = { |
type = "header", |
order = SliceCommander:getOrder(), |
name = L['Spell'], |
}, |
BFShow = SliceCommander:getShowSetting('BF'), |
BFColor = SliceCommander:getColorSetting('BF'), |
BFPos = SliceCommander:getPosSetting('BF'), |
Flash = SliceCommander:getFlashSetting('BF'), |
BFIcon = { |
order = SliceCommander:getOrder(), |
name = string.format(L["Show %s icon"], SC_SPELL['BF']), |
desc = string.format(L["Display the %s icon when enbale"], SC_SPELL['BF']), |
type = "toggle", |
set = function(info,val) |
SC.SET.display.BFICON = val |
end, |
get = function(info) return SC.SET.display.BFICON end |
}, |
headerCD = { |
type = "header", |
order = SliceCommander:getOrder(), |
name = L['Cooldown'], |
}, |
BFCDShow = SliceCommander:getShowSetting('BFCD'), |
BFCDColor = SliceCommander:getColorSetting('BFCD'), |
BFCDPos = SliceCommander:getPosSetting('BFCD'), |
FlashCD = SliceCommander:getFlashSetting('BFCD') |
} |
}, |
BF = SliceCommander:getSpellCDSettings('BF'), |
AR = { |
order = SliceCommander:getOrder(), |
name = SC_SPELL['AR'], |
childGroups = "tree", |
args = { |
Shortcut = SliceCommander:getShortcutHeader(), |
Shortcut_FOTD = SliceCommander:getShortcutSetting("SliceCommander_Complementary", "General", "FOTD"), |
Shortcut_MAI = SliceCommander:getShortcutSetting("SliceCommander_Complementary", "General", "MAI"), |
FOTD = { |
order = SliceCommander:getOrder(), |
name = SC_SPELL['FOTD'], |
type = "group", |
args = { |
header = { |
type = "header", |
order = SliceCommander:getOrder(), |
name = L['Spell'], |
}, |
Show = SliceCommander:getShowSetting('FOTD'), |
Pos = SliceCommander:getPosSetting('FOTD'), |
Color = SliceCommander:getColorSetting('FOTD'), |
Flash = SliceCommander:getFlashSetting('FOTD'), |
Icon = {--Shadow of the destroyer icon |
order = SliceCommander:getOrder(), |
name = string.format(L["%s icon"], SC_SPELL['SOTD']), |
desc = string.format(L["%s icon. It's only display when stack reach 30. There is a counter on it."], SC_SPELL['SOTD']), |
type = "toggle", |
set = function(info,val) |
SC.SET.display.SOTD = val |
end, |
get = function(info) |
return SC.SET.display.SOTD |
end |
}, |
} |
}, |
MAI = SliceCommander:getSpellSettings('MAI'), |
} |
}, |
childGroups = "tree", |
args = { |
Shortcut = SliceCommander:getShortcutHeader(), |
Shortcut_BB = SliceCommander:getShortcutSetting("SliceCommander_Complementary", "Outlaw", "BB"), |
Shortcut_GSWW = SliceCommander:getShortcutSetting("SliceCommander_Complementary", "Outlaw", "GSWW"), |
BB = { |
order = SliceCommander:getOrder(), |
name = SC_SPELL['BB'], |
type = "group", |
args = { |
BBShow = { |
order = SliceCommander:getOrder(), |
name = string.format(L["Show %s icon"], SC_SPELL['BB']), |
desc = string.format(L["Display the %s icon when enbale"], SC_SPELL['BB']), |
width = "full", |
type = "toggle", |
set = function(info,val) |
SC.SET.display.BB = val |
end, |
get = function(info) return SC.SET.display.BB end |
} |
} |
}, |
GSWW = SliceCommander:getSpellSettings('GSWW'), |
} |
}, |
end |
end |
SliceCommander:TestSOTD()--SOTD Icon |
SliceCommander:TestBF()--BF Icon |
SliceCommander:TestBB()--BB Icon |
SliceCommander:TestDP()--DP Icon |
end |
SC.OTHER['POISON']['obj'].button:SetAttribute("*type1", "spell") |
SC.OTHER['POISON']['obj'].button:SetAttribute("*type2", "spell") |
SC.OTHER['POISON']['obj'].button:EnableMouse(false) |
SC.OTHER['BF']['obj'] = SliceCommander:NewIcon("Interface\\Icons\\Ability_Warrior_PunishingBlow", 'BF')--Create Blade fury icon display when BF is enable |
SC.OTHER['BB']['obj'] = SliceCommander:NewIcon("Interface\\Icons\\inv_weapon_rifle_07", 'BB')--Create Blunderbuss icon display when BF is enable |
SC.OTHER['SOTD']['obj'] = SliceCommander:NewIcon("Interface\\Icons\\inv_misc_volatileshadow", 'SOTD')--Create Shadow of the destroyer icon display when stack rise 30 |
SC.OTHER['SOTD']['obj'].overlay:Show() |
end |
function SliceCommander:InitGCDBar() |
SliceCommanderFrame:EnableMouse(false) |
SC.OTHER['POISON']['obj']['moveframe']:SetAlpha(0) |
SC.OTHER['POISON']['obj']['moveframe']:EnableMouse(false) |
SC.OTHER['BF']['obj']['moveframe']:SetAlpha(0) |
SC.OTHER['BF']['obj']['moveframe']:EnableMouse(false) |
SC.OTHER['BB']['obj']['moveframe']:SetAlpha(0) |
SC.OTHER['BB']['obj']['moveframe']:EnableMouse(false) |
SC.OTHER['SOTD']['obj']['moveframe']:SetAlpha(0) |
SC.OTHER['SOTD']['obj']['moveframe']:EnableMouse(false) |
SC.SET.IsLocked = true |
else |
SliceCommander:SetTransparency(100) |
SC.OTHER['POISON']['obj']['moveframe']:EnableMouse(true) |
SC.OTHER['POISON']['obj']:SetAlpha(1) |
SC.OTHER['POISON']['obj']:Show() |
SC.OTHER['BF']['obj']['moveframe']:SetAlpha(.5) |
SC.OTHER['BF']['obj']['moveframe']:EnableMouse(true) |
SC.OTHER['BF']['obj']:Show() |
SC.OTHER['BB']['obj']['moveframe']:SetAlpha(.5) |
SC.OTHER['BB']['obj']['moveframe']:EnableMouse(true) |
SC.OTHER['BB']['obj']:Show() |
SC.OTHER['SOTD']['obj']['moveframe']:SetAlpha(.5) |
SC.OTHER['SOTD']['obj']['moveframe']:EnableMouse(true) |
SC.OTHER['SOTD']['obj']:Show() |
SC.SET.IsLocked = false |
SliceCommander:StaticPopup_Show('CONFIG_UNLOCK') |
end |
function SliceCommander:SetIconSize(w) |
SliceCommander:SetIconSizeObj(SC.OTHER['POISON']['obj'], w) |
SliceCommander:SetIconSizeObj(SC.OTHER['BF']['obj'], w) |
SliceCommander:SetIconSizeObj(SC.OTHER['BB']['obj'], w) |
SliceCommander:SetIconSizeObj(SC.OTHER['SOTD']['obj'], w) |
end |
function SliceCommander:SetIconSizeObj(obj, w) |
v['obj']:SetAlpha(opValue/100) |
end |
end |
SC.OTHER['BF']['obj']:SetAlpha(opValue/100) |
SC.OTHER['BB']['obj']:SetAlpha(opValue/100) |
end |
function SliceCommander:TestCurrentVersion() |
_G['SC'].BARS['TXB'] = nil |
_G['SC'].SET.Pos['NB'] = nil |
_G['SC'].BARS['NB'] = nil |
_G['SC'].SET.Pos['SOTD'] = nil |
_G['SC'].BARS['SOTD'] = nil |
_G['SC'].SET.Pos['FOTD'] = nil |
_G['SC'].BARS['FOTD'] = nil |
end |
_G['SC'].version = GetAddOnMetadata("SliceCommander", "Version") |
end |
function SliceCommander:Global() |
SliceCommander:DisplaySpells({'CP', 'THREAT', 'SND', 'CS', 'KS', 'KSCD', 'FOTD', 'CV', 'CVCD', 'TOTCD', 'FE', 'SSCD', 'SUB', 'CDCD', 'AC', 'MDCD', 'DFACD', 'Poison', 'SOTD', 'MAI', 'FECD', 'ESSECD', 'DPICON', 'SUMSCD', 'FCCD', 'SOSCD', 'DOSCD', 'ERCD', 'SBSCD', 'SBS', 'SPCD', 'FLACD', 'SP', 'FLA'}) |
SliceCommander:DisplaySpells({'CP', 'THREAT', 'SND', 'CS', 'KS', 'KSCD', 'CV', 'CVCD', 'TOTCD', 'FE', 'SSCD', 'SUB', 'CDCD', 'AC', 'MDCD', 'DFACD', 'Poison', 'MAI', 'FECD', 'ESSECD', 'DPICON', 'SUMSCD', 'FCCD', 'SOSCD', 'DOSCD', 'ERCD', 'SBSCD', 'SBS', 'SPCD', 'FLACD', 'SP', 'FLA'}) |
SliceCommander:NotDisplaySpells({'HEALTH', 'THEALTH', 'VANCD', 'KICD', 'COS', 'COSCD', 'EVA', 'EVACD', 'SPR', 'SPRCD', 'SS'}) |
SliceCommander:FlashSpells({'SND'}) |
SC.SET.Pos.CP = -1 |
end |
SliceCommander:OrderSpells({'SND', 'FOTD', 'CV', 'FE', 'SUB', 'AC', 'MAI', 'COS', 'EVA', 'SPR', 'SS', 'SP', 'FLA', 'SBS'}) |
SliceCommander:OrderSpells({'SND', 'CV', 'FE', 'SUB', 'AC', 'MAI', 'COS', 'EVA', 'SPR', 'SS', 'SP', 'FLA', 'SBS'}) |
SliceCommander:OrderCDs({'CVCD', 'TOTCD', 'VANCD', 'SSCD', 'CDCD', 'MDCD', 'DFACD', 'THREAT', 'HEALTH', 'THEALTH', 'CS', 'KS', 'KSCD', 'KICD', 'COSCD', 'EVACD', 'SPRCD', 'FECD', 'ESSECD', 'SUMSCD', 'FCCD', 'SOSCD', 'DOSCD', 'ERCD', 'SBSCD', 'SPCD', 'FLACD'}) |
end |
end |
function SliceCommander:Outlaw() |
SliceCommander:DisplaySpells({'RB', 'AR', 'ARCD', 'CDB', 'CDBCD', 'KSPCD', 'GS', 'GHCD', 'BE', 'BECD', 'BF', 'BFCD', 'OP', 'GSWW', 'BB', 'LD', 'GSCD', 'BRCD', 'RBCD'}) |
SliceCommander:DisplaySpells({'RB', 'AR', 'ARCD', 'CDB', 'CDBCD', 'KSPCD', 'GS', 'GHCD', 'BE', 'BECD', 'BF', 'BFCD', 'OP', 'GSWW', 'LD', 'GSCD', 'BRCD', 'RBCD'}) |
SliceCommander:NotDisplaySpells({'BFICON', 'GG', 'GGCD'}) |
SliceCommander:FlashSpells({'ARCD', 'CDBCD', 'KSPCD', 'BECD', 'BRCD', 'RBCD'}) |
if SC.SET.DPSound == nil then |
SC.SET.DPSound = 'None' |
end |
if SC.SET.FOTDSound == nil then |
SC.SET.FOTDSound = 'OH YEAH' |
end |
if SC.SET.Width == nil then |
SC.SET.Width = 287 |
end |
if SC.OTHER == nil then |
SC.OTHER = {} |
end |
if SC.OTHER['BF'] == nil or SC.OTHER['BF']['position'] == nil then |
SC.OTHER['BF'] = { |
['obj'] = 0, |
['position'] = { |
['xOfs'] = 75, |
['yOfs'] = 150, |
['relativePoint'] = "CENTER", |
['point'] = "CENTER", |
['relativeTo'] = "UIParent" |
} |
} |
end |
if SC.OTHER['BB'] == nil or SC.OTHER['BB']['position'] == nil then |
SC.OTHER['BB'] = { |
['obj'] = 0, |
['position'] = { |
['xOfs'] = -75, |
['yOfs'] = 150, |
['relativePoint'] = "CENTER", |
['point'] = "CENTER", |
['relativeTo'] = "UIParent" |
} |
} |
end |
if SC.OTHER['SOTD'] == nil or SC.OTHER['SOTD']['position']== nil then |
SC.OTHER['SOTD'] = { |
['obj'] = 0, |
['iconTxt'] = 0, |
['overlay'] = false, |
['position'] = { |
['xOfs'] = 25, |
['yOfs'] = 150, |
['relativePoint'] = "CENTER", |
['point'] = "CENTER", |
['relativeTo'] = "UIParent" |
} |
} |
end |
if SC.OTHER['AS'] == nil then |
SC.OTHER['AS'] = { |
['obj'] = 0, |
if SC.BARS['VANCD'] == nil then--Vanish |
SC.BARS['VANCD'] = {['color'] = {.42, .46, .51}} |
end |
if SC.BARS['FOTD'] == nil then--Fury of the Destroyer |
SC.BARS['FOTD'] = {['color'] = {.7, .13, .75}} |
end |
if SC.BARS['SS'] == nil then--Shadowstep |
SC.BARS['SS'] = {['color'] = {.76, .28, .78}} |
end |
SC.BARS[k]['id'] = SC_SPELLID[k] |
end |
local buff = {'FOTD', 'AR', 'SUB', 'EP', 'CV', 'AC', 'FE', 'SND', 'SD', 'SOD', 'SB', 'OP', 'ENV', 'GB', 'GSWW', 'MAI', 'LD', 'BF', 'SHT', 'COS', 'EVA', 'SPR', 'BLS', 'MA', 'SS'} |
local buff = {'AR', 'SUB', 'EP', 'CV', 'AC', 'FE', 'SND', 'SD', 'SOD', 'SB', 'OP', 'ENV', 'GB', 'GSWW', 'MAI', 'LD', 'BF', 'SHT', 'COS', 'EVA', 'SPR', 'BLS', 'MA', 'SS'} |
for i, v in ipairs(buff) do--BUFF |
SC.BARS[v]['type'] = 1 |
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="prototypes.lua" /> |
<Script file="FontWidget.lua" /> |
<Script file="SoundWidget.lua" /> |
<Script file="StatusbarWidget.lua" /> |
<Script file="BorderWidget.lua" /> |
<Script file="BackgroundWidget.lua" /> |
</Ui> |
-- 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 = 13 |
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 |
<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> |
-- 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 = 13 |
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, BackdropTemplateMixin and "BackdropTemplate") |
--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 |
-- Widget created by Yssaril |
local DataVersion = 9004 |
local AGSMW = LibStub:NewLibrary("AceGUISharedMediaWidgets-1.0", DataVersion) |
if not AGSMW then |
return -- already loaded and no upgrade necessary |
end |
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) |
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, BackdropTemplateMixin and "BackdropTemplate") |
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.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.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, BackdropTemplateMixin and "BackdropTemplate") |
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, BackdropTemplateMixin and "BackdropTemplate") |
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 |
-- 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 = 13 |
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 |
-- 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 = 13 |
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 |
-- 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 = 13 |
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 |
-- make into AceHook. |
-- @class file |
-- @name AceHook-3.0 |
-- @release $Id: AceHook-3.0.lua 1202 2019-05-15 23:11:22Z nevcairiel $ |
local ACEHOOK_MAJOR, ACEHOOK_MINOR = "AceHook-3.0", 8 |
-- @release $Id: AceHook-3.0.lua 1243 2020-10-18 00:00:19Z nevcairiel $ |
local ACEHOOK_MAJOR, ACEHOOK_MINOR = "AceHook-3.0", 9 |
local AceHook, oldminor = LibStub:NewLibrary(ACEHOOK_MAJOR, ACEHOOK_MINOR) |
if not AceHook then return end -- No upgrade needed |
for key, value in pairs(registry[self]) do |
if type(key) == "table" then |
for method in pairs(value) do |
self:Unhook(key, method) |
AceHook.Unhook(self, key, method) |
end |
else |
self:Unhook(key) |
AceHook.Unhook(self, key) |
end |
end |
end |
if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end |
-- Lua APIs |
local pairs, ipairs, assert, type, wipe = pairs, ipairs, assert, type, wipe |
local pairs, ipairs, assert, type, wipe = pairs, ipairs, assert, type, table.wipe |
-- WoW APIs |
local PlaySound = PlaySound |
BlizOptionsGroup Container |
Simple container widget for the integration of AceGUI into the Blizzard Interface Options |
-------------------------------------------------------------------------------]] |
local Type, Version = "BlizOptionsGroup", 21 |
local Type, Version = "BlizOptionsGroup", 22 |
local AceGUI = LibStub and LibStub("AceGUI-3.0", true) |
if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end |
Constructor |
-------------------------------------------------------------------------------]] |
local function Constructor() |
local frame = CreateFrame("Frame") |
local frame = CreateFrame("Frame", nil, InterfaceOptionsFramePanelContainer) |
frame:Hide() |
-- support functions for the Blizzard Interface Options |
--[[----------------------------------------------------------------------------- |
Frame Container |
-------------------------------------------------------------------------------]] |
local Type, Version = "Frame", 27 |
local Type, Version = "Frame", 28 |
local AceGUI = LibStub and LibStub("AceGUI-3.0", true) |
if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end |
["OnAcquire"] = function(self) |
self.frame:SetParent(UIParent) |
self.frame:SetFrameStrata("FULLSCREEN_DIALOG") |
self.frame:SetFrameLevel(100) -- Lots of room to draw under it |
self:SetTitle() |
self:SetStatusText() |
self:ApplyStatus() |
frame:SetMovable(true) |
frame:SetResizable(true) |
frame:SetFrameStrata("FULLSCREEN_DIALOG") |
frame:SetFrameLevel(100) -- Lots of room to draw under it |
frame:SetBackdrop(FrameBackdrop) |
frame:SetBackdropColor(0, 0, 0, 1) |
frame:SetMinResize(400, 200) |
--[[ $Id: AceGUIWidget-DropDown.lua 1239 2020-09-20 10:22:02Z nevcairiel $ ]]-- |
--[[ $Id: AceGUIWidget-DropDown.lua 1257 2022-01-10 16:25:37Z nevcairiel $ ]]-- |
local AceGUI = LibStub("AceGUI-3.0") |
-- Lua APIs |
do |
local widgetType = "Dropdown" |
local widgetVersion = 35 |
local widgetVersion = 36 |
--[[ Static data ]]-- |
local function Dropdown_TogglePullout(this) |
local self = this.obj |
PlaySound(856) -- SOUNDKIT.IG_MAINMENU_OPTION_CHECKBOX_ON |
if self.open then |
self.open = nil |
self.pullout:Close() |
-- f:AddChild(btn) |
-- @class file |
-- @name AceGUI-3.0 |
-- @release $Id: AceGUI-3.0.lua 1231 2020-04-14 22:20:36Z nevcairiel $ |
-- @release $Id: AceGUI-3.0.lua 1247 2021-01-23 23:16:39Z funkehdude $ |
local ACEGUI_MAJOR, ACEGUI_MINOR = "AceGUI-3.0", 41 |
local AceGUI, oldminor = LibStub:NewLibrary(ACEGUI_MAJOR, ACEGUI_MINOR) |
if not AceGUI then return end -- No upgrade needed |
-- Lua APIs |
local tinsert = table.insert |
local tinsert, wipe = table.insert, table.wipe |
local select, pairs, next, type = select, pairs, next, type |
local error, assert = error, assert |
local setmetatable, rawget = setmetatable, rawget |
-- $Id: LibStub.lua 76 2007-09-03 01:50:17Z mikk $ |
-- LibStub is a simple versioning stub meant for use in Libraries. http://www.wowace.com/wiki/LibStub for more info |
-- LibStub is hereby placed in the Public Domain |
-- Credits: Kaelten, Cladhaire, ckknight, Mikk, Ammo, Nevcairiel, joshborke |
local LIBSTUB_MAJOR, LIBSTUB_MINOR = "LibStub", 2 -- NEVER MAKE THIS AN SVN REVISION! IT NEEDS TO BE USABLE IN ALL REPOS! |
local LibStub = _G[LIBSTUB_MAJOR] |
-- Check to see is this version of the stub is obsolete |
if not LibStub or LibStub.minor < LIBSTUB_MINOR then |
LibStub = LibStub or {libs = {}, minors = {} } |
_G[LIBSTUB_MAJOR] = LibStub |
LibStub.minor = LIBSTUB_MINOR |
-- LibStub:NewLibrary(major, minor) |
-- major (string) - the major version of the library |
-- minor (string or number ) - the minor version of the library |
-- |
-- returns nil if a newer or same version of the lib is already present |
-- returns empty library object or old library object if upgrade is needed |
function LibStub:NewLibrary(major, minor) |
assert(type(major) == "string", "Bad argument #2 to `NewLibrary' (string expected)") |
minor = assert(tonumber(strmatch(minor, "%d+")), "Minor version must either be a number or contain a number.") |
local oldminor = self.minors[major] |
if oldminor and oldminor >= minor then return nil end |
self.minors[major], self.libs[major] = minor, self.libs[major] or {} |
return self.libs[major], oldminor |
end |
-- LibStub:GetLibrary(major, [silent]) |
-- major (string) - the major version of the library |
-- silent (boolean) - if true, library is optional, silently return nil if its not found |
-- |
-- throws an error if the library can not be found (except silent is set) |
-- returns the library object if found |
function LibStub:GetLibrary(major, silent) |
if not self.libs[major] and not silent then |
error(("Cannot find a library instance of %q."):format(tostring(major)), 2) |
end |
return self.libs[major], self.minors[major] |
end |
-- LibStub:IterateLibraries() |
-- |
-- Returns an iterator for the currently registered libraries |
function LibStub:IterateLibraries() |
return pairs(self.libs) |
end |
setmetatable(LibStub, { __call = LibStub.GetLibrary }) |
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="LibSharedMedia-3.0.lua" /> |
</Ui> |
------------------------------------------------------------------------ |
r117 | funkehdude | 2021-03-09 20:22:46 +0000 (Tue, 09 Mar 2021) | 1 line |
Changed paths: |
M /trunk/LibSharedMedia-3.0.toc |
bump toc |
------------------------------------------------------------------------ |
--[[ $Id: CallbackHandler-1.0.lua 1186 2018-07-21 14:19:18Z nevcairiel $ ]] |
local MAJOR, MINOR = "CallbackHandler-1.0", 7 |
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 Dispatch(handlers, ...) |
local index, method = next(handlers) |
if not method then return end |
repeat |
xpcall(method, errorhandler, ...) |
index, method = next(handlers, index) |
until not method |
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 |
Dispatch(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. |
<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> |
--[[ |
Name: LibSharedMedia-3.0 |
Revision: $Revision: 114 $ |
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", 8020003 -- 8.2.0 v3 / 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_sort = _G.table.sort |
local RESTRICTED_FILE_ACCESS = WOW_PROJECT_ID == WOW_PROJECT_MAINLINE -- starting with 8.2, some rules for file access have changed; classic still uses the old way |
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.MediaTable.statusbar["Solid"] = [[Interface\Buttons\WHITE8X8]] |
lib.DefaultMedia.statusbar = "Blizzard" |
-- SOUND |
if not lib.MediaTable.sound then lib.MediaTable.sound = {} end |
lib.MediaTable.sound["None"] = RESTRICTED_FILE_ACCESS and 1 or [[Interface\Quiet.ogg]] -- Relies on the fact that PlaySound[File] doesn't error on these values. |
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 |
-- ignore fonts that aren't flagged as supporting local glyphs on non-western clients |
return false |
end |
if type(data) == "string" and (mediatype == lib.MediaType.BACKGROUND or mediatype == lib.MediaType.BORDER or mediatype == lib.MediaType.STATUSBAR or mediatype == lib.MediaType.SOUND) then |
local path = data:lower() |
if RESTRICTED_FILE_ACCESS and not path:find("^interface") then |
-- files accessed via path only allowed from interface folder |
return false |
end |
if mediatype == lib.MediaType.SOUND and not (path:find(".ogg", nil, true) or path:find(".mp3", nil, true)) then |
-- Only ogg and mp3 are valid sounds. |
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 |
## Interface: 90005 |
## LoadOnDemand: 1 |
## Title: Lib: SharedMedia-3.0 |
## Notes: Shared handling of media data (fonts, sounds, textures, ...) between addons. |
## Author: Elkano |
## Version: 3.0-117 |
## X-Website: http://www.wowace.com/projects/libsharedmedia-3-0/ |
## X-Category: Library |
## X-Revision: 117 |
## X-Date: 2021-03-09T20:22:46Z |
LibStub\LibStub.lua |
CallbackHandler-1.0\CallbackHandler-1.0.lua |
LibSharedMedia-3.0\lib.xml |
--- AceConfigDialog-3.0 generates AceGUI-3.0 based windows based on option tables. |
-- @class file |
-- @name AceConfigDialog-3.0 |
-- @release $Id: AceConfigDialog-3.0.lua 1232 2020-04-14 22:21:22Z nevcairiel $ |
-- @release $Id: AceConfigDialog-3.0.lua 1255 2021-11-14 09:14:15Z nevcairiel $ |
local LibStub = LibStub |
local gui = LibStub("AceGUI-3.0") |
local reg = LibStub("AceConfigRegistry-3.0") |
local MAJOR, MINOR = "AceConfigDialog-3.0", 79 |
local MAJOR, MINOR = "AceConfigDialog-3.0", 82 |
local AceConfigDialog, oldminor = LibStub:NewLibrary(MAJOR, MINOR) |
if not AceConfigDialog then return end |
AceConfigDialog.frame.closeAllOverride = AceConfigDialog.frame.closeAllOverride or {} |
-- Lua APIs |
local tinsert, tsort, tremove = table.insert, table.sort, table.remove |
local tinsert, tsort, tremove, wipe = table.insert, table.sort, table.remove, table.wipe |
local strmatch, format = string.match, string.format |
local error = error |
local pairs, next, select, type, unpack, wipe, ipairs = pairs, next, select, type, unpack, wipe, ipairs |
local pairs, next, select, type, unpack, ipairs = pairs, next, select, type, unpack, ipairs |
local tostring, tonumber = tostring, tonumber |
local math_min, math_max, math_floor = math.min, math.max, math.floor |
end |
do |
local frame = AceConfigDialog.popup |
if not frame then |
if not frame or oldminor < 81 then |
frame = CreateFrame("Frame", nil, UIParent) |
AceConfigDialog.popup = frame |
frame:Hide() |
frame:SetPoint("CENTER", UIParent, "CENTER") |
frame:SetSize(320, 72) |
frame:EnableMouse(true) -- Do not allow click-through on the frame |
frame:SetFrameStrata("TOOLTIP") |
frame:SetFrameLevel(100) -- Lots of room to draw under it |
frame:SetScript("OnKeyDown", function(self, key) |
if key == "ESCAPE" then |
self:SetPropagateKeyboardInput(false) |
end |
end) |
if WOW_PROJECT_ID == WOW_PROJECT_CLASSIC then |
if not frame.SetFixedFrameStrata then -- API capability check (classic check) |
frame:SetBackdrop({ |
bgFile = [[Interface\DialogFrame\UI-DialogBox-Background-Dark]], |
edgeFile = [[Interface\DialogFrame\UI-DialogBox-Border]], |
insets = { left = 11, right = 11, top = 11, bottom = 11 }, |
}) |
else |
local border = CreateFrame("Frame", nil, frame, "DialogBorderDarkTemplate") |
local border = CreateFrame("Frame", nil, frame, "DialogBorderOpaqueTemplate") |
border:SetAllPoints(frame) |
frame:SetFixedFrameStrata(true) |
frame:SetFixedFrameLevel(true) |
end |
local text = frame:CreateFontString(nil, "ARTWORK", "GameFontHighlight") |
elseif width == "half" then |
check:SetWidth(width_multiplier / 2) |
elseif (type(width) == "number") then |
control:SetWidth(width_multiplier * width) |
check:SetWidth(width_multiplier * width) |
elseif width == "full" then |
check.width = "fill" |
else |
## Interface: 90105 |
## Interface: 90200 |
## Author: Tomate |
## Version: 9.06 |
## Version: 9.07 |
## Title: |TInterface\Icons\ClassIcon_Rogue:0|t |cffd38245Slice|r|cff45ad3bCommander|r |TInterface\Icons\ClassIcon_Rogue:0|t |
## Notes: Energy bar, Combo point bar and rogue timer bar. |
## SavedVariables: SC |
SC_SPELLID['DFACD'] = 269513 --Death from Above CD |
SC_SPELLID['CV'] = 185311 --Crimson Vial |
SC_SPELLID['CVCD'] = 185311 --Crimson Vial CD |
SC_SPELLID['SOTD'] = 109941 --Shadow of the Destroyer |
SC_SPELLID['FOTD'] = 109949 --Fury of the Destroyer |
SC_SPELLID['MAI'] = 235027 --Master Assassin's Initiative |
SC_SPELLID['KICD'] = 1766 --Kick CD |
SC_SPELLID['COS'] = 31224 --Cloak of Shadows |
SC_SPELLID['WP'] = 8679 --Wound Poison |
SC_SPELLID['AKP'] = 5761 --Ankylosant Poison |
--AZERITE ESSENCE |
SC_SPELLID['ESSECD'] = -1 |
SC_SPELLID['ALLESSE'] = { |
SC_SPELLID['GSCD'] = 196937 --Ghostly Strike |
SC_SPELLID['GHCD'] = 195457 --Grappling Hook CD |
SC_SPELLID['BE'] = 315341 --Between the Eyes |
SC_SPELLID['BECD'] = 199804 --Between the Eyes CD |
SC_SPELLID['BECD'] = 315341 --Between the Eyes CD |
SC_SPELLID['OP'] = 195627 --Opportunity |
SC_SPELLID['RB'] = 315508 --Roll the Bones |
SC_SPELLID['RBCD'] = 315508 --Roll the Bones |
SC_SPELLID['CDBCD'] = 343142 --Curse of the Dreadblades CD |
SC_SPELLID['GSWW'] = 209423 --Greenskin's Waterlogged Wristcuffs |
SC_SPELLID['PS'] = 185763 --Cannonball Barrage |
SC_SPELLID['BB'] = 202895 --Blunderbuss |
SC_SPELLID['RT'] = 208225 --Run Through |
SC_SPELLID['LD'] = 256171 --Loaded Dice |
SC_SPELLID['BRCD'] = 271877 --Blade Rush CD |
--REMOVED SC_SPELLID['RIPCD'] = 199754 --Riposte CD |
--REMOVED SC_SPELLID['TXB'] = 245389 --Toxic Blade |
--REMOVED SC_SPELLID['TXBCD'] = 245388 --Toxic Blade CD |
--REMOVED SC_SPELLID['NB'] = 195452 --Nightblade |