-- ********************************************************* -- ** 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