2088 lines
80 KiB
Lua
2088 lines
80 KiB
Lua
-- *********************************************************
|
|
-- ** Deadly Boss Mods - GUI **
|
|
-- ** http://www.deadlybossmods.com **
|
|
-- *********************************************************
|
|
--
|
|
-- This addon is written and copyrighted by:
|
|
-- * Paul Emmerich (Tandanu @ EU-Aegwynn) (DBM-Core)
|
|
-- * Martin Verges (Nitram @ EU-Azshara) (DBM-GUI)
|
|
--
|
|
-- The localizations are written by:
|
|
-- * enGB/enUS: Tandanu http://www.deadlybossmods.com
|
|
-- * deDE: Tandanu http://www.deadlybossmods.com
|
|
-- * zhCN: Diablohu http://wow.gamespot.com.cn
|
|
-- * ruRU: BootWin bootwin@gmail.com
|
|
-- * ruRU: Vampik admin@vampik.ru
|
|
-- * zhTW: Hman herman_c1@hotmail.com
|
|
-- * zhTW: Azael/kc10577 kc10577@hotmail.com
|
|
-- * koKR: BlueNyx bluenyx@gmail.com
|
|
-- * esES: Interplay/1nn7erpLaY http://www.1nn7erpLaY.com
|
|
--
|
|
-- Special thanks to:
|
|
-- * Arta (DBM-Party)
|
|
-- * Omegal @ US-Whisperwind (some patches, and DBM-Party updates)
|
|
-- * Tennberg (a lot of fixes in the enGB/enUS localization)
|
|
--
|
|
--
|
|
-- The code of this addon is licensed under a Creative Commons Attribution-Noncommercial-Share Alike 3.0 License. (see license.txt)
|
|
-- All included textures and sounds are copyrighted by their respective owners, license information for these media files can be found in the modules that make use of them.
|
|
--
|
|
--
|
|
-- You are free:
|
|
-- * to Share - to copy, distribute, display, and perform the work
|
|
-- * to Remix - to make derivative works
|
|
-- Under the following conditions:
|
|
-- * Attribution. You must attribute the work in the manner specified by the author or licensor (but not in any way that suggests that they endorse you or your use of the work). (A link to http://www.deadlybossmods.com is sufficient)
|
|
-- * Noncommercial. You may not use this work for commercial purposes.
|
|
-- * Share Alike. If you alter, transform, or build upon this work, you may distribute the resulting work only under the same or similar license to this one.
|
|
--
|
|
--
|
|
|
|
local revision =("$Revision: 4379 $"):sub(12, -3)
|
|
local FrameTitle = "DBM_GUI_Option_" -- all GUI frames get automatically a name FrameTitle..ID
|
|
|
|
local PanelPrototype = {}
|
|
DBM_GUI = {}
|
|
setmetatable(PanelPrototype, {__index = DBM_GUI})
|
|
|
|
local L = DBM_GUI_Translations
|
|
|
|
local usemodelframe = false -- very beta
|
|
|
|
function DBM_GUI:ShowHide(forceshow)
|
|
if forceshow == true then
|
|
self:UpdateModList()
|
|
DBM_GUI_OptionsFrame:Show()
|
|
|
|
elseif forceshow == false then
|
|
DBM_GUI_OptionsFrame:Hide()
|
|
|
|
else
|
|
if DBM_GUI_OptionsFrame:IsShown() then
|
|
DBM_GUI_OptionsFrame:Hide()
|
|
else
|
|
self:UpdateModList()
|
|
DBM_GUI_OptionsFrame:Show()
|
|
end
|
|
end
|
|
end
|
|
|
|
do
|
|
local myid = 100
|
|
local prottypemetatable = {__index = PanelPrototype}
|
|
-- This function creates a new entry in the menu
|
|
--
|
|
-- arg1 = Text for the UI Button
|
|
-- arg2 = nil or ("option" or 2) ... nil will place as a Boss Mod, otherwise as a Option Tab
|
|
--
|
|
function DBM_GUI:CreateNewPanel(FrameName, FrameTyp, showsub, sortID)
|
|
local panel = CreateFrame('Frame', FrameTitle..self:GetNewID(), DBM_GUI_OptionsFramePanelContainer)
|
|
panel.mytype = "panel"
|
|
panel.sortID = self:GetCurrentID()
|
|
panel:SetWidth(DBM_GUI_OptionsFramePanelContainerFOV:GetWidth())
|
|
panel:SetHeight(DBM_GUI_OptionsFramePanelContainerFOV:GetHeight())
|
|
panel:SetPoint("TOPLEFT", DBM_GUI_OptionsFramePanelContainer, "TOPLEFT")
|
|
|
|
panel.name = FrameName
|
|
panel.showsub = (showsub or showsub == nil)
|
|
|
|
if (sortID or 0) > 0 then
|
|
panel.sortid = sortID
|
|
else
|
|
myid = myid + 1
|
|
panel.sortid = myid
|
|
end
|
|
panel:Hide()
|
|
|
|
if FrameTyp == "option" or FrameTyp == 2 then
|
|
panel.categoryid = DBM_GUI_Options:CreateCategory(panel, self and self.frame and self.frame.name)
|
|
panel.FrameTyp = 2
|
|
else
|
|
panel.categoryid = DBM_GUI_Bosses:CreateCategory(panel, self and self.frame and self.frame.name)
|
|
panel.FrameTyp = 1
|
|
end
|
|
|
|
self:SetLastObj(panel)
|
|
self.panels = self.panels or {}
|
|
table.insert(self.panels, {frame = panel, parent = self, framename = FrameTitle..self:GetCurrentID()})
|
|
local obj = self.panels[#self.panels]
|
|
panel.panelid = #self.panels
|
|
return setmetatable(obj, prottypemetatable)
|
|
end
|
|
|
|
-- This function don't realy destroy a window, it just hides it
|
|
function PanelPrototype:Destroy()
|
|
if self.frame.FrameTyp == 2 then
|
|
table.remove(DBM_GUI_Options.Buttons, self.frame.categoryid)
|
|
else
|
|
table.remove(DBM_GUI_Bosses.Buttons, self.frame.categoryid)
|
|
end
|
|
table.remove(self.parent.panels, self.frame.panelid)
|
|
self.frame:Hide()
|
|
end
|
|
|
|
-- This function renames the Menu Entry for a Panel
|
|
function PanelPrototype:Rename(newname)
|
|
self.frame.name = newname
|
|
end
|
|
|
|
-- This function adds areas to group widgets
|
|
--
|
|
-- arg1 = titel of this area
|
|
-- arg2 = width ot the area
|
|
-- arg3 = hight of the area
|
|
-- arg4 = autoplace
|
|
--
|
|
function PanelPrototype:CreateArea(name, width, height, autoplace)
|
|
local area = CreateFrame('Frame', FrameTitle..self:GetNewID(), self.frame, 'OptionsBoxTemplate')
|
|
area.mytype = "area"
|
|
area:SetBackdropBorderColor(0.4, 0.4, 0.4)
|
|
area:SetBackdropColor(0.15, 0.15, 0.15, 0.5)
|
|
getglobal(FrameTitle..self:GetCurrentID()..'Title'):SetText(name)
|
|
if width ~= nil and width < 0 then
|
|
area:SetWidth( self.frame:GetWidth() -12 + width)
|
|
else
|
|
area:SetWidth(width or self.frame:GetWidth()-12)
|
|
end
|
|
area:SetHeight(height or self.frame:GetHeight()-10)
|
|
|
|
if autoplace then
|
|
if select('#', self.frame:GetChildren()) == 1 then
|
|
area:SetPoint('TOPLEFT', self.frame, 5, -17)
|
|
else
|
|
area:SetPoint('TOPLEFT', select(-2, self.frame:GetChildren()) or self.frame, "BOTTOMLEFT", 0, -17)
|
|
end
|
|
end
|
|
|
|
self:SetLastObj(area)
|
|
self.areas = self.areas or {}
|
|
table.insert(self.areas, {frame = area, parent = self, framename = FrameTitle..self:GetCurrentID()})
|
|
return setmetatable(self.areas[#self.areas], prottypemetatable)
|
|
end
|
|
|
|
function DBM_GUI:GetLastObj()
|
|
return self.lastobject
|
|
end
|
|
function DBM_GUI:SetLastObj(obj)
|
|
self.lastobject = obj
|
|
end
|
|
function DBM_GUI:GetParentsLastObj()
|
|
if self.frame.mytype == "area" then
|
|
return self.parent:GetLastObj()
|
|
else
|
|
return self:GetLastObj()
|
|
end
|
|
end
|
|
end
|
|
|
|
do
|
|
local FrameNames = {}
|
|
function DBM_GUI:AddFrame(FrameName)
|
|
table.insert(FrameNames, FrameName)
|
|
end
|
|
function DBM_GUI:IsPresent(FrameName)
|
|
for k,v in ipairs(FrameNames) do
|
|
if v == FrameName then
|
|
return true
|
|
end
|
|
end
|
|
return false
|
|
end
|
|
end
|
|
|
|
|
|
do
|
|
local framecount = 0
|
|
function DBM_GUI:GetNewID()
|
|
framecount = framecount + 1
|
|
return framecount
|
|
end
|
|
function DBM_GUI:GetCurrentID()
|
|
return framecount
|
|
end
|
|
end
|
|
|
|
|
|
|
|
-- This function creates a check box
|
|
-- Autoplaced buttons will be placed under the last widget
|
|
--
|
|
-- arg1 = text right to the CheckBox
|
|
-- arg2 = autoplaced (true or nil/false)
|
|
-- arg3 = text on left side
|
|
-- arg4 = DBM.Options[arg4]
|
|
-- arg5 = DBM.Bars:SetOption(arg5, ...)
|
|
--
|
|
do
|
|
local function cursorInHitBox(frame)
|
|
local x = GetCursorPosition()
|
|
local fX = frame:GetCenter()
|
|
local hitBoxSize = -100 -- default value from the default UI template
|
|
return x - fX < hitBoxSize
|
|
end
|
|
|
|
local currActiveButton
|
|
local updateFrame = CreateFrame("Frame")
|
|
local function onUpdate(self, elapsed)
|
|
local inHitBox = cursorInHitBox(currActiveButton)
|
|
if currActiveButton.fakeHighlight and not inHitBox then
|
|
currActiveButton:UnlockHighlight()
|
|
currActiveButton.fakeHighlight = nil
|
|
elseif not currActiveButton.fakeHighlight and inHitBox then
|
|
currActiveButton:LockHighlight()
|
|
currActiveButton.fakeHighlight = true
|
|
end
|
|
local x, y = GetCursorPosition()
|
|
local scale = UIParent:GetEffectiveScale()
|
|
x, y = x / scale, y / scale
|
|
GameTooltip:SetPoint("BOTTOMLEFT", nil, "BOTTOMLEFT", x + 5, y + 2)
|
|
end
|
|
|
|
local function onHyperlinkClick(self, data, link)
|
|
if IsShiftKeyDown() then
|
|
local msg = link:gsub("|h(.*)|h", "|h[%1]|h")
|
|
local chatWindow = ChatEdit_GetActiveWindow()
|
|
if chatWindow then
|
|
chatWindow:Insert(msg)
|
|
end
|
|
elseif not IsShiftKeyDown() then
|
|
if cursorInHitBox(self:GetParent()) then
|
|
self:GetParent():Click()
|
|
end
|
|
end
|
|
end
|
|
|
|
local function onHyperlinkEnter(self, data, link)
|
|
GameTooltip:SetOwner(self, "ANCHOR_NONE") -- I want to anchor BOTTOMLEFT of the tooltip to the cursor... (not BOTTOM as in ANCHOR_CURSOR)
|
|
GameTooltip:SetHyperlink(data)
|
|
GameTooltip:Show()
|
|
currActiveButton = self:GetParent()
|
|
updateFrame:SetScript("OnUpdate", onUpdate)
|
|
if cursorInHitBox(self:GetParent()) then
|
|
self:GetParent().fakeHighlight = true
|
|
self:GetParent():LockHighlight()
|
|
end
|
|
end
|
|
|
|
local function onHyperlinkLeave(self, data, link)
|
|
GameTooltip:Hide()
|
|
updateFrame:SetScript("OnUpdate", nil)
|
|
if self:GetParent().fakeHighlight then
|
|
self:GetParent().fakeHighlight = nil
|
|
self:GetParent():UnlockHighlight()
|
|
end
|
|
end
|
|
|
|
local function replaceSpellLinks(id)
|
|
local spellId = tonumber(id)
|
|
local spellName = GetSpellInfo(spellId) or "unknown"
|
|
return ("|cff71d5ff|Hspell:%d|h%s|h|r"):format(spellId, spellName)
|
|
end
|
|
|
|
function PanelPrototype:CreateCheckButton(name, autoplace, textleft, dbmvar, dbtvar)
|
|
if not name then
|
|
return
|
|
end
|
|
if type(name) == "number" then
|
|
return DBM:AddMsg("CreateCheckButton: error: expected string, received number. You probably called mod:NewTimer(optionId) with a spell id.")
|
|
end
|
|
local button = CreateFrame('CheckButton', FrameTitle..self:GetNewID(), self.frame, 'OptionsCheckButtonTemplate')
|
|
button.myheight = 25
|
|
button.mytype = "checkbutton"
|
|
-- font strings do not support hyperlinks, so check if we need one...
|
|
if name:find("%$spell:") then
|
|
name = name:gsub("%$spell:(%d+)", replaceSpellLinks)
|
|
end
|
|
if name and name:find("|H") then -- ...and replace it with a SimpleHTML frame
|
|
setglobal(button:GetName().."Text", CreateFrame("SimpleHTML", button:GetName().."Text", button))
|
|
local html = getglobal(button:GetName().."Text")
|
|
html:SetHeight(12)
|
|
html:SetFontObject("GameFontNormal")
|
|
html:SetPoint("LEFT", button, "RIGHT", 0, 1)
|
|
html:SetScript("OnHyperlinkClick", onHyperlinkClick)
|
|
html:SetScript("OnHyperlinkEnter", onHyperlinkEnter)
|
|
html:SetScript("OnHyperlinkLeave", onHyperlinkLeave)
|
|
end
|
|
getglobal(button:GetName() .. 'Text'):SetText(name or "unknown")
|
|
getglobal(button:GetName() .. 'Text'):SetWidth( self.frame:GetWidth() - 50 )
|
|
|
|
if textleft then
|
|
getglobal(button:GetName() .. 'Text'):ClearAllPoints()
|
|
getglobal(button:GetName() .. 'Text'):SetPoint("RIGHT", button, "LEFT", 0, 0)
|
|
getglobal(button:GetName() .. 'Text'):SetJustifyH("RIGHT")
|
|
else
|
|
getglobal(button:GetName() .. 'Text'):SetJustifyH("LEFT")
|
|
end
|
|
|
|
if dbmvar and DBM.Options[dbmvar] ~= nil then
|
|
button:SetScript("OnShow", function(self) button:SetChecked(DBM.Options[dbmvar]) end)
|
|
button:SetScript("OnClick", function(self) DBM.Options[dbmvar] = not DBM.Options[dbmvar] end)
|
|
end
|
|
|
|
if dbtvar then
|
|
button:SetScript("OnShow", function(self) button:SetChecked( DBM.Bars:GetOption(dbtvar) ) end)
|
|
button:SetScript("OnClick", function(self) DBM.Bars:SetOption(dbtvar, not DBM.Bars:GetOption(dbtvar)) end)
|
|
end
|
|
|
|
if autoplace then
|
|
local x = self:GetLastObj()
|
|
if x.mytype == "checkbutton" then
|
|
button:ClearAllPoints()
|
|
button:SetPoint('TOPLEFT', self:GetLastObj(), "BOTTOMLEFT", 0, 2)
|
|
else
|
|
button:ClearAllPoints()
|
|
button:SetPoint('TOPLEFT', 10, -12)
|
|
end
|
|
end
|
|
|
|
self:SetLastObj(button)
|
|
return button
|
|
end
|
|
|
|
end
|
|
|
|
do
|
|
local function unfocus(self)
|
|
self:ClearFocus()
|
|
end
|
|
-- This function creates an EditBox
|
|
--
|
|
-- arg1 = Title text, placed ontop of the EditBox
|
|
-- arg2 = Text placed within the EditBox
|
|
-- arg3 = width
|
|
-- arg4 = height
|
|
--
|
|
function PanelPrototype:CreateEditBox(text, value, width, height)
|
|
local textbox = CreateFrame('EditBox', FrameTitle..self:GetNewID(), self.frame, 'DBM_GUI_FrameEditBoxTemplate')
|
|
textbox.mytype = "textbox"
|
|
getglobal(FrameTitle..self:GetCurrentID().."Text"):SetText(text)
|
|
textbox:SetWidth(width or 100)
|
|
textbox:SetHeight(height or 20)
|
|
textbox:SetScript("OnEscapePressed", unfocus)
|
|
textbox:SetScript("OnTabPressed", unfocus)
|
|
if type(value) == "string" then
|
|
textbox:SetText(value)
|
|
end
|
|
self:SetLastObj(textbox)
|
|
return textbox
|
|
end
|
|
end
|
|
|
|
-- This function creates a ScrollingMessageFrame (usefull for log entrys)
|
|
--
|
|
-- arg1 = width of the frame
|
|
-- arg2 = height
|
|
-- arg3 = insertmode (BOTTOM or TOP)
|
|
-- arg4 = enable message fading (default disabled)
|
|
-- arg5 = fontobject (font for the messages)
|
|
--
|
|
function PanelPrototype:CreateScrollingMessageFrame(width, height, insertmode, fading, fontobject)
|
|
local scrollframe = CreateFrame("ScrollingMessageFrame",FrameTitle..self:GetNewID(), self.frame)
|
|
scrollframe:SetWidth(width or 200)
|
|
scrollframe:SetHeight(height or 150)
|
|
scrollframe:SetJustifyH("LEFT")
|
|
if not fading then
|
|
scrollframe:SetFading(false)
|
|
end
|
|
scrollframe:SetInsertMode(insertmode or "BOTTOM")
|
|
scrollframe:SetFontObject(fontobject or "GameFontNormal")
|
|
scrollframe:SetMaxLines(2000)
|
|
scrollframe:EnableMouse(true)
|
|
scrollframe:EnableMouseWheel(1)
|
|
|
|
scrollframe:SetScript("OnHyperlinkClick", ChatFrame_OnHyperlinkShow)
|
|
scrollframe:SetScript("OnMouseWheel", function(self, arg)
|
|
if arg == 1 then
|
|
self:ScrollUp()
|
|
elseif arg == -1 then
|
|
self:ScrollDown()
|
|
end
|
|
end)
|
|
|
|
self:SetLastObj(scrollframe)
|
|
return scrollframe
|
|
end
|
|
|
|
|
|
-- This function creates a slider for numeric values
|
|
--
|
|
-- arg1 = text ontop of the slider, centered
|
|
-- arg2 = lowest value
|
|
-- arg3 = highest value
|
|
-- arg4 = stepping
|
|
-- arg5 = framewidth
|
|
--
|
|
do
|
|
local function onValueChanged(font, text)
|
|
return function(self, value)
|
|
font:SetFormattedText(text, value)
|
|
end
|
|
end
|
|
function PanelPrototype:CreateSlider(text, low, high, step, framewidth)
|
|
local slider = CreateFrame('Slider', FrameTitle..self:GetNewID(), self.frame, 'OptionsSliderTemplate')
|
|
slider.mytype = "slider"
|
|
slider:SetMinMaxValues(low, high)
|
|
slider:SetValueStep(step)
|
|
slider:SetWidth(framewidth or 180)
|
|
getglobal(FrameTitle..self:GetCurrentID()..'Text'):SetText(text)
|
|
slider:SetScript("OnValueChanged", onValueChanged(getglobal(FrameTitle..self:GetCurrentID()..'Text'), text))
|
|
self:SetLastObj(slider)
|
|
return slider
|
|
end
|
|
end
|
|
|
|
-- This function creates a color picker
|
|
--
|
|
-- arg1 = width of the colorcircle (128 default)
|
|
-- arg2 = true if you want an alpha selector
|
|
-- arg3 = width of the alpha selector (32 default)
|
|
|
|
function PanelPrototype:CreateColorSelect(dimension, withalpha, alphawidth)
|
|
--- Color select texture with wheel and value
|
|
local colorselect = CreateFrame("ColorSelect", FrameTitle..self:GetNewID(), self.frame)
|
|
colorselect.mytype = "colorselect"
|
|
if withalpha then
|
|
colorselect:SetWidth((dimension or 128)+37)
|
|
else
|
|
colorselect:SetWidth((dimension or 128))
|
|
end
|
|
colorselect:SetHeight(dimension or 128)
|
|
|
|
-- create a color wheel
|
|
local colorwheel = colorselect:CreateTexture()
|
|
colorwheel:SetWidth(dimension or 128)
|
|
colorwheel:SetHeight(dimension or 128)
|
|
colorwheel:SetPoint("TOPLEFT", colorselect, "TOPLEFT", 5, 0)
|
|
colorselect:SetColorWheelTexture(colorwheel)
|
|
|
|
-- create the colorpicker
|
|
local colorwheelthumbtexture = colorselect:CreateTexture()
|
|
colorwheelthumbtexture:SetTexture("Interface\\Buttons\\UI-ColorPicker-Buttons")
|
|
colorwheelthumbtexture:SetWidth(10)
|
|
colorwheelthumbtexture:SetHeight(10)
|
|
colorwheelthumbtexture:SetTexCoord(0,0.15625, 0, 0.625)
|
|
colorselect:SetColorWheelThumbTexture(colorwheelthumbtexture)
|
|
|
|
if withalpha then
|
|
-- create the alpha bar
|
|
local colorvalue = colorselect:CreateTexture()
|
|
colorvalue:SetWidth(alphawidth or 32)
|
|
colorvalue:SetHeight(dimension or 128)
|
|
colorvalue:SetPoint("LEFT", colorwheel, "RIGHT", 10, -3)
|
|
colorselect:SetColorValueTexture(colorvalue)
|
|
|
|
-- create the alpha arrows
|
|
local colorvaluethumbtexture = colorselect:CreateTexture()
|
|
colorvaluethumbtexture:SetTexture("Interface\\Buttons\\UI-ColorPicker-Buttons")
|
|
colorvaluethumbtexture:SetWidth( alphawidth/32 * 48)
|
|
colorvaluethumbtexture:SetHeight( alphawidth/32 * 14)
|
|
colorvaluethumbtexture:SetTexCoord(0.25, 1, 0.875, 0)
|
|
colorselect:SetColorValueThumbTexture(colorvaluethumbtexture)
|
|
end
|
|
|
|
self:SetLastObj(colorselect)
|
|
return colorselect
|
|
end
|
|
|
|
|
|
-- This function creates a button
|
|
--
|
|
-- arg1 = text on the button "OK", "Cancel",...
|
|
-- arg2 = widht
|
|
-- arg3 = height
|
|
-- arg4 = function to call when clicked
|
|
--
|
|
function PanelPrototype:CreateButton(title, width, height, onclick, FontObject)
|
|
local button = CreateFrame('Button', FrameTitle..self:GetNewID(), self.frame, 'DBM_GUI_OptionsFramePanelButtonTemplate')
|
|
button.mytype = "button"
|
|
button:SetWidth(width or 100)
|
|
button:SetHeight(height or 20)
|
|
button:SetText(title)
|
|
if onclick then
|
|
button:SetScript("OnClick", onclick)
|
|
end
|
|
if FontObject then
|
|
button:SetNormalFontObject(FontObject);
|
|
button:SetHighlightFontObject(FontObject);
|
|
end
|
|
if getglobal(button:GetName().."Text"):GetStringWidth() > button:GetWidth() then
|
|
button:SetWidth( getglobal(button:GetName().."Text"):GetStringWidth() + 25 )
|
|
end
|
|
|
|
self:SetLastObj(button)
|
|
return button
|
|
end
|
|
|
|
-- This function creates a text block for descriptions
|
|
--
|
|
-- arg1 = text to write
|
|
-- arg2 = width to set
|
|
function PanelPrototype:CreateText(text, width, autoplaced, style, justify)
|
|
local textblock = self.frame:CreateFontString(FrameTitle..self:GetNewID(), "ARTWORK")
|
|
textblock.mytype = "textblock"
|
|
if not style then
|
|
textblock:SetFontObject(GameFontNormal)
|
|
else
|
|
textblock:SetFontObject(style)
|
|
end
|
|
textblock:SetText(text)
|
|
if justify then
|
|
textblock:SetJustifyH(justify)
|
|
else
|
|
textblock:SetJustifyH("CENTER")
|
|
end
|
|
|
|
if width then
|
|
textblock:SetWidth( width or 100 )
|
|
else
|
|
textblock:SetWidth( self.frame:GetWidth() )
|
|
end
|
|
|
|
if autoplaced then
|
|
textblock:SetPoint('TOPLEFT',self.frame, "TOPLEFT", 10, -10);
|
|
end
|
|
|
|
self:SetLastObj(textblock)
|
|
return textblock
|
|
end
|
|
|
|
|
|
function PanelPrototype:CreateCreatureModelFrame(width, height, creatureid)
|
|
local ModelFrame = CreateFrame('PlayerModel', FrameTitle..self:GetNewID(), self.frame)
|
|
ModelFrame.mytype = "modelframe"
|
|
ModelFrame:SetWidth(width or 100)
|
|
ModelFrame:SetHeight(height or 200)
|
|
ModelFrame:SetCreature(tonumber(creatureid) or 448) -- Hogger!!! he kills all of you
|
|
|
|
self:SetLastObj(ModelFrame)
|
|
return ModelFrame
|
|
end
|
|
|
|
function PanelPrototype:AutoSetDimension()
|
|
if not self.frame.mytype == "area" then return end
|
|
local height = self.frame:GetHeight()
|
|
|
|
local need_height = 25
|
|
|
|
local kids = { self.frame:GetChildren() }
|
|
for _, child in pairs(kids) do
|
|
if child.myheight and type(child.myheight) == "number" then
|
|
need_height = need_height + child.myheight
|
|
else
|
|
need_height = need_height + child:GetHeight() + 50
|
|
end
|
|
end
|
|
|
|
self.frame.myheight = need_height + 25
|
|
self.frame:SetHeight(need_height)
|
|
end
|
|
|
|
function PanelPrototype:SetMyOwnHeight()
|
|
if not self.frame.mytype == "panel" then return end
|
|
|
|
local need_height = 30
|
|
|
|
local kids = { self.frame:GetChildren() }
|
|
for _, child in pairs(kids) do
|
|
if child.mytype == "area" and child.myheight then
|
|
need_height = need_height + child.myheight
|
|
elseif child.mytype == "area" then
|
|
need_height = need_height + child:GetHeight() + 30
|
|
elseif child.myheight then
|
|
need_height = need_height + child.myheight
|
|
end
|
|
end
|
|
self.frame:SetHeight(need_height)
|
|
end
|
|
|
|
|
|
local ListFrameButtonsPrototype = {}
|
|
-- Prototyp for ListFrame Options Buttons
|
|
|
|
function ListFrameButtonsPrototype:CreateCategory(frame, parent)
|
|
if not type(frame) == "table" then
|
|
DBM:AddMsg("Failed to create category - frame is not a table")
|
|
DBM:AddMsg(debugstack())
|
|
return false
|
|
elseif not frame.name then
|
|
DBM:AddMsg("Failed to create category - frame.name is missing")
|
|
DBM:AddMsg(debugstack())
|
|
return false
|
|
elseif self:IsPresent(frame.name) then
|
|
DBM:AddMsg("Frame ("..frame.name..") already exists")
|
|
DBM:AddMsg(debugstack())
|
|
return false
|
|
end
|
|
|
|
if parent then
|
|
frame.depth = self:GetDepth(parent)
|
|
else
|
|
frame.depth = 1
|
|
end
|
|
|
|
self:SetParentHasChilds(parent)
|
|
|
|
table.insert(self.Buttons, {
|
|
frame = frame,
|
|
parent = parent
|
|
})
|
|
return #self.Buttons
|
|
end
|
|
|
|
function ListFrameButtonsPrototype:IsPresent(framename)
|
|
for k,v in ipairs(self.Buttons) do
|
|
if v.frame.name == framename then
|
|
return true
|
|
end
|
|
end
|
|
return false
|
|
end
|
|
|
|
function ListFrameButtonsPrototype:GetDepth(framename, depth)
|
|
depth = depth or 1
|
|
for k,v in ipairs(self.Buttons) do
|
|
if v.frame.name == framename then
|
|
if v.parent == nil then
|
|
return depth+1
|
|
else
|
|
depth = depth + self:GetDepth(v.parent, depth)
|
|
end
|
|
end
|
|
end
|
|
return depth
|
|
end
|
|
|
|
function ListFrameButtonsPrototype:SetParentHasChilds(parent)
|
|
if not parent then return end
|
|
for k,v in ipairs(self.Buttons) do
|
|
if v.frame.name == parent then
|
|
v.frame.haschilds = true
|
|
end
|
|
end
|
|
end
|
|
|
|
|
|
do
|
|
local mytable = {}
|
|
function ListFrameButtonsPrototype:GetVisibleTabs()
|
|
table.wipe(mytable)
|
|
for k,v in ipairs(self.Buttons) do
|
|
if v.parent == nil then
|
|
table.insert(mytable, v)
|
|
|
|
if v.frame.showsub then
|
|
self:GetVisibleSubTabs(v.frame.name, mytable)
|
|
end
|
|
end
|
|
end
|
|
return mytable
|
|
end
|
|
end
|
|
|
|
function ListFrameButtonsPrototype:GetVisibleSubTabs(parent, t)
|
|
for i, v in ipairs(self.Buttons) do
|
|
if v.parent == parent then
|
|
table.insert(t, v)
|
|
if v.frame.showsub then
|
|
self:GetVisibleSubTabs(v.frame.name, t)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
local CreateNewFauxScrollFrameList
|
|
do
|
|
local mt = {__index = ListFrameButtonsPrototype}
|
|
function CreateNewFauxScrollFrameList()
|
|
return setmetatable({ Buttons={} }, mt)
|
|
end
|
|
end
|
|
|
|
DBM_GUI_Bosses = CreateNewFauxScrollFrameList()
|
|
DBM_GUI_Options = CreateNewFauxScrollFrameList()
|
|
|
|
|
|
local function GetSharedMedia3()
|
|
if LibStub and LibStub("LibSharedMedia-3.0", true) then
|
|
return LibStub("LibSharedMedia-3.0", true)
|
|
end
|
|
return false
|
|
end
|
|
|
|
|
|
local UpdateAnimationFrame
|
|
do
|
|
local function HideScrollBar(frame)
|
|
local list = getglobal(frame:GetName() .. "List");
|
|
list:Hide();
|
|
local listWidth = list:GetWidth();
|
|
for _, button in next, frame.buttons do
|
|
button:SetWidth(button:GetWidth() + listWidth);
|
|
end
|
|
end
|
|
|
|
local function DisplayScrollBar(frame)
|
|
local list = getglobal(frame:GetName() .. "List");
|
|
list:Show();
|
|
local listWidth = list:GetWidth();
|
|
for _, button in next, frame.buttons do
|
|
button:SetWidth(button:GetWidth() - listWidth);
|
|
end
|
|
end
|
|
|
|
-- the functions in this block are only used to
|
|
-- create/update/manage the Fauxscrollframe for Boss/Options Selection
|
|
local displayedElements = {}
|
|
|
|
-- This function is for internal use.
|
|
-- Function to update the left scrollframe buttons with the menu entries
|
|
function DBM_GUI_OptionsFrame:UpdateMenuFrame(listframe)
|
|
local offset = getglobal(listframe:GetName().."List").offset;
|
|
local buttons = listframe.buttons;
|
|
local TABLE
|
|
|
|
if not buttons then return false; end
|
|
|
|
if listframe:GetParent().tab == 2 then
|
|
TABLE = DBM_GUI_Options:GetVisibleTabs()
|
|
else
|
|
TABLE = DBM_GUI_Bosses:GetVisibleTabs()
|
|
end
|
|
local element;
|
|
|
|
for i, element in ipairs(displayedElements) do
|
|
displayedElements[i] = nil;
|
|
end
|
|
|
|
for i, element in ipairs(TABLE) do
|
|
table.insert(displayedElements, element.frame);
|
|
end
|
|
|
|
|
|
local numAddOnCategories = #displayedElements;
|
|
local numButtons = #buttons;
|
|
|
|
if ( numAddOnCategories > numButtons and ( not listframe:IsShown() ) ) then
|
|
DisplayScrollBar(listframe);
|
|
elseif ( numAddOnCategories <= numButtons and ( listframe:IsShown() ) ) then
|
|
HideScrollBar(listframe);
|
|
end
|
|
|
|
if ( numAddOnCategories > numButtons ) then
|
|
getglobal(listframe:GetName().."List"):Show();
|
|
getglobal(listframe:GetName().."ListScrollBar"):SetMinMaxValues(0, (numAddOnCategories - numButtons) * buttons[1]:GetHeight());
|
|
getglobal(listframe:GetName().."ListScrollBar"):SetValueStep( buttons[1]:GetHeight() )
|
|
else
|
|
getglobal(listframe:GetName().."ListScrollBar"):SetValue(0);
|
|
getglobal(listframe:GetName().."List"):Hide();
|
|
end
|
|
|
|
local selection = DBM_GUI_OptionsFrameBossMods.selection;
|
|
if ( selection ) then
|
|
DBM_GUI_OptionsFrame:ClearSelection(listframe, listframe.buttons);
|
|
end
|
|
|
|
for i = 1, #buttons do
|
|
element = displayedElements[i + offset]
|
|
if ( not element ) then
|
|
DBM_GUI_OptionsFrame:HideButton(buttons[i]);
|
|
else
|
|
DBM_GUI_OptionsFrame:DisplayButton(buttons[i], element);
|
|
|
|
if ( selection ) and ( selection == element ) and ( not listframe.selection ) then
|
|
DBM_GUI_OptionsFrame:SelectButton(listframe, buttons[i]);
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
-- This function is for internal use.
|
|
-- Used to show a button from the list
|
|
function DBM_GUI_OptionsFrame:DisplayButton(button, element)
|
|
button:Show();
|
|
button.element = element;
|
|
|
|
button.text:SetPoint("LEFT", 12 + 8 * element.depth, 2);
|
|
button.toggle:ClearAllPoints()
|
|
button.toggle:SetPoint("LEFT", 8 * element.depth - 2, 1);
|
|
|
|
if element.depth > 2 then
|
|
button:SetNormalFontObject(GameFontHighlightSmall);
|
|
button:SetHighlightFontObject(GameFontHighlightSmall);
|
|
|
|
elseif element.depth > 1 then
|
|
button:SetNormalFontObject(GameFontNormalSmall);
|
|
button:SetHighlightFontObject(GameFontNormalSmall);
|
|
else
|
|
button:SetNormalFontObject(GameFontNormal);
|
|
button:SetHighlightFontObject(GameFontNormal);
|
|
end
|
|
button:SetWidth(185)
|
|
|
|
if element.haschilds then
|
|
if not element.showsub then
|
|
button.toggle:SetNormalTexture("Interface\\Buttons\\UI-PlusButton-UP");
|
|
button.toggle:SetPushedTexture("Interface\\Buttons\\UI-PlusButton-DOWN");
|
|
else
|
|
button.toggle:SetNormalTexture("Interface\\Buttons\\UI-MinusButton-UP");
|
|
button.toggle:SetPushedTexture("Interface\\Buttons\\UI-MinusButton-DOWN");
|
|
end
|
|
button.toggle:Show();
|
|
else
|
|
button.toggle:Hide();
|
|
end
|
|
|
|
button.text:SetText(element.name);
|
|
end
|
|
|
|
-- This function is for internal use.
|
|
-- Used to hide a button from the list
|
|
function DBM_GUI_OptionsFrame:HideButton(button)
|
|
button:Hide()
|
|
end
|
|
|
|
-- This function is for internal use.
|
|
-- Called when a new entry is selected
|
|
function DBM_GUI_OptionsFrame:ClearSelection(listFrame, buttons)
|
|
for _, button in ipairs(buttons) do button:UnlockHighlight(); end
|
|
listFrame.selection = nil;
|
|
end
|
|
|
|
-- This function is for Internal use.
|
|
-- Called when a button is selected
|
|
function DBM_GUI_OptionsFrame:SelectButton(listFrame, button)
|
|
button:LockHighlight()
|
|
listFrame.selection = button.element;
|
|
end
|
|
|
|
-- This function is for Internal use.
|
|
-- Required to create a list of buttons in the scrollframe
|
|
function DBM_GUI_OptionsFrame:CreateButtons(frame)
|
|
local name = frame:GetName()
|
|
|
|
frame.scrollBar = getglobal(name.."ListScrollBar")
|
|
frame:SetBackdropBorderColor(0.6, 0.6, 0.6, 1)
|
|
getglobal(name.."Bottom"):SetVertexColor(0.66, 0.66, 0.66)
|
|
|
|
local buttons = {}
|
|
local button = CreateFrame("BUTTON", name.."Button1", frame, "DBM_GUI_FrameButtonTemplate")
|
|
button:SetPoint("TOPLEFT", frame, 0, -8)
|
|
frame.buttonHeight = button:GetHeight()
|
|
table.insert(buttons, button)
|
|
|
|
local maxButtons = (frame:GetHeight() - 8) / frame.buttonHeight
|
|
for i = 2, maxButtons do
|
|
button = CreateFrame("BUTTON", name.."Button"..i, frame, "DBM_GUI_FrameButtonTemplate")
|
|
button:SetPoint("TOPLEFT", buttons[#buttons], "BOTTOMLEFT")
|
|
table.insert(buttons, button)
|
|
end
|
|
frame.buttons = buttons
|
|
end
|
|
|
|
-- This function is for internal use.
|
|
-- Called when someone clicks a Button
|
|
function DBM_GUI_OptionsFrame:OnButtonClick(button)
|
|
local parent = button:GetParent();
|
|
local buttons = parent.buttons;
|
|
|
|
self:ClearSelection(getglobal(self:GetName().."BossMods"), getglobal(self:GetName().."BossMods").buttons);
|
|
self:ClearSelection(getglobal(self:GetName().."DBMOptions"), getglobal(self:GetName().."DBMOptions").buttons);
|
|
self:SelectButton(parent, button);
|
|
|
|
self:DisplayFrame(button.element);
|
|
end
|
|
|
|
function DBM_GUI_OptionsFrame:ToggleSubCategories(button)
|
|
local parent = button:GetParent();
|
|
if parent.element.showsub then
|
|
parent.element.showsub = false
|
|
else
|
|
parent.element.showsub = true
|
|
end
|
|
self:UpdateMenuFrame(parent:GetParent())
|
|
end
|
|
|
|
-- This function is for internal use.
|
|
-- places the selected tab on the container frame
|
|
function DBM_GUI_OptionsFrame:DisplayFrame(frame)
|
|
local container = getglobal(self:GetName().."PanelContainer")
|
|
|
|
if not (type(frame) == "table" and type(frame[0]) == "userdata") or select("#", frame:GetChildren()) == 0 then
|
|
-- DBM:AddMsg(debugstack())
|
|
return
|
|
end
|
|
|
|
if ( container.displayedFrame ) then
|
|
container.displayedFrame:Hide();
|
|
end
|
|
container.displayedFrame = frame
|
|
|
|
DBM_GUI_OptionsFramePanelContainerHeaderText:SetText( frame.name )
|
|
|
|
local mymax = frame:GetHeight() - container:GetHeight()
|
|
if mymax <= 0 then mymax = 0 end
|
|
|
|
if mymax > 0 then
|
|
getglobal(container:GetName().."FOV"):Show()
|
|
getglobal(container:GetName().."FOV"):SetScrollChild(frame)
|
|
getglobal(container:GetName().."FOVScrollBar"):SetMinMaxValues(0, mymax)
|
|
|
|
if frame.isfixed then
|
|
frame.isfixed = nil
|
|
local listwidth = getglobal(container:GetName().."FOVScrollBar"):GetWidth()
|
|
for i=1, select("#", frame:GetChildren()), 1 do
|
|
local child = select(i, frame:GetChildren())
|
|
if child.mytype == "area" then
|
|
child:SetWidth( child:GetWidth() - listwidth )
|
|
end
|
|
end
|
|
end
|
|
else
|
|
getglobal(container:GetName().."FOV"):Hide()
|
|
frame:ClearAllPoints()
|
|
frame:SetPoint("TOPLEFT", container ,"TOPLEFT", 5, 0)
|
|
frame:SetPoint("BOTTOMRIGHT", container ,"BOTTOMRIGHT", 0, 0)
|
|
|
|
if not frame.isfixed then
|
|
frame.isfixed = true
|
|
local listwidth = getglobal(container:GetName().."FOVScrollBar"):GetWidth()
|
|
for i=1, select("#", frame:GetChildren()), 1 do
|
|
local child = select(i, frame:GetChildren())
|
|
if child.mytype == "area" then
|
|
child:SetWidth( child:GetWidth() + listwidth )
|
|
end
|
|
end
|
|
end
|
|
end
|
|
frame:Show();
|
|
|
|
if usemodelframe then
|
|
DBM_BossPreview.enabled = false
|
|
DBM_BossPreview:Hide()
|
|
for _, mod in ipairs(DBM.Mods) do
|
|
if mod.panel and mod.panel.frame and mod.panel.frame == frame then
|
|
UpdateAnimationFrame(mod)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
end
|
|
|
|
function UpdateAnimationFrame(mod)
|
|
DBM_BossPreview.currentMod = mod
|
|
|
|
DBM_BossPreview:Show()
|
|
DBM_BossPreview:ClearModel()
|
|
DBM_BossPreview:SetCreature(mod.modelId or mod.creatureId or 0)
|
|
DBM_BossPreview:SetModelScale(mod.modelScale or 0.5)
|
|
|
|
DBM_BossPreview.atime = 0
|
|
DBM_BossPreview.apos = 0
|
|
DBM_BossPreview.rotation = 0
|
|
DBM_BossPreview.modelRotation = mod.modelRotation or -90
|
|
DBM_BossPreview.modelOffsetX = mod.modelOffsetX or 0
|
|
DBM_BossPreview.modelOffsetY = mod.modelOffsetY or 0
|
|
DBM_BossPreview.modelOffsetZ = mod.modelOffsetZ or 0
|
|
DBM_BossPreview.modelscale = mod.modelScale or 0.5
|
|
DBM_BossPreview.modelMoveSpeed = mod.modelMoveSpeed or 1
|
|
DBM_BossPreview.pos_x = 1
|
|
DBM_BossPreview.pos_y = 0
|
|
DBM_BossPreview.pos_z = 0
|
|
DBM_BossPreview.alpha = 1
|
|
DBM_BossPreview.scale = 0
|
|
DBM_BossPreview.apos = 0
|
|
DBM_BossPreview:SetAlpha(DBM_BossPreview.alpha)
|
|
DBM_BossPreview:SetFacing( DBM_BossPreview.modelRotation *math.pi/180)
|
|
DBM_BossPreview:SetPosition(
|
|
DBM_BossPreview.pos_z + DBM_BossPreview.modelOffsetZ,
|
|
DBM_BossPreview.pos_x + DBM_BossPreview.modelOffsetX,
|
|
DBM_BossPreview.pos_y + DBM_BossPreview.modelOffsetY)
|
|
DBM_BossPreview.enabled = true
|
|
|
|
DBM_BossPreview:SetSequence(4)
|
|
end
|
|
|
|
local function CreateAnimationFrame()
|
|
local mobstyle = CreateFrame('PlayerModel', "DBM_BossPreview", DBM_GUI_OptionsFramePanelContainer)
|
|
mobstyle:SetPoint("BOTTOMRIGHT", DBM_GUI_OptionsFramePanelContainer, "BOTTOMRIGHT", -5, 5)
|
|
mobstyle:SetWidth( DBM_GUI_OptionsFramePanelContainer:GetWidth()-10 )
|
|
mobstyle:SetHeight( DBM_GUI_OptionsFramePanelContainer:GetHeight()-10 )
|
|
|
|
mobstyle.playlist = { -- start animation outside of our fov
|
|
{set_y = 0, set_x = 1.1, set_z = 0, setfacing = -90, setalpha = 1},
|
|
-- wait outside fov befor begining
|
|
{mintime = 1000, maxtime = 7000}, -- randomtime to wait
|
|
-- {time = 10000}, -- just wait 10 seconds
|
|
|
|
-- move in the fov and to waypoint #1
|
|
{animation = 4, time = 1500, move_x = -0.7},
|
|
--{animation = 0, time = 10, endfacing = -90 }, -- rotate in an animation
|
|
|
|
-- stay on waypoint #1
|
|
{setfacing = 0},
|
|
{animation = 0, time = 10000},
|
|
--{animation = 0, time = 2000, randomanimation = {45,46,47}}, -- play a random emote
|
|
|
|
-- move to next waypoint
|
|
{setfacing = -90},
|
|
{animation = 4, time = 5000, move_x = -2.5},
|
|
|
|
-- stay on waypoint #2
|
|
{setfacing = 0},
|
|
{animation = 0, time = 10000,},
|
|
|
|
--[[
|
|
-- move to the horizont
|
|
{setfacing = 180},
|
|
{animation = 4, time = 10000, toscale=0.005},
|
|
|
|
-- die and despawn
|
|
{animation = 1, time = 5000},
|
|
{animation = 6, time = 2000, toalpha = 0},
|
|
--]]
|
|
-- we want so sleep a little while on animation end
|
|
{mintime = 1000, maxtime = 3000},
|
|
}
|
|
|
|
mobstyle:SetScript("OnUpdate", function(self, e)
|
|
if not self.enabled then return end
|
|
|
|
self.atime = self.atime + e*1000
|
|
if self.pos_x < -2.5 then
|
|
self.pos_x = 1
|
|
end
|
|
self.pos_x = self.pos_x - 0.005
|
|
self:SetSequenceTime(4, self.atime)
|
|
self:SetPosition(
|
|
self.pos_z + self.modelOffsetZ,
|
|
self.pos_x + self.modelOffsetX,
|
|
self.pos_y + self.modelOffsetY
|
|
)
|
|
--DBM:AddMsg("X = "..self.pos_x)
|
|
|
|
end)
|
|
|
|
--[[
|
|
mobstyle:SetScript("OnUpdate", function(self, e)
|
|
--if true then return end
|
|
if not self.enabled then return end
|
|
self.atime = self.atime + e * 1000
|
|
if self.apos == 0 or self.atime >= (self.playlist[self.apos].time or 0) then
|
|
self.apos = self.apos + 1
|
|
if self.apos <= #self.playlist and self.playlist[self.apos].setfacing then
|
|
self:SetFacing( (self.playlist[self.apos].setfacing + self.modelRotation) * math.pi/180)
|
|
end
|
|
if self.apos <= #self.playlist and self.playlist[self.apos].setalpha then
|
|
self:SetAlpha(self.playlist[self.apos].setalpha)
|
|
end
|
|
if self.apos <= #self.playlist and (self.playlist[self.apos].set_y or self.playlist[self.apos].set_x or self.playlist[self.apos].set_z) then
|
|
self.pos_y = self.playlist[self.apos].set_y or self.pos_y
|
|
self.pos_x = self.playlist[self.apos].set_x or self.pos_x
|
|
self.pos_z = self.playlist[self.apos].set_z or self.pos_z
|
|
self:SetPosition(
|
|
self.pos_z + self.modelOffsetZ,
|
|
self.pos_x + self.modelOffsetX,
|
|
self.pos_y + self.modelOffsetY
|
|
)
|
|
end
|
|
if self.apos > #self.playlist then
|
|
|
|
self:SetAlpha(1)
|
|
self:SetModelScale(1.0)
|
|
self:SetPosition(0, 0, 0)
|
|
self:SetCreature(self.currentMod.modelId or self.currentMod.creatureId or 0)
|
|
|
|
self.apos = 0
|
|
self.pos_x = 0
|
|
self.pos_y = 0
|
|
self.pos_z = 0
|
|
self.alpha = 1
|
|
self.scale = self.modelscale
|
|
|
|
self:SetAlpha(self.alpha)
|
|
self:SetFacing(self.modelRotation)
|
|
self:SetModelScale(self.modelscale)
|
|
self:SetPosition(
|
|
self.pos_z + self.modelOffsetZ,
|
|
self.pos_x + self.modelOffsetX,
|
|
self.pos_y + self.modelOffsetY
|
|
)
|
|
return
|
|
end
|
|
self.rotation = self:GetFacing()
|
|
if self.playlist[self.apos].randomanimation then
|
|
self.playlist[self.apos].animation = self.playlist[self.apos].randomanimation[math.random(1, #self.playlist[self.apos].randomanimation)]
|
|
end
|
|
if self.playlist[self.apos].mintime and self.playlist[self.apos].maxtime then
|
|
self.playlist[self.apos].time = math.random(self.playlist[self.apos].mintime, self.playlist[self.apos].maxtime)
|
|
end
|
|
|
|
|
|
self.atime = 0
|
|
self.playlist[self.apos].animation = self.playlist[self.apos].animation or 0
|
|
self:SetSequence(self.playlist[self.apos].animation)
|
|
end
|
|
|
|
if self.playlist[self.apos].animation > 0 then
|
|
self:SetSequenceTime(self.playlist[self.apos].animation, self.atime)
|
|
end
|
|
|
|
if self.playlist[self.apos].endfacing then -- not self.playlist[self.apos].endfacing == self:GetFacing()
|
|
self.rotation = self.rotation + (e * 2 * math.pi * -- Rotations per second
|
|
((self.playlist[self.apos].endfacing/360)
|
|
/ (self.playlist[self.apos].time/1000))
|
|
)
|
|
|
|
self:SetFacing( self.rotation )
|
|
end
|
|
if self.playlist[self.apos].move_x then
|
|
--self.pos_x = self.pos_x + (self.playlist[self.apos].move_x / (self.playlist[self.apos].time/1000) ) * e
|
|
self.pos_x = self.pos_x + (((self.playlist[self.apos].move_x / (self.playlist[self.apos].time/1000) ) * e) * self.modelMoveSpeed)
|
|
self:SetPosition(self.pos_z+self.modelOffsetZ, self.pos_x+self.modelOffsetX, self.pos_y+self.modelOffsetY)
|
|
end
|
|
if self.playlist[self.apos].move_y then
|
|
self.pos_y = self.pos_y + (self.playlist[self.apos].move_y / (self.playlist[self.apos].time/1000) ) * e
|
|
--self:SetPosition(self.pos_y, self.pos_x, self.pos_z)
|
|
self:SetPosition(self.pos_z+self.modelOffsetZ, self.pos_x+self.modelOffsetX, self.pos_y+self.modelOffsetY)
|
|
end
|
|
if self.playlist[self.apos].move_z then
|
|
self.pos_z = self.pos_z + (self.playlist[self.apos].move_z / (self.playlist[self.apos].time/1000) ) * e
|
|
--self:SetPosition(self.pos_y, self.pos_x, self.pos_z)
|
|
self:SetPosition(self.pos_z+self.modelOffsetZ, self.pos_x+self.modelOffsetX, self.pos_y+self.modelOffsetY)
|
|
end
|
|
if self.playlist[self.apos].toalpha then
|
|
self.alpha = self.alpha - ((1 - self.playlist[self.apos].toalpha) / (self.playlist[self.apos].time/1000) ) * e
|
|
self:SetAlpha(self.alpha)
|
|
end
|
|
if self.playlist[self.apos].toscale then
|
|
self.scale = self.scale - ((self.modelscale - self.playlist[self.apos].toscale) / (self.playlist[self.apos].time/1000) ) * e
|
|
if self.scale < 0 then self.scale = 0.0001 end
|
|
self:SetModelScale(self.scale)
|
|
end
|
|
end) --]]
|
|
return mobstyle
|
|
end
|
|
|
|
local function CreateOptionsMenu()
|
|
-- *****************************************************************
|
|
--
|
|
-- begin creating the Option Frames, this is mainly hardcoded
|
|
-- because this allows me to place all the options as I want.
|
|
--
|
|
-- This API can be used to add your own tabs to our menu
|
|
--
|
|
-- To create a new tab please use the following function:
|
|
--
|
|
-- yourframe = DBM_GUI_Frame:CreateNewPanel("title", "option")
|
|
--
|
|
-- You can use the DBM widgets by calling methods like
|
|
--
|
|
-- yourframe:CreateCheckButton("my first checkbox", true)
|
|
--
|
|
-- If you Set the second argument to true, the checkboxes will be
|
|
-- placed automatically.
|
|
--
|
|
-- *****************************************************************
|
|
|
|
|
|
DBM_GUI_Frame = DBM_GUI:CreateNewPanel(L.TabCategory_Options, "option")
|
|
if usemodelframe then CreateAnimationFrame() end
|
|
do
|
|
----------------------------------------------
|
|
-- General Options --
|
|
----------------------------------------------
|
|
local generaloptions = DBM_GUI_Frame:CreateArea(L.General, nil, 210, true)
|
|
|
|
local enabledbm = generaloptions:CreateCheckButton(L.EnableDBM, true)
|
|
enabledbm:SetScript("OnShow", function() enabledbm:SetChecked(DBM:IsEnabled()) end)
|
|
enabledbm:SetScript("OnClick", function() if DBM:IsEnabled() then DBM:Disable() else DBM:Enable() end end)
|
|
|
|
local StatusEnabled = generaloptions:CreateCheckButton(L.EnableStatus, true, nil, "StatusEnabled")
|
|
local AutoRespond = generaloptions:CreateCheckButton(L.AutoRespond, true, nil, "AutoRespond")
|
|
local MiniMapIcon = generaloptions:CreateCheckButton(L.EnableMiniMapIcon, true)
|
|
local FixCLEUOnCombatStart = generaloptions:CreateCheckButton(L.FixCLEUOnCombatStart, true, nil, "FixCLEUOnCombatStart")
|
|
MiniMapIcon:SetScript("OnClick", function(self)
|
|
DBM:ToggleMinimapButton()
|
|
self:SetChecked( DBM.Options.ShowMinimapButton )
|
|
end)
|
|
MiniMapIcon:SetScript("OnShow", function(self)
|
|
self:SetChecked( DBM.Options.ShowMinimapButton )
|
|
end)
|
|
|
|
local bmrange = generaloptions:CreateButton(L.Button_RangeFrame)
|
|
bmrange:SetPoint('TOPLEFT', MiniMapIcon, "BOTTOMLEFT", 0, -25)
|
|
bmrange:SetScript("OnClick", function(self)
|
|
if DBM.RangeCheck:IsShown() then
|
|
DBM.RangeCheck:Hide()
|
|
else
|
|
DBM.RangeCheck:Show()
|
|
end
|
|
end)
|
|
|
|
local bmtestmode = generaloptions:CreateButton(L.Button_TestBars)
|
|
bmtestmode:SetPoint('TOPLEFT', bmrange, "TOPRIGHT", 0, 0)
|
|
bmtestmode:SetScript("OnClick", function(self) DBM:DemoMode() end)
|
|
|
|
local latencySlider = generaloptions:CreateSlider(L.Latency_Text, 50, 750, 5, 210) -- (text , min_value , max_value , step , width)
|
|
latencySlider:SetPoint('BOTTOMLEFT', bmrange, "BOTTOMLEFT", 10, -35)
|
|
latencySlider:HookScript("OnShow", function(self) self:SetValue(DBM.Options.LatencyThreshold) end)
|
|
latencySlider:HookScript("OnValueChanged", function(self) DBM.Options.LatencyThreshold = self:GetValue() end)
|
|
|
|
-- Pizza Timer (create your own timer menu)
|
|
local pizzaarea = DBM_GUI_Frame:CreateArea(L.PizzaTimer_Headline, nil, 85)
|
|
pizzaarea.frame:SetPoint('TOPLEFT', generaloptions.frame, "BOTTOMLEFT", 0, -20)
|
|
|
|
local textbox = pizzaarea:CreateEditBox(L.PizzaTimer_Title, "Pizza!", 175)
|
|
local hourbox = pizzaarea:CreateEditBox(L.PizzaTimer_Hours, "0", 25)
|
|
local minbox = pizzaarea:CreateEditBox(L.PizzaTimer_Mins, "15", 25)
|
|
local secbox = pizzaarea:CreateEditBox(L.PizzaTimer_Secs, "0", 25)
|
|
|
|
textbox:SetMaxLetters(17)
|
|
textbox:SetPoint('TOPLEFT', 30, -25)
|
|
hourbox:SetNumeric()
|
|
hourbox:SetMaxLetters(2)
|
|
hourbox:SetPoint('TOPLEFT', textbox, "TOPRIGHT", 20, 0)
|
|
minbox:SetNumeric()
|
|
minbox:SetMaxLetters(2)
|
|
minbox:SetPoint('TOPLEFT', hourbox, "TOPRIGHT", 20, 0)
|
|
secbox:SetNumeric()
|
|
secbox:SetMaxLetters(2)
|
|
secbox:SetPoint('TOPLEFT', minbox, "TOPRIGHT", 20, 0)
|
|
|
|
local BcastTimer = pizzaarea:CreateCheckButton(L.PizzaTimer_BroadCast)
|
|
local okbttn = pizzaarea:CreateButton(L.PizzaTimer_ButtonStart);
|
|
okbttn:SetPoint('TOPLEFT', textbox, "BOTTOMLEFT", -7, -8)
|
|
BcastTimer:SetPoint("TOPLEFT", okbttn, "TOPRIGHT", 10, 3)
|
|
|
|
pizzaarea.frame:SetScript("OnShow", function(self)
|
|
if DBM:GetRaidRank() == 0 then
|
|
BcastTimer:Hide()
|
|
else
|
|
BcastTimer:Show()
|
|
end
|
|
end)
|
|
|
|
okbttn:SetScript("OnClick", function()
|
|
local time = (hourbox:GetNumber() * 60*60) + (minbox:GetNumber() * 60) + secbox:GetNumber()
|
|
if textbox:GetText() and time > 0 then
|
|
DBM:CreatePizzaTimer(time, textbox:GetText(), BcastTimer:GetChecked())
|
|
end
|
|
end)
|
|
|
|
-- END Pizza Timer
|
|
--
|
|
DBM_GUI_Frame:SetMyOwnHeight()
|
|
end
|
|
do
|
|
-----------------------------------------------
|
|
-- Raid Warning Colors --
|
|
-----------------------------------------------
|
|
local RaidWarningPanel = DBM_GUI_Frame:CreateNewPanel(L.Tab_RaidWarning, "option")
|
|
local raidwarnoptions = RaidWarningPanel:CreateArea(L.RaidWarning_Header, nil, 165, true)
|
|
|
|
local ShowWarningsInChat = raidwarnoptions:CreateCheckButton(L.ShowWarningsInChat, true, nil, "ShowWarningsInChat")
|
|
local ShowFakedRaidWarnings = raidwarnoptions:CreateCheckButton(L.ShowFakedRaidWarnings, true, nil, "ShowFakedRaidWarnings")
|
|
local WarningIconLeft = raidwarnoptions:CreateCheckButton(L.WarningIconLeft, true, nil, "WarningIconLeft")
|
|
local WarningIconRight = raidwarnoptions:CreateCheckButton(L.WarningIconRight, true, nil, "WarningIconRight")
|
|
|
|
-- RaidWarn Sound
|
|
local Sounds = {
|
|
{ text = L.NoSound, value = "" },
|
|
{ text = "Default", value = "Sound\\interface\\RaidWarning.wav", sound=true },
|
|
{ text = "Classic", value = "Sound\\Doodad\\BellTollNightElf.wav", sound=true }
|
|
}
|
|
if GetSharedMedia3() then
|
|
for k,v in next, GetSharedMedia3():HashTable("sound") do
|
|
if k ~= "None" then -- lol ace .. playsound accepts empty strings.. quite.mp3 wtf!
|
|
table.insert(Sounds, {text=k, value=v, sound=true})
|
|
end
|
|
end
|
|
end
|
|
local RaidWarnSoundDropDown = raidwarnoptions:CreateDropdown(L.RaidWarnSound, Sounds,
|
|
DBM.Options.RaidWarningSound, function(value)
|
|
DBM.Options.RaidWarningSound = value
|
|
end
|
|
)
|
|
RaidWarnSoundDropDown:SetPoint("TOPLEFT", WarningIconRight, "BOTTOMLEFT", 20, -10)
|
|
|
|
local raidwarncolors = RaidWarningPanel:CreateArea(L.RaidWarnColors, nil, 175, true)
|
|
|
|
local color1 = raidwarncolors:CreateColorSelect(64)
|
|
local color2 = raidwarncolors:CreateColorSelect(64)
|
|
local color3 = raidwarncolors:CreateColorSelect(64)
|
|
local color4 = raidwarncolors:CreateColorSelect(64)
|
|
local color1text = raidwarncolors:CreateText(L.RaidWarnColor_1, 64)
|
|
local color2text = raidwarncolors:CreateText(L.RaidWarnColor_2, 64)
|
|
local color3text = raidwarncolors:CreateText(L.RaidWarnColor_3, 64)
|
|
local color4text = raidwarncolors:CreateText(L.RaidWarnColor_4, 64)
|
|
local color1reset = raidwarncolors:CreateButton(L.Reset, 60, 10, nil, GameFontNormalSmall)
|
|
local color2reset = raidwarncolors:CreateButton(L.Reset, 60, 10, nil, GameFontNormalSmall)
|
|
local color3reset = raidwarncolors:CreateButton(L.Reset, 60, 10, nil, GameFontNormalSmall)
|
|
local color4reset = raidwarncolors:CreateButton(L.Reset, 60, 10, nil, GameFontNormalSmall)
|
|
|
|
color1:SetPoint('TOPLEFT', 30, -20)
|
|
color2:SetPoint('TOPLEFT', color1, "TOPRIGHT", 30, 0)
|
|
color3:SetPoint('TOPLEFT', color2, "TOPRIGHT", 30, 0)
|
|
color4:SetPoint('TOPLEFT', color3, "TOPRIGHT", 30, 0)
|
|
|
|
local function UpdateColor(self)
|
|
local r, g, b = self:GetColorRGB()
|
|
self.textid:SetTextColor(r, g, b)
|
|
DBM.Options.WarningColors[self.myid].r = r
|
|
DBM.Options.WarningColors[self.myid].g = g
|
|
DBM.Options.WarningColors[self.myid].b = b
|
|
end
|
|
local function ResetColor(id, frame)
|
|
return function(self)
|
|
DBM.Options.WarningColors[id].r = DBM.DefaultOptions.WarningColors[id].r
|
|
DBM.Options.WarningColors[id].g = DBM.DefaultOptions.WarningColors[id].g
|
|
DBM.Options.WarningColors[id].b = DBM.DefaultOptions.WarningColors[id].b
|
|
frame:SetColorRGB(DBM.Options.WarningColors[id].r, DBM.Options.WarningColors[id].g, DBM.Options.WarningColors[id].b)
|
|
end
|
|
end
|
|
local function UpdateColorFrames(color, text, rset, id)
|
|
color.textid = text
|
|
color.myid = id
|
|
color:SetScript("OnColorSelect", UpdateColor)
|
|
color:SetColorRGB(DBM.Options.WarningColors[id].r, DBM.Options.WarningColors[id].g, DBM.Options.WarningColors[id].b)
|
|
text:SetPoint('TOPLEFT', color, "BOTTOMLEFT", 3, -10)
|
|
text:SetJustifyH("CENTER")
|
|
rset:SetPoint("TOP", text, "BOTTOM", 0, -5)
|
|
rset:SetScript("OnClick", ResetColor(id, color))
|
|
end
|
|
UpdateColorFrames(color1, color1text, color1reset, 1)
|
|
UpdateColorFrames(color2, color2text, color2reset, 2)
|
|
UpdateColorFrames(color3, color3text, color3reset, 3)
|
|
UpdateColorFrames(color4, color4text, color4reset, 4)
|
|
|
|
local infotext = raidwarncolors:CreateText(L.InfoRaidWarning, 380, false, GameFontNormalSmall, "LEFT")
|
|
infotext:SetPoint('BOTTOMLEFT', raidwarncolors.frame, "BOTTOMLEFT", 10, 10)
|
|
|
|
local movemebutton = raidwarncolors:CreateButton(L.MoveMe, 100, 16)
|
|
movemebutton:SetPoint('BOTTOMRIGHT', raidwarncolors.frame, "TOPRIGHT", 0, -1)
|
|
movemebutton:SetNormalFontObject(GameFontNormalSmall);
|
|
movemebutton:SetHighlightFontObject(GameFontNormalSmall);
|
|
do
|
|
local anchorFrame
|
|
local function hideme()
|
|
anchorFrame:Hide()
|
|
end
|
|
movemebutton:SetScript("OnClick", function(self)
|
|
DBM:Schedule(20, hideme)
|
|
DBM.Bars:CreateBar(20, L.BarWhileMove)
|
|
if not anchorFrame then
|
|
anchorFrame = CreateFrame("Frame", "DBM_GUI_RaidWarnAnchor", UIParent)
|
|
anchorFrame:SetWidth(32)
|
|
anchorFrame:SetHeight(32)
|
|
anchorFrame:EnableMouse(true)
|
|
anchorFrame:SetPoint("BOTTOM", RaidWarningFrame, "TOP", 0, 1)
|
|
anchorFrame.texture = anchorFrame:CreateTexture()
|
|
anchorFrame.texture:SetTexture("Interface\\Addons\\DBM-GUI\\textures\\dot.blp")
|
|
anchorFrame.texture:SetPoint("CENTER", anchorFrame, "CENTER", 0, 0)
|
|
anchorFrame.texture:SetWidth(32)
|
|
anchorFrame.texture:SetHeight(32)
|
|
anchorFrame:SetScript("OnMouseDown", function(self)
|
|
RaidWarningFrame:SetMovable(1)
|
|
RaidWarningFrame:StartMoving()
|
|
DBM:Unschedule(hideme)
|
|
DBM.Bars:CancelBar(L.BarWhileMove)
|
|
end)
|
|
anchorFrame:SetScript("OnMouseUp", function(self)
|
|
RaidWarningFrame:StopMovingOrSizing()
|
|
RaidWarningFrame:SetMovable(0)
|
|
local point, _, _, xOfs, yOfs = RaidWarningFrame:GetPoint(1)
|
|
DBM.Options.RaidWarningPosition.Point = point
|
|
DBM.Options.RaidWarningPosition.X = xOfs
|
|
DBM.Options.RaidWarningPosition.Y = yOfs
|
|
DBM:Schedule(15, hideme)
|
|
DBM.Bars:CreateBar(15, L.BarWhileMove)
|
|
end)
|
|
do
|
|
local elapsed = 10
|
|
anchorFrame:SetScript("OnUpdate", function(self, e)
|
|
elapsed = elapsed + e
|
|
if elapsed > 5 then
|
|
elapsed = 0
|
|
RaidNotice_AddMessage(RaidWarningFrame, L.RaidWarnMessage, ChatTypeInfo["RAID_WARNING"])
|
|
end
|
|
end)
|
|
end
|
|
|
|
anchorFrame:Show()
|
|
else
|
|
if anchorFrame:IsShown() then
|
|
anchorFrame:Hide()
|
|
else
|
|
anchorFrame:Show()
|
|
end
|
|
end
|
|
end)
|
|
end
|
|
end
|
|
|
|
do
|
|
local BarSetupPanel = DBM_GUI_Frame:CreateNewPanel(L.BarSetup, "option")
|
|
|
|
local BarSetup = BarSetupPanel:CreateArea(L.AreaTitle_BarSetup, nil, 240, true)
|
|
|
|
local movemebutton = BarSetup:CreateButton(L.MoveMe, 100, 16)
|
|
movemebutton:SetPoint('BOTTOMRIGHT', BarSetup.frame, "TOPRIGHT", 0, -1)
|
|
movemebutton:SetNormalFontObject(GameFontNormalSmall);
|
|
movemebutton:SetHighlightFontObject(GameFontNormalSmall);
|
|
movemebutton:SetScript("OnClick", function() DBM.Bars:ShowMovableBar() end)
|
|
|
|
local maindummybar = DBM.Bars:CreateDummyBar()
|
|
maindummybar.frame:SetParent(BarSetup.frame)
|
|
maindummybar.frame:SetPoint('BOTTOM', BarSetup.frame, "TOP", 0, -65)
|
|
maindummybar.frame:SetScript("OnUpdate", function(self, elapsed) maindummybar:Update(elapsed) end)
|
|
do
|
|
-- little hook to prevent this bar from changing size/scale
|
|
local old = maindummybar.ApplyStyle
|
|
function maindummybar:ApplyStyle(...)
|
|
old(self, ...)
|
|
self.frame:SetWidth(183)
|
|
self.frame:SetScale(0.9)
|
|
getglobal(self.frame:GetName().."Bar"):SetWidth(183)
|
|
end
|
|
end
|
|
|
|
local iconleft = BarSetup:CreateCheckButton(L.BarIconLeft, nil, nil, nil, "IconLeft")
|
|
local iconright = BarSetup:CreateCheckButton(L.BarIconRight, nil, true, nil, "IconRight")
|
|
iconleft:SetPoint('BOTTOMRIGHT', maindummybar.frame, "TOPLEFT", -5, 5)
|
|
iconright:SetPoint('BOTTOMLEFT', maindummybar.frame, "TOPRIGHT", 5, 5)
|
|
|
|
local color1 = BarSetup:CreateColorSelect(64)
|
|
local color2 = BarSetup:CreateColorSelect(64)
|
|
color1:SetPoint('TOPLEFT', BarSetup.frame, "TOPLEFT", 20, -80)
|
|
color2:SetPoint('TOPLEFT', color1, "TOPRIGHT", 20, 0)
|
|
|
|
local color1reset = BarSetup:CreateButton(L.Reset, 64, 10, nil, GameFontNormalSmall)
|
|
local color2reset = BarSetup:CreateButton(L.Reset, 64, 10, nil, GameFontNormalSmall)
|
|
color1reset:SetPoint('TOP', color1, "BOTTOM", 5, -10)
|
|
color2reset:SetPoint('TOP', color2, "BOTTOM", 5, -10)
|
|
color1reset:SetScript("OnClick", function(self)
|
|
color1:SetColorRGB(DBM.Bars:GetDefaultOption("StartColorR"), DBM.Bars:GetDefaultOption("StartColorG"), DBM.Bars:GetDefaultOption("StartColorB"))
|
|
end)
|
|
color2reset:SetScript("OnClick", function(self)
|
|
color2:SetColorRGB(DBM.Bars:GetDefaultOption("EndColorR"), DBM.Bars:GetDefaultOption("EndColorG"), DBM.Bars:GetDefaultOption("EndColorB"))
|
|
end)
|
|
|
|
local color1text = BarSetup:CreateText(L.BarStartColor, 80)
|
|
local color2text = BarSetup:CreateText(L.BarEndColor, 80)
|
|
color1text:SetPoint("BOTTOM", color1, "TOP", 0, 4)
|
|
color2text:SetPoint("BOTTOM", color2, "TOP", 0, 4)
|
|
color1:SetScript("OnShow", function(self) self:SetColorRGB(
|
|
DBM.Bars:GetOption("StartColorR"),
|
|
DBM.Bars:GetOption("StartColorG"),
|
|
DBM.Bars:GetOption("StartColorB"))
|
|
color1text:SetTextColor(
|
|
DBM.Bars:GetOption("StartColorR"),
|
|
DBM.Bars:GetOption("StartColorG"),
|
|
DBM.Bars:GetOption("StartColorB")
|
|
)
|
|
end)
|
|
color2:SetScript("OnShow", function(self) self:SetColorRGB(
|
|
DBM.Bars:GetOption("EndColorR"),
|
|
DBM.Bars:GetOption("EndColorG"),
|
|
DBM.Bars:GetOption("EndColorB"))
|
|
color2text:SetTextColor(
|
|
DBM.Bars:GetOption("EndColorR"),
|
|
DBM.Bars:GetOption("EndColorG"),
|
|
DBM.Bars:GetOption("EndColorB")
|
|
)
|
|
end)
|
|
color1:SetScript("OnColorSelect", function(self)
|
|
DBM.Bars:SetOption("StartColorR", select(1, self:GetColorRGB()))
|
|
DBM.Bars:SetOption("StartColorG", select(2, self:GetColorRGB()))
|
|
DBM.Bars:SetOption("StartColorB", select(3, self:GetColorRGB()))
|
|
color1text:SetTextColor(self:GetColorRGB())
|
|
end)
|
|
color2:SetScript("OnColorSelect", function(self)
|
|
DBM.Bars:SetOption("EndColorR", select(1, self:GetColorRGB()))
|
|
DBM.Bars:SetOption("EndColorG", select(2, self:GetColorRGB()))
|
|
DBM.Bars:SetOption("EndColorB", select(3, self:GetColorRGB()))
|
|
color2text:SetTextColor(self:GetColorRGB())
|
|
end)
|
|
|
|
local Textures = {
|
|
{ text = "Default", value = "Interface\\AddOns\\DBM-Core\\textures\\default.tga", texture = "Interface\\AddOns\\DBM-Core\\textures\\default.tga" },
|
|
{ text = "Blizzad", value = "Interface\\PaperDollInfoFrame\\UI-Character-Skills-Bar", texture = "Interface\\PaperDollInfoFrame\\UI-Character-Skills-Bar" },
|
|
{ text = "Glaze", value = "Interface\\AddOns\\DBM-Core\\textures\\glaze.tga", texture = "Interface\\AddOns\\DBM-Core\\textures\\glaze.tga" },
|
|
{ text = "Otravi", value = "Interface\\AddOns\\DBM-Core\\textures\\otravi.tga", texture = "Interface\\AddOns\\DBM-Core\\textures\\otravi.tga" },
|
|
{ text = "Smooth", value = "Interface\\AddOns\\DBM-Core\\textures\\smooth.tga", texture = "Interface\\AddOns\\DBM-Core\\textures\\smooth.tga" }
|
|
}
|
|
if GetSharedMedia3() then
|
|
for k,v in next, GetSharedMedia3():HashTable("statusbar") do
|
|
table.insert(Textures, {text=k, value=v, texture=v})
|
|
end
|
|
end
|
|
local TextureDropDown = BarSetup:CreateDropdown(L.BarTexture, Textures,
|
|
DBM.Bars:GetOption("Texture"), function(value)
|
|
DBM.Bars:SetOption("Texture", value)
|
|
end
|
|
)
|
|
TextureDropDown:SetPoint("TOPLEFT", BarSetup.frame, "TOPLEFT", 210, -80)
|
|
|
|
local ExpandUpwards = BarSetup:CreateCheckButton(L.ExpandUpwards, false, nil, nil, "ExpandUpwards")
|
|
ExpandUpwards:SetPoint("TOPLEFT", TextureDropDown, "BOTTOMLEFT", 0, -10)
|
|
|
|
local FillUpBars = BarSetup:CreateCheckButton(L.FillUpBars, false, nil, nil, "FillUpBars")
|
|
FillUpBars:SetPoint("TOP", ExpandUpwards, "BOTTOM", 0, 5)
|
|
|
|
local ClickThrough = BarSetup:CreateCheckButton(L.ClickThrough, false, nil, nil, "ClickThrough")
|
|
ClickThrough:SetPoint("TOPLEFT", color1reset, "BOTTOMLEFT", -7, -5)
|
|
|
|
-- Functions for the next 2 Areas
|
|
local function createDBTOnShowHandler(option)
|
|
return function(self)
|
|
self:SetValue(DBM.Bars:GetOption(option))
|
|
end
|
|
end
|
|
local function createDBTOnValueChangedHandler(option)
|
|
return function(self)
|
|
DBM.Bars:SetOption(option, self:GetValue())
|
|
end
|
|
end
|
|
|
|
local Fonts = {
|
|
{ text = "Default", value = STANDARD_TEXT_FONT, font = STANDARD_TEXT_FONT },
|
|
{ text = "Arial", value = "Fonts\\ARIALN.TTF", font = "Fonts\\ARIALN.TTF" },
|
|
{ text = "Skurri", value = "Fonts\\skurri.ttf", font = "Fonts\\skurri.ttf" },
|
|
{ text = "Morpheus", value = "Fonts\\MORPHEUS.ttf", font = "Fonts\\MORPHEUS.ttf" }
|
|
}
|
|
if GetSharedMedia3() then
|
|
for k,v in next, GetSharedMedia3():HashTable("font") do
|
|
table.insert(Fonts, {text=k, value=v, font=v})
|
|
end
|
|
end
|
|
local FontDropDown = BarSetup:CreateDropdown(L.Bar_Font, Fonts, DBM.Bars:GetOption("Font"),
|
|
function(value)
|
|
DBM.Bars:SetOption("Font", value)
|
|
end)
|
|
FontDropDown:SetPoint("TOPLEFT", BarSetup.frame, "TOPLEFT", 210, -200)
|
|
|
|
local FontSizeSlider = BarSetup:CreateSlider(L.Bar_FontSize, 7, 18, 1)
|
|
FontSizeSlider:SetPoint("TOPLEFT", BarSetup.frame, "TOPLEFT", 20, -202)
|
|
FontSizeSlider:SetScript("OnShow", createDBTOnShowHandler("FontSize"))
|
|
FontSizeSlider:HookScript("OnValueChanged", createDBTOnValueChangedHandler("FontSize"))
|
|
|
|
-----------------------
|
|
-- Small Bar Options --
|
|
-----------------------
|
|
local BarSetupSmall = BarSetupPanel:CreateArea(L.AreaTitle_BarSetupSmall, nil, 160, true)
|
|
|
|
local smalldummybar = DBM.Bars:CreateDummyBar()
|
|
smalldummybar.frame:SetParent(BarSetupSmall.frame)
|
|
smalldummybar.frame:SetPoint('BOTTOM', BarSetupSmall.frame, "TOP", 0, -35)
|
|
smalldummybar.frame:SetScript("OnUpdate", function(self, elapsed) smalldummybar:Update(elapsed) end)
|
|
|
|
local BarWidthSlider = BarSetup:CreateSlider(L.Slider_BarWidth, 100, 325, 1)
|
|
BarWidthSlider:SetPoint("TOPLEFT", BarSetupSmall.frame, "TOPLEFT", 20, -90)
|
|
BarWidthSlider:SetScript("OnShow", createDBTOnShowHandler("Width"))
|
|
BarWidthSlider:HookScript("OnValueChanged", createDBTOnValueChangedHandler("Width"))
|
|
|
|
local BarScaleSlider = BarSetup:CreateSlider(L.Slider_BarScale, 0.75, 2, 0.05)
|
|
BarScaleSlider:SetPoint("TOPLEFT", BarWidthSlider, "BOTTOMLEFT", 0, -10)
|
|
BarScaleSlider:SetScript("OnShow", createDBTOnShowHandler("Scale"))
|
|
BarScaleSlider:HookScript("OnValueChanged", createDBTOnValueChangedHandler("Scale"))
|
|
|
|
local BarOffsetXSlider = BarSetup:CreateSlider(L.Slider_BarOffSetX, -50, 50, 1)
|
|
BarOffsetXSlider:SetPoint("TOPLEFT", BarSetupSmall.frame, "TOPLEFT", 220, -90)
|
|
BarOffsetXSlider:SetScript("OnShow", createDBTOnShowHandler("BarXOffset"))
|
|
BarOffsetXSlider:HookScript("OnValueChanged", createDBTOnValueChangedHandler("BarXOffset"))
|
|
|
|
local BarOffsetYSlider = BarSetup:CreateSlider(L.Slider_BarOffSetY, -5, 25, 1)
|
|
BarOffsetYSlider:SetPoint("TOPLEFT", BarOffsetXSlider, "BOTTOMLEFT", 0, -10)
|
|
BarOffsetYSlider:SetScript("OnShow", createDBTOnShowHandler("BarYOffset"))
|
|
BarOffsetYSlider:HookScript("OnValueChanged", createDBTOnValueChangedHandler("BarYOffset"))
|
|
|
|
-----------------------
|
|
-- Huge Bar Options --
|
|
-----------------------
|
|
local BarSetupHuge = BarSetupPanel:CreateArea(L.AreaTitle_BarSetupHuge, nil, 175, true)
|
|
|
|
local enablebar = BarSetupHuge:CreateCheckButton(L.EnableHugeBar, true, nil, nil, "HugeBarsEnabled")
|
|
|
|
local hugedummybar = DBM.Bars:CreateDummyBar()
|
|
hugedummybar.frame:SetParent(BarSetupSmall.frame)
|
|
hugedummybar.frame:SetPoint('BOTTOM', BarSetupHuge.frame, "TOP", 0, -50)
|
|
hugedummybar.frame:SetScript("OnUpdate", function(self, elapsed) hugedummybar:Update(elapsed) end)
|
|
hugedummybar.enlarged = true
|
|
hugedummybar:ApplyStyle()
|
|
|
|
local HugeBarWidthSlider = BarSetupHuge:CreateSlider(L.Slider_BarWidth, 100, 325, 1)
|
|
HugeBarWidthSlider:SetPoint("TOPLEFT", BarSetupHuge.frame, "TOPLEFT", 20, -105)
|
|
HugeBarWidthSlider:SetScript("OnShow", createDBTOnShowHandler("HugeWidth"))
|
|
HugeBarWidthSlider:HookScript("OnValueChanged", createDBTOnValueChangedHandler("HugeWidth"))
|
|
|
|
local HugeBarScaleSlider = BarSetupHuge:CreateSlider(L.Slider_BarScale, 0.75, 2, 0.05)
|
|
HugeBarScaleSlider:SetPoint("TOPLEFT", HugeBarWidthSlider, "BOTTOMLEFT", 0, -10)
|
|
HugeBarScaleSlider:SetScript("OnShow", createDBTOnShowHandler("HugeScale"))
|
|
HugeBarScaleSlider:HookScript("OnValueChanged", createDBTOnValueChangedHandler("HugeScale"))
|
|
|
|
local HugeBarOffsetXSlider = BarSetupHuge:CreateSlider(L.Slider_BarOffSetX, -50, 50, 1)
|
|
HugeBarOffsetXSlider:SetPoint("TOPLEFT", BarSetupHuge.frame, "TOPLEFT", 220, -105)
|
|
HugeBarOffsetXSlider:SetScript("OnShow", createDBTOnShowHandler("HugeBarXOffset"))
|
|
HugeBarOffsetXSlider:HookScript("OnValueChanged", createDBTOnValueChangedHandler("HugeBarXOffset"))
|
|
|
|
local HugeBarOffsetYSlider = BarSetupHuge:CreateSlider(L.Slider_BarOffSetY, -5, 25, 1)
|
|
HugeBarOffsetYSlider:SetPoint("TOPLEFT", HugeBarOffsetXSlider, "BOTTOMLEFT", 0, -10)
|
|
HugeBarOffsetYSlider:SetScript("OnShow", createDBTOnShowHandler("HugeBarYOffset"))
|
|
HugeBarOffsetYSlider:HookScript("OnValueChanged", createDBTOnValueChangedHandler("HugeBarYOffset"))
|
|
|
|
|
|
BarSetupPanel:SetMyOwnHeight()
|
|
end
|
|
|
|
do
|
|
local specPanel = DBM_GUI_Frame:CreateNewPanel(L.Panel_SpecWarnFrame, "option")
|
|
local specArea = specPanel:CreateArea(L.Area_SpecWarn, nil, 205, true)
|
|
specArea:CreateCheckButton(L.SpecWarn_Enabled, true, nil, "ShowSpecialWarnings")
|
|
|
|
local showbutton = specArea:CreateButton(L.SpecWarn_DemoButton, 120, 16)
|
|
showbutton:SetPoint('TOPRIGHT', specArea.frame, "TOPRIGHT", -5, -5)
|
|
showbutton:SetNormalFontObject(GameFontNormalSmall);
|
|
showbutton:SetHighlightFontObject(GameFontNormalSmall);
|
|
showbutton:SetScript("OnClick", function() DBM:ShowTestSpecialWarning() end)
|
|
|
|
local movemebutton = specArea:CreateButton(L.SpecWarn_MoveMe, 120, 16)
|
|
movemebutton:SetPoint('TOPRIGHT', showbutton, "BOTTOMRIGHT", 0, -5)
|
|
movemebutton:SetNormalFontObject(GameFontNormalSmall);
|
|
movemebutton:SetHighlightFontObject(GameFontNormalSmall);
|
|
movemebutton:SetScript("OnClick", function() DBM:MoveSpecialWarning() end)
|
|
|
|
local fontSizeSlider = specArea:CreateSlider(L.SpecWarn_FontSize, 8, 40, 1)
|
|
fontSizeSlider:SetPoint("TOPLEFT", specArea.frame, "TOPLEFT", 20, -55)
|
|
do
|
|
local firstshow = true
|
|
fontSizeSlider:SetScript("OnShow", function(self)
|
|
firstshow = true
|
|
self:SetValue(DBM.Options.SpecialWarningFontSize)
|
|
end)
|
|
fontSizeSlider:HookScript("OnValueChanged", function(self)
|
|
if firstshow then firstshow = false; return end
|
|
DBM.Options.SpecialWarningFontSize = self:GetValue()
|
|
DBM:UpdateSpecialWarningOptions()
|
|
DBM:ShowTestSpecialWarning()
|
|
end)
|
|
end
|
|
|
|
local color1 = specArea:CreateColorSelect(64)
|
|
color1:SetPoint('TOPLEFT', specArea.frame, "TOPLEFT", 20, -105)
|
|
local color1text = specArea:CreateText(L.SpecWarn_FontColor, 80)
|
|
color1text:SetPoint("BOTTOM", color1, "TOP", 5, 4)
|
|
local color1reset = specArea:CreateButton(L.Reset, 64, 10, nil, GameFontNormalSmall)
|
|
color1reset:SetPoint('TOP', color1, "BOTTOM", 5, -10)
|
|
color1reset:SetScript("OnClick", function(self)
|
|
DBM.Options.SpecialWarningFontColor[1] = DBM.DefaultOptions.SpecialWarningFontColor[1]
|
|
DBM.Options.SpecialWarningFontColor[2] = DBM.DefaultOptions.SpecialWarningFontColor[2]
|
|
DBM.Options.SpecialWarningFontColor[3] = DBM.DefaultOptions.SpecialWarningFontColor[3]
|
|
color1:SetColorRGB(DBM.Options.SpecialWarningFontColor[1], DBM.Options.SpecialWarningFontColor[2], DBM.Options.SpecialWarningFontColor[3])
|
|
DBM:UpdateSpecialWarningOptions()
|
|
DBM:ShowTestSpecialWarning()
|
|
end)
|
|
do
|
|
local firstshow = true
|
|
color1:SetScript("OnShow", function(self)
|
|
firstshow = true
|
|
self:SetColorRGB(DBM.Options.SpecialWarningFontColor[1], DBM.Options.SpecialWarningFontColor[2], DBM.Options.SpecialWarningFontColor[3])
|
|
end)
|
|
color1:SetScript("OnColorSelect", function(self)
|
|
if firstshow then firstshow = false; return end
|
|
DBM.Options.SpecialWarningFontColor[1] = select(1, self:GetColorRGB())
|
|
DBM.Options.SpecialWarningFontColor[2] = select(2, self:GetColorRGB())
|
|
DBM.Options.SpecialWarningFontColor[3] = select(3, self:GetColorRGB())
|
|
color1text:SetTextColor(self:GetColorRGB())
|
|
DBM:UpdateSpecialWarningOptions()
|
|
DBM:ShowTestSpecialWarning()
|
|
end)
|
|
end
|
|
|
|
local Fonts = {
|
|
{ text = "Default", value = STANDARD_TEXT_FONT, font = STANDARD_TEXT_FONT },
|
|
{ text = "Arial", value = "Fonts\\ARIALN.TTF", font = "Fonts\\ARIALN.TTF" },
|
|
{ text = "Skurri", value = "Fonts\\skurri.ttf", font = "Fonts\\skurri.ttf" },
|
|
{ text = "Morpheus", value = "Fonts\\MORPHEUS.ttf", font = "Fonts\\MORPHEUS.ttf" }
|
|
}
|
|
if GetSharedMedia3() then
|
|
for k,v in next, GetSharedMedia3():HashTable("font") do
|
|
table.insert(Fonts, {text=k, value=v, font=v})
|
|
end
|
|
end
|
|
local FontDropDown = specArea:CreateDropdown(L.SpecWarn_FontType, Fonts, DBM.Options.SpecialWarningFont,
|
|
function(value)
|
|
DBM.Options.SpecialWarningFont = value
|
|
DBM:UpdateSpecialWarningOptions()
|
|
DBM:ShowTestSpecialWarning()
|
|
end
|
|
)
|
|
FontDropDown:SetPoint("TOPLEFT", specArea.frame, "TOPLEFT", 130, -100)
|
|
|
|
-- SpecialWarn Sound
|
|
local Sounds = {
|
|
{ text = L.NoSound, value = "" },
|
|
{ text = "Default", value = "Sound\\Spells\\PVPFlagTaken.wav", sound=true },
|
|
{ text = "NightElfBell", value = "Sound\\Doodad\\BellTollNightElf.wav", sound=true }
|
|
}
|
|
if GetSharedMedia3() then
|
|
for k,v in next, GetSharedMedia3():HashTable("sound") do
|
|
if k ~= "None" then -- lol ace .. playsound accepts empty strings.. quite.mp3 wtf!
|
|
table.insert(Sounds, {text=k, value=v, sound=true})
|
|
end
|
|
end
|
|
end
|
|
local SpecialWarnSoundDropDown = specArea:CreateDropdown(L.SpecialWarnSound, Sounds,
|
|
DBM.Options.SpecialWarningSound, function(value)
|
|
DBM.Options.SpecialWarningSound = value
|
|
end
|
|
)
|
|
SpecialWarnSoundDropDown:SetPoint("TOPLEFT", specArea.frame, "TOPLEFT", 130, -150)
|
|
|
|
|
|
local resetbutton = specArea:CreateButton(L.SpecWarn_ResetMe, 120, 16)
|
|
resetbutton:SetPoint('BOTTOMRIGHT', specArea.frame, "BOTTOMRIGHT", -5, 5)
|
|
resetbutton:SetNormalFontObject(GameFontNormalSmall);
|
|
resetbutton:SetHighlightFontObject(GameFontNormalSmall);
|
|
resetbutton:SetScript("OnClick", function()
|
|
DBM.Options.SpecialWarningFont = DBM.DefaultOptions.SpecialWarningFont
|
|
DBM.Options.SpecialWarningFontSize = DBM.DefaultOptions.SpecialWarningFontSize
|
|
DBM.Options.SpecialWarningFontColor[1] = DBM.DefaultOptions.SpecialWarningFontColor[1]
|
|
DBM.Options.SpecialWarningFontColor[2] = DBM.DefaultOptions.SpecialWarningFontColor[2]
|
|
DBM.Options.SpecialWarningFontColor[3] = DBM.DefaultOptions.SpecialWarningFontColor[3]
|
|
DBM.Options.SpecialWarningPoint = DBM.DefaultOptions.SpecialWarningPoint
|
|
DBM.Options.SpecialWarningX = DBM.DefaultOptions.SpecialWarningX
|
|
DBM.Options.SpecialWarningY = DBM.DefaultOptions.SpecialWarningY
|
|
color1:SetColorRGB(DBM.Options.SpecialWarningFontColor[1], DBM.Options.SpecialWarningFontColor[2], DBM.Options.SpecialWarningFontColor[3])
|
|
fontSizeSlider:SetValue(DBM.DefaultOptions.SpecialWarningFontSize)
|
|
DBM:UpdateSpecialWarningOptions()
|
|
end)
|
|
end
|
|
|
|
do
|
|
local hpPanel = DBM_GUI_Frame:CreateNewPanel(L.Panel_HPFrame, "option")
|
|
local hpArea = hpPanel:CreateArea(L.Area_HPFrame, nil, 150, true)
|
|
hpArea:CreateCheckButton(L.HP_Enabled, true, nil, "AlwaysShowHealthFrame")
|
|
local growbttn = hpArea:CreateCheckButton(L.HP_GrowUpwards, true)
|
|
growbttn:SetScript("OnShow", function(self) self:SetChecked(DBM.Options.HealthFrameGrowUp) end)
|
|
growbttn:SetScript("OnClick", function(self)
|
|
DBM.Options.HealthFrameGrowUp = not not self:GetChecked()
|
|
DBM.BossHealth:UpdateSettings()
|
|
end)
|
|
|
|
|
|
local BarWidthSlider = hpArea:CreateSlider(L.BarWidth, 150, 275, 1)
|
|
BarWidthSlider:SetPoint("TOPLEFT", hpArea.frame, "TOPLEFT", 20, -75)
|
|
BarWidthSlider:SetScript("OnShow", function(self) self:SetValue(DBM.Options.HealthFrameWidth or 100) end)
|
|
BarWidthSlider:HookScript("OnValueChanged", function(self)
|
|
DBM.Options.HealthFrameWidth = self:GetValue()
|
|
DBM.BossHealth:UpdateSettings()
|
|
end)
|
|
|
|
local resetbutton = hpArea:CreateButton(L.Reset, 120, 16)
|
|
resetbutton:SetPoint('BOTTOMRIGHT', hpArea.frame, "BOTTOMRIGHT", -5, 5)
|
|
resetbutton:SetNormalFontObject(GameFontNormalSmall);
|
|
resetbutton:SetHighlightFontObject(GameFontNormalSmall);
|
|
resetbutton:SetScript("OnClick", function()
|
|
DBM.Options.HPFramePoint = DBM.DefaultOptions.HPFramePoint
|
|
DBM.Options.HPFrameX = DBM.DefaultOptions.HPFrameX
|
|
DBM.Options.HPFrameY = DBM.DefaultOptions.HPFrameY
|
|
DBM.Options.HealthFrameGrowUp = DBM.DefaultOptions.HealthFrameGrowUp
|
|
DBM.Options.HealthFrameWidth = DBM.DefaultOptions.HealthFrameWidth
|
|
DBM.BossHealth:UpdateSettings()
|
|
end)
|
|
|
|
local function createDummyFunc(i) return function() return i end end
|
|
local showbutton = hpArea:CreateButton(L.HP_ShowDemo, 120, 16)
|
|
showbutton:SetPoint('BOTTOM', resetbutton, "TOP", 0, 5)
|
|
showbutton:SetNormalFontObject(GameFontNormalSmall);
|
|
showbutton:SetHighlightFontObject(GameFontNormalSmall);
|
|
showbutton:SetScript("OnClick", function()
|
|
DBM.BossHealth:Show("Health Frame")
|
|
DBM.BossHealth:AddBoss(createDummyFunc(25), "TestBoss 1")
|
|
DBM.BossHealth:AddBoss(createDummyFunc(50), "TestBoss 2")
|
|
DBM.BossHealth:AddBoss(createDummyFunc(75), "TestBoss 3")
|
|
DBM.BossHealth:AddBoss(createDummyFunc(100), "TestBoss 4")
|
|
end)
|
|
end
|
|
|
|
do
|
|
local spamPanel = DBM_GUI_Frame:CreateNewPanel(L.Panel_SpamFilter, "option")
|
|
local spamOutArea = spamPanel:CreateArea(L.Area_SpamFilter_Outgoing, nil, 120, true)
|
|
spamOutArea:CreateCheckButton(L.SpamBlockNoShowAnnounce, true, nil, "DontShowBossAnnounces")
|
|
spamOutArea:CreateCheckButton(L.SpamBlockNoSendAnnounce, true, nil, "DontSendBossAnnounces")
|
|
spamOutArea:CreateCheckButton(L.SpamBlockNoSendWhisper, true, nil, "DontSendBossWhispers")
|
|
spamOutArea:CreateCheckButton(L.SpamBlockNoSetIcon, true, nil, "DontSetIcons")
|
|
|
|
local spamArea = spamPanel:CreateArea(L.Area_SpamFilter, nil, 135, true)
|
|
spamArea:CreateCheckButton(L.HideBossEmoteFrame, true, nil, "HideBossEmoteFrame")
|
|
spamArea:CreateCheckButton(L.SpamBlockRaidWarning, true, nil, "SpamBlockRaidWarning")
|
|
spamArea:CreateCheckButton(L.SpamBlockBossWhispers, true, nil, "SpamBlockBossWhispers")
|
|
spamArea:CreateCheckButton(L.BlockVersionUpdatePopup, true, nil, "BlockVersionUpdatePopup")
|
|
if BigBrother and type(BigBrother.ConsumableCheck) == "function" then
|
|
spamArea:CreateCheckButton(L.ShowBigBrotherOnCombatStart, true, nil, "ShowBigBrotherOnCombatStart")
|
|
spamArea:CreateCheckButton(L.BigBrotherAnnounceToRaid, true, nil, "BigBrotherAnnounceToRaid")
|
|
end
|
|
spamArea:AutoSetDimension()
|
|
spamOutArea:AutoSetDimension()
|
|
spamPanel:SetMyOwnHeight()
|
|
end
|
|
|
|
-- Set Revision // please don't translate this!
|
|
DBM_GUI_OptionsFrameRevision:SetText("Version: "..DBM.DisplayVersion.." - Core: r"..DBM.Revision.." - Gui: r"..revision)
|
|
DBM_GUI_OptionsFrameTranslation:SetText("Translated by: "..L.TranslationBy)
|
|
end
|
|
DBM:RegisterOnGuiLoadCallback(CreateOptionsMenu, 1)
|
|
|
|
do
|
|
local function OnShowGetStats(stats, bossvalue1, bossvalue2, bossvalue3, heroic10value1, heroic10value2, heroic10value3, heroic25value1, heroic25value2, heroic25value3)
|
|
return function(self)
|
|
bossvalue1:SetText( stats.kills )
|
|
bossvalue2:SetText( stats.pulls - stats.kills )
|
|
bossvalue3:SetText( stats.bestTime and ("%d:%02d"):format(math.floor(stats.bestTime / 60), stats.bestTime % 60) or "-" )
|
|
heroic10value1:SetText( stats.heroic10Kills )
|
|
heroic10value2:SetText( stats.heroic10Pulls-stats.heroic10Kills )
|
|
heroic10value3:SetText( stats.heroic10BestTime and ("%d:%02d"):format(math.floor(stats.heroic10BestTime / 60), stats.heroic10BestTime % 60) or "-" )
|
|
heroic25value1:SetText( stats.heroic25Kills )
|
|
heroic25value2:SetText( stats.heroic25Pulls-stats.heroic25Kills )
|
|
heroic25value3:SetText( stats.heroic25BestTime and ("%d:%02d"):format(math.floor(stats.heroic25BestTime / 60), stats.heroic25BestTime % 60) or "-" )
|
|
end
|
|
end
|
|
|
|
local function CreateBossModTab(addon, panel, subtab)
|
|
if not panel then
|
|
error("Panel is nil", 2)
|
|
end
|
|
local ptext = panel:CreateText(L.BossModLoaded:format(subtab and addon.subTabs[subtab] or addon.name), nil, nil, GameFontNormal)
|
|
ptext:SetPoint('TOPLEFT', panel.frame, "TOPLEFT", 10, -10)
|
|
|
|
local bossstats = 0
|
|
local area = panel:CreateArea(nil, nil, 0)
|
|
area.frame:SetPoint("TOPLEFT", 10, -25)
|
|
area.onshowcall = {}
|
|
|
|
for _, mod in ipairs(DBM.Mods) do
|
|
if mod.modId == addon.modId and (not subtab or subtab == mod.subTab) then
|
|
bossstats = bossstats + 1
|
|
local Boss = area:CreateText(mod.localization.general.name, nil, nil, GameFontHighlight, "LEFT")
|
|
local bossstat1 = area:CreateText(L.Statistic_Kills, nil, nil, GameFontNormalSmall, "LEFT")
|
|
local bossstat2 = area:CreateText(L.Statistic_Wipes, nil, nil, GameFontNormalSmall, "LEFT")
|
|
local bossstat3 = area:CreateText(L.Statistic_BestKill, nil, nil, GameFontNormalSmall, "LEFT")
|
|
Boss:SetPoint("TOPLEFT", area.frame, "TOPLEFT", 10, -10-(80*(bossstats-1)))
|
|
bossstat1:SetPoint("TOPLEFT", Boss, "BOTTOMLEFT", 20, -5)
|
|
bossstat2:SetPoint("TOPLEFT", bossstat1, "BOTTOMLEFT", 0, -5)
|
|
bossstat3:SetPoint("TOPLEFT", bossstat2, "BOTTOMLEFT", 0, -5)
|
|
|
|
--[=[
|
|
local Heroic = area:CreateText(L.Statistic_Heroic, nil, nil, GameFontDisableSmall, "LEFT")
|
|
local Heroicstat1 = area:CreateText(L.Statistic_Kills, nil, nil, GameFontNormalSmall, "LEFT")
|
|
local Heroicstat2 = area:CreateText(L.Statistic_Wipes, nil, nil, GameFontNormalSmall, "LEFT")
|
|
local Heroicstat3 = area:CreateText(L.Statistic_BestKill, nil, nil, GameFontNormalSmall, "LEFT")
|
|
Heroic:SetPoint("LEFT", Boss, "LEFT", 220, 0)
|
|
Heroicstat1:SetPoint("LEFT", bossstat1, "LEFT", 180, 0)
|
|
Heroicstat2:SetPoint("LEFT", bossstat2, "LEFT", 180, 0)
|
|
Heroicstat3:SetPoint("LEFT", bossstat3, "LEFT", 180, 0)
|
|
--]=]
|
|
local Heroic10 = area:CreateText(L.Statistic_Heroic10, nil, nil, GameFontDisableSmall, "LEFT")
|
|
local Heroic10stat1 = area:CreateText(L.Statistic_Kills, nil, nil, GameFontNormalSmall, "LEFT")
|
|
local Heroic10stat2 = area:CreateText(L.Statistic_Wipes, nil, nil, GameFontNormalSmall, "LEFT")
|
|
local Heroic10stat3 = area:CreateText(L.Statistic_BestKill, nil, nil, GameFontNormalSmall, "LEFT")
|
|
Heroic10:SetPoint("LEFT", Boss, "LEFT", 150, 0)
|
|
Heroic10stat1:SetPoint("LEFT", bossstat1, "LEFT", 130, 0)
|
|
Heroic10stat2:SetPoint("LEFT", bossstat2, "LEFT", 130, 0)
|
|
Heroic10stat3:SetPoint("LEFT", bossstat3, "LEFT", 130, 0)
|
|
|
|
local Heroic25 = area:CreateText(L.Statistic_Heroic25, nil, nil, GameFontDisableSmall, "LEFT")
|
|
local Heroic25stat1 = area:CreateText(L.Statistic_Kills, nil, nil, GameFontNormalSmall, "LEFT")
|
|
local Heroic25stat2 = area:CreateText(L.Statistic_Wipes, nil, nil, GameFontNormalSmall, "LEFT")
|
|
local Heroic25stat3 = area:CreateText(L.Statistic_BestKill, nil, nil, GameFontNormalSmall, "LEFT")
|
|
Heroic25:SetPoint("LEFT", Heroic10, "LEFT", 130, 0)
|
|
Heroic25stat1:SetPoint("LEFT", Heroic10stat1, "LEFT", 130, 0)
|
|
Heroic25stat2:SetPoint("LEFT", Heroic10stat2, "LEFT", 130, 0)
|
|
Heroic25stat3:SetPoint("LEFT", Heroic10stat3, "LEFT", 130, 0)
|
|
|
|
local bossvalue1 = area:CreateText(mod.stats.kills, nil, nil, GameFontNormalSmall, "LEFT")
|
|
local bossvalue2 = area:CreateText((mod.stats.pulls-mod.stats.kills), nil, nil, GameFontNormalSmall, "LEFT")
|
|
local bossvalue3 = area:CreateText("0:00:00", nil, nil, GameFontNormalSmall, "LEFT")
|
|
bossvalue1:SetPoint("TOPLEFT", bossstat1, "TOPLEFT", 80, 0)
|
|
bossvalue2:SetPoint("TOPLEFT", bossstat2, "TOPLEFT", 80, 0)
|
|
bossvalue3:SetPoint("TOPLEFT", bossstat3, "TOPLEFT", 80, 0)
|
|
|
|
--[=[
|
|
local heroicvalue1 = area:CreateText(mod.stats.heroicKills, nil, nil, GameFontNormalSmall, "LEFT")
|
|
local heroicvalue2 = area:CreateText((mod.stats.heroicPulls-mod.stats.heroicKills), nil, nil, GameFontNormalSmall, "LEFT")
|
|
local heroicvalue3 = area:CreateText("0:00:00", nil, nil, GameFontNormalSmall, "LEFT")
|
|
heroicvalue1:SetPoint("TOPLEFT", Heroicstat1, "TOPLEFT", 80, 0)
|
|
heroicvalue2:SetPoint("TOPLEFT", Heroicstat2, "TOPLEFT", 80, 0)
|
|
heroicvalue3:SetPoint("TOPLEFT", Heroicstat3, "TOPLEFT", 80, 0)
|
|
--]=]
|
|
|
|
local heroic10value1 = area:CreateText(mod.stats.heroic10Kills, nil, nil, GameFontNormalSmall, "LEFT")
|
|
local heroic10value2 = area:CreateText((mod.stats.heroic10Pulls-mod.stats.heroic10Kills), nil, nil, GameFontNormalSmall, "LEFT")
|
|
local heroic10value3 = area:CreateText("0:00:00", nil, nil, GameFontNormalSmall, "LEFT")
|
|
heroic10value1:SetPoint("TOPLEFT", Heroic10stat1, "TOPLEFT", 80, 0)
|
|
heroic10value2:SetPoint("TOPLEFT", Heroic10stat2, "TOPLEFT", 80, 0)
|
|
heroic10value3:SetPoint("TOPLEFT", Heroic10stat3, "TOPLEFT", 80, 0)
|
|
|
|
local heroic25value1 = area:CreateText(mod.stats.heroic25Kills, nil, nil, GameFontNormalSmall, "LEFT")
|
|
local heroic25value2 = area:CreateText((mod.stats.heroic25Pulls-mod.stats.heroic25Kills), nil, nil, GameFontNormalSmall, "LEFT")
|
|
local heroic25value3 = area:CreateText("0:00:00", nil, nil, GameFontNormalSmall, "LEFT")
|
|
heroic25value1:SetPoint("TOPLEFT", Heroic25stat1, "TOPLEFT", 80, 0)
|
|
heroic25value2:SetPoint("TOPLEFT", Heroic25stat2, "TOPLEFT", 80, 0)
|
|
heroic25value3:SetPoint("TOPLEFT", Heroic25stat3, "TOPLEFT", 80, 0)
|
|
|
|
area.frame:SetHeight( area.frame:GetHeight() + 80 )
|
|
table.insert(area.onshowcall, OnShowGetStats(mod.stats, bossvalue1, bossvalue2, bossvalue3, heroic10value1, heroic10value2, heroic10value3, heroic25value1, heroic25value2, heroic25value3))
|
|
end
|
|
end
|
|
area.frame:SetScript("OnShow", function(self)
|
|
for _,v in pairs(area.onshowcall) do
|
|
v()
|
|
end
|
|
end)
|
|
panel:SetMyOwnHeight()
|
|
DBM_GUI_OptionsFrame:DisplayFrame(panel.frame)
|
|
end
|
|
|
|
local function LoadAddOn_Button(self)
|
|
if DBM:LoadMod(self.modid) then
|
|
self:Hide()
|
|
self.headline:Hide()
|
|
CreateBossModTab(self.modid, self.modid.panel)
|
|
DBM_GUI_OptionsFrameBossMods:Hide()
|
|
DBM_GUI_OptionsFrameBossMods:Show()
|
|
end
|
|
end
|
|
|
|
local Categories = {}
|
|
function DBM_GUI:UpdateModList()
|
|
for k,addon in ipairs(DBM.AddOns) do
|
|
if not Categories[addon.category] then
|
|
-- Create a Panel for "Wrath of the Lich King" "Burning Crusade" ...
|
|
Categories[addon.category] = DBM_GUI:CreateNewPanel(L["TabCategory_"..addon.category:upper()] or L.TabCategory_Other, nil, (addon.category:upper()== "BC" or addon.category:upper()=="OTHER"))
|
|
|
|
if L["TabCategory_"..addon.category:upper()] then
|
|
local ptext = Categories[addon.category]:CreateText(L["TabCategory_"..addon.category:upper()])
|
|
ptext:SetPoint('TOPLEFT', Categories[addon.category].frame, "TOPLEFT", 10, -10)
|
|
end
|
|
end
|
|
|
|
if not addon.panel then
|
|
-- Create a Panel for "Naxxramas" "Eye of Eternity" ...
|
|
addon.panel = Categories[addon.category]:CreateNewPanel(addon.name or "Error: X-DBM-Mod-Name", nil, false)
|
|
|
|
if not IsAddOnLoaded(addon.modId) then
|
|
local button = addon.panel:CreateButton(L.Button_LoadMod, 200, 30)
|
|
button.modid = addon
|
|
button.headline = addon.panel:CreateText(L.BossModLoad_now, 350)
|
|
button.headline:SetHeight(50)
|
|
button.headline:SetPoint("CENTER", button, "CENTER", 0, 80)
|
|
|
|
button:SetScript("OnClick", LoadAddOn_Button)
|
|
button:SetPoint('CENTER', 0, -20)
|
|
else
|
|
CreateBossModTab(addon, addon.panel)
|
|
end
|
|
end
|
|
|
|
if addon.panel and addon.subTabs and IsAddOnLoaded(addon.modId) then
|
|
-- Create a Panel for "Arachnid Quarter" "Plague Quarter" ...
|
|
if not addon.subPanels then addon.subPanels = {} end
|
|
|
|
for k,v in pairs(addon.subTabs) do
|
|
if not addon.subPanels[k] then
|
|
addon.subPanels[k] = addon.panel:CreateNewPanel(v or "Error: X-DBM-Mod-Name", nil, false)
|
|
CreateBossModTab(addon, addon.subPanels[k], k)
|
|
end
|
|
end
|
|
end
|
|
|
|
|
|
for _, mod in ipairs(DBM.Mods) do
|
|
if mod.modId == addon.modId then
|
|
if not mod.panel and (not addon.subTabs or (addon.subPanels and addon.subPanels[mod.subTab])) then
|
|
if addon.subTabs and addon.subPanels[mod.subTab] then
|
|
mod.panel = addon.subPanels[mod.subTab]:CreateNewPanel(mod.localization.general.name or "Error: DBM.Mods")
|
|
else
|
|
mod.panel = addon.panel:CreateNewPanel(mod.localization.general.name or "Error: DBM.Mods")
|
|
end
|
|
DBM_GUI:CreateBossModPanel(mod)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
if DBM_GUI_OptionsFrame:IsShown() then
|
|
DBM_GUI_OptionsFrame:Hide()
|
|
DBM_GUI_OptionsFrame:Show()
|
|
end
|
|
end
|
|
|
|
|
|
function DBM_GUI:CreateBossModPanel(mod)
|
|
if not mod.panel then
|
|
DBM:AddMsg("Couldn't create boss mod panel for "..mod.localization.general.name)
|
|
return false
|
|
end
|
|
local panel = mod.panel
|
|
local category
|
|
|
|
local iconstat = panel.frame:CreateFontString("DBM_GUI_Mod_Icons"..mod.localization.general.name, "ARTWORK")
|
|
iconstat:SetPoint("TOPRIGHT", panel.frame, "TOPRIGHT", -16, -16)
|
|
iconstat:SetFontObject(GameFontNormal)
|
|
iconstat:SetText(L.IconsInUse)
|
|
for i=1, 8, 1 do
|
|
local icon = panel.frame:CreateTexture()
|
|
icon:SetTexture("Interface\\TargetingFrame\\UI-RaidTargetingIcons.blp")
|
|
icon:SetPoint("TOPRIGHT", panel.frame, "TOPRIGHT", 2-(i*18), -32)
|
|
icon:SetWidth(16)
|
|
icon:SetHeight(16)
|
|
if not mod.usedIcons or not mod.usedIcons[i] then icon:SetAlpha(0.25) end
|
|
if i == 1 then icon:SetTexCoord(0, 0.25, 0, 0.25)
|
|
elseif i == 2 then icon:SetTexCoord(0.25, 0.5, 0, 0.25)
|
|
elseif i == 3 then icon:SetTexCoord(0.5, 0.75, 0, 0.25)
|
|
elseif i == 4 then icon:SetTexCoord(0.75, 1, 0, 0.25)
|
|
elseif i == 5 then icon:SetTexCoord(0, 0.25, 0.25, 0.5)
|
|
elseif i == 6 then icon:SetTexCoord(0.25, 0.5, 0.25, 0.5)
|
|
elseif i == 7 then icon:SetTexCoord(0.5, 0.75, 0.25, 0.5)
|
|
elseif i == 8 then icon:SetTexCoord(0.75, 1, 0.25, 0.5)
|
|
end
|
|
end
|
|
|
|
local button = panel:CreateCheckButton(L.Mod_Enabled, true)
|
|
button:SetScript("OnShow", function(self) self:SetChecked(mod.Options.Enabled) end)
|
|
button:SetScript("OnClick", function(self) mod:Toggle() end)
|
|
|
|
local button = panel:CreateCheckButton(L.Mod_EnableAnnounce, true)
|
|
button:SetScript("OnShow", function(self) self:SetChecked(mod.Options.Announce) end)
|
|
button:SetScript("OnClick", function(self) mod.Options.Announce = not not self:GetChecked() end)
|
|
|
|
for _, catident in pairs(mod.categorySort) do
|
|
category = mod.optionCategories[catident]
|
|
local catpanel = panel:CreateArea(mod.localization.cats[catident], nil, nil, true)
|
|
local button, lastButton, addSpacer
|
|
for _,v in ipairs(category) do
|
|
if v == DBM_OPTION_SPACER then
|
|
addSpacer = true
|
|
elseif type(mod.Options[v]) == "boolean" then
|
|
lastButton = button
|
|
button = catpanel:CreateCheckButton(mod.localization.options[v], true)
|
|
if addSpacer then
|
|
button:SetPoint("TOPLEFT", lastButton, "BOTTOMLEFT", 0, -6)
|
|
addSpacer = false
|
|
end
|
|
button:SetScript("OnShow", function(self)
|
|
self:SetChecked(mod.Options[v])
|
|
end)
|
|
button:SetScript("OnClick", function(self)
|
|
mod.Options[v] = not mod.Options[v]
|
|
if mod.optionFuncs and mod.optionFuncs[v] then mod.optionFuncs[v]() end
|
|
end)
|
|
end
|
|
end
|
|
catpanel:AutoSetDimension()
|
|
panel:SetMyOwnHeight()
|
|
end
|
|
end
|
|
end
|
|
|