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