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.
191 lines
6.4 KiB
191 lines
6.4 KiB
|
|
local _,L = ...
|
|
local rematch = Rematch
|
|
local tooltip = RematchTooltip
|
|
|
|
function rematch:ShowTooltip(title,body,anchorPoint,relativeTo,relativePoint,xoff,yoff)
|
|
if rematch:UIJustChanged() or (RematchSettings.HideTooltips) then -- (this had 'and not anchorPoint' too; which makes target menu tooltips persists but also journal option tooltips)
|
|
return -- don't show tooltip if ui just changed or HideTooltips enabled (with no given anchor)
|
|
end
|
|
if not title then -- grab tooltip from calling widget if one isn't passed
|
|
title = self.tooltipTitle
|
|
body = self.tooltipBody
|
|
end
|
|
|
|
if not title then return end -- leave if no tooltip to show
|
|
|
|
tooltip.Title:SetText(title)
|
|
tooltip.Body:SetText(body)
|
|
|
|
-- adjust width based on width of title and bofy
|
|
local titleWidth = min(tooltip.Title:GetStringWidth(),200)
|
|
local width
|
|
if not body then
|
|
width = titleWidth -- for tooltips with just a title, make width the title width
|
|
else
|
|
width = max(titleWidth,200) -- for tooltips with a body make width the max of title or 180
|
|
-- but both title and body width are less than 180, shrink to max width of title and body
|
|
local bodyWidth=tooltip.Body:GetStringWidth()
|
|
if width>titleWidth and width>bodyWidth then
|
|
width = max(titleWidth,bodyWidth)
|
|
end
|
|
end
|
|
|
|
tooltip.Title:SetSize(width,0)
|
|
tooltip.Body:SetSize(width,0)
|
|
|
|
-- now adjust actual width to the wider width of the wrapped title and body
|
|
width = max(tooltip.Title:GetWrappedWidth(),tooltip.Body:GetWrappedWidth())
|
|
|
|
tooltip:SetSize(width+16,tooltip.Title:GetStringHeight() + (body and tooltip.Body:GetStringHeight()+2 or 0) + 16)
|
|
|
|
if anchorPoint=="cursor" then
|
|
tooltip:SetScript("OnUpdate",tooltip.OnUpdate)
|
|
elseif not anchorPoint or anchorPoint==true then
|
|
rematch:SmartAnchor(tooltip,self)
|
|
else
|
|
tooltip:ClearAllPoints()
|
|
tooltip:SetPoint(anchorPoint,relativeTo,relativePoint,xoff,yoff)
|
|
end
|
|
|
|
tooltip:Show()
|
|
end
|
|
|
|
function tooltip:OnUpdate(elapsed)
|
|
local x,y = GetCursorPosition()
|
|
local scale = UIParent:GetEffectiveScale()
|
|
x = x/scale
|
|
y = y/scale
|
|
self:ClearAllPoints()
|
|
if x>UIParent:GetWidth()/2 then -- right half of screen
|
|
self:SetPoint("BOTTOMRIGHT",UIParent,"BOTTOMLEFT",x-2,y+2)
|
|
else -- left half of screen
|
|
self:SetPoint("BOTTOMLEFT",UIParent,"BOTTOMLEFT",x+2,y+2)
|
|
end
|
|
end
|
|
|
|
function rematch:HideTooltip()
|
|
tooltip:Hide()
|
|
tooltip:SetScript("OnUpdate",nil)
|
|
RematchTableTooltip:Hide()
|
|
end
|
|
|
|
-- A TableTooltip is a tooltip designed for formatted text that doesn't wrap,
|
|
-- especially for displaying data in columns or in-line textures that want
|
|
-- vertically-centered fontstrings. Use RematchTooltip for traditional tooltips
|
|
-- with wrapping lines of text.
|
|
-- data is an ordered table with each entry as a line; a line can be either a
|
|
-- string or a sub-table that will display in separate columns:
|
|
-- ex: {"This is the title", {"Wins:",wins}, {"Losses:",losses} }
|
|
-- layout is an optional unordered table to define extra details
|
|
-- ex: {height=16, justifyH={"LEFT","RIGHT"},colors={nil,{1,1,1}}}
|
|
function rematch:ShowTableTooltip(anchorTo,data,layout)
|
|
local tooltip = RematchTableTooltip
|
|
|
|
-- if nothing passed then leave
|
|
if not anchorTo or not data then
|
|
return
|
|
end
|
|
|
|
local height = layout and layout.height or 16 -- each row is 16 height unless layout says otherwise
|
|
tooltip.Rows = tooltip.Rows or {}
|
|
|
|
-- wipe old tooltip
|
|
for _,row in ipairs(tooltip.Rows) do
|
|
for _,column in ipairs(row.Columns) do
|
|
column:SetText("")
|
|
column:SetWidth(0)
|
|
column:Hide()
|
|
end
|
|
row:Hide()
|
|
end
|
|
|
|
local maxColumns = 1 -- maximum number of columns in a row
|
|
for i=1,#data do
|
|
-- each row is just a frame to contain the columns which are fontstrings
|
|
local row = tooltip.Rows[i]
|
|
if not row then
|
|
row = CreateFrame("Frame",nil,tooltip)
|
|
if i==1 then -- first row is positioned to the topleft of the tooltip
|
|
row:SetPoint("TOPLEFT",8,-8)
|
|
else -- further rows are anchored to the previous
|
|
row:SetPoint("TOPLEFT",tooltip.Rows[i-1],"BOTTOMLEFT")
|
|
end
|
|
row.Columns = {}
|
|
tooltip.Rows[i] = row
|
|
end
|
|
-- some rows have one column, some have multiple
|
|
local numColumns = type(data[i])=="table" and #data[i] or 1
|
|
for j=1,numColumns do
|
|
local column = row.Columns[j]
|
|
if not column then
|
|
column = row:CreateFontString(nil,"ARTWORK","GameFontNormal")
|
|
if j==1 then -- first colum anchors to the left of its parent row
|
|
column:SetPoint("LEFT")
|
|
else -- rest of coumns anchor to the previous column
|
|
column:SetPoint("LEFT",row.Columns[j-1],"RIGHT",6,0)
|
|
end
|
|
row.Columns[j] = column
|
|
end
|
|
column:SetHeight(height)
|
|
column:SetText((numColumns>1 and data[i][j] or data[i]) or "")
|
|
column:SetJustifyH((layout and layout.justifyH) and layout.justifyH[j] or "LEFT")
|
|
-- if colors layout used for this column, use it
|
|
if layout and layout.colors and layout.colors[j] then
|
|
column:SetTextColor(layout.colors[j][1],layout.colors[j][2],layout.colors[j][3])
|
|
elseif i==1 then -- otherwise if firts row, make text white
|
|
column:SetTextColor(1,1,1)
|
|
else -- otherwise gold normal color
|
|
column:SetTextColor(1,.82,0)
|
|
end
|
|
column:Show()
|
|
end
|
|
maxColumns = max(numColumns,maxColumns)
|
|
row.numColumns = numColumns
|
|
row:SetHeight(height)
|
|
row:SetWidth(100)
|
|
row:Show()
|
|
end
|
|
|
|
-- resize columns for multi-column rows
|
|
for j=1,maxColumns do
|
|
local maxWidth = 0
|
|
-- first pass, figure out the max width of a column among all rows
|
|
for i=1,#data do
|
|
local numColumns = tooltip.Rows[i].numColumns
|
|
if j<=numColumns and numColumns>1 then -- only dealing with multi-column rows here
|
|
maxWidth = max(maxWidth,tooltip.Rows[i].Columns[j]:GetStringWidth())
|
|
end
|
|
end
|
|
-- second pass, set width of a colum in each row to the maxWidth
|
|
for i=1,#data do
|
|
local numColumns = tooltip.Rows[i].numColumns
|
|
if j<=numColumns and numColumns>1 then
|
|
tooltip.Rows[i].Columns[j]:SetWidth(maxWidth)
|
|
end
|
|
end
|
|
end
|
|
|
|
-- now find the max width for the whole tooltip
|
|
local maxWidth = 0
|
|
for i=1,#data do
|
|
local numColumns = tooltip.Rows[i].numColumns
|
|
local width = 0
|
|
for j=1,numColumns do
|
|
if numColumns==1 then
|
|
width = width + tooltip.Rows[i].Columns[1]:GetStringWidth()
|
|
else
|
|
width = width + tooltip.Rows[i].Columns[j]:GetWidth()
|
|
end
|
|
if j>1 then
|
|
width = width + 6
|
|
end
|
|
end
|
|
maxWidth = max(maxWidth,width)
|
|
end
|
|
|
|
tooltip:SetSize(maxWidth+18,#data*height+16)
|
|
|
|
tooltip:Show()
|
|
rematch:SmartAnchor(tooltip,anchorTo)
|
|
end
|
|
|