local addon, ns = ... local db, events, F, L = ns:Locals() local loaded, created function events:Toggle() if loaded then if events:IsVisible() then events:Hide() else events:Show() end elseif created then events:CreateContent(events) else events:CreateOptions(events) end end function events:CreateOptions(self) self:EnableMouse(true) self:SetMovable(true) self:SetToplevel(true) self:SetSize(832, 480) self:SetPoint("CENTER",0,0) self.texture = self:CreateTexture(nil, "BACKGROUND") self.texture:SetAllPoints(self) self.texture:SetTexture(.2, .2, .2, 1) self:SetBackdrop({ edgeFile = "Interface/Tooltips/UI-Tooltip-Border", tile = true, tileSize = 12, edgeSize = 12, insets = { left = -2, right = -2, top = -2, bottom = -2 } }) self:SetBackdropBorderColor(0, 0, 0, 1) self.title_region = self:CreateTitleRegion() self.title_region:SetPoint("TOPLEFT", 12, -8) self.title_region:SetPoint("BOTTOMRIGHT", self, "TOPRIGHT", -12, -28) self.title_region.texture = self:CreateTexture() self.title_region.texture:SetAllPoints(self.title_region) self.title_region.texture:SetTexture(.1, .1, .1, 1) self.title = self:CreateFontString(nil, "OVERLAY", "GameFontNormal") self.title:SetText(L.OptionsTitle) self.title:SetPoint("TOPLEFT", self.title_region, "TOPLEFT", 8, -(self.title_region:GetHeight() - self.title:GetHeight())) self.closeBTN = CreateFrame("Button", nil, self, "UIPanelCloseButton") self.closeBTN:SetPoint("TOPRIGHT", self.title_region, "TOPRIGHT", -2, 3) created = true self:CreateContent(self) end function events:CreateContent(self) local options = { -- {saved_var, desc, saved_var2} [1] = {"SortByName", L.SortByNameDesc, false}, [2] = {"HideConfirmation", L.HideConfirmationDesc, false}, [3] = {"ConfirmRollAndAssign", L.ConfirmRollAndAssignDesc, "RollAndAssignTimer"}, [4] = {"ConfirmAssignToRandom", L.ConfirmAssignToRandomDesc, "AssignToRandomTimer"}, } local EditBoxBG = { bgFile = "Interface\\ChatFrame\\ChatFrameBackground", edgeFile = "Interface\\ChatFrame\\ChatFrameBackground", tile = true, edgeSize = 1, tileSize = 5, } local elements = {} local LastElement for k, v in pairs(options) do elements["OptionsCHK" .. k] = CreateFrame("CheckButton", v[1] .. "CHK", self, "OptionsBaseCheckButtonTemplate") local OptionsCHK = elements["OptionsCHK" .. k] OptionsCHK:SetChecked(db.settings[v[1]]) if k == 1 then OptionsCHK:SetPoint("TOPLEFT", self.title_region, "BOTTOMLEFT", 10, -10) elseif k == 2 then OptionsCHK:SetPoint("TOPLEFT", self.title_region, "BOTTOMLEFT", self:GetWidth()*0.5, -10) else OptionsCHK:SetPoint("TOPLEFT", elements["OptionsCHK" .. (k - 2)], "BOTTOMLEFT", 0, -5) end OptionsCHK:SetScript("OnClick", function() db.settings[v[1]] = OptionsCHK:GetChecked() and true or false end) OptionsCHK:SetScript("OnShow", function() OptionsCHK:SetChecked(db.settings[v[1]]) end) elements["OptionsLBL" .. k] = OptionsCHK:CreateFontString(nil, "OVERLAY", "GameFontHighlight") local OptionsLBL = elements["OptionsLBL" .. k] OptionsLBL:SetPoint("LEFT", OptionsCHK, "RIGHT", 5, 1) OptionsLBL:SetText(v[2]) if v[3] then OptionsCHK:Disable() elements["Slider" .. k] = CreateFrame("Slider", v[3] .. "Slider", self, "OptionsSliderTemplate") local Slider = elements["Slider" .. k] Slider:SetSize(150, 20) Slider:SetMinMaxValues(1, 30) Slider:SetValueStep(1) Slider:SetOrientation('HORIZONTAL') Slider:SetValue(db.settings[v[3]]) Slider.tooltipText = nil getglobal(Slider:GetName() .. 'Low'):SetText('1') getglobal(Slider:GetName() .. 'High'):SetText('30') getglobal(Slider:GetName() .. 'Text'):SetText(string.format(L.TimerValue, db.settings[v[3]])) if not db.settings[v[1]] then Slider:Disable() end Slider:SetPoint("TOP", OptionsLBL, "BOTTOM", -20, -20) elements["EditBox" .. k] = CreateFrame("EditBox", "ConfirmRollAndAssignEdit", self) local EditBox = elements["EditBox" .. k] EditBox:SetSize(40, 14) EditBox:SetFontObject(GameFontHighlightSmall) EditBox:SetAutoFocus(false) EditBox:SetJustifyH("CENTER") EditBox:SetText(db.settings[v[3]]) EditBox:EnableMouse(true) EditBox:SetBackdrop(EditBoxBG) EditBox:SetBackdropColor(0, 0, 0, 0.5) EditBox:SetBackdropBorderColor(0.3, 0.3, 0.30, 0.80) if not db.settings[v[1]] then EditBox:Disable() end EditBox:SetPoint("TOP", Slider, "BOTTOM", 0, -10) EditBox:SetScript("OnEditFocusGained", function(self) self:HighlightText() end) EditBox:SetScript("OnEnterPressed", function(self) local value = tonumber(self:GetText()) local min, max = Slider:GetMinMaxValues() if value and value >= min and value <= max then Slider:SetValue(value) db.settings[v[3]] = value getglobal(Slider:GetName() .. 'Text'):SetText(string.format(L.TimerValue, value)) else self:SetText(db.settings[v[3]]) end self:ClearFocus() end) EditBox:SetScript("OnEscapePressed", function(self) self:SetText(db.settings[v[3]]) self:ClearFocus() end) EditBox:SetScript("OnEditFocusLost", function(self) self:HighlightText(0, 0) end) EditBox:SetScript("OnEnter", function(self) self:SetBackdropBorderColor(0.5, 0.5, 0.5, 1) end) EditBox:SetScript("OnLeave", function(self) self:SetBackdropBorderColor(0.3, 0.3, 0.3, 0.8) end) Slider:SetScript("OnValueChanged", function(self, value) local halfStep = self:GetValueStep() * 0.5 value = value + halfStep - (value + halfStep) % self:GetValueStep() db.settings[v[3]] = value getglobal(Slider:GetName() .. 'Text'):SetText(string.format(L.TimerValue, value)) EditBox:SetText(value) -- StaticPopupDialogs[v[4]].timeout = value end) OptionsCHK:HookScript("OnClick", function(...) if not db.settings[v[1]] then Slider:Disable() EditBox:Disable() else Slider:Enable() EditBox:Enable() end end) end if k % 2 ~= 0 then LastElement = k end end local ReservesLBL = self:CreateFontString(nil, "OVERLAY", "GameFontHighlight") ReservesLBL:SetText(L.ReservesInstructions) ReservesLBL:CanWordWrap(True) ReservesLBL:SetWidth(self:GetWidth() - 60) ReservesLBL:SetJustifyH("LEFT") ReservesLBL:SetPoint("TOPLEFT", elements["OptionsCHK" .. LastElement], "BOTTOMLEFT", 0, -75) local ItemEditBox = events:EditBoxTemplate("ItemEditBox", L.ItemEditBoxDefault) ItemEditBox:SetWidth((ReservesLBL:GetWidth() - 15)*(2/3)) ItemEditBox:SetPoint("TOPLEFT", ReservesLBL, "BOTTOMLEFT", 0, -25) local NameEditBox = events:EditBoxTemplate("NameEditBox", L.NameEditBoxDefault) NameEditBox:SetWidth((ReservesLBL:GetWidth() - 15)*(1/3)) NameEditBox:SetPoint("TOPLEFT", ItemEditBox, "TOPRIGHT", 3, 0) ItemEditBox:SetScript("OnTabPressed", function(self) NameEditBox:SetFocus() end) ItemEditBox:SetScript("OnEnterPressed", ItemEditBox:GetScript("OnTabPressed")) NameEditBox:SetScript("OnTabPressed", function(self) ItemEditBox:SetFocus() end) NameEditBox:SetScript("OnEnterPressed", function(self) local item = ItemEditBox:GetText() local name = self:GetText() if item ~= L.ItemEditBoxDefault and name ~= L.NameEditBoxDefault and item ~= "" and name ~= "" then db.reserves[item] = name self:SetText(L.NameEditBoxDefault) ItemEditBox:SetText(L.ItemEditBoxDefault) self:SetTextColor(0.5, 0.5, 0.5, 1) ItemEditBox:SetTextColor(0.5, 0.5, 0.5, 1) ItemEditBox:SetFocus() events:LoadReserves() else if name == L.NameEditBoxDefault then self:SetTextColor(0.5, 0.5, 0.5, 1) end self:HighlightText(0, 0) ItemEditBox:SetFocus() end end) local texture = "Interface\\Buttons\\UI-PlusButton-%s.blp" local AddBTN = CreateFrame("Button", nil, self) AddBTN:SetSize(16, 16) AddBTN:SetNormalTexture(string.format(texture, "Up")) AddBTN:SetPushedTexture(string.format(texture, "Down")) AddBTN:SetHighlightTexture(string.format(texture, "Up")) AddBTN:SetPoint("TOPLEFT", NameEditBox, "TOPRIGHT", 4, -1) AddBTN:SetScript("OnClick", function() local item = ItemEditBox:GetText() local name = NameEditBox:GetText() if item ~= L.ItemEditBoxDefault and name ~= L.NameEditBoxDefault and item ~= "" and name ~= "" then db.reserves[item] = name ItemEditBox:SetText(L.ItemEditBoxDefault) NameEditBox:SetText(L.NameEditBoxDefault) ItemEditBox:SetTextColor(0.5, 0.5, 0.5, 1) NameEditBox:SetTextColor(0.5, 0.5, 0.5, 1) ItemEditBox:ClearFocus() NameEditBox:ClearFocus() events:LoadReserves() end end) local ScrollFrame = CreateFrame("ScrollFrame", "ReservesScrollFrame", self, "UIPanelScrollFrameTemplate") ScrollFrame:SetPoint("TOPLEFT", ItemEditBox, "BOTTOMLEFT", 0, -10) ScrollFrame:SetPoint("BOTTOMRIGHT", self, "BOTTOMLEFT", self:GetWidth() - 46, 20) ScrollFrame.ScrollBar:EnableMouseWheel(true) ScrollFrame.ScrollBar:SetScript("OnMouseWheel", function(self, direction) ScrollFrameTemplate_OnMouseWheel(ScrollFrame, direction) end) local ScrollFrameBG = ScrollFrame:CreateTexture(nil, "BACKGROUND", nil, -6) ScrollFrameBG:SetPoint("TOP") ScrollFrameBG:SetPoint("RIGHT", 25, 0) ScrollFrameBG:SetPoint("BOTTOM") ScrollFrameBG:SetWidth(26) ScrollFrameBG:SetTexture("Interface\\PaperDollInfoFrame\\UI-Character-ScrollBar.blp") ScrollFrameBG:SetTexCoord(0, 0.45, 0.1640625, 1) ScrollFrameBG:SetAlpha(0.5) self.ScrollFrame = ScrollFrame local ScrollContent = CreateFrame("Frame", nil, ScrollFrame) ScrollContent:SetSize(ScrollFrame:GetWidth(), ScrollFrame:GetHeight()) ScrollContent.texture = ScrollContent:CreateTexture(nil, "BACKGROUND") ScrollContent.texture:SetAllPoints(ScrollFrame) ScrollContent.texture:SetTexture(0.5, 0.5, 0.5, 0.5) self.ScrollContent= ScrollContent ScrollFrame:SetScrollChild(ScrollContent) ScrollFrame:SetScript("OnShow", function() events:LoadReserves() end) events:LoadReserves() loaded = true end function events:EditBoxTemplate(name, msg) local backdrop = { bgFile = "Interface\\ChatFrame\\ChatFrameBackground", edgeFile = "Interface\\ChatFrame\\ChatFrameBackground", tile = true, edgeSize = 1, tileSize = 5, } local EditBox = CreateFrame("EditBox", name, events) EditBox:SetHeight(20) EditBox:SetFontObject(GameFontHighlight) EditBox:SetAutoFocus(false) EditBox:SetJustifyH("LEFT") EditBox:EnableMouse(true) EditBox:SetBackdrop(backdrop) EditBox:SetBackdropColor(0, 0, 0, 0.5) EditBox:SetBackdropBorderColor(0.3, 0.3, 0.3, 0.8) EditBox:SetTextInsets(15, 15, 0, 0) EditBox:SetTextColor(0.5, 0.5, 0.5, 1) EditBox:SetText(msg) EditBox:SetScript("OnEditFocusGained", function(self) self:SetTextColor(1, 1, 1, 1) self:HighlightText() end) EditBox:SetScript("OnEditFocusLost", function(self) local text = self:GetText() if text == msg or text == "" then self:SetTextColor(0.5, 0.5, 0.5, 1) if text == "" then self:SetText(msg) end end self:HighlightText(0, 0) end) EditBox:SetScript("OnEnter", function(self) self:SetBackdropBorderColor(0.5, 0.5, 0.5, 1) end) EditBox:SetScript("OnLeave", function(self) self:SetBackdropBorderColor(0.3, 0.3, 0.3, 0.8) end) EditBox:SetScript("OnEscapePressed", function(self) local text = self:GetText() if text == msg or text == "" then self:SetTextColor(0.5, 0.5, 0.5, 1) if text == "" then self:SetText(msg) end end self:HighlightText(0, 0) self:ClearFocus() end) return EditBox end local elements = {} local counter function events:LoadReserves() for k, v in pairs(elements) do v:SetText("") v:ClearAllPoints() v:Hide() end counter = 1 local LastElement for k, v in F:pairsByKeys(db.reserves) do if not elements["RemoveBTN" .. counter] then local texture = "Interface\\Buttons\\UI-MinusButton-%s.blp" elements["RemoveBTN" .. counter] = CreateFrame("Button", nil, events.ScrollContent) elements["RemoveBTN" .. counter]:SetNormalTexture(string.format(texture, "Up")) elements["RemoveBTN" .. counter]:SetPushedTexture(string.format(texture, "Down")) elements["RemoveBTN" .. counter]:SetHighlightTexture(string.format(texture, "Up")) elements["RemoveBTN" .. counter]:SetSize(16, 16) end elements["RemoveBTN" .. counter]:SetScript("OnClick", function() db.reserves[k] = nil events:LoadReserves() end) if counter == 1 then elements["RemoveBTN" .. counter]:SetPoint("TOPLEFT", 15, -10) else elements["RemoveBTN" .. counter]:SetPoint("TOPLEFT", elements["RemoveBTN" .. (counter - 1)], "BOTTOMLEFT", 0, -5) end if not elements["ReserveLBL" .. counter] then elements["ReserveLBL" .. counter] = events.ScrollContent:CreateFontString(nil, "OVERLAY", "GameFontHighlight") elements["ReserveLBL" .. counter]:CanWordWrap(true) elements["ReserveLBL" .. counter]:SetJustifyH("LEFT") elements["ReserveLBL" .. counter]:SetWidth(events.ScrollContent:GetWidth()/2 - 30) end elements["ReserveLBL" .. counter]:SetText(k .. " (" .. v .. ")") elements["ReserveLBL" .. counter]:SetPoint("TOPLEFT", elements["RemoveBTN" .. counter], "TOPRIGHT", 5, -3) elements["ReserveLBL" .. counter]:Show() elements["RemoveBTN" .. counter]:Show() LastElement = elements["RemoveBTN" .. counter] counter = counter + 1 end end