ESO Lua File v100010

libraries/utility/zo_linkhandler.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
LINK_HANDLER = ZO_CallbackObject:New()
LINK_HANDLER.INSERT_LINK_EVENT = "ZO_LinkHandler_InsertLinkEvent"
LINK_HANDLER.LINK_CLICKED_EVENT = "ZO_LinkHandler_LinkClickedEvent"
LINK_HANDLER.LINK_MOUSE_UP_EVENT = "ZO_LinkHandler_LinkMouseUpEvent"
ITEM_LINK_TYPE = "item"
ACHIEVEMENT_LINK_TYPE = "achievement"
CHARACTER_LINK_TYPE = "character"
CHANNEL_LINK_TYPE = "channel"
BOOK_LINK_TYPE = "book"
DISPLAY_NAME_LINK_TYPE = "display"
URL_LINK_TYPE = "url"
COLLECTIBLE_LINK_TYPE = "collectible"
function ZO_LinkHandler_InsertLink(link)
    if type(link) == "string" and #link > 0 then
        local text, color, linkType = ZO_LinkHandler_ParseLink(link)
        --todo: handle outher link type sound cases
        if(linkType == ITEM_LINK_TYPE) then
            local soundCategory = GetItemSoundCategoryFromLink(link)
            if(soundCategory) then
                PlayItemSound(soundCategory, ITEM_SOUND_ACTION_SLOT)
            end
        end
        return LINK_HANDLER:FireCallbacks(LINK_HANDLER.INSERT_LINK_EVENT, link)
    end
end
local function HandleLinkMouseEvent(link, button, control, eventType)
    if type(link) == "string" and #link > 0 then
          local handled = LINK_HANDLER:FireCallbacks(eventType, link, button, ZO_LinkHandler_ParseLink(link))
          if not handled then
            ClearMenu()
            if button == 1 and ZO_PopupTooltip_SetLink then
                ZO_PopupTooltip_SetLink(link)
            elseif button == 2 and link ~= "" then
                local function AddLink()
                    ZO_LinkHandler_InsertLink(zo_strformat(SI_TOOLTIP_ITEM_NAME, link))
                end
                AddMenuItem(GetString(SI_ITEM_ACTION_LINK_TO_CHAT), AddLink)
                    
                ShowMenu(control)
             end
        end
     end
end
function ZO_LinkHandler_OnLinkClicked(link, button, control)
    HandleLinkMouseEvent(link, button, control, LINK_HANDLER.LINK_CLICKED_EVENT)
end
function ZO_LinkHandler_OnLinkMouseUp(link, button, control)
    HandleLinkMouseEvent(link, button, control, LINK_HANDLER.LINK_MOUSE_UP_EVENT)
end
function ZO_LinkHandler_CreateLinkWithFormat(text, color, linkType, linkStyle, stringFormat, ...) --where ... is the data to encode
    if linkType then
        return (stringFormat):format(linkStyle, zo_strjoin(':', linkType, ...), text)
    end
end
function ZO_LinkHandler_CreateLink(text, color, linkType, ...) --where ... is the data to encode
    return ZO_LinkHandler_CreateLinkWithFormat(text, color, linkType, LINK_STYLE_BRACKETS, "|H%d:%s|h[%s]|h", ...)
end
function ZO_LinkHandler_ParseLink(link)
    if type(link) == "string" then
        local linkStyle, data, text = link:match("|H(.-):(.-)|h(.-)|h")
        return text, linkStyle, zo_strsplit(':', data)
    end
end
function ZO_LinkHandler_CreatePlayerLink(displayOrCharacterName)
    if(IsDecoratedDisplayName(displayOrCharacterName)) then
        return ZO_LinkHandler_CreateDisplayNameLink(displayOrCharacterName)
    else
        return ZO_LinkHandler_CreateCharacterLink(displayOrCharacterName)
    end 
end
function ZO_LinkHandler_CreateDisplayNameLink(displayName)
    local undecoratedDisplayName
    if(not IsDecoratedDisplayName(displayName)) then
        undecoratedDisplayName = displayName
        displayName = DecorateDisplayName(displayName)
    else
        undecoratedDisplayName = UndecorateDisplayName(displayName)
    end
    return ZO_LinkHandler_CreateLink(displayName, nil, DISPLAY_NAME_LINK_TYPE, undecoratedDisplayName)
end
function ZO_LinkHandler_CreateCharacterLink(characterName)
     return ZO_LinkHandler_CreateLink(characterName, nil, CHARACTER_LINK_TYPE, characterName)
end
function ZO_LinkHandler_CreateChannelLink(channelName)
     return ZO_LinkHandler_CreateLink(channelName, nil, CHANNEL_LINK_TYPE, channelName)
end
function ZO_LinkHandler_CreateURLLink(url, displayText)
     return ZO_LinkHandler_CreateLinkWithFormat(displayText, nil, URL_LINK_TYPE, LINK_STYLE_DEFAULT, "|H%d:%s|h%s|h", url)
end
local function AppendHelper(thingToAppend, size, nextElement, ...)
    if size == 0 then
        return thingToAppend
    end 
    return nextElement, AppendHelper(thingToAppend, size - 1, ...) 
end
local function Append(thingToAppend, ...)
    return AppendHelper(thingToAppend, select('#', ...), ...)
end
-- where ... are arguments to pass to linkFunction
    return linkFunction(Append(LINK_STYLE_BRACKETS, ...))
end