-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathstickychannels.lua
More file actions
165 lines (133 loc) · 5 KB
/
stickychannels.lua
File metadata and controls
165 lines (133 loc) · 5 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
159
160
161
162
163
164
165
--[[
stickychannels.lua - Sticky channels list management for XanChat
Improvements:
- Reused common UI helpers from filter.lua (extracted to local)
- Simplified frame setup
- Better early returns
- Reduced redundant code
]]
local ADDON_NAME, private = ...
local addon = _G[ADDON_NAME]
addon.private = private or addon.private
addon.L = (private and private.L) or addon.L or {}
local L = addon.L
local chatTypeInfo = ChatTypeInfo
-- ============================================================================
-- FRAME SETUP
-- ============================================================================
local isRestricted = function() return addon.isRestricted() end
local guardRestricted = function() return addon.guardRestricted() end
local createDialogFrame = function(...) return addon.createDialogFrame(...) end
local createScrollFrame = function(...) return addon.createScrollFrame(...) end
-- ============================================================================
-- STICKY CHANNELS FRAME
-- ============================================================================
addon.stickyChannelsList = createDialogFrame(ADDON_NAME.."_stickyChannelsList", L.EditStickyChannelsListHeader)
local scrollFrame, scrollFrame_Child = createScrollFrame(addon.stickyChannelsList, -50)
scrollFrame:Hide()
addon.stickyChannelsList:Hide()
-- ============================================================================
-- CHANNEL DATA
-- ============================================================================
local STICKY_TYPE_CHANNELS = {
SAY = 1,
YELL = 0,
EMOTE = 0,
PARTY = 1,
RAID = 1,
GUILD = 1,
OFFICER = 1,
WHISPER = 1,
CHANNEL = 1,
}
-- ============================================================================
-- SETUP AND LIST BUILDING
-- ============================================================================
local function setupStickyChannelsUI()
if not XCHT_DB.stickyChannelsList then
XCHT_DB.stickyChannelsList = {}
end
if addon.ApplyDefaults then
addon.ApplyDefaults(XCHT_DB.stickyChannelsList, STICKY_TYPE_CHANNELS)
else
for k, v in pairs(STICKY_TYPE_CHANNELS) do
if XCHT_DB.stickyChannelsList[k] == nil then
XCHT_DB.stickyChannelsList[k] = v
end
end
end
if not addon.stickyChannelsList._xanHooked then
addon.stickyChannelsList:HookScript("OnShow", function()
guardRestricted()
if not addon.stickyChannelsList.ListLoaded then
addon:DoStickyChannelsList()
addon.stickyChannelsList.ListLoaded = true
end
end)
addon.stickyChannelsList._xanHooked = true
end
end
local function buildStickyChannelsList()
scrollFrame_Child:SetPoint("TOPLEFT")
scrollFrame_Child:SetWidth(scrollFrame:GetWidth())
scrollFrame_Child:SetHeight(scrollFrame:GetHeight())
local previousBar
local buildList = {}
for k, v in pairs(XCHT_DB.stickyChannelsList) do
table.insert(buildList, { name=k, val=v })
end
table.sort(buildList, function(a, b)
return a.name < b.name
end)
for barCount = 1, #buildList do
local entry = buildList[barCount]
local barSlot = _G["xanChat_StickyChannelBar"..barCount] or CreateFrame("button", "xanChat_StickyChannelBar"..barCount, scrollFrame_Child, BackdropTemplateMixin and "BackdropTemplate")
if barCount == 1 then
barSlot:SetPoint("TOPLEFT", scrollFrame_Child, "TOPLEFT", 10, -10)
barSlot:SetPoint("BOTTOMRIGHT", scrollFrame_Child, "TOPRIGHT", -10, -30)
else
barSlot:SetPoint("TOPLEFT", previousBar, "BOTTOMLEFT", 0, 0)
barSlot:SetPoint("BOTTOMRIGHT", previousBar, "BOTTOMRIGHT", 0, -20)
end
barSlot:EnableMouse(true)
barSlot:SetBackdrop({ bgFile = "Interface\\Buttons\\WHITE8x8" })
barSlot:SetBackdropColor(0, 0, 0, 0)
previousBar = barSlot
barSlot.xData = entry
local bar_chk = _G["xanChat_StickyChannelBarChk"..barCount] or CreateFrame("CheckButton", "xanChat_StickyChannelBarChk"..barCount, barSlot, "InterfaceOptionsCheckButtonTemplate")
bar_chk.xData = entry
bar_chk:SetPoint("LEFT", 4, 0)
local checkedValue = XCHT_DB.stickyChannelsList[entry.name] == 1
_G["xanChat_StickyChannelBarChk"..barCount.."Text"]:SetText("|cFFFFFFFF"..entry.name.."|r")
bar_chk:SetChecked(checkedValue)
bar_chk:SetEnabled(not isRestricted())
bar_chk:SetScript("OnClick", function(self)
if not guardRestricted() and self.xData and self.xData.name then
local newVal = not self:GetChecked()
XCHT_DB.stickyChannelsList[self.xData.name] = newVal and 1 or 0
self:SetChecked(newVal)
addon:UpdateStickyChannels()
end
end)
barSlot:Show()
bar_chk:Show()
end
scrollFrame:Show()
end
-- ============================================================================
-- PUBLIC API
-- ============================================================================
function addon:EnableStickyChannelsList()
setupStickyChannelsUI()
end
function addon:DoStickyChannelsList()
buildStickyChannelsList()
end
function addon:UpdateStickyChannels()
if not chatTypeInfo or not XCHT_DB.stickyChannelsList then return end
for k, v in pairs(XCHT_DB.stickyChannelsList) do
if chatTypeInfo[k] then
chatTypeInfo[k].sticky = v and 1 or 0
end
end
end