Back to Home

ESO Lua File v101050

pregameandingame/addons/modbrowser_manager.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
ZO_MOD_BROWSER_SEARCH_STATES =
{
    NONE = 1,
    WAITING = 2,
    COMPLETE = 3,
    FAILED = 4,
}
------------------------------------
-- Mod Browser Search Filters -----
------------------------------------
ZO_ModBrowser_Search_Filters = ZO_InitializingObject:Subclass()
function ZO_ModBrowser_Search_Filters:Initialize(searchType)
    self.searchType = searchType
    self.searchText = ""
    self.categories = {}
end
function ZO_ModBrowser_Search_Filters:GetSearchType()
    return self.searchType
end
function ZO_ModBrowser_Search_Filters:SetSearchText(searchText)
    self.searchText = searchText
end
function ZO_ModBrowser_Search_Filters:GetSearchText()
    return self.searchText
end
function ZO_ModBrowser_Search_Filters:SetCategories(categories)
    self.categories = categories
end
function ZO_ModBrowser_Search_Filters:GetCategories()
    return self.categories
end
function ZO_ModBrowser_Search_Filters:ResetFilters()
    self.searchType = MOD_BROWSER_SEARCH_TYPE_BROWSE
    self.searchText = ""
end
function ZO_ModBrowser_Search_Filters:CopyFrom(filters)
    if filters:GetSearchType() == self:GetSearchType() then
        self:ResetFilters()
        self.searchText = filters:GetSearchText()
        --Copy by value instead of by reference
        ZO_ShallowTableCopy(filters:GetCategories(), self.categories)
    else
        internalassert(false, "Cannot copy filters with a search type of %d to filters with a search type of %d", filters:GetSearchType(), self:GetSearchType())
    end
end
function ZO_ModBrowser_Search_Filters:PrepareFilters()
    local success = true
    success = success and SetModBrowserSearchType(self.searchType)
    success = success and SetModBrowserTextFilter(self.searchText)
    success = success and SetModBrowserCategoryTypeFilter(unpack(self.categories))
    return success
end
------------------------------------
-- Mod Browser Search Manager ------
------------------------------------
ZO_ModBrowser_Search_Manager = ZO_InitializingCallbackObject:Subclass()
function ZO_ModBrowser_Search_Manager:Initialize()
    self.searchResultsData = {}
    self.searchFilterData = 
    {
        [MOD_BROWSER_SEARCH_TYPE_BROWSE] = ZO_ModBrowser_Search_Filters:New(MOD_BROWSER_SEARCH_TYPE_BROWSE),
        [MOD_BROWSER_SEARCH_TYPE_SUBSCRIBED] = ZO_ModBrowser_Search_Filters:New(MOD_BROWSER_SEARCH_TYPE_SUBSCRIBED),
    }
    self.searchState = ZO_MOD_BROWSER_SEARCH_STATES.NONE
    self.searchId = 0
end
function ZO_ModBrowser_Search_Manager:RegisterForEvents()
    EVENT_MANAGER:RegisterForEvent("ModBrowser_Search_Manager", EVENT_MOD_BROWSER_SEARCH_COMPLETE, ZO_GetEventForwardingFunction(self, self.OnModBrowserSearchResults))
end
function ZO_ModBrowser_Search_Manager:OnModBrowserSearchResults(result, searchId)
    -- Don't update when the search complete event is not for our current search
    if searchId ~= self:GetSearchId() then
        return
    end
    local searchState
    if result == MOD_BROWSER_REQUEST_LISTINGS_RESULT_SUCCESS then
        searchState = ZO_MOD_BROWSER_SEARCH_STATES.COMPLETE
    else
        searchState = ZO_MOD_BROWSER_SEARCH_STATES.FAILED
    end
    local FORCE_UPDATE = true
    self:SetSearchState(searchState, FORCE_UPDATE)
end
function ZO_ModBrowser_Search_Manager:ExecuteSearch(searchType)
    self:ExecuteSearchInternal(searchType)
end
function ZO_ModBrowser_Search_Manager:ExecuteSearchInternal(searchType)
    local filters = self:GetSearchFilters(searchType)
    --Only trigger a new search if the filters were applied successfully
    if filters:PrepareFilters() then
        local searchId = RequestModsSearch()
        if searchId ~= nil then
            self.searchId = searchId
            self:SetSearchState(ZO_MOD_BROWSER_SEARCH_STATES.WAITING)
        end
    end
end
function ZO_ModBrowser_Search_Manager:RefreshSearchResults()
    local resultsData = self.searchResultsData
    ZO_ClearNumericallyIndexedTable(resultsData)
    --Do not populate the search results if there is a search in progress
    if self:IsSearchStateReady() then
        for listingIndex = 1, GetNumModListings() do
            table.insert(resultsData, ZO_ModBrowserListingSearchData:New(listingIndex))
        end
    end
end
function ZO_ModBrowser_Search_Manager:GetSearchResults(optionalSortFunction)
    local resultsData = self.searchResultsData
    if optionalSortFunction then
        local sortedResultsData = ZO_ShallowTableCopy(resultsData)
        table.sort(sortedResultsData, optionalSortFunction)
        return sortedResultsData
    else
        return resultsData
    end
end
function ZO_ModBrowser_Search_Manager:SetSearchState(searchState, forceUpdate)
    if self.searchState ~= searchState or forceUpdate then
        self.searchState = searchState
        self:RefreshSearchResults()
        self:FireCallbacks("OnSearchStateChanged", searchState)
    end
end
function ZO_ModBrowser_Search_Manager:GetSearchState()
    return self.searchState
end
function ZO_ModBrowser_Search_Manager:GetSearchId()
    return self.searchId
end
function ZO_ModBrowser_Search_Manager:IsSearchStateReady()
    return self.searchState == ZO_MOD_BROWSER_SEARCH_STATES.NONE or self.searchState == ZO_MOD_BROWSER_SEARCH_STATES.COMPLETE or self.searchState == ZO_MOD_BROWSER_SEARCH_STATES.FAILED
end
function ZO_ModBrowser_Search_Manager:GetSearchFilters(searchType)
    return self.searchFilterData[searchType]
end
MOD_BROWSER_SEARCH_MANAGER = ZO_ModBrowser_Search_Manager:New()