418 lines
11 KiB
Lua
418 lines
11 KiB
Lua
-- ============================================================================
|
|
-- Autora: Noa
|
|
-- ============================================================================
|
|
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
|