Back to Home

ESO Lua File v100031

libraries/zo_horizontal_menu/zo_horizontal_menu.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
------------------------
-- ZO_Horizontal_Menu
------------------------
ZO_HORIZONAL_MENU_ALIGN_LEFT = 1
ZO_HORIZONAL_MENU_ALIGN_CENTER = 2
ZO_HORIZONAL_MENU_ALIGN_RIGHT = 3
local HORIZONTAL_MENU_DEFAULT_SPACING = 30
ZO_Horizontal_Menu = ZO_Object:Subclass()
function ZO_Horizontal_Menu:New(...)
    local object = ZO_Object.New(self)
    object:Initialize(...)
    return object
end
function ZO_Horizontal_Menu:Initialize(control, anchorStyle)
    self.control = control
    self.anchorStyle = anchorStyle or ZO_HORIZONAL_MENU_ALIGN_LEFT
    self.menuControls = {}
end
function ZO_Horizontal_Menu:AddTemplate(templateName, setupFunction, spacing)
    self.template =
    {
        templateName = templateName,
        setupFunction = setupFunction,
        spacing = spacing or HORIZONTAL_MENU_DEFAULT_SPACING
    }
end
function ZO_Horizontal_Menu:AddMenuItem(controlName, name, onSelectedCallback, onUnselectedCallback, onMouseEnterCallback, onMouseExitCallback)
    local menuItemControl = CreateControlFromVirtual("$(parent)" .. controlName, self.control, self.template.templateName)
    menuItemControl.data =
    {
        index = #self.menuControls + 1,
        name = name,
    }
    if self.template.setupFunction then
        self.template.setupFunction(menuItemControl, menuItemControl.data)
    end
    if onMouseEnterCallback then
        menuItemControl:SetHandler("OnMouseEnter", onMouseEnterCallback)
    end
    if onMouseExitCallback then
        menuItemControl:SetHandler("OnMouseExit", onMouseExitCallback)
    end
    -- Anchor new control
    local previousControl = self.menuControls[#self.menuControls]
    if previousControl then
        local isValid, point, target, relPoint, offsetX, offsetY = previousControl:GetAnchor(0)
        if isValid then
            if self.anchorStyle == ZO_HORIZONAL_MENU_ALIGN_LEFT then
                menuItemControl:SetAnchor(TOPLEFT, previousControl, TOPRIGHT, self.template.spacing)
            elseif self.anchorStyle == ZO_HORIZONAL_MENU_ALIGN_CENTER then
                menuItemControl:SetAnchor(TOPLEFT, previousControl, TOPRIGHT, self.template.spacing)
                local firstControlOffsetX = offsetX + (previousControl:GetWidth() + self.template.spacing) / 2
                local firstControl = self.menuControls[1]
                firstControl:ClearAnchors()
                firstControl:SetAnchor(TOP, self.control, TOP, -firstControlOffsetX)
            else -- Align Right
                previousControl:SetAnchor(TOPRIGHT, menuItemControl, TOPLEFT, -self.template.spacing)
                menuItemControl:SetAnchor(point, target, relPoint, offsetX, offsetY)
            end
        else
            menuItemControl:SetAnchor(TOPRIGHT, self.control, TOPRIGHT)
        end
    else
        if self.anchorStyle == ZO_HORIZONAL_MENU_ALIGN_LEFT then
            menuItemControl:SetAnchor(TOPLEFT, self.control, TOPLEFT)
        elseif self.anchorStyle == ZO_HORIZONAL_MENU_ALIGN_CENTER then
            menuItemControl:SetAnchor(TOP, self.control, TOP)
        else -- Anchored Right
            menuItemControl:SetAnchor(TOPRIGHT, self.control, TOPLEFT)
        end
    end
    table.insert(self.menuControls, menuItemControl)
    return menuItemControl
end
function ZO_Horizontal_Menu:SetSelectedByIndex(index)
    if index and index > 0 and index <= #self.menuControls then
        if self.selectedIndex ~= index then
            if self.selectedIndex then
                self.menuControls[self.selectedIndex]:SetSelected(false)
            end
            self.selectedIndex = index
            self.menuControls[self.selectedIndex]:SetSelected(true)
            if self.menuControls[self.selectedIndex].data.onSelectedCallback then
                self.menuControls[self.selectedIndex].data.onSelectedCallback(self.menuControls[self.selectedIndex])
            end
        end
    elseif not index then
        if self.selectedIndex and self.selectedIndex <= #self.menuControls then
            self.menuControls[self.selectedIndex]:SetSelected(false)
            if self.menuControls[self.selectedIndex].data.onUnselectedCallback then
                self.menuControls[self.selectedIndex].data.onUnselectedCallback()
            end
        end
        self.selectedIndex = nil
    else
        assert(false, "ZO_Horizontal_Menu:SetSelectedByIndex out-of-bounds: " .. index)
    end
end
function ZO_Horizontal_Menu:Refresh()
    if self.template.setupFunction then
        for i, control in ipairs(self.menuControls) do
            self.template.setupFunction(control, control.data)
        end
    end
end
function ZO_Horizontal_Menu:Reset()
    self.menuControls = {}
end
--Global XML
    if upInside and control.data.onSelectedCallback then
    end
end