--[[- 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 @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()