TradeSkillMaster/Core/UI/Elements/ProgressBar.lua

169 lines
6.9 KiB
Lua

-- ------------------------------------------------------------------------------ --
-- TradeSkillMaster --
-- https://tradeskillmaster.com --
-- All Rights Reserved - Detailed license information included with addon. --
-- ------------------------------------------------------------------------------ --
--- ProgressBar UI Element Class.
-- The progress bar element is a left-to-right progress bar with an anaimated progress indicator and text. It is a
-- subclass of the @{Text} class.
-- @classmod ProgressBar
local _, TSM = ...
local Theme = TSM.Include("Util.Theme")
local UIElements = TSM.Include("UI.UIElements")
local ProgressBar = TSM.Include("LibTSMClass").DefineClass("ProgressBar", TSM.UI.Text)
UIElements.Register(ProgressBar)
TSM.UI.ProgressBar = ProgressBar
local PROGRESS_PADDING = 2
local PROGRESS_ICON_PADDING = 4
-- ============================================================================
-- Public Class Methods
-- ============================================================================
function ProgressBar.__init(self)
local frame = UIElements.CreateFrame(self, "Frame")
self.__super:__init(frame)
self._bgLeft = frame:CreateTexture(nil, "BACKGROUND")
self._bgLeft:SetPoint("TOPLEFT")
self._bgLeft:SetPoint("BOTTOMLEFT")
TSM.UI.TexturePacks.SetTextureAndWidth(self._bgLeft, "uiFrames.LoadingBarLeft")
self._bgRight = frame:CreateTexture(nil, "BACKGROUND")
self._bgRight:SetPoint("TOPRIGHT")
self._bgRight:SetPoint("BOTTOMRIGHT")
TSM.UI.TexturePacks.SetTextureAndWidth(self._bgRight, "uiFrames.LoadingBarRight")
self._bgMiddle = frame:CreateTexture(nil, "BACKGROUND")
self._bgMiddle:SetPoint("TOPLEFT", self._bgLeft, "TOPRIGHT")
self._bgMiddle:SetPoint("BOTTOMRIGHT", self._bgRight, "BOTTOMLEFT")
TSM.UI.TexturePacks.SetTexture(self._bgMiddle, "uiFrames.LoadingBarMiddle")
-- create the progress textures
self._progressLeft = frame:CreateTexture(nil, "ARTWORK")
self._progressLeft:SetPoint("TOPLEFT", PROGRESS_PADDING, -PROGRESS_PADDING)
self._progressLeft:SetPoint("BOTTOMLEFT", PROGRESS_PADDING, PROGRESS_PADDING)
self._progressLeft:SetBlendMode("BLEND")
TSM.UI.TexturePacks.SetTexture(self._progressLeft, "uiFrames.LoadingBarLeft")
self._progressMiddle = frame:CreateTexture(nil, "ARTWORK")
self._progressMiddle:SetPoint("TOPLEFT", self._progressLeft, "TOPRIGHT")
self._progressMiddle:SetPoint("BOTTOMLEFT", self._progressLeft, "BOTTOMRIGHT")
self._progressMiddle:SetBlendMode("BLEND")
TSM.UI.TexturePacks.SetTexture(self._progressMiddle, "uiFrames.LoadingBarMiddle")
self._progressRight = frame:CreateTexture(nil, "ARTWORK")
self._progressRight:SetPoint("TOPLEFT", self._progressMiddle, "TOPRIGHT")
self._progressRight:SetPoint("BOTTOMLEFT", self._progressMiddle, "BOTTOMRIGHT")
self._progressRight:SetBlendMode("BLEND")
TSM.UI.TexturePacks.SetTexture(self._progressRight, "uiFrames.LoadingBarRight")
-- create the progress icon
frame.progressIcon = frame:CreateTexture(nil, "OVERLAY")
frame.progressIcon:SetPoint("RIGHT", frame.text, "LEFT", -PROGRESS_ICON_PADDING, 0)
frame.progressIcon:Hide()
frame.progressIcon.ag = frame.progressIcon:CreateAnimationGroup()
local spin = frame.progressIcon.ag:CreateAnimation("Rotation")
spin:SetDuration(2)
spin:SetDegrees(360)
frame.progressIcon.ag:SetLooping("REPEAT")
self._progress = 0
self._progressIconHidden = false
self._justifyH = "CENTER"
self._font = "BODY_BODY2_MEDIUM"
self._textColor = "INDICATOR"
end
function ProgressBar.Release(self)
self._progress = 0
self._progressIconHidden = false
self:_GetBaseFrame().progressIcon.ag:Stop()
self:_GetBaseFrame().progressIcon:Hide()
self.__super:Release()
self._justifyH = "CENTER"
self._font = "BODY_BODY2_MEDIUM"
self._textColor = "INDICATOR"
end
--- Sets the progress.
-- @tparam ProgressBar self The progress bar object
-- @tparam number progress The progress from a value of 0 to 1 (inclusive)
-- @tparam boolean isDone Whether or not the progress is finished
-- @treturn ProgressBar The progress bar object
function ProgressBar.SetProgress(self, progress, isDone)
self._progress = progress
return self
end
--- Sets whether or not the progress indicator is hidden.
-- @tparam ProgressBar self The progress bar object
-- @tparam boolean hidden Whether or not the progress indicator is hidden
-- @treturn ProgressBar The progress bar object
function ProgressBar.SetProgressIconHidden(self, hidden)
self._progressIconHidden = hidden
return self
end
function ProgressBar.Draw(self)
self.__super:Draw()
local frame = self:_GetBaseFrame()
self._bgLeft:SetVertexColor(Theme.GetColor("PRIMARY_BG"):GetFractionalRGBA())
self._bgMiddle:SetVertexColor(Theme.GetColor("PRIMARY_BG"):GetFractionalRGBA())
self._bgRight:SetVertexColor(Theme.GetColor("PRIMARY_BG"):GetFractionalRGBA())
local text = frame.text
text:ClearAllPoints()
text:SetWidth(self:_GetDimension("WIDTH"))
text:SetWidth(frame.text:GetStringWidth())
text:SetHeight(self:_GetDimension("HEIGHT"))
text:SetPoint("CENTER", self._progressIconHidden and 0 or ((TSM.UI.TexturePacks.GetWidth("iconPack.18x18/Running") + PROGRESS_ICON_PADDING) / 2), 0)
TSM.UI.TexturePacks.SetTextureAndSize(frame.progressIcon, "iconPack.18x18/Running")
frame.progressIcon:SetVertexColor(self:_GetTextColor():GetFractionalRGBA())
if self._progressIconHidden and frame.progressIcon:IsVisible() then
frame.progressIcon.ag:Stop()
frame.progressIcon:Hide()
elseif not self._progressIconHidden and not frame.progressIcon:IsVisible() then
frame.progressIcon:Show()
frame.progressIcon.ag:Play()
end
if self._progress == 0 then
self._progressLeft:Hide()
self._progressMiddle:Hide()
self._progressRight:Hide()
else
self._progressLeft:Show()
self._progressMiddle:Show()
self._progressRight:Show()
self._progressLeft:SetVertexColor(Theme.GetColor("ACTIVE_BG"):GetFractionalRGBA())
self._progressMiddle:SetVertexColor(Theme.GetColor("ACTIVE_BG"):GetFractionalRGBA())
self._progressRight:SetVertexColor(Theme.GetColor("ACTIVE_BG"):GetFractionalRGBA())
local leftTextureWidth = TSM.UI.TexturePacks.GetWidth("uiFrames.LoadingBarLeft")
local rightTextureWidth = TSM.UI.TexturePacks.GetWidth("uiFrames.LoadingBarRight")
local maxProgressWidth = self:_GetDimension("WIDTH") - PROGRESS_PADDING * 2
local progressWidth = maxProgressWidth * self._progress
if progressWidth <= leftTextureWidth then
self._progressLeft:SetWidth(progressWidth)
self._progressMiddle:Hide()
self._progressRight:Hide()
elseif progressWidth < maxProgressWidth - rightTextureWidth then
self._progressLeft:SetWidth(leftTextureWidth)
self._progressMiddle:SetWidth(progressWidth - leftTextureWidth)
self._progressRight:Hide()
else
self._progressLeft:SetWidth(leftTextureWidth)
self._progressMiddle:SetWidth(progressWidth - leftTextureWidth - rightTextureWidth)
self._progressRight:SetWidth(rightTextureWidth)
end
end
end