Back to Home

ESO Lua File v100022

ingame/tradinghouse/gamepad/tradinghousefilter_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
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
--[[
Gamepad Trading House Filter differs from Trading House filter in some important ways. Trading House Filter utilizes static comboboxes that
are show/hidden/re-anchored according to the global filter data (found in TradingHouseFilter_Shared.lua). The gamepad design calls for the filter
combo boxes to be used inside a parametric list. Because the filter Combo boxes are in a parametric list we have to be careful as the controls
will be reused by the parametric list internals. We also need to make sure that we ensure correct behavior regardless of the number of times initialize
is called. We also can't guarantee any order that these functions will be called in. All this requires extra book keeping and re-initializations.
--]]
local IGNORE_CALLBACK = true
local function InitializeComboBox(comboBox, data, callback, lastName, lastIndex)
    if not data then return end
    if lastIndex and lastIndex > comboBox:GetNumItems() then
        lastIndex = 1
    end
    comboBox:ClearItems()
    
    local selectFirstItem = lastName == nil or lastIndex == 1
    local DONT_SELECT_FIRST_ITEM = false
    ZO_TradingHouse_InitializeColoredComboBox(comboBox, data, callback, nil, nil, DONT_SELECT_FIRST_ITEM)
    --All of the selection callbacks depend on querying the highlighted item instead of the selected item so we have to set that first
    --before the selected item changed callback.
    comboBox:SetHighlightedItem(lastIndex)
    if selectFirstItem then
        comboBox:SelectFirstItem()
    else
        comboBox:SelectItemByIndex(lastIndex, IGNORE_CALLBACK)
    end
end
--[[ Gamepad Trading House Filter ]]--
ZO_GamepadTradingHouse_Filter = ZO_Object:Subclass()
function ZO_GamepadTradingHouse_Filter:New(...)
    local filter = ZO_Object.New(self)
    filter:Initialize(...)
    return filter
end
function ZO_GamepadTradingHouse_Filter:Initialize(traitType, enchantmentType)
    self.traitType = traitType
    self.enchantmentType = enchantmentType
    self.isInitialized = true
end
function ZO_GamepadTradingHouse_Filter:IsInitialized()
    return self.isInitialized
end
function ZO_GamepadTradingHouse_Filter:SetComboBoxes(filterComboBoxData)
    GAMEPAD_TRADING_HOUSE_BROWSE:ResetList(filterComboBoxData)
end
function ZO_GamepadTradingHouse_Filter:RemoveComboBoxes()
    GAMEPAD_TRADING_HOUSE_BROWSE:ResetList()
end
function ZO_GamepadTradingHouse_Filter:AddMods(filterComboBoxData)
    if self.traitType then
        assert(not self.traitAdded) -- This should only ever be added once. Use SetVisible to control the trait filter combo box visibility
        local data = SYSTEMS:GetGamepadObject(ZO_TRADING_HOUSE_SYSTEM_NAME):GetTraitFilters():GetComboBoxData()
        table.insert(filterComboBoxData, data)
        self.traitComboBoxData = filterComboBoxData[#filterComboBoxData]
        self.traitAdded = true
    end
    if self.enchantmentType then
        assert(not self.enchantmentAdded) -- This should only ever be added once. Use SetVisible to control the enchantment filter combo box visibility
        
        local data = SYSTEMS:GetGamepadObject(ZO_TRADING_HOUSE_SYSTEM_NAME):GetEnchantmentFilters():GetComboBoxData()
        table.insert(filterComboBoxData, data)
        self.enchantmentComboBoxData = filterComboBoxData[#filterComboBoxData]
        self.enchantmentAdded = true
    end
end
function ZO_GamepadTradingHouse_Filter:SetTraitType(traitType)
    self.traitType = traitType
    local traits = SYSTEMS:GetGamepadObject(ZO_TRADING_HOUSE_SYSTEM_NAME):GetTraitFilters()
    if self.traitAdded and self.traitType then
        traits:SetType(self.traitType)
        traits:SetVisible(true)
    else
        traits:SetVisible(false)
    end
end
    
function ZO_GamepadTradingHouse_Filter:SetEnchantmentType(enchantmentType)
    self.enchantmentType = enchantmentType
    local enchantments = SYSTEMS:GetGamepadObject(ZO_TRADING_HOUSE_SYSTEM_NAME):GetEnchantmentFilters()
    if self.enchantmentAdded and self.enchantmentType then
        enchantments:SetType(self.enchantmentType)
        enchantments:SetVisible(true)
    else
        enchantments:SetVisible(false)
    end
end
function ZO_GamepadTradingHouse_Filter:ApplyToSearch(search)
    if self.traitType then
        SYSTEMS:GetGamepadObject(ZO_TRADING_HOUSE_SYSTEM_NAME):GetTraitFilters():ApplyToSearch(search)
    end
    if self.enchantmentType then
        SYSTEMS:GetGamepadObject(ZO_TRADING_HOUSE_SYSTEM_NAME):GetEnchantmentFilters():ApplyToSearch(search)
    end
end
function ZO_GamepadTradingHouse_Filter:SetHidden(hidden)
    if hidden then
        self:RemoveComboBoxes()
    else
        -- Update trait and enchantment filters
        self:SetTraitType(self.traitType)
        self:SetEnchantmentType(self.enchantmentType)
    end
end
--[[ Gamepad ModFilter ]]--
-- Used with enchantments and traits. These filters are requested to be added by other filters.
ZO_GamepadTradingHouse_ModFilter = ZO_TradingHouseSearchFieldSetter:Subclass()
function ZO_GamepadTradingHouse_ModFilter:New(...)
    return ZO_TradingHouseComboBoxSetter.New(self, ...)
end
function ZO_GamepadTradingHouse_ModFilter:Initialize(name, filterDataContainer, modFilterType)
    ZO_TradingHouseSearchFieldSetter.Initialize(self, modFilterType)
    self.filterDataContainer = filterDataContainer
    self.filterComboBoxData = 
    {
        name = name,
        initCallback = function(comboBox) self:InitializeComboBox(comboBox) end,
        visible = true
    }
    self.lastFilterIndex = 1
    self.isInitialized = true
end
function ZO_GamepadTradingHouse_ModFilter:IsInitialized()
    return self.isInitialized
end
function ZO_GamepadTradingHouse_ModFilter:SetVisible(visible)
    self.filterComboBoxData.visible = visible
end
function ZO_GamepadTradingHouse_ModFilter:GetComboBoxData()
    return self.filterComboBoxData
end
function ZO_GamepadTradingHouse_ModFilter:SetType(filterType)
     self.filterData = self.filterDataContainer[filterType]
    
    self.lastFilterEntryName = nil
    self.lastFilterIndex = 1
end
function ZO_GamepadTradingHouse_ModFilter:OnFilterSelectionChanged(comboBox, entryName, entry)
    local selectionChanged = self.lastFilterEntryName ~= entryName
    self.lastFilterEntryName = entryName
    self.m_min = entry.minValue
    self.m_max = entry.maxValue
    if selectionChanged then
        self.lastFilterIndex = comboBox:GetHighlightedIndex()
    end
    ZO_TradingHouse_SearchCriteriaChanged(selectionChanged)
end
function ZO_GamepadTradingHouse_ModFilter:InitializeComboBox(comboBox)
    self.m_comboBox = comboBox
    InitializeComboBox(comboBox, self.filterData, function(...) self:OnFilterSelectionChanged(...) end, self.lastFilterEntryName, self.lastFilterIndex)
end
--[[ Gamepad Category Filter ]]--
-- Used with Consumables, Misc. Filters, and Soul Gems
ZO_GamepadCategoryFilter = ZO_GamepadTradingHouse_Filter:Subclass()
function ZO_GamepadCategoryFilter:New(...)
    return ZO_GamepadTradingHouse_Filter.New(self, ...)
end
function ZO_GamepadCategoryFilter:Initialize(name, filterData, traitType, enchantmentType)
    ZO_GamepadTradingHouse_Filter.Initialize(self, traitType, enchantmentType)
    self.name = name
    self.filterData = filterData
    self.lastFilterCategoryIndex = 1
    self.filterComboBoxData = 
    { 
        {
            name = "GuildStoreBrowseFilterCategoryFilter" .. self.name, 
            initCallback = function(comboBox)
                self:InitializeFilterCategoryComboBox(comboBox)
            end,
            visible = true
        }
    }
    ZO_GamepadTradingHouse_Filter.AddMods(self, self.filterComboBoxData)
end
function ZO_GamepadCategoryFilter:GetComboBoxData()
    return self.filterComboBoxData
end
function ZO_GamepadCategoryFilter:InitializeFilterCategoryComboBox(comboBox)
    self.filterCategoryComboBox = comboBox
    InitializeComboBox(comboBox, self:GetFilterData(), function(...) self:OnCategorySelection(...) end, self.lastFilterCategoryName, self.lastFilterCategoryIndex)
end
function ZO_GamepadCategoryFilter:GetFilterData()
    return self.filterData
end
function ZO_GamepadCategoryFilter:SetCategoryType(entry)
    self.categoryType = entry.minValue
end
function ZO_GamepadCategoryFilter:OnCategorySelection(comboBox, entryName, entry)
     local selectionChanged = self.lastFilterCategoryName ~= entryName
    self.lastFilterCategoryName = entryName
    self.lastFilterCategoryIndex = comboBox:GetHighlightedIndex()
    self:SetCategoryType(entry)
    ZO_TradingHouse_SearchCriteriaChanged(selectionChanged)
end
function ZO_GamepadCategoryFilter:ApplyToSearch(search)
    search:SetFilter(TRADING_HOUSE_FILTER_TYPE_ITEM, self.categoryType)
    ZO_GamepadTradingHouse_Filter.ApplyToSearch(self, search)
end
function ZO_GamepadCategoryFilter:SetComboBoxes(comboBoxes)
    self.lastFilterCategoryIndex = 1
    self.lastFilterCategoryName = nil
    ZO_GamepadTradingHouse_Filter.SetComboBoxes(self, comboBoxes)
end
--Combo Box Data
ZO_TradingHouse_Gamepad_ComboBoxData = ZO_Object:Subclass()
function ZO_TradingHouse_Gamepad_ComboBoxData:New(...)
   local object = ZO_Object.New(self)
   object:Initialize(...)
   return object 
end
function ZO_TradingHouse_Gamepad_ComboBoxData:Initialize(name, onChangeCallback)
    self.name = name
    self.lastSelectionIndex = 1
    self.visible = true
    self.onChangeCallback = onChangeCallback
    self.initCallback = function(comboBox)
        self.comboBox = comboBox
        InitializeComboBox(comboBox, self.data, self.onChangeCallback, self.lastSelectionText, self.lastSelectionIndex)
    end
end
function ZO_TradingHouse_Gamepad_ComboBoxData:GetData()
    return self.data
end
function ZO_TradingHouse_Gamepad_ComboBoxData:SetData(data)
    self.data = data
end
function ZO_TradingHouse_Gamepad_ComboBoxData:IsVisible()
    return self.visible
end
function ZO_TradingHouse_Gamepad_ComboBoxData:SetVisible(visible)
    self.visible = visible
end
function ZO_TradingHouse_Gamepad_ComboBoxData:GetSelectedEntryDataFromMemory()
    return self.data[self.lastSelectionIndex]
end
function ZO_TradingHouse_Gamepad_ComboBoxData:UpdateSelectedEntryMemory(entryName, entryIndex)
    if entryName ~= self.lastSelectionText then
        self.lastSelectionText = entryName
        self.lastSelectionIndex = entryIndex
        return true
    else
        return false
    end
end
function ZO_TradingHouse_Gamepad_ComboBoxData:ClearSelectedEntryMemory()
    self.lastSelectionText = nil
    self.lastSelectionIndex = 1
end
function ZO_TradingHouse_Gamepad_ComboBoxData:ReInitializeComboBox()
    if self.comboBox then
          self.initCallback(self.comboBox)
     end
end
--[[ Gamepad Category With Subtype Filter ]]--
-- used by Weapon, Armor, and Crafting Filters
ZO_CategorySubtypeFilter = ZO_GamepadTradingHouse_Filter:Subclass()
function ZO_CategorySubtypeFilter:New(...)
    return ZO_GamepadTradingHouse_Filter.New(self, ...)
end
function ZO_CategorySubtypeFilter:Initialize(name, filterData, traitType, enchantmentType)
    ZO_GamepadTradingHouse_Filter.Initialize(self, traitType, enchantmentType)
    self.name = name
    self.filterComboBoxData = {}
    self.comboBoxNameToFilterComboBoxData = {}
    self:AddFilterComboBoxData("Category", function(...) self:PopulateSubTypes(...) end)
    self:AddFilterComboBoxData("SubType", function(...) self:SetFilterSubType(...) end)
    local categoryComboBoxData = self:GetFilterComboBoxData("Category")
    categoryComboBoxData:SetData(filterData)
    ZO_GamepadTradingHouse_Filter.AddMods(self, self.filterComboBoxData)
end
function ZO_CategorySubtypeFilter:GetComboBoxData()
    return self.filterComboBoxData
end
function ZO_CategorySubtypeFilter:AddFilterComboBoxData(comboBoxName, onChangeCallback)
    local fullName = string.format("GuildStoreBrowseFilter%sFilter%s", comboBoxName, self.name)
    local comboBoxData = ZO_TradingHouse_Gamepad_ComboBoxData:New(fullName, onChangeCallback)
    table.insert(self.filterComboBoxData, comboBoxData)
    self.comboBoxNameToFilterComboBoxData[comboBoxName] = comboBoxData
    return comboBoxData
end
function ZO_CategorySubtypeFilter:GetFilterComboBoxData(comboBoxName)
    return self.comboBoxNameToFilterComboBoxData[comboBoxName]
end
function ZO_CategorySubtypeFilter:PopulateSubTypes(comboBox, entryName, entry)
    local categoryComboBoxData = self:GetFilterComboBoxData("Category")
    local subTypeComboBoxData = self:GetFilterComboBoxData("SubType")
     if categoryComboBoxData:UpdateSelectedEntryMemory(entryName, comboBox:GetHighlightedIndex()) then
        self:SetCategoryTypeAndSubData(entry)
        subTypeComboBoxData:ReInitializeComboBox()
     end
end
function ZO_CategorySubtypeFilter:SetCategoryTypeAndSubData(entry)
    self.categoryType = entry.minValue
    local subTypeComboBoxData = self:GetFilterComboBoxData("SubType")
    subTypeComboBoxData:SetData(entry.maxValue)
end
function ZO_CategorySubtypeFilter:SetFilterSubType(comboBox, entryName, entry)
    local subTypeComboBoxData = self:GetFilterComboBoxData("SubType")    
    if subTypeComboBoxData:UpdateSelectedEntryMemory(entryName, comboBox:GetHighlightedIndex()) then
        self:SetSubType(entry)
    end
end
function ZO_CategorySubtypeFilter:SetSubType(entry)
    self.m_FilterSubType = entry.minValue
    self.subcategoryEntry = entry
end
function ZO_CategorySubtypeFilter:GetFilterData()
    return self.filterData
end
function ZO_CategorySubtypeFilter:SetComboBoxes(comboBoxes)
    --Only wipe out the combo boxes we added, the rest will be handled by the parent class
    for comboBoxName, comboBoxData in pairs(self.comboBoxNameToFilterComboBoxData) do
        comboBoxData:ClearSelectedEntryMemory()
    end
    ZO_GamepadTradingHouse_Filter.SetComboBoxes(self, comboBoxes)
end