Back to Home

ESO Lua File v101041

ingame/contacts/gamepad/zo_socialoptionsdialog_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
--------------------------------------------
-- SocialOptionsDialog Gamepad
--------------------------------------------
ZO_SocialOptionsDialogGamepad = ZO_Object:Subclass()
function ZO_SocialOptionsDialogGamepad:Initialize(control)
    if control then
        self.control = control
    end
    self.optionTemplateGroups = {}
    self.conditionResults = {}
    self.dialogData = {}
    self.control:RegisterForEvent(EVENT_FRIEND_PLAYER_STATUS_CHANGED, function(_, displayName, characterName, oldStatus, newStatus) self:OnPlayerStatusChanged(displayName, characterName, oldStatus, newStatus) end)
    self.control:RegisterForEvent(EVENT_GUILD_MEMBER_PLAYER_STATUS_CHANGED, function(_, _, displayName, characterName, oldStatus, newStatus) self:OnPlayerStatusChanged(displayName, characterName, oldStatus, newStatus) end)
end
function ZO_SocialOptionsDialogGamepad:ShowOptionsDialog()
    local parametricList = {}
    self:PopulateOptionsList(parametricList)
    local data = self:GetDialogData()
    --Saving the displayName and online state of the person the dialog is being opened for.
    self.dialogData.displayName = self.socialData.displayName
    self.dialogData.online = self.socialData.online
    ZO_Dialogs_ShowGamepadDialog("GAMEPAD_SOCIAL_OPTIONS_DIALOG", data)
end
function ZO_SocialOptionsDialogGamepad:GetDialogData()
    local parametricList = {}
    self:PopulateOptionsList(parametricList)
    local data =
    {
        parametricList = parametricList,
    }
    return data
end
function ZO_SocialOptionsDialogGamepad:BuildOptionsList()
    -- This function is meant to be overridden by a subclass
end
function ZO_SocialOptionsDialogGamepad:AddOptionTemplateGroup(headerFunction)
    local id = #self.optionTemplateGroups + 1
    local grouping =
    {
        headerFunction = headerFunction,
        options = {},
    }
    self.optionTemplateGroups[id] = grouping
    return id
end
function ZO_SocialOptionsDialogGamepad:AddOptionTemplate(groupId, buildFunction, conditionFunction)
    local grouping = self.optionTemplateGroups[groupId]
    assert(grouping ~= nil, "You must get a valid id from AddOptionTemplateGroup before adding options")
    table.insert(grouping.options, { buildFunction = buildFunction, conditionFunction = conditionFunction })
end
function ZO_SocialOptionsDialogGamepad:PopulateOptionsList(list)
    ZO_ClearTable(self.conditionResults)
    for groupId, grouping in pairs(self.optionTemplateGroups) do
        self.currentGroupingHeader = grouping.headerFunction and grouping.headerFunction(self)
        for index, option in pairs(grouping.options) do
            if self:CheckCondition(option.conditionFunction) then
                self:AddOption(list, option.buildFunction(self))
                self.currentGroupingHeader = nil
            end
        end
    end
end
function ZO_SocialOptionsDialogGamepad:CheckCondition(conditionFunction)
    local conditionMet = self.socialData ~= nil
    if conditionMet and conditionFunction then
        if self.conditionResults[conditionFunction] == nil then
            conditionMet = conditionFunction(self)
            self.conditionResults[conditionFunction] = conditionMet
        else
            conditionMet = self.conditionResults[conditionFunction]
        end
    end
    return conditionMet
end
function ZO_SocialOptionsDialogGamepad:HasAnyShownOptions()
    for groupId, grouping in pairs(self.optionTemplateGroups) do
        for index, option in pairs(grouping.options) do
            local conditionFunction = option.conditionFunction
            if self:CheckCondition(conditionFunction) then
                return true
            end
        end
    end
    return false
end
function ZO_SocialOptionsDialogGamepad:BuildOptionEntry(header, label, callback, finishedCallback, icon)
    local entry = {
        template = "ZO_GamepadMenuEntryTemplate",
        header = header or self.currentGroupingHeader,
        templateData = {
            text = type(label) == "number" and GetString(label) or label,
            setup = ZO_SharedGamepadEntry_OnSetup,
            callback = callback,
            finishedCallback = finishedCallback,
        },
        icon = icon,
    }
    return entry
end
function ZO_SocialOptionsDialogGamepad:AddOption(list, option)
    if option == nil then 
        return
    end
    if list.header then
        option.header = list.header
        list.header = nil
    end
    table.insert(list, option)
end
function ZO_SocialOptionsDialogGamepad:SetupOptions(socialData)
    self.socialData = socialData
    ZO_ClearTable(self.conditionResults)
end
function ZO_SocialOptionsDialogGamepad:AddSocialOptionsKeybind(descriptor, callback, keybind, name, sound, enabledCallback)
    descriptor[#descriptor + 1] =
    {
        alignment = KEYBIND_STRIP_ALIGN_LEFT,
        name =      name or GetString(SI_GAMEPAD_SELECT_OPTION),
        keybind =   keybind or "UI_SHORTCUT_PRIMARY",
        enabled =   enabledCallback or function()
                        return self:HasAnyShownOptions()
                    end,
        sound =     sound or SOUNDS.GAMEPAD_MENU_FORWARD,
        callback =  callback or function()
                        return self:ShowOptionsDialog()
                    end,
    }
end
--Hiding the options dialog if the player's online status changes.
function ZO_SocialOptionsDialogGamepad:OnPlayerStatusChanged(displayName, characterName, oldStatus, newStatus)
    if self.dialogData and self.dialogData.displayName == displayName and newStatus ~= nil then
        local isOnline = newStatus ~= PLAYER_STATUS_OFFLINE
        if self.dialogData.online ~= isOnline then
            ZO_Dialogs_ReleaseAllDialogsOfName("GAMEPAD_SOCIAL_OPTIONS_DIALOG")
        end
    end
end
--Shared Options
function ZO_SocialOptionsDialogGamepad:SelectedDataIsPlayer()
    return self.socialData.displayName == GetDisplayName()
end
function ZO_SocialOptionsDialogGamepad:SelectedDataIsNotPlayer()
    return not self:SelectedDataIsPlayer()
end
function ZO_SocialOptionsDialogGamepad:SelectedDataIsLoggedIn()
    return self.socialData.online and self.socialData.hasCharacter and not self:SelectedDataIsPlayer()
end
function ZO_SocialOptionsDialogGamepad:GetDefaultHeader()
    return ZO_FormatUserFacingDisplayName(self.socialData.displayName)
end
function ZO_SocialOptionsDialogGamepad:BuildEditNoteOption()
    local callback = function()
        local data = {
            displayName = self.socialData.displayName,
            note = self.socialData.note,
            noteChangedCallback = self.noteChangedCallback,
        }
        ZO_Dialogs_ShowGamepadDialog("GAMEPAD_SOCIAL_EDIT_NOTE_DIALOG", data)
    end
    local unusedHeader = nil
    return self:BuildOptionEntry(unusedHeader, SI_SOCIAL_MENU_EDIT_NOTE, callback)
end
function ZO_SocialOptionsDialogGamepad:ShouldAddSendMailOption()
    return not self:SelectedDataIsPlayer()
end
function ZO_SocialOptionsDialogGamepad:BuildSendMailOption()
    local function Callback()
        if IsUnitDead("player") then
            ZO_AlertEvent(EVENT_UI_ERROR, SI_CANNOT_DO_THAT_WHILE_DEAD)
        elseif IsUnitInCombat("player") then
            ZO_AlertEvent(EVENT_UI_ERROR, SI_CANNOT_DO_THAT_WHILE_IN_COMBAT)
        else
            MAIL_MANAGER_GAMEPAD:GetSend():ComposeMailTo(ZO_FormatUserFacingCharacterOrDisplayName(self.socialData.displayName))
        end
    end
    local unusedHeader = nil
    return self:BuildOptionEntry(unusedHeader, SI_SOCIAL_MENU_SEND_MAIL, nil, Callback)
end
function ZO_SocialOptionsDialogGamepad:ShouldAddWhisperOption()
    return self.socialData.online and IsChatSystemAvailableForCurrentPlatform()
end
function ZO_SocialOptionsDialogGamepad:BuildWhisperOption()
    local finishCallback = function() StartChatInput("", CHAT_CHANNEL_WHISPER, self.socialData.displayName) end
    local unusedHeader = nil
    return self:BuildOptionEntry(unusedHeader, SI_SOCIAL_LIST_PANEL_WHISPER, nil, finishCallback)
end
function ZO_SocialOptionsDialogGamepad:ShouldAddInviteToGroupOption()
    return IsGroupModificationAvailable() and not self:SelectedDataIsPlayer() and IsUnitSoloOrGroupLeader("player")
end
function ZO_SocialOptionsDialogGamepad:ShouldAddInviteToGroupOptionAndCanSelectedDataBeInvited()
    -- PS can send platform invites to offline players which they can then use to launch the game and join
end
function ZO_SocialOptionsDialogGamepad:GetInviteToGroupCallback()
    return function()
        local NOT_SENT_FROM_CHAT = false
        local DISPLAY_INVITED_MESSAGE = true
        TryGroupInviteByName(self.socialData.displayName, NOT_SENT_FROM_CHAT, DISPLAY_INVITED_MESSAGE)
    end
end
function ZO_SocialOptionsDialogGamepad:BuildInviteToGroupOption()
    if self:ShouldAddInviteToGroupOption() then
        local unusedHeader = nil
        return self:BuildOptionEntry(unusedHeader, SI_SOCIAL_MENU_INVITE, self:GetInviteToGroupCallback())
    end
end
function ZO_SocialOptionsDialogGamepad:BuildTravelToPlayerOption(jumpFunc)
    local function JumpToPlayerCallback()
        jumpFunc(DecorateDisplayName(self.socialData.displayName))
        SCENE_MANAGER:ShowBaseScene()
    end
    local unusedHeader = nil
    return self:BuildOptionEntry(unusedHeader, SI_SOCIAL_MENU_JUMP_TO_PLAYER, JumpToPlayerCallback)
end
function ZO_SocialOptionsDialogGamepad:BuildVisitPlayerHouseOption()
    local function JumpToHouseCallback()
        JumpToHouse(DecorateDisplayName(self.socialData.displayName))
        SCENE_MANAGER:ShowBaseScene()
    end
    local unusedHeader = nil
    return self:BuildOptionEntry(unusedHeader, SI_SOCIAL_MENU_VISIT_HOUSE, JumpToHouseCallback)
end
function ZO_SocialOptionsDialogGamepad:BuildInviteToTributeOption()
    if not ZO_IsTributeLocked() then
        local function InviteToTributeCallback()
            InviteToTributeByDisplayName(DecorateDisplayName(self.socialData.displayName))
            SCENE_MANAGER:ShowBaseScene()
        end
        local unusedHeader = nil
        return self:BuildOptionEntry(unusedHeader, SI_SOCIAL_MENU_TRIBUTE_INVITE, InviteToTributeCallback)
    end
end
function ZO_SocialOptionsDialogGamepad:BuildGamerCardOption()
    if IsConsoleUI() then
        local callback = function()
            local data = self.socialData
            local displayName = data.displayName
            if data.consoleId then
                local undecoratedName = UndecorateDisplayName(displayName)
                ShowGamerCard(undecoratedName, data.consoleId)
            elseif data.friendIndex then
                --To make sure we use the correct index if friends list was updated while the dialog is being displayed.
                local updatedData = FRIENDS_LIST_MANAGER:FindDataByDisplayName(displayName)
                if updatedData then
                    ZO_ShowGamerCardFromDisplayNameOrFallback(displayName, ZO_ID_REQUEST_TYPE_DISPLAY_NAME, displayName)
                end
            elseif data.ignoreIndex then
                ZO_ShowGamerCardFromDisplayNameOrFallback(displayName, ZO_ID_REQUEST_TYPE_IGNORE_INFO, data.ignoreIndex)
            elseif data.isGroup then
                ZO_ShowGamerCardFromDisplayNameOrFallback(displayName, ZO_ID_REQUEST_TYPE_GROUP_INFO, data.index)
            elseif displayName then
                ZO_ShowGamerCardFromDisplayName(displayName)
            else
                ZO_Dialogs_ShowGamepadDialog("GAMERCARD_UNAVAILABLE")
            end
        end
        return self:BuildOptionEntry(nil, GetGamerCardStringId(), callback)
    end
    return nil
end
function ZO_SocialOptionsDialogGamepad:BuildIgnoreOption()
    local stringId
    local callback
    local platform = GetUIPlatform()
    if platform == UI_PLATFORM_PC then
        stringId = SI_FRIEND_MENU_IGNORE
        callback = function()
            ZO_Dialogs_ShowGamepadDialog("CONFIRM_IGNORE_FRIEND", self.socialData, {mainTextParams={ ZO_FormatUserFacingDisplayName(self.socialData.displayName) }}) 
        end
    elseif ZO_DoesConsoleSupportTargetedIgnore() then
        stringId = SI_GAMEPAD_CONTACTS_MENU_IGNORE
        callback = function()
            ZO_ShowConsoleIgnoreDialogFromDisplayNameOrFallback(self.socialData.displayName, ZO_ID_REQUEST_TYPE_FRIEND_INFO, self.socialData.friendIndex)
        end
    end
    if stringId and callback then
        return self:BuildOptionEntry(nil, stringId, callback)
    end
    return nil
end
function ZO_SocialOptionsDialogGamepad:ShouldAddRemoveFriendOption()
    return not IsConsoleUI() and IsFriend(DecorateDisplayName(self.socialData.displayName))
end
function ZO_SocialOptionsDialogGamepad:BuildRemoveFriendOption()
    local callback = function() 
        ZO_Dialogs_ShowGamepadDialog("CONFIRM_REMOVE_FRIEND", self.socialData, {mainTextParams={ZO_FormatUserFacingDisplayName(self.socialData.displayName)}}) 
    end
    return self:BuildOptionEntry(nil, SI_FRIEND_MENU_REMOVE_FRIEND, callback)
end
function ZO_SocialOptionsDialogGamepad:BuildRemoveIgnoreOption()
    local callback = function() 
        RemoveIgnore(self.socialData.displayName)
        PlaySound(SOUNDS.DIALOG_ACCEPT)
    end
    return self:BuildOptionEntry(nil, SI_IGNORE_MENU_REMOVE_IGNORE, callback)
end
function ZO_SocialOptionsDialogGamepad:ShouldAddFriendOption()
    return not IsFriend(DecorateDisplayName(self.socialData.displayName)) and not IsIgnored(DecorateDisplayName(self.socialData.displayName)) and not self:SelectedDataIsPlayer()
end
function ZO_SocialOptionsDialogGamepad:BuildAddFriendOption()
    local callback = function()      
        if IsConsoleUI() then
            local displayName = self.socialData.displayName
            ZO_ShowConsoleAddFriendDialogFromDisplayName(displayName)
        else
            local data = { displayName = self.socialData.displayName, }
            ZO_Dialogs_ShowGamepadDialog("GAMEPAD_SOCIAL_ADD_FRIEND_DIALOG", data)
        end
    end
    return self:BuildOptionEntry(nil, SI_SOCIAL_MENU_ADD_FRIEND, callback)
end