-- ============================================================================ -- MoonWell -- ============================================================================ ADDON_BUTTON_HEIGHT = 16; MAX_ADDONS_DISPLAYED = 19; function UpdateAddonButton() if ( GetNumAddOns() > 0 ) then -- Check to see if any of them are out of date and not disabled if ( IsAddonVersionCheckEnabled() and AddonList_HasOutOfDate() and not HasShownAddonOutOfDateDialog ) then AddonDialog_Show("ADDONS_OUT_OF_DATE"); HasShownAddonOutOfDateDialog = true; end if ( AddonList_HasNewVersion() ) then CharacterSelectAddonsButtonGlow:Show(); else CharacterSelectAddonsButtonGlow:Hide(); end CharacterSelectAddonsButton:Show(); else CharacterSelectAddonsButton:Hide(); end end function AddonList_OnLoad(self) -- Asegurarse de que offset se inicialice correctamente if not self.offset then self.offset = 0 end end function AddonList_Update() local numEntrys = GetNumAddOns(); local name, title, notes, url, loadable, reason, security, newVersion; local addonIndex; local entry, checkbox, string, status, urlButton, securityIcon, versionButton; -- Verificar que numEntrys sea un número válido if not numEntrys then numEntrys = 0 end -- Get the character from the current list (nil is all characters) local character = GlueDropDownMenu_GetSelectedValue(AddonCharacterDropDown); if ( character == ALL ) then character = nil; end local enabled, checkboxState; for i=1, MAX_ADDONS_DISPLAYED do addonIndex = AddonList.offset + i; -- Verificar que addonIndex sea válido if not addonIndex then addonIndex = 0 end entry = _G["AddonListEntry"..i]; if ( addonIndex > numEntrys ) then entry:Hide(); else name, title, notes, url, loadable, reason, security, newVersion = GetAddOnInfo(addonIndex); -- Verificar que GetAddOnEnableState no retorne nil checkboxState = GetAddOnEnableState(character, addonIndex); if not checkboxState then checkboxState = 0 end enabled = (checkboxState > 0); -- GetAddOnEnableState() returns 0, 1, 2 (disabled, enabled for some, enabled for all) checkboxState = GetAddOnEnableState(character, addonIndex); enabled = (checkboxState > 0); checkbox = _G["AddonListEntry"..i.."Enabled"]; -- If some are enabled then set the checkbox to be gray TriStateCheckbox_SetState(checkboxState, checkbox); if ( checkboxState == 1 ) then checkbox.tooltip = ENABLED_FOR_SOME; else checkbox.tooltip = nil; end string = _G["AddonListEntry"..i.."Title"]; if ( loadable or ( enabled and (reason == "DEP_DEMAND_LOADED" or reason == "DEMAND_LOADED") ) ) then string:SetTextColor(1.0, 0.78, 0.0); elseif ( enabled and reason ~= "DEP_DISABLED" ) then string:SetTextColor(1.0, 0.1, 0.1); else string:SetTextColor(0.5, 0.5, 0.5); end if ( title ) then string:SetText(title); else string:SetText(name); end urlButton = _G["AddonListEntry"..i.."URL"]; versionButton = _G["AddonListEntry"..i.."Update"]; if ( url ) then if ( newVersion ) then versionButton.tooltip = ADDON_UPDATE_AVAILABLE..CLICK_TO_LAUNCH_ADDON_URL..url; versionButton.url = url; versionButton:Show(); urlButton:Hide(); else versionButton:Hide(); urlButton.tooltip = CLICK_TO_LAUNCH_ADDON_URL..url; urlButton.url = url; urlButton:Show(); end else versionButton:Hide(); urlButton:Hide(); end securityIcon = _G["AddonListEntry"..i.."SecurityIcon"]; if ( security == "SECURE" ) then AddonList_SetSecurityIcon(securityIcon, 1); elseif ( security == "INSECURE" ) then AddonList_SetSecurityIcon(securityIcon, 2); elseif ( security == "BANNED" ) then AddonList_SetSecurityIcon(securityIcon, 3); end _G["AddonListEntry"..i.."Security"].tooltip = _G["ADDON_"..security]; string = _G["AddonListEntry"..i.."Status"]; if ( reason ) then string:SetText(_G["ADDON_"..reason]); else string:SetText(""); end entry:SetID(addonIndex); entry:Show(); end end -- ScrollFrame stuff GlueScrollFrame_Update(AddonListScrollFrame, numEntrys, MAX_ADDONS_DISPLAYED, ADDON_BUTTON_HEIGHT); end function AddonTooltip_BuildDeps(...) local deps = ""; for i=1, select("#", ...) do if ( i == 1 ) then deps = ADDON_DEPENDENCIES .. select(i, ...); else deps = deps..", "..select(i, ...); end end return deps; end function AddonTooltip_Update(owner) AddonTooltip.owner = owner; local name, title, notes,_,_,_, security = GetAddOnInfo(owner:GetID()); if ( security == "BANNED" ) then AddonTooltipTitle:SetText(ADDON_BANNED_TOOLTIP); AddonTooltipNotes:SetText(""); AddonTooltipDeps:SetText(""); else if ( title ) then AddonTooltipTitle:SetText(title); else AddonTooltipTitle:SetText(name); end AddonTooltipNotes:SetText(notes); AddonTooltipDeps:SetText(AddonTooltip_BuildDeps(GetAddOnDependencies(owner:GetID()))); end local titleHeight = AddonTooltipTitle:GetHeight(); local notesHeight = AddonTooltipNotes:GetHeight(); local depsHeight = AddonTooltipDeps:GetHeight(); AddonTooltip:SetHeight(10+titleHeight+2+notesHeight+2+depsHeight+10); end function AddonList_OnKeyDown(key) if ( key == "ESCAPE" ) then AddonList_OnCancel(); elseif ( key == "ENTER" ) then AddonList_OnOk(); elseif ( key == "PRINTSCREEN" ) then Screenshot(); end end function AddonList_Enable(index, enabled) local character = GlueDropDownMenu_GetSelectedValue(AddonCharacterDropDown); if ( character == ALL ) then character = nil; end if ( enabled ) then EnableAddOn(character, index); else DisableAddOn(character, index); end AddonList_Update(); end function AddonList_OnOk() PlaySound("gsLoginChangeRealmOK"); SaveAddOns(); AddonList:Hide(); end function AddonList_OnCancel() PlaySound("gsLoginChangeRealmCancel"); ResetAddOns(); AddonList:Hide(); end function AddonListScrollFrame_OnVerticalScroll(self, offset) local scrollbar = _G[self:GetName().."ScrollBar"]; -- Verificar que offset no sea nil if not offset then offset = 0 end scrollbar:SetValue(offset); AddonList.offset = floor((offset / ADDON_BUTTON_HEIGHT) + 0.5); -- Verificar que AddonList.offset no sea nil if not AddonList.offset then AddonList.offset = 0 end AddonList_Update(); if ( AddonTooltip:IsShown() ) then AddonTooltip_Update(AddonTooltip.owner); end end function AddonList_OnShow() AddonList_Update(); end function AddonList_HasOutOfDate() local hasOutOfDate = false; for i=1, GetNumAddOns() do local name, title, notes, url, loadable, reason = GetAddOnInfo(i); if ( enabled and not loadable and reason == "INTERFACE_VERSION" ) then hasOutOfDate = true; break; end end return hasOutOfDate; end function AddonList_SetSecurityIcon(texture, index) local width = 64; local height = 16; local iconWidth = 16; local increment = iconWidth/width; local left = (index - 1) * increment; local right = index * increment; texture:SetTexCoord( left, right, 0, 1.0); end function AddonList_DisableOutOfDate() for i=1, GetNumAddOns() do local name, title, notes, url, loadable, reason = GetAddOnInfo(i); if ( enabled and not loadable and reason == "INTERFACE_VERSION" ) then DisableAddOn(i); end end end function AddonList_HasNewVersion() local hasNewVersion = false; for i=1, GetNumAddOns() do local name, title, notes, url, loadable, reason, security, newVersion = GetAddOnInfo(i); if ( newVersion ) then hasNewVersion = true; break; end end return hasNewVersion; end AddonDialogTypes = { }; AddonDialogTypes["ADDONS_OUT_OF_DATE"] = { text = ADDONS_OUT_OF_DATE, button1 = DISABLE_ADDONS, button2 = LOAD_ADDONS, OnAccept = function() AddonDialog_Show("CONFIRM_DISABLE_ADDONS"); end, OnCancel = function() AddonDialog_Show("CONFIRM_LOAD_ADDONS"); end, } AddonDialogTypes["CONFIRM_LOAD_ADDONS"] = { text = CONFIRM_LOAD_ADDONS, button1 = OKAY, button2 = CANCEL, OnAccept = function() SetAddonVersionCheck(0); end, OnCancel = function() AddonDialog_Show("ADDONS_OUT_OF_DATE"); end, } AddonDialogTypes["CONFIRM_DISABLE_ADDONS"] = { text = CONFIRM_DISABLE_ADDONS, button1 = OKAY, button2 = CANCEL, OnAccept = function() AddonList_DisableOutOfDate(); end, OnCancel = function() AddonDialog_Show("ADDONS_OUT_OF_DATE"); end, } AddonDialogTypes["CONFIRM_LAUNCH_ADDON_URL"] = { text = CONFIRM_LAUNCH_ADDON_URL, button1 = OKAY, button2 = CANCEL, OnAccept = function() LaunchAddOnURL(AddonList.selectedID); end } function AddonDialog_Show(which, arg1) -- Set the text of the dialog if ( arg1 ) then AddonDialogText:SetFormattedText(AddonDialogTypes[which].text, arg1); else AddonDialogText:SetText(AddonDialogTypes[which].text); end -- Set the buttons of the dialog if ( AddonDialogTypes[which].button2 ) then AddonDialogButton1:ClearAllPoints(); AddonDialogButton1:SetPoint("BOTTOMRIGHT", "AddonDialogBackground", "BOTTOM", -6, 16); AddonDialogButton2:ClearAllPoints(); AddonDialogButton2:SetPoint("LEFT", "AddonDialogButton1", "RIGHT", 13, 0); AddonDialogButton2:SetText(AddonDialogTypes[which].button2); AddonDialogButton2:Show(); else AddonDialogButton1:ClearAllPoints(); AddonDialogButton1:SetPoint("BOTTOM", "AddonDialogBackground", "BOTTOM", 0, 16); AddonDialogButton2:Hide(); end AddonDialogButton1:SetText(AddonDialogTypes[which].button1); -- Set the miscellaneous variables for the dialog AddonDialog.which = which; -- Finally size and show the dialog AddonDialogBackground:SetHeight(16 + AddonDialogText:GetHeight() + 8 + AddonDialogButton1:GetHeight() + 16); AddonDialog:Show(); end function AddonDialog_OnClick(index) AddonDialog:Hide(); if ( index == 1 ) then local OnAccept = AddonDialogTypes[AddonDialog.which].OnAccept; if ( OnAccept ) then OnAccept(); end else local OnCancel = AddonDialogTypes[AddonDialog.which].OnCancel; if ( OnCancel ) then OnCancel(); end end end function AddonDialog_OnKeyDown(key) if ( key == "PRINTSCREEN" ) then Screenshot(); return; end if ( key == "ESCAPE" ) then if ( AddonDialogButton2:IsShown() ) then AddonDialogButton2:Click(); else AddonDialogButton1:Click(); end elseif (key == "ENTER" ) then AddonDialogButton1:Click(); end end function AddonListCharacterDropDown_OnClick(self) GlueDropDownMenu_SetSelectedValue(AddonCharacterDropDown, self.value); AddonList_Update(); end function AddonListCharacterDropDown_Initialize() local selectedValue = GlueDropDownMenu_GetSelectedValue(AddonCharacterDropDown); local info = GlueDropDownMenu_CreateInfo(); info.text = ALL; info.value = ALL; info.func = AddonListCharacterDropDown_OnClick; if ( not selectedValue ) then info.checked = 1; end GlueDropDownMenu_AddButton(info); for i=1, GetNumCharacters() do info.text = GetCharacterInfo(i); info.value = GetCharacterInfo(i); info.func = AddonListCharacterDropDown_OnClick; if ( selectedValue == info.value ) then info.checked = 1; else info.checked = nil; end GlueDropDownMenu_AddButton(info); end end