WoWInterface SVN MultiScreenSupport

Compare Revisions

  • This comparison shows the changes necessary to convert path
    /
    from Rev 18 to Rev 17
    Reverse comparison

Rev 18 → Rev 17

trunk/MultiScreenSupport.lua
127,36 → 127,20
_G['multiscreensupportsave']['standart']["CommunitiesFrame"] = true
_G['multiscreensupportsave']['standart']["AzeriteRespecFrame"] = true
end
if not(_G['multiscreensupportsave']['MSSVersion']) or _G['multiscreensupportsave']['MSSVersion'] < '4.3' then
_G['multiscreensupportsave']['standart']["AlliedRacesFrame"] = true
end
 
_G['multiscreensupportsave']["MSSVersion"] = MSSVersion
end
 
 
-- split("a,b,c", ",") => {"a", "b", "c"}
local function MSS_split(s, sep)
local fields = {}
 
local sep = sep or " "
local pattern = string.format("([^%s]+)", sep)
string.gsub(s, pattern, function(c) fields[#fields + 1] = c end)
 
return fields
end
 
function MultiScreenSupport:PLAYER_LOGIN()
local allActiveFramesOrder = {}
local allFramesOrder = {}
local j, eyefinity
local Resolution = ({GetScreenResolutions()})[GetCurrentResolution()] or GetCVar("gxWindowedResolution")
local Resolution = ({GetScreenResolutions()})[GetCurrentResolution()]
if Resolution == nil then
print("MultiScreenSupport: The resolution for the PixelPerfect option can not be found properly. You should try to change your client to fullscreen and then back to windowed.")
return false
end
local tableResolution = MSS_split(Resolution, 'x')
local ScreenWidth, ScreenHeight = tableResolution[1]+0,tableResolution[2]+0
local ScreenWidth, ScreenHeight = DecodeResolution(Resolution)
 
--Pixel Perfect scale
local scale = 768/ScreenHeight
trunk/Libs/AceGUI-3.0/widgets/AceGUIWidget-TabGroup.lua File deleted
trunk/Libs/AceGUI-3.0/widgets/AceGUIWidget-BlizOptionsGroup.lua File deleted
trunk/Libs/AceGUI-3.0/widgets/AceGUIWidget-Frame.lua File deleted
trunk/Libs/AceGUI-3.0/widgets/AceGUIWidget-InlineGroup.lua File deleted
trunk/Libs/AceGUI-3.0/widgets/AceGUIWidget-SimpleGroup.lua File deleted
trunk/Libs/AceGUI-3.0/widgets/AceGUIWidget-ScrollFrame.lua File deleted
trunk/Libs/AceGUI-3.0/widgets/AceGUIWidget-DropDownGroup.lua File deleted
trunk/Libs/AceGUI-3.0/widgets/AceGUIWidget-TreeGroup.lua File deleted
trunk/Libs/AceGUI-3.0/widgets/AceGUIWidget-Slider.lua
2,7 → 2,7
Slider Widget
Graphical Slider, like, for Range values.
-------------------------------------------------------------------------------]]
local Type, Version = "Slider", 23
local Type, Version = "Slider", 22
local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end
 
105,7 → 105,7
else
value = tonumber(value)
end
 
 
if value then
PlaySound(856) -- SOUNDKIT.IG_MAINMENU_OPTION_CHECKBOX_ON
self.slider:SetValue(value)
225,7 → 225,7
label:SetJustifyH("CENTER")
label:SetHeight(15)
 
local slider = CreateFrame("Slider", nil, frame, BackdropTemplateMixin and "BackdropTemplate" or nil)
local slider = CreateFrame("Slider", nil, frame)
slider:SetOrientation("HORIZONTAL")
slider:SetHeight(15)
slider:SetHitRectInsets(0, 0, -10, 0)
247,7 → 247,7
local hightext = slider:CreateFontString(nil, "ARTWORK", "GameFontHighlightSmall")
hightext:SetPoint("TOPRIGHT", slider, "BOTTOMRIGHT", -2, 3)
 
local editbox = CreateFrame("EditBox", nil, frame, BackdropTemplateMixin and "BackdropTemplate" or nil)
local editbox = CreateFrame("EditBox", nil, frame)
editbox:SetAutoFocus(false)
editbox:SetFontObject(GameFontHighlightSmall)
editbox:SetPoint("TOP", slider, "BOTTOM")
trunk/Libs/AceGUI-3.0/widgets/AceGUIContainer-TabGroup.lua
2,7 → 2,7
TabGroup Container
Container that uses tabs on top to switch between groups.
-------------------------------------------------------------------------------]]
local Type, Version = "TabGroup", 37
local Type, Version = "TabGroup", 36
local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end
 
161,21 → 161,21
self.tablist = tabs
self:BuildTabs()
end,
 
 
 
["BuildTabs"] = function(self)
local hastitle = (self.titletext:GetText() and self.titletext:GetText() ~= "")
local tablist = self.tablist
local tabs = self.tabs
 
 
if not tablist then return end
 
 
local width = self.frame.width or self.frame:GetWidth() or 0
 
 
wipe(widths)
wipe(rowwidths)
wipe(rowends)
 
 
--Place Text into tabs and get thier initial width
for i, v in ipairs(tablist) do
local tab = tabs[i]
183,19 → 183,19
tab = self:CreateTab(i)
tabs[i] = tab
end
 
 
tab:Show()
tab:SetText(v.text)
tab:SetDisabled(v.disabled)
tab.value = v.value
 
 
widths[i] = tab:GetWidth() - 6 --tabs are anchored 10 pixels from the right side of the previous one to reduce spacing, but add a fixed 4px padding for the text
end
 
 
for i = (#tablist)+1, #tabs, 1 do
tabs[i]:Hide()
end
 
 
--First pass, find the minimum number of rows needed to hold all tabs and the initial tab layout
local numtabs = #tablist
local numrows = 1
213,7 → 213,7
end
rowwidths[numrows] = usedwidth + 10 --first tab in each row takes up an extra 10px
rowends[numrows] = #tablist
 
 
--Fix for single tabs being left on the last row, move a tab from the row above if applicable
if numrows > 1 then
--if the last row has only one tab
244,22 → 244,22
tab:SetPoint("LEFT", tabs[tabno-1], "RIGHT", -10, 0)
end
end
 
 
-- equal padding for each tab to fill the available width,
-- if the used space is above 75% already
-- the 18 pixel is the typical width of a scrollbar, so we can have a tab group inside a scrolling frame,
-- the 18 pixel is the typical width of a scrollbar, so we can have a tab group inside a scrolling frame,
-- and not have the tabs jump around funny when switching between tabs that need scrolling and those that don't
local padding = 0
if not (numrows == 1 and rowwidths[1] < width*0.75 - 18) then
padding = (width - rowwidths[row]) / (endtab - starttab+1)
end
 
 
for i = starttab, endtab do
PanelTemplates_TabResize(tabs[i], padding + 4, nil, nil, width, tabs[i]:GetFontString():GetStringWidth())
end
starttab = endtab + 1
end
 
 
self.borderoffset = (hastitle and 17 or 10)+((numrows)*20)
self.border:SetPoint("TOPLEFT", 1, -self.borderoffset)
end,
285,7 → 285,7
content:SetHeight(contentheight)
content.height = contentheight
end,
 
 
["LayoutFinished"] = function(self, width, height)
if self.noAutoHeight then return end
self:SetHeight((height or 0) + (self.borderoffset + 23))
316,7 → 316,7
titletext:SetHeight(18)
titletext:SetText("")
 
local border = CreateFrame("Frame", nil, frame, BackdropTemplateMixin and "BackdropTemplate" or nil)
local border = CreateFrame("Frame", nil, frame)
border:SetPoint("TOPLEFT", 1, -27)
border:SetPoint("BOTTOMRIGHT", -1, 3)
border:SetBackdrop(PaneBackdrop)
342,7 → 342,7
for method, func in pairs(methods) do
widget[method] = func
end
 
 
return AceGUI:RegisterAsContainer(widget)
end
 
trunk/Libs/AceGUI-3.0/widgets/AceGUIWidget-Keybinding.lua
2,7 → 2,7
Keybinding Widget
Set Keybindings in the Config UI.
-------------------------------------------------------------------------------]]
local Type, Version = "Keybinding", 26
local Type, Version = "Keybinding", 25
local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end
 
214,7 → 214,7
label:SetJustifyH("CENTER")
label:SetHeight(18)
 
local msgframe = CreateFrame("Frame", nil, UIParent, BackdropTemplateMixin and "BackdropTemplate" or nil)
local msgframe = CreateFrame("Frame", nil, UIParent)
msgframe:SetHeight(30)
msgframe:SetBackdrop(ControlBackdrop)
msgframe:SetBackdropColor(0,0,0)
trunk/Libs/AceGUI-3.0/widgets/AceGUIWidget-CheckBox.lua
221,11 → 221,11
self:SetHeight(24)
end
end,
 
 
["SetImage"] = function(self, path, ...)
local image = self.image
image:SetTexture(path)
 
 
if image:GetTexture() then
local n = select("#", ...)
if n == 4 or n == 8 then
trunk/Libs/AceGUI-3.0/widgets/AceGUIWidget-Icon.lua
56,7 → 56,7
["SetImage"] = function(self, path, ...)
local image = self.image
image:SetTexture(path)
 
 
if image:GetTexture() then
local n = select("#", ...)
if n == 4 or n == 8 then
trunk/Libs/AceGUI-3.0/widgets/AceGUIContainer-Frame.lua
1,7 → 1,7
--[[-----------------------------------------------------------------------------
Frame Container
-------------------------------------------------------------------------------]]
local Type, Version = "Frame", 27
local Type, Version = "Frame", 26
local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end
 
179,7 → 179,7
}
 
local function Constructor()
local frame = CreateFrame("Frame", nil, UIParent, BackdropTemplateMixin and "BackdropTemplate" or nil)
local frame = CreateFrame("Frame", nil, UIParent)
frame:Hide()
 
frame:EnableMouse(true)
201,7 → 201,7
closebutton:SetWidth(100)
closebutton:SetText(CLOSE)
 
local statusbg = CreateFrame("Button", nil, frame, BackdropTemplateMixin and "BackdropTemplate" or nil)
local statusbg = CreateFrame("Button", nil, frame)
statusbg:SetPoint("BOTTOMLEFT", 15, 15)
statusbg:SetPoint("BOTTOMRIGHT", -132, 15)
statusbg:SetHeight(24)
trunk/Libs/AceGUI-3.0/widgets/AceGUIContainer-InlineGroup.lua
2,7 → 2,7
InlineGroup Container
Simple container widget that creates a visible "box" with an optional title.
-------------------------------------------------------------------------------]]
local Type, Version = "InlineGroup", 22
local Type, Version = "InlineGroup", 21
local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end
 
75,7 → 75,7
titletext:SetJustifyH("LEFT")
titletext:SetHeight(18)
 
local border = CreateFrame("Frame", nil, frame, BackdropTemplateMixin and "BackdropTemplate" or nil)
local border = CreateFrame("Frame", nil, frame)
border:SetPoint("TOPLEFT", 0, -17)
border:SetPoint("BOTTOMRIGHT", -1, 3)
border:SetBackdrop(PaneBackdrop)
trunk/Libs/AceGUI-3.0/widgets/AceGUIWidget-DropDown.lua
1,9 → 1,9
--[[ $Id: AceGUIWidget-DropDown.lua 1237 2020-07-17 22:50:38Z nevcairiel $ ]]--
--[[ $Id: AceGUIWidget-DropDown.lua 1167 2017-08-29 22:08:48Z funkydude $ ]]--
local AceGUI = LibStub("AceGUI-3.0")
 
-- Lua APIs
local min, max, floor = math.min, math.max, math.floor
local select, pairs, ipairs, type, tostring = select, pairs, ipairs, type, tostring
local select, pairs, ipairs, type = select, pairs, ipairs, type
local tsort = table.sort
 
-- WoW APIs
39,10 → 39,10
 
do
local widgetType = "Dropdown-Pullout"
local widgetVersion = 4
 
local widgetVersion = 3
 
--[[ Static data ]]--
 
 
local backdrop = {
bgFile = "Interface\\ChatFrame\\ChatFrameBackground",
edgeFile = "Interface\\DialogFrame\\UI-DialogBox-Border",
60,9 → 60,9
 
local defaultWidth = 200
local defaultMaxHeight = 600
 
 
--[[ UI Event Handlers ]]--
 
 
-- HACK: This should be no part of the pullout, but there
-- is no other 'clean' way to response to any item-OnEnter
-- Used to close Submenus when an other item is entered
74,22 → 74,22
end
end
end
 
 
-- See the note in Constructor() for each scroll related function
local function OnMouseWheel(this, value)
this.obj:MoveScroll(value)
end
 
 
local function OnScrollValueChanged(this, value)
this.obj:SetScroll(value)
end
 
 
local function OnSizeChanged(this)
this.obj:FixScroll()
end
 
 
--[[ Exported methods ]]--
 
 
-- exported
local function SetScroll(self, value)
local status = self.scrollStatus
106,9 → 106,9
child:SetPoint("TOPLEFT", frame, "TOPLEFT", 0, offset)
child:SetPoint("TOPRIGHT", frame, "TOPRIGHT", self.slider:IsShown() and -12 or 0, offset)
status.offset = offset
status.scrollvalue = value
status.scrollvalue = value
end
 
 
-- exported
local function MoveScroll(self, value)
local status = self.scrollStatus
127,7 → 127,7
self.slider:SetValue(min(max(status.scrollvalue + delta*(1000/(diff/45)),0), 1000))
end
end
 
 
-- exported
local function FixScroll(self)
local status = self.scrollStatus
140,7 → 140,7
child:SetPoint("TOPRIGHT", frame, "TOPRIGHT", 0, offset)
self.slider:SetValue(0)
else
self.slider:Show()
self.slider:Show()
local value = (offset / (viewheight - height) * 1000)
if value > 1000 then value = 1000 end
self.slider:SetValue(value)
153,44 → 153,44
end
end
end
 
 
-- exported, AceGUI callback
local function OnAcquire(self)
self.frame:SetParent(UIParent)
--self.itemFrame:SetToplevel(true)
end
 
 
-- exported, AceGUI callback
local function OnRelease(self)
self:Clear()
self.frame:ClearAllPoints()
self.frame:Hide()
end
 
 
-- exported
local function AddItem(self, item)
self.items[#self.items + 1] = item
 
 
local h = #self.items * 16
self.itemFrame:SetHeight(h)
self.frame:SetHeight(min(h + 34, self.maxHeight)) -- +34: 20 for scrollFrame placement (10 offset) and +14 for item placement
 
 
item.frame:SetPoint("LEFT", self.itemFrame, "LEFT")
item.frame:SetPoint("RIGHT", self.itemFrame, "RIGHT")
 
 
item:SetPullout(self)
item:SetOnEnter(OnEnter)
end
 
 
-- exported
local function Open(self, point, relFrame, relPoint, x, y)
local function Open(self, point, relFrame, relPoint, x, y)
local items = self.items
local frame = self.frame
local itemFrame = self.itemFrame
 
 
frame:SetPoint(point, relFrame, relPoint, x, y)
 
 
 
local height = 8
for i, item in pairs(items) do
if i == 1 then
198,23 → 198,23
else
item:SetPoint("TOP", items[i-1].frame, "BOTTOM", 0, 1)
end
 
 
item:Show()
 
 
height = height + 16
end
itemFrame:SetHeight(height)
fixstrata("TOOLTIP", frame, frame:GetChildren())
frame:Show()
self:Fire("OnOpen")
end
 
end
 
-- exported
local function Close(self)
self.frame:Hide()
self:Fire("OnClose")
end
 
end
 
-- exported
local function Clear(self)
local items = self.items
222,18 → 222,18
AceGUI:Release(item)
items[i] = nil
end
end
 
end
 
-- exported
local function IterateItems(self)
return ipairs(self.items)
end
 
 
-- exported
local function SetHideOnLeave(self, val)
self.hideOnLeave = val
end
 
 
-- exported
local function SetMaxHeight(self, height)
self.maxHeight = height or defaultMaxHeight
243,28 → 243,28
self.frame:SetHeight(self.itemFrame:GetHeight() + 34) -- see :AddItem
end
end
 
 
-- exported
local function GetRightBorderWidth(self)
return 6 + (self.slider:IsShown() and 12 or 0)
end
 
 
-- exported
local function GetLeftBorderWidth(self)
return 6
end
 
 
--[[ Constructor ]]--
 
 
local function Constructor()
local count = AceGUI:GetNextWidgetNum(widgetType)
local frame = CreateFrame("Frame", "AceGUI30Pullout"..count, UIParent, BackdropTemplateMixin and "BackdropTemplate" or nil)
local frame = CreateFrame("Frame", "AceGUI30Pullout"..count, UIParent)
local self = {}
self.count = count
self.type = widgetType
self.frame = frame
frame.obj = self
 
 
self.OnAcquire = OnAcquire
self.OnRelease = OnRelease
 
278,38 → 278,38
self.SetScroll = SetScroll
self.MoveScroll = MoveScroll
self.FixScroll = FixScroll
 
 
self.SetMaxHeight = SetMaxHeight
self.GetRightBorderWidth = GetRightBorderWidth
self.GetLeftBorderWidth = GetLeftBorderWidth
 
 
self.items = {}
 
 
self.scrollStatus = {
scrollvalue = 0,
}
 
 
self.maxHeight = defaultMaxHeight
 
 
frame:SetBackdrop(backdrop)
frame:SetBackdropColor(0, 0, 0)
frame:SetFrameStrata("FULLSCREEN_DIALOG")
frame:SetClampedToScreen(true)
frame:SetWidth(defaultWidth)
frame:SetHeight(self.maxHeight)
frame:SetHeight(self.maxHeight)
--frame:SetToplevel(true)
 
 
-- NOTE: The whole scroll frame code is copied from the AceGUI-3.0 widget ScrollFrame
local scrollFrame = CreateFrame("ScrollFrame", nil, frame)
local itemFrame = CreateFrame("Frame", nil, scrollFrame)
 
 
self.scrollFrame = scrollFrame
self.itemFrame = itemFrame
 
 
scrollFrame.obj = self
itemFrame.obj = self
 
local slider = CreateFrame("Slider", "AceGUI30PulloutScrollbar"..count, scrollFrame, BackdropTemplateMixin and "BackdropTemplate" or nil)
 
local slider = CreateFrame("Slider", "AceGUI30PulloutScrollbar"..count, scrollFrame)
slider:SetOrientation("VERTICAL")
slider:SetHitRectInsets(0, 0, -10, 0)
slider:SetBackdrop(sliderBackdrop)
318,7 → 318,7
slider:SetFrameStrata("FULLSCREEN_DIALOG")
self.slider = slider
slider.obj = self
 
 
scrollFrame:SetScrollChild(itemFrame)
scrollFrame:SetPoint("TOPLEFT", frame, "TOPLEFT", 6, -12)
scrollFrame:SetPoint("BOTTOMRIGHT", frame, "BOTTOMRIGHT", -6, 12)
327,46 → 327,46
scrollFrame:SetScript("OnSizeChanged", OnSizeChanged)
scrollFrame:SetToplevel(true)
scrollFrame:SetFrameStrata("FULLSCREEN_DIALOG")
 
 
itemFrame:SetPoint("TOPLEFT", scrollFrame, "TOPLEFT", 0, 0)
itemFrame:SetPoint("TOPRIGHT", scrollFrame, "TOPRIGHT", -12, 0)
itemFrame:SetHeight(400)
itemFrame:SetToplevel(true)
itemFrame:SetFrameStrata("FULLSCREEN_DIALOG")
 
 
slider:SetPoint("TOPLEFT", scrollFrame, "TOPRIGHT", -16, 0)
slider:SetPoint("BOTTOMLEFT", scrollFrame, "BOTTOMRIGHT", -16, 0)
slider:SetScript("OnValueChanged", OnScrollValueChanged)
slider:SetMinMaxValues(0, 1000)
slider:SetValueStep(1)
slider:SetValue(0)
 
 
scrollFrame:Show()
itemFrame:Show()
slider:Hide()
 
 
self:FixScroll()
 
 
AceGUI:RegisterAsWidget(self)
return self
end
 
 
AceGUI:RegisterWidgetType(widgetType, Constructor, widgetVersion)
end
 
do
local widgetType = "Dropdown"
local widgetVersion = 35
 
local widgetVersion = 31
 
--[[ Static data ]]--
 
 
--[[ UI event handler ]]--
 
 
local function Control_OnEnter(this)
this.obj.button:LockHighlight()
this.obj:Fire("OnEnter")
end
 
 
local function Control_OnLeave(this)
this.obj.button:UnlockHighlight()
this.obj:Fire("OnLeave")
378,7 → 378,7
self.pullout:Close()
end
end
 
 
local function Dropdown_TogglePullout(this)
local self = this.obj
PlaySound(856) -- SOUNDKIT.IG_MAINMENU_OPTION_CHECKBOX_ON
393,17 → 393,17
AceGUI:SetFocus(self)
end
end
 
 
local function OnPulloutOpen(this)
local self = this.userdata.obj
local value = self.value
 
 
if not self.multiselect then
for i, item in this:IterateItems() do
item:SetValue(item.userdata.value == value)
end
end
 
 
self.open = true
self:Fire("OnOpened")
end
413,7 → 413,7
self.open = nil
self:Fire("OnClosed")
end
 
 
local function ShowMultiText(self)
local text
for i, widget in self.pullout:IterateItems() do
429,10 → 429,10
end
self:SetText(text)
end
 
 
local function OnItemValueChanged(this, event, checked)
local self = this.userdata.obj
 
 
if self.multiselect then
self:Fire("OnValueChanged", this.userdata.value, checked)
ShowMultiText(self)
443,14 → 443,14
else
this:SetValue(true)
end
if self.open then
if self.open then
self.pullout:Close()
end
end
end
 
 
--[[ Exported methods ]]--
 
 
-- exported, AceGUI callback
local function OnAcquire(self)
local pullout = AceGUI:Create("Dropdown-Pullout")
460,14 → 460,13
pullout:SetCallback("OnOpen", OnPulloutOpen)
self.pullout.frame:SetFrameLevel(self.frame:GetFrameLevel() + 1)
fixlevels(self.pullout.frame, self.pullout.frame:GetChildren())
 
 
self:SetHeight(44)
self:SetWidth(200)
self:SetLabel()
self:SetPulloutWidth(nil)
self.list = {}
end
 
 
-- exported, AceGUI callback
local function OnRelease(self)
if self.open then
475,20 → 474,20
end
AceGUI:Release(self.pullout)
self.pullout = nil
 
 
self:SetText("")
self:SetDisabled(false)
self:SetMultiselect(false)
 
 
self.value = nil
self.list = nil
self.open = nil
self.hasClose = nil
 
 
self.frame:ClearAllPoints()
self.frame:Hide()
end
 
 
-- exported
local function SetDisabled(self, disabled)
self.disabled = disabled
504,19 → 503,19
self.text:SetTextColor(1,1,1)
end
end
 
 
-- exported
local function ClearFocus(self)
if self.open then
self.pullout:Close()
end
end
 
 
-- exported
local function SetText(self, text)
self.text:SetText(text or "")
end
 
 
-- exported
local function SetLabel(self, text)
if text and text ~= "" then
533,18 → 532,20
self.alignoffset = 12
end
end
 
 
-- exported
local function SetValue(self, value)
self:SetText(self.list[value] or "")
if self.list then
self:SetText(self.list[value] or "")
end
self.value = value
end
 
 
-- exported
local function GetValue(self)
return self.value
end
 
 
-- exported
local function SetItemValue(self, item, value)
if not self.multiselect then return end
557,7 → 558,7
end
ShowMultiText(self)
end
 
 
-- exported
local function SetItemDisabled(self, item, disabled)
for i, widget in self.pullout:IterateItems() do
566,7 → 567,7
end
end
end
 
 
local function AddListItem(self, value, text, itemType)
if not itemType then itemType = "Dropdown-Item-Toggle" end
local exists = AceGUI:GetWidgetVersion(itemType)
579,7 → 580,7
item:SetCallback("OnValueChanged", OnItemValueChanged)
self.pullout:AddItem(item)
end
 
 
local function AddCloseButton(self)
if not self.hasClose then
local close = AceGUI:Create("Dropdown-Item-Execute")
588,29 → 589,21
self.hasClose = true
end
end
 
 
-- exported
local sortlist = {}
local function sortTbl(x,y)
local num1, num2 = tonumber(x), tonumber(y)
if num1 and num2 then -- numeric comparison, either two numbers or numeric strings
return num1 < num2
else -- compare everything else tostring'ed
return tostring(x) < tostring(y)
end
end
local function SetList(self, list, order, itemType)
self.list = list or {}
self.list = list
self.pullout:Clear()
self.hasClose = nil
if not list then return end
 
 
if type(order) ~= "table" then
for v in pairs(list) do
sortlist[#sortlist + 1] = v
end
tsort(sortlist, sortTbl)
 
tsort(sortlist)
 
for i, key in ipairs(sortlist) do
AddListItem(self, key, list[key], itemType)
sortlist[i] = nil
625,13 → 618,15
AddCloseButton(self)
end
end
 
 
-- exported
local function AddItem(self, value, text, itemType)
self.list[value] = text
AddListItem(self, value, text, itemType)
if self.list then
self.list[value] = text
AddListItem(self, value, text, itemType)
end
end
 
 
-- exported
local function SetMultiselect(self, multi)
self.multiselect = multi
640,23 → 635,23
AddCloseButton(self)
end
end
 
 
-- exported
local function GetMultiselect(self)
return self.multiselect
end
 
 
local function SetPulloutWidth(self, width)
self.pulloutWidth = width
end
 
 
--[[ Constructor ]]--
 
 
local function Constructor()
local count = AceGUI:GetNextWidgetNum(widgetType)
local frame = CreateFrame("Frame", nil, UIParent)
local dropdown = CreateFrame("Frame", "AceGUI30DropDown"..count, frame, "UIDropDownMenuTemplate")
 
 
local self = {}
self.type = widgetType
self.frame = frame
664,10 → 659,10
self.count = count
frame.obj = self
dropdown.obj = self
 
 
self.OnRelease = OnRelease
self.OnAcquire = OnAcquire
 
 
self.ClearFocus = ClearFocus
 
self.SetText = SetText
682,9 → 677,9
self.SetItemValue = SetItemValue
self.SetItemDisabled = SetItemDisabled
self.SetPulloutWidth = SetPulloutWidth
 
 
self.alignoffset = 26
 
 
frame:SetScript("OnHide",Dropdown_OnHide)
 
dropdown:ClearAllPoints()
695,10 → 690,10
local left = _G[dropdown:GetName() .. "Left"]
local middle = _G[dropdown:GetName() .. "Middle"]
local right = _G[dropdown:GetName() .. "Right"]
 
 
middle:ClearAllPoints()
right:ClearAllPoints()
 
 
middle:SetPoint("LEFT", left, "RIGHT", 0, 0)
middle:SetPoint("RIGHT", right, "LEFT", 0, 0)
right:SetPoint("TOPRIGHT", dropdown, "TOPRIGHT", 0, 17)
709,7 → 704,7
button:SetScript("OnEnter",Control_OnEnter)
button:SetScript("OnLeave",Control_OnLeave)
button:SetScript("OnClick",Dropdown_TogglePullout)
 
 
local button_cover = CreateFrame("BUTTON",nil,self.frame)
self.button_cover = button_cover
button_cover.obj = self
718,14 → 713,14
button_cover:SetScript("OnEnter",Control_OnEnter)
button_cover:SetScript("OnLeave",Control_OnLeave)
button_cover:SetScript("OnClick",Dropdown_TogglePullout)
 
 
local text = _G[dropdown:GetName() .. "Text"]
self.text = text
text.obj = self
text:ClearAllPoints()
text:SetPoint("RIGHT", right, "RIGHT" ,-43, 2)
text:SetPoint("LEFT", left, "LEFT", 25, 2)
 
 
local label = frame:CreateFontString(nil,"OVERLAY","GameFontNormalSmall")
label:SetPoint("TOPLEFT",frame,"TOPLEFT",0,0)
label:SetPoint("TOPRIGHT",frame,"TOPRIGHT",0,0)
737,6 → 732,6
AceGUI:RegisterAsWidget(self)
return self
end
 
 
AceGUI:RegisterWidgetType(widgetType, Constructor, widgetVersion)
end
end
trunk/Libs/AceGUI-3.0/widgets/AceGUIContainer-Window.lua
30,21 → 30,21
local function frameOnClose(this)
this.obj:Fire("OnClose")
end
 
 
local function closeOnClick(this)
PlaySound(799) -- SOUNDKIT.GS_TITLE_OPTION_EXIT
this.obj:Hide()
end
 
 
local function frameOnMouseDown(this)
AceGUI:ClearFocus()
end
 
 
local function titleOnMouseDown(this)
this:GetParent():StartMoving()
AceGUI:ClearFocus()
end
 
 
local function frameOnMouseUp(this)
local frame = this:GetParent()
frame:StopMovingOrSizing()
55,22 → 55,22
status.top = frame:GetTop()
status.left = frame:GetLeft()
end
 
 
local function sizerseOnMouseDown(this)
this:GetParent():StartSizing("BOTTOMRIGHT")
AceGUI:ClearFocus()
end
 
 
local function sizersOnMouseDown(this)
this:GetParent():StartSizing("BOTTOM")
AceGUI:ClearFocus()
end
 
 
local function sizereOnMouseDown(this)
this:GetParent():StartSizing("RIGHT")
AceGUI:ClearFocus()
end
 
 
local function sizerOnMouseUp(this)
this:GetParent():StopMovingOrSizing()
end
78,19 → 78,19
local function SetTitle(self,title)
self.titletext:SetText(title)
end
 
 
local function SetStatusText(self,text)
-- self.statustext:SetText(text)
end
 
 
local function Hide(self)
self.frame:Hide()
end
 
 
local function Show(self)
self.frame:Show()
end
 
 
local function OnAcquire(self)
self.frame:SetParent(UIParent)
self.frame:SetFrameStrata("FULLSCREEN_DIALOG")
98,21 → 98,21
self:EnableResize(true)
self:Show()
end
 
 
local function OnRelease(self)
self.status = nil
for k in pairs(self.localstatus) do
self.localstatus[k] = nil
end
end
 
 
-- called to set an external table to store status in
local function SetStatusTable(self, status)
assert(type(status) == "table")
self.status = status
self:ApplyStatus()
end
 
 
local function ApplyStatus(self)
local status = self.status or self.localstatus
local frame = self.frame
125,7 → 125,7
frame:SetPoint("CENTER",UIParent,"CENTER")
end
end
 
 
local function OnWidthSet(self, width)
local content = self.content
local contentwidth = width - 34
135,8 → 135,8
content:SetWidth(contentwidth)
content.width = contentwidth
end
 
 
 
 
local function OnHeightSet(self, height)
local content = self.content
local contentheight = height - 57
146,19 → 146,19
content:SetHeight(contentheight)
content.height = contentheight
end
 
 
local function EnableResize(self, state)
local func = state and "Show" or "Hide"
self.sizer_se[func](self.sizer_se)
self.sizer_s[func](self.sizer_s)
self.sizer_e[func](self.sizer_e)
end
 
 
local function Constructor()
local frame = CreateFrame("Frame",nil,UIParent)
local self = {}
self.type = "Window"
 
 
self.Hide = Hide
self.Show = Show
self.SetTitle = SetTitle
170,9 → 170,9
self.OnWidthSet = OnWidthSet
self.OnHeightSet = OnHeightSet
self.EnableResize = EnableResize
 
 
self.localstatus = {}
 
 
self.frame = frame
frame.obj = self
frame:SetWidth(700)
183,7 → 183,7
frame:SetResizable(true)
frame:SetFrameStrata("FULLSCREEN_DIALOG")
frame:SetScript("OnMouseDown", frameOnMouseDown)
 
 
frame:SetScript("OnShow",frameOnShow)
frame:SetScript("OnHide",frameOnClose)
frame:SetMinResize(240,240)
193,81 → 193,81
titlebg:SetTexture(251966) -- Interface\\PaperDollInfoFrame\\UI-GearManager-Title-Background
titlebg:SetPoint("TOPLEFT", 9, -6)
titlebg:SetPoint("BOTTOMRIGHT", frame, "TOPRIGHT", -28, -24)
 
 
local dialogbg = frame:CreateTexture(nil, "BACKGROUND")
dialogbg:SetTexture(137056) -- Interface\\Tooltips\\UI-Tooltip-Background
dialogbg:SetPoint("TOPLEFT", 8, -24)
dialogbg:SetPoint("BOTTOMRIGHT", -6, 8)
dialogbg:SetVertexColor(0, 0, 0, .75)
 
 
local topleft = frame:CreateTexture(nil, "BORDER")
topleft:SetTexture(251963) -- Interface\\PaperDollInfoFrame\\UI-GearManager-Border
topleft:SetWidth(64)
topleft:SetHeight(64)
topleft:SetPoint("TOPLEFT")
topleft:SetTexCoord(0.501953125, 0.625, 0, 1)
 
 
local topright = frame:CreateTexture(nil, "BORDER")
topright:SetTexture(251963) -- Interface\\PaperDollInfoFrame\\UI-GearManager-Border
topright:SetWidth(64)
topright:SetHeight(64)
topright:SetPoint("TOPRIGHT")
topright:SetTexCoord(0.625, 0.75, 0, 1)
 
 
local top = frame:CreateTexture(nil, "BORDER")
top:SetTexture(251963) -- Interface\\PaperDollInfoFrame\\UI-GearManager-Border
top:SetHeight(64)
top:SetPoint("TOPLEFT", topleft, "TOPRIGHT")
top:SetPoint("TOPRIGHT", topright, "TOPLEFT")
top:SetTexCoord(0.25, 0.369140625, 0, 1)
 
 
local bottomleft = frame:CreateTexture(nil, "BORDER")
bottomleft:SetTexture(251963) -- Interface\\PaperDollInfoFrame\\UI-GearManager-Border
bottomleft:SetWidth(64)
bottomleft:SetHeight(64)
bottomleft:SetPoint("BOTTOMLEFT")
bottomleft:SetTexCoord(0.751953125, 0.875, 0, 1)
 
 
local bottomright = frame:CreateTexture(nil, "BORDER")
bottomright:SetTexture(251963) -- Interface\\PaperDollInfoFrame\\UI-GearManager-Border
bottomright:SetWidth(64)
bottomright:SetHeight(64)
bottomright:SetPoint("BOTTOMRIGHT")
bottomright:SetTexCoord(0.875, 1, 0, 1)
 
 
local bottom = frame:CreateTexture(nil, "BORDER")
bottom:SetTexture(251963) -- Interface\\PaperDollInfoFrame\\UI-GearManager-Border
bottom:SetHeight(64)
bottom:SetPoint("BOTTOMLEFT", bottomleft, "BOTTOMRIGHT")
bottom:SetPoint("BOTTOMRIGHT", bottomright, "BOTTOMLEFT")
bottom:SetTexCoord(0.376953125, 0.498046875, 0, 1)
 
 
local left = frame:CreateTexture(nil, "BORDER")
left:SetTexture(251963) -- Interface\\PaperDollInfoFrame\\UI-GearManager-Border
left:SetWidth(64)
left:SetPoint("TOPLEFT", topleft, "BOTTOMLEFT")
left:SetPoint("BOTTOMLEFT", bottomleft, "TOPLEFT")
left:SetTexCoord(0.001953125, 0.125, 0, 1)
 
 
local right = frame:CreateTexture(nil, "BORDER")
right:SetTexture(251963) -- Interface\\PaperDollInfoFrame\\UI-GearManager-Border
right:SetWidth(64)
right:SetPoint("TOPRIGHT", topright, "BOTTOMRIGHT")
right:SetPoint("BOTTOMRIGHT", bottomright, "TOPRIGHT")
right:SetTexCoord(0.1171875, 0.2421875, 0, 1)
 
 
local close = CreateFrame("Button", nil, frame, "UIPanelCloseButton")
close:SetPoint("TOPRIGHT", 2, 1)
close:SetScript("OnClick", closeOnClick)
self.closebutton = close
close.obj = self
 
 
local titletext = frame:CreateFontString(nil, "ARTWORK")
titletext:SetFontObject(GameFontNormal)
titletext:SetPoint("TOPLEFT", 12, -8)
titletext:SetPoint("TOPRIGHT", -32, -8)
self.titletext = titletext
 
 
local title = CreateFrame("Button", nil, frame)
title:SetPoint("TOPLEFT", titlebg)
title:SetPoint("BOTTOMRIGHT", titlebg)
275,7 → 275,7
title:SetScript("OnMouseDown",titleOnMouseDown)
title:SetScript("OnMouseUp", frameOnMouseUp)
self.title = title
 
 
local sizer_se = CreateFrame("Frame",nil,frame)
sizer_se:SetPoint("BOTTOMRIGHT",frame,"BOTTOMRIGHT",0,0)
sizer_se:SetWidth(25)
311,7 → 311,7
sizer_s:SetScript("OnMouseDown",sizersOnMouseDown)
sizer_s:SetScript("OnMouseUp", sizerOnMouseUp)
self.sizer_s = sizer_s
 
 
local sizer_e = CreateFrame("Frame",nil,frame)
sizer_e:SetPoint("BOTTOMRIGHT",frame,"BOTTOMRIGHT",0,25)
sizer_e:SetPoint("TOPRIGHT",frame,"TOPRIGHT",0,0)
320,17 → 320,17
sizer_e:SetScript("OnMouseDown",sizereOnMouseDown)
sizer_e:SetScript("OnMouseUp", sizerOnMouseUp)
self.sizer_e = sizer_e
 
 
--Container Support
local content = CreateFrame("Frame",nil,frame)
self.content = content
content.obj = self
content:SetPoint("TOPLEFT",frame,"TOPLEFT",12,-32)
content:SetPoint("BOTTOMRIGHT",frame,"BOTTOMRIGHT",-12,13)
 
 
AceGUI:RegisterAsContainer(self)
return self
return self
end
 
 
AceGUI:RegisterWidgetType(Type,Constructor,Version)
end
trunk/Libs/AceGUI-3.0/widgets/AceGUIContainer-ScrollFrame.lua
40,7 → 40,7
Methods
-------------------------------------------------------------------------------]]
local methods = {
["OnAcquire"] = function(self)
["OnAcquire"] = function(self)
self:SetScroll(0)
self.scrollframe:SetScript("OnUpdate", FixScrollOnUpdate)
end,
77,7 → 77,7
["MoveScroll"] = function(self, value)
local status = self.status or self.localstatus
local height, viewheight = self.scrollframe:GetHeight(), self.content:GetHeight()
 
 
if self.scrollBarShown then
local diff = height - viewheight
local delta = 1
trunk/Libs/AceGUI-3.0/widgets/AceGUIContainer-DropDownGroup.lua
2,7 → 2,7
DropdownGroup Container
Container controlled by a dropdown on the top.
-------------------------------------------------------------------------------]]
local Type, Version = "DropdownGroup", 22
local Type, Version = "DropdownGroup", 21
local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end
 
125,7 → 125,7
dropdown.frame:Show()
dropdown:SetLabel("")
 
local border = CreateFrame("Frame", nil, frame, BackdropTemplateMixin and "BackdropTemplate" or nil)
local border = CreateFrame("Frame", nil, frame)
border:SetPoint("TOPLEFT", 0, -26)
border:SetPoint("BOTTOMRIGHT", 0, 3)
border:SetBackdrop(PaneBackdrop)
150,7 → 150,7
widget[method] = func
end
dropdown.parentgroup = widget
 
 
return AceGUI:RegisterAsContainer(widget)
end
 
trunk/Libs/AceGUI-3.0/widgets/AceGUIContainer-TreeGroup.lua
2,10 → 2,12
TreeGroup Container
Container that uses a tree control to switch between groups.
-------------------------------------------------------------------------------]]
local Type, Version = "TreeGroup", 45
local Type, Version = "TreeGroup", 41
local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end
 
local WoW80 = select(4, GetBuildInfo()) >= 80000
 
-- Lua APIs
local next, pairs, ipairs, assert, type = next, pairs, ipairs, assert, type
local math_min, math_max, floor = math.min, math.max, floor
16,7 → 18,7
 
-- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
-- List them here for Mikk's FindGlobals script
-- GLOBALS: FONT_COLOR_CODE_CLOSE
-- GLOBALS: GameTooltip, FONT_COLOR_CODE_CLOSE
 
-- Recycling functions
local new, del
34,7 → 36,7
function del(t)
for k in pairs(t) do
t[k] = nil
end
end
pool[t] = true
end
end
64,7 → 66,7
local value = treeline.value
local uniquevalue = treeline.uniquevalue
local disabled = treeline.disabled
 
 
button.treeline = treeline
button.value = value
button.uniquevalue = uniquevalue
85,7 → 87,7
button:SetHighlightFontObject("GameFontHighlightSmall")
button.text:SetPoint("LEFT", (icon and 16 or 0) + 8 * level, 2)
end
 
 
if disabled then
button:EnableMouse(false)
button.text:SetText("|cff808080"..text..FONT_COLOR_CODE_CLOSE)
93,20 → 95,20
button.text:SetText(text)
button:EnableMouse(true)
end
 
 
if icon then
button.icon:SetTexture(icon)
button.icon:SetPoint("LEFT", 8 * level, (level == 1) and 0 or 1)
else
button.icon:SetTexture(nil)
end
 
 
if iconCoords then
button.icon:SetTexCoord(unpack(iconCoords))
else
button.icon:SetTexCoord(0, 1, 0, 1)
end
 
 
if canExpand then
if not isExpanded then
toggle:SetNormalTexture(130838) -- Interface\\Buttons\\UI-PlusButton-UP
206,13 → 208,11
self:Fire("OnButtonEnter", frame.uniquevalue, frame)
 
if self.enabletooltips then
local tooltip = AceGUI.tooltip
tooltip:SetOwner(frame, "ANCHOR_NONE")
tooltip:ClearAllPoints()
tooltip:SetPoint("LEFT",frame,"RIGHT")
tooltip:SetText(frame.text:GetText() or "", 1, .82, 0, true)
GameTooltip:SetOwner(frame, "ANCHOR_NONE")
GameTooltip:SetPoint("LEFT",frame,"RIGHT")
GameTooltip:SetText(frame.text:GetText() or "", 1, .82, 0, true)
 
tooltip:Show()
GameTooltip:Show()
end
end
 
221,7 → 221,7
self:Fire("OnButtonLeave", frame.uniquevalue, frame)
 
if self.enabletooltips then
AceGUI.tooltip:Hide()
GameTooltip:Hide()
end
end
 
267,19 → 267,18
local function Dragger_OnMouseUp(frame)
local treeframe = frame:GetParent()
local self = treeframe.obj
local treeframeParent = treeframe:GetParent()
local frame = treeframe:GetParent()
treeframe:StopMovingOrSizing()
--treeframe:SetScript("OnUpdate", nil)
treeframe:SetUserPlaced(false)
--Without this :GetHeight will get stuck on the current height, causing the tree contents to not resize
treeframe:SetHeight(0)
treeframe:ClearAllPoints()
treeframe:SetPoint("TOPLEFT", treeframeParent, "TOPLEFT",0,0)
treeframe:SetPoint("BOTTOMLEFT", treeframeParent, "BOTTOMLEFT",0,0)
 
treeframe:SetPoint("TOPLEFT", frame, "TOPLEFT",0,0)
treeframe:SetPoint("BOTTOMLEFT", frame, "BOTTOMLEFT",0,0)
 
local status = self.status or self.localstatus
status.treewidth = treeframe:GetWidth()
 
 
treeframe.obj:Fire("OnTreeResize",treeframe:GetWidth())
-- recalculate the content width
treeframe.obj:OnWidthSet(status.fullwidth)
364,8 → 363,8
--sets the tree to be displayed
["SetTree"] = function(self, tree, filter)
self.filter = filter
if tree then
assert(type(tree) == "table")
if tree then
assert(type(tree) == "table")
end
self.tree = tree
self:RefreshTree()
373,7 → 372,7
 
["BuildLevel"] = function(self, tree, level, parent)
local groups = (self.status or self.localstatus).groups
 
 
for i, v in ipairs(tree) do
if v.children then
if not self.filter or ShouldDisplayLevel(v.children) then
410,7 → 409,7
local tree = self.tree
 
local treeframe = self.treeframe
 
 
status.scrollToSelection = status.scrollToSelection or scrollToSelection -- needs to be cached in case the control hasn't been drawn yet (code bails out below)
 
self:BuildLevel(tree, 1)
420,13 → 419,14
local maxlines = (floor(((self.treeframe:GetHeight()or 0) - 20 ) / 18))
if maxlines <= 0 then return end
 
if self.frame:GetParent() == UIParent and not fromOnUpdate then
-- workaround for lag spikes on WoW 8.0
if WoW80 and self.frame:GetParent() == UIParent and not fromOnUpdate then
self.frame:SetScript("OnUpdate", FirstFrameUpdate)
return
end
 
local first, last
 
 
scrollToSelection = status.scrollToSelection
status.scrollToSelection = nil
 
502,9 → 502,9
button:Show()
buttonnum = buttonnum + 1
end
 
 
end,
 
 
["SetSelected"] = function(self, value)
local status = self.status or self.localstatus
if status.selected ~= value then
554,16 → 554,16
local treeframe = self.treeframe
local status = self.status or self.localstatus
status.fullwidth = width
 
 
local contentwidth = width - status.treewidth - 20
if contentwidth < 0 then
contentwidth = 0
end
content:SetWidth(contentwidth)
content.width = contentwidth
 
 
local maxtreewidth = math_min(400, width - 50)
 
 
if maxtreewidth > 100 and status.treewidth > maxtreewidth then
self:SetTreeWidth(maxtreewidth, status.treesizable)
end
589,16 → 589,16
treewidth = DEFAULT_TREE_WIDTH
else
resizable = false
treewidth = DEFAULT_TREE_WIDTH
treewidth = DEFAULT_TREE_WIDTH
end
end
self.treeframe:SetWidth(treewidth)
self.dragger:EnableMouse(resizable)
 
 
local status = self.status or self.localstatus
status.treewidth = treewidth
status.treesizable = resizable
 
 
-- recalculate the content width
if status.fullwidth then
self:OnWidthSet(status.fullwidth)
629,7 → 629,7
local DraggerBackdrop = {
bgFile = "Interface\\Tooltips\\UI-Tooltip-Background",
edgeFile = nil,
tile = true, tileSize = 16, edgeSize = 1,
tile = true, tileSize = 16, edgeSize = 0,
insets = { left = 3, right = 3, top = 7, bottom = 7 }
}
 
637,7 → 637,7
local num = AceGUI:GetNextWidgetNum(Type)
local frame = CreateFrame("Frame", nil, UIParent)
 
local treeframe = CreateFrame("Frame", nil, frame, BackdropTemplateMixin and "BackdropTemplate" or nil)
local treeframe = CreateFrame("Frame", nil, frame)
treeframe:SetPoint("TOPLEFT")
treeframe:SetPoint("BOTTOMLEFT")
treeframe:SetWidth(DEFAULT_TREE_WIDTH)
652,7 → 652,7
treeframe:SetScript("OnSizeChanged", Tree_OnSizeChanged)
treeframe:SetScript("OnMouseWheel", Tree_OnMouseWheel)
 
local dragger = CreateFrame("Frame", nil, treeframe, BackdropTemplateMixin and "BackdropTemplate" or nil)
local dragger = CreateFrame("Frame", nil, treeframe)
dragger:SetWidth(8)
dragger:SetPoint("TOP", treeframe, "TOPRIGHT")
dragger:SetPoint("BOTTOM", treeframe, "BOTTOMRIGHT")
677,7 → 677,7
scrollbg:SetAllPoints(scrollbar)
scrollbg:SetColorTexture(0,0,0,0.4)
 
local border = CreateFrame("Frame", nil, frame, BackdropTemplateMixin and "BackdropTemplate" or nil)
local border = CreateFrame("Frame",nil,frame)
border:SetPoint("TOPLEFT", treeframe, "TOPRIGHT")
border:SetPoint("BOTTOMRIGHT")
border:SetBackdrop(PaneBackdrop)
trunk/Libs/AceGUI-3.0/widgets/AceGUIWidget-Button.lua
51,7 → 51,7
self:SetWidth(self.text:GetStringWidth() + 30)
end
end,
 
 
["SetAutoWidth"] = function(self, autoWidth)
self.autoWidth = autoWidth
if self.autoWidth then
trunk/Libs/AceGUI-3.0/widgets/AceGUIWidget-DropDown-Items.lua
1,4 → 1,4
--[[ $Id: AceGUIWidget-DropDown-Items.lua 1202 2019-05-15 23:11:22Z nevcairiel $ ]]--
--[[ $Id: AceGUIWidget-DropDown-Items.lua 1192 2018-07-30 18:03:51Z funkydude $ ]]--
 
local AceGUI = LibStub("AceGUI-3.0")
 
33,7 → 33,7
 
-- ItemBase is the base "class" for all dropdown items.
-- Each item has to use ItemBase.Create(widgetType) to
-- create an initial 'self' value.
-- create an initial 'self' value.
-- ItemBase will add common functions and ui event handlers.
-- Be sure to keep basic usage when you override functions.
 
52,7 → 52,7
self.highlight:Show()
end
self:Fire("OnEnter")
 
 
if self.specialOnEnter then
self.specialOnEnter(self)
end
60,10 → 60,10
 
function ItemBase.Frame_OnLeave(this)
local self = this.obj
 
 
self.highlight:Hide()
self:Fire("OnLeave")
 
 
if self.specialOnLeave then
self.specialOnLeave(self)
end
89,7 → 89,7
-- Do not call this method directly
function ItemBase.SetPullout(self, pullout)
self.pullout = pullout
 
 
self.frame:SetParent(nil)
self.frame:SetParent(pullout.itemFrame)
self.parent = pullout.itemFrame
155,12 → 155,12
self.frame = frame
frame.obj = self
self.type = type
 
 
self.useHighlight = true
 
 
frame:SetHeight(17)
frame:SetFrameStrata("FULLSCREEN_DIALOG")
 
 
local text = frame:CreateFontString(nil,"OVERLAY","GameFontNormalSmall")
text:SetTextColor(1,1,1)
text:SetJustifyH("LEFT")
178,7 → 178,7
highlight:Hide()
self.highlight = highlight
 
local check = frame:CreateTexture("OVERLAY")
local check = frame:CreateTexture("OVERLAY")
check:SetWidth(16)
check:SetHeight(16)
check:SetPoint("LEFT",frame,"LEFT",3,-1)
192,26 → 192,26
sub:SetPoint("RIGHT",frame,"RIGHT",-3,-1)
sub:SetTexture(130940) -- Interface\\ChatFrame\\ChatFrameExpandArrow
sub:Hide()
self.sub = sub
 
self.sub = sub
 
frame:SetScript("OnEnter", ItemBase.Frame_OnEnter)
frame:SetScript("OnLeave", ItemBase.Frame_OnLeave)
 
 
self.OnAcquire = ItemBase.OnAcquire
self.OnRelease = ItemBase.OnRelease
 
 
self.SetPullout = ItemBase.SetPullout
self.GetText = ItemBase.GetText
self.SetText = ItemBase.SetText
self.SetDisabled = ItemBase.SetDisabled
 
 
self.SetPoint = ItemBase.SetPoint
self.Show = ItemBase.Show
self.Hide = ItemBase.Hide
 
 
self.SetOnLeave = ItemBase.SetOnLeave
self.SetOnEnter = ItemBase.SetOnEnter
 
 
return self
end
 
223,20 → 223,20
 
--[[
Template for items:
 
 
-- Item:
--
do
local widgetType = "Dropdown-Item-"
local widgetVersion = 1
 
 
local function Constructor()
local self = ItemBase.Create(widgetType)
 
 
AceGUI:RegisterAsWidget(self)
return self
end
 
 
AceGUI:RegisterWidgetType(widgetType, Constructor, widgetVersion + ItemBase.version)
end
--]]
247,25 → 247,25
do
local widgetType = "Dropdown-Item-Header"
local widgetVersion = 1
 
 
local function OnEnter(this)
local self = this.obj
self:Fire("OnEnter")
 
 
if self.specialOnEnter then
self.specialOnEnter(self)
end
end
 
 
local function OnLeave(this)
local self = this.obj
self:Fire("OnLeave")
 
 
if self.specialOnLeave then
self.specialOnLeave(self)
end
end
 
 
-- exported, override
local function SetDisabled(self, disabled)
ItemBase.SetDisabled(self, disabled)
273,21 → 273,21
self.text:SetTextColor(1, 1, 0)
end
end
 
 
local function Constructor()
local self = ItemBase.Create(widgetType)
 
 
self.SetDisabled = SetDisabled
 
 
self.frame:SetScript("OnEnter", OnEnter)
self.frame:SetScript("OnLeave", OnLeave)
 
 
self.text:SetTextColor(1, 1, 0)
 
 
AceGUI:RegisterAsWidget(self)
return self
end
 
 
AceGUI:RegisterWidgetType(widgetType, Constructor, widgetVersion + ItemBase.version)
end
 
296,7 → 296,7
do
local widgetType = "Dropdown-Item-Execute"
local widgetVersion = 1
 
 
local function Frame_OnClick(this, button)
local self = this.obj
if self.disabled then return end
305,16 → 305,16
self.pullout:Close()
end
end
 
 
local function Constructor()
local self = ItemBase.Create(widgetType)
 
 
self.frame:SetScript("OnClick", Frame_OnClick)
 
 
AceGUI:RegisterAsWidget(self)
return self
end
 
 
AceGUI:RegisterWidgetType(widgetType, Constructor, widgetVersion + ItemBase.version)
end
 
324,7 → 324,7
do
local widgetType = "Dropdown-Item-Toggle"
local widgetVersion = 4
 
 
local function UpdateToggle(self)
if self.value then
self.check:Show()
332,12 → 332,12
self.check:Hide()
end
end
 
 
local function OnRelease(self)
ItemBase.OnRelease(self)
self:SetValue(nil)
end
 
 
local function Frame_OnClick(this, button)
local self = this.obj
if self.disabled then return end
350,31 → 350,31
UpdateToggle(self)
self:Fire("OnValueChanged", self.value)
end
 
 
-- exported
local function SetValue(self, value)
self.value = value
UpdateToggle(self)
end
 
 
-- exported
local function GetValue(self)
return self.value
end
 
 
local function Constructor()
local self = ItemBase.Create(widgetType)
 
 
self.frame:SetScript("OnClick", Frame_OnClick)
 
 
self.SetValue = SetValue
self.GetValue = GetValue
self.OnRelease = OnRelease
 
 
AceGUI:RegisterAsWidget(self)
return self
end
 
 
AceGUI:RegisterWidgetType(widgetType, Constructor, widgetVersion + ItemBase.version)
end
 
384,55 → 384,55
do
local widgetType = "Dropdown-Item-Menu"
local widgetVersion = 2
 
 
local function OnEnter(this)
local self = this.obj
self:Fire("OnEnter")
 
 
if self.specialOnEnter then
self.specialOnEnter(self)
end
 
 
self.highlight:Show()
 
 
if not self.disabled and self.submenu then
self.submenu:Open("TOPLEFT", self.frame, "TOPRIGHT", self.pullout:GetRightBorderWidth(), 0, self.frame:GetFrameLevel() + 100)
end
end
 
 
local function OnHide(this)
local self = this.obj
if self.submenu then
self.submenu:Close()
end
end
 
 
-- exported
local function SetMenu(self, menu)
assert(menu.type == "Dropdown-Pullout")
self.submenu = menu
end
 
 
-- exported
local function CloseMenu(self)
self.submenu:Close()
end
 
 
local function Constructor()
local self = ItemBase.Create(widgetType)
 
 
self.sub:Show()
 
 
self.frame:SetScript("OnEnter", OnEnter)
self.frame:SetScript("OnHide", OnHide)
 
 
self.SetMenu = SetMenu
self.CloseMenu = CloseMenu
 
 
AceGUI:RegisterAsWidget(self)
return self
end
 
 
AceGUI:RegisterWidgetType(widgetType, Constructor, widgetVersion + ItemBase.version)
end
 
441,31 → 441,31
do
local widgetType = "Dropdown-Item-Separator"
local widgetVersion = 2
 
 
-- exported, override
local function SetDisabled(self, disabled)
ItemBase.SetDisabled(self, disabled)
self.useHighlight = false
end
 
 
local function Constructor()
local self = ItemBase.Create(widgetType)
 
 
self.SetDisabled = SetDisabled
 
 
local line = self.frame:CreateTexture(nil, "OVERLAY")
line:SetHeight(1)
line:SetColorTexture(.5, .5, .5)
line:SetPoint("LEFT", self.frame, "LEFT", 10, 0)
line:SetPoint("RIGHT", self.frame, "RIGHT", -10, 0)
 
 
self.text:Hide()
 
 
self.useHighlight = false
 
 
AceGUI:RegisterAsWidget(self)
return self
end
 
 
AceGUI:RegisterWidgetType(widgetType, Constructor, widgetVersion + ItemBase.version)
end
trunk/Libs/AceGUI-3.0/widgets/AceGUIWidget-ColorPicker.lua
1,7 → 1,7
--[[-----------------------------------------------------------------------------
ColorPicker Widget
-------------------------------------------------------------------------------]]
local Type, Version = "ColorPicker", 25
local Type, Version = "ColorPicker", 23
local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end
 
13,7 → 13,7
 
-- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
-- List them here for Mikk's FindGlobals script
-- GLOBALS: ColorPickerFrame, OpacitySliderFrame
-- GLOBALS: ShowUIPanel, HideUIPanel, ColorPickerFrame, OpacitySliderFrame
 
--[[-----------------------------------------------------------------------------
Support functions
47,7 → 47,7
end
 
local function ColorSwatch_OnClick(frame)
ColorPickerFrame:Hide()
HideUIPanel(ColorPickerFrame)
local self = frame.obj
if not self.disabled then
ColorPickerFrame:SetFrameStrata("FULLSCREEN_DIALOG")
77,7 → 77,7
ColorCallback(self, r, g, b, a, true)
end
 
ColorPickerFrame:Show()
ShowUIPanel(ColorPickerFrame)
end
AceGUI:ClearFocus()
end
144,7 → 144,6
colorSwatch:SetPoint("LEFT")
 
local texture = frame:CreateTexture(nil, "BACKGROUND")
colorSwatch.background = texture
texture:SetWidth(16)
texture:SetHeight(16)
texture:SetColorTexture(1, 1, 1)
152,7 → 151,6
texture:Show()
 
local checkers = frame:CreateTexture(nil, "BACKGROUND")
colorSwatch.checkers = checkers
checkers:SetWidth(14)
checkers:SetHeight(14)
checkers:SetTexture(188523) -- Tileset\\Generic\\Checkers
trunk/Libs/AceGUI-3.0/widgets/AceGUIWidget-Label.lua
2,7 → 2,7
Label Widget
Displays text and optionally an icon.
-------------------------------------------------------------------------------]]
local Type, Version = "Label", 27
local Type, Version = "Label", 26
local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end
 
57,12 → 57,12
label:SetWidth(width)
height = label:GetStringHeight()
end
 
 
-- avoid zero-height labels, since they can used as spacers
if not height or height == 0 then
height = 1
end
 
 
self.resizing = true
frame:SetHeight(height)
frame.height = height
113,7 → 113,7
["SetImage"] = function(self, path, ...)
local image = self.image
image:SetTexture(path)
 
 
if image:GetTexture() then
self.imageshown = true
local n = select("#", ...)
130,7 → 130,6
 
["SetFont"] = function(self, font, height, flags)
self.label:SetFont(font, height, flags)
UpdateImageAnchor(self)
end,
 
["SetFontObject"] = function(self, font)
trunk/Libs/AceGUI-3.0/widgets/AceGUIWidget-MultiLineEditBox.lua
1,4 → 1,4
local Type, Version = "MultiLineEditBox", 29
local Type, Version = "MultiLineEditBox", 28
local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end
 
233,7 → 233,7
end
Layout(self)
end,
 
 
["ClearFocus"] = function(self)
self.editBox:ClearFocus()
self.frame:SetScript("OnShow", nil)
253,12 → 253,12
["GetCursorPosition"] = function(self)
return self.editBox:GetCursorPosition()
end,
 
 
["SetCursorPosition"] = function(self, ...)
return self.editBox:SetCursorPosition(...)
end,
 
 
 
 
}
 
--[[-----------------------------------------------------------------------------
273,7 → 273,7
local function Constructor()
local frame = CreateFrame("Frame", nil, UIParent)
frame:Hide()
 
 
local widgetNum = AceGUI:GetNextWidgetNum(Type)
 
local label = frame:CreateFontString(nil, "OVERLAY", "GameFontNormalSmall")
290,14 → 290,14
button:SetText(ACCEPT)
button:SetScript("OnClick", OnClick)
button:Disable()
 
 
local text = button:GetFontString()
text:ClearAllPoints()
text:SetPoint("TOPLEFT", button, "TOPLEFT", 5, -5)
text:SetPoint("BOTTOMRIGHT", button, "BOTTOMRIGHT", -5, 1)
text:SetJustifyV("MIDDLE")
 
local scrollBG = CreateFrame("Frame", nil, frame, BackdropTemplateMixin and "BackdropTemplate" or nil)
local scrollBG = CreateFrame("Frame", nil, frame)
scrollBG:SetBackdrop(backdrop)
scrollBG:SetBackdropColor(0, 0, 0)
scrollBG:SetBackdropBorderColor(0.4, 0.4, 0.4)
339,8 → 339,8
editBox:SetScript("OnTextChanged", OnTextChanged)
editBox:SetScript("OnTextSet", OnTextSet)
editBox:SetScript("OnEditFocusGained", OnEditFocusGained)
 
 
 
scrollFrame:SetScrollChild(editBox)
 
local widget = {
trunk/Libs/AceGUI-3.0/AceGUI-3.0.lua
1,6 → 1,6
--- **AceGUI-3.0** provides access to numerous widgets which can be used to create GUIs.
-- AceGUI is used by AceConfigDialog to create the option GUIs, but you can use it by itself
-- to create any custom GUI. There are more extensive examples in the test suite in the Ace3
-- to create any custom GUI. There are more extensive examples in the test suite in the Ace3
-- stand-alone distribution.
--
-- **Note**: When using AceGUI-3.0 directly, please do not modify the frames of the widgets directly,
24,8 → 24,8
-- f:AddChild(btn)
-- @class file
-- @name AceGUI-3.0
-- @release $Id: AceGUI-3.0.lua 1231 2020-04-14 22:20:36Z nevcairiel $
local ACEGUI_MAJOR, ACEGUI_MINOR = "AceGUI-3.0", 41
-- @release $Id: AceGUI-3.0.lua 1193 2018-08-02 12:24:37Z funkydude $
local ACEGUI_MAJOR, ACEGUI_MINOR = "AceGUI-3.0", 36
local AceGUI, oldminor = LibStub:NewLibrary(ACEGUI_MAJOR, ACEGUI_MINOR)
 
if not AceGUI then return end -- No upgrade needed
51,8 → 51,7
AceGUI.WidgetBase = AceGUI.WidgetBase or {}
AceGUI.WidgetContainerBase = AceGUI.WidgetContainerBase or {}
AceGUI.WidgetVersions = AceGUI.WidgetVersions or {}
AceGUI.tooltip = AceGUI.tooltip or CreateFrame("GameTooltip", "AceGUITooltip", UIParent, "GameTooltipTemplate")
 
 
-- local upvalues
local WidgetRegistry = AceGUI.WidgetRegistry
local LayoutRegistry = AceGUI.LayoutRegistry
80,7 → 79,7
-- Internal Storage of the objects changed, from an array table
-- to a hash table, and additionally we introduced versioning on
-- the widgets which would discard all widgets from a pre-29 version
-- anyway, so we just clear the storage now, and don't try to
-- anyway, so we just clear the storage now, and don't try to
-- convert the storage tables to the new format.
-- This should generally not cause *many* widgets to end up in trash,
-- since once dialogs are opened, all addons should be loaded already
90,7 → 89,7
if oldminor and oldminor < 29 and AceGUI.objPools then
AceGUI.objPools = nil
end
 
 
AceGUI.objPools = AceGUI.objPools or {}
local objPools = AceGUI.objPools
--Returns a new instance, if none are available either returns a new table or calls the given contructor
98,11 → 97,11
if not WidgetRegistry[type] then
error("Attempt to instantiate unknown widget type", 2)
end
 
 
if not objPools[type] then
objPools[type] = {}
end
 
 
local newObj = next(objPools[type])
if not newObj then
newObj = WidgetRegistry[type]()
152,12 → 151,12
widget.OnAcquire = widget.Aquire
widget.Aquire = nil
end
 
 
if rawget(widget, "Release") then
widget.OnRelease = rawget(widget, "Release")
widget.OnRelease = rawget(widget, "Release")
widget.Release = nil
end
 
 
if widget.OnAcquire then
widget:OnAcquire()
else
176,10 → 175,7
-- If this widget is a Container-Widget, all of its Child-Widgets will be releases as well.
-- @param widget The widget to release
function AceGUI:Release(widget)
if widget.isQueuedForRelease then return end
widget.isQueuedForRelease = true
safecall(widget.PauseLayout, widget)
widget.frame:Hide()
widget:Fire("OnRelease")
safecall(widget.ReleaseChildren, widget)
 
208,26 → 204,9
widget.content.width = nil
widget.content.height = nil
end
widget.isQueuedForRelease = nil
delWidget(widget, widget.type)
end
 
--- Check if a widget is currently in the process of being released
-- This function check if this widget, or any of its parents (in which case it'll be released shortly as well)
-- are currently being released. This allows addon to handle any callbacks accordingly.
-- @param widget The widget to check
function AceGUI:IsReleasing(widget)
if widget.isQueuedForRelease then
return true
end
 
if widget.parent and widget.parent.AceGUIWidgetVersion then
return AceGUI:IsReleasing(widget.parent)
end
 
return false
end
 
-----------
-- Focus --
-----------
259,18 → 238,18
--[[
Widgets must provide the following functions
OnAcquire() - Called when the object is acquired, should set everything to a default hidden state
 
 
And the following members
frame - the frame or derivitive object that will be treated as the widget for size and anchoring purposes
type - the type of the object, same as the name given to :RegisterWidget()
 
 
Widgets contain a table called userdata, this is a safe place to store data associated with the wigdet
It will be cleared automatically when a widget is released
Placing values directly into a widget object should be avoided
 
 
If the Widget can act as a container for other Widgets the following
content - frame or derivitive that children will be anchored to
 
 
The Widget can supply the following Optional Members
:OnRelease() - Called when the object is Released, should remove any additional anchors and clear any data
:OnWidthSet(width) - Called when the width of the widget is changed
286,21 → 265,21
-- Widget Base Template --
--------------------------
do
local WidgetBase = AceGUI.WidgetBase
 
local WidgetBase = AceGUI.WidgetBase
 
WidgetBase.SetParent = function(self, parent)
local frame = self.frame
frame:SetParent(nil)
frame:SetParent(parent.content)
self.parent = parent
end
 
 
WidgetBase.SetCallback = function(self, name, func)
if type(func) == "function" then
self.events[name] = func
end
end
 
 
WidgetBase.Fire = function(self, name, ...)
if self.events[name] then
local success, ret = safecall(self.events[name], self, name, ...)
309,7 → 288,7
end
end
end
 
 
WidgetBase.SetWidth = function(self, width)
self.frame:SetWidth(width)
self.frame.width = width
317,7 → 296,7
self:OnWidthSet(width)
end
end
 
 
WidgetBase.SetRelativeWidth = function(self, width)
if width <= 0 or width > 1 then
error(":SetRelativeWidth(width): Invalid relative width.", 2)
325,7 → 304,7
self.relWidth = width
self.width = "relative"
end
 
 
WidgetBase.SetHeight = function(self, height)
self.frame:SetHeight(height)
self.frame.height = height
333,7 → 312,7
self:OnHeightSet(height)
end
end
 
 
--[[ WidgetBase.SetRelativeHeight = function(self, height)
if height <= 0 or height > 1 then
error(":SetRelativeHeight(height): Invalid relative height.", 2)
345,51 → 324,47
WidgetBase.IsVisible = function(self)
return self.frame:IsVisible()
end
 
 
WidgetBase.IsShown= function(self)
return self.frame:IsShown()
end
 
 
WidgetBase.Release = function(self)
AceGUI:Release(self)
end
 
WidgetBase.IsReleasing = function(self)
return AceGUI:IsReleasing(self)
end
 
 
WidgetBase.SetPoint = function(self, ...)
return self.frame:SetPoint(...)
end
 
 
WidgetBase.ClearAllPoints = function(self)
return self.frame:ClearAllPoints()
end
 
 
WidgetBase.GetNumPoints = function(self)
return self.frame:GetNumPoints()
end
 
 
WidgetBase.GetPoint = function(self, ...)
return self.frame:GetPoint(...)
end
 
end
 
WidgetBase.GetUserDataTable = function(self)
return self.userdata
end
 
 
WidgetBase.SetUserData = function(self, key, value)
self.userdata[key] = value
end
 
 
WidgetBase.GetUserData = function(self, key)
return self.userdata[key]
end
 
 
WidgetBase.IsFullHeight = function(self)
return self.height == "fill"
end
 
 
WidgetBase.SetFullHeight = function(self, isFull)
if isFull then
self.height = "fill"
397,11 → 372,11
self.height = nil
end
end
 
 
WidgetBase.IsFullWidth = function(self)
return self.width == "fill"
end
 
 
WidgetBase.SetFullWidth = function(self, isFull)
if isFull then
self.width = "fill"
409,29 → 384,29
self.width = nil
end
end
 
 
-- local function LayoutOnUpdate(this)
-- this:SetScript("OnUpdate",nil)
-- this.obj:PerformLayout()
-- end
 
 
local WidgetContainerBase = AceGUI.WidgetContainerBase
 
 
WidgetContainerBase.PauseLayout = function(self)
self.LayoutPaused = true
end
 
 
WidgetContainerBase.ResumeLayout = function(self)
self.LayoutPaused = nil
end
 
 
WidgetContainerBase.PerformLayout = function(self)
if self.LayoutPaused then
return
end
safecall(self.LayoutFunc, self.content, self.children)
end
 
 
--call this function to layout, makes sure layed out objects get a frame to get sizes etc
WidgetContainerBase.DoLayout = function(self)
self:PerformLayout()
439,7 → 414,7
-- self.frame:SetScript("OnUpdate", LayoutOnUpdate)
-- end
end
 
 
WidgetContainerBase.AddChild = function(self, child, beforeWidget)
if beforeWidget then
local siblingIndex = 1
447,7 → 422,7
if widget == beforeWidget then
break
end
siblingIndex = siblingIndex + 1
siblingIndex = siblingIndex + 1
end
tinsert(self.children, siblingIndex, child)
else
457,7 → 432,7
child.frame:Show()
self:DoLayout()
end
 
 
WidgetContainerBase.AddChildren = function(self, ...)
for i = 1, select("#", ...) do
local child = select(i, ...)
467,7 → 442,7
end
self:DoLayout()
end
 
 
WidgetContainerBase.ReleaseChildren = function(self)
local children = self.children
for i = 1,#children do
475,7 → 450,7
children[i] = nil
end
end
 
 
WidgetContainerBase.SetLayout = function(self, Layout)
self.LayoutFunc = AceGUI:GetLayout(Layout)
end
499,7 → 474,7
end
end
end
 
 
local function ContentResize(this)
if this:GetWidth() and this:GetHeight() then
this.width = this:GetWidth()
511,7 → 486,7
setmetatable(WidgetContainerBase, {__index=WidgetBase})
 
--One of these function should be called on each Widget Instance as part of its creation process
 
 
--- Register a widget-class as a container for newly created widgets.
-- @param widget The widget class
function AceGUI:RegisterAsContainer(widget)
527,7 → 502,7
widget:SetLayout("List")
return widget
end
 
 
--- Register a widget-class as a widget.
-- @param widget The widget class
function AceGUI:RegisterAsWidget(widget)
554,11 → 529,11
-- @param Version The version of the widget
function AceGUI:RegisterWidgetType(Name, Constructor, Version)
assert(type(Constructor) == "function")
assert(type(Version) == "number")
 
assert(type(Version) == "number")
 
local oldVersion = WidgetVersions[Name]
if oldVersion and oldVersion >= Version then return end
 
 
WidgetVersions[Name] = Version
WidgetRegistry[Name] = Constructor
end
627,7 → 602,7
local width = content.width or content:GetWidth() or 0
for i = 1, #children do
local child = children[i]
 
 
local frame = child.frame
frame:ClearAllPoints()
frame:Show()
636,22 → 611,22
else
frame:SetPoint("TOPLEFT", children[i-1].frame, "BOTTOMLEFT")
end
 
 
if child.width == "fill" then
child:SetWidth(width)
frame:SetPoint("RIGHT", content)
 
 
if child.DoLayout then
child:DoLayout()
end
elseif child.width == "relative" then
child:SetWidth(width * child.relWidth)
 
 
if child.DoLayout then
child:DoLayout()
end
end
 
 
height = height + (frame.height or frame:GetHeight() or 0)
end
safecall(content.obj.LayoutFinished, content.obj, nil, height)
663,7 → 638,6
if children[1] then
children[1]:SetWidth(content:GetWidth() or 0)
children[1]:SetHeight(content:GetHeight() or 0)
children[1].frame:ClearAllPoints()
children[1].frame:SetAllPoints(content)
children[1].frame:Show()
safecall(content.obj.LayoutFinished, content.obj, nil, children[1].frame:GetHeight())
687,17 → 661,17
--height of the current row
local rowheight = 0
local rowoffset = 0
 
 
local width = content.width or content:GetWidth() or 0
 
 
--control at the start of the row
local rowstart
local rowstartoffset
local isfullheight
 
 
local frameoffset
local lastframeoffset
local oversize
local oversize
for i = 1, #children do
local child = children[i]
oversize = nil
705,17 → 679,17
local frameheight = frame.height or frame:GetHeight() or 0
local framewidth = frame.width or frame:GetWidth() or 0
lastframeoffset = frameoffset
-- HACK: Why did we set a frameoffset of (frameheight / 2) ?
-- HACK: Why did we set a frameoffset of (frameheight / 2) ?
-- That was moving all widgets half the widgets size down, is that intended?
-- Actually, it seems to be neccessary for many cases, we'll leave it in for now.
-- If widgets seem to anchor weirdly with this, provide a valid alignoffset for them.
-- TODO: Investigate moar!
frameoffset = child.alignoffset or (frameheight / 2)
 
 
if child.width == "relative" then
framewidth = width * child.relWidth
end
 
 
frame:Show()
frame:ClearAllPoints()
if i == 1 then
754,11 → 728,11
else
--handles cases where the new height is higher than either control because of the offsets
--math.max(rowheight-rowoffset+frameoffset, frameheight-frameoffset+rowoffset)
 
 
--offset is always the larger of the two offsets
rowoffset = math_max(rowoffset, frameoffset)
rowheight = math_max(rowheight, rowoffset + (frameheight / 2))
 
 
frame:SetPoint("TOPLEFT", children[i-1].frame, "TOPRIGHT", 0, frameoffset - lastframeoffset)
usedwidth = framewidth + usedwidth
end
767,11 → 741,11
if child.width == "fill" then
safelayoutcall(child, "SetWidth", width)
frame:SetPoint("RIGHT", content)
 
 
usedwidth = 0
rowstart = frame
rowstartoffset = frameoffset
 
 
if child.DoLayout then
child:DoLayout()
end
780,7 → 754,7
rowstartoffset = rowoffset
elseif child.width == "relative" then
safelayoutcall(child, "SetWidth", width * child.relWidth)
 
 
if child.DoLayout then
child:DoLayout()
end
789,20 → 763,20
frame:SetPoint("RIGHT", content)
end
end
 
 
if child.height == "fill" then
frame:SetPoint("BOTTOM", content)
isfullheight = true
end
end
 
 
--anchor the last row, if its full height needs a special case since its height has just been changed by the anchor
if isfullheight then
rowstart:SetPoint("TOPLEFT", content, "TOPLEFT", 0, -height)
elseif rowstart then
rowstart:SetPoint("TOPLEFT", content, "TOPLEFT", 0, -(height + (rowoffset - rowstartoffset) + 3))
end
 
 
height = height + rowheight + 3
safecall(content.obj.LayoutFinished, content.obj, nil, height)
end)
866,7 → 840,7
local spaceH = tableObj.spaceH or tableObj.space or 0
local spaceV = tableObj.spaceV or tableObj.space or 0
local totalH = (content:GetWidth() or content.width or 0) - spaceH * (#cols - 1)
 
 
-- We need to reuse these because layout events can come in very frequently
local layoutCache = obj:GetUserData("layoutCache")
if not layoutCache then
874,7 → 848,7
obj:SetUserData("layoutCache", layoutCache)
end
local t, laneH, laneV, rowspans, rowStart, colStart = unpack(layoutCache)
 
 
-- Create the grid
local n, slotFound = 0
for i,child in ipairs(children) do
939,7 → 913,7
local f = child.frame
f:ClearAllPoints()
local childH = f:GetWidth() or 0
 
 
laneH[col] = max(laneH[col], childH - GetCellDimension("H", laneH, colStart[child], col - 1, spaceH))
end
end
973,7 → 947,7
local cellObj = child:GetUserData("cell")
local offsetH = GetCellDimension("H", laneH, 1, colStart[child] - 1, spaceH) + (colStart[child] == 1 and 0 or spaceH)
local cellH = GetCellDimension("H", laneH, colStart[child], col, spaceH)
 
 
local f = child.frame
f:ClearAllPoints()
local childH = f:GetWidth() or 0
983,7 → 957,7
if child:IsFullWidth() or alignFn == "fill" or childH > cellH then
f:SetPoint("RIGHT", content, "LEFT", offsetH + align + cellH, 0)
end
 
 
if child.DoLayout then
child:DoLayout()
end
1002,7 → 976,7
local cellObj = child:GetUserData("cell")
local offsetV = GetCellDimension("V", laneV, 1, rowStart[child] - 1, spaceV) + (rowStart[child] == 1 and 0 or spaceV)
local cellV = GetCellDimension("V", laneV, rowStart[child], row, spaceV)
 
 
local f = child.frame
local childV = f:GetHeight() or 0
 
1017,7 → 991,7
 
-- Calculate total height
local totalV = GetCellDimension("V", laneV, 1, #laneV, spaceV)
 
 
-- Cleanup
for _,v in pairs(layoutCache) do wipe(v) end
 
trunk/Libs/AceAddon-3.0/AceAddon-3.0.lua
6,31 → 6,31
-- * **OnEnable** which gets called during the PLAYER_LOGIN event, when most of the data provided by the game is already present.
-- * **OnDisable**, which is only called when your addon is manually being disabled.
-- @usage
-- -- A small (but complete) addon, that doesn't do anything,
-- -- A small (but complete) addon, that doesn't do anything,
-- -- but shows usage of the callbacks.
-- local MyAddon = LibStub("AceAddon-3.0"):NewAddon("MyAddon")
--
--
-- function MyAddon:OnInitialize()
-- -- do init tasks here, like loading the Saved Variables,
-- -- do init tasks here, like loading the Saved Variables,
-- -- or setting up slash commands.
-- end
--
--
-- function MyAddon:OnEnable()
-- -- Do more initialization here, that really enables the use of your addon.
-- -- Register Events, Hook functions, Create Frames, Get information from
-- -- Register Events, Hook functions, Create Frames, Get information from
-- -- the game that wasn't available in OnInitialize
-- end
--
-- function MyAddon:OnDisable()
-- -- Unhook, Unregister Events, Hide frames that you created.
-- -- You would probably only use an OnDisable if you want to
-- -- You would probably only use an OnDisable if you want to
-- -- build a "standby" mode, or be able to toggle modules on/off.
-- end
-- @class file
-- @name AceAddon-3.0.lua
-- @release $Id: AceAddon-3.0.lua 1238 2020-08-28 16:18:42Z nevcairiel $
-- @release $Id: AceAddon-3.0.lua 1184 2018-07-21 14:13:14Z nevcairiel $
 
local MAJOR, MINOR = "AceAddon-3.0", 13
local MAJOR, MINOR = "AceAddon-3.0", 12
local AceAddon, oldminor = LibStub:NewLibrary(MAJOR, MINOR)
 
if not AceAddon then return end -- No Upgrade needed.
75,7 → 75,7
local Enable, Disable, EnableModule, DisableModule, Embed, NewModule, GetModule, GetName, SetDefaultModuleState, SetDefaultModuleLibraries, SetEnabledState, SetDefaultModulePrototype
 
-- used in the addon metatable
local function addontostring( self ) return self.name end
local function addontostring( self ) return self.name end
 
-- Check if the addon is queued for initialization
local function queuedForInitialization(addon)
88,14 → 88,14
end
 
--- Create a new AceAddon-3.0 addon.
-- Any libraries you specified will be embeded, and the addon will be scheduled for
-- Any libraries you specified will be embeded, and the addon will be scheduled for
-- its OnInitialize and OnEnable callbacks.
-- The final addon object, with all libraries embeded, will be returned.
-- @paramsig [object ,]name[, lib, ...]
-- @param object Table to use as a base for the addon (optional)
-- @param name Name of the addon object to create
-- @param lib List of libraries to embed into the addon
-- @usage
-- @usage
-- -- Create a simple addon object
-- MyAddon = LibStub("AceAddon-3.0"):NewAddon("MyAddon", "AceEvent-3.0")
--
115,10 → 115,10
if type(name)~="string" then
error(("Usage: NewAddon([object,] name, [lib, lib, lib, ...]): 'name' - string expected got '%s'."):format(type(name)), 2)
end
if self.addons[name] then
if self.addons[name] then
error(("Usage: NewAddon([object,] name, [lib, lib, lib, ...]): 'name' - Addon '%s' already exists."):format(name), 2)
end
 
 
object = object or {}
object.name = name
 
128,7 → 128,7
for k, v in pairs(oldmeta) do addonmeta[k] = v end
end
addonmeta.__tostring = addontostring
 
 
setmetatable( object, addonmeta )
self.addons[name] = object
object.modules = {}
136,7 → 136,7
object.defaultModuleLibraries = {}
Embed( object ) -- embed NewModule, GetModule methods
self:EmbedLibraries(object, select(i,...))
 
 
-- add to queue of addons to be initialized upon ADDON_LOADED
tinsert(self.initializequeue, object)
return object
147,7 → 147,7
-- Throws an error if the addon object cannot be found (except if silent is set).
-- @param name unique name of the addon object
-- @param silent if true, the addon is optional, silently return nil if its not found
-- @usage
-- @usage
-- -- Get the Addon
-- MyAddon = LibStub("AceAddon-3.0"):GetAddon("MyAddon")
function AceAddon:GetAddon(name, silent)
202,7 → 202,7
-- @paramsig name[, silent]
-- @param name unique name of the module
-- @param silent if true, the module is optional, silently return nil if its not found (optional)
-- @usage
-- @usage
-- -- Get the Addon
-- MyAddon = LibStub("AceAddon-3.0"):GetAddon("MyAddon")
-- -- Get the Module
225,23 → 225,23
-- @param name unique name of the module
-- @param prototype object to derive this module from, methods and values from this table will be mixed into the module (optional)
-- @param lib List of libraries to embed into the addon
-- @usage
-- @usage
-- -- Create a module with some embeded libraries
-- MyModule = MyAddon:NewModule("MyModule", "AceEvent-3.0", "AceHook-3.0")
--
--
-- -- Create a module with a prototype
-- local prototype = { OnEnable = function(self) print("OnEnable called!") end }
-- MyModule = MyAddon:NewModule("MyModule", prototype, "AceEvent-3.0", "AceHook-3.0")
function NewModule(self, name, prototype, ...)
if type(name) ~= "string" then error(("Usage: NewModule(name, [prototype, [lib, lib, lib, ...]): 'name' - string expected got '%s'."):format(type(name)), 2) end
if type(prototype) ~= "string" and type(prototype) ~= "table" and type(prototype) ~= "nil" then error(("Usage: NewModule(name, [prototype, [lib, lib, lib, ...]): 'prototype' - table (prototype), string (lib) or nil expected got '%s'."):format(type(prototype)), 2) end
 
 
if self.modules[name] then error(("Usage: NewModule(name, [prototype, [lib, lib, lib, ...]): 'name' - Module '%s' already exists."):format(name), 2) end
 
 
-- modules are basically addons. We treat them as such. They will be added to the initializequeue properly as well.
-- NewModule can only be called after the parent addon is present thus the modules will be initialized after their parent is.
local module = AceAddon:NewAddon(fmt("%s_%s", self.name or tostring(self), name))
 
 
module.IsModule = IsModuleTrue
module:SetEnabledState(self.defaultModuleState)
module.moduleName = name
256,24 → 256,24
if not prototype or type(prototype) == "string" then
prototype = self.defaultModulePrototype or nil
end
 
 
if type(prototype) == "table" then
local mt = getmetatable(module)
mt.__index = prototype
setmetatable(module, mt) -- More of a Base class type feel.
end
 
 
safecall(self.OnModuleCreated, self, module) -- Was in Ace2 and I think it could be a cool thing to have handy.
self.modules[name] = module
tinsert(self.orderedModules, module)
 
 
return module
end
 
--- Returns the real name of the addon or module, without any prefix.
-- @name //addon//:GetName
-- @paramsig
-- @usage
-- @paramsig
-- @usage
-- print(MyAddon:GetName())
-- -- prints "MyAddon"
function GetName(self)
285,8 → 285,8
-- and enabling all modules of the addon (unless explicitly disabled).\\
-- :Enable() also sets the internal `enableState` variable to true
-- @name //addon//:Enable
-- @paramsig
-- @usage
-- @paramsig
-- @usage
-- -- Enable MyModule
-- MyAddon = LibStub("AceAddon-3.0"):GetAddon("MyAddon")
-- MyModule = MyAddon:GetModule("MyModule")
306,8 → 306,8
-- and disabling all modules of the addon.\\
-- :Disable() also sets the internal `enableState` variable to false
-- @name //addon//:Disable
-- @paramsig
-- @usage
-- @paramsig
-- @usage
-- -- Disable MyAddon
-- MyAddon = LibStub("AceAddon-3.0"):GetAddon("MyAddon")
-- MyAddon:Disable()
320,7 → 320,7
-- Short-hand function that retrieves the module via `:GetModule` and calls `:Enable` on the module object.
-- @name //addon//:EnableModule
-- @paramsig name
-- @usage
-- @usage
-- -- Enable MyModule using :GetModule
-- MyAddon = LibStub("AceAddon-3.0"):GetAddon("MyAddon")
-- MyModule = MyAddon:GetModule("MyModule")
338,7 → 338,7
-- Short-hand function that retrieves the module via `:GetModule` and calls `:Disable` on the module object.
-- @name //addon//:DisableModule
-- @paramsig name
-- @usage
-- @usage
-- -- Disable MyModule using :GetModule
-- MyAddon = LibStub("AceAddon-3.0"):GetAddon("MyAddon")
-- MyModule = MyAddon:GetModule("MyModule")
357,7 → 357,7
-- @name //addon//:SetDefaultModuleLibraries
-- @paramsig lib[, lib, ...]
-- @param lib List of libraries to embed into the addon
-- @usage
-- @usage
-- -- Create the addon object
-- MyAddon = LibStub("AceAddon-3.0"):NewAddon("MyAddon")
-- -- Configure default libraries for modules (all modules need AceEvent-3.0)
376,7 → 376,7
-- @name //addon//:SetDefaultModuleState
-- @paramsig state
-- @param state Default state for new modules, true for enabled, false for disabled
-- @usage
-- @usage
-- -- Create the addon object
-- MyAddon = LibStub("AceAddon-3.0"):NewAddon("MyAddon")
-- -- Set the default state to "disabled"
396,7 → 396,7
-- @name //addon//:SetDefaultModulePrototype
-- @paramsig prototype
-- @param prototype Default prototype for the new modules (table)
-- @usage
-- @usage
-- -- Define a prototype
-- local prototype = { OnEnable = function(self) print("OnEnable called!") end }
-- -- Set the default prototype
428,8 → 428,8
 
--- Return an iterator of all modules associated to the addon.
-- @name //addon//:IterateModules
-- @paramsig
-- @usage
-- @paramsig
-- @usage
-- -- Enable all modules
-- for name, module in MyAddon:IterateModules() do
-- module:Enable()
438,13 → 438,13
 
-- Returns an iterator of all embeds in the addon
-- @name //addon//:IterateEmbeds
-- @paramsig
-- @paramsig
local function IterateEmbeds(self) return pairs(AceAddon.embeds[self]) end
 
--- Query the enabledState of an addon.
-- @name //addon//:IsEnabled
-- @paramsig
-- @usage
-- @paramsig
-- @usage
-- if MyAddon:IsEnabled() then
-- MyAddon:Disable()
-- end
489,20 → 489,20
 
-- - Initialize the addon after creation.
-- This function is only used internally during the ADDON_LOADED event
-- It will call the **OnInitialize** function on the addon object (if present),
-- It will call the **OnInitialize** function on the addon object (if present),
-- and the **OnEmbedInitialize** function on all embeded libraries.
--
--
-- **Note:** Do not call this function manually, unless you're absolutely sure that you know what you are doing.
-- @param addon addon object to intialize
function AceAddon:InitializeAddon(addon)
safecall(addon.OnInitialize, addon)
 
 
local embeds = self.embeds[addon]
for i = 1, #embeds do
local lib = LibStub:GetLibrary(embeds[i], true)
if lib then safecall(lib.OnEmbedInitialize, lib, addon) end
end
 
 
-- we don't call InitializeAddon on modules specifically, this is handled
-- from the event handler and only done _once_
end
510,7 → 510,7
-- - Enable the addon after creation.
-- Note: This function is only used internally during the PLAYER_LOGIN event, or during ADDON_LOADED,
-- if IsLoggedIn() already returns true at that point, e.g. for LoD Addons.
-- It will call the **OnEnable** function on the addon object (if present),
-- It will call the **OnEnable** function on the addon object (if present),
-- and the **OnEmbedEnable** function on all embeded libraries.\\
-- This function does not toggle the enable state of the addon itself, and will return early if the addon is disabled.
--
520,12 → 520,12
function AceAddon:EnableAddon(addon)
if type(addon) == "string" then addon = AceAddon:GetAddon(addon) end
if self.statuses[addon.name] or not addon.enabledState then return false end
 
 
-- set the statuses first, before calling the OnEnable. this allows for Disabling of the addon in OnEnable.
self.statuses[addon.name] = true
 
 
safecall(addon.OnEnable, addon)
 
 
-- make sure we're still enabled before continueing
if self.statuses[addon.name] then
local embeds = self.embeds[addon]
533,7 → 533,7
local lib = LibStub:GetLibrary(embeds[i], true)
if lib then safecall(lib.OnEmbedEnable, lib, addon) end
end
 
 
-- enable possible modules.
local modules = addon.orderedModules
for i = 1, #modules do
545,24 → 545,24
 
-- - Disable the addon
-- Note: This function is only used internally.
-- It will call the **OnDisable** function on the addon object (if present),
-- It will call the **OnDisable** function on the addon object (if present),
-- and the **OnEmbedDisable** function on all embeded libraries.\\
-- This function does not toggle the enable state of the addon itself, and will return early if the addon is still enabled.
--
-- **Note:** Do not call this function manually, unless you're absolutely sure that you know what you are doing.
-- **Note:** Do not call this function manually, unless you're absolutely sure that you know what you are doing.
-- Use :Disable on the addon itself instead.
-- @param addon addon object to enable
function AceAddon:DisableAddon(addon)
if type(addon) == "string" then addon = AceAddon:GetAddon(addon) end
if not self.statuses[addon.name] then return false end
 
 
-- set statuses first before calling OnDisable, this allows for aborting the disable in OnDisable.
self.statuses[addon.name] = false
 
 
safecall( addon.OnDisable, addon )
 
 
-- make sure we're still disabling...
if not self.statuses[addon.name] then
if not self.statuses[addon.name] then
local embeds = self.embeds[addon]
for i = 1, #embeds do
local lib = LibStub:GetLibrary(embeds[i], true)
574,12 → 574,12
self:DisableAddon(modules[i])
end
end
 
 
return not self.statuses[addon.name] -- return true if we're disabled
end
 
--- Get an iterator over all registered addons.
-- @usage
-- @usage
-- -- Print a list of all installed AceAddon's
-- for name, addon in AceAddon:IterateAddons() do
-- print("Addon: " .. name)
587,7 → 587,7
function AceAddon:IterateAddons() return pairs(self.addons) end
 
--- Get an iterator over the internal status registry.
-- @usage
-- @usage
-- -- Print a list of all enabled addons
-- for name, status in AceAddon:IterateAddonStatus() do
-- if status then
601,20 → 601,10
function AceAddon:IterateEmbedsOnAddon(addon) return pairs(self.embeds[addon]) end
function AceAddon:IterateModulesOfAddon(addon) return pairs(addon.modules) end
 
-- Blizzard AddOns which can load very early in the loading process and mess with Ace3 addon loading
local BlizzardEarlyLoadAddons = {
Blizzard_DebugTools = true,
Blizzard_TimeManager = true,
Blizzard_BattlefieldMap = true,
Blizzard_MapCanvas = true,
Blizzard_SharedMapDataProviders = true,
Blizzard_CombatLog = true,
}
 
-- Event Handling
local function onEvent(this, event, arg1)
-- 2020-08-28 nevcairiel - ignore the load event of Blizzard addons which occur early in the loading process
if (event == "ADDON_LOADED" and (arg1 == nil or not BlizzardEarlyLoadAddons[arg1])) or event == "PLAYER_LOGIN" then
-- 2011-08-17 nevcairiel - ignore the load event of Blizzard_DebugTools, so a potential startup error isn't swallowed up
if (event == "ADDON_LOADED" and arg1 ~= "Blizzard_DebugTools") or event == "PLAYER_LOGIN" then
-- if a addon loads another addon, recursion could happen here, so we need to validate the table on every iteration
while(#AceAddon.initializequeue > 0) do
local addon = tremove(AceAddon.initializequeue, 1)
623,7 → 613,7
AceAddon:InitializeAddon(addon)
tinsert(AceAddon.enablequeue, addon)
end
 
 
if IsLoggedIn() then
while(#AceAddon.enablequeue > 0) do
local addon = tremove(AceAddon.enablequeue, 1)
trunk/Libs/AceConfig-3.0/AceConfig-3.0.lua
3,7 → 3,7
-- as well as associate it with a slash command.
-- @class file
-- @name AceConfig-3.0
-- @release $Id: AceConfig-3.0.lua 1202 2019-05-15 23:11:22Z nevcairiel $
-- @release $Id: AceConfig-3.0.lua 1161 2017-08-12 14:30:16Z funkydude $
 
--[[
AceConfig-3.0
45,7 → 45,7
function AceConfig:RegisterOptionsTable(appName, options, slashcmd)
local ok,msg = pcall(cfgreg.RegisterOptionsTable, self, appName, options)
if not ok then error(msg, 2) end
 
 
if slashcmd then
if type(slashcmd) == "table" then
for _,cmd in pairs(slashcmd) do
trunk/Libs/AceConfig-3.0/AceConfigDialog-3.0/AceConfigDialog-3.0.lua
1,13 → 1,13
--- 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 1193 2018-08-02 12:24:37Z funkydude $
 
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", 66
local AceConfigDialog, oldminor = LibStub:NewLibrary(MAJOR, MINOR)
 
if not AceConfigDialog then return end
15,7 → 15,6
AceConfigDialog.OpenFrames = AceConfigDialog.OpenFrames or {}
AceConfigDialog.Status = AceConfigDialog.Status or {}
AceConfigDialog.frame = AceConfigDialog.frame or CreateFrame("Frame")
AceConfigDialog.tooltip = AceConfigDialog.tooltip or CreateFrame("GameTooltip", "AceConfigDialogTooltip", UIParent, "GameTooltipTemplate")
 
AceConfigDialog.frame.apps = AceConfigDialog.frame.apps or {}
AceConfigDialog.frame.closing = AceConfigDialog.frame.closing or {}
31,7 → 30,7
 
-- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
-- List them here for Mikk's FindGlobals script
-- GLOBALS: NORMAL_FONT_COLOR, ACCEPT, CANCEL
-- GLOBALS: NORMAL_FONT_COLOR, GameTooltip, StaticPopupDialogs, ACCEPT, CANCEL, StaticPopup_Show
-- GLOBALS: PlaySound, GameFontHighlight, GameFontHighlightSmall, GameFontHighlightLarge
-- GLOBALS: CloseSpecialWindows, InterfaceOptions_AddCategory, geterrorhandler
 
57,18 → 56,18
--[[
Group Types
Tree - All Descendant Groups will all become nodes on the tree, direct child options will appear above the tree
- Descendant Groups with inline=true and thier children will not become nodes
- Descendant Groups with inline=true and thier children will not become nodes
 
Tab - Direct Child Groups will become tabs, direct child options will appear above the tab control
- Grandchild groups will default to inline unless specified otherwise
- Grandchild groups will default to inline unless specified otherwise
 
Select- Same as Tab but with entries in a dropdown rather than tabs
 
 
Inline Groups
- Will not become nodes of a select group, they will be effectivly part of thier parent group seperated by a border
- If declared on a direct child of a root node of a select group, they will appear above the group container control
- When a group is displayed inline, all descendants will also be inline members of the group
- Will not become nodes of a select group, they will be effectivly part of thier parent group seperated by a border
- If declared on a direct child of a root node of a select group, they will appear above the group container control
- When a group is displayed inline, all descendants will also be inline members of the group
 
]]
 
169,11 → 168,11
local function GetOptionsMemberValue(membername, option, options, path, appName, ...)
--get definition for the member
local inherits = isInherited[membername]
 
 
 
--get the member of the option, traversing the tree if it can be inherited
local member
 
 
if inherits then
local group = options
if group[membername] ~= nil then
188,7 → 187,7
else
member = option[membername]
end
 
 
--check if we need to call a functon, or if we have a literal value
if ( not allIsLiteral[membername] ) and ( type(member) == "function" or ((not stringIsLiteral[membername]) and type(member) == "string") ) then
--We have a function to call
197,13 → 196,13
local handler
local group = options
handler = group.handler or handler
 
 
for i = 1, #path do
group = GetSubOption(group, path[i])
info[i] = path[i]
handler = group.handler or handler
end
 
 
info.options = options
info.appName = appName
info[0] = appName
213,8 → 212,8
info.type = option.type
info.uiType = "dialog"
info.uiName = MAJOR
 
local a, b, c ,d
 
local a, b, c ,d
--using 4 returns for the get of a color type, increase if a type needs more
if type(member) == "function" then
--Call the function
231,8 → 230,8
return a,b,c,d
else
--The value isnt a function to call, return it
return member
end
return member
end
end
 
--[[calls an options function that could be inherited, method name or function ref
297,7 → 296,7
return NameA:upper() < NameB:upper()
end
if OrderA < 0 then
if OrderB >= 0 then
if OrderB > 0 then
return false
end
else
316,7 → 315,7
local function BuildSortedOptionsTable(group, keySort, opts, options, path, appName)
tempOrders = new()
tempNames = new()
 
 
if group.plugins then
for plugin, t in pairs(group.plugins) do
for k, v in pairs(t) do
332,7 → 331,7
end
end
end
 
 
for k, v in pairs(group.args) do
if not opts[k] then
tinsert(keySort, k)
363,7 → 362,7
end
 
local function CleanUserData(widget, event)
 
 
local user = widget:GetUserDataTable()
 
if user.path then
403,7 → 402,7
-- - Gets a status table for the given appname and options path.
-- @param appName The application name as given to `:RegisterOptionsTable()`
-- @param path The path to the options (a table with all group keys)
-- @return
-- @return
function AceConfigDialog:GetStatusTable(appName, path)
local status = self.Status
 
437,7 → 436,7
function AceConfigDialog:SelectGroup(appName, ...)
local path = new()
 
 
 
local app = reg:GetOptionsTable(appName)
if not app then
error(("%s isn't registed with AceConfigRegistry, unable to open config"):format(appName), 2)
449,9 → 448,9
status.groups = {}
end
status = status.groups
local treevalue
local treestatus
 
local treevalue
local treestatus
 
for n = 1, select("#",...) do
local key = select(n, ...)
 
478,12 → 477,12
--the selected group will be overwritten if a child is the final target but still needs to be open
treestatus.selected = treevalue
treestatus.groups[treevalue] = true
 
 
end
 
 
--move to the next group in the path
group = GetSubOption(group, key)
if not group then
if not group then
break
end
tinsert(path, key)
493,10 → 492,10
end
status = status.groups
end
 
 
del(path)
reg:NotifyChange(appName)
end
end
 
local function OptionOnMouseOver(widget, event)
--show a tooltip/set the status bar to the desc text
505,33 → 504,32
local options = user.options
local path = user.path
local appName = user.appName
local tooltip = AceConfigDialog.tooltip
 
tooltip:SetOwner(widget.frame, "ANCHOR_TOPRIGHT")
GameTooltip:SetOwner(widget.frame, "ANCHOR_TOPRIGHT")
local name = GetOptionsMemberValue("name", opt, options, path, appName)
local desc = GetOptionsMemberValue("desc", opt, options, path, appName)
local usage = GetOptionsMemberValue("usage", opt, options, path, appName)
local descStyle = opt.descStyle
 
 
if descStyle and descStyle ~= "tooltip" then return end
 
tooltip:SetText(name, 1, .82, 0, true)
 
 
GameTooltip:SetText(name, 1, .82, 0, true)
 
if opt.type == "multiselect" then
tooltip:AddLine(user.text, 0.5, 0.5, 0.8, true)
end
GameTooltip:AddLine(user.text, 0.5, 0.5, 0.8, true)
end
if type(desc) == "string" then
tooltip:AddLine(desc, 1, 1, 1, true)
GameTooltip:AddLine(desc, 1, 1, 1, true)
end
if type(usage) == "string" then
tooltip:AddLine("Usage: "..usage, NORMAL_FONT_COLOR.r, NORMAL_FONT_COLOR.g, NORMAL_FONT_COLOR.b, true)
GameTooltip:AddLine("Usage: "..usage, NORMAL_FONT_COLOR.r, NORMAL_FONT_COLOR.g, NORMAL_FONT_COLOR.b, true)
end
 
tooltip:Show()
GameTooltip:Show()
end
 
local function OptionOnMouseLeave(widget, event)
AceConfigDialog.tooltip:Hide()
GameTooltip:Hide()
end
 
local function GetFuncName(option)
542,123 → 540,71
return "set"
end
end
do
local frame = AceConfigDialog.popup
if not frame then
frame = CreateFrame("Frame", nil, UIParent)
AceConfigDialog.popup = frame
frame:Hide()
frame:SetPoint("CENTER", UIParent, "CENTER")
frame:SetSize(320, 72)
frame:SetFrameStrata("TOOLTIP")
frame:SetScript("OnKeyDown", function(self, key)
if key == "ESCAPE" then
self:SetPropagateKeyboardInput(false)
if self.cancel:IsShown() then
self.cancel:Click()
else -- Showing a validation error
self:Hide()
end
else
self:SetPropagateKeyboardInput(true)
end
end)
 
if WOW_PROJECT_ID == WOW_PROJECT_CLASSIC then
frame:SetBackdrop({
bgFile = [[Interface\DialogFrame\UI-DialogBox-Background-Dark]],
edgeFile = [[Interface\DialogFrame\UI-DialogBox-Border]],
tile = true,
tileSize = 32,
edgeSize = 32,
insets = { left = 11, right = 11, top = 11, bottom = 11 },
})
else
local border = CreateFrame("Frame", nil, frame, "DialogBorderDarkTemplate")
border:SetAllPoints(frame)
end
 
local text = frame:CreateFontString(nil, "ARTWORK", "GameFontHighlight")
text:SetSize(290, 0)
text:SetPoint("TOP", 0, -16)
frame.text = text
 
local function newButton(text)
local button = CreateFrame("Button", nil, frame)
button:SetSize(128, 21)
button:SetNormalFontObject(GameFontNormal)
button:SetHighlightFontObject(GameFontHighlight)
button:SetNormalTexture(130763) -- "Interface\\Buttons\\UI-DialogBox-Button-Up"
button:GetNormalTexture():SetTexCoord(0.0, 1.0, 0.0, 0.71875)
button:SetPushedTexture(130761) -- "Interface\\Buttons\\UI-DialogBox-Button-Down"
button:GetPushedTexture():SetTexCoord(0.0, 1.0, 0.0, 0.71875)
button:SetHighlightTexture(130762) -- "Interface\\Buttons\\UI-DialogBox-Button-Highlight"
button:GetHighlightTexture():SetTexCoord(0.0, 1.0, 0.0, 0.71875)
button:SetText(text)
return button
end
 
local accept = newButton(ACCEPT)
accept:SetPoint("BOTTOMRIGHT", frame, "BOTTOM", -6, 16)
frame.accept = accept
 
local cancel = newButton(CANCEL)
cancel:SetPoint("LEFT", accept, "RIGHT", 13, 0)
frame.cancel = cancel
end
end
local function confirmPopup(appName, rootframe, basepath, info, message, func, ...)
local frame = AceConfigDialog.popup
frame:Show()
frame.text:SetText(message)
-- From StaticPopup.lua
-- local height = 32 + text:GetHeight() + 2;
-- height = height + 6 + accept:GetHeight()
-- We add 32 + 2 + 6 + 21 (button height) == 61
local height = 61 + frame.text:GetHeight()
frame:SetHeight(height)
 
frame.accept:ClearAllPoints()
frame.accept:SetPoint("BOTTOMRIGHT", frame, "BOTTOM", -6, 16)
frame.cancel:Show()
 
local t = {...}
local tCount = select("#", ...)
frame.accept:SetScript("OnClick", function(self)
safecall(func, unpack(t, 1, tCount)) -- Manually set count as unpack() stops on nil (bug with #table)
if not StaticPopupDialogs["ACECONFIGDIALOG30_CONFIRM_DIALOG"] then
StaticPopupDialogs["ACECONFIGDIALOG30_CONFIRM_DIALOG"] = {}
end
local t = StaticPopupDialogs["ACECONFIGDIALOG30_CONFIRM_DIALOG"]
for k in pairs(t) do
t[k] = nil
end
t.text = message
t.button1 = ACCEPT
t.button2 = CANCEL
t.preferredIndex = STATICPOPUP_NUMDIALOGS
local dialog, oldstrata
t.OnAccept = function()
safecall(func, unpack(t))
if dialog and oldstrata then
dialog:SetFrameStrata(oldstrata)
end
AceConfigDialog:Open(appName, rootframe, unpack(basepath or emptyTbl))
frame:Hide()
self:SetScript("OnClick", nil)
frame.cancel:SetScript("OnClick", nil)
del(info)
end)
frame.cancel:SetScript("OnClick", function(self)
end
t.OnCancel = function()
if dialog and oldstrata then
dialog:SetFrameStrata(oldstrata)
end
AceConfigDialog:Open(appName, rootframe, unpack(basepath or emptyTbl))
frame:Hide()
self:SetScript("OnClick", nil)
frame.accept:SetScript("OnClick", nil)
del(info)
end)
end
for i = 1, select("#", ...) do
t[i] = select(i, ...) or false
end
t.timeout = 0
t.whileDead = 1
t.hideOnEscape = 1
 
dialog = StaticPopup_Show("ACECONFIGDIALOG30_CONFIRM_DIALOG")
if dialog then
oldstrata = dialog:GetFrameStrata()
dialog:SetFrameStrata("TOOLTIP")
end
end
 
local function validationErrorPopup(message)
local frame = AceConfigDialog.popup
frame:Show()
frame.text:SetText(message)
-- From StaticPopup.lua
-- local height = 32 + text:GetHeight() + 2;
-- height = height + 6 + accept:GetHeight()
-- We add 32 + 2 + 6 + 21 (button height) == 61
local height = 61 + frame.text:GetHeight()
frame:SetHeight(height)
if not StaticPopupDialogs["ACECONFIGDIALOG30_VALIDATION_ERROR_DIALOG"] then
StaticPopupDialogs["ACECONFIGDIALOG30_VALIDATION_ERROR_DIALOG"] = {}
end
local t = StaticPopupDialogs["ACECONFIGDIALOG30_VALIDATION_ERROR_DIALOG"]
t.text = message
t.button1 = OKAY
t.preferredIndex = STATICPOPUP_NUMDIALOGS
local dialog, oldstrata
t.OnAccept = function()
if dialog and oldstrata then
dialog:SetFrameStrata(oldstrata)
end
end
t.timeout = 0
t.whileDead = 1
t.hideOnEscape = 1
 
frame.accept:ClearAllPoints()
frame.accept:SetPoint("BOTTOM", frame, "BOTTOM", 0, 16)
frame.cancel:Hide()
 
frame.accept:SetScript("OnClick", function()
frame:Hide()
end)
dialog = StaticPopup_Show("ACECONFIGDIALOG30_VALIDATION_ERROR_DIALOG")
if dialog then
oldstrata = dialog:GetFrameStrata()
dialog:SetFrameStrata("TOOLTIP")
end
end
 
local function ActivateControl(widget, event, ...)
729,7 → 675,7
end
end
end
 
 
local success
if validated and option.type ~= "execute" then
if type(validate) == "string" then
744,7 → 690,7
if not success then validated = false end
end
end
 
 
local rootframe = user.rootframe
if not validated or type(validated) == "string" then
if not validated then
769,7 → 715,7
del(info)
return true
else
 
 
local confirmText = option.confirmText
--call confirm func/method
if type(confirm) == "string" then
810,10 → 756,10
confirmText = confirmText.." - "..desc
end
end
 
 
local iscustom = user.rootframe:GetUserData("iscustom")
local rootframe
 
 
if iscustom then
rootframe = user.rootframe
end
850,7 → 796,7
--full refresh of the frame, some controls dont cause this on all events
if option.type == "color" then
if event == "OnValueConfirmed" then
 
 
if iscustom then
AceConfigDialog:Open(user.appName, user.rootframe, unpack(basepath))
else
911,7 → 857,7
 
local function MultiControlOnClosed(widget, event, ...)
local user = widget:GetUserDataTable()
if user.valuechanged and not widget:IsReleasing() then
if user.valuechanged then
local iscustom = user.rootframe:GetUserData("iscustom")
local basepath = user.rootframe:GetUserData("basepath") or emptyTbl
if iscustom then
1089,24 → 1035,7
control:SetCallback("OnEnter", OptionOnMouseOver)
end
 
local function CreateControl(userControlType, fallbackControlType)
local control
if userControlType then
control = gui:Create(userControlType)
if not control then
geterrorhandler()(("Invalid Custom Control Type - %s"):format(tostring(userControlType)))
end
end
if not control then
control = gui:Create(fallbackControlType)
end
return control
end
 
local function sortTblAsStrings(x,y)
return tostring(x) < tostring(y) -- Support numbers as keys
end
 
--[[
options - root of the options table being fed
container - widget that controls will be placed in
1137,7 → 1066,7
else
GroupContainer = gui:Create("SimpleGroup")
end
 
 
GroupContainer.width = "fill"
GroupContainer:SetLayout("flow")
container:AddChild(GroupContainer)
1146,17 → 1075,16
else
--Control to feed
local control
 
 
local name = GetOptionsMemberValue("name", v, options, path, appName)
 
 
if v.type == "execute" then
 
 
local imageCoords = GetOptionsMemberValue("imageCoords",v, options, path, appName)
local image, width, height = GetOptionsMemberValue("image",v, options, path, appName)
 
local iconControl = type(image) == "string" or type(image) == "number"
control = CreateControl(v.dialogControl or v.control, iconControl and "Icon" or "Button")
if iconControl then
 
if type(image) == "string" or type(image) == "number" then
control = gui:Create("Icon")
if not width then
width = GetOptionsMemberValue("imageWidth",v, options, path, appName)
end
1177,13 → 1105,19
control:SetImageSize(width, height)
control:SetLabel(name)
else
control = gui:Create("Button")
control:SetText(name)
end
control:SetCallback("OnClick",ActivateControl)
 
elseif v.type == "input" then
control = CreateControl(v.dialogControl or v.control, v.multiline and "MultiLineEditBox" or "EditBox")
 
local controlType = v.dialogControl or v.control or (v.multiline and "MultiLineEditBox") or "EditBox"
control = gui:Create(controlType)
if not control then
geterrorhandler()(("Invalid Custom Control Type - %s"):format(tostring(controlType)))
control = gui:Create(v.multiline and "MultiLineEditBox" or "EditBox")
end
 
if v.multiline and control.SetNumLines then
control:SetNumLines(tonumber(v.multiline) or 4)
end
1196,21 → 1130,21
control:SetText(text)
 
elseif v.type == "toggle" then
control = CreateControl(v.dialogControl or v.control, "CheckBox")
control = gui:Create("CheckBox")
control:SetLabel(name)
control:SetTriState(v.tristate)
local value = GetOptionsMemberValue("get",v, options, path, appName)
control:SetValue(value)
control:SetCallback("OnValueChanged",ActivateControl)
 
 
if v.descStyle == "inline" then
local desc = GetOptionsMemberValue("desc", v, options, path, appName)
control:SetDescription(desc)
end
 
 
local image = GetOptionsMemberValue("image", v, options, path, appName)
local imageCoords = GetOptionsMemberValue("imageCoords", v, options, path, appName)
 
 
if type(image) == "string" or type(image) == "number" then
if type(imageCoords) == "table" then
control:SetImage(image, unpack(imageCoords))
1219,7 → 1153,7
end
end
elseif v.type == "range" then
control = CreateControl(v.dialogControl or v.control, "Slider")
control = gui:Create("Slider")
control:SetLabel(name)
control:SetSliderValues(v.softMin or v.min or 0, v.softMax or v.max or 100, v.bigStep or v.step or 0)
control:SetIsPercent(v.isPercent)
1233,7 → 1167,6
 
elseif v.type == "select" then
local values = GetOptionsMemberValue("values", v, options, path, appName)
local sorting = GetOptionsMemberValue("sorting", v, options, path, appName)
if v.style == "radio" then
local disabled = CheckOptionDisabled(v, options, path, appName)
local width = GetOptionsMemberValue("width",v,options,path,appName)
1244,14 → 1177,12
 
control:PauseLayout()
local optionValue = GetOptionsMemberValue("get",v, options, path, appName)
if not sorting then
sorting = {}
for value, text in pairs(values) do
sorting[#sorting+1]=value
end
tsort(sorting, sortTblAsStrings)
local t = {}
for value, text in pairs(values) do
t[#t+1]=value
end
for k, value in ipairs(sorting) do
tsort(t)
for k, value in ipairs(t) do
local text = values[value]
local radio = gui:Create("CheckBox")
radio:SetLabel(text)
1278,14 → 1209,19
control:ResumeLayout()
control:DoLayout()
else
control = CreateControl(v.dialogControl or v.control, "Dropdown")
local controlType = v.dialogControl or v.control or "Dropdown"
control = gui:Create(controlType)
if not control then
geterrorhandler()(("Invalid Custom Control Type - %s"):format(tostring(controlType)))
control = gui:Create("Dropdown")
end
local itemType = v.itemControl
if itemType and not gui:GetWidgetVersion(itemType) then
geterrorhandler()(("Invalid Custom Item Type - %s"):format(tostring(itemType)))
itemType = nil
end
control:SetLabel(name)
control:SetList(values, sorting, itemType)
control:SetList(values, nil, itemType)
local value = GetOptionsMemberValue("get",v, options, path, appName)
if not values[value] then
value = nil
1297,7 → 1233,9
elseif v.type == "multiselect" then
local values = GetOptionsMemberValue("values", v, options, path, appName)
local disabled = CheckOptionDisabled(v, options, path, appName)
 
 
local controlType = v.dialogControl or v.control
 
local valuesort = new()
if values then
for value, text in pairs(values) do
1305,8 → 1243,7
end
end
tsort(valuesort)
 
local controlType = v.dialogControl or v.control
 
if controlType then
control = gui:Create(controlType)
if not control then
1374,13 → 1311,13
control:ResumeLayout()
control:DoLayout()
 
 
 
end
 
 
del(valuesort)
 
elseif v.type == "color" then
control = CreateControl(v.dialogControl or v.control, "ColorPicker")
control = gui:Create("ColorPicker")
control:SetLabel(name)
control:SetHasAlpha(GetOptionsMemberValue("hasAlpha",v, options, path, appName))
control:SetColor(GetOptionsMemberValue("get",v, options, path, appName))
1388,20 → 1325,20
control:SetCallback("OnValueConfirmed",ActivateControl)
 
elseif v.type == "keybinding" then
control = CreateControl(v.dialogControl or v.control, "Keybinding")
control = gui:Create("Keybinding")
control:SetLabel(name)
control:SetKey(GetOptionsMemberValue("get",v, options, path, appName))
control:SetCallback("OnKeyChanged",ActivateControl)
 
elseif v.type == "header" then
control = CreateControl(v.dialogControl or v.control, "Heading")
control = gui:Create("Heading")
control:SetText(name)
control.width = "fill"
 
elseif v.type == "description" then
control = CreateControl(v.dialogControl or v.control, "Label")
control = gui:Create("Label")
control:SetText(name)
 
 
local fontSize = GetOptionsMemberValue("fontSize",v, options, path, appName)
if fontSize == "medium" then
control:SetFontObject(GameFontHighlight)
1410,10 → 1347,10
else -- small or invalid
control:SetFontObject(GameFontHighlightSmall)
end
 
 
local imageCoords = GetOptionsMemberValue("imageCoords",v, options, path, appName)
local image, width, height = GetOptionsMemberValue("image",v, options, path, appName)
 
 
if type(image) == "string" or type(image) == "number" then
if not width then
width = GetOptionsMemberValue("imageWidth",v, options, path, appName)
1462,7 → 1399,7
InjectInfo(control, options, v, path, rootframe, appName)
container:AddChild(control)
end
 
 
end
end
tremove(path)
1487,8 → 1424,7
local option = user.option
local path = user.path
local appName = user.appName
local tooltip = AceConfigDialog.tooltip
 
 
local feedpath = new()
for i = 1, #path do
feedpath[i] = path[i]
1503,50 → 1439,49
 
local name = GetOptionsMemberValue("name", group, options, feedpath, appName)
local desc = GetOptionsMemberValue("desc", group, options, feedpath, appName)
 
tooltip:SetOwner(button, "ANCHOR_NONE")
tooltip:ClearAllPoints()
 
GameTooltip:SetOwner(button, "ANCHOR_NONE")
if widget.type == "TabGroup" then
tooltip:SetPoint("BOTTOM",button,"TOP")
GameTooltip:SetPoint("BOTTOM",button,"TOP")
else
tooltip:SetPoint("LEFT",button,"RIGHT")
GameTooltip:SetPoint("LEFT",button,"RIGHT")
end
 
tooltip:SetText(name, 1, .82, 0, true)
 
GameTooltip:SetText(name, 1, .82, 0, true)
 
if type(desc) == "string" then
tooltip:AddLine(desc, 1, 1, 1, true)
GameTooltip:AddLine(desc, 1, 1, 1, true)
end
 
tooltip:Show()
 
GameTooltip:Show()
end
 
local function TreeOnButtonLeave(widget, event, value, button)
AceConfigDialog.tooltip:Hide()
GameTooltip:Hide()
end
 
 
local function GroupExists(appName, options, path, uniquevalue)
if not uniquevalue then return false end
 
 
local feedpath = new()
local temppath = new()
for i = 1, #path do
feedpath[i] = path[i]
end
 
 
BuildPath(feedpath, ("\001"):split(uniquevalue))
 
 
local group = options
for i = 1, #feedpath do
local v = feedpath[i]
temppath[i] = v
group = GetSubOption(group, v)
 
if not group or group.type ~= "group" or CheckOptionHidden(group, options, temppath, appName) then
 
if not group or group.type ~= "group" or CheckOptionHidden(group, options, temppath, appName) then
del(feedpath)
del(temppath)
return false
return false
end
end
del(feedpath)
1569,6 → 1504,10
end
 
BuildPath(feedpath, ("\001"):split(uniquevalue))
local group = options
for i = 1, #feedpath do
group = GetSubOption(group, feedpath[i])
end
widget:ReleaseChildren()
AceConfigDialog:FeedGroup(user.appName,options,widget,rootframe,feedpath)
 
1665,7 → 1604,7
tab:SetCallback("OnGroupSelected", GroupSelected)
tab:SetCallback("OnTabEnter", TreeOnButtonEnter)
tab:SetCallback("OnTabLeave", TreeOnButtonLeave)
 
 
local status = AceConfigDialog:GetStatusTable(appName, path)
if not status.groups then
status.groups = {}
1685,7 → 1624,7
break
end
end
 
 
container:AddChild(tab)
 
elseif grouptype == "select" then
1708,7 → 1647,7
if firstgroup then
select:SetGroup((GroupExists(appName, options, path,status.groups.selected) and status.groups.selected) or firstgroup)
end
 
 
select.width = "fill"
select.height = "fill"
 
1720,14 → 1659,14
local tree = gui:Create("TreeGroup")
InjectInfo(tree, options, group, path, rootframe, appName)
tree:EnableButtonTooltips(false)
 
 
tree.width = "fill"
tree.height = "fill"
 
tree:SetCallback("OnGroupSelected", GroupSelected)
tree:SetCallback("OnButtonEnter", TreeOnButtonEnter)
tree:SetCallback("OnButtonLeave", TreeOnButtonLeave)
 
 
local status = AceConfigDialog:GetStatusTable(appName, path)
if not status.groups then
status.groups = {}
1768,7 → 1707,7
end
this.closing[appName] = nil
end
 
 
if this.closeAll then
for k, v in pairs(AceConfigDialog.OpenFrames) do
if not this.closeAllOverride[k] then
1778,7 → 1717,7
this.closeAll = nil
wipe(this.closeAllOverride)
end
 
 
for appName in pairs(this.apps) do
if AceConfigDialog.OpenFrames[appName] then
local user = AceConfigDialog.OpenFrames[appName]:GetUserDataTable()
1863,10 → 1802,10
local options = app("dialog", MAJOR)
 
local f
 
 
local path = new()
local name = GetOptionsMemberValue("name", options, options, path, appName)
 
 
--If an optional path is specified add it to the path table before feeding the options
--as container is optional as well it may contain the first element of the path
if type(container) == "string" then
1876,7 → 1815,7
for n = 1, select("#",...) do
tinsert(path, (select(n, ...)))
end
 
 
local option = options
if type(container) == "table" and container.type == "BlizOptionsGroup" and #path > 0 then
for i = 1, #path do
1884,7 → 1823,7
end
name = format("%s - %s", name, GetOptionsMemberValue("name", option, options, path, appName))
end
 
 
--if a container is given feed into that
if container then
f = container
1978,19 → 1917,19
-- @param name A descriptive name to display in the options tree (defaults to appName)
-- @param parent The parent to use in the interface options tree.
-- @param ... The path in the options table to feed into the interface options panel.
-- @return The reference to the frame registered into the Interface Options.
-- @return The reference to the frame registered into the Interface Options.
function AceConfigDialog:AddToBlizOptions(appName, name, parent, ...)
local BlizOptions = AceConfigDialog.BlizOptions
 
 
local key = appName
for n = 1, select("#", ...) do
key = key.."\001"..select(n, ...)
end
 
 
if not BlizOptions[appName] then
BlizOptions[appName] = {}
end
 
 
if not BlizOptions[appName][key] then
local group = gui:Create("BlizOptionsGroup")
BlizOptions[appName][key] = group
trunk/Libs/AceConfig-3.0/AceConfigCmd-3.0/AceConfigCmd-3.0.lua
1,7 → 1,7
--- AceConfigCmd-3.0 handles access to an options table through the "command line" interface via the ChatFrames.
-- @class file
-- @name AceConfigCmd-3.0
-- @release $Id: AceConfigCmd-3.0.lua 1202 2019-05-15 23:11:22Z nevcairiel $
-- @release $Id: AceConfigCmd-3.0.lua 1161 2017-08-12 14:30:16Z funkydude $
 
--[[
AceConfigCmd-3.0
63,7 → 63,7
 
-- pickfirstset() - picks the first non-nil value and returns it
 
local function pickfirstset(...)
local function pickfirstset(...)
for i=1,select("#",...) do
if select(i,...)~=nil then
return select(i,...)
120,7 → 120,7
info.arg = tab.arg
info.option = tab
info.type = tab.type
 
 
if type(method)=="function" then
return method(info, ...)
else
131,7 → 131,7
-- do_final() - do the final step (set/execute) along with validation and confirmation
 
local function do_final(info, inputpos, tab, methodtype, ...)
if info.validate then
if info.validate then
local res = callmethod(info,inputpos,tab,"validate",...)
if type(res)=="string" then
usererr(info, inputpos, "'"..strsub(info.input, inputpos).."' - "..res)
139,7 → 139,7
end
end
-- console ignores .confirm
 
 
callmethod(info,inputpos,tab,methodtype, ...)
end
 
152,8 → 152,8
if val~=nil then
if val==false then
val=nil
elseif not types[type(val)] then
err(info, inputpos, "'" .. paramname.. "' - "..errormsg)
elseif not types[type(val)] then
err(info, inputpos, "'" .. paramname.. "' - "..errormsg)
end
info[paramname] = val
info[paramname.."_at"] = depth
166,13 → 166,13
local dummytable={}
 
local function iterateargs(tab)
if not tab.plugins then
return pairs(tab.args)
if not tab.plugins then
return pairs(tab.args)
end
 
 
local argtabkey,argtab=next(tab.plugins)
local v
 
 
return function(_, k)
while argtab do
k,v = next(argtab, k)
206,18 → 206,18
if not noHead then
print("|cff33ff99"..info.appName.."|r: Arguments to |cffffff78/"..info[0].."|r "..strsub(info.input,1,inputpos-1)..":")
end
 
 
local sortTbl = {} -- [1..n]=name
local refTbl = {} -- [name]=tableref
 
 
for k,v in iterateargs(tab) do
if not refTbl[k] then -- a plugin overriding something in .args
tinsert(sortTbl, k)
refTbl[k] = v
end
end
 
tsort(sortTbl, function(one, two)
 
tsort(sortTbl, function(one, two)
local o1 = refTbl[one].order or 100
local o2 = refTbl[two].order or 100
if type(o1) == "function" or type(o1) == "string" then
240,7 → 240,7
if o1==o2 then return tostring(one)<tostring(two) end -- compare names
return o1<o2
end)
 
 
for i = 1, #sortTbl do
local k = sortTbl[i]
local v = refTbl[k]
327,7 → 327,7
return s
end
 
-- handle() - selfrecursing function that processes input->optiontable
-- handle() - selfrecursing function that processes input->optiontable
-- - depth - starts at 0
-- - retfalse - return false rather than produce error if a match is not found (used by inlined groups)
 
346,16 → 346,16
local oldfunc,oldfunc_at = getparam(info,inputpos,tab,depth,"func",functypes,funcmsg)
local oldvalidate,oldvalidate_at = getparam(info,inputpos,tab,depth,"validate",functypes,funcmsg)
--local oldconfirm,oldconfirm_at = getparam(info,inputpos,tab,depth,"confirm",functypes,funcmsg)
 
 
-------------------------------------------------------------------
-- Act according to .type of this table
 
 
if tab.type=="group" then
------------ group --------------------------------------------
 
 
if type(tab.args)~="table" then err(info, inputpos) end
if tab.plugins and type(tab.plugins)~="table" then err(info,inputpos) end
 
 
-- grab next arg from input
local _,nextpos,arg = (info.input):find(" *([^ ]+) *", inputpos)
if not arg then
363,11 → 363,11
return
end
nextpos=nextpos+1
 
 
-- loop .args and try to find a key with a matching name
for k,v in iterateargs(tab) do
if not(type(k)=="string" and type(v)=="table" and type(v.type)=="string") then err(info,inputpos, "options table child '"..tostring(k).."' is malformed") end
 
 
-- is this child an inline group? if so, traverse into it
if v.type=="group" and pickfirstset(v.cmdInline, v.inline, false) then
info[depth+1] = k
383,8 → 383,8
return handle(info,nextpos,v,depth+1)
end
end
 
-- no match
 
-- no match
if retfalse then
-- restore old infotable members and return false to indicate failure
info.handler,info.handler_at = oldhandler,oldhandler_at
395,23 → 395,23
--info.confirm,info.confirm_at = oldconfirm,oldconfirm_at
return false
end
 
 
-- couldn't find the command, display error
usererr(info, inputpos, "'"..arg.."' - " .. L["unknown argument"])
return
end
 
 
local str = strsub(info.input,inputpos);
 
 
if tab.type=="execute" then
------------ execute --------------------------------------------
do_final(info, inputpos, tab, "func")
 
 
 
 
 
elseif tab.type=="input" then
------------ input --------------------------------------------
 
 
local res = true
if tab.pattern then
if not(type(tab.pattern)=="string") then err(info, inputpos, "'pattern' - expected a string") end
420,11 → 420,11
return
end
end
 
 
do_final(info, inputpos, tab, "set", str)
 
 
 
 
 
elseif tab.type=="toggle" then
------------ toggle --------------------------------------------
local b
444,7 → 444,7
else
b = not b
end
 
 
elseif str==L["on"] then
b = true
elseif str==L["off"] then
459,10 → 459,10
end
return
end
 
 
do_final(info, inputpos, tab, "set", b)
 
 
 
elseif tab.type=="range" then
------------ range --------------------------------------------
local val = tonumber(str)
481,21 → 481,21
usererr(info, inputpos, val.." - "..format(L["must be equal to or lower than %s"], tostring(info.max)) )
return
end
 
 
do_final(info, inputpos, tab, "set", val)
 
 
 
elseif tab.type=="select" then
------------ select ------------------------------------
local str = strtrim(strlower(str))
 
 
local values = tab.values
if type(values) == "function" or type(values) == "string" then
info.values = values
values = callmethod(info, inputpos, tab, "values")
info.values = nil
end
 
 
if str == "" then
local b = callmethod(info, inputpos, tab, "get")
local fmt = "|cffffff78- [%s]|r %s"
512,7 → 512,7
end
 
local ok
for k,v in pairs(values) do
for k,v in pairs(values) do
if strlower(k)==str then
str = k -- overwrite with key (in case of case mismatches)
ok = true
523,20 → 523,20
usererr(info, inputpos, "'"..str.."' - "..L["unknown selection"])
return
end
 
 
do_final(info, inputpos, tab, "set", str)
 
 
elseif tab.type=="multiselect" then
------------ multiselect -------------------------------------------
local str = strtrim(strlower(str))
 
 
local values = tab.values
if type(values) == "function" or type(values) == "string" then
info.values = values
values = callmethod(info, inputpos, tab, "values")
info.values = nil
end
 
 
if str == "" then
local fmt = "|cffffff78- [%s]|r %s"
local fmt_sel = "|cffffff78- [%s]|r %s |cffff0000*|r"
550,7 → 550,7
end
return
end
 
 
--build a table of the selections, checking that they exist
--parse for =on =off =default in the process
--table will be key = true for options that should toggle, key = [on|off|default] for options to be set
559,25 → 559,25
--parse option=on etc
local opt, val = v:match('(.+)=(.+)')
--get option if toggling
if not opt then
opt = v
if not opt then
opt = v
end
 
 
--check that the opt is valid
local ok
for k,v in pairs(values) do
for k,v in pairs(values) do
if strlower(k)==opt then
opt = k -- overwrite with key (in case of case mismatches)
ok = true
break
end
end
 
 
if not ok then
usererr(info, inputpos, "'"..opt.."' - "..L["unknown selection"])
return
end
 
 
--check that if val was supplied it is valid
if val then
if val == L["on"] or val == L["off"] or (tab.tristate and val == L["default"]) then
596,14 → 596,14
sels[opt] = true
end
end
 
 
for opt, val in pairs(sels) do
local newval
 
 
if (val == true) then
--toggle the option
local b = callmethod(info, inputpos, tab, "get", opt)
 
 
if tab.tristate then
--cycle in true, nil, false order
if b then
627,11 → 627,11
newval = nil
end
end
 
 
do_final(info, inputpos, tab, "set", opt, newval)
end
 
 
 
 
elseif tab.type=="color" then
------------ color --------------------------------------------
local str = strtrim(strlower(str))
639,16 → 639,16
--TODO: Show current value
return
end
 
 
local r, g, b, a
 
 
local hasAlpha = tab.hasAlpha
if type(hasAlpha) == "function" or type(hasAlpha) == "string" then
info.hasAlpha = hasAlpha
hasAlpha = callmethod(info, inputpos, tab, 'hasAlpha')
info.hasAlpha = nil
end
 
 
if hasAlpha then
if str:len() == 8 and str:find("^%x*$") then
--parse a hex string
662,7 → 662,7
usererr(info, inputpos, format(L["'%s' - expected 'RRGGBBAA' or 'r g b a'."], str))
return
end
 
 
if r >= 0.0 and r <= 1.0 and g >= 0.0 and g <= 1.0 and b >= 0.0 and b <= 1.0 and a >= 0.0 and a <= 1.0 then
--values are valid
elseif r >= 0 and r <= 255 and g >= 0 and g <= 255 and b >= 0 and b <= 255 and a >= 0 and a <= 255 then
701,7 → 701,7
usererr(info, inputpos, format(L["'%s' - values must all be either in the range 0-1 or 0-255."], str))
end
end
 
 
do_final(info, inputpos, tab, "set", r,g,b,a)
 
elseif tab.type=="keybinding" then
737,7 → 737,7
-- MyAddon = LibStub("AceAddon-3.0"):NewAddon("MyAddon", "AceConsole-3.0")
-- -- Use AceConsole-3.0 to register a Chat Command
-- MyAddon:RegisterChatCommand("mychat", "ChatCommand")
--
--
-- -- Show the GUI if no input is supplied, otherwise handle the chat input.
-- function MyAddon:ChatCommand(input)
-- -- Assuming "MyOptions" is the appName of a valid options table
754,7 → 754,7
error([[Usage: HandleCommand("slashcmd", "appName", "input"): 'appName' - no options table "]]..tostring(appName)..[[" has been registered]], 2)
end
local options = assert( optgetter("cmd", MAJOR) )
 
 
local info = { -- Don't try to recycle this, it gets handed off to callbacks and whatnot
[0] = slashcmd,
appName = appName,
765,7 → 765,7
uiType = "cmd",
uiName = MAJOR,
}
 
 
handle(info, 1, options, 0) -- (info, inputpos, table, depth)
end
 
trunk/Libs/AceConfig-3.0/AceConfigRegistry-3.0/AceConfigRegistry-3.0.lua
4,14 → 4,14
-- * Valid **uiTypes**: "cmd", "dropdown", "dialog". This is verified by the library at call time. \\
-- * The **uiName** field is expected to contain the full name of the calling addon, including version, e.g. "FooBar-1.0". This is verified by the library at call time.\\
-- * The **appName** field is the options table name as given at registration time \\
--
--
-- :IterateOptionsTables() (and :GetOptionsTable() if only given one argument) return a function reference that the requesting config handling addon must call with valid "uiType", "uiName".
-- @class file
-- @name AceConfigRegistry-3.0
-- @release $Id: AceConfigRegistry-3.0.lua 1207 2019-06-23 12:08:33Z nevcairiel $
-- @release $Id: AceConfigRegistry-3.0.lua 1193 2018-08-02 12:24:37Z funkydude $
local CallbackHandler = LibStub("CallbackHandler-1.0")
 
local MAJOR, MINOR = "AceConfigRegistry-3.0", 20
local MAJOR, MINOR = "AceConfigRegistry-3.0", 18
local AceConfigRegistry = LibStub:NewLibrary(MAJOR, MINOR)
 
if not AceConfigRegistry then return end
33,7 → 33,7
 
 
AceConfigRegistry.validated = {
-- list of options table names ran through :ValidateOptionsTable automatically.
-- list of options table names ran through :ValidateOptionsTable automatically.
-- CLEARED ON PURPOSE, since newer versions may have newer validators
cmd = {},
dropdown = {},
94,20 → 94,13
}
 
local typedkeys={
header={
control=optstring,
dialogControl=optstring,
dropdownControl=optstring,
},
header={},
description={
image=optstringnumberfunc,
imageCoords=optmethodtable,
imageHeight=optnumber,
imageWidth=optnumber,
fontSize=optstringfunc,
control=optstring,
dialogControl=optstring,
dropdownControl=optstring,
},
group={
args=istable,
124,9 → 117,6
imageCoords=optmethodtable,
imageHeight=optnumber,
imageWidth=optnumber,
control=optstring,
dialogControl=optstring,
dropdownControl=optstring,
},
input={
pattern=optstring,
140,9 → 130,6
tristate=optbool,
image=optstringnumberfunc,
imageCoords=optmethodtable,
control=optstring,
dialogControl=optstring,
dropdownControl=optstring,
},
tristate={
},
154,16 → 141,12
step=optnumber,
bigStep=optnumber,
isPercent=optbool,
control=optstring,
dialogControl=optstring,
dropdownControl=optstring,
},
select={
values=ismethodtable,
sorting=optmethodtable,
style={
["nil"]=true,
["string"]={dropdown=true,radio=true},
["nil"]=true,
["string"]={dropdown=true,radio=true},
_="string: 'dropdown' or 'radio'"
},
control=optstring,
181,14 → 164,9
},
color={
hasAlpha=optmethodbool,
control=optstring,
dialogControl=optstring,
dropdownControl=optstring,
},
keybinding={
control=optstring,
dialogControl=optstring,
dropdownControl=optstring,
-- TODO
},
}
 
225,13 → 203,13
if type(options.type)~="string" then
err(".type: expected a string, got a "..type(options.type), errlvl,...)
end
 
 
-- get type and 'typedkeys' member
local tk = typedkeys[options.type]
if not tk then
err(".type: unknown type '"..options.type.."'", errlvl,...)
end
 
 
-- make sure that all options[] are known parameters
for k,v in pairs(options) do
if not (tk[k] or basekeys[k]) then
324,7 → 302,7
AceConfigRegistry:ValidateOptionsTable(options, appName, errlvl) -- upgradable
AceConfigRegistry.validated[uiType][appName] = true
end
return options
return options
end
elseif type(options)=="function" then
AceConfigRegistry.tables[appName] = function(uiType, uiName, errlvl)
362,7 → 340,7
if not f then
return nil
end
 
 
if uiType then
return f(uiType,uiName,1) -- get the table for us
else
trunk/Libs/AceEvent-3.0/AceEvent-3.0.lua
2,14 → 2,14
-- All dispatching is done using **CallbackHandler-1.0**. AceEvent is a simple wrapper around
-- CallbackHandler, and dispatches all game events or addon message to the registrees.
--
-- **AceEvent-3.0** can be embeded into your addon, either explicitly by calling AceEvent:Embed(MyAddon) or by
-- **AceEvent-3.0** can be embeded into your addon, either explicitly by calling AceEvent:Embed(MyAddon) or by
-- specifying it as an embeded library in your AceAddon. All functions will be available on your addon object
-- and can be accessed directly, without having to explicitly call AceEvent itself.\\
-- It is recommended to embed AceEvent, otherwise you'll have to specify a custom `self` on all calls you
-- make into AceEvent.
-- @class file
-- @name AceEvent-3.0
-- @release $Id: AceEvent-3.0.lua 1202 2019-05-15 23:11:22Z nevcairiel $
-- @release $Id: AceEvent-3.0.lua 1161 2017-08-12 14:30:16Z funkydude $
local CallbackHandler = LibStub("CallbackHandler-1.0")
 
local MAJOR, MINOR = "AceEvent-3.0", 4
25,22 → 25,22
 
-- APIs and registry for blizzard events, using CallbackHandler lib
if not AceEvent.events then
AceEvent.events = CallbackHandler:New(AceEvent,
AceEvent.events = CallbackHandler:New(AceEvent,
"RegisterEvent", "UnregisterEvent", "UnregisterAllEvents")
end
 
function AceEvent.events:OnUsed(target, eventname)
function AceEvent.events:OnUsed(target, eventname)
AceEvent.frame:RegisterEvent(eventname)
end
 
function AceEvent.events:OnUnused(target, eventname)
function AceEvent.events:OnUnused(target, eventname)
AceEvent.frame:UnregisterEvent(eventname)
end
 
 
-- APIs and registry for IPC messages, using CallbackHandler lib
if not AceEvent.messages then
AceEvent.messages = CallbackHandler:New(AceEvent,
AceEvent.messages = CallbackHandler:New(AceEvent,
"RegisterMessage", "UnregisterMessage", "UnregisterAllMessages"
)
AceEvent.SendMessage = AceEvent.messages.Fire
trunk/MultiScreenSupport.toc
1,6 → 1,6
## Interface: 80205
## Interface: 80000
## Author: Tomate
## Version: 4.3
## Version: 4.2
## Title: MultiScreenSupport
## Notes: Eyefinity and Surround gaming assist to anchor default UI panels to the center monitor.
## X-Embeds: Ace3