diff --git a/Libs/DF/panel.lua b/Libs/DF/panel.lua
index 99ebd3a4..f447601a 100644
--- a/Libs/DF/panel.lua
+++ b/Libs/DF/panel.lua
@@ -5158,38 +5158,43 @@ detailsFramework.HeaderFunctions = {
end,
---comment
- ---@param self button
+ ---@param columnHeader headercolumnframe
---@param buttonClicked string
- OnClick = function(self, buttonClicked)
+ OnClick = function(columnHeader, buttonClicked)
--get the header main frame
---@type headerframe
- local headerFrame = self:GetParent()
+ local headerFrame = columnHeader:GetParent()
--if this header does not have a clickable header, just ignore
if (not headerFrame.columnSelected) then
return
end
+ --check if this column has 'canSort' key, otherwise ignore the click
+ if (not columnHeader.columnData.canSort) then
+ return
+ end
+
--get the latest column header selected
---@type headercolumnframe
local previousColumnHeader = headerFrame.columnHeadersCreated[headerFrame.columnSelected]
previousColumnHeader.Arrow:Hide()
headerFrame:ResetColumnHeaderBackdrop(previousColumnHeader)
- headerFrame:SetBackdropColorForSelectedColumnHeader(self)
+ headerFrame:SetBackdropColorForSelectedColumnHeader(columnHeader)
- if (headerFrame.columnSelected == self.columnIndex) then
- self.order = self.order ~= "ASC" and "ASC" or "DESC"
+ if (headerFrame.columnSelected == columnHeader.columnIndex) then
+ columnHeader.order = columnHeader.order ~= "ASC" and "ASC" or "DESC"
end
- headerFrame.columnOrder = self.order
+ headerFrame.columnOrder = columnHeader.order
--set the new column header selected
- headerFrame.columnSelected = self.columnIndex
+ headerFrame.columnSelected = columnHeader.columnIndex
- headerFrame:UpdateSortArrow(self)
+ headerFrame:UpdateSortArrow(columnHeader)
if (headerFrame.options.header_click_callback) then
--callback with the main header frame, column header, column index and column order as payload
- local okay, errortext = pcall(headerFrame.options.header_click_callback, headerFrame, self, self.columnIndex, self.order)
+ local okay, errortext = pcall(headerFrame.options.header_click_callback, headerFrame, columnHeader, columnHeader.columnIndex, columnHeader.order)
if (not okay) then
print("DF: Header onClick callback error:", errortext)
end
@@ -5514,14 +5519,6 @@ detailsFramework.HeaderCoreFunctions = {
columnHeader:SetMovable(true)
columnHeader:SetResizable(true)
- columnHeader:SetScript("OnMouseDown", function()
- print(11)
- end)
-
- columnHeader:SetScript("OnMouseUp", function()
- print(22) --doesn't work either
- end)
-
--header icon
detailsFramework:CreateImage(columnHeader, "", self.options.header_height, self.options.header_height, "ARTWORK", nil, "Icon", "$parentIcon")
--header separator
diff --git a/frames/window_playerbreakdown_spells.lua b/frames/window_playerbreakdown_spells.lua
index ca8eedb7..c806cf1b 100644
--- a/frames/window_playerbreakdown_spells.lua
+++ b/frames/window_playerbreakdown_spells.lua
@@ -75,25 +75,28 @@ end
---@type table
local headerContainerType = {}
+---@type number
+local columnOffset = 0
+
---default settings for the header of the spells container
---label is a localized string
----@type {name: string, width: number, label: string, align: string, enabled: boolean, attribute: number|nil}[]
+---@type {name: string, width: number, selected: boolean|nil, label: string, align: string, enabled: boolean, attribute: number|nil, canSort: boolean|nil, dataType: string|nil, order: string|nil, offset: number|nil}[]
local spellContainerColumnInfo = {
- {name = "icon", width = 22, label = "", align = "center", enabled = true,},
- {name = "target", width = 22, label = "", align = "center", enabled = true},
- {name = "rank", label = "#", width = 16, align = "center", enabled = true},
- {name = "expand", label = "^", width = 16, align = "center", enabled = true},
- {name = "name", label = "spell name", width = 246, align = "left", enabled = true},
- {name = "amount", label = "total", width = 50, align = "left", enabled = true},
- {name = "persecond", label = "ps", width = 50, align = "left", enabled = true},
- {name = "percent", label = "%", width = 50, align = "left", enabled = true},
- {name = "casts", label = "casts", width = 40, align = "left", enabled = false},
- {name = "critpercent", label = "crit %", width = 40, align = "left", enabled = false},
- {name = "hits", label = "hits", width = 40, align = "left", enabled = false},
- {name = "castavg", label = "cast avg", width = 50, align = "left", enabled = false},
- {name = "uptime", label = "uptime", width = 45, align = "left", enabled = false},
- {name = "overheal", label = "overheal", width = 45, align = "left", enabled = false, attribute = DETAILS_ATTRIBUTE_HEAL},
- {name = "absorbed", label = "absorbed", width = 45, align = "left", enabled = false, attribute = DETAILS_ATTRIBUTE_HEAL},
+ {name = "icon", width = 22, label = "", align = "center", enabled = true, offset = columnOffset},
+ {name = "target", width = 22, label = "", align = "center", enabled = true, offset = columnOffset},
+ {name = "rank", label = "#", width = 16, align = "center", enabled = true, offset = columnOffset, dataType = "number"},
+ {name = "expand", label = "^", width = 16, align = "center", enabled = true, offset = columnOffset},
+ {name = "name", label = "spell name", width = 246, align = "left", enabled = true, offset = columnOffset},
+ {name = "amount", label = "total", selected = true, width = 50, align = "left", enabled = true, canSort = true, dataType = "number", order = "DESC", offset = columnOffset},
+ {name = "persecond", label = "ps", width = 50, align = "left", enabled = true, canSort = true, offset = columnOffset, order = "DESC", dataType = "number"},
+ {name = "percent", label = "%", width = 50, align = "left", enabled = true, canSort = true, offset = columnOffset, order = "DESC", dataType = "number"},
+ {name = "casts", label = "casts", width = 40, align = "left", enabled = false, canSort = true, offset = columnOffset, order = "DESC", dataType = "number"},
+ {name = "critpercent", label = "crit %", width = 40, align = "left", enabled = false, canSort = true, offset = columnOffset, order = "DESC", dataType = "number"},
+ {name = "hits", label = "hits", width = 40, align = "left", enabled = false, canSort = true, offset = columnOffset, order = "DESC", dataType = "number"},
+ {name = "castavg", label = "cast avg", width = 50, align = "left", enabled = false, canSort = true, offset = columnOffset, order = "DESC", dataType = "number"},
+ {name = "uptime", label = "uptime", width = 45, align = "left", enabled = false, canSort = true, offset = columnOffset, order = "DESC", dataType = "number"},
+ {name = "overheal", label = "overheal", width = 45, align = "left", enabled = false, canSort = true, order = "DESC", dataType = "number", attribute = DETAILS_ATTRIBUTE_HEAL, offset = columnOffset},
+ {name = "absorbed", label = "absorbed", width = 45, align = "left", enabled = false, canSort = true, order = "DESC", dataType = "number", attribute = DETAILS_ATTRIBUTE_HEAL, offset = columnOffset},
}
---callback for when the user resizes a column on the header
@@ -119,6 +122,23 @@ local onHeaderColumnOptionChanged = function(headerFrame, optionName, columnName
spellsTab.UpdateHeadersSettings(containerType)
end
+---run when the user clicks the columnHeader
+---@param headerFrame headerframe
+---@param columnHeader headercolumnframe
+local onColumnHeaderClickCallback = function(headerFrame, columnHeader)
+
+ print("column header clicked!")
+
+ ---@type string
+ local containerType = headerContainerType[headerFrame]
+
+ if (containerType == "spells") then
+ spellsTab.TabFrame.SpellScrollFrame:Refresh()
+ end
+
+ --tab:fillfunction(Details:GetPlayerObjectFromBreakdownWindow(), Details:GetCombatFromBreakdownWindow())
+end
+
---update details profile
---copy settings from the ColumnInfo table which doesn't exists in the details profile
---this is called when the profile changes or when the tab is opened with a different actor than before
@@ -192,9 +212,13 @@ function spellsTab.BuildHeaderTable(containerType)
end
for i = 1, #containerInfo do
+ ---@type {name: string, width: number, selected: boolean|nil, label: string, align: string, enabled: boolean, attribute: number|nil, canSort: boolean|nil, dataType: string|nil, order: string|nil, offset: number|nil}
local columnData = containerInfo[i]
+ ---@type {enabled: boolean, width: number, align: string}
local columnSettings = settings[columnData.name]
+ --, canSort = true, dataType = "number", order = "DESC", offset = 0
+
if (columnSettings.enabled) then
local bCanAdd = true
if (columnData.attribute) then
@@ -205,10 +229,17 @@ function spellsTab.BuildHeaderTable(containerType)
if (bCanAdd) then
headerTable[#headerTable+1] = {
- text = columnData.label,
width = columnSettings.width,
+ text = columnData.label,
name = columnData.name,
- --align = column.align,
+
+ --these values may be nil
+ selected = columnData.selected,
+ align = columnData.align,
+ canSort = columnData.canSort,
+ dataType = columnData.dataType,
+ order = columnData.order,
+ offset = columnData.offset,
}
end
end
@@ -1310,6 +1341,17 @@ local refreshFunc = function(scrollFrame, scrollData, offset, totalLines) --~ref
local headerTable = spellsTab.spellsHeaderData
+ --get which column is currently selected and the sort order
+ local columnIndex, order = scrollFrame.Header:GetSelectedColumn()
+
+ --[=[
+ if (order == "DESC") then
+ table.sort(allSpells, function (t1, t2) return t1[4] > t2[4] end)
+ else
+ table.sort(allSpells, function (t1, t2) return t1[4] < t2[4] end)
+ end
+ --]=]
+
local lineIndex = 1
for i = 1, totalLines do
local index = i + offset
@@ -1400,6 +1442,8 @@ function spellsTab.CreateSpellScrollContainer(tabFrame)
reziser_width = 2,
reziser_color = {.5, .5, .5, 0.7},
reziser_max_width = 246,
+
+ header_click_callback = onColumnHeaderClickCallback,
}
local headerTable = {}