Back to Home

ESO Lua File v101044

libraries/zo_templates/gamepad/scrolltemplates_gamepad.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
    self.inScrollArea = nil
end
end
ZO_ScrollSharedInput_Gamepad = ZO_Object:Subclass() --class for sharing directional input between all scrolling controls
function ZO_ScrollSharedInput_Gamepad:New()
    local object = ZO_Object.New(self)
    object:Initialize()
    return object
end
function ZO_ScrollSharedInput_Gamepad:Initialize()
    self.scrollInput = 0
end
function ZO_ScrollSharedInput_Gamepad:Activate(control)
    DIRECTIONAL_INPUT:Activate(self, control)
    self.consumed = false
end
function ZO_ScrollSharedInput_Gamepad:Deactivate()
   DIRECTIONAL_INPUT:Deactivate(self)
end
function ZO_ScrollSharedInput_Gamepad:Consume()
    self.consumed = true
end
function ZO_ScrollSharedInput_Gamepad:UpdateDirectionalInput()
    if DIRECTIONAL_INPUT:IsAvailable(ZO_DI_RIGHT_STICK) then
        self.scrollInput = DIRECTIONAL_INPUT:GetY(ZO_DI_RIGHT_STICK)
        self.consumed = false
    end
end
function ZO_ScrollSharedInput_Gamepad:GetY()
    local scrollInput = self.scrollInput
    if self.consumed then
        self.scrollInput = 0
    end
    return scrollInput
end
ZO_SCROLL_SHARED_INPUT = ZO_ScrollSharedInput_Gamepad:New()
-- Scroll Panel
ZO_ScrollContainer_Gamepad = {} -- A wrapper for ZO_ScrollContainer_Gamepad
    zo_mixin(control, ZO_ScrollContainer_Gamepad)
    control:Initialize()
end
do
    local SLIDER_MIN_VALUE = 0
    function ZO_ScrollContainer_Gamepad:Initialize()
        self:SetHandler("OnEffectivelyShown", function() self:OnEffectivelyShown() end)
        self:SetHandler("OnEffectivelyHidden", function() self:OnEffectivelyHidden() end)
        self.scroll:SetHandler("OnScrollExtentsChanged", function(...) self:OnScrollExtentsChanged(...) end)
        self:EnableUpdateHandler()
        self.scrollIndicator = self:GetNamedChild("ScrollIndicator")
        self.scrollKeyUp = self:GetNamedChild("ScrollKeyUp")
        self.scrollKeyDown = self:GetNamedChild("ScrollKeyDown")
        self.scrollInput = 0
        self.animation, self.timeline = ZO_CreateScrollAnimation(self)
        self.scrollValue = SLIDER_MIN_VALUE
        self.directionalInputActivated = false
        self.scrollIndicatorEnabled = true
        local function OnInputChanged()
            if IsInGamepadPreferredMode() then
                self:UpdateScrollIndicator()
            end
        end
        local SHOW_UNBOUND = true
        local DEFAULT_GAMEPAD_ACTION_NAME = nil
        ZO_Keybindings_RegisterLabelForBindingUpdate(self.scrollKeyUp, "UI_SHORTCUT_RIGHT_STICK_UP", SHOW_UNBOUND, DEFAULT_GAMEPAD_ACTION_NAME, OnInputChanged)
        ZO_Keybindings_RegisterLabelForBindingUpdate(self.scrollKeyDown, "UI_SHORTCUT_RIGHT_STICK_DOWN")
        -- We only need to register one of the above with OnInputChanged because one call of that function does everything we need
        ZO_UpdateScrollFade(self.useFadeGradient, self.scroll, ZO_SCROLL_DIRECTION_VERTICAL)
    end
    function ZO_ScrollContainer_Gamepad:ResetToTop()
        self.scrollValue = SLIDER_MIN_VALUE
        ZO_ScrollAnimation_MoveWindow(self, self.scrollValue)
        ZO_UpdateScrollFade(self.useFadeGradient, self.scroll, ZO_SCROLL_DIRECTION_VERTICAL, ZO_GetScrollMaxFadeGradientSize(self))
    end
end
function ZO_ScrollContainer_Gamepad:SetScrollIndicatorEnabled(enabled)
    self.scrollIndicatorEnabled = enabled
end
function ZO_ScrollContainer_Gamepad:UpdateScrollIndicator()
    if self.scrollIndicator then
        local _, verticalExtents = self.scroll:GetScrollExtents()
        local shouldShowGamepadKeybinds = ZO_Keybindings_ShouldShowGamepadKeybind()
        local hideGamepad = not (self.scrollIndicatorEnabled and verticalExtents ~= 0 and shouldShowGamepadKeybinds)
        local hideKeyboard = not (self.scrollIndicatorEnabled and verticalExtents ~= 0 and not shouldShowGamepadKeybinds)
        self.scrollIndicator:SetHidden(hideGamepad)
        self.scrollKeyUp:SetHidden(hideKeyboard)
        self.scrollKeyDown:SetHidden(hideKeyboard)
    end
end
function ZO_ScrollContainer_Gamepad:EnableUpdateHandler()
    self:SetHandler("OnUpdate", function() self:OnUpdate() end)
end
function ZO_ScrollContainer_Gamepad:DisableUpdateHandler()
    self:SetHandler("OnUpdate", nil)
end
function ZO_ScrollContainer_Gamepad:SetDisabled(disabled)
    self.disabled = disabled
end
function ZO_ScrollContainer_Gamepad:RefreshDirectionalInputActivation()
    local _, verticalExtents = self.scroll:GetScrollExtents()
    local canScroll = verticalExtents > 0
    if not self.disabled and not self:IsHidden() and canScroll then
        if not self.directionalInputActivated then
            self.directionalInputActivated = true
            ZO_SCROLL_SHARED_INPUT:Activate(self, self)
        end
    else
        if self.directionalInputActivated then
            self.directionalInputActivated = false
            ZO_SCROLL_SHARED_INPUT:Deactivate(self)
        end
    end
end
function ZO_ScrollContainer_Gamepad:OnEffectivelyShown()
    self:ResetToTop()
end
function ZO_ScrollContainer_Gamepad:OnEffectivelyHidden()
end
function ZO_ScrollContainer_Gamepad:OnScrollExtentsChanged(control, horizontalExtents, verticalExtents)
    ZO_UpdateScrollFade(self.useFadeGradient, self.scroll, ZO_SCROLL_DIRECTION_VERTICAL)
end
do
    local INPUT_VERTICAL_DELTA_MULTIPLIER = 10
    function ZO_ScrollContainer_Gamepad:OnUpdate()
        local scrollInput = ZO_SCROLL_SHARED_INPUT:GetY()
        if scrollInput ~= 0 then
            ZO_ScrollRelative(self, -scrollInput * INPUT_VERTICAL_DELTA_MULTIPLIER)
            if self.onInteractWithScrollbarCallback then
                self.onInteractWithScrollbarCallback()
            end
        end
    end
end
function ZO_Scroll_Gamepad_SetScrollIndicatorSide(scrollIndicator, background, anchorSide, customOffsetX, customOffsetY, anchorsToBackground)
    scrollIndicator:ClearAnchors()
    local anchorRelativePos = anchorsToBackground and RIGHT or TOPRIGHT
    local offsetY = customOffsetY or 0
    local offsetX = customOffsetX or -ZO_GAMEPAD_PANEL_BG_VERTICAL_DIVIDER_HALF_WIDTH
    if anchorSide == LEFT then
        anchorRelativePos = anchorsToBackground and LEFT or TOPLEFT
        offsetX = customOffsetX or ZO_GAMEPAD_PANEL_BG_VERTICAL_DIVIDER_HALF_WIDTH
    end
    -- Tooltip templates and generic dialogs use "Bg" as child background name while shared quadrant templates use "NestedBg"
    local bgControl = background:GetNamedChild("NestedBg")
    if not bgControl then
        bgControl = background:GetNamedChild("Bg")
    end
    if bgControl then
        local anchorControl = anchorsToBackground and bgControl or bgControl:GetNamedChild("BackgroundAtScreenCenterHeight")
        scrollIndicator:SetAnchor(CENTER, anchorControl, anchorRelativePos, offsetX, offsetY)
    end
end