From f370ce3deef9cc269c71063a73a3490d1c56e7ab Mon Sep 17 00:00:00 2001 From: Tercio Jose Date: Thu, 13 Apr 2023 21:43:04 -0300 Subject: [PATCH] More development --- Libs/DF/panel.lua | 33 +++++----- frames/window_playerbreakdown_spells.lua | 80 ++++++++++++++++++------ 2 files changed, 77 insertions(+), 36 deletions(-) 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 = {}