From 9733692fff5421e8eb12708dd26be2b9ed0546c2 Mon Sep 17 00:00:00 2001 From: Safturento Date: Mon, 7 Nov 2011 18:42:07 -0600 Subject: [PATCH] Added a profile system. The code is pretty sloppy, but it works for now. --- stAddonManager.lua | 661 ++++++++++++++++++++++++++++++++++++++-------------- stAddonManager.toc | 1 + 2 files changed, 481 insertions(+), 181 deletions(-) diff --git a/stAddonManager.lua b/stAddonManager.lua index 46ea8d2..b45b6c1 100644 --- a/stAddonManager.lua +++ b/stAddonManager.lua @@ -1,3 +1,4 @@ +local addonName = select(1, ...) ------------------------------------------------------ -- MEDIA & CONFIG ------------------------------------ ------------------------------------------------------ @@ -7,7 +8,7 @@ local blankTex = [[Interface\AddOns\stAddonManager\media\blankTex.tga]] local glowTex = [[Interface\AddOns\stAddonManager\media\glowTex.tga]] local bordercolor = {0, 0, 0, 1} -local backdropcolor = {0.05, 0.05, 0.05, 0.9} +local backdropcolor = {0.05, 0.05, 0.05} local backdrop = { bgFile = blankTex, edgeFile = blankTex, @@ -28,35 +29,26 @@ stAddonManager:SetPoint("TOP", stAddonManager.header, "TOP", 0, 0) ------------------------------------------------------ -- FUNCTIONS ----------------------------------------- ------------------------------------------------------ -local function SkinFrame(frame, shadowed) +local function SkinFrame(frame, transparent) + local bgR, bgG, bgB, bgA = unpack(backdropcolor) + if transparent then + if type(transparent) == "boolean" then + bgA = 0.9 + else + bgA = transparent + end + end frame:SetBackdrop(backdrop) - frame:SetBackdropColor(unpack(backdropcolor)) + frame:SetBackdropColor(bgR, bgG, bgB, bgA) frame:SetBackdropBorderColor(unpack(bordercolor)) - - if shadowed and not frame.shadow then - local shadow = CreateFrame("Frame", nil, frame) - shadow:SetFrameLevel(frame:GetFrameLevel()) - shadow:SetFrameStrata(frame:GetFrameStrata()) - shadow:SetPoint("TOPLEFT", -3, 3) - shadow:SetPoint("BOTTOMLEFT", -3, -3) - shadow:SetPoint("TOPRIGHT", 3, 3) - shadow:SetPoint("BOTTOMRIGHT", 3, -3) - shadow:SetBackdrop( { - edgeFile = glowTex, edgeSize = 3, - insets = {left = 5, right = 5, top = 5, bottom = 5}, - }) - shadow:SetBackdropColor(0, 0, 0, 0) - shadow:SetBackdropBorderColor(0, 0, 0, 0.8) - frame.shadow = shadow - end end -local function CreateBackdrop(frame, shadowed) +local function CreateBackdrop(frame, transparent) if not frame.backdrop then local backdrop = CreateFrame("Frame", nil, frame) backdrop:SetPoint("TOPRIGHT", frame, "TOPRIGHT", 1, 1) backdrop:SetPoint("BOTTOMLEFT", frame, "BOTTOMLEFT", -1, -1) - SkinFrame(backdrop, shadowed) + SkinFrame(backdrop, transparent) backdrop:SetFrameLevel(frame:GetFrameLevel()>0 and frame:GetFrameLevel()-1 or 0) backdrop:SetFrameStrata(frame:GetFrameStrata()) @@ -99,7 +91,7 @@ local function SkinScrollBar(frame, thumbTrim) frame.thumbbg = CreateFrame("Frame", nil, frame) frame.thumbbg:SetPoint("TOPLEFT", frame:GetThumbTexture(), "TOPLEFT", 2, 14) frame.thumbbg:SetPoint("BOTTOMRIGHT", frame:GetThumbTexture(), "BOTTOMRIGHT", -2, -14) - SkinFrame(frame.thumbbg) + SkinFrame(frame.thumbbg, true) if frame.trackbg then frame.thumbbg:SetFrameLevel(frame.trackbg:GetFrameLevel()+2) end @@ -124,97 +116,414 @@ function stAddonManager:UpdateAddonList(queryString) return addons end -local function LoadWindow() - if not stAddonManager.Loaded then - local window = stAddonManager - local header = window.header +local function GetEnabledAddons() + local EnabledAddons = {} + for i=1, GetNumAddOns() do + local name, _, _, enabled = GetAddOnInfo(i) + if enabled then + tinsert(EnabledAddons, name) + end + end + return EnabledAddons +end + +local function LoadProfileWindow() + local self = stAddonManager + if self.ProfileWindow then ToggleFrame(self.ProfileWindow) return end + + local window = CreateFrame("Frame", "stAddonManager_ProfileWindow", self) + window:SetPoint("TOPLEFT", self, "TOPRIGHT", 5, 0) + window:SetSize(200, 300) + SkinFrame(window, true) - tinsert(UISpecialFrames,window:GetName()); + local header = CreateFrame("Frame", "stAddonmanager_ProfileWindow_Header", window) + header:SetPoint("TOP", window, "TOP", 0, 0) + SkinFrame(header) + header:SetSize(window:GetWidth(), 20) + + local hTitle = header:CreateFontString(nil, "OVERLAY") + hTitle:SetFont(unpack(font)) + hTitle:SetPoint("CENTER") + hTitle:SetText("Profiles") + header.title = hTitle + window.header = header + + --Create scroll frame (God damn these things are a pain) + local scrollBG = CreateFrame("Frame", window:GetName().."_ScrollBackground", window) + scrollBG:SetPoint("TOPLEFT", header, "BOTTOMLEFT", 5, -55) + scrollBG:SetWidth(window:GetWidth()-10) + scrollBG:SetHeight(window:GetHeight()-80) + SkinFrame(scrollBG) + + local scrollFrame = CreateFrame("ScrollFrame", window:GetName().."_ScrollFrame", window, "UIPanelScrollFrameTemplate") + scrollFrame:SetPoint("TOPLEFT", scrollBG, "TOPLEFT", 0, -2) + scrollFrame:SetWidth(scrollBG:GetWidth()-25) + scrollFrame:SetHeight(scrollBG:GetHeight()-5) + SkinScrollBar(_G[window:GetName().."_ScrollFrameScrollBar"]) + scrollFrame:SetFrameLevel(window:GetFrameLevel()+1) + + scrollFrame.Anchor = CreateFrame("Frame", window:GetName().."_ScrollAnchor", scrollFrame) + scrollFrame.Anchor:SetPoint("TOPLEFT", scrollFrame, "TOPLEFT", 0, -3) + scrollFrame.Anchor:SetWidth(window:GetWidth()-40) + scrollFrame.Anchor:SetHeight(scrollFrame:GetHeight()-4) + scrollFrame.Anchor:SetFrameLevel(scrollFrame:GetFrameLevel()+1) + scrollFrame:SetScrollChild(scrollFrame.Anchor) + + local EnableAll = CreateFrame("Button", window:GetName().."_EnableAllButton", window) + SkinFrame(EnableAll) + EnableAll:SetSize((window:GetWidth()-15)/2, 20) + EnableAll:SetPoint("TOPLEFT", header, "BOTTOMLEFT", 5, -5) + EnableAll.text = EnableAll:CreateFontString(nil, "OVERLAY") + EnableAll.text:SetFont(unpack(font)) + EnableAll.text:SetText("Enable All") + EnableAll.text:SetPoint("CENTER") + EnableAll:SetScript("OnEnter", function(self) self.text:SetTextColor(0/255, 170/255, 255/255) end) + EnableAll:SetScript("OnLeave", function(self) self.text:SetTextColor(255/255, 255/255, 255/255) end) + EnableAll:SetScript("OnClick", function(self) + for i, addon in pairs(stAddonManager.AllAddons) do + EnableAddOn(addon.name) + stAddonManager.Buttons[i]:SetBackdropColor(0/255, 170/255, 255/255) + addon.enabled = true + end + end) + + local DisableAll = CreateFrame("Button", window:GetName().."_DisableAllButton", window) + SkinFrame(DisableAll) + DisableAll:SetSize(EnableAll:GetSize()) + DisableAll:SetPoint("TOPRIGHT", header, "BOTTOMRIGHT", -5, -5) + DisableAll.text = DisableAll:CreateFontString(nil, "OVERLAY") + DisableAll.text:SetFont(unpack(font)) + DisableAll.text:SetText("Disable All") + DisableAll.text:SetPoint("CENTER") + DisableAll:SetScript("OnEnter", function(self) self.text:SetTextColor(0/255, 170/255, 255/255) end) + DisableAll:SetScript("OnLeave", function(self) self.text:SetTextColor(255/255, 255/255, 255/255) end) + DisableAll:SetScript("OnClick", function(self) + for i, addon in pairs(stAddonManager.AllAddons) do + if addon.name ~= addonName then + DisableAddOn(addon.name) + stAddonManager.Buttons[i]:SetBackdropColor(unpack(backdropcolor)) + addon.enabled = false + end + end + end) + + if not stAddonProfiles then + stAddonProfiles = {} + end + + local SaveProfile = CreateFrame("Button", window:GetName().."_SaveProfileButton", window) + SkinFrame(SaveProfile) + SaveProfile:SetHeight(20) + SaveProfile:SetPoint("TOPLEFT", EnableAll, "BOTTOMLEFT", 0, -5) + SaveProfile:SetPoint("TOPRIGHT", DisableAll, "BOTTOMRIGHT", 0, -5) + SaveProfile.text = SaveProfile:CreateFontString(nil, "OVERLAY") + SaveProfile.text:SetFont(unpack(font)) + SaveProfile.text:SetText("New Profile") + SaveProfile.text:SetPoint("CENTER") + SaveProfile:SetScript("OnEnter", function(self) self.text:SetTextColor(0/255, 170/255, 255/255) end) + SaveProfile:SetScript("OnLeave", function(self) self.text:SetTextColor(255/255, 255/255, 255/255) end) + SaveProfile:SetScript("OnClick", function(self) + if not self.editbox then + local ebox = CreateFrame("EditBox", nil, self) + SkinFrame(ebox) + ebox:SetAllPoints(self) + ebox:SetFont(unpack(font)) + ebox:SetText("Profile Name") + ebox:SetAutoFocus(false) + ebox:SetFocus(true) + ebox:HighlightText() + ebox:SetTextInsets(3, 0, 0, 0) + ebox:SetScript("OnEditFocusGained", function(self) self:HighlightText() end) + ebox:SetScript("OnEscapePressed", function(self) self:SetText("Profile Name") self:ClearFocus() self:Hide() end) + ebox:SetScript("OnEnterPressed", function(self) + local profileName = self:GetText() + self:ClearFocus() + self:SetText("Profile Name") + self:Hide() + if not profileName then return end + stAddonProfiles[profileName] = GetEnabledAddons() + stAddonManager:UpdateProfileList() + end) + + self.editbox = ebox + else + self.editbox:Show() + self.editbox:SetFocus(true) + self.editbox:HighlightText() + end + end) + self.SaveProfile = SaveProfile + + self:SetScript("OnHide", function(self) + if self.SaveProfile.editbox then self.SaveProfile.editbox:Hide() end + window:Hide() + self.profileButton.text:SetText(">") + end) + + local function CreateMenuButton(parent, width, height, text, ...) + local button = CreateFrame("Button", nil, parent) + button:SetFrameLevel(parent:GetFrameLevel()+1) + button:SetSize(width, height) + SkinFrame(button) + if ... then button:SetPoint(...) end - window:SetSize(300,300) - header:SetSize(300,20) + button.text = button:CreateFontString(nil, "OVERLAY") + button.text:SetFont(unpack(font)) + button.text:SetPoint("CENTER") + if text then button.text:SetText(text) end - SkinFrame(window) - SkinFrame(header) + button:SetScript("OnEnter", function(self) self.text:SetTextColor(0/255, 170/255, 255/255) end) + button:SetScript("OnLeave", function(self) self.text:SetTextColor(255/255, 255/255, 255/255) end) - header:EnableMouse(true) - header:SetMovable(true) - header:SetScript("OnMouseDown", function(self) self:StartMoving() end) - header:SetScript("OnMouseUp", function(self) self:StopMovingOrSizing() end) + return button + end + + local buttons = {} + function stAddonManager:UpdateProfileList() + local i = 1 - local hTitle = stAddonManager.header:CreateFontString(nil, "OVERLAY") - hTitle:SetFont(unpack(font)) - hTitle:SetPoint("CENTER") - hTitle:SetText("|cff00aaffst|rAddonManager") - header.title = hTitle + local sort = function(t, func) + local temp = {} + local i = 0 - local close = CreateFrame("Button", nil, header) - close:SetPoint("RIGHT", header, "RIGHT", 0, 0) - close:SetFrameLevel(header:GetFrameLevel()+2) - close:SetSize(20, 20) - close.text = close:CreateFontString(nil, "OVERLAY") - close.text:SetFont(unpack(font)) - close.text:SetText("x") - close.text:SetPoint("CENTER", close, "CENTER", 0, 0) - close:SetScript("OnEnter", function(self) self.text:SetTextColor(0/255, 170/255, 255/255) end) - close:SetScript("OnLeave", function(self) self.text:SetTextColor(255/255, 255/255, 255/255) end) - close:SetScript("OnClick", function() window:Hide() end) - header.close = close - - addonListBG = CreateFrame("Frame", window:GetName().."_ScrollBackground", window) - addonListBG:SetPoint("TOPLEFT", header, "TOPLEFT", 10, -50) - addonListBG:SetWidth(window:GetWidth()-20) - addonListBG:SetHeight(window:GetHeight()-60) - SkinFrame(addonListBG) + for n in pairs(t) do + table.insert(temp, n) + end + + table.sort(temp, func) + + local iter = function() + i = i + 1 + if temp[i] == nil then + return nil + else + return temp[i], t[temp[i]] + end + end + + return iter + end - --Create scroll frame (God damn these things are a pain) - local scrollFrame = CreateFrame("ScrollFrame", window:GetName().."_ScrollFrame", window, "UIPanelScrollFrameTemplate") - scrollFrame:SetPoint("TOPLEFT", addonListBG, "TOPLEFT", 0, -2) - scrollFrame:SetWidth(addonListBG:GetWidth()-25) - scrollFrame:SetHeight(addonListBG:GetHeight()-5) - SkinScrollBar(_G[window:GetName().."_ScrollFrameScrollBar"]) - scrollFrame:SetFrameLevel(window:GetFrameLevel()+1) + for i=1, #buttons do + buttons[i]:Hide() + buttons[i].overlay:Hide() + buttons[i]:SetHeight(20) + end + + for profileName, addonList in sort(stAddonProfiles, function(a, b) return strlower(b) > strlower(a) end) do + if not buttons[i] then + local button = CreateMenuButton(scrollFrame.Anchor, scrollFrame:GetWidth()-4, 20, "") + button.text:ClearAllPoints() + button.text:SetPoint("CENTER", button, "TOP", 0, -10) + + local overlay = CreateFrame("Frame", nil, button) + overlay:EnableMouse(true) --just to stop the mouseover highlight when your mouse goes between the buttons + overlay:SetPoint("BOTTOM", button, "BOTTOM", 0, 3) + overlay:SetPoint("TOP", button, "TOP", 0, -20) + overlay:SetWidth(button:GetWidth()-10) + overlay:SetFrameLevel(button:GetFrameLevel()+1) + overlay:Hide() + + overlay.set = CreateMenuButton(overlay, overlay:GetWidth(), 18, "Set to..", "TOP", overlay, "TOP", 0, 0) + overlay.add = CreateMenuButton(overlay, overlay:GetWidth(), 18, "Add to..", "TOP", overlay.set, "BOTTOM", 0, -3) + overlay.remove = CreateMenuButton(overlay, overlay:GetWidth(), 18, "Remove from..", "TOP", overlay.add, "BOTTOM", 0, -3) + overlay.delete = CreateMenuButton(overlay, overlay:GetWidth(), 18, "Delete Profile", "TOP", overlay.remove, "BOTTOM", 0, -3) + + button.overlay = overlay + + button:SetScript("OnClick", function(self) + if self.overlay:IsShown() then + for i=1, #buttons do + buttons[i].overlay:Hide() + buttons[i]:SetHeight(20) + end + else + for i=1, #buttons do + buttons[i].overlay:Hide() + buttons[i]:SetHeight(20) + end + + self.overlay:Show() + self:SetHeight(25+(18*4)+(3*3)) + end + end) + + buttons[i] = button + end + + buttons[i]:Show() + buttons[i].text:SetText(profileName) + local overlay = buttons[i].overlay + overlay.set:SetScript("OnClick", function(self) + DisableAllAddOns() + for i, name in pairs(addonList) do EnableAddOn(name) end + stAddonManager.AllAddons = stAddonManager:UpdateAddonList() + stAddonManager:UpdateList(stAddonManager.AllAddons) + end) + overlay.add:SetScript("OnClick", function(self) + for i, name in pairs(addonList) do EnableAddOn(name) end + stAddonManager.AllAddons = stAddonManager:UpdateAddonList() + stAddonManager:UpdateList(stAddonManager.AllAddons) + end) + overlay.remove:SetScript("OnClick", function(self) + for i, name in pairs(addonList) do if name ~= addonName then DisableAddOn(name) end end + stAddonManager.AllAddons = stAddonManager:UpdateAddonList() + stAddonManager:UpdateList(stAddonManager.AllAddons) + end) + overlay.delete:SetScript("OnClick", function(self) + if IsShiftKeyDown() then + stAddonProfiles[profileName] = nil + stAddonManager:UpdateProfileList() + else + print("|cff00aaffst|rAddonManager: Are you sure you want to delete this profile? Hold down shift and click again if you are.") + end + end) + + i = i + 1 + end - scrollFrame.Anchor = CreateFrame("Frame", window:GetName().."_ScrollAnchor", scrollFrame) - scrollFrame.Anchor:SetPoint("TOPLEFT", scrollFrame, "TOPLEFT", 0, -3) - scrollFrame.Anchor:SetWidth(window:GetWidth()-40) - scrollFrame.Anchor:SetHeight(scrollFrame:GetHeight()) - scrollFrame.Anchor:SetFrameLevel(scrollFrame:GetFrameLevel()+1) - scrollFrame:SetScrollChild(scrollFrame.Anchor) + local prevButton + for i,button in pairs(buttons) do + if i == 1 then + button:SetPoint("TOPLEFT", scrollFrame.Anchor, "TOPLEFT", 4, -2) + else + button:SetPoint("TOP", prevButton, "BOTTOM", 0, -3) + end + prevButton = button + end + end + stAddonManager:UpdateProfileList() + + self.ProfileWindow = window +end + +local function LoadWindow() + if stAddonManager.Loaded then stAddonManager:Show(); return end + local window = stAddonManager + local header = window.header + + tinsert(UISpecialFrames,window:GetName()); + + window:SetSize(300,300) + header:SetSize(300,20) + + SkinFrame(window, true) + SkinFrame(header) + + header:EnableMouse(true) + header:SetMovable(true) + header:SetScript("OnMouseDown", function(self) self:StartMoving() end) + header:SetScript("OnMouseUp", function(self) self:StopMovingOrSizing() end) + + local hTitle = stAddonManager.header:CreateFontString(nil, "OVERLAY") + hTitle:SetFont(unpack(font)) + hTitle:SetPoint("CENTER") + hTitle:SetText("|cff00aaffst|rAddonManager") + header.title = hTitle + + local close = CreateFrame("Button", nil, header) + close:SetPoint("RIGHT", header, "RIGHT", 0, 0) + close:SetFrameLevel(header:GetFrameLevel()+2) + close:SetSize(20, 20) + close.text = close:CreateFontString(nil, "OVERLAY") + close.text:SetFont(unpack(font)) + close.text:SetText("x") + close.text:SetPoint("CENTER", close, "CENTER", 0, 0) + close:SetScript("OnEnter", function(self) self.text:SetTextColor(0/255, 170/255, 255/255) end) + close:SetScript("OnLeave", function(self) self.text:SetTextColor(255/255, 255/255, 255/255) end) + close:SetScript("OnClick", function() window:Hide() end) + header.close = close - --Load up addon information - stAddonManager.AllAddons = stAddonManager:UpdateAddonList() - stAddonManager.FilteredAddons = stAddonManager:UpdateAddonList() - stAddonManager.showEnabled = true - stAddonManager.showDisabled = true + local addonListBG = CreateFrame("Frame", window:GetName().."_ScrollBackground", window) + addonListBG:SetPoint("TOPLEFT", header, "TOPLEFT", 10, -50) + addonListBG:SetWidth(window:GetWidth()-20) + addonListBG:SetHeight(window:GetHeight()-60) + SkinFrame(addonListBG) + + --Create scroll frame (God damn these things are a pain) + local scrollFrame = CreateFrame("ScrollFrame", window:GetName().."_ScrollFrame", window, "UIPanelScrollFrameTemplate") + scrollFrame:SetPoint("TOPLEFT", addonListBG, "TOPLEFT", 0, -2) + scrollFrame:SetWidth(addonListBG:GetWidth()-25) + scrollFrame:SetHeight(addonListBG:GetHeight()-5) + SkinScrollBar(_G[window:GetName().."_ScrollFrameScrollBar"]) + scrollFrame:SetFrameLevel(window:GetFrameLevel()+1) + + scrollFrame.Anchor = CreateFrame("Frame", window:GetName().."_ScrollAnchor", scrollFrame) + scrollFrame.Anchor:SetPoint("TOPLEFT", scrollFrame, "TOPLEFT", 0, -3) + scrollFrame.Anchor:SetWidth(window:GetWidth()-40) + scrollFrame.Anchor:SetHeight(scrollFrame:GetHeight()) + scrollFrame.Anchor:SetFrameLevel(scrollFrame:GetFrameLevel()+1) + scrollFrame:SetScrollChild(scrollFrame.Anchor) + + --Load up addon information + stAddonManager.AllAddons = stAddonManager:UpdateAddonList() + stAddonManager.FilteredAddons = stAddonManager:UpdateAddonList() + stAddonManager.showEnabled = true + stAddonManager.showDisabled = true + + stAddonManager.Buttons = {} + + -- local lockedAddons = {} + -- if not stLockedAddons then + -- stLockedAddons = {} + -- else + -- lockedAddons = {} + -- end + + --Create initial list + for i, addon in pairs(stAddonManager.AllAddons) do + local button = CreateFrame("Frame", nil, scrollFrame.Anchor) + button:SetFrameLevel(scrollFrame.Anchor:GetFrameLevel() + 1) + button:SetSize(16, 16) + SkinFrame(button) + if addon.enabled then + button:SetBackdropColor(0/255, 170/255, 255/255) + end - stAddonManager.Buttons = {} + if i == 1 then + button:SetPoint("TOPLEFT", scrollFrame.Anchor, "TOPLEFT", 5, -5) + else + button:SetPoint("TOP", stAddonManager.Buttons[i-1], "BOTTOM", 0, -5) + end + button.text = button:CreateFontString(nil, "OVERLAY") + button.text:SetFont(unpack(font)) + button.text:SetJustifyH("LEFT") + button.text:SetPoint("LEFT", button, "RIGHT", 8, 0) + button.text:SetPoint("RIGHT", scrollFrame.Anchor, "RIGHT", 0, 0) + button.text:SetText(addon.title) - --Create initial list - for i, addon in pairs(stAddonManager.AllAddons) do - local button = CreateFrame("Frame", nil, scrollFrame.Anchor) - button:SetFrameLevel(scrollFrame.Anchor:GetFrameLevel() + 1) - button:SetSize(16, 16) - SkinFrame(button) + button:SetScript("OnEnter", function(self) + --tooltip stuff + end) + + button:SetScript("OnMouseDown", function(self) if addon.enabled then - button:SetBackdropColor(0/255, 170/255, 255/255) + self:SetBackdropColor(unpack(backdropcolor)) + DisableAddOn(addon.name) + addon.enabled = false + else + self:SetBackdropColor(0/255, 170/255, 255/255) + EnableAddOn(addon.name) + addon.enabled = true end + end) - if i == 1 then - button:SetPoint("TOPLEFT", scrollFrame.Anchor, "TOPLEFT", 5, -5) + stAddonManager.Buttons[i] = button + end + + function stAddonManager:UpdateList(AddonsTable) + --Start off by hiding all of the buttons + for _, b in pairs(stAddonManager.Buttons) do b:Hide() end + + local bIndex = 1 + for i, addon in pairs(AddonsTable) do + local button = stAddonManager.Buttons[bIndex] + button:Show() + if addon.enabled then + button:SetBackdropColor(0/255, 170/255, 255/255) else - button:SetPoint("TOP", stAddonManager.Buttons[i-1], "BOTTOM", 0, -5) + button:SetBackdropColor(unpack(backdropcolor)) end - button.text = button:CreateFontString(nil, "OVERLAY") - button.text:SetFont(unpack(font)) - button.text:SetJustifyH("LEFT") - button.text:SetPoint("LEFT", button, "RIGHT", 8, 0) - button.text:SetPoint("RIGHT", scrollFrame.Anchor, "RIGHT", 0, 0) - button.text:SetText(addon.title) - - button:SetScript("OnEnter", function(self) - --tooltip stuff - end) button:SetScript("OnMouseDown", function(self) if addon.enabled then @@ -228,94 +537,84 @@ local function LoadWindow() end end) - stAddonManager.Buttons[i] = button + button.text:SetText(addon.title) + bIndex = bIndex+1 end + end - local function UpdateList(AddonsTable) - --Start off by hiding all of the buttons - for _, b in pairs(stAddonManager.Buttons) do b:Hide() end - - local bIndex = 1 - for i, addon in pairs(AddonsTable) do - local button = stAddonManager.Buttons[bIndex] - button:Show() - if addon.enabled then - button:SetBackdropColor(0/255, 170/255, 255/255) - else - button:SetBackdropColor(unpack(backdropcolor)) - end - - button:SetScript("OnMouseDown", function(self) - if addon.enabled then - self:SetBackdropColor(unpack(backdropcolor)) - DisableAddOn(addon.name) - addon.enabled = false - else - self:SetBackdropColor(0/255, 170/255, 255/255) - EnableAddOn(addon.name) - addon.enabled = true - end - end) - - button.text:SetText(addon.title) - bIndex = bIndex+1 - end + --Search Bar + local searchBar = CreateFrame("EditBox", window:GetName().."_SearchBar", window) + searchBar:SetFrameLevel(window:GetFrameLevel()+1) + searchBar:SetPoint("TOPLEFT", header, "BOTTOMLEFT", 10, -5) + searchBar:SetWidth(190) + searchBar:SetHeight(20) + SkinFrame(searchBar) + searchBar:SetFont(unpack(font)) + searchBar:SetText("Search") + searchBar:SetAutoFocus(false) + searchBar:SetTextInsets(3, 0, 0 ,0) + searchBar:SetScript("OnEnterPressed", function(self) self:ClearFocus() end) + searchBar:SetScript("OnEscapePressed", function(self) searchBar:SetText("Search") stAddonManager:UpdateList(stAddonManager.AllAddons) searchBar:ClearFocus() end) + searchBar:SetScript("OnEditFocusGained", function(self) self:HighlightText() end) + searchBar:SetScript("OnTextChanged", function(self, input) + if input then + stAddonManager.FilteredAddons = stAddonManager:UpdateAddonList(self:GetText()) + stAddonManager:UpdateList(stAddonManager.FilteredAddons) end + end) - --Search Bar - local searchBar = CreateFrame("EditBox", window:GetName().."_SearchBar", window) - searchBar:SetFrameLevel(window:GetFrameLevel()+1) - searchBar:SetPoint("TOPLEFT", header, "BOTTOMLEFT", 10, -5) - searchBar:SetWidth(200) - searchBar:SetHeight(20) - SkinFrame(searchBar) - searchBar:SetFont(unpack(font)) - searchBar:SetText("Search") - searchBar:SetAutoFocus(false) - searchBar:SetTextInsets(3, 0, 0 ,0) - searchBar:SetScript("OnEnterPressed", function(self) self:ClearFocus() end) - searchBar:SetScript("OnEscapePressed", function(self) searchBar:SetText("Search") UpdateList(stAddonManager.AllAddons) searchBar:ClearFocus() end) - searchBar:SetScript("OnEditFocusGained", function(self) self:HighlightText() end) - searchBar:SetScript("OnTextChanged", function(self, input) - if input then - stAddonManager.FilteredAddons = stAddonManager:UpdateAddonList(self:GetText()) - UpdateList(stAddonManager.FilteredAddons) - end - end) - - local sbClear = CreateFrame("Button", nil, searchBar) - sbClear:SetPoint("RIGHT", searchBar, "RIGHT", 0, 0) - sbClear:SetFrameLevel(searchBar:GetFrameLevel()+2) - sbClear:SetSize(20, 20) - sbClear.text = sbClear:CreateFontString(nil, "OVERLAY") - sbClear.text:SetFont(unpack(font)) - sbClear.text:SetText("x") - sbClear.text:SetPoint("CENTER", sbClear, "CENTER", 0, 0) - sbClear:SetScript("OnEnter", function(self) self.text:SetTextColor(0/255, 170/255, 255/255) end) - sbClear:SetScript("OnLeave", function(self) self.text:SetTextColor(255/255, 255/255, 255/255) end) - sbClear:SetScript("OnClick", function(self) searchBar:SetText("Search") UpdateList(stAddonManager.AllAddons) searchBar:ClearFocus() end) - searchBar.clear = sbClear + local sbClear = CreateFrame("Button", nil, searchBar) + sbClear:SetPoint("RIGHT", searchBar, "RIGHT", 0, 0) + sbClear:SetFrameLevel(searchBar:GetFrameLevel()+2) + sbClear:SetSize(20, 20) + sbClear.text = sbClear:CreateFontString(nil, "OVERLAY") + sbClear.text:SetFont(unpack(font)) + sbClear.text:SetText("x") + sbClear.text:SetPoint("CENTER", sbClear, "CENTER", 0, 0) + sbClear:SetScript("OnEnter", function(self) self.text:SetTextColor(0/255, 170/255, 255/255) end) + sbClear:SetScript("OnLeave", function(self) self.text:SetTextColor(255/255, 255/255, 255/255) end) + sbClear:SetScript("OnClick", function(self) searchBar:SetText("Search") stAddonManager:UpdateList(stAddonManager.AllAddons) searchBar:ClearFocus() end) + searchBar.clear = sbClear + stAddonManager.searchBar = searchBar - local reloadButton = CreateFrame("Button", window:GetName().."_ReloadUIButton", window) - reloadButton:SetPoint("LEFT", searchBar, "RIGHT", 5, 0) - reloadButton:SetWidth(window:GetWidth()-25-searchBar:GetWidth()) - reloadButton:SetHeight(searchBar:GetHeight()) - reloadButton.text = reloadButton:CreateFontString(nil, "OVERLAY") - reloadButton.text:SetPoint("CENTER") - reloadButton.text:SetFont(unpack(font)) - reloadButton.text:SetText("ReloadUI") - reloadButton:SetScript("OnEnter", function(self) self.text:SetTextColor(0/255, 170/255, 255/255) end) - reloadButton:SetScript("OnLeave", function(self) self.text:SetTextColor(255/255, 255/255, 255/255) end) - reloadButton:SetScript("OnClick", function(self) - if InCombatLockdown() then return end - ReloadUI() - end) - SkinFrame(reloadButton) - - stAddonManager.Loaded = true - else - stAddonManager:Show() - end + local profileButton = CreateFrame("Button", window:GetName().."_ProfileWindowButton", window) + profileButton:SetPoint("TOPRIGHT", header, "BOTTOMRIGHT", -10, -5) + profileButton:SetSize(20, 20) + SkinFrame(profileButton) + profileButton.text = profileButton:CreateFontString(nil, "OVERLAY") + profileButton.text:SetFont(unpack(font)) + profileButton.text:SetText(">") + profileButton.text:SetPoint("CENTER", profileButton, "CENTER", 0, 0) + profileButton:SetScript("OnEnter", function(self) self.text:SetTextColor(0/255, 170/255, 255/255) end) + profileButton:SetScript("OnLeave", function(self) self.text:SetTextColor(255/255, 255/255, 255/255) end) + profileButton:SetScript("OnClick", function(self) + LoadProfileWindow() + if stAddonManager.ProfileWindow:IsShown() then + self.text:SetText("<") + else + self.text:SetText(">") + end + end) + stAddonManager.profileButton = profileButton + + local reloadButton = CreateFrame("Button", window:GetName().."_ReloadUIButton", window) + reloadButton:SetPoint("LEFT", searchBar, "RIGHT", 5, 0) + reloadButton:SetPoint("RIGHT", profileButton, "LEFT", -5, 0) + reloadButton:SetHeight(searchBar:GetHeight()) + reloadButton.text = reloadButton:CreateFontString(nil, "OVERLAY") + reloadButton.text:SetPoint("CENTER") + reloadButton.text:SetFont(unpack(font)) + reloadButton.text:SetText("ReloadUI") + reloadButton:SetScript("OnEnter", function(self) self.text:SetTextColor(0/255, 170/255, 255/255) end) + reloadButton:SetScript("OnLeave", function(self) self.text:SetTextColor(255/255, 255/255, 255/255) end) + reloadButton:SetScript("OnClick", function(self) + if InCombatLockdown() then return end + ReloadUI() + end) + SkinFrame(reloadButton) + stAddonManager.reloadButton = reloadButton + + stAddonManager.Loaded = true end SLASH_STADDONMANAGER1, SLASH_STADDONMANAGER2, SLASH_STADDONMANAGER3 = "/staddonmanager", "/stam", "/staddon" diff --git a/stAddonManager.toc b/stAddonManager.toc index 1aeb330..2a4e1a2 100644 --- a/stAddonManager.toc +++ b/stAddonManager.toc @@ -3,5 +3,6 @@ ## Version: @project-version@ ## Title: |cff00aaffst|rAddonManager ## Notes: A simple and minimalistic addon to disable/enabled addons without logging out. +## SavedVariables: stAddonProfiles, stLockedAddons stAddonManager.lua \ No newline at end of file -- 1.7.9.5