local upper = string.upper
local classes = { "DH", "DK", "Druid", "Hunter", "Mage", "Monk", "Paladin", "Priest", "Rogue", "Shaman", "Warlock", "Warrior" } -- Sorted to use keys[i] insted of full class name in the table
local width, height, numrows = 200, 20, 6
local TableData = {}
local FilteredData = {}
for i=1, 30 do
tinsert(TableData, { Player=i, Class=random(1, #classes), DKP=random(0, 10000) })
end
local function OnClick(self)
print(self.Strings[1]:GetText(), self.Strings[2]:GetText(), self.Strings[3]:GetText())
end
function CreateRow(parent, id) -- Create 3 buttons for each row in the list
local f = CreateFrame("Button", "$parentLine"..id, parent)
f.Strings = {}
f:SetSize(width, height)
f:SetHighlightTexture("Interface\\BUTTONS\\UI-Listbox-Highlight2.blp");
f:SetScript("OnClick", OnClick)
for i=1, 3 do
f.Strings[i] = f:CreateFontString(nil, "OVERLAY");
f.Strings[i]:SetFontObject("GameFontHighlight");
f.Strings[i]:SetTextColor(1, 1, 1, 1);
end
f.Strings[1]:SetPoint("LEFT")
f.Strings[2]:SetPoint("CENTER")
f.Strings[3]:SetPoint("RIGHT", -30, 0)
return f
end
local function ScrollFrame_Update(self)
local numOptions = #FilteredData
local index, row
local offset = FauxScrollFrame_GetOffset(self) or 0
for i=1, numrows do
row = self.Rows[i]
index = offset + i
if FilteredData[index] then
row:Show()
row.index = index
row.Strings[1]:SetText("Player"..FilteredData[index].Player)
row.Strings[2]:SetText(classes[FilteredData[index].Class])
row.Strings[3]:SetText(FilteredData[index].DKP)
else
row:Hide()
end
end
FauxScrollFrame_Update(self, numOptions, numrows, height, nil, nil, nil, nil, nil, nil, true) -- alwaysShowScrollBar= true to stop frame from hiding
end
local f = CreateFrame("ScrollFrame", "FizzleScrollFrame", UIParent, "FauxScrollFrameTemplate")
f:SetSize(width, height*numrows)
f:SetPoint("LEFT", 20, 0)
f.ScrollBar = FauxScrollFrame_GetChildFrames(f)
f.Rows = {}
for i=1, numrows do
f.Rows[i] = CreateRow(f, i)
f.Rows[i]:SetPoint("TOPLEFT", f.Rows[i-1] or f, f.Rows[i-1] and "BOTTOMLEFT" or "TOPLEFT")
end
f:SetScript("OnVerticalScroll", function(self, offset)
FauxScrollFrame_OnVerticalScroll(self, offset, height, ScrollFrame_Update)
end)
------------ Add Sorting and Header Buttons -------------------------
local SortButtons = {}
local function SortTable(id, reset)
local button = SortButtons[id]
if reset then
button.Ascend = true
else
button.Ascend = not button.Ascend
end
local Suffix = button.Ascend and " ^" or " v"
button:SetText(button.Id .. Suffix)
for k, v in pairs(SortButtons) do
if v ~= button then
v.Ascend = nil
v:SetText(v.Id)
end
end
table.sort(FilteredData, function(a, b)
if button.Ascend then
return a[button.Id] < b[button.Id]
else
return a[button.Id] > b[button.Id]
end
end)
ScrollFrame_Update(f)
end
-- add the buttons
SortButtons.Player = CreateFrame("Button", "FizzleSortButtonPlayer", f, "UIPanelButtonTemplate")
SortButtons.Class = CreateFrame("Button", "FizzleSortButtonClass", f, "UIPanelButtonTemplate")
SortButtons.DKP = CreateFrame("Button", "FizzleSortButtonDkp", f, "UIPanelButtonTemplate")
SortButtons.Class:SetPoint("BOTTOM", f, "TOP", 0, 5)
SortButtons.Player:SetPoint("RIGHT", SortButtons.Class, "LEFT")
SortButtons.DKP:SetPoint("LEFT", SortButtons.Class, "RIGHT")
for k, v in pairs(SortButtons) do
v.Id = k
v:SetText(k)
v:SetSize(width/3, height)
v:SetScript("OnClick", function(self) SortTable(self.Id) end)
end
------------ Add Filtering on Class and Edit Box -------------------------
local function FilterTable(filter, sort)
table.wipe(FilteredData)
for k, v in pairs(TableData) do
if filter == "" or upper(classes[v.Class]) == upper(filter) then
tinsert(FilteredData, v)
end
end
SortTable(sort)
end
-- add the editbox and label
local Filter = CreateFrame("EditBox", "FizzleFilter", FizzleScrollFrame, "InputBoxTemplate")
Filter:SetSize(75, 20)
Filter:SetAutoFocus(false)
Filter:SetPoint("BOTTOMLEFT", SortButtons.Player, "TOPLEFT", 0, 2)
Filter:SetScript("OnEnterPressed", function(self)
FilterTable(self:GetText(), "Player")
end)
Filter.Label = Filter:CreateFontString()
Filter.Label:SetFont("Fonts\\FRIZQT__.TTF", 12)
Filter.Label:SetPoint("LEFT", Filter, "RIGHT", 2, 0)
Filter.Label:SetText("Filter Class [press Enter]")
------------ Let's load the list to start -------------------------
FilterTable("", "Player")