From 48f6fb8e272956ccb1d5254ed46b5e206a2ae294 Mon Sep 17 00:00:00 2001 From: Safturento Date: Wed, 9 Nov 2011 22:05:14 -0600 Subject: [PATCH] -Redesigned the profiles window to look a lot cleaner. -Added a tooltip when mousing over the enable/disable button for an addon. --- stAddonManager.lua | 256 ++++++++++++++++++++++------------------------------ 1 file changed, 110 insertions(+), 146 deletions(-) diff --git a/stAddonManager.lua b/stAddonManager.lua index b45b6c1..c37c9ae 100644 --- a/stAddonManager.lua +++ b/stAddonManager.lua @@ -1,4 +1,5 @@ -local addonName = select(1, ...) +local ADDON_NAME = ... + ------------------------------------------------------ -- MEDIA & CONFIG ------------------------------------ ------------------------------------------------------ @@ -100,6 +101,30 @@ local function SkinScrollBar(frame, thumbTrim) end 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 + + button.text = button:CreateFontString(nil, "OVERLAY") + button.text:SetFont(unpack(font)) + button.text:SetPoint("CENTER", 1, 0) + if text then button.text:SetText(text) end + + button:SetScript("OnEnter", function(self) + self.text:SetTextColor(0/255, 170/255, 255/255) + self:SetBackdropColor(.1, .1, .1) + end) + button:SetScript("OnLeave", function(self) + self.text:SetTextColor(255/255, 255/255, 255/255) + self:SetBackdropColor(unpack(backdropcolor)) + end) + + return button +end + function stAddonManager:UpdateAddonList(queryString) local addons = {} for i=1, GetNumAddOns() do @@ -111,6 +136,15 @@ function stAddonManager:UpdateAddonList(queryString) addons[i].title = title addons[i].notes = notes addons[i].enabled = enabled + if GetAddOnMetadata(i, "version") then + addons[i].version = GetAddOnMetadata(i, "version") + end + if GetAddOnDependencies(i) then + addons[i].dependencies = {GetAddOnDependencies(i)} + end + if GetAddOnOptionalDependencies(i) then + addons[i].optionaldependencies = {GetAddOnOptionalDependencies(i)} + end end end return addons @@ -127,58 +161,23 @@ local function GetEnabledAddons() return EnabledAddons end -local function LoadProfileWindow() +function stAddonManager: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) + window:SetSize(150, 20) SkinFrame(window, true) - - local header = CreateFrame("Frame", "stAddonmanager_ProfileWindow_Header", window) - header:SetPoint("TOP", window, "TOP", 0, 0) - SkinFrame(header) - header:SetSize(window:GetWidth(), 20) + CreateBackdrop(window, true) - local hTitle = header:CreateFontString(nil, "OVERLAY") + + local hTitle = window: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) + window.title = hTitle - 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) + local EnableAll = CreateMenuButton(window, (window:GetWidth()-15)/2, 20, "Enable All", "TOPLEFT", window, "BOTTOMLEFT", 5, -5) EnableAll:SetScript("OnClick", function(self) for i, addon in pairs(stAddonManager.AllAddons) do EnableAddOn(addon.name) @@ -187,19 +186,10 @@ local function LoadProfileWindow() 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) + local DisableAll = CreateMenuButton(window, EnableAll:GetWidth(), EnableAll:GetHeight(), "DisableAll", "TOPRIGHT", window, "BOTTOMRIGHT", -5, -5) DisableAll:SetScript("OnClick", function(self) for i, addon in pairs(stAddonManager.AllAddons) do - if addon.name ~= addonName then + if addon.name ~= ADDON_NAME then DisableAddOn(addon.name) stAddonManager.Buttons[i]:SetBackdropColor(unpack(backdropcolor)) addon.enabled = false @@ -211,17 +201,7 @@ local function LoadProfileWindow() 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) + local SaveProfile = CreateMenuButton(window, window:GetWidth()-10, 20, "New Profile", "TOPLEFT", EnableAll, "BOTTOMLEFT", 0, -5) SaveProfile:SetScript("OnClick", function(self) if not self.editbox then local ebox = CreateFrame("EditBox", nil, self) @@ -260,24 +240,6 @@ local function LoadProfileWindow() 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 - - button.text = button:CreateFontString(nil, "OVERLAY") - button.text:SetFont(unpack(font)) - button.text:SetPoint("CENTER") - if text then button.text:SetText(text) end - - 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) - - return button - end - local buttons = {} function stAddonManager:UpdateProfileList() local i = 1 @@ -312,22 +274,22 @@ local function LoadProfileWindow() 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, "") + local button = CreateMenuButton(window, window:GetWidth()-10, 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:SetPoint("TOP", button, "TOP", 0, -18) 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) + + overlay.set = CreateMenuButton(overlay, overlay:GetWidth(), 20, "Set to..", "TOP", overlay, "TOP", 0, 0) + overlay.add = CreateMenuButton(overlay, overlay:GetWidth(), 20, "Add to..", "TOP", overlay.set, "BOTTOM", 0, 1) + overlay.remove = CreateMenuButton(overlay, overlay:GetWidth(), 20, "Remove from..", "TOP", overlay.add, "BOTTOM", 0, 1) + overlay.delete = CreateMenuButton(overlay, overlay:GetWidth(), 20, "Delete Profile", "TOP", overlay.remove, "BOTTOM", 0, 1) button.overlay = overlay @@ -344,7 +306,7 @@ local function LoadProfileWindow() end self.overlay:Show() - self:SetHeight(25+(18*4)+(3*3)) + self:SetHeight(20*5) end end) @@ -356,48 +318,72 @@ local function LoadProfileWindow() local overlay = buttons[i].overlay overlay.set:SetScript("OnClick", function(self) DisableAllAddOns() + EnableAddOn(ADDON_NAME) for i, name in pairs(addonList) do EnableAddOn(name) end stAddonManager.AllAddons = stAddonManager:UpdateAddonList() stAddonManager:UpdateList(stAddonManager.AllAddons) + for i=1, #buttons do + buttons[i].overlay:Hide() + buttons[i]:SetHeight(20) + end 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) + for i=1, #buttons do + buttons[i].overlay:Hide() + buttons[i]:SetHeight(20) + end end) overlay.remove:SetScript("OnClick", function(self) - for i, name in pairs(addonList) do if name ~= addonName then DisableAddOn(name) end end + for i, name in pairs(addonList) do if name ~= ADDON_NAME then DisableAddOn(name) end end stAddonManager.AllAddons = stAddonManager:UpdateAddonList() stAddonManager:UpdateList(stAddonManager.AllAddons) + for i=1, #buttons do + buttons[i].overlay:Hide() + buttons[i]:SetHeight(20) + end end) overlay.delete:SetScript("OnClick", function(self) if IsShiftKeyDown() then stAddonProfiles[profileName] = nil stAddonManager:UpdateProfileList() + for i=1, #buttons do + buttons[i].overlay:Hide() + buttons[i]:SetHeight(20) + end 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 - + local prevButton + local lastButton for i,button in pairs(buttons) do if i == 1 then - button:SetPoint("TOPLEFT", scrollFrame.Anchor, "TOPLEFT", 4, -2) + button:SetPoint("TOP", SaveProfile, "BOTTOM", 0, -5) else - button:SetPoint("TOP", prevButton, "BOTTOM", 0, -3) + button:SetPoint("TOP", prevButton, "BOTTOM", 0, 1) end prevButton = button end + + window.backdrop:ClearAllPoints() + window.backdrop:SetPoint("TOPLEFT", window, "TOPLEFT", 0, 0) + window.backdrop:SetPoint("TOPRIGHT", window, "TOPRIGHT", 0, 0) + window.backdrop:SetPoint("BOTTOM", prevButton, "BOTTOM", 0, -5) end stAddonManager:UpdateProfileList() self.ProfileWindow = window end -local function LoadWindow() +function stAddonManager:LoadWindow() if stAddonManager.Loaded then stAddonManager:Show(); return end local window = stAddonManager local header = window.header @@ -421,16 +407,10 @@ local function LoadWindow() 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) + local close = CreateMenuButton(header, 20, 20, "x", "RIGHT", header, "RIGHT", 0, 0) + close:SetBackdrop(nil) + close:HookScript("OnEnter", function(self) self:SetBackdrop(nil) end) + close:HookScript("OnLeave", function(self) self:SetBackdrop(nil) end) close:SetScript("OnClick", function() window:Hide() end) header.close = close @@ -463,13 +443,6 @@ local function LoadWindow() 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) @@ -477,13 +450,13 @@ local function LoadWindow() button:SetSize(16, 16) SkinFrame(button) if addon.enabled then - button:SetBackdropColor(0/255, 170/255, 255/255) + button:SetBackdropColor(0/255, 170/255, 255/255) end if i == 1 then - button:SetPoint("TOPLEFT", scrollFrame.Anchor, "TOPLEFT", 5, -5) + button:SetPoint("TOPLEFT", scrollFrame.Anchor, "TOPLEFT", 5, -5) else - button:SetPoint("TOP", stAddonManager.Buttons[i-1], "BOTTOM", 0, -5) + button:SetPoint("TOP", stAddonManager.Buttons[i-1], "BOTTOM", 0, -3) end button.text = button:CreateFontString(nil, "OVERLAY") button.text:SetFont(unpack(font)) @@ -493,8 +466,18 @@ local function LoadWindow() button.text:SetText(addon.title) button:SetScript("OnEnter", function(self) - --tooltip stuff + GameTooltip:SetOwner(self, "ANCHOR_BOTTOMLEFT", -3, self:GetHeight()) + GameTooltip:ClearLines() + + if addon.version then GameTooltip:AddDoubleLine(addon.title, addon.version) + else GameTooltip:AddLine(addon.title) end + if addon.notes then GameTooltip:AddLine(addon.notes, nil, nil, nil, true) end + if addon.dependencies then GameTooltip:AddLine("Dependencies: "..unpack(addon.dependencies), 1, .5, 0, true) end + if addon.optionaldependencies then GameTooltip:AddLine("Optional Dependencies: "..unpack(addon.optionaldependencies), 1, .5, 0, true) end + + GameTooltip:Show() end) + button:SetScript("OnLeave", function(self) GameTooltip:Hide() end) button:SetScript("OnMouseDown", function(self) if addon.enabled then @@ -511,13 +494,12 @@ local function LoadWindow() stAddonManager.Buttons[i] = button end - function stAddonManager:UpdateList(AddonsTable) + 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] + local i = 1 + for _, addon in pairs(AddonsTable) do + local button = stAddonManager.Buttons[i] button:Show() if addon.enabled then button:SetBackdropColor(0/255, 170/255, 255/255) @@ -538,7 +520,7 @@ local function LoadWindow() end) button.text:SetText(addon.title) - bIndex = bIndex+1 + i = i+1 end end @@ -577,18 +559,9 @@ local function LoadWindow() searchBar.clear = sbClear stAddonManager.searchBar = searchBar - 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) + local profileButton = CreateMenuButton(window, 20, 20, ">", "TOPRIGHT", header, "BOTTOMRIGHT", -10, -5) profileButton:SetScript("OnClick", function(self) - LoadProfileWindow() + stAddonManager:LoadProfileWindow() if stAddonManager.ProfileWindow:IsShown() then self.text:SetText("<") else @@ -597,28 +570,19 @@ local function LoadWindow() end) stAddonManager.profileButton = profileButton - local reloadButton = CreateFrame("Button", window:GetName().."_ReloadUIButton", window) - reloadButton:SetPoint("LEFT", searchBar, "RIGHT", 5, 0) + local reloadButton = CreateMenuButton(window, 1, searchBar:GetHeight(), "Reload UI", "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" -SlashCmdList["STADDONMANAGER"] = LoadWindow +SlashCmdList["STADDONMANAGER"] = function() stAddonManager:LoadWindow() end local function CheckForAddon(event, addon, addonName) return ((event == "PLAYER_ENTERING_WORLD" and IsAddOnLoaded(addonName)) or (event == "ADDON_LOADED" and addon == addonName)) @@ -632,7 +596,7 @@ gmbAddOns:SetPoint("TOP", GameMenuButtonMacros, "BOTTOM", 0, -1) gmbAddOns:SetText("|cff00aaffst|rAddonManager") gmbAddOns:SetScript("OnClick", function() HideUIPanel(GameMenuFrame); - LoadWindow() + stAddonManager:LoadWindow() end) gmbAddOns:RegisterEvent("ADDON_LOADED") -- 1.7.9.5