Back to Home

ESO Lua File v100032

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
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()
function WorldMapKey_Gamepad:New(...)
    local object = ZO_WorldMapKey_Shared.New(self, ...)
    return object
end
local NUM_COLUMNS = 4
function WorldMapKey_Gamepad:Initialize(control)
    ZO_GamepadGrid.Initialize(self, control)
    ZO_WorldMapKey_Shared.Initialize(self, control)
    self.symbolParams = SYMBOL_PARAMS
    local mainControl = control:GetNamedChild("Main")
    self.columns = {}
    local anchorTo = mainControl
    local relativePoint1, relativePoint2 = TOPLEFT, BOTTOMLEFT
    for i = 1, NUM_COLUMNS do
        local newColumn = CreateControlFromVirtual("$(parent)Container", mainControl, "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(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
            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)
        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 numSectionsInColumn = 1
        local columnIndex = 1
        local column = self.columns[columnIndex]
        local previousAnchor = column
        local headerRelativePoint = TOPLEFT
        local allFilledOnce = false
        local symbolList
        for sectionIndex = 1, numKeySections do
            local numSectionSymbols = GetNumMapKeySectionSymbols(sectionIndex)
            local newNumSymbolsInColumn = numSymbolsInColumn + numSectionSymbols
            local moveToNextColumn = newNumSymbolsInColumn > params.MAX_SYMBOLS_PER_COLUMN or (newNumSymbolsInColumn > params.TARGET_SYMBOLS_PER_COLUMN and numSectionsInColumn > params.TARGET_SECTIONS_PER_COLUMN)
            if moveToNextColumn then
                if columnIndex == NUM_COLUMNS or allFilledOnce then
                    -- If all columns have symbols, add to the shortest column
                    local minSymbols = #self.symbols[1]
                    local columnIndex = 1
                    for i = 2, NUM_COLUMNS do
                        local columnSymbols = #self.symbols[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]
                    -- There are at least two sections in the column and there will be more than the max number of symbols in the column so this count is not necessary
                    numSectionsInColumn = 2
                    allFilledOnce = true
                else
                    columnIndex = columnIndex + 1
                    column = self.columns[columnIndex]
                    previousAnchor = column
                    headerRelativePoint = TOPLEFT
                    numSymbolsInColumn = 0
                    numSectionsInColumn = 1
                end
            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, numSectionSymbols 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(LEFT, column, LEFT)
                symbol:SetAnchor(TOPLEFT, previousAnchor, BOTTOMLEFT, offsetX, params.SYMBOL_OFFSET_Y)
                offsetX = 0
                if numSymbolsInColumn == 1 then
                    symbolList = {}
                    table.insert(self.symbols, symbolList)
                end
                table.insert(symbolList, symbol)
                previousAnchor = symbol
            end
            numSectionsInColumn = numSectionsInColumn + 1
        end
    end
end
--Global XML
    GAMEPAD_WORLD_MAP_KEY = WorldMapKey_Gamepad:New(self)
end