1
1
local MAJOR_VERSION = " LibGetFrame-1.0"
2
- local MINOR_VERSION = 1
2
+ local MINOR_VERSION = 2
3
3
if not LibStub then error (MAJOR_VERSION .. " requires LibStub." ) end
4
4
local lib , oldversion = LibStub :NewLibrary (MAJOR_VERSION , MINOR_VERSION )
5
5
if not lib then return end
@@ -38,25 +38,25 @@ local defaultFramePriorities = {
38
38
}
39
39
40
40
local defaultPlayerFrames = {
41
- [ " SUFUnitplayer" ] = true ,
42
- [ " PitBull4_Frames_Player" ] = true ,
43
- [ " ElvUF_Player" ] = true ,
44
- [ " oUF_TukuiPlayer" ] = true ,
45
- [ " PlayerFrame" ] = true ,
41
+ " SUFUnitplayer" ,
42
+ " PitBull4_Frames_Player" ,
43
+ " ElvUF_Player" ,
44
+ " oUF_TukuiPlayer" ,
45
+ " PlayerFrame" ,
46
46
}
47
47
local defaultTargetFrames = {
48
- [ " SUFUnittarget" ] = true ,
49
- [ " PitBull4_Frames_Target" ] = true ,
50
- [ " ElvUF_Target" ] = true ,
51
- [ " TargetFrame" ] = true ,
52
- [ " oUF_TukuiTarget" ] = true ,
48
+ " SUFUnittarget" ,
49
+ " PitBull4_Frames_Target" ,
50
+ " ElvUF_Target" ,
51
+ " TargetFrame" ,
52
+ " oUF_TukuiTarget" ,
53
53
}
54
54
local defaultTargettargetFrames = {
55
- [ " SUFUnittargetarget" ] = true ,
56
- [ " PitBull4_Frames_TargetTarget" ] = true ,
57
- [ " ElvUF_TargetTarget" ] = true ,
58
- [ " TargetTargetFrame" ] = true ,
59
- [ " oUF_TukuiTargetTarget" ] = true ,
55
+ " SUFUnittargetarget" ,
56
+ " PitBull4_Frames_TargetTarget" ,
57
+ " ElvUF_TargetTarget" ,
58
+ " TargetTargetFrame" ,
59
+ " oUF_TukuiTargetTarget" ,
60
60
}
61
61
62
62
local GetFramesCache = {}
@@ -93,7 +93,7 @@ local function FindButtonsForUnit(frame, target, depth)
93
93
return results
94
94
end
95
95
96
- local function GetFrames (target )
96
+ local function GetFrames (target , ignoredFrames )
97
97
if not UnitExists (target ) then
98
98
if type (target ) == " string" and target :find (" Player" ) then
99
99
target = select (6 ,GetPlayerInfoByGUID (target ))
@@ -105,20 +105,32 @@ local function GetFrames(target)
105
105
end
106
106
end
107
107
108
- local results = {}
108
+ local frames = {}
109
109
for frame , unit in pairs (GetFramesCache ) do
110
110
-- print("from cache:", frame:GetName())
111
111
if UnitIsUnit (unit , target ) then
112
112
if frame :GetAttribute (" unit" ) == unit then
113
- tinsert (results , frame )
113
+ tinsert (frames , frame )
114
114
else
115
- results = {}
115
+ frames = {}
116
116
break
117
117
end
118
118
end
119
119
end
120
+
121
+ frames = # frames > 0 and frames or FindButtonsForUnit (UIParent , target , 0 )
122
+
123
+ -- filter ignored frames
124
+ for k , frame in pairs (frames ) do
125
+ local name = frame :GetName ()
126
+ for j , filter in pairs (ignoredFrames ) do
127
+ if name :find (filter ) then
128
+ frames [k ] = nil
129
+ end
130
+ end
131
+ end
120
132
121
- return # results > 0 and results or FindButtonsForUnit ( UIParent , target , 0 )
133
+ return frames
122
134
end
123
135
124
136
local function ElvuiWorkaround (frame )
@@ -129,6 +141,13 @@ local function ElvuiWorkaround(frame)
129
141
end
130
142
end
131
143
144
+ local function TableConcat (t1 ,t2 )
145
+ for i = 1 ,# t2 do
146
+ t1 [# t1 + 1 ] = t2 [i ]
147
+ end
148
+ return t1
149
+ end
150
+
132
151
function lib .GetFrame (target , opt )
133
152
opt = opt or {}
134
153
setmetatable (opt , {
@@ -149,44 +168,33 @@ function lib.GetFrame(target, opt)
149
168
150
169
local ignoredFrames = opt .ignoreFrames
151
170
if opt .ignorePlayerFrame then
152
- for k , v in pairs (opt .playerFrames ) do
153
- ignoredFrames [k ] = v
154
- end
171
+ ignoredFrames = TableConcat (ignoredFrames , opt .playerFrames )
155
172
end
156
173
if opt .ignoreTargetFrame then
157
- for k , v in pairs (opt .targetFrames ) do
158
- ignoredFrames [k ] = v
159
- end
174
+ ignoredFrames = TableConcat (ignoredFrames , opt .targetFrames )
160
175
end
161
176
if opt .ignoreTargettargetFrame then
162
- for k , v in pairs (opt .targettargetFrames ) do
163
- ignoredFrames [k ] = v
164
- end
177
+ ignoredFrames = TableConcat (ignoredFrames , opt .targettargetFrames )
165
178
end
166
-
167
- local frames = GetFrames (target )
179
+
180
+ local frames = GetFrames (target , ignoredFrames )
168
181
if not frames then return nil end
169
182
170
183
if not opt .returnAll then
171
184
for i = 1 , # opt .framePriorities do
172
185
for _ , frame in pairs (frames ) do
173
186
local name = frame :GetName ()
174
- if not ignoredFrames [ name ] and name :find (opt .framePriorities [i ]) then
187
+ if name :find (opt .framePriorities [i ]) then
175
188
return ElvuiWorkaround (frame )
176
189
end
177
190
end
178
191
end
179
- local firstFrame = frames [1 ]
180
- if firstFrame and not ignoredFrames [firstFrame :GetName ()] then
181
- return ElvuiWorkaround (firstFrame )
192
+ if frames [1 ] then
193
+ return ElvuiWorkaround (frames [1 ])
182
194
end
183
195
else
184
196
for index , frame in pairs (frames ) do
185
- if ignoredFrames [frame :GetName ()] then
186
- frames [index ] = nil
187
- else
188
- frames [index ] = ElvuiWorkaround (frame )
189
- end
197
+ frames [index ] = ElvuiWorkaround (frame )
190
198
end
191
199
return frames
192
200
end
0 commit comments