Back to Home

ESO Lua File v101041

libraries/zo_timerbar/zo_timerbar.lua

[◄ back to folders ]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
ZO_TimerBar = ZO_InitializingObject:Subclass()
TIMER_BAR_COUNTS_UP = 1
TIMER_BAR_COUNTS_DOWN = 2
local TIMER_BAR_DEFAULT_FADE_DURATION = 0.25
local TIMER_BAR_DEFAULT_UPDATE_INTERVAL = 0.25
function ZO_TimerBar:Initialize(control)
    control:SetHidden(true)
    
    self.updateFunction = function(barControl, time)
        self:Update(time)
    end
    self.control = control
    self.status = control:GetNamedChild("Status")
    self.time = control:GetNamedChild("Time")
    self.running = false
    
    --defaults
    self.direction = TIMER_BAR_COUNTS_UP
    self.fades = false  
    
    self.timeFormatStyle = TIME_FORMAT_STYLE_COLONS
    self.timePrecision = TIME_FORMAT_PRECISION_SECONDS  
end
function ZO_TimerBar:SetLabel(text)
end
function ZO_TimerBar:SetDirection(direction)
    if self.direction ~= direction then
        self.direction = direction
        if self.running then
            self:Update(GetFrameTimeSeconds())
        end
    end
end
function ZO_TimerBar:SetTimeFormatParameters(timeFormatStyle, timePrecision)
    self.timeFormatStyle = timeFormatStyle
    self.timePrecision = timePrecision
end
function ZO_TimerBar:SetFades(fades, duration)
    if self.fades ~= fades then
        self.fades = fades
        if fades then
            if not self.animation then
                self.animation = ZO_AlphaAnimation:New(self.control)
                self.fadeDuration = duration or TIMER_BAR_DEFAULT_FADE_DURATION
            end
        else
            if self.animation then
                self.animation:Stop()
            end
        end
    end
end
function ZO_TimerBar:IsStarted()
    return self.running
end
function ZO_TimerBar:IsPaused()
    return self.paused
end
function ZO_TimerBar:GetTimeLeft()
    if self:IsStarted() then
        return zo_max(0, self.ends - GetFrameTimeSeconds())
    end
    return 0
end
function ZO_TimerBar:Start(starts, ends)
    if self.fades then
        self.animation:Stop()
    end
    local control = self.control
    control:SetHandler("OnUpdate", self.updateFunction)
    control:SetHidden(false)
    local status = self.status
    status:SetMinMax(0, ends - starts)
    self.starts = starts
    self.ends = ends
    self.running = true
    self.paused = false
    self.nextBarUpdate = 0
    self.nextLabelUpdate = 0
    self.pauseElapsed = 0
    --Find out how much time it takes for the bar to move one UI unit. This isn't anything super precise, it just gives a servicable estimate of how often we should update
    local width, _ = self.control:GetDimensions()
    if width > 0 then
        self.barUpdateInterval = (ends - starts) / width
    else
        self.barUpdateInterval = TIMER_BAR_DEFAULT_UPDATE_INTERVAL
    end
end
function ZO_TimerBar:SetPaused(paused)
    if paused ~= self.paused then
        self.paused = paused
        if paused then
            self.control:SetHandler("OnUpdate", nil)
            self.pauseTime = GetFrameTimeSeconds()
        else
            local frameTime = GetFrameTimeSeconds()
            local timeSpentInPause = frameTime - self.pauseTime
            self.pauseElapsed = self.pauseElapsed + timeSpentInPause
            self.ends = self.ends + timeSpentInPause
            self.pauseTime = nil
            self.nextBarUpdate = 0
            self.nextLabelUpdate = 0
            self.control:SetHandler("OnUpdate", self.updateFunction)
            self:Update(frameTime)
        end
    end
end
do
    local function FadeOutDone(control)
        control:SetAlpha(1)
        control:SetHidden(true)
    end
    function ZO_TimerBar:Stop()
        if not self:IsStarted() then
            return
        end
        local control = self.control     
        control:SetHandler("OnUpdate", nil)
        if self.fades then
            self.animation:FadeOut(0, self.fadeDuration, ZO_ALPHA_ANIMATION_OPTION_USE_CURRENT_ALPHA, FadeOutDone)
        else
            control:SetHidden(true)
        end
        self.running = false
        self.starts = nil
        self.ends = nil
        self.paused = nil
        self.pauseElapsed = nil
        self.pauseTime = nil
    end
end
function ZO_TimerBar:Update(time)
    if time > self.ends then
        self:Stop()
        return
    end
    local barReady = time > self.nextBarUpdate
    local labelReady = self.time and time > self.nextLabelUpdate
    if not (barReady or labelReady) then
        return
    end
    local timeString = ""
    local remainingUntilUpdate
    if self.direction == TIMER_BAR_COUNTS_UP then
        local totalElapsed = time - self.starts - self.pauseElapsed
        if barReady then
            self.status:SetValue(totalElapsed)
        end
        if labelReady then
            timeString, remainingUntilUpdate = ZO_FormatTime(totalElapsed, self.timeFormatStyle, self.timePrecision, TIME_FORMAT_DIRECTION_ASCENDING)
            self.time:SetText(timeString)
        end
    else
        local totalRemaining = self.ends - time
        if barReady then
            self.status:SetValue(totalRemaining)
        end
        if labelReady then
            timeString, remainingUntilUpdate = ZO_FormatTime(totalRemaining, self.timeFormatStyle, self.timePrecision, TIME_FORMAT_DIRECTION_DESCENDING)
            self.time:SetText(timeString)
        end
    end
    self.timeString = timeString
    if barReady then
        self.nextBarUpdate = time + self.barUpdateInterval
    end
    if labelReady then
        self.nextLabelUpdate = time + remainingUntilUpdate
    end
end
function ZO_TimerBar:GetNarrationText()
    if self.direction == TIMER_BAR_COUNTS_DOWN then
        return SCREEN_NARRATION_MANAGER:CreateNarratableObject(zo_strformat(SI_SCREEN_NARRATION_TIMER_BAR_DESCENDING_FORMATTER, self.timeString))
    else
        --TODO XAR: Do we want to use a special formatter for when the timer is counting up as well?
        return SCREEN_NARRATION_MANAGER:CreateNarratableObject(self.timeString)
    end
end