vrtc / chorus (public) (License: CC0) (since 2023-08-12) (hash sha1)
World of Warcraft add-on stub. The overall goal is to create a specialized raid frame.
List of commits:
Subject Hash Author Date (UTC)
fix(test)!: Add primitive test mockups f2b7fcf2058c7c1b61ef43241f55e92a5113bf57 Vladyslav Bondarenko 2023-08-26 16:55:54
feat(build): Update project descriptors for 0.3 740e01cc3a8888e0500ce213d7901f66625919ab Vladyslav Bondarenko 2023-08-25 21:15:10
feat: Add solo target of target f11b332540168ff42f4f9b53abd87b8b2a09db65 Vladyslav Bondarenko 2023-08-25 20:44:27
feat: Add player pet button to solo frame 00e67525cafb6db5256cd43ecf8a7f510354b88f Vladyslav Bondarenko 2023-08-25 19:58:10
fix: Hide power (mana) bar when appropriate e307bbfdabbe63faed3a7de9e0152639418496b8 Vladyslav Bondarenko 2023-08-25 19:56:53
feat!: Add party frame f50f93dc80f86f8fb280836366252520fd417b29 Vladyslav Bondarenko 2023-08-25 18:18:24
fix!: Toggle frame visibility with unit watch 3ab89d1ee3ae8d2a1afa94610140767b28f12c6a Vladyslav Bondarenko 2023-08-25 18:09:32
feat!: Add target of target or raid target units af78c022d560f964fd38e973491a4e815bf13275 Vladyslav Bondarenko 2023-08-25 18:03:08
fix!: Hidden unit buttons obstruct mouse clicks d746f12ffb2a6e87968c80224cc8a2f5485a4c76 Vladyslav Bondarenko 2023-08-25 13:51:56
feat: Add unit level to huge unit buttons 57c502e2ea48241401428e7de523e2672911b2c6 Vladyslav Bondarenko 2023-08-25 13:13:05
feat!: Add cast bar for huge unit buttons f921c3e2c1417036981f9e7ac9d070d66e4d7d19 Vladyslav Bondarenko 2023-08-25 11:38:37
fix: Add threat and range widgets to large buttons 8956671551dbd110d2f62b482579851f5283a065 Vladyslav Bondarenko 2023-08-25 09:36:02
fix: Filter out irrelevant events for status bars d11036a029bb51458c5bc592baf592463a05f11a Vladyslav Bondarenko 2023-08-25 09:02:07
feat: When group member out of range fade out e1b06d6c96ddceb3aa35ad5cc249671a5c1bf852 Vladyslav Bondarenko 2023-08-25 08:58:53
fix: Add unit tooltip 9b853289a7730a8783f02691c944492e0ef53f86 Vladyslav Bondarenko 2023-08-25 08:15:33
fix: Yet another health bar sanitization 979af69272eec06c45cb300132bc020a91a180c2 Vladyslav Bondarenko 2023-08-24 03:52:05
feat(build): Add stub RocketGit hook b1a0bb523fb570ee7cc73776bfbba1a6886e685f Vladyslav Bondarenko 2023-08-23 23:59:35
feat(build): Add 0.2-1 rockspec 92a2b006a47f1a242bbb08467c431362d64d6ef8 Vladyslav Bondarenko 2023-08-23 23:31:41
fix!: Use native mechanism of inheriting values 6a2ebf1aa52e4a300b4ad959670878b292140c4f Vladyslav Bondarenko 2023-08-23 23:05:39
fix: Typo in unit button template anchor 98027a2779639493c97c4259b61cb53d25709255 Vladyslav Bondarenko 2023-08-23 22:06:16
Commit f2b7fcf2058c7c1b61ef43241f55e92a5113bf57 - fix(test)!: Add primitive test mockups
Shadow functions that the environment provides, to test the add-ons
features in a controlled environment, without needing to query real
server state.
Author: Vladyslav Bondarenko
Author date (UTC): 2023-08-26 16:55
Committer name: Vladyslav Bondarenko
Committer date (UTC): 2023-08-26 20:03
Parent(s): 1c8dcb8a7f1d3253ef32dae5a650e11e4ae8c184
Signer:
Signing key: EFF9624877D25D02
Signing status: E
Tree: a993c0592dfcf0d3da678392ab8b9d111372a567
File Lines added Lines deleted
src/Chorus.lua 3 1
src/Chorus.xml 3 0
src/ChorusAuraButtonTemplate.lua 5 5
src/ChorusCastFrameTemplate.lua 7 6
src/ChorusPartyFrame.lua 4 4
src/ChorusProgressFrameTemplate.lua 17 14
src/ChorusRaidTargetIconFrameTemplate.lua 6 0
src/ChorusTest.lua 223 0
src/ChorusThreatFrameTemplate.lua 7 1
src/ChorusUnitButtonTemplate.lua 10 8
src/ChorusUnitNameFrameTemplate.lua 10 5
File src/Chorus.lua changed (mode: 100644) (index 01b2c33..87f5b78)
1 Chorus = {}
1 Chorus = {
2 test = {},
3 }
File src/Chorus.xml changed (mode: 100644) (index b912c19..25f176a)
1 1 <?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
2 2 <Ui xmlns="http://www.blizzard.com/wow/ui/"> <Ui xmlns="http://www.blizzard.com/wow/ui/">
3 3 <Script file="Chorus.lua"/> <Script file="Chorus.lua"/>
4 <!-- Exclude ChorusTest.lua script in release stable version.
5 Only include ChorusTest.lua script for development. -->
6 <Script file="ChorusTest.lua"/>
4 7 <Include file="ChorusFont.xml"/> <Include file="ChorusFont.xml"/>
5 8 <Include file="ChorusAuraButtonTemplate.xml"/> <Include file="ChorusAuraButtonTemplate.xml"/>
6 9 <Include file="ChorusAuraFrameTemplate.xml"/> <Include file="ChorusAuraFrameTemplate.xml"/>
File src/ChorusAuraButtonTemplate.lua changed (mode: 100644) (index 01a6f6f..460a589)
1 local Chorus = Chorus
2
1 3 local DebuffTypeColor = DebuffTypeColor local DebuffTypeColor = DebuffTypeColor
2 4 local GameTooltip = GameTooltip local GameTooltip = GameTooltip
3 5 local GetTime = GetTime local GetTime = GetTime
4 local UnitAura = UnitAura
5 local UnitExists = UnitExists
6 local UnitIsConnected = UnitIsConnected
7
8 local Chorus = Chorus
6 local UnitAura = Chorus.test.UnitAura or UnitAura
7 local UnitExists = Chorus.test.UnitExists or UnitExists
8 local UnitIsConnected = Chorus.test.UnitIsConnected or UnitIsConnected
9 9
10 10 local function auraButtonValidate(auraButton) local function auraButtonValidate(auraButton)
11 11 assert(auraButton ~= nil) assert(auraButton ~= nil)
File src/ChorusCastFrameTemplate.lua changed (mode: 100644) (index 21fcc6e..7c0c394)
1 local Chorus = Chorus
2
1 3 local GetTime = GetTime local GetTime = GetTime
2 local UnitCastingInfo = UnitCastingInfo
3 local UnitChannelInfo = UnitChannelInfo
4 local UnitExists = UnitExists
4 local UnitCastingInfo = Chorus.test.UnitCastingInfo or UnitCastingInfo
5 local UnitChannelInfo = Chorus.test.UnitChannelInfo or UnitChannelInfo
6 local UnitExists = Chorus.test.UnitExists or UnitExists
7 local UnitIsUnit = Chorus.test.UnitIsUnit or UnitIsUnit
5 8 local tContains = tContains local tContains = tContains
6 9
7 local SecureButton_GetUnit = SecureButton_GetUnit
8
9 local Chorus = Chorus
10 local SecureButton_GetUnit = Chorus.test.SecureButton_GetUnit or SecureButton_GetUnit
10 11
11 12 local function castFrameEventIsRelevant(self, eventCategory, ...) local function castFrameEventIsRelevant(self, eventCategory, ...)
12 13 assert(self ~= nil) assert(self ~= nil)
File src/ChorusPartyFrame.lua changed (mode: 100644) (index a9c27a6..466b3c4)
1 local GetNumPartyMembers = GetNumPartyMembers
2 local UnitInParty = UnitInParty
3 local UnitInRaid = UnitInRaid
4
5 1 local Chorus = Chorus local Chorus = Chorus
6 2
3 local GetNumPartyMembers = Chorus.test.GetNumPartyMembers or GetNumPartyMembers
4 local UnitInParty = Chorus.test.UnitInParty or UnitInParty
5 local UnitInRaid = Chorus.test.UnitInRaid or UnitInRaid
6
7 7 local function partyFrameEventProcessor(self) local function partyFrameEventProcessor(self)
8 8 assert(self ~= nil) assert(self ~= nil)
9 9
File src/ChorusProgressFrameTemplate.lua changed (mode: 100644) (index 4098d56..10c1960)
1 local Chorus = Chorus
2
3 local UnitClass = Chorus.test.UnitClass or UnitClass
4 local UnitExists = Chorus.test.UnitExists or UnitExists
5 local UnitHealth = Chorus.test.UnitHealth or UnitHealth
6 local UnitHealthMax = Chorus.test.UnitHealthMax or UnitHealthMax
7 local UnitIsConnected = Chorus.test.UnitIsConnected or UnitIsConnected
8 local UnitIsCorpse = Chorus.test.UnitIsCorpse or UnitIsCorpse
9 local UnitIsDead = Chorus.test.UnitIsDead or UnitIsDead
10 local UnitIsGhost = Chorus.test.UnitIsGhost or UnitIsGhost
11 local UnitIsPlayer = Chorus.test.UnitIsPlayer or UnitIsPlayer
12 local UnitPower = Chorus.test.UnitPower or UnitPower
13 local UnitPowerMax = Chorus.test.UnitPowerMax or UnitPowerMax
14 local UnitPowerType = Chorus.test.UnitPowerType or UnitPowerType
15
1 16 local PowerBarColor = PowerBarColor local PowerBarColor = PowerBarColor
2 17 local RAID_CLASS_COLORS = RAID_CLASS_COLORS local RAID_CLASS_COLORS = RAID_CLASS_COLORS
3 local UnitClass = UnitClass
4 local UnitExists = UnitExists
5 local UnitHealth = UnitHealth
6 local UnitHealthMax = UnitHealthMax
7 local UnitIsConnected = UnitIsConnected
8 local UnitIsCorpse = UnitIsCorpse
9 local UnitIsDead = UnitIsDead
10 local UnitIsGhost = UnitIsGhost
11 local UnitPower = UnitPower
12 local UnitPowerMax = UnitPowerMax
13 local UnitPowerType = UnitPowerType
14 local RegisterUnitWatch = RegisterUnitWatch
15
16 local Chorus = Chorus
18 local RegisterUnitWatch = Chorus.test.RegisterUnitWatch or RegisterUnitWatch
19 local SecureButton_GetUnit = Chorus.test.SecureButton_GetUnit or SecureButton_GetUnit
17 20
18 21 local function validateProgressFrame(self) local function validateProgressFrame(self)
19 22 assert(self ~= nil) assert(self ~= nil)
File src/ChorusRaidTargetIconFrameTemplate.lua changed (mode: 100644) (index 444488f..1c06436)
1 1 local Chorus = Chorus local Chorus = Chorus
2 2
3 local UnitExists = Chorus.test.UnitExists or UnitExists
4 local UnitIsConnected = Chorus.test.UnitIsConnected or UnitIsConnected
5 local GetRaidTargetIndex = GetRaidTargetIndex
6
7 local RegisterUnitWatch = Chorus.test.RegisterUnitWatch or RegisterUnitWatch
8 local SecureButton_GetUnit = Chorus.test.SecureButton_GetUnit or SecureButton_GetUnit
3 9 --[[ See FrameXML/TargetFrame.lua:682 ]]-- --[[ See FrameXML/TargetFrame.lua:682 ]]--
4 10 local SetRaidTargetIconTexture = SetRaidTargetIconTexture local SetRaidTargetIconTexture = SetRaidTargetIconTexture
5 11
File src/ChorusTest.lua added (mode: 100644) (index 0000000..fd95905)
1 local t = {
2 focus = {},
3 party1 = {UnitIsPlayer = true, UnitClass = {'Warrior', 'WARRIOR'}, UnitPowerType = {1, 'RAGE'}, UnitPower = 13, UnitPowerMax = 100},
4 party1target = {},
5 party2 = {UnitIsPlayer = true, UnitClass = {'Priest', 'PRIEST'}, UnitPowerType = {0, 'MANA'}},
6 party2target = {},
7 party3 = {UnitIsPlayer = true, UnitClass = {'Warlock', 'WARLOCK'}, UnitPowerType = {0, 'MANA'}},
8 party3target = {},
9 party4 = {UnitIsPlayer = true, UnitClass = {'Mage', 'MAGE'}, UnitPowerType = {0, 'MANA'}, UnitIsDead = true, UnitHealth = 0},
10 party4target = {},
11 partypet1 = {},
12 partypet2 = {},
13 partypet3 = {},
14 partypet4 = {},
15 pet = {},
16 player = {UnitIsPlayer = true, UnitClass = {'Paladin', 'PALADIN'}, UnitPowerType = {0, 'MANA'}},
17 target = {},
18 }
19
20 local function recordGet(u, key)
21 local r = t[u]
22 if r then
23 local e = r[key]
24 if e and 'table' == type(e) then
25 return unpack(e)
26 else
27 return e
28 end
29 end
30 return
31 end
32
33 local function GetNumPartyMembers_Mock()
34 return 4
35 end
36
37 local function UnitAura_Mock(u, i, filter)
38 if u and i > 36 then
39 return nil
40 end
41
42 if 'HARMFUL' == string.match(filter, 'HARMFUL') then
43 return 'Poison', '', 'Interface\\Icons\\Spell_Nature_CorrosiveBreath', 0, 'Poison', 30, GetTime(), nil, nil, nil, 744
44 else
45 return 'Blessing of Wisdom', 'Rank 1', 'Interface\\Icons\\Spell_Holy_SealOfWisdom', 0, 'Magic', 600, GetTime(), 'player', nil, 1, 19742
46 end
47 end
48
49 local function UnitCastingInfo_Mock()
50 --[[ TODO UnitCastingInfo mock ]]--
51 return
52 end
53
54 local function UnitChannelInfo_Mock()
55 --[[ TODO UnitChannelInfo mock ]]--
56 return
57 end
58
59 local function UnitClass_Mock(u)
60 return recordGet(u, 'UnitClass')
61 end
62
63 local function UnitExists_Mock(u)
64 if 'none' == u then
65 return false
66 end
67 return true
68 end
69
70 local function UnitHealth_Mock(u)
71 local r = recordGet(u, 'UnitHealth')
72 if r then
73 return r
74 end
75 return math.random(1, 1000 * 1000)
76 end
77
78 local function UnitHealthMax_Mock(u)
79 local r = recordGet(u, 'UnitHealthMax')
80 if r then
81 return r
82 end
83 return 1000 * 1000
84 end
85
86 local function UnitInParty_Mock(u)
87 return tContains({'player', 'party1', 'party2', 'party3', 'party4',}, u)
88 end
89
90 local function UnitInRaid_Mock(u)
91 return 'raid' == string.match(u, 'raid')
92 end
93
94 local function UnitInRange_Mock()
95 return true
96 end
97
98 local function UnitIsConnected_Mock(u)
99 if 'none' == u then
100 return false
101 end
102 return true
103 end
104
105 local function UnitIsCorpse_Mock(u)
106 return recordGet(u, 'UnitIsCorpse') or false
107 end
108
109 local function UnitIsDead_Mock(u)
110 return recordGet(u, 'UnitIsDead') or false
111 end
112
113 local function UnitIsFriend_Mock(u)
114 if 'target' == u or 'focus' == u then
115 return false
116 elseif string.len(u) > string.len('target') and 'target' == string.match(u, 'target') then
117 return false
118 else
119 return true
120 end
121 end
122
123 local function UnitIsGhost_Mock()
124 return false
125 end
126
127 local function UnitIsPlayer_Mock(u)
128 if 'target' == u or 'focus' == u or 'pet' == u then
129 return false
130 elseif string.len(u) > string.len('pet') and 'pet' == string.match(u, 'pet') then
131 return false
132 elseif string.len(u) > string.len('target') and 'target' == string.match(u, 'target') then
133 return false
134 else
135 return true
136 end
137 end
138
139 local function UnitIsUnit_Mock(u0, u1)
140 return u0 == u1
141 end
142
143 local function UnitLevel_Mock(u)
144 local r = recordGet(u, 'UnitLevel')
145 if r then
146 return r
147 end
148
149 return 81
150 end
151
152 local function UnitName_Mock(u)
153 return string.upper(string.sub(u, 1, 1)) .. string.lower(string.sub(u, 2, string.len(u)))
154 end
155
156 local function UnitPower_Mock(u)
157 local r = recordGet(u, 'UnitPower')
158 if r then
159 return recordGet(u, 'UnitPower')
160 end
161 return math.random(1, 1000 * 1000)
162 end
163
164 local function UnitPowerMax_Mock(u)
165 local r = recordGet(u, 'UnitPowerMax')
166 if r then
167 return recordGet(u, 'UnitPowerMax')
168 end
169 return 1000 * 1000
170 end
171
172 local function UnitPowerType_Mock(u)
173 local r = recordGet(u, 'UnitPowerType')
174 if r then
175 return recordGet(u, 'UnitPowerType')
176 end
177 return 0, 'MANA'
178 end
179
180 local function RegisterUnitWatch_Mock()
181 --[[ call DoNothing() ]]--
182 return
183 end
184
185 local function SecureButton_GetUnit_Mock(self)
186 local p = self:GetParent()
187 return self:GetAttribute('unit') or p:GetAttribute('unit')
188 end
189
190 local function UnregisterUnitWatch_Mock()
191 --[[ call DoNothing() ]]--
192 return
193 end
194
195 Chorus.test = {
196 GetNumPartyMembers = GetNumPartyMembers_Mock,
197 UnitAura = UnitAura_Mock,
198 UnitCastingInfo = UnitCastingInfo_Mock,
199 UnitChannelInfo = UnitChannelInfo_Mock,
200 UnitClass = UnitClass_Mock,
201 UnitExists = UnitExists_Mock,
202 UnitHealth = UnitHealth_Mock,
203 UnitHealthMax = UnitHealthMax_Mock,
204 UnitInParty = UnitInParty_Mock,
205 UnitInRaid = UnitInRaid_Mock,
206 UnitInRange = UnitInRange_Mock,
207 UnitIsConnected = UnitIsConnected_Mock,
208 UnitIsCorpse = UnitIsCorpse_Mock,
209 UnitIsDead = UnitIsDead_Mock,
210 UnitIsFriend = UnitIsFriend_Mock,
211 UnitIsGhost = UnitIsGhost_Mock,
212 UnitIsPlayer = UnitIsPlayer_Mock,
213 UnitIsUnit = UnitIsUnit_Mock,
214 UnitLevel = UnitLevel_Mock,
215 UnitName = UnitName_Mock,
216 UnitPower = UnitPower_Mock,
217 UnitPowerMax = UnitPowerMax_Mock,
218 UnitPowerType = UnitPowerType_Mock,
219
220 RegisterUnitWatch = RegisterUnitWatch_Mock,
221 SecureButton_GetUnit = SecureButton_GetUnit_Mock,
222 UnregisterUnitWatch = UnregisterUnitWatch_Mock,
223 }
File src/ChorusThreatFrameTemplate.lua changed (mode: 100644) (index 4b8d18d..169808e)
1 local Chorus = Chorus
2
1 3 local GetThreatStatusColor = GetThreatStatusColor local GetThreatStatusColor = GetThreatStatusColor
4 local UnitExists = Chorus.test.UnitExists or UnitExists
5 local UnitIsConnected = Chorus.test.UnitIsConnected or UnitIsConnected
6 local UnitIsFriend = Chorus.test.UnitIsFriend or UnitIsFriend
2 7 local UnitThreatSituation = UnitThreatSituation local UnitThreatSituation = UnitThreatSituation
3 8
4 local Chorus = Chorus
9 local RegisterUnitWatch = Chorus.test.RegisterUnitWatch or RegisterUnitWatch
10 local SecureButton_GetUnit = Chorus.test.SecureButton_GetUnit or SecureButton_GetUnit
5 11
6 12 local function threatFrameEventProcessor(self) local function threatFrameEventProcessor(self)
7 13 assert(self ~= nil) assert(self ~= nil)
File src/ChorusUnitButtonTemplate.lua changed (mode: 100644) (index a3e0588..20d8c85)
1 local Chorus = Chorus
2
1 3 local GameTooltip = GameTooltip local GameTooltip = GameTooltip
2 4 local GameTooltipTextLeft1 = GameTooltipTextLeft1 local GameTooltipTextLeft1 = GameTooltipTextLeft1
3 5
4 6 local GameTooltip_SetDefaultAnchor = GameTooltip_SetDefaultAnchor local GameTooltip_SetDefaultAnchor = GameTooltip_SetDefaultAnchor
5 7 local GameTooltip_UnitColor = GameTooltip_UnitColor local GameTooltip_UnitColor = GameTooltip_UnitColor
6 local SecureButton_GetUnit = SecureButton_GetUnit
7 local UnitExists = UnitExists
8 local UnitInParty = UnitInParty
9 local UnitInRaid = UnitInRaid
10 local UnitInRange = UnitInRange
11 local UnitIsConnected = UnitIsConnected
12
13 local Chorus = Chorus
8 local RegisterUnitWatch = Chorus.test.RegisterUnitWatch or RegisterUnitWatch
9 local SecureButton_GetUnit = Chorus.test.SecureButton_GetUnit or SecureButton_GetUnit
10
11 local UnitExists = Chorus.test.UnitExists or UnitExists
12 local UnitInParty = Chorus.test.UnitInParty or UnitInParty
13 local UnitInRaid = Chorus.test.UnitInRaid or UnitInRaid
14 local UnitInRange = Chorus.test.UnitInRange or UnitInRange
15 local UnitIsConnected = Chorus.test.UnitIsConnected or UnitIsConnected
14 16
15 17 --[[ TODO Add incoming healing bar. ]]-- --[[ TODO Add incoming healing bar. ]]--
16 18 --[[ TODO Add incoming resurrection indicator. ]]-- --[[ TODO Add incoming resurrection indicator. ]]--
File src/ChorusUnitNameFrameTemplate.lua changed (mode: 100644) (index 51cb554..b6996c6)
1 local RAID_CLASS_COLORS = RAID_CLASS_COLORS
2 local UnitClass = UnitClass
3 local UnitIsPlayer = UnitIsPlayer
4 local UnitName = UnitName
5
6 1 local Chorus = Chorus local Chorus = Chorus
7 2
3 local UnitClass = Chorus.test.UnitClass or UnitClass
4 local UnitExists = Chorus.test.UnitExists or UnitExists
5 local UnitIsConnected = Chorus.test.UnitIsConnected or UnitIsConnected
6 local UnitIsPlayer = Chorus.test.UnitIsPlayer or UnitIsPlayer
7 local UnitName = Chorus.test.UnitName or UnitName
8
9 local RAID_CLASS_COLORS = RAID_CLASS_COLORS
10 local RegisterUnitWatch = Chorus.test.RegisterUnitWatch or RegisterUnitWatch
11 local SecureButton_GetUnit = Chorus.test.SecureButton_GetUnit or SecureButton_GetUnit
12
8 13 local function unitNameEventProcessor(self) local function unitNameEventProcessor(self)
9 14 assert(self ~= nil) assert(self ~= nil)
10 15
Hints:
Before first commit, do not forget to setup your git environment:
git config --global user.name "your_name_here"
git config --global user.email "your@email_here"

Clone this repository using HTTP(S):
git clone https://rocketgit.com/user/vrtc/chorus

Clone this repository using ssh (do not forget to upload a key first):
git clone ssh://rocketgit@ssh.rocketgit.com/user/vrtc/chorus

Clone this repository using git:
git clone git://git.rocketgit.com/user/vrtc/chorus

You are allowed to anonymously push to this repository.
This means that your pushed commits will automatically be transformed into a merge request:
... clone the repository ...
... make some changes and some commits ...
git push origin main