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.

305 lines
8.7 KiB

--[[-
LibMoneyFrame
LibMoneyFrame is a small helper library to create view-only money frame as minimalistically as is currently possible.
Copyright (C) 2008, by the respecive below authors.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
@author Tem
@author Ken Allan <ken@norganna.org>
@libname LibMoneyFrame
@version 1.(see below)
--]]
local LIBNAME,VERSION_MAJOR,VERSION_MINOR = "LibMoneyFrame", 1, 320
-- Version should not be a SVN Revision, must be updated manually
-- A string unique to this version to prevent frame name conflicts.
local LIBSTRING = LIBNAME.."_"..VERSION_MAJOR.."_"..VERSION_MINOR
local lib = LibStub:NewLibrary(LIBNAME.."-"..VERSION_MAJOR, VERSION_MINOR)
if not lib then return end
LibStub("LibRevision"):Set("$URL$","$Rev$","5.12.DEV.", 'auctioneer', 'libs')
-- Call function to deactivate any outdated version of the library.
-- (calls the OLD version of this function, NOT the one defined in this
-- file's scope)
if lib.Deactivate then lib:Deactivate() end
local methods = {}
local numMoneys = 0
local function setColorBlindCoins(frame)
frame.copper.texture:Hide()
frame.silver.texture:Hide()
frame.gold.texture:Hide()
frame.gold.altText:Show()
frame.silver.altText:Show()
frame.copper.altText:Show()
end
local function setNormalCoins(frame)
frame.copper.texture:Show()
frame.silver.texture:Show()
frame.gold.texture:Show()
frame.gold.altText:Hide()
frame.silver.altText:Hide()
frame.copper.altText:Hide()
end
local function createCoin(frame, pos, width, height, parentFrame)
if not width then width = 200 end
if not height then height = 16 end
frame:SetWidth(width)
frame:SetHeight(height)
frame.label = frame:CreateFontString()
frame.label:SetFontObject(GameTooltipTextSmall)
local font = frame.label:GetFont()
frame.label:SetHeight(height)
frame.label:SetWidth(width-height) -- height * 1.8? This doesn't make sense.
frame.label:SetFont(font, height)
frame.label:SetPoint("TOPLEFT", frame, "TOPLEFT", 0,0)
frame.label:SetJustifyH("RIGHT")
frame.label:SetJustifyV("CENTER")
frame.label:Show()
frame.texture = frame:CreateTexture()
frame.texture:SetWidth(height)
frame.texture:SetHeight(height)
frame.texture:SetPoint("TOPLEFT", frame.label, "TOPRIGHT", 2,0)
frame.texture:SetPoint("BOTTOM", frame.label, "BOTTOM", 0,0)
frame.texture:SetTexture("Interface\\MoneyFrame\\UI-MoneyIcons")
frame.texture:SetTexCoord(pos,pos+0.25, 0,1)
-- alt coin text overlaps the icon
frame.altText = frame:CreateFontString()
frame.altText:SetFontObject(GameTooltipTextSmall)
frame.altText:SetWidth(height)
frame.altText:SetHeight(height)
frame.altText:SetFont(font, height)
frame.altText:SetPoint("TOPLEFT", frame.label, "TOPRIGHT", 2,0)
frame.altText:SetPoint("BOTTOM", frame.label, "BOTTOM", 0,0)
frame.altText:SetJustifyH("LEFT")
frame.altText:SetJustifyV("CENTER")
frame.altText:SetText(GOLD_AMOUNT_SYMBOL) -- so it has something to measure
if parentFrame.colorBlind then
frame.texture:Hide()
frame.altText:Show()
else
frame.texture:Show()
frame.altText:Hide()
end
end
-- onUpdate, needs a name change
local function refresh(self)
local colorBlindEnabled = GetCVar("colorblindMode") == "1"
if self.colorBlind ~= colorBlindEnabled then
self.colorBlind = colorBlindEnabled
if colorBlindEnabled then
setColorBlindCoins(self)
else
setNormalCoins(self)
end
end
local oldNeedsRefresh = self.needsRefresh
self.needsRefresh = false
if oldNeedsRefresh then
self:UpdateWidth()
end
end
function methods:UpdateWidth()
local curWidth = ceil(self:GetWidth())
local width = 0
if self.gold:IsShown() then
width = self.gold.label:GetStringWidth()
self.gold.label:SetWidth(width)
width = width + self.gold.texture:GetWidth() + 2 -- Add 2 for the uncounted right side buffer
self.gold:SetWidth(width)
end
if self.silver:IsShown() then
width = width + self.silver:GetWidth() -- self.silver already has a right side buffer
end
width = width + self.copper:GetWidth() + 2 -- Add 2 extra for a left side buffer
width = ceil(width)
if curWidth ~= width then self.needsRefresh = true end
self:RealSetWidth(width)
end
function methods:NeedsRefresh(flag)
if flag then
self.needsRefresh = true
end
end
function methods:SetValue(money, red,green,blue)
money = math.floor(tonumber(money) or 0)
local g = math.floor(money / 10000)
local s = math.floor(money % 10000 / 100)
local c = math.floor(money % 100)
if not (red and green and blue) then
red, green, blue = unpack(self.color)
end
local height = self.height
if g > 0 then
self.gold.label:SetWidth(strlen(tostring(g)) * height * 2) -- Guess at the size so it doesn't truncate the
-- string and return a bogus width when we try and get the string length.
self.gold.label:SetFormattedText("%d", g)
self.gold.label:SetTextColor(red,green,blue)
self.gold.altText:SetTextColor(red,green,blue)
self.gold:Show()
self.needsRefresh = true
else
self.gold:Hide()
end
if g + s > 0 then
if (g > 0) then
self.silver.label:SetFormattedText("%02d", s)
else
self.silver.label:SetFormattedText("%d", s)
end
self.silver.label:SetTextColor(red,green,blue)
self.silver.altText:SetTextColor(red,green,blue)
self.silver:Show()
else
self.silver:Hide()
end
if g + s > 0 then
self.copper.label:SetFormattedText("%02d", c)
else
self.copper.label:SetFormattedText("%d", c)
end
self.copper.label:SetTextColor(red,green,blue)
self.copper.altText:SetTextColor(red,green,blue)
self.copper:Show()
self:UpdateWidth()
self:Show()
end
function methods:SetColor(red, green, blue)
self.color = {red, green, blue}
self.copper.label:SetTextColor(red, green, blue)
self.silver.label:SetTextColor(red, green, blue)
self.gold.label:SetTextColor(red, green, blue)
self.copper.altText:SetTextColor(red,green,blue)
self.silver.altText:SetTextColor(red,green,blue)
self.gold.altText:SetTextColor(red,green,blue)
end
function methods:SetHeight()
end
function methods:SetWidth(width)
end
function methods:SetDrawLayer(layer)
self.gold.texture:SetDrawLayer(layer)
self.silver.texture:SetDrawLayer(layer)
self.copper.texture:SetDrawLayer(layer)
end
function lib:new(height, red, green, blue)
local n = numMoneys + 1
numMoneys = n
if not height then height = 10 end
if not (red and green and blue) then
red, green, blue = 0.9, 0.9, 0.9
end
local width = height*15
local name = LIBSTRING.."MoneyView"..n
local o = CreateFrame("Frame",name)
o:UnregisterAllEvents()
o:SetWidth(width)
o:SetHeight(height)
o.colorBlind = GetCVar("colorblindMode") == "1"
o.width = width
o.height = height
o.copper = CreateFrame("Frame", name.."Copper", o)
o.copper:SetPoint("TOPRIGHT", o, "TOPRIGHT", 0,0)
createCoin(o.copper, 0.5, height*2.8,height, o)
o.silver = CreateFrame("Frame", name.."Silver", o)
o.silver:SetPoint("TOPRIGHT", o.copper, "TOPLEFT", 0,0)
createCoin(o.silver, 0.25, height*2.8,height, o)
o.gold = CreateFrame("Frame", name.."Gold", o)
o.gold:SetPoint("TOPRIGHT", o.silver, "TOPLEFT", 0,0)
createCoin(o.gold, 0, width-(height*2.8),height, o)
o.gold.altText:SetText(GOLD_AMOUNT_SYMBOL)
o.silver.altText:SetText(SILVER_AMOUNT_SYMBOL)
o.copper.altText:SetText(COPPER_AMOUNT_SYMBOL)
-- Debugging code to see the extents:
-- o.texture = o:CreateTexture()
-- o.texture:SetTexture(0,1,0,1)
-- o.texture:SetPoint("TOPLEFT")
-- o.texture:SetPoint("BOTTOMRIGHT")
-- o.texture:SetDrawLayer("BACKGROUND")
for method,func in pairs(methods) do
if o[method] then o["Real"..method] = o[method] end
o[method] = func
end
o.needsRefresh = true
o:SetScript("OnUpdate", refresh)
o:SetColor(red, green, blue)
o:Hide()
return o
end
--[[ INTERNAL USE ONLY
Deactivates this version of the library, rendering it inert.
Needed to run before an upgrade of the library takes place.
@since 1.0
]]
function lib:Deactivate()
end
--[[ INTERNAL USE ONLY
Activates this version of the library.
Configures this library for use by setting up its variables and reregistering any previously registered tooltips.
@since 1.0
]]
function lib:Activate()
end
lib:Activate()