-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathMessageList.lua
More file actions
158 lines (142 loc) · 4.41 KB
/
Copy pathMessageList.lua
File metadata and controls
158 lines (142 loc) · 4.41 KB
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
MessageListMixin = CreateFromMixins(CallbackRegistryBaseMixin);
MessageListEvent = {
RowSelected = 1,
}
BUTTON_SPACING = 2
function MessageListMixin:Load()
self:OnLoad() -- for CallbackRegistryBaseMixin:OnLoad
self.selectedRow = nil;
self.messageRows = {};
self.ScrollBar.Background:Hide();
self.ScrollBar.doNotHide = true;
end
function MessageListMixin:SetMessages(messages)
for _, message in pairs(messages) do
local messageRow = self:GetMessageRow(message)
if message == self.selectedMessage then
self.selectedRow = messageRow
self:HighlightRow(self.selectedRow)
end
end
table.sort(self.messageRows, function(a, b) return a.message.name < b.message.name end)
self:ResetMessageRowAnchors()
self:UpdateScrollBar();
end
function MessageListMixin:GetMessageRow(message)
local rowIndex, messageRow = self:FindMessageRow(message.id)
if not rowIndex then
messageRow = self:CreateMessageRow(message)
table.insert(self.messageRows, messageRow)
end
messageRow:Setup(message)
return messageRow
end
function MessageListMixin:FindMessageRow(messageId)
return FindInTableIf(self.messageRows, function(row) return row.message.id == messageId end)
end
function MessageListMixin:CreateMessageRow(message)
--local name = self:GetName().."MessageRow"..message.id
local name = "MessageBarker_Msg"..message.id
local messageRow = CreateFrame("Button", name, self.Child, "MessageRowTemplate")
messageRow:SetScript("OnClick", function(editButton, event, ...)
self:SetSelectedRow(messageRow);
end)
return messageRow
end
function MessageListMixin:ResetMessageRowAnchors()
local previousMessageRow = nil;
for _, messageRow in ipairs(self.messageRows) do
messageRow:ClearAllPoints()
end
for _, messageRow in ipairs(self.messageRows) do
if previousMessageRow then
messageRow:SetPoint("TOPLEFT", previousMessageRow, "BOTTOMLEFT", 0, -BUTTON_SPACING);
else
messageRow:SetPoint("TOPLEFT");
end
previousMessageRow = messageRow;
end
end
function MessageListMixin:SetSelectedRow(row)
if self:IsSelectedRow(row) then
-- Deselect current selected row
row:SetHighlightAtlas("voicechat-channellist-row-highlight");
row:UnlockHighlight()
self.selectedRow = nil
self:TriggerEvent(MessageListEvent.RowSelected)
else
-- Select a new row
self:UnhighlightAllRows()
self.selectedRow = row
if self.selectedRow then
self.selectedMessage = row.message
self:HighlightRow(self.selectedRow)
self:TriggerEvent(MessageListEvent.RowSelected, row.message, row.keyBindings)
else
self:TriggerEvent(MessageListEvent.RowSelected)
end
end
end
function MessageListMixin:UnhighlightAllRows()
for _, r in ipairs(self.messageRows) do
r:SetHighlightAtlas("voicechat-channellist-row-highlight");
r:UnlockHighlight()
end
end
function MessageListMixin:HighlightRow(row)
self.selectedRow:SetHighlightAtlas("voicechat-channellist-row-selected");
self.selectedRow:LockHighlight()
end
function MessageListMixin:IsSelectedRow(row)
return self.selectedRow ~= nil and self.selectedRow == row
end
function MessageListMixin:GetSelectedMessage()
return self.selectedMessage
end
function MessageListMixin:SelectMessage(message)
if message then
local rowIndex, messageRow = self:FindMessageRow(message.id)
if messageRow then
self:SetSelectedRow(messageRow)
end
else
self:SetSelectedRow()
end
end
function MessageListMixin:UpdateScrollBar()
self.Child:SetHeight(self:GetScrollFrameHeight());
--self.scrolling = frameHeight > self:GetHeight();
--self.ScrollBar:SetShown(self.scrolling);
end
function MessageListMixin:GetScrollFrameHeight()
local totalButtonHeight = 0
for _, messageRow in ipairs(self.messageRows) do
totalButtonHeight = totalButtonHeight + messageRow:GetHeight()
end
local totalButtonSpacing = BUTTON_SPACING * (#self.messageRows - 1)
return totalButtonHeight + totalButtonSpacing
end
function MessageListMixin:DeleteMessageRow(messageId)
local rowIndex, messageRow = self:FindMessageRow(messageId)
if rowIndex then
if self:IsSelectedRow(messageRow) then
self:SetSelectedRow()
end
table.remove(self.messageRows, rowIndex)
--local name = messageRow:GetName()
--if name and _G[name] then
-- _G[name] = nil
--end
-- This frame will never actually be removed, so hide it
messageRow:Hide()
-- TODO delete keybind
self:ResetMessageRowAnchors()
end
end
function MessageListMixin:UpdateKeyBindings()
if self.messageRows then
for _, row in ipairs(self.messageRows) do
row:UpdateKeyBindings()
end
end
end