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)
feat!: Add target aura tracker 96105088fc793845cde21639e0221b82de897262 Vladyslav Bondarenko 2023-08-12 21:49:26
Commit 96105088fc793845cde21639e0221b82de897262 - feat!: Add target aura tracker
Add a frame to the middle of the screen that shows buffs and debuffs
applied to the current target.

The most notable feature is sorting the buffs and debuffs by relevance
and grouping them by category.
Author: Vladyslav Bondarenko
Author date (UTC): 2023-08-12 21:49
Committer name: Vladyslav Bondarenko
Committer date (UTC): 2023-08-12 21:49
Parent(s):
Signer:
Signing key: EFF9624877D25D02
Signing status: E
Tree: 38a2fe1db71714db37dcc0bac5de18c616ef5d52
File Lines added Lines deleted
chorus.toc 8 0
etc/luacheckrc.lua 41 0
share/xml/FrameXML/UI.xsd 959 0
src/Chorus.lua 1 0
src/Chorus.xml 4 0
src/ChorusAuraButtonTemplate.lua 210 0
src/ChorusAuraButtonTemplate.xml 57 0
src/ChorusAuraFrameTemplate.lua 195 0
src/ChorusAuraFrameTemplate.xml 68 0
src/ChorusTestFrame.xml 44 0
File chorus.toc added (mode: 100644) (index 0000000..b39728b)
1 ##Interface: 30300
2 ##Notes: This is a stub for a raid frame add-on
3 ##Title: Chorus
4 ##Version: 0
5 src\Chorus.xml
6 src\ChorusAuraButtonTemplate.xml
7 src\ChorusAuraFrameTemplate.xml
8 src\ChorusTestFrame.xml
File etc/luacheckrc.lua added (mode: 100644) (index 0000000..f91abab)
1 --[[ http://luacheck.readthedocs.io/en/stable/config.html ]]--
2 stds.wow = {
3 read_globals = {
4 'CreateFrame',
5 'DebuffTypeColor',
6 'GetPlayerInfoByGUID',
7 'GetSpellInfo',
8 'GetSpellTexture',
9 'GetTime',
10 'RAID_CLASS_COLORS',
11 'UIParent',
12 'UnitAura',
13 'UnitExists',
14 'UnitGUID',
15 'date',
16 'strtrim',
17 'tContains',
18 'time',
19 'unpack',
20 },
21 globals = {
22 },
23 }
24
25 stds.unifont = {
26 read_globals = {
27 'Unifont12Regular',
28 'Unifont16Regular',
29 'Unifont20Regular',
30 }
31 }
32
33 stds.chorus = {
34 read_globals = {
35 },
36 globals = {
37 'Chorus',
38 },
39 }
40
41 std = 'min+wow+unifont+chorus'
File share/xml/FrameXML/UI.xsd added (mode: 100644) (index 0000000..9c8342c)
1 <?xml version="1.0" encoding="UTF-8"?>
2 <!-- edited with XMLSpy v2005 sp2 U (http://www.altova.com) by Sam Lantinga (Blizzard Entertainment) -->
3 <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="http://www.blizzard.com/wow/ui/" xmlns:ui="http://www.blizzard.com/wow/ui/" targetNamespace="http://www.blizzard.com/wow/ui/" elementFormDefault="qualified" attributeFormDefault="unqualified">
4 <xs:simpleType name="FRAMEPOINT">
5 <xs:restriction base="xs:NMTOKEN">
6 <xs:enumeration value="TOPLEFT"/>
7 <xs:enumeration value="TOPRIGHT"/>
8 <xs:enumeration value="BOTTOMLEFT"/>
9 <xs:enumeration value="BOTTOMRIGHT"/>
10 <xs:enumeration value="TOP"/>
11 <xs:enumeration value="BOTTOM"/>
12 <xs:enumeration value="LEFT"/>
13 <xs:enumeration value="RIGHT"/>
14 <xs:enumeration value="CENTER"/>
15 </xs:restriction>
16 </xs:simpleType>
17 <xs:simpleType name="FRAMESTRATA">
18 <xs:restriction base="xs:NMTOKEN">
19 <xs:enumeration value="PARENT"/>
20 <xs:enumeration value="BACKGROUND"/>
21 <xs:enumeration value="LOW"/>
22 <xs:enumeration value="MEDIUM"/>
23 <xs:enumeration value="HIGH"/>
24 <xs:enumeration value="DIALOG"/>
25 <xs:enumeration value="FULLSCREEN"/>
26 <xs:enumeration value="FULLSCREEN_DIALOG"/>
27 <xs:enumeration value="TOOLTIP"/>
28 </xs:restriction>
29 </xs:simpleType>
30 <xs:simpleType name="DRAWLAYER">
31 <xs:restriction base="xs:NMTOKEN">
32 <xs:enumeration value="BACKGROUND"/>
33 <xs:enumeration value="BORDER"/>
34 <xs:enumeration value="ARTWORK"/>
35 <xs:enumeration value="OVERLAY"/>
36 <xs:enumeration value="HIGHLIGHT"/>
37 </xs:restriction>
38 </xs:simpleType>
39 <xs:simpleType name="ALPHAMODE">
40 <xs:restriction base="xs:NMTOKEN">
41 <xs:enumeration value="DISABLE"/>
42 <xs:enumeration value="BLEND"/>
43 <xs:enumeration value="ALPHAKEY"/>
44 <xs:enumeration value="ADD"/>
45 <xs:enumeration value="MOD"/>
46 </xs:restriction>
47 </xs:simpleType>
48 <xs:simpleType name="OUTLINETYPE">
49 <xs:restriction base="xs:NMTOKEN">
50 <xs:enumeration value="NONE"/>
51 <xs:enumeration value="NORMAL"/>
52 <xs:enumeration value="THICK"/>
53 </xs:restriction>
54 </xs:simpleType>
55 <xs:simpleType name="JUSTIFYVTYPE">
56 <xs:restriction base="xs:NMTOKEN">
57 <xs:enumeration value="TOP"/>
58 <xs:enumeration value="MIDDLE"/>
59 <xs:enumeration value="BOTTOM"/>
60 </xs:restriction>
61 </xs:simpleType>
62 <xs:simpleType name="JUSTIFYHTYPE">
63 <xs:restriction base="xs:NMTOKEN">
64 <xs:enumeration value="LEFT"/>
65 <xs:enumeration value="CENTER"/>
66 <xs:enumeration value="RIGHT"/>
67 </xs:restriction>
68 </xs:simpleType>
69 <xs:simpleType name="INSERTMODE">
70 <xs:restriction base="xs:NMTOKEN">
71 <xs:enumeration value="TOP"/>
72 <xs:enumeration value="BOTTOM"/>
73 </xs:restriction>
74 </xs:simpleType>
75 <xs:simpleType name="ORIENTATION">
76 <xs:restriction base="xs:NMTOKEN">
77 <xs:enumeration value="HORIZONTAL"/>
78 <xs:enumeration value="VERTICAL"/>
79 </xs:restriction>
80 </xs:simpleType>
81 <xs:simpleType name="ATTRIBUTETYPE">
82 <xs:restriction base="xs:NMTOKEN">
83 <xs:enumeration value="nil"/>
84 <xs:enumeration value="boolean"/>
85 <xs:enumeration value="number"/>
86 <xs:enumeration value="string"/>
87 </xs:restriction>
88 </xs:simpleType>
89 <xs:element name="AbsValue">
90 <xs:complexType>
91 <xs:attribute name="val" type="xs:int" use="required"/>
92 </xs:complexType>
93 </xs:element>
94 <xs:element name="RelValue">
95 <xs:complexType>
96 <xs:attribute name="val" type="xs:float" use="required"/>
97 </xs:complexType>
98 </xs:element>
99 <xs:complexType name="Value">
100 <xs:choice minOccurs="0">
101 <xs:element ref="AbsValue"/>
102 <xs:element ref="RelValue"/>
103 </xs:choice>
104 <xs:attribute name="val" type="xs:int" use="optional"/>
105 </xs:complexType>
106 <xs:element name="AbsDimension">
107 <xs:complexType>
108 <xs:attribute name="x" type="xs:int" use="required"/>
109 <xs:attribute name="y" type="xs:int" use="required"/>
110 </xs:complexType>
111 </xs:element>
112 <xs:element name="RelDimension">
113 <xs:complexType>
114 <xs:attribute name="x" type="xs:float" use="required"/>
115 <xs:attribute name="y" type="xs:float" use="required"/>
116 </xs:complexType>
117 </xs:element>
118 <xs:complexType name="Dimension">
119 <xs:choice minOccurs="0">
120 <xs:element ref="AbsDimension"/>
121 <xs:element ref="RelDimension"/>
122 </xs:choice>
123 <xs:attribute name="x" type="xs:int" use="optional"/>
124 <xs:attribute name="y" type="xs:int" use="optional"/>
125 </xs:complexType>
126 <xs:element name="AbsInset">
127 <xs:complexType>
128 <xs:attribute name="left" type="xs:int" use="optional"/>
129 <xs:attribute name="right" type="xs:int" use="optional"/>
130 <xs:attribute name="top" type="xs:int" use="optional"/>
131 <xs:attribute name="bottom" type="xs:int" use="optional"/>
132 </xs:complexType>
133 </xs:element>
134 <xs:element name="RelInset">
135 <xs:complexType>
136 <xs:attribute name="left" type="xs:float" use="required"/>
137 <xs:attribute name="right" type="xs:float" use="required"/>
138 <xs:attribute name="top" type="xs:float" use="required"/>
139 <xs:attribute name="bottom" type="xs:float" use="required"/>
140 </xs:complexType>
141 </xs:element>
142 <xs:complexType name="Inset">
143 <xs:choice minOccurs="0">
144 <xs:element ref="AbsInset"/>
145 <xs:element ref="RelInset"/>
146 </xs:choice>
147 <xs:attribute name="left" type="xs:int" use="optional"/>
148 <xs:attribute name="right" type="xs:int" use="optional"/>
149 <xs:attribute name="top" type="xs:int" use="optional"/>
150 <xs:attribute name="bottom" type="xs:int" use="optional"/>
151 </xs:complexType>
152 <xs:simpleType name="ColorFloat">
153 <xs:restriction base="xs:float">
154 <xs:minInclusive value="0.0"/>
155 <xs:maxInclusive value="1.0"/>
156 </xs:restriction>
157 </xs:simpleType>
158 <xs:complexType name="ColorType">
159 <xs:attribute name="r" type="ColorFloat" use="required"/>
160 <xs:attribute name="g" type="ColorFloat" use="required"/>
161 <xs:attribute name="b" type="ColorFloat" use="required"/>
162 <xs:attribute name="a" type="ColorFloat" default="1.0"/>
163 </xs:complexType>
164 <xs:complexType name="ShadowType">
165 <xs:sequence minOccurs="0">
166 <xs:choice maxOccurs="unbounded">
167 <xs:element name="Color" type="ColorType"/>
168 <xs:element name="Offset" type="Dimension"/>
169 </xs:choice>
170 </xs:sequence>
171 </xs:complexType>
172 <xs:complexType name="GradientType">
173 <xs:sequence>
174 <xs:element name="MinColor" type="ColorType"/>
175 <xs:element name="MaxColor" type="ColorType"/>
176 </xs:sequence>
177 <xs:attribute name="orientation" type="ORIENTATION" default="HORIZONTAL"/>
178 </xs:complexType>
179 <xs:complexType name="AttributeType">
180 <xs:attribute name="name" type="xs:string" use="required"/>
181 <xs:attribute name="type" type="ATTRIBUTETYPE" use="optional" default="string"/>
182 <xs:attribute name="value" type="xs:string" use="optional"/>
183 </xs:complexType>
184 <xs:complexType name="AttributesType">
185 <xs:sequence>
186 <xs:choice maxOccurs="unbounded">
187 <xs:element name="Attribute" type="AttributeType"/>
188 </xs:choice>
189 </xs:sequence>
190 </xs:complexType>
191 <xs:complexType name="ButtonStyleType">
192 <xs:attribute name="style" type="xs:string" use="required"/>
193 </xs:complexType>
194 <xs:complexType name="ScriptsType">
195 <xs:sequence>
196 <xs:choice maxOccurs="unbounded">
197 <xs:element name="OnLoad" type="ScriptType"/>
198 <xs:element name="OnAttributeChanged" type="ScriptType"/>
199 <xs:element name="OnSizeChanged" type="ScriptType"/>
200 <xs:element name="OnEvent" type="ScriptType"/>
201 <xs:element name="OnUpdate" type="ScriptType"/>
202 <xs:element name="OnShow" type="ScriptType"/>
203 <xs:element name="OnHide" type="ScriptType"/>
204 <xs:element name="OnEnter" type="ScriptType"/>
205 <xs:element name="OnLeave" type="ScriptType"/>
206 <xs:element name="OnMouseDown" type="ScriptType"/>
207 <xs:element name="OnMouseUp" type="ScriptType"/>
208 <xs:element name="OnMouseWheel" type="ScriptType"/>
209 <xs:element name="OnJoystickStickMotion" type="ScriptType"/>
210 <xs:element name="OnJoystickAxisMotion" type="ScriptType"/>
211 <xs:element name="OnJoystickButtonDown" type="ScriptType"/>
212 <xs:element name="OnJoystickButtonUp" type="ScriptType"/>
213 <xs:element name="OnJoystickHatMotion" type="ScriptType"/>
214 <xs:element name="OnDragStart" type="ScriptType"/>
215 <xs:element name="OnDragStop" type="ScriptType"/>
216 <xs:element name="OnReceiveDrag" type="ScriptType"/>
217 <xs:element name="PreClick" type="ScriptType"/>
218 <xs:element name="OnClick" type="ScriptType"/>
219 <xs:element name="PostClick" type="ScriptType"/>
220 <xs:element name="OnDoubleClick" type="ScriptType"/>
221 <xs:element name="OnValueChanged" type="ScriptType"/>
222 <xs:element name="OnMinMaxChanged" type="ScriptType"/>
223 <xs:element name="OnUpdateModel" type="ScriptType"/>
224 <xs:element name="OnAnimFinished" type="ScriptType"/>
225 <xs:element name="OnEnterPressed" type="ScriptType"/>
226 <xs:element name="OnEscapePressed" type="ScriptType"/>
227 <xs:element name="OnSpacePressed" type="ScriptType"/>
228 <xs:element name="OnTabPressed" type="ScriptType"/>
229 <xs:element name="OnTextChanged" type="ScriptType"/>
230 <xs:element name="OnTextSet" type="ScriptType"/>
231 <xs:element name="OnCursorChanged" type="ScriptType"/>
232 <xs:element name="OnInputLanguageChanged" type="ScriptType"/>
233 <xs:element name="OnEditFocusGained" type="ScriptType"/>
234 <xs:element name="OnEditFocusLost" type="ScriptType"/>
235 <xs:element name="OnHorizontalScroll" type="ScriptType"/>
236 <xs:element name="OnVerticalScroll" type="ScriptType"/>
237 <xs:element name="OnScrollRangeChanged" type="ScriptType"/>
238 <xs:element name="OnCharComposition" type="ScriptType"/>
239 <xs:element name="OnChar" type="ScriptType"/>
240 <xs:element name="OnKeyDown" type="ScriptType"/>
241 <xs:element name="OnKeyUp" type="ScriptType"/>
242 <xs:element name="OnColorSelect" type="ScriptType"/>
243 <xs:element name="OnHyperlinkEnter" type="ScriptType"/>
244 <xs:element name="OnHyperlinkLeave" type="ScriptType"/>
245 <xs:element name="OnHyperlinkClick" type="ScriptType"/>
246 <xs:element name="OnMessageScrollChanged" type="ScriptType"/>
247 <xs:element name="OnMovieFinished" type="ScriptType"/>
248 <xs:element name="OnMovieShowSubtitle" type="ScriptType"/>
249 <xs:element name="OnMovieHideSubtitle" type="ScriptType"/>
250 <xs:element name="OnTooltipSetDefaultAnchor" type="ScriptType"/>
251 <xs:element name="OnTooltipCleared" type="ScriptType"/>
252 <xs:element name="OnTooltipAddMoney" type="ScriptType"/>
253 <xs:element name="OnTooltipSetUnit" type="ScriptType"/>
254 <xs:element name="OnTooltipSetItem" type="ScriptType"/>
255 <xs:element name="OnTooltipSetSpell" type="ScriptType"/>
256 <xs:element name="OnTooltipSetQuest" type="ScriptType"/>
257 <xs:element name="OnTooltipSetAchievement" type="ScriptType"/>
258 <xs:element name="OnEnable" type="ScriptType"/>
259 <xs:element name="OnDisable" type="ScriptType"/>
260 </xs:choice>
261 </xs:sequence>
262 </xs:complexType>
263 <xs:complexType name="ScriptType">
264 <xs:simpleContent>
265 <xs:extension base="xs:string">
266 <xs:attribute name="function" type="xs:string"/>
267 </xs:extension>
268 </xs:simpleContent>
269 </xs:complexType>
270 <xs:complexType name="FontType">
271 <xs:sequence minOccurs="0">
272 <xs:choice maxOccurs="unbounded">
273 <xs:element name="FontHeight" type="Value"/>
274 <xs:element name="Color" type="ColorType"/>
275 <xs:element name="Shadow" type="ShadowType"/>
276 </xs:choice>
277 </xs:sequence>
278 <xs:attribute name="name" type="xs:string"/>
279 <xs:attribute name="inherits" type="xs:string"/>
280 <xs:attribute name="virtual" type="xs:boolean" default="false"/>
281 <xs:attribute name="font" type="xs:string"/>
282 <xs:attribute name="spacing" type="xs:float" default="0"/>
283 <xs:attribute name="outline" type="OUTLINETYPE" default="NONE"/>
284 <xs:attribute name="monochrome" type="xs:boolean" default="false"/>
285 <xs:attribute name="justifyV" type="JUSTIFYVTYPE" default="MIDDLE"/>
286 <xs:attribute name="justifyH" type="JUSTIFYHTYPE" default="CENTER"/>
287 </xs:complexType>
288 <xs:element name="Font">
289 <xs:complexType>
290 <xs:complexContent>
291 <xs:extension base="FontType"/>
292 </xs:complexContent>
293 </xs:complexType>
294 </xs:element>
295 <xs:complexType name="LayoutFrameType">
296 <xs:sequence minOccurs="0">
297 <xs:choice maxOccurs="unbounded">
298 <xs:element name="Size" type="Dimension"/>
299 <xs:element name="Anchors">
300 <xs:complexType>
301 <xs:sequence>
302 <xs:element name="Anchor" maxOccurs="unbounded">
303 <xs:complexType>
304 <xs:sequence minOccurs="0">
305 <xs:element name="Offset" type="Dimension"/>
306 </xs:sequence>
307 <xs:attribute name="point" type="FRAMEPOINT" use="required"/>
308 <xs:attribute name="relativeTo" type="xs:string"/>
309 <xs:attribute name="relativePoint" type="FRAMEPOINT"/>
310 <xs:attribute name="x" type="xs:int"/>
311 <xs:attribute name="y" type="xs:int"/>
312 </xs:complexType>
313 </xs:element>
314 </xs:sequence>
315 </xs:complexType>
316 </xs:element>
317 <xs:element name="Animations">
318 <xs:complexType>
319 <xs:sequence>
320 <xs:element ref="AnimationGroup" maxOccurs="unbounded"/>
321 </xs:sequence>
322 </xs:complexType>
323 </xs:element>
324 </xs:choice>
325 </xs:sequence>
326 <xs:attribute name="name" type="xs:string"/>
327 <xs:attribute name="inherits" type="xs:string"/>
328 <xs:attribute name="virtual" type="xs:boolean" default="false"/>
329 <xs:attribute name="setAllPoints" type="xs:boolean" default="false"/>
330 <xs:attribute name="hidden" type="xs:boolean" default="false"/>
331 <xs:attribute name="parentKey" type="xs:string"/>
332 </xs:complexType>
333 <xs:element name="LayoutFrame" type="LayoutFrameType"/>
334 <xs:complexType name="BackdropType">
335 <xs:sequence minOccurs="0">
336 <xs:choice maxOccurs="unbounded">
337 <xs:element name="BackgroundInsets" type="Inset"/>
338 <xs:element name="TileSize" type="Value"/>
339 <xs:element name="EdgeSize" type="Value"/>
340 <xs:element name="Color" type="ColorType"/>
341 <xs:element name="BorderColor" type="ColorType"/>
342 </xs:choice>
343 </xs:sequence>
344 <xs:attribute name="bgFile" type="xs:string"/>
345 <xs:attribute name="edgeFile" type="xs:string"/>
346 <xs:attribute name="tile" type="xs:boolean" default="false"/>
347 <xs:attribute name="alphaMode" type="ALPHAMODE" default="BLEND"/>
348 </xs:complexType>
349 <xs:complexType name="TextureType">
350 <xs:complexContent>
351 <xs:extension base="LayoutFrameType">
352 <xs:sequence minOccurs="0">
353 <xs:choice maxOccurs="unbounded">
354 <xs:element name="TexCoords">
355 <xs:complexType>
356 <xs:attribute name="left" type="xs:float" use="required"/>
357 <xs:attribute name="right" type="xs:float" use="required"/>
358 <xs:attribute name="top" type="xs:float" use="required"/>
359 <xs:attribute name="bottom" type="xs:float" use="required"/>
360 <xs:attribute name="ULx" type="xs:float"/>
361 <xs:attribute name="ULy" type="xs:float"/>
362 <xs:attribute name="LLx" type="xs:float"/>
363 <xs:attribute name="LLy" type="xs:float"/>
364 <xs:attribute name="URx" type="xs:float"/>
365 <xs:attribute name="URy" type="xs:float"/>
366 <xs:attribute name="LRx" type="xs:float"/>
367 <xs:attribute name="LRy" type="xs:float"/>
368 </xs:complexType>
369 </xs:element>
370 <xs:element name="Color" type="ColorType"/>
371 <xs:element name="Gradient" type="GradientType"/>
372 </xs:choice>
373 </xs:sequence>
374 <xs:attribute name="file" type="xs:string"/>
375 <xs:attribute name="alphaMode" type="ALPHAMODE" default="BLEND"/>
376 <xs:attribute name="alpha" type="xs:float" default="1.0"/>
377 <xs:attribute name="nonBlocking" type="xs:boolean" default="false"/>
378 <xs:attribute name="horizTile" type="xs:boolean" default="false"/>
379 <xs:attribute name="vertTile" type="xs:boolean" default="false"/>
380 </xs:extension>
381 </xs:complexContent>
382 </xs:complexType>
383 <xs:element name="Texture" type="TextureType" substitutionGroup="LayoutFrame"/>
384 <xs:complexType name="FontStringType">
385 <xs:complexContent>
386 <xs:extension base="LayoutFrameType">
387 <xs:sequence minOccurs="0">
388 <xs:choice maxOccurs="unbounded">
389 <xs:element name="FontHeight" type="Value"/>
390 <xs:element name="Color" type="ColorType"/>
391 <xs:element name="Shadow" type="ShadowType"/>
392 </xs:choice>
393 </xs:sequence>
394 <xs:attribute name="font" type="xs:string"/>
395 <xs:attribute name="bytes" default="255">
396 <xs:simpleType>
397 <xs:restriction base="xs:int">
398 <xs:minInclusive value="0"/>
399 </xs:restriction>
400 </xs:simpleType>
401 </xs:attribute>
402 <xs:attribute name="text" type="xs:string"/>
403 <xs:attribute name="spacing" type="xs:float" default="0"/>
404 <xs:attribute name="outline" type="OUTLINETYPE" default="NONE"/>
405 <xs:attribute name="monochrome" type="xs:boolean" default="false"/>
406 <xs:attribute name="nonspacewrap" type="xs:boolean" default="false"/>
407 <xs:attribute name="wordwrap" type="xs:boolean" default="true"/>
408 <xs:attribute name="justifyV" type="JUSTIFYVTYPE" default="MIDDLE"/>
409 <xs:attribute name="justifyH" type="JUSTIFYHTYPE" default="CENTER"/>
410 <xs:attribute name="maxLines" type="xs:unsignedInt" default="0"/>
411 <xs:attribute name="indented" type="xs:boolean" default="false"/>
412 </xs:extension>
413 </xs:complexContent>
414 </xs:complexType>
415 <xs:element name="FontString" type="FontStringType" substitutionGroup="LayoutFrame"/>
416 <xs:complexType name="FrameType">
417 <xs:complexContent>
418 <xs:extension base="LayoutFrameType">
419 <xs:sequence minOccurs="0">
420 <xs:choice maxOccurs="unbounded">
421 <xs:element name="TitleRegion" type="ui:LayoutFrameType"/>
422 <xs:element name="ResizeBounds">
423 <xs:complexType>
424 <xs:sequence>
425 <xs:choice maxOccurs="unbounded">
426 <xs:element name="minResize" type="Dimension"/>
427 <xs:element name="maxResize" type="Dimension"/>
428 </xs:choice>
429 </xs:sequence>
430 </xs:complexType>
431 </xs:element>
432 <xs:element name="Backdrop" type="BackdropType"/>
433 <xs:element name="HitRectInsets" type="Inset"/>
434 <xs:element name="Layers">
435 <xs:complexType>
436 <xs:sequence>
437 <xs:element name="Layer" maxOccurs="unbounded">
438 <xs:complexType>
439 <xs:sequence>
440 <xs:choice maxOccurs="unbounded">
441 <xs:element ref="Texture"/>
442 <xs:element ref="FontString"/>
443 </xs:choice>
444 </xs:sequence>
445 <xs:attribute name="level" type="DRAWLAYER" default="ARTWORK"/>
446 </xs:complexType>
447 </xs:element>
448 </xs:sequence>
449 </xs:complexType>
450 </xs:element>
451 <xs:element name="Attributes" type="AttributesType"/>
452 <xs:element name="Frames">
453 <xs:complexType>
454 <xs:sequence>
455 <xs:element ref="Frame" maxOccurs="unbounded"/>
456 </xs:sequence>
457 </xs:complexType>
458 </xs:element>
459 <xs:element name="Scripts" type="ScriptsType"/>
460 </xs:choice>
461 </xs:sequence>
462 <xs:attribute name="alpha" type="xs:float" default="1.0"/>
463 <xs:attribute name="parent" type="xs:string"/>
464 <xs:attribute name="toplevel" type="xs:boolean" default="false"/>
465 <xs:attribute name="movable" type="xs:boolean" default="false"/>
466 <xs:attribute name="resizable" type="xs:boolean" default="false"/>
467 <xs:attribute name="frameStrata" type="ui:FRAMESTRATA" default="PARENT"/>
468 <xs:attribute name="frameLevel" type="xs:int"/>
469 <xs:attribute name="id" type="xs:int" default="0"/>
470 <xs:attribute name="enableMouse" type="xs:boolean" default="false"/>
471 <xs:attribute name="enableKeyboard" type="xs:boolean" default="false"/>
472 <xs:attribute name="clampedToScreen" type="xs:boolean" default="false"/>
473 <xs:attribute name="protected" type="xs:boolean" default="false"/>
474 <xs:attribute name="depth" type="xs:float" default="0.0"/>
475 </xs:extension>
476 </xs:complexContent>
477 </xs:complexType>
478 <xs:element name="Frame" type="FrameType" substitutionGroup="LayoutFrame"/>
479 <xs:complexType name="ButtonType">
480 <xs:complexContent>
481 <xs:extension base="FrameType">
482 <xs:sequence minOccurs="0">
483 <xs:choice maxOccurs="unbounded">
484 <xs:element name="NormalTexture" type="ui:TextureType"/>
485 <xs:element name="PushedTexture" type="ui:TextureType"/>
486 <xs:element name="DisabledTexture" type="ui:TextureType"/>
487 <xs:element name="HighlightTexture" type="ui:TextureType"/>
488 <xs:element name="ButtonText" type="FontStringType"/>
489 <xs:element name="NormalFont" type="ButtonStyleType"/>
490 <xs:element name="HighlightFont" type="ButtonStyleType"/>
491 <xs:element name="DisabledFont" type="ButtonStyleType"/>
492 <xs:element name="NormalColor" type="ColorType"/>
493 <xs:element name="HighlightColor" type="ColorType"/>
494 <xs:element name="DisabledColor" type="ColorType"/>
495 <xs:element name="PushedTextOffset" type="Dimension"/>
496 </xs:choice>
497 </xs:sequence>
498 <xs:attribute name="text" type="xs:string"/>
499 <xs:attribute name="registerForClicks" type="xs:string"/>
500 <xs:attribute name="motionScriptsWhileDisabled" type="xs:boolean" default="false"/>
501 </xs:extension>
502 </xs:complexContent>
503 </xs:complexType>
504 <xs:element name="Button" type="ButtonType" substitutionGroup="ui:Frame"/>
505 <xs:complexType name="CheckButtonType">
506 <xs:complexContent>
507 <xs:extension base="ButtonType">
508 <xs:sequence minOccurs="0">
509 <xs:choice maxOccurs="unbounded">
510 <xs:element name="CheckedTexture" type="TextureType"/>
511 <xs:element name="DisabledCheckedTexture" type="TextureType"/>
512 </xs:choice>
513 </xs:sequence>
514 <xs:attribute name="checked" type="xs:boolean" default="false"/>
515 </xs:extension>
516 </xs:complexContent>
517 </xs:complexType>
518 <xs:element name="CheckButton" type="CheckButtonType" substitutionGroup="ui:Button"/>
519 <xs:complexType name="StatusBarType">
520 <xs:complexContent>
521 <xs:extension base="FrameType">
522 <xs:sequence minOccurs="0">
523 <xs:choice maxOccurs="unbounded">
524 <xs:element name="BarTexture" type="TextureType"/>
525 <xs:element name="BarColor" type="ui:ColorType"/>
526 </xs:choice>
527 </xs:sequence>
528 <xs:attribute name="drawLayer" type="ui:DRAWLAYER" default="ARTWORK"/>
529 <xs:attribute name="minValue" type="xs:float"/>
530 <xs:attribute name="maxValue" type="xs:float"/>
531 <xs:attribute name="defaultValue" type="xs:float"/>
532 <xs:attribute name="orientation" type="ui:ORIENTATION" default="HORIZONTAL"/>
533 <xs:attribute name="rotatesTexture" type="xs:boolean" default="false"/>
534 </xs:extension>
535 </xs:complexContent>
536 </xs:complexType>
537 <xs:element name="StatusBar" type="StatusBarType" substitutionGroup="ui:Frame"/>
538 <xs:complexType name="SliderType">
539 <xs:complexContent>
540 <xs:extension base="FrameType">
541 <xs:sequence minOccurs="0">
542 <xs:choice maxOccurs="unbounded">
543 <xs:element name="ThumbTexture" type="TextureType"/>
544 </xs:choice>
545 </xs:sequence>
546 <xs:attribute name="drawLayer" type="ui:DRAWLAYER" default="OVERLAY"/>
547 <xs:attribute name="minValue" type="xs:float"/>
548 <xs:attribute name="maxValue" type="xs:float"/>
549 <xs:attribute name="defaultValue" type="xs:float"/>
550 <xs:attribute name="valueStep" type="xs:float"/>
551 <xs:attribute name="orientation" type="ui:ORIENTATION" default="VERTICAL"/>
552 </xs:extension>
553 </xs:complexContent>
554 </xs:complexType>
555 <xs:element name="Slider" type="SliderType" substitutionGroup="ui:Frame"/>
556 <xs:complexType name="EditBoxType">
557 <xs:complexContent>
558 <xs:extension base="FrameType">
559 <xs:sequence minOccurs="0">
560 <xs:choice maxOccurs="unbounded">
561 <xs:element ref="FontString"/>
562 <xs:element name="HighlightColor" type="ColorType"/>
563 <xs:element name="TextInsets" type="Inset"/>
564 </xs:choice>
565 </xs:sequence>
566 <xs:attribute name="font" type="xs:string"/>
567 <xs:attribute name="letters" type="xs:int" default="0"/>
568 <xs:attribute name="blinkSpeed" type="xs:float" default="0.5"/>
569 <xs:attribute name="numeric" type="xs:boolean" default="false"/>
570 <xs:attribute name="password" type="xs:boolean" default="false"/>
571 <xs:attribute name="multiLine" type="xs:boolean" default="false"/>
572 <xs:attribute name="historyLines" type="xs:int" default="0"/>
573 <xs:attribute name="autoFocus" type="xs:boolean" default="true"/>
574 <xs:attribute name="ignoreArrows" type="xs:boolean" default="false"/>
575 <xs:attribute name="countInvisibleLetters" type="xs:boolean" default="false"/>
576 </xs:extension>
577 </xs:complexContent>
578 </xs:complexType>
579 <xs:element name="EditBox" type="EditBoxType" substitutionGroup="ui:Frame"/>
580 <xs:complexType name="ColorSelectType">
581 <xs:complexContent>
582 <xs:extension base="FrameType">
583 <xs:sequence>
584 <xs:choice maxOccurs="unbounded">
585 <xs:element name="ColorWheelTexture" type="TextureType"/>
586 <xs:element name="ColorWheelThumbTexture" type="TextureType"/>
587 <xs:element name="ColorValueTexture" type="TextureType"/>
588 <xs:element name="ColorValueThumbTexture" type="TextureType"/>
589 </xs:choice>
590 </xs:sequence>
591 </xs:extension>
592 </xs:complexContent>
593 </xs:complexType>
594 <xs:element name="ColorSelect" type="ui:ColorSelectType" substitutionGroup="ui:Frame"/>
595 <xs:complexType name="ModelType">
596 <xs:complexContent>
597 <xs:extension base="FrameType">
598 <xs:sequence minOccurs="0">
599 <xs:element name="FogColor" type="ColorType"/>
600 </xs:sequence>
601 <xs:attribute name="file" type="xs:string"/>
602 <xs:attribute name="scale" type="xs:float" default="1.0"/>
603 <xs:attribute name="fogNear" default="0.0">
604 <xs:simpleType>
605 <xs:restriction base="xs:float"/>
606 </xs:simpleType>
607 </xs:attribute>
608 <xs:attribute name="fogFar" default="1.0">
609 <xs:simpleType>
610 <xs:restriction base="xs:float"/>
611 </xs:simpleType>
612 </xs:attribute>
613 <xs:attribute name="glow" default="1.0">
614 <xs:simpleType>
615 <xs:restriction base="xs:float"/>
616 </xs:simpleType>
617 </xs:attribute>
618 </xs:extension>
619 </xs:complexContent>
620 </xs:complexType>
621 <xs:element name="Model" type="ModelType" substitutionGroup="ui:Frame"/>
622 <xs:element name="ModelFFX" type="ModelType" substitutionGroup="ui:Frame"/>
623 <xs:complexType name="SimpleHTMLType">
624 <xs:complexContent>
625 <xs:extension base="ui:FrameType">
626 <xs:sequence>
627 <xs:element ref="FontString"/>
628 <xs:sequence minOccurs="0">
629 <xs:choice maxOccurs="unbounded">
630 <xs:element name="FontStringHeader1" type="ui:FontStringType"/>
631 <xs:element name="FontStringHeader2" type="ui:FontStringType"/>
632 <xs:element name="FontStringHeader3" type="ui:FontStringType"/>
633 </xs:choice>
634 </xs:sequence>
635 </xs:sequence>
636 <xs:attribute name="font" type="xs:string"/>
637 <xs:attribute name="file" type="xs:string"/>
638 <xs:attribute name="hyperlinkFormat" type="xs:string" default="|H%s|h%s|h"/>
639 </xs:extension>
640 </xs:complexContent>
641 </xs:complexType>
642 <xs:element name="SimpleHTML" type="ui:SimpleHTMLType" substitutionGroup="ui:Frame"/>
643 <xs:complexType name="MessageFrameType">
644 <xs:complexContent>
645 <xs:extension base="FrameType">
646 <xs:sequence minOccurs="0">
647 <xs:choice maxOccurs="unbounded">
648 <xs:element ref="FontString"/>
649 <xs:element name="TextInsets" type="Inset"/>
650 </xs:choice>
651 </xs:sequence>
652 <xs:attribute name="font" type="xs:string"/>
653 <xs:attribute name="fade" type="xs:boolean" default="true"/>
654 <xs:attribute name="fadeDuration" type="xs:float" default="3.0"/>
655 <xs:attribute name="displayDuration" type="xs:float" default="10.0"/>
656 <xs:attribute name="insertMode" type="INSERTMODE" default="BOTTOM"/>
657 </xs:extension>
658 </xs:complexContent>
659 </xs:complexType>
660 <xs:element name="MessageFrame" type="MessageFrameType" substitutionGroup="ui:Frame"/>
661 <xs:complexType name="ScrollingMessageFrameType">
662 <xs:complexContent>
663 <xs:extension base="FrameType">
664 <xs:sequence minOccurs="0">
665 <xs:choice maxOccurs="unbounded">
666 <xs:element ref="FontString"/>
667 <xs:element name="TextInsets" type="Inset"/>
668 </xs:choice>
669 </xs:sequence>
670 <xs:attribute name="font" type="xs:string"/>
671 <xs:attribute name="fade" type="xs:boolean" default="true"/>
672 <xs:attribute name="fadeDuration" type="xs:float" default="3.0"/>
673 <xs:attribute name="displayDuration" type="xs:float" default="10.0"/>
674 <xs:attribute name="insertMode" type="INSERTMODE" default="BOTTOM"/>
675 <xs:attribute name="maxLines" default="8">
676 <xs:simpleType>
677 <xs:restriction base="xs:int">
678 <xs:minInclusive value="1"/>
679 </xs:restriction>
680 </xs:simpleType>
681 </xs:attribute>
682 </xs:extension>
683 </xs:complexContent>
684 </xs:complexType>
685 <xs:element name="ScrollingMessageFrame" type="ScrollingMessageFrameType" substitutionGroup="ui:Frame"/>
686 <xs:complexType name="ScrollFrameType">
687 <xs:complexContent>
688 <xs:extension base="FrameType">
689 <xs:sequence minOccurs="0">
690 <xs:choice>
691 <xs:element name="ScrollChild">
692 <xs:complexType>
693 <xs:sequence>
694 <xs:element ref="Frame"/>
695 </xs:sequence>
696 </xs:complexType>
697 </xs:element>
698 </xs:choice>
699 </xs:sequence>
700 </xs:extension>
701 </xs:complexContent>
702 </xs:complexType>
703 <xs:element name="ScrollFrame" type="ScrollFrameType" substitutionGroup="ui:Frame"/>
704 <xs:complexType name="MovieFrameType">
705 <xs:complexContent>
706 <xs:extension base="FrameType"/>
707 </xs:complexContent>
708 </xs:complexType>
709 <xs:element name="MovieFrame" type="MovieFrameType" substitutionGroup="ui:Frame"/>
710 <xs:element name="Ui">
711 <xs:complexType>
712 <xs:sequence>
713 <xs:choice maxOccurs="unbounded">
714 <xs:element name="Include" minOccurs="0" maxOccurs="unbounded">
715 <xs:complexType>
716 <xs:simpleContent>
717 <xs:extension base="xs:string">
718 <xs:attribute name="file" type="xs:string" use="required"/>
719 </xs:extension>
720 </xs:simpleContent>
721 </xs:complexType>
722 </xs:element>
723 <xs:element name="Script" minOccurs="0" maxOccurs="unbounded">
724 <xs:complexType>
725 <xs:simpleContent>
726 <xs:extension base="xs:string">
727 <xs:attribute name="file" type="xs:string" use="optional"/>
728 </xs:extension>
729 </xs:simpleContent>
730 </xs:complexType>
731 </xs:element>
732 <xs:element ref="Font" minOccurs="0" maxOccurs="unbounded"/>
733 <xs:element ref="LayoutFrame" minOccurs="0" maxOccurs="unbounded"/>
734 <xs:element ref="Animation" minOccurs="0" maxOccurs="unbounded"/>
735 <xs:element ref="AnimationGroup" minOccurs="0" maxOccurs="unbounded"/>
736 </xs:choice>
737 </xs:sequence>
738 </xs:complexType>
739 </xs:element>
740 <xs:complexType name="WorldFrameType">
741 <xs:complexContent>
742 <xs:extension base="FrameType"/>
743 </xs:complexContent>
744 </xs:complexType>
745 <xs:element name="WorldFrame" type="WorldFrameType" substitutionGroup="ui:Frame"/>
746 <xs:complexType name="GameTooltipType">
747 <xs:complexContent>
748 <xs:extension base="FrameType"/>
749 </xs:complexContent>
750 </xs:complexType>
751 <xs:element name="GameTooltip" type="GameTooltipType" substitutionGroup="ui:Frame"/>
752 <xs:complexType name="CooldownType">
753 <xs:complexContent>
754 <xs:extension base="FrameType">
755 <xs:attribute name="reverse" type="xs:boolean" default="false"/>
756 <xs:attribute name="drawEdge" type="xs:boolean" default="false"/>
757 </xs:extension>
758 </xs:complexContent>
759 </xs:complexType>
760 <xs:element name="Cooldown" type="CooldownType" substitutionGroup="ui:Frame"/>
761 <xs:complexType name="QuestPOIFrameType">
762 <xs:complexContent>
763 <xs:extension base="FrameType">
764 <xs:attribute name="filltexture" type="xs:string"/>
765 <xs:attribute name="bordertexture" type="xs:string"/>
766 </xs:extension>
767 </xs:complexContent>
768 </xs:complexType>
769 <xs:element name="QuestPOIFrame" type="QuestPOIFrameType" substitutionGroup="ui:Frame"/>
770 <xs:complexType name="MinimapType">
771 <xs:complexContent>
772 <xs:extension base="FrameType">
773 <xs:attribute name="minimapArrowModel" type="xs:string"/>
774 <xs:attribute name="minimapPlayerModel" type="xs:string"/>
775 </xs:extension>
776 </xs:complexContent>
777 </xs:complexType>
778 <xs:element name="Minimap" type="MinimapType" substitutionGroup="ui:Frame"/>
779 <xs:complexType name="PlayerModelType">
780 <xs:complexContent>
781 <xs:extension base="ModelType"/>
782 </xs:complexContent>
783 </xs:complexType>
784 <xs:element name="PlayerModel" type="PlayerModelType" substitutionGroup="ui:Frame"/>
785 <xs:complexType name="DressUpModelType">
786 <xs:complexContent>
787 <xs:extension base="PlayerModelType"/>
788 </xs:complexContent>
789 </xs:complexType>
790 <xs:element name="DressUpModel" type="DressUpModelType" substitutionGroup="ui:Frame"/>
791 <xs:complexType name="TabardModelType">
792 <xs:complexContent>
793 <xs:extension base="PlayerModelType"/>
794 </xs:complexContent>
795 </xs:complexType>
796 <xs:element name="TabardModel" type="TabardModelType" substitutionGroup="ui:Frame"/>
797 <xs:complexType name="UnitButtonType">
798 <xs:complexContent>
799 <xs:extension base="ButtonType"/>
800 </xs:complexContent>
801 </xs:complexType>
802 <xs:complexType name="TaxiRouteFrameType">
803 <xs:complexContent>
804 <xs:extension base="FrameType"/>
805 </xs:complexContent>
806 </xs:complexType>
807 <xs:element name="TaxiRouteFrame" type="TaxiRouteFrameType" substitutionGroup="ui:Frame"/>
808 <xs:simpleType name="ANIMLOOPTYPE">
809 <xs:restriction base="xs:NMTOKEN">
810 <xs:enumeration value="NONE"/>
811 <xs:enumeration value="REPEAT"/>
812 <xs:enumeration value="BOUNCE"/>
813 </xs:restriction>
814 </xs:simpleType>
815 <xs:simpleType name="ANIMSMOOTHTYPE">
816 <xs:restriction base="xs:NMTOKEN">
817 <xs:enumeration value="NONE"/>
818 <xs:enumeration value="IN"/>
819 <xs:enumeration value="OUT"/>
820 <xs:enumeration value="IN_OUT"/>
821 <xs:enumeration value="OUT_IN"/>
822 </xs:restriction>
823 </xs:simpleType>
824 <xs:simpleType name="ANIMCURVETYPE">
825 <xs:restriction base="xs:NMTOKEN">
826 <xs:enumeration value="NONE"/>
827 <xs:enumeration value="SMOOTH"/>
828 </xs:restriction>
829 </xs:simpleType>
830 <xs:simpleType name="AnimOrderType">
831 <xs:restriction base="xs:int">
832 <xs:minInclusive value="1"/>
833 <xs:maxInclusive value="100"/>
834 </xs:restriction>
835 </xs:simpleType>
836 <xs:complexType name="AnimScriptsType">
837 <xs:sequence>
838 <xs:choice maxOccurs="unbounded">
839 <xs:element name="OnLoad" type="ScriptType"/>
840 <xs:element name="OnPlay" type="ScriptType"/>
841 <xs:element name="OnPause" type="ScriptType"/>
842 <xs:element name="OnStop" type="ScriptType"/>
843 <xs:element name="OnUpdate" type="ScriptType"/>
844 <xs:element name="OnFinished" type="ScriptType"/>
845 </xs:choice>
846 </xs:sequence>
847 </xs:complexType>
848 <xs:complexType name="AnimGroupScriptsType">
849 <xs:sequence>
850 <xs:choice maxOccurs="unbounded">
851 <xs:element name="OnLoad" type="ScriptType"/>
852 <xs:element name="OnPlay" type="ScriptType"/>
853 <xs:element name="OnPause" type="ScriptType"/>
854 <xs:element name="OnStop" type="ScriptType"/>
855 <xs:element name="OnUpdate" type="ScriptType"/>
856 <xs:element name="OnFinished" type="ScriptType"/>
857 <xs:element name="OnLoop" type="ScriptType"/>
858 </xs:choice>
859 </xs:sequence>
860 </xs:complexType>
861 <xs:complexType name="AnimOriginType">
862 <xs:sequence minOccurs="0">
863 <xs:element name="Offset" type="Dimension"/>
864 </xs:sequence>
865 <xs:attribute name="point" type="FRAMEPOINT" default="CENTER"/>
866 </xs:complexType>
867 <xs:complexType name="AnimationType">
868 <xs:sequence>
869 <xs:element name="Scripts" type="AnimScriptsType" minOccurs="0" maxOccurs="unbounded"/>
870 </xs:sequence>
871 <xs:attribute name="name" type="xs:string"/>
872 <xs:attribute name="inherits" type="xs:string"/>
873 <xs:attribute name="virtual" type="xs:boolean" default="false"/>
874 <xs:attribute name="startDelay" type="xs:float" default="0.0"/>
875 <xs:attribute name="endDelay" type="xs:float" default="0.0"/>
876 <xs:attribute name="duration" type="xs:float"/>
877 <xs:attribute name="maxFramerate" type="xs:float"/>
878 <xs:attribute name="smoothing" type="ANIMSMOOTHTYPE" default="NONE"/>
879 <xs:attribute name="order" type="AnimOrderType"/>
880 <xs:attribute name="parentKey" type="xs:string"/>
881 </xs:complexType>
882 <xs:element name="Animation" type="AnimationType"/>
883 <xs:complexType name="TranslationType">
884 <xs:complexContent>
885 <xs:extension base="AnimationType">
886 <xs:attribute name="offsetX" type="xs:float" default="0.0"/>
887 <xs:attribute name="offsetY" type="xs:float" default="0.0"/>
888 </xs:extension>
889 </xs:complexContent>
890 </xs:complexType>
891 <xs:element name="Translation" type="TranslationType" substitutionGroup="Animation"/>
892 <xs:complexType name="RotationType">
893 <xs:complexContent>
894 <xs:extension base="AnimationType">
895 <xs:sequence>
896 <xs:element name="Origin" type="AnimOriginType" minOccurs="0"/>
897 </xs:sequence>
898 <xs:attribute name="degrees" type="xs:float" default="0.0"/>
899 <xs:attribute name="radians" type="xs:float" default="0.0"/>
900 </xs:extension>
901 </xs:complexContent>
902 </xs:complexType>
903 <xs:element name="Rotation" type="RotationType" substitutionGroup="Animation"/>
904 <xs:complexType name="ScaleType">
905 <xs:complexContent>
906 <xs:extension base="AnimationType">
907 <xs:sequence>
908 <xs:element name="Origin" type="AnimOriginType" minOccurs="0"/>
909 </xs:sequence>
910 <xs:attribute name="scaleX" type="xs:float" default="1.0"/>
911 <xs:attribute name="scaleY" type="xs:float" default="1.0"/>
912 </xs:extension>
913 </xs:complexContent>
914 </xs:complexType>
915 <xs:element name="Scale" type="ScaleType" substitutionGroup="Animation"/>
916 <xs:complexType name="AlphaType">
917 <xs:complexContent>
918 <xs:extension base="AnimationType">
919 <xs:attribute name="change" type="xs:float" default="0.0"/>
920 </xs:extension>
921 </xs:complexContent>
922 </xs:complexType>
923 <xs:element name="Alpha" type="AlphaType" substitutionGroup="Animation"/>
924 <xs:complexType name="ControlPointType">
925 <xs:attribute name="name" type="xs:string"/>
926 <xs:attribute name="offsetX" type="xs:float" default="0.0"/>
927 <xs:attribute name="offsetY" type="xs:float" default="0.0"/>
928 </xs:complexType>
929 <xs:element name="ControlPoint" type="ControlPointType"/>
930 <xs:complexType name="PathType">
931 <xs:complexContent>
932 <xs:extension base="AnimationType">
933 <xs:sequence minOccurs="0">
934 <xs:choice maxOccurs="unbounded">
935 <xs:element name="ControlPoints" type="ControlPointType"/>
936 </xs:choice>
937 </xs:sequence>
938 <xs:attribute name="curve" type="ANIMCURVETYPE" default="NONE"/>
939 </xs:extension>
940 </xs:complexContent>
941 </xs:complexType>
942 <xs:element name="Path" type="PathType" substitutionGroup="Animation"/>
943 <xs:complexType name="AnimationGroupType">
944 <xs:sequence minOccurs="0">
945 <xs:choice maxOccurs="unbounded">
946 <xs:element ref="Animation"/>
947 <xs:element name="Scripts" type="AnimGroupScriptsType"/>
948 </xs:choice>
949 </xs:sequence>
950 <xs:attribute name="name" type="xs:string"/>
951 <xs:attribute name="inherits" type="xs:string"/>
952 <xs:attribute name="virtual" type="xs:boolean" default="false"/>
953 <xs:attribute name="looping" type="ANIMLOOPTYPE" default="NONE"/>
954 <xs:attribute name="parentKey" type="xs:string"/>
955 <xs:attribute name="initialOffsetX" type="xs:float" default="0.0"/>
956 <xs:attribute name="initialOffsetY" type="xs:float" default="0.0"/>
957 </xs:complexType>
958 <xs:element name="AnimationGroup" type="AnimationGroupType"/>
959 </xs:schema>
File src/Chorus.lua added (mode: 100644) (index 0000000..01b2c33)
1 Chorus = {}
File src/Chorus.xml added (mode: 100644) (index 0000000..480d682)
1 <?xml version="1.0" encoding="UTF-8"?>
2 <Ui xmlns="http://www.blizzard.com/wow/ui/">
3 <Script file="Chorus.lua"/>
4 </Ui>
File src/ChorusAuraButtonTemplate.lua added (mode: 100644) (index 0000000..d463caf)
1 local DebuffTypeColor = DebuffTypeColor
2 local GetTime = GetTime
3 local UnitAura = UnitAura
4 local UnitExists = UnitExists
5
6 local Chorus = Chorus
7
8 local function auraButtonValidate(auraButton)
9 assert(auraButton ~= nil)
10
11 assert(auraButton.artwork ~= nil)
12 assert(auraButton.label ~= nil)
13 assert(auraButton.overlay ~= nil)
14 assert(auraButton.background ~= nil)
15 end
16
17 local function applyArtwork(auraButton, artworkFile, owner)
18 auraButtonValidate(auraButton)
19
20 if not artworkFile then
21 artworkFile = "Interface\\Icons\\INV_Misc_QuestionMark"
22 end
23 assert(artworkFile ~= nil)
24 assert('string' == type(artworkFile))
25 artworkFile = strtrim(artworkFile)
26 assert(string.len(artworkFile) >= 1)
27 assert(string.len(artworkFile) <= 8192)
28
29 local artwork = auraButton.artwork
30 assert(artwork ~= nil)
31 artwork:SetTexture(artworkFile)
32
33 local background = auraButton.background
34 if 'player' == owner then
35 background:SetTexture(1, 0.85, 0, 0.6)
36 else
37 background:SetTexture(0, 0, 0, 1)
38 end
39 end
40
41 local function applyOverlay(auraButton, category)
42 auraButtonValidate(auraButton)
43
44 if not category then
45 --[[ Empty string is equivalent to 'none' by default for DebuffTypeColor. ]]--
46 category = ''
47 end
48
49 local r = 1
50 local g = 1
51 local b = 1
52 if category then
53 assert(category ~= nil)
54 assert('string' == type(category))
55 category = strtrim(category)
56 --[[ Empty string is permissible ]]--
57 assert(string.len(category) >= 0)
58 assert(string.len(category) <= 256)
59
60 local colorTuple = DebuffTypeColor[category]
61 r = colorTuple.r
62 g = colorTuple.g
63 b = colorTuple.b
64 end
65 local overlay = auraButton.overlay
66 assert(overlay ~= nil)
67 overlay:SetVertexColor(r, g, b)
68 end
69
70 local function applyDuration(auraButton, now, durationSec, expirationInstance)
71 auraButtonValidate(auraButton)
72
73 assert(now ~= nil)
74 assert('number' == type(now))
75 assert(now >= 0)
76
77 assert(durationSec ~= nil)
78 assert('number' == type(durationSec))
79 assert(durationSec >= 0)
80
81 assert(expirationInstance ~= nil)
82 assert('number' == type(expirationInstance))
83 assert(expirationInstance >= 0)
84
85 local label = auraButton.label
86 assert (label ~= nil)
87
88 local t
89 if durationSec and now < expirationInstance then
90 local d = expirationInstance - now
91 if d < 60 then
92 t = string.format("%.0f", d)
93 elseif d < 3600 then
94 t = string.format("%.0f m", d / 60)
95 else
96 t = string.format("%.0f h", d / 60 / 60)
97 end
98 else
99 t = nil
100 end
101
102 label:SetText(t)
103 end
104
105 local function auraButtonUpdateProcessor(self)
106 if not self.unit or not self.index then
107 return
108 end
109 local name, _, _, _, _, durationSec, expirationInstance = UnitAura(self.unit, self.index, self.filter)
110 if not name then
111 return
112 end
113 applyDuration(self, GetTime(), durationSec, expirationInstance)
114 end
115
116 local function apply(auraButton, unitDesignation, auraIndex, filter)
117 auraButtonValidate(auraButton)
118
119 assert(unitDesignation ~= nil)
120 assert('string' == type(unitDesignation))
121 unitDesignation = string.lower(strtrim(unitDesignation))
122 assert(string.len(unitDesignation) >= 1)
123 assert(string.len(unitDesignation) <= 256)
124
125 assert(auraIndex ~= nil)
126 assert('number' == type(auraIndex))
127 auraIndex = math.min(math.max(0, math.abs(math.floor(auraIndex))), 8192)
128
129 assert(filter ~= nil)
130 assert('string' == type(filter))
131 filter = string.upper(strtrim(filter))
132 assert(string.len(filter) >= 1)
133 assert(string.len(filter) <= 256)
134
135
136 if not UnitExists(unitDesignation) then
137 auraButton:Hide()
138 auraButton:SetScript('OnUpdate', nil)
139 return
140 end
141
142 local name, _, artworkFile, quantity, category, durationSec, expirationInstance, owner = UnitAura(unitDesignation, auraIndex, filter)
143 if name then
144 auraButton:Show()
145 auraButton:SetScript('OnUpdate', auraButtonUpdateProcessor)
146 else
147 auraButton:Hide()
148 auraButton:SetScript('OnUpdate', nil)
149 return
150 end
151
152 applyArtwork(auraButton, artworkFile, owner)
153 applyOverlay(auraButton, category)
154 applyDuration(auraButton, GetTime(), durationSec, expirationInstance)
155 end
156
157 local function auraButtonEventProcessor(self, eventCategory)
158 auraButtonValidate(self)
159
160 assert(eventCategory ~= nil)
161 assert('string' == type(eventCategory))
162 eventCategory = string.upper(strtrim(eventCategory))
163 assert(string.len(eventCategory) >= 1)
164 assert(string.len(eventCategory) <= 256)
165
166 local p = self:GetParent()
167
168 local u = self.unit
169 if not u and p then
170 u = p.unit
171 end
172 u = u or 'none'
173 assert(u ~= nil)
174 assert('string' == type(u))
175 u = string.lower(strtrim(u))
176 assert(string.len(u) >= 1)
177 assert(string.len(u) <= 256)
178
179 local i = self.index or 0
180 assert(i ~= nil)
181 assert('number' == type(i))
182 i = math.min(math.max(0, math.abs(math.floor(i))), 8192)
183
184 local filter = self.filter
185 if not filter and p then
186 filter = p.filter
187 end
188 filter = filter or 'HELPFUL'
189 assert(filter ~= nil)
190 assert('string' == type(filter))
191 filter = string.upper(strtrim(filter))
192 assert(string.len(filter) >= 1)
193 assert(string.len(filter) <= 256)
194
195 apply(self, u, i, filter)
196 end
197
198 function Chorus.auraButtonMain(self)
199 local n = self:GetName()
200 if n then
201 self.artwork = _G[n .. 'Artwork']
202 self.label = _G[n .. 'Text']
203 self.overlay = _G[n .. 'Overlay']
204 self.background = _G[n .. 'Background']
205 end
206 self:SetScript('OnEvent', auraButtonEventProcessor)
207 self:RegisterEvent('ADDON_LOADED')
208 self:RegisterEvent('UNIT_AURA')
209 auraButtonValidate(self)
210 end
File src/ChorusAuraButtonTemplate.xml added (mode: 100644) (index 0000000..3d70778)
1 <?xml version="1.0" encoding="UTF-8"?>
2 <Ui xmlns="http://www.blizzard.com/wow/ui/">
3 <Script file="ChorusAuraButtonTemplate.lua"/>
4 <Frame name="ChorusAuraButtonTemplate" virtual="true">
5 <Size>
6 <AbsDimension x="36" y="36" />
7 </Size>
8 <Layers>
9 <Layer level="ARTWORK">
10 <Texture file="Interface\Icons\INV_Misc_QuestionMark" name="$parentArtwork" nonBlocking="true">
11 <Size>
12 <AbsDimension x="24" y="24"/>
13 </Size>
14 <Anchors>
15 <Anchor point="BOTTOMLEFT">
16 <Offset>
17 <AbsDimension x="6" y="12"/>
18 </Offset>
19 </Anchor>
20 </Anchors>
21 </Texture>
22 </Layer>
23 <Layer level="OVERLAY">
24 <Texture name="$parentOverlay" file="Interface\Buttons\UI-Debuff-Overlays" nonBlocking="true">
25 <Size>
26 <AbsDimension x="24" y="24"/>
27 </Size>
28 <Anchors>
29 <Anchor point="BOTTOMLEFT">
30 <Offset>
31 <AbsDimension x="6" y="12"/>
32 </Offset>
33 </Anchor>
34 </Anchors>
35 <TexCoords left="0.296875" right="0.5703125" top="0" bottom="0.515625"/>
36 </Texture>
37 <FontString name="$parentText" inherits="SystemFont_Outline_Small" setAllPoints="true" justifyV="BOTTOM"/>
38 </Layer>
39 <Layer level="BACKGROUND">
40 <Texture name="$parentBackground" nonBlocking="true" setAllPoints="true">
41 <Color r="0" g="0" b="0" a="1"/>
42 </Texture>
43 </Layer>
44 </Layers>
45 <Scripts>
46 <OnLoad>Chorus.auraButtonMain(self);</OnLoad>
47 <OnEnter>
48 GameTooltip:SetOwner(self, "ANCHOR_BOTTOMLEFT");
49 GameTooltip:SetFrameLevel(self:GetFrameLevel() + 2);
50 GameTooltip:SetUnitAura(self.unit, self.index, self.filter);
51 </OnEnter>
52 <OnLeave>
53 GameTooltip:Hide();
54 </OnLeave>
55 </Scripts>
56 </Frame>
57 </Ui>
File src/ChorusAuraFrameTemplate.lua added (mode: 100644) (index 0000000..3402231)
1 local Chorus = Chorus
2
3 local UnitAura = UnitAura
4
5 --[[ TODO Globalize special spells. ]]--
6 local auraWeightMap = {
7 ['Aimed Shot'] = 1,
8 ['Anti-Magic Shell'] = 2,
9 ['Avenging Wrath'] = 3,
10 ['Bladestorm'] = 3,
11 ['Blind'] = 3,
12 ['Chains of Ice'] = 1,
13 ['Cheap Shot'] = 1,
14 ['Concussion Blow'] = 1,
15 ['Cyclone'] = 3,
16 ['Deterrence'] = 3,
17 ['Disarm'] = 2,
18 ['Disarmed'] = 2,
19 ['Divine Plea'] = 1,
20 ['Divine Shield'] = 3,
21 ['Entangling Roots'] = 1,
22 ['Evasion'] = 2,
23 ['Evocation'] = 2,
24 ['Fear'] = 2,
25 ['Freezing Trap'] = 2,
26 ['Gnaw'] = 2,
27 ['Gouge'] = 2,
28 ['Grounding Totem Effect'] = 2,
29 ['Grounding Totem'] = 2,
30 ['Hammer of Justice'] = 1,
31 ['Hamstring'] = 1,
32 ['Hand of Freedom'] = 1,
33 ['Hand of Protection'] = 2,
34 ['Hand of Sacrifice'] = 1,
35 ['Hand of Salvation'] = 1,
36 ['Hex'] = 2,
37 ['Hibernation'] = 2,
38 ['Ice Block'] = 3,
39 ['Icebound Fortitude'] = 3,
40 ['Kidney Shot'] = 1,
41 ['Last Stand'] = 3,
42 ['Mind Control'] = 3,
43 ['Mortal Strike'] = 1,
44 ['Polymorph'] = 2,
45 ['Psychic Scream'] = 2,
46 ['Recklessness'] = 3,
47 ['Sacrifice'] = 2,
48 ['Sap'] = 3,
49 ['Seduction'] = 2,
50 ['Shield Block'] = 2,
51 ['Shield Wall'] = 3,
52 ['Sleep'] = 2,
53 ['Spell Reflection'] = 2,
54 ['Unstable Affliction'] = 2,
55 ['Wounding Poison'] = 1,
56 }
57
58 Chorus.auraWeightMap = auraWeightMap
59
60 local function getAuraWeight(unitDesignation, auraIndex, filter)
61 local name, _, _, _, category, durationSec, owner = UnitAura(unitDesignation, auraIndex, filter)
62 if not name then
63 return 0
64 end
65
66 --[[ TODO Make sure getAuraWeight implementation does not depend on locale. ]]--
67 local major = 1
68 if 'Magic' == category then
69 major = 5
70 elseif 'Poison' == category then
71 major = 4
72 elseif 'Disease' == category then
73 major = 3
74 elseif 'Curse' == category then
75 major = 2
76 end
77 major = math.min(math.max(1, math.floor(math.abs(major))), 9)
78
79 local minor = auraWeightMap[name] or 0
80 minor = math.min(math.max(1, math.floor(math.abs(minor))), 9)
81
82 local patch = 1
83 if not durationSec or durationSec < 1 then
84 patch = 0
85 end
86
87 local ownerPrio = 1
88 if 'player' == owner then
89 ownerPrio = 2
90 end
91
92 return 1000000 * ownerPrio + major * 100000 + minor * 10000 + patch * (3601 - math.min(durationSec, 3600))
93 end
94
95 local function getAuraPriorityList(unitDesignation, filter)
96 local t = {}
97 local i = 0
98 while (i < 8192) do
99 i = i + 1
100 local name = UnitAura(unitDesignation, i, filter)
101 if not name then
102 break
103 end
104 t[i] = i
105 end
106
107 table.sort(t, function(a, b)
108 local p = getAuraWeight(unitDesignation, a, filter)
109 local q = getAuraWeight(unitDesignation, b, filter)
110 return p > q
111 end)
112
113 return t
114 end
115
116 local function auraFrameEventProcessor(self, eventCategory, ...)
117 assert(self ~= nil)
118
119 local unitDesignation = self.unit or 'none'
120 assert(unitDesignation ~= nil)
121 assert('string' == type(unitDesignation))
122 unitDesignation = string.lower(strtrim(unitDesignation))
123 assert(string.len(unitDesignation) >= 1)
124 assert(string.len(unitDesignation) <= 256)
125
126 if 'UNIT_AURA' == eventCategory then
127 local u = select(1, ...)
128 if u and 'string' == type(u) and unitDesignation ~= u then
129 return
130 end
131 end
132
133 local filter = self.filter
134 assert(filter ~= nil)
135 assert('string' == type(filter))
136 filter = string.upper(strtrim(filter))
137 assert(string.len(filter) >= 1)
138 assert(string.len(filter) <= 256)
139
140 local q = getAuraPriorityList(unitDesignation, filter)
141 assert(q ~= nil)
142 assert('table' == type(q))
143
144 local i = 0
145 local t = {self:GetChildren()}
146 while (i < #q) do
147 i = i + 1
148 local b = t[i]
149 if not b then
150 break
151 end
152 assert(b ~= nil)
153 b.unit = unitDesignation
154 b.filter = filter
155
156 local k = q[i]
157 assert(k ~= nil)
158 assert('number' == type(k))
159 k = math.floor(math.abs(k))
160 assert(k >= 0)
161 b.index = k
162
163 local func = b:GetScript('OnEvent')
164 if func then
165 func(b, eventCategory, ...)
166 end
167 end
168
169 while (i < #t) do
170 i = i + 1
171 local b = t[i]
172 assert(b ~= nil)
173 b.unit = unitDesignation
174 b.filter = filter
175 b.index = 0
176
177 local func = b:GetScript('OnEvent')
178 if func then
179 func(b, eventCategory, ...)
180 end
181 end
182 end
183
184 function Chorus.auraFrameMain(self)
185 assert(self ~= nil)
186
187 local background = self:CreateTexture(self:GetName() .. 'Background', 'BACKGROUND')
188 background:SetAllPoints()
189 background:SetTexture(0, 0, 0, 0.6)
190
191 self:RegisterEvent('PLAYER_FOCUS_CHANGED')
192 self:RegisterEvent('PLAYER_TARGET_CHANGED')
193 self:RegisterEvent('UNIT_AURA')
194 self:SetScript('OnEvent', auraFrameEventProcessor)
195 end
File src/ChorusAuraFrameTemplate.xml added (mode: 100644) (index 0000000..7e4b82f)
1 <?xml version="1.0" encoding="UTF-8"?>
2 <Ui xmlns="http://www.blizzard.com/wow/ui/">
3 <Script file="ChorusAuraFrameTemplate.lua"/>
4 <Frame name="ChorusAuraFrameTemplate" virtual="true">
5 <Size>
6 <AbsDimension x="216" y="36" />
7 </Size>
8 <Frames>
9 <Frame name="$parentButton1" inherits="ChorusAuraButtonTemplate">
10 <Anchors>
11 <Anchor point="BOTTOMLEFT" relativeTo="$parent" relativePoint="BOTTOMLEFT">
12 <Offset>
13 <AbsDimension x="0" y="0"/>
14 </Offset>
15 </Anchor>
16 </Anchors>
17 </Frame>
18 <Frame name="$parentButton2" inherits="ChorusAuraButtonTemplate">
19 <Anchors>
20 <Anchor point="BOTTOMLEFT" relativeTo="$parentButton1" relativePoint="BOTTOMRIGHT">
21 <Offset>
22 <AbsDimension x="0" y="0"/>
23 </Offset>
24 </Anchor>
25 </Anchors>
26 </Frame>
27 <Frame name="$parentButton3" inherits="ChorusAuraButtonTemplate">
28 <Anchors>
29 <Anchor point="BOTTOMLEFT" relativeTo="$parentButton2" relativePoint="BOTTOMRIGHT">
30 <Offset>
31 <AbsDimension x="0" y="0"/>
32 </Offset>
33 </Anchor>
34 </Anchors>
35 </Frame>
36 <Frame name="$parentButton4" inherits="ChorusAuraButtonTemplate">
37 <Anchors>
38 <Anchor point="BOTTOMLEFT" relativeTo="$parentButton3" relativePoint="BOTTOMRIGHT">
39 <Offset>
40 <AbsDimension x="0" y="0"/>
41 </Offset>
42 </Anchor>
43 </Anchors>
44 </Frame>
45 <Frame name="$parentButton5" inherits="ChorusAuraButtonTemplate">
46 <Anchors>
47 <Anchor point="BOTTOMLEFT" relativeTo="$parentButton4" relativePoint="BOTTOMRIGHT">
48 <Offset>
49 <AbsDimension x="0" y="0"/>
50 </Offset>
51 </Anchor>
52 </Anchors>
53 </Frame>
54 <Frame name="$parentButton6" inherits="ChorusAuraButtonTemplate">
55 <Anchors>
56 <Anchor point="BOTTOMLEFT" relativeTo="$parentButton5" relativePoint="BOTTOMRIGHT">
57 <Offset>
58 <AbsDimension x="0" y="0"/>
59 </Offset>
60 </Anchor>
61 </Anchors>
62 </Frame>
63 </Frames>
64 <Scripts>
65 <OnLoad>Chorus.auraFrameMain(self);</OnLoad>
66 </Scripts>
67 </Frame>
68 </Ui>
File src/ChorusTestFrame.xml added (mode: 100644) (index 0000000..39fa942)
1 <?xml version="1.0" encoding="UTF-8"?>
2 <Ui xmlns="http://www.blizzard.com/wow/ui/">
3 <Frame name="ChorusTestFrame">
4 <Size>
5 <AbsDimension x="216" y="76"/>
6 </Size>
7 <Anchors>
8 <Anchor point="CENTER">
9 <Offset>
10 <AbsDimension x="0" y="-144"/>
11 </Offset>
12 </Anchor>
13 </Anchors>
14 <Frames>
15 <Frame name="ChorusTestTargetBuffFrame" inherits="ChorusAuraFrameTemplate">
16 <Anchors>
17 <Anchor point="BOTTOMLEFT">
18 <Offset>
19 <AbsDimension x="0" y="36"/>
20 </Offset>
21 </Anchor>
22 </Anchors>
23 </Frame>
24
25 <Frame name="ChorusTestTargetDebuffFrame" inherits="ChorusAuraFrameTemplate">
26 <Anchors>
27 <Anchor point="BOTTOMLEFT">
28 <Offset>
29 <AbsDimension x="0" y="0"/>
30 </Offset>
31 </Anchor>
32 </Anchors>
33 </Frame>
34 </Frames>
35 <Scripts>
36 <OnLoad>
37 ChorusTestTargetBuffFrame.filter = 'HELPFUL';
38 ChorusTestTargetBuffFrame.unit = 'target';
39 ChorusTestTargetDebuffFrame.filter = 'HARMFUL';
40 ChorusTestTargetDebuffFrame.unit = 'target';
41 </OnLoad>
42 </Scripts>
43 </Frame>
44 </Ui>
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