You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
73 lines
1.9 KiB
73 lines
1.9 KiB
--Add a search box to the AddonList
|
|
|
|
local _, addon = ...
|
|
|
|
local GetAddOnInfo = C_AddOns.GetAddOnInfo;
|
|
local StripHyperlinks = StripHyperlinks;
|
|
local sub = string.sub;
|
|
local find = string.find;
|
|
local lower = string.lower;
|
|
|
|
local AddonDataProvider = {};
|
|
|
|
function AddonDataProvider:LoadNames()
|
|
if self.dict then return end;
|
|
|
|
self.dict = {};
|
|
self.names = {};
|
|
self.total = C_AddOns.GetNumAddOns();
|
|
|
|
local name, firstLetter;
|
|
local lastLetter;
|
|
local letterRange = 0;
|
|
|
|
for i = 1, self.total do
|
|
name = GetAddOnInfo(i);
|
|
name = StripHyperlinks(name);
|
|
|
|
firstLetter = sub(lower(name), 1, 1);
|
|
|
|
if lastLetter and firstLetter ~= lastLetter then
|
|
self.dict[lastLetter][2] = letterRange;
|
|
letterRange = 0;
|
|
end
|
|
letterRange = letterRange + 1;
|
|
|
|
if not self.dict[firstLetter] then
|
|
self.dict[firstLetter] = {i};
|
|
end
|
|
|
|
lastLetter = firstLetter;
|
|
|
|
self.names[i] = name;
|
|
end
|
|
end
|
|
|
|
function AddonDataProvider:FindIndexByName(name)
|
|
self:LoadNames();
|
|
|
|
name = lower(name);
|
|
local firstLetter = sub(name, 1, 1);
|
|
|
|
if self.dict[firstLetter] then
|
|
local from, range = self.dict[firstLetter][1], self.dict[firstLetter][2];
|
|
local to = (range and from + range) or self.total;
|
|
for i = from, to do
|
|
if find(lower(self.names[i]), name) then
|
|
print(self.names[i])
|
|
return i
|
|
end
|
|
end
|
|
end
|
|
|
|
end
|
|
|
|
function ScrollToAddOnName(name)
|
|
local index = AddonDataProvider:FindIndexByName(name);
|
|
if index then
|
|
local alignment = 0; --ScrollBoxConstants.AlignBegin
|
|
local noInterpolation = true;
|
|
AddonList.ScrollBox:ScrollToElementDataIndex(index, alignment, noInterpolation);
|
|
return true
|
|
end
|
|
end
|