Back to Home

ESO Lua File v101050

ingame/map/gamepad/worldmapkey_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
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
GAMEPAD_WORLD_MAP_KEY_COLUMN_WIDTH = 420
local SYMBOL_PARAMS =
{
    TARGET_SYMBOLS_PER_COLUMN = 6,
    MAX_SYMBOLS_PER_COLUMN = 7,
    TARGET_SECTIONS_PER_COLUMN = 2,
    SYMBOL_OFFSET_Y = 25,
    HEADER_OFFSET_X = 69,
    HEADER_OFFSET_Y = 70,
}
local WorldMapKey_Gamepad = ZO_WorldMapKey_Shared:Subclass()
local NUM_COLUMNS = 4
function WorldMapKey_Gamepad:Initialize(control)
    ZO_WorldMapKey_Shared.Initialize(self, control)
    self.symbolParams = SYMBOL_PARAMS
    local mainControl = control:GetNamedChild("Main")
    self.mainControl = mainControl
    self.scrollControl = mainControl:GetNamedChild("Scroll")
    self.scrollChildControl = mainControl:GetNamedChild("ScrollChild")
    self.scrollIndicator = mainControl:GetNamedChild("ScrollIndicator")
    self.columns = {}
    local anchorTo = self.scrollChildControl
    local relativePoint1, relativePoint2 = TOPLEFT, BOTTOMLEFT
    for i = 1, NUM_COLUMNS do
        local newColumn = CreateControlFromVirtual("$(parent)Container", self.scrollChildControl, "ZO_WorldMapKeySymbolContainer_Gamepad", i)
        newColumn:SetAnchor(TOPLEFT, anchorTo, relativePoint1)
        newColumn:SetAnchor(BOTTOMLEFT, anchorTo, relativePoint2)
        table.insert(self.columns, newColumn)
        anchorTo = newColumn
        relativePoint1, relativePoint2 = TOPRIGHT, BOTTOMRIGHT
    end
    self.noKeyLabel = mainControl:GetNamedChild("NoKey")
    local function Reset(control)
        control:SetParent(self.mainControl)
    end
    self.symbolPool = ZO_ControlPool:New("ZO_WorldMapKeySymbol_Gamepad", mainControl, "Symbol")
    self.headerPool = ZO_ControlPool:New("ZO_GamepadMenuEntryHeaderTemplate", mainControl, "Header")
    self.symbolPool:SetCustomResetBehavior(Reset)
    self.headerPool:SetCustomResetBehavior(Reset)
    GAMEPAD_WORLD_MAP_KEY_FRAGMENT = ZO_FadeSceneFragment:New(control)
    GAMEPAD_WORLD_MAP_KEY_FRAGMENT:RegisterCallback("StateChange",  function(oldState, newState)
        if newState == SCENE_SHOWING then
            self.inputEnabled = true
            ZO_WorldMap_SetGamepadKeybindsShown(false)
            self:RefreshKey()
            self.m_keybindState = KEYBIND_STRIP:PushKeybindGroupState()
            KEYBIND_STRIP:AddKeybindButtonGroup(self.keybindStripDescriptor, self.m_keybindState)
        elseif newState == SCENE_HIDING then
            KEYBIND_STRIP:RemoveKeybindButtonGroup(self.keybindStripDescriptor, self.m_keybindState)
            KEYBIND_STRIP:PopKeybindGroupState()
            ZO_WorldMap_SetGamepadKeybindsShown(true)
            self.inputEnabled = false
            self:RefreshDirectionalInputActivation()
        end
    end)
    self.fragment = GAMEPAD_WORLD_MAP_KEY_FRAGMENT
    self.scrollTargetPos = 0
end
local function ExitMapKey()
    SCENE_MANAGER:RemoveFragment(GAMEPAD_WORLD_MAP_KEY_FRAGMENT)
end
function WorldMapKey_Gamepad:InitializeKeybindStripDescriptor()
    self.keybindStripDescriptor =
    {
        alignment = KEYBIND_STRIP_ALIGN_LEFT,
        {
            name = GetString(SI_GAMEPAD_WORLD_MAP_LEGEND_CLOSE_KEYBIND),
            keybind = "UI_SHORTCUT_NEGATIVE",
            callback = function() ExitMapKey() end,
            sound = SOUNDS.GAMEPAD_MENU_BACK,
        },
        {
            --Ethereal binds show no text, the name field is used to help identify the keybind when debugging. This text does not have to be localized.
            name = "Gamepad World Map Exit Key",
            ethereal = true,
            keybind = "UI_SHORTCUT_LEFT_STICK",
            callback = function() ExitMapKey() end,
            sound = SOUNDS.GAMEPAD_MENU_BACK,
        },
    }
end
function WorldMapKey_Gamepad:RefreshKey()
    if not self.fragment:IsShowing() then
        return
    end
    if self.dirty then
        self.dirty = false
        self.symbolPool:ReleaseAllObjects()
        self.headerPool:ReleaseAllObjects()
        local numKeySections = GetNumMapKeySections()
        self.noKeyLabel:SetHidden(numKeySections > 0)
        self.symbols = {}
        local params = self.symbolParams
        local numSymbolsInColumn = 0
        local columnIndex = 1
        local column = self.columns[columnIndex]
        local previousAnchor = column
        local headerRelativePoint = TOPLEFT
        local allFilledOnce = false
        local numSectionsPerColumn = {}
        local totalNumSymbols = 0
        local numSymbolsBySection = {}
        for sectionIndex = 1, numKeySections do
            numSymbolsBySection[sectionIndex] = GetNumMapKeySectionSymbols(sectionIndex)
            totalNumSymbols = totalNumSymbols + numSymbolsBySection[sectionIndex]
        end
        local averageSymbolsPerColumn = totalNumSymbols / NUM_COLUMNS
        for sectionIndex = 1, numKeySections do
            local newNumSymbolsInColumn = numSymbolsInColumn + numSymbolsBySection[sectionIndex]
            local moveToNextColumn = newNumSymbolsInColumn > averageSymbolsPerColumn
            if moveToNextColumn then
                if columnIndex == NUM_COLUMNS or allFilledOnce then
                    -- If all columns have symbols, add to the shortest column
                    columnIndex = 1
                    local minSymbols = #self.symbols[columnIndex] + numSectionsPerColumn[columnIndex]
                    for i = 2, NUM_COLUMNS do
                        local columnSymbols = #self.symbols[i] + numSectionsPerColumn[i]
                        if columnSymbols < minSymbols then
                            minSymbols = columnSymbols
                            columnIndex = i
                        end
                    end
                    column = self.columns[columnIndex]
                    local symbolsInColumn = self.symbols[columnIndex]
                    numSymbolsInColumn = #symbolsInColumn
                    previousAnchor = symbolsInColumn[numSymbolsInColumn]
                    allFilledOnce = true
                else
                    columnIndex = columnIndex + 1
                    column = self.columns[columnIndex]
                    previousAnchor = column
                    headerRelativePoint = TOPLEFT
                    numSymbolsInColumn = 0
                end
            end
            if numSectionsPerColumn[columnIndex] == nil then
                numSectionsPerColumn[columnIndex] = 1
            else
                numSectionsPerColumn[columnIndex] = numSectionsPerColumn[columnIndex] + 1
            end
            local sectionName = GetMapKeySectionName(sectionIndex)
            local header = self.headerPool:AcquireObject()
            header:SetText(sectionName)
            header:SetParent(column)
            header:ClearAnchors()
            header:SetAnchor(LEFT, column, LEFT)
            header:SetAnchor(TOPLEFT, previousAnchor, headerRelativePoint, params.HEADER_OFFSET_X, params.HEADER_OFFSET_Y)
            headerRelativePoint = BOTTOMLEFT
            local offsetX = -params.HEADER_OFFSET_X
            previousAnchor = header
            for symbolIndex = 1, numSymbolsBySection[sectionIndex] do
                numSymbolsInColumn = numSymbolsInColumn + 1
                local symbol = self.symbolPool:AcquireObject()
                local name, icon, tooltip = GetMapKeySectionSymbolInfo(sectionIndex, symbolIndex)
                symbol:GetNamedChild("Symbol"):SetTexture(icon)
                symbol:GetNamedChild("Name"):SetText(name)
                symbol.tooltip = tooltip
                symbol:SetParent(column)
                symbol:SetAnchor(TOPLEFT, previousAnchor, BOTTOMLEFT, offsetX, params.SYMBOL_OFFSET_Y)
                offsetX = 0
                if self.symbols[columnIndex] == nil then
                    self.symbols[columnIndex] = {}
                end
                table.insert(self.symbols[columnIndex], symbol)
                previousAnchor = symbol
            end
        end
        local ANCHORS_TO_BACKGROUND = true
    end
end
function WorldMapKey_Gamepad:RefreshDirectionalInputActivation()
    local _, verticalExtents = self.scrollControl:GetScrollExtents()
    local canScroll = verticalExtents > 0 and self.inputEnabled
    if self.fragment:IsShowing() and canScroll then
        if not self.directionalInputActivated then
            self.directionalInputActivated = true
            ZO_SCROLL_SHARED_INPUT:Activate(self.mainControl)
        end
        self.scrollIndicator:SetHidden(false)
    else
        if self.directionalInputActivated then
            self.directionalInputActivated = false
            ZO_SCROLL_SHARED_INPUT:Deactivate()
        end
        self.scrollIndicator:SetHidden(true)
    end
end
--Global XML
    GAMEPAD_WORLD_MAP_KEY = WorldMapKey_Gamepad:New(self)
end