View difference between Paste ID: 8rGBw4Yi and WEGEz70y
SHOW: | | - or go back to the newest paste.
1
local MODULE_NAME = "Actionbar"
2
local Core = LibStub("AceAddon-3.0"):GetAddon("BasicUI")
3
local Actionbar = Core:NewModule(MODULE_NAME)
4
local L = Core.L
5
6
local db
7
local defaults = {
8
	profile = {
9
		enable = true,
10
		showHotKeys = false,	    -- Set the Alpha
11
		showMacronames = false,	 -- Set the Alpha
12
		auraborder = false,
13
		color = {
14
			enable = true,
15
			OutOfRange = { r = 0.9, g = 0, b = 0 },
16
			OutOfMana = { r = 0, g = 0, b = 0.9 },
17
			NotUsable = { r = 0.3, g = 0.3, b = 0.3 },
18-
		if db.misc.classcolor then
18+
		},
19
	}
20
}
21-
			local color = db.actionbars.color
21+
22
------------------------------------------------------------------------
23
--	 Module functions
24
------------------------------------------------------------------------
25
26
local classColor
27
28
function Actionbar:OnInitialize()
29
	self.db = Core.db:RegisterNamespace(MODULE_NAME, defaults)
30
	db = self.db.profile
31
32
	local _, class = UnitClass("player")
33
	classColor = (CUSTOM_CLASS_COLORS or RAID_CLASS_COLORS)[class]
34
35
	self:SetEnabledState(Core:GetModuleEnabled(MODULE_NAME)
36
end
37
38
function Actionbar:OnEnable()
39
	if InCombatLockdown() then
40-
		if not normalTexture then
40+
		return self:RegisterEvent("PLAYER_REGEN_ENABLED", "OnEnable")
41-
			AddRegionKeys(button)
41+
42-
			normalTexture = button.__normalTexture2 or button.__normalTexture
42+
	self:UnregisterEvent("PLAYER_REGEN_ENABLED")
43
44
	if self.SetupHooks then
45
		self:SetupHooks()
46
	end
47
	
48
	self:Refresh()
49
end
50
51
function Actionbar:Refresh()
52
	db = self.db.profile
53
54
	local hotkeyAlpha = db.showHotKeys and 1 or 0
55
	for i = 1, 12 do
56
		_G["ActionButton"..i.."HotKey"]:SetAlpha(hotkeyAlpha) -- main bar
57
		_G["MultiBarBottomRightButton"..i.."HotKey"]:SetAlpha(hotkeyAlpha) -- bottom right bar
58
		_G["MultiBarBottomLeftButton"..i.."HotKey"]:SetAlpha(hotkeyAlpha) -- bottom left bar
59
		_G["MultiBarRightButton"..i.."HotKey"]:SetAlpha(hotkeyAlpha) -- right bar
60
		_G["MultiBarLeftButton"..i.."HotKey"]:SetAlpha(hotkeyAlpha) -- left bar
61
	end
62
63
	local macroAlpha = db.showMacronames and 1 or 0
64
	for i = 1, 12 do
65
		_G["ActionButton"..i.."Name"]:SetAlpha(macroAlpha) -- main bar
66
		_G["MultiBarBottomRightButton"..i.."Name"]:SetAlpha(macroAlpha) -- bottom right bar
67
		_G["MultiBarBottomLeftButton"..i.."Name"]:SetAlpha(macroAlpha) -- bottom left bar
68
		_G["MultiBarRightButton"..i.."Name"]:SetAlpha(macroAlpha) -- right bar
69
		_G["MultiBarLeftButton"..i.."Name"]:SetAlpha(macroAlpha) -- left bar
70
	end
71
end
72
73
function Module:SetupHooks()
74
	local function AddRegionKeys(self)
75
		local name = self:GetName()
76
		self.__name = _G[name.."Name"]
77
		self.__count = _G[name.."Count"]
78
		self.__hotkey = _G[name.."HotKey"]
79
		self.__border = _G[name.."Border"]
80
		self.__flash = _G[name.."Flash"]
81
		self.__normalTexture = _G[name.."NormalTexture"]
82
		self.__normalTexture2 = _G[name.."NormalTexture2"]
83
		self.__pushedTexture = self:GetPushedTexture()
84
		self.__highlightTexture = self:GetHighlightTexture()
85
		self.__checkedTexture = self:GetCheckedTexture()
86
		return name
87
	end
88
89
	local function ColorButton(texture)
90
		if core.db.profile.misc.classcolor then
91
			texture:SetVertexColor(classColor.r * 1.2, classColor.g * 1.2, classColor.b * 1.2)
92
		else
93
			local color = db.color
94
			texture:SetVertexColor(color.r, color.g, color.b)
95
		end
96
	end
97-
		if not db.actionbars.auraborder then return end
97+
98
	local function UpdateButton(button, iconOffset, borderOffset)
99
		if not button then return end
100
		iconOffset = iconOffset or 1
101
		borderOffset = borderOffset or 15
102
103
		button:SetNormalTexture("Interface\\BUTTONS\\UI-Quickslot2")
104
105
		local icon = button.icon
106
		icon:ClearAllPoints()
107
		icon:SetPoint("TOPLEFT", -iconOffset, iconOffset)
108
		icon:SetPoint("BOTTOMRIGHT", iconOffset, -iconOffset)
109
		icon:SetTexCoord(0.07, 0.93, 0.07, 0.93)
110
111
		local normalTexture = button.__normalTexture2 or button.__normalTexture
112
		normalTexture:ClearAllPoints()
113
		normalTexture:SetPoint("TOPLEFT", -borderOffset, borderOffset)
114
		normalTexture:SetPoint("BOTTOMRIGHT", borderOffset, -borderOffset)
115
116
		ColorButton(normalTexture)
117
	end
118
119
	local extraActionButtons = setmetatable({}, { __index = function(t, self)
120
		local name = AddRegionKeys(self)
121
		local v = not not strmatch(name, "ExtraActionButton")
122
		t[f] = v
123
		return v
124
	end })
125
126
	hooksecurefunc("ActionButton_Update", function(self)
127
		if not extraActionButtons[self] then
128
			UpdateButton(self, 0, 14)
129
		end
130
	end)
131
132
	hooksecurefunc("ActionButton_UpdateUsable", function(self)
133
		if not extraActionButtons[self] then
134
			ColorButton(self.__normalTexture)
135
		end
136
	end)
137
138
	hooksecurefunc("ActionButton_ShowGrid", function(self)
139
		if not extraActionButtons[self] then
140
			ColorButton(self.__normalTexture)
141
		end
142
	end)
143-
				local color = db.actionbars.color.OutOfMana
143+
144
	for i = 1, NUM_PET_ACTION_SLOTS do
145
		AddRegionKeys(_G["PetActionButton"..i])
146-
				local color = db.actionbars.color.NotUsable
146+
147
	hooksecurefunc("PetActionBar_Update", function()
148
		for i = 1, NUM_PET_ACTION_SLOTS do
149
			UpdateButton(_G["PetActionButton"..i])
150
		end
151
	end)
152
153
	for i = 1, NUM_POSSESS_SLOTS do
154
		AddRegionKeys(_G["PossessButton"..i])
155
	end
156-
					local color = db.actionbars.color.OutOfRange
156+
157
		for i = 1, NUM_POSSESS_SLOTS do
158
			UpdateButton(_G["PossessButton"..i])
159
		end
160
	end)
161
162
	for i = 1, NUM_STANCE_SLOTS do
163
		AddRegionKeys(_G["StanceButton"..i])
164
	end
165
	hooksecurefunc("StanceBar_UpdateState", function()
166
		for i = 1, NUM_STANCE_SLOTS do
167
			UpdateButton(_G["StanceButton"..i])
168
		end
169
	end)
170
171
	---------------------------------------------------------------------
172
173
	hooksecurefunc("AuraButton_Update", function(buttonName, index, filter)
174
		if not db.auraborder then return end
175
176
		local buffName = buttonName..index
177
		local self = _G[buffName]
178
		if not self.__border then AddRegionKeys(self) end
179
180
		local icon = self.icon
181
		if icon then
182
			icon:SetTexCoord(.07, .93, .07, .93)
183
		end
184
185
		local border = self.__border
186
		if not border then
187
			border = self:CreateTexture("$parentOverlay", "ARTWORK")
188
			self.__border = border
189
		end
190
		border:SetTexture("Interface\\BUTTONS\\UI-Quickslot2")
191
		border:ClearAllPoints()
192
		border:SetPoint("TOPLEFT", bu, -12, 12)
193
		border:SetPoint("BOTTOMRIGHT", bu, 12, -12)
194
		border:SetTexCoord(0, 1, 0, 1)
195
		ColorButton(border)
196
	end)
197
198
	---------------------------------------------------------------------
199
200
	local rangeAddons = {
201
		"GreenRange",
202
		"RangeColors",
203
		"RedRange",
204
		"tullaRange",
205
	}
206
	for i = 1, #rangeAddons do
207
		local _, _, _, enabled = GetAddOnInfo(rangeAddons[i])
208
		if enabled then
209
			rangeAddons = nil
210
			break
211
		end
212
	end
213
214
	if rangeAddons then
215
		hooksecurefunc("ActionButton_UpdateUsable", function(self)
216
			local isUsable, notEnoughMana = IsUsableAction(self.action)
217
			if isUsable then
218
				self.icon:SetVertexColor(1, 1, 1)
219
			elseif notEnoughMana then
220
				local color = db.color.OutOfMana
221
				self.icon:SetVertexColor(color.r, color.g, color.b)
222
			else
223
				local color = db.color.NotUsable
224
				self.icon:SetVertexColor(color.r, color.g, color.b)
225
			end
226
		end)
227
228
		hooksecurefunc("ActionButton_OnUpdate", function(self, elapsed)
229
			local rangeTimer = self.rangeTimer2 or 0
230
			rangeTimer = rangeTimer - elapsed
231
			if rangeTimer <= 0 then
232
				if IsActionInRange(self.action) == 0 then
233
					local color = db.color.OutOfRange
234
					self.icon:SetVertexColor(color.r, color.g, color.b)
235
				end
236
				rangeTimer = TOOLTIP_UPDATE_TIME
237
			end
238
			self.rangeTimer2 = rangeTimer
239
		end)
240
	end
241
242
	self.SetupHooks = nil
243
end
244
245
------------------------------------------------------------------------
246
--	 Module options
247
------------------------------------------------------------------------
248
249
local options
250
function Actionbar:GetOptions()
251
	if options then
252
		return options
253
	end
254
255
	local function isModuleDisabled()
256
		return not Core:GetModuleEnabled(MODULE_NAME)
257
	end
258
259
	options = {
260
		type = "group",
261
		name = L[MODULE_NAME],
262
		get = function(info) return db[ info[#info] ] end,
263
		set = function(info, value) db[ info[#info] ] = value end,
264
		disabled = isModuleDisabled,
265
		args = {
266
			enable = {
267
				type = "toggle",
268
				order = 1,
269
				name = L["Enable"],
270
				desc = L["Enable the Actionbar module."],
271
				width = "full",
272
				disabled = false,
273
			},
274
			auraborder = {
275
				type = "toggle",
276
				name = L["Aura borders"],
277
				desc = L["Show colored borders on action buttons to show when auras are active."],
278
			},
279
			showHotKeys = {
280
				type = "toggle",
281
				name = L["Show Hot Keys"],
282
				desc = L["Show key bindings on action buttons."],
283
			},
284
			showMacronames = {
285
				type = "toggle",
286
				name = L["Show Macro Names"],
287
				desc = L["Show macro names on action buttons."],
288
			},
289
			color = {
290
				type = "group",
291
				order = -1,
292
				name = L["Button Coloring"],
293
				guiInline  = true,
294
				get = function(info)
295
					local v = db.color[ info[#info] ]
296
					return v.r, v.g, v.b
297
				end,
298
				set = function(info, r, g, b)
299
					local v = db.color[ info[#info] ]
300
					v.r, v.g, v.b = r, g, b
301
				end,
302
				disabled = function() return isModuleDisabled() or not db.color.enable end,
303
				args = {
304
					enable = {
305
						order = 1,
306
						type = "toggle",
307
						name = L["Enable"],
308
						desc = L["Enable action button coloring."],
309
						width = "full",
310
						disabled = isModuleDisabled,
311
					},
312
					OutOfRange = {
313
						order = 2,
314
						type = "color",
315
						name = L["Out of Range"],
316
						desc = L["Use this color for actions you are too far from the target to use."],
317
					},
318
					OutOfMana = {
319
						order = 3,
320
						type = "color",
321
						name = L["Out of Mana"],
322
						desc = L["Use this color for actions you don't have enough mana to use."],
323
					},
324
					NotUsable = {
325
						order = 4,
326
						type = "color",
327
						name = L["Not Usable"],
328
						desc = L["Use this color for actions you can't use for some other reason."],
329
					}
330
				}
331
			}
332
		}
333
	}
334
	return options
335
end