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.

218 lines
6.7 KiB

4 years ago
local WIT, core = ...
local AceGUI = LibStub("AceGUI-3.0")
local function CreateArrow(texture, size)
local frame = CreateFrame("Button", nil, UIParent)
frame:SetWidth(size)
frame:SetHeight(size)
frame.image = frame:CreateTexture(nil, "ARTWORK")
frame.image:SetTexture(texture)
frame.image:SetAllPoints(frame)
return frame
end
local function CreateColumnSelector(column)
local frame = AceGUI:Create("SimpleGroup")
frame:SetLayout("Flow")
frame:SetHeight(16)
frame:SetFullWidth(true)
local checkMark = CreateArrow("Interface\\AddOns\\WIT\\Images\\Icons\\check_mark", 10)
checkMark:SetParent(frame.frame)
checkMark:SetPoint("TOPRIGHT", frame.frame, "TOPLEFT", 0, -3)
local label = AceGUI:Create("InteractiveLabel")
label:SetText(column.DisplayName)
frame.minWidth = label.label:GetStringWidth() + 30
label:SetWidth(frame.minWidth - 25)
frame.background = frame.frame:CreateTexture(nil, "BACKGROUND")
frame.background:SetPoint("TOPLEFT", frame.frame, "TOPLEFT", -13, -2)
frame.background:SetPoint("BOTTOMRIGHT", frame.frame, "BOTTOMRIGHT", 0, -2)
if column.IsHidden then
frame.background:SetColorTexture(0.2, 0.2, 0.2)
checkMark.image:SetTexture(nil)
else
frame.background:SetColorTexture(0, 0, 0)
checkMark.image:SetTexture("Interface\\AddOns\\WIT\\Images\\Icons\\check_mark")
end
local arrowUp = CreateArrow("Interface\\AddOns\\WIT\\Images\\Icons\\arrow_up_gold", 16)
arrowUp:SetParent(frame.frame)
arrowUp:SetPoint("TOPRIGHT", frame.frame, "TOPRIGHT", -15, 0)
arrowUp:SetScript("OnClick", function(self)
frame.moveUp(column)
end)
local arrowDown = CreateArrow("Interface\\AddOns\\WIT\\Images\\Icons\\arrow_down_gold", 16)
arrowDown:SetParent(frame.frame)
arrowDown:SetPoint("TOPRIGHT", frame.frame, "TOPRIGHT", -3, 0)
arrowDown:SetScript("OnClick", function(self)
frame.moveDown(column)
end)
frame:SetCallback("OnRelease", function(self)
self.background:Hide()
arrowUp:Hide()
arrowUp:SetParent(nil)
arrowDown:Hide()
arrowDown:SetParent(nil)
checkMark.image:SetTexture(nil)
end)
checkMark:SetScript("OnClick", function(self)
column.IsHidden = not column.IsHidden
if column.IsHidden then
frame.background:SetColorTexture(0.2, 0.2, 0.2)
checkMark.image:SetTexture(nil)
else
frame.background:SetColorTexture(0, 0, 0)
checkMark.image:SetTexture("Interface\\AddOns\\WIT\\Images\\Icons\\check_mark")
end
local module = core.UI.MainWindow.CurrentModule()
if module ~= nil then
if module.SaveColumnFilter then
module.SaveColumnFilter()
end
module.Refresh()
end
end)
label:SetCallback("OnClick", function()
column.IsHidden = not column.IsHidden
if column.IsHidden then
frame.background:SetColorTexture(0.2, 0.2, 0.2)
checkMark.image:SetTexture(nil)
else
frame.background:SetColorTexture(0, 0, 0)
checkMark.image:SetTexture("Interface\\AddOns\\WIT\\Images\\Icons\\check_mark")
end
local module = core.UI.MainWindow.CurrentModule()
if module ~= nil then
if module.SaveColumnFilter then
module.SaveColumnFilter()
end
module.Refresh()
end
end)
frame:AddChild(label)
return frame
end
local function DrawColumns(frame, columns)
local minWidth = 0
local function MoveUp(column)
local module = core.UI.MainWindow.CurrentModule()
if module == nil or module.Columns == nil then return end
local columns = module.Columns
local index = core.TableHelper.IndexOf(columns, column)
if index > 1 and not columns[index - 1].IsFixedSize and columns[index - 1].Name ~= '' then
table.remove(columns, index)
table.insert(columns, index - 1, column)
DrawColumns(frame, columns)
if module.SaveColumnFilter then
module.SaveColumnFilter()
end
module.Refresh()
end
end
local function MoveDown(column)
local module = core.UI.MainWindow.CurrentModule()
if module == nil or module.Columns == nil then return end
local columns = module.Columns
local index = core.TableHelper.IndexOf(columns, column)
if index < #columns then
table.remove(columns, index)
table.insert(columns, index + 1, column)
DrawColumns(frame, columns)
if module.SaveColumnFilter then
module.SaveColumnFilter()
end
module.Refresh()
end
end
frame:ReleaseChildren()
for _, column in pairs(columns) do
if not column.IsFixedSize and column.Name ~= '' then
local columnSelector = CreateColumnSelector(column)
columnSelector.moveUp = MoveUp
columnSelector.moveDown = MoveDown
minWidth = minWidth < columnSelector.minWidth and columnSelector.minWidth or minWidth
frame:AddChild(columnSelector)
end
end
frame:SetWidth(minWidth + 5)
end
local function CreatePanel(columns)
local frame = AceGUI:Create("SimpleGroup")
frame:SetLayout("List")
frame:SetHeight(16)
DrawColumns(frame, columns or {})
return frame
end
local function CreateWidget()
local frame = CreateFrame("Button", nil, UIParent)
frame:SetWidth(16)
frame:SetHeight(16)
local image = frame:CreateTexture(nil, "BACKGROUND")
image:SetTexture("Interface\\AddOns\\WIT\\Images\\Icons\\menu")
image:SetAllPoints(frame)
frame.Panel = CreatePanel(nil)
frame.Panel.frame:SetParent(frame)
frame.Panel:SetPoint("TOPRIGHT", frame, "BOTTOMRIGHT", 0, 0)
frame.Panel.frame:Hide()
frame:SetScript("OnClick", function(self)
if frame.Panel.frame:IsShown() then
frame.Panel.frame:Hide()
else
frame.Panel.frame:Show()
end
end)
local widget = {
frame = frame,
type = "ColumnSelector"
}
widget.RefeshColumnList = function(module)
frame.Panel.frame:Hide()
if module ~= nil and module.Columns then
DrawColumns(frame.Panel, module.Columns or {})
end
end
widget.OnAcquire = function() end
return AceGUI:RegisterAsWidget(widget)
end
function core.UI.ColumnSelector(columns)
return CreateWidget()
end