local _ , S = ...
local pairs , ipairs , string , type , time = pairs , ipairs , string , type , time
local function UpdateEntry ( self )
local data = self : GetData ( )
data.color1 = S.Utils . GetItemQualityColor ( data.quality )
data.color2 = S.Utils . GetItemQualityHighlightColor ( data.quality )
data.tinted = S.Utils . GetItemQualityGreyedColor ( data.quality )
data.filtered = self.filtered
local gridView = self.list . gridView
local columnSettings = self.list : GetColumnSettings ( )
for column , element in pairs ( self.columnElements ) do
if columnSettings.enabledColumns [ column ] or column == " ICON " then
if not gridView then
self.list . columns [ column ] . UpdateElement ( element , data )
else
if column == " NAME " or column == " QUANTITY " or column == " ICON " then
self.list . columns [ column ] . UpdateElement ( element , data )
end
end
end
end
end
local function UpdateIcons ( self , iconSize , borderThickness , iconShape , iconBorders )
local columnSettings = self.list : GetColumnSettings ( )
for column , element in pairs ( self.columnElements ) do
if columnSettings.enabledColumns [ column ] or column == " ICON " then
local func = self.list . columns [ column ] . UpdateIcon
if func then
func ( element , iconSize , borderThickness , iconShape , iconBorders )
end
end
end
end
local function SetFiltered ( self , filtered )
end
local function GetFavorited ( self )
return 0
end
local function ToggleFavorited ( self )
end
local function SetFavorited ( self , value )
end
local function ClearFavorited ( self )
end
local function Button_FollowMouseWithHighlight ( self , elapsed )
local parent = self.parent
--self.highlight:ClearAllPoints()
local x , y = GetCursorPosition ( )
x = x / self : GetEffectiveScale ( )
y = y / self : GetEffectiveScale ( )
local x2 , y2 = self : GetCenter ( )
parent.highlight : SetWidth ( self : GetWidth ( ) * 3 )
parent.highlight : SetPoint ( " LEFT " , self , " CENTER " , ( x - x2 ) - parent.highlight : GetWidth ( ) / 2 , y )
--self.highlight:SetPoint("TOP", UIParent, "BOTTOMLEFT", 0, y2 + self:GetHeight() / 2)
--self.highlight:SetPoint("BOTTOM", UIParent, "BOTTOMLEFT", 0, y2 - self:GetHeight() / 2)
end
local function AddFrameToColumn ( self , frame , column )
self.columnElements [ column ] = frame
frame : SetPoint ( " TOP " )
frame : SetPoint ( " BOTTOM " )
frame : SetPoint ( " LEFT " , self.list . columnHeadings [ column ] )
frame : SetPoint ( " RIGHT " , self.list . columnHeadings [ column ] )
end
local function DetachFramesFromColumns ( self )
for column , frame in pairs ( self.columnElements ) do
frame : ClearAllPoints ( )
frame : Hide ( )
end
end
local function AttachFramesToColumns ( self )
for column , frame in pairs ( self.columnElements ) do
frame : SetPoint ( " TOP " )
frame : SetPoint ( " BOTTOM " )
frame : SetPoint ( " LEFT " , self.list . columnHeadings [ column ] )
frame : SetPoint ( " RIGHT " , self.list . columnHeadings [ column ] )
end
end
local function AddColumn ( self , columnKey )
local f = CreateFrame ( " FRAME " , " " , self )
f.parent = self
self.list . columns [ columnKey ] . CreateElement ( f )
self : AddFrameToColumn ( f , columnKey )
end
local function OnIconBorderSettingChanged ( self , event , value )
self.iconBorder : SetShown ( value > 0 )
end
local function OnIconBorderThicknessSettingChanged ( self , event )
local size
if self.list . gridView then
size = S.Settings . Get ( " iconSizeGrid " ) + S.Settings . Get ( " iconBorderThicknessGrid " )
else
size = S.Settings . Get ( " iconSize " ) + S.Settings . Get ( " iconBorderThickness " )
end
self.iconBorder : SetSize ( size , size )
end
local buttonCount = 1
function S . CreateListEntry ( list , template )
--local parent = CreateFrame("FRAME", nil, list.listFrame) -- For item entry buttons to function with Blizzard's code untainted, there must be a parent frame to hold the bag ID
--parent:SetAllPoints()
local self = CreateFrame ( " FRAME " , nil , list.listFrame --[[parent, template]] )
self.button = CreateFrame ( " BUTTON " , " SortedListEntryButton " .. buttonCount , self , template )
buttonCount = buttonCount + 1
self.button : ClearAllPoints ( )
self.button . parent = self
if template then -- Only want to inherit methods, not any textures or children
for k , v in pairs ( self.button ) do
if type ( v ) == " table " and v.Hide then
v : Hide ( )
v : ClearAllPoints ( )
end
end
if self.button : GetNormalTexture ( ) then
self.button : SetNormalTexture ( " " )
end
if self.button : GetHighlightTexture ( ) then
self.button : SetHighlightTexture ( " " )
end
if _G [ self.button : GetName ( ) .. " NormalTexture " ] then
_G [ self.button : GetName ( ) .. " NormalTexture " ] : ClearAllPoints ( )
_G [ self.button : GetName ( ) .. " NormalTexture " ] : SetTexture ( " " )
_G [ self.button : GetName ( ) .. " NormalTexture " ] : Hide ( )
end
end
self : ClearAllPoints ( )
self.parentFrame = self : GetParent ( )
self.data = { }
self.list = list
self.columnElements = { }
self.AddColumn = AddColumn
self.Update = UpdateEntry
self.UpdateIcons = UpdateIcons
self.SetFiltered = SetFiltered
self.GetFavorited = GetFavorited
self.ToggleFavorited = ToggleFavorited
self.ClearFavorited = ClearFavorited
self.SetFavorited = SetFavorited
self.AddFrameToColumn = AddFrameToColumn
self.DetachFramesFromColumns = DetachFramesFromColumns
self.AttachFramesToColumns = AttachFramesToColumns
--self.OnIconChanged = OnIconChanged
self.highlight = self.button : CreateTexture ( nil , " OVERLAY " )
self.highlight : SetTexture ( " Interface \\ Addons \\ Sorted \\ Textures \\ UI-Highlight " )
self.highlight : SetBlendMode ( " ADD " )
self.highlight : SetPoint ( " TOP " )
self.highlight : SetPoint ( " BOTTOM " )
self.highlight : Hide ( )
--self:GetHighlightTexture():SetAlpha(0.8)
self.button : SetPushedTexture ( " Interface \\ Addons \\ Sorted \\ Textures \\ UI-Highlight " )
self.button : GetPushedTexture ( ) : SetTexCoord ( 0.5 , 0.6 , 0 , 1 )
self.button : GetPushedTexture ( ) : SetBlendMode ( " ADD " )
self : SetPoint ( " LEFT " )
self : SetPoint ( " RIGHT " )
self : SetHeight ( 20 )
self.button : SetAllPoints ( )
self.button : Show ( )
-- On mouse enter/leave, start/stop the mouse-following highlight texture
-- Also zoom the icon and move the name
self.button : SetScript ( " OnEnter " , function ( self )
local parent = self.parent
if not parent.list . gridView then
local favorited = parent : GetFavorited ( )
if not favorited or favorited == 0 then
local favoriteButtonTexSize = 0.21875
parent.columnElements [ " FAVORITES " ] . favoriteButton.backdrop : SetTexCoord ( 0 , favoriteButtonTexSize , favoriteButtonTexSize * 2 , favoriteButtonTexSize * 3 )
end
parent.highlight : Show ( )
self : SetScript ( " OnUpdate " , Button_FollowMouseWithHighlight )
end
parent.mouseEntered = true
-- Zoom icon and shift name to the right
if not parent.filtered then
local icon = parent.columnElements [ " ICON " ]
local name = parent.columnElements [ " NAME " ]
icon : SetFrameLevel ( parent : GetFrameLevel ( ) + 5 )
local size , extraSize , thickness , zoom
if parent.list . gridView then
zoom = S.Settings . Get ( " iconZoomGrid " )
size = S.Settings . Get ( " iconSizeGrid " )
thickness = S.Settings . Get ( " iconBorderThicknessGrid " )
else
zoom = S.Settings . Get ( " iconZoom " )
size = S.Settings . Get ( " iconSize " )
thickness = S.Settings . Get ( " iconBorderThickness " )
end
extraSize = size * zoom - size
size = size * zoom
icon.icon : SetSize ( size , size )
icon.iconMask : SetSize ( size , size )
icon.iconBorder : Show ( )
icon.iconBorder : SetSize ( size + thickness * zoom , size + thickness * zoom )
icon.iconBorder : SetVertexColor ( parent.data . color2 : GetRGB ( ) )
name.nameString : SetPoint ( " LEFT " , 2 + extraSize / 2 , 0 )
name.nameString : SetTextColor ( parent.data . color2 : GetRGB ( ) )
end
end )
self.button : HookScript ( " OnLeave " , function ( self )
local parent = self.parent
if not parent.list . gridView then
parent.columnElements [ " FAVORITES " ] . favoriteButton.backdrop : SetTexCoord ( 1 , 1 , 1 , 1 )
end
parent.highlight : Hide ( )
self : SetScript ( " OnUpdate " , nil )
parent.mouseEntered = false
-- Reset icon and name
local icon = parent.columnElements [ " ICON " ]
local name = parent.columnElements [ " NAME " ]
icon : SetFrameLevel ( self : GetFrameLevel ( ) + 1 )
local size , thickness , iconBorders
if parent.list . gridView then
size = S.Settings . Get ( " iconSizeGrid " )
thickness = S.Settings . Get ( " iconBorderThicknessGrid " )
iconBorders = S.Settings . Get ( " iconBordersGrid " )
else
size = S.Settings . Get ( " iconSize " )
thickness = S.Settings . Get ( " iconBorderThickness " )
iconBorders = S.Settings . Get ( " iconBorders " )
end
icon.icon : SetSize ( size , size )
icon.iconMask : SetSize ( size , size )
icon.iconBorder : SetShown ( S.Settings . Get ( " iconBorders " ) == 1 )
icon.iconBorder : SetSize ( size + thickness , size + thickness )
name.nameString : SetPoint ( " LEFT " , 2 , 0 )
if not parent.filtered then
icon.iconBorder : SetVertexColor ( parent.data . color1 : GetRGB ( ) )
name.nameString : SetTextColor ( parent.data . color1 : GetRGB ( ) )
end
end )
return self
end