Nenue@2
|
1 --[[ Implements
|
Nenue@2
|
2 -- KT.register(frame) to hook the following (all optional):
|
Nenue@2
|
3 -- frame:init() run immediately after KT sets itself up
|
Nenue@2
|
4 -- frame:profile("Name-TruncatedRealm") called the first time SavedVars data becomes available
|
Nenue@2
|
5 -- frame:variables() called by PLAYER_ENTERING_WORLD
|
Nenue@2
|
6 -- frame:event(event, ...) replaces the event callback
|
Nenue@2
|
7 -- frame:ui() called by /ui when activating
|
Nenue@2
|
8 ]]--
|
Nenue@2
|
9
|
Nenue@2
|
10 --GLOBALS: LibKT, KrakTool, KTErrorFrame, LibKTError, SlashCmdList, SLASH_RL1, SLASH_UI1
|
Nenue@2
|
11 local CreateFrame, debugstack, tostring, select = CreateFrame, debugstack, tostring, select
|
Nenue@2
|
12 local print, max, unpack, tinsert = print, max, unpack, tinsert
|
Nenue@2
|
13 local ipairs, xpcall = ipairs, xpcall
|
Nenue@2
|
14 local UI_TOGGLE = false
|
Nenue@2
|
15
|
Nenue@2
|
16 KrakTool = CreateFrame('Frame', 'KrakTool', UIParent)
|
Nenue@2
|
17 LibKT = select(2, ...)
|
Nenue@2
|
18 local KT = LibKT
|
Nenue@2
|
19 KT.handler = KrakTool
|
Nenue@2
|
20 KT.frames = {}
|
Nenue@2
|
21
|
Nenue@2
|
22 SLASH_RL1 = "/rl"
|
Nenue@2
|
23 SlashCmdList.RL = function ()
|
Nenue@2
|
24 ReloadUI()
|
Nenue@2
|
25 end
|
Nenue@2
|
26
|
Nenue@2
|
27 SLASH_UI1 = "/ui"
|
Nenue@2
|
28 SlashCmdList.UI = function ()
|
Nenue@2
|
29 if UI_TOGGLE then
|
Nenue@2
|
30 UI_TOGGLE = false
|
Nenue@2
|
31 else
|
Nenue@2
|
32 UI_TOGGLE = true
|
Nenue@2
|
33 end
|
Nenue@2
|
34 for i, frame in pairs(KT.frames) do
|
Nenue@2
|
35 if UI_TOGGLE then
|
Nenue@2
|
36 if frame.close then
|
Nenue@2
|
37 frame.close()
|
Nenue@2
|
38 else
|
Nenue@2
|
39 frame:Hide()
|
Nenue@2
|
40 end
|
Nenue@2
|
41 else
|
Nenue@2
|
42 if frame.ui then
|
Nenue@2
|
43 frame.ui()
|
Nenue@2
|
44 end
|
Nenue@2
|
45 frame:Show()
|
Nenue@2
|
46 end
|
Nenue@2
|
47 end
|
Nenue@2
|
48 end
|
Nenue@2
|
49
|
Nenue@2
|
50 LibKTError = function(msg)
|
Nenue@2
|
51 local dstack = debugstack()
|
Nenue@2
|
52 :gsub("Interface\\AddOns\\",'~\\')
|
Nenue@2
|
53 :gsub("<(.-)>", function(a) return '|cFF00FFFF<'.. a ..'>|r' end)
|
Nenue@2
|
54 KTErrorFrame.errmsg:SetText(msg)
|
Nenue@2
|
55 KTErrorFrame.debugstack:SetText(dstack)
|
Nenue@2
|
56 KTErrorFrame:SetHeight(KTErrorFrame.debugstack:GetStringHeight() + KTErrorFrame.errmsg:GetStringHeight() + 12)
|
Nenue@2
|
57 KTErrorFrame:Show()
|
Nenue@2
|
58 end
|
Nenue@2
|
59
|
Nenue@2
|
60 local initStack = {}
|
Nenue@2
|
61 local eventStub = function(self, event, ...)
|
Nenue@2
|
62 local isHandled
|
Nenue@2
|
63 local nodebug
|
Nenue@2
|
64
|
Nenue@2
|
65 if self.event then
|
Nenue@2
|
66 nodebug = self.event(self, event, ...)
|
Nenue@2
|
67 end
|
Nenue@2
|
68
|
Nenue@2
|
69 if self[event] then
|
Nenue@2
|
70 nodebug = nodebug or self[event](self, event, ...)
|
Nenue@2
|
71 self.missed = 0
|
Nenue@2
|
72 self.handled = self.handled + 1
|
Nenue@2
|
73 isHandled = true
|
Nenue@2
|
74 else
|
Nenue@2
|
75 self.firstEvent = false
|
Nenue@2
|
76 self.unhandled = self.unhandled + 1
|
Nenue@2
|
77 self.missed = self.missed + 1
|
Nenue@2
|
78 end
|
Nenue@2
|
79
|
Nenue@2
|
80 if nodebug then
|
Nenue@2
|
81 return
|
Nenue@2
|
82 end
|
Nenue@2
|
83
|
Nenue@2
|
84 print(self:GetName(), event, ...)
|
Nenue@2
|
85
|
Nenue@2
|
86 -- debug outputs
|
Nenue@2
|
87 if self.status then
|
Nenue@2
|
88 self.status:SetText(event .. '\n|cFF00FF00' .. self.handled .. '|r |cFFFF8800' .. self.missed .. '|r |cFFFF4400' .. self.unhandled .. '|r')
|
Nenue@2
|
89 if isHandled then
|
Nenue@2
|
90 self.status:SetTextColor(0,1,0)
|
Nenue@2
|
91 if self.log then
|
Nenue@2
|
92 local logtext = event
|
Nenue@2
|
93 for i = 1, select('#',...) do
|
Nenue@2
|
94 logtext = logtext .. '\n' .. i .. ':' .. tostring(select(i,...))
|
Nenue@2
|
95 end
|
Nenue@2
|
96 self.log:SetText('|cFFFFFF00last|r\n' .. logtext)
|
Nenue@2
|
97 local newWidth = self.log:GetStringWidth()
|
Nenue@2
|
98
|
Nenue@2
|
99 if self.logfirst then
|
Nenue@2
|
100 if not self.firstEvent then
|
Nenue@2
|
101 self.firstEvent = event
|
Nenue@2
|
102 self.logfirst:SetText('|cFF00FF88first|r\n' .. logtext)
|
Nenue@2
|
103 end
|
Nenue@2
|
104
|
Nenue@2
|
105 newWidth = newWidth + self.logfirst:GetStringWidth()
|
Nenue@2
|
106 end
|
Nenue@2
|
107 if self.logdiff then
|
Nenue@2
|
108 if not event ~= self.firstEvent then
|
Nenue@2
|
109 self.firstEvent = event
|
Nenue@2
|
110 self.logdiff:SetText('|cFF0088FFdiff|r\n' .. logtext)
|
Nenue@2
|
111 end
|
Nenue@2
|
112 newWidth = newWidth + self.logdiff:GetStringWidth()
|
Nenue@2
|
113 end
|
Nenue@2
|
114 --self:SetWidth(newWidth)
|
Nenue@2
|
115 end
|
Nenue@2
|
116 else
|
Nenue@2
|
117 self.status:SetTextColor(1,0,0)
|
Nenue@2
|
118 end
|
Nenue@2
|
119 end
|
Nenue@2
|
120 end
|
Nenue@2
|
121
|
Nenue@2
|
122 KT.register = function(frame, name, noGUI)
|
Nenue@2
|
123 if not name then
|
Nenue@2
|
124 name = frame:GetName()
|
Nenue@2
|
125 end
|
Nenue@2
|
126
|
Nenue@2
|
127 KT.frames[name] = frame
|
Nenue@2
|
128 frame:SetScript('OnEvent', eventStub)
|
Nenue@2
|
129 frame.unhandled = 0
|
Nenue@2
|
130 frame.missed = 0
|
Nenue@2
|
131 frame.handled = 0
|
Nenue@2
|
132 frame.firstEvent = false
|
Nenue@2
|
133 tinsert(initStack, frame)
|
Nenue@2
|
134
|
Nenue@2
|
135 if noGUI then
|
Nenue@2
|
136 return
|
Nenue@2
|
137 end
|
Nenue@2
|
138
|
Nenue@2
|
139 frame.UIPanelAnchor = {'TOPLEFT', frame, 'TOPLEFT', 12, -12 }
|
Nenue@2
|
140 frame.UIPanelGrowth = {'TOPLEFT', 'TOPRIGHT', 14, 0}
|
Nenue@2
|
141 frame.button = KT.button
|
Nenue@2
|
142 frame.uibutton = KT.uibutton
|
Nenue@2
|
143 frame.tab = KT.tab
|
Nenue@2
|
144 frame.print = KT.print
|
Nenue@2
|
145
|
Nenue@2
|
146 return KT
|
Nenue@2
|
147 end
|
Nenue@2
|
148
|
Nenue@2
|
149 KT.handler:RegisterEvent('VARIABLES_LOADED')
|
Nenue@2
|
150 KT.handler:SetScript('OnEvent', function(self, event, ...)
|
Nenue@2
|
151 print('KrakTool', event, ...)
|
Nenue@2
|
152 if not LibKTDB then
|
Nenue@2
|
153 LibKTDB = {}
|
Nenue@2
|
154 end
|
Nenue@2
|
155 KT.db = LibKTDB
|
Nenue@2
|
156
|
Nenue@2
|
157 KT.db.runcount = KT.db.runcount or 1
|
Nenue@2
|
158 KT.db.runcount = KT.db.runcount + 1
|
Nenue@2
|
159 print(KT.db.runcount)
|
Nenue@2
|
160
|
Nenue@2
|
161 for i, frame in ipairs(initStack) do
|
Nenue@2
|
162 print('|cFF00FF00', i, '|r', frame:GetName())
|
Nenue@2
|
163 if frame.init then
|
Nenue@2
|
164 xpcall(frame.init, LibKTError)
|
Nenue@2
|
165 end
|
Nenue@2
|
166 end
|
Nenue@2
|
167
|
Nenue@2
|
168 self:RegisterEvent('PLAYER_ENTERING_WORLD')
|
Nenue@2
|
169 self:SetScript('OnEvent', function()
|
Nenue@2
|
170 for i, frame in ipairs(initStack) do
|
Nenue@2
|
171 print('|cFF00FFFF', i, '|r', frame:GetName())
|
Nenue@2
|
172 if frame.variables then
|
Nenue@2
|
173 xpcall(frame.variables, LibKTError)
|
Nenue@2
|
174 end
|
Nenue@2
|
175 end
|
Nenue@2
|
176 end)
|
Nenue@2
|
177 end)
|
Nenue@2
|
178
|
Nenue@2
|
179 KT.print = function(module, ...)
|
Nenue@2
|
180 print('|cFF00FFFF'..module:GetName()..'|r:', ...)
|
Nenue@2
|
181 end
|
Nenue@2
|
182
|
Nenue@2
|
183 --- Button generators
|
Nenue@2
|
184
|
Nenue@2
|
185 local GetButtonTemplate = function(name, parent, template, onClick)
|
Nenue@2
|
186 if _G[name] then
|
Nenue@2
|
187 return _G[name]
|
Nenue@2
|
188 end
|
Nenue@2
|
189
|
Nenue@2
|
190 local button = CreateFrame('Button', name, parent, template)
|
Nenue@2
|
191 button:SetScript('OnMouseUp', onClick)
|
Nenue@2
|
192 return button
|
Nenue@2
|
193 end
|
Nenue@2
|
194
|
Nenue@2
|
195 local SetButtonAnchor = function(self, collector, anchor, growth)
|
Nenue@2
|
196 if self:GetID() == 0 then
|
Nenue@2
|
197 self:SetID(#collector)
|
Nenue@2
|
198 print('registered TabButton #', self:GetID())
|
Nenue@2
|
199 end
|
Nenue@2
|
200
|
Nenue@2
|
201 if self:GetID() == 1 then
|
Nenue@2
|
202 self:SetPoint(unpack(anchor))
|
Nenue@2
|
203 else
|
Nenue@2
|
204 growth[2] = collector[self:GetID()-1]
|
Nenue@2
|
205 self:SetPoint(unpack(growth))
|
Nenue@2
|
206 end
|
Nenue@2
|
207 end
|
Nenue@2
|
208
|
Nenue@2
|
209 KT.tab = function(self, name, tooltip, texture, coords)
|
Nenue@2
|
210 local button = GetButtonTemplate(name, self, 'KTTabButton', self.SelectTab)
|
Nenue@2
|
211 button.icon:SetTexture(texture)
|
Nenue@2
|
212 button.tooltip = tooltip
|
Nenue@2
|
213 button:SetSize(unpack(self.tabSize))
|
Nenue@2
|
214 if coords then
|
Nenue@2
|
215 button.icon:SetTexCoord(unpack(coords))
|
Nenue@2
|
216 end
|
Nenue@2
|
217 SetButtonAnchor(button, self.tabButtons, self.tabAnchor, self.tabGrowth)
|
Nenue@2
|
218 return button
|
Nenue@2
|
219 end
|
Nenue@2
|
220
|
Nenue@2
|
221 KT.button = function(self, name, text, tooltip, onClick)
|
Nenue@2
|
222 local button = GetButtonTemplate(name, self, 'KTButton', onClick)
|
Nenue@2
|
223
|
Nenue@2
|
224 button.tooltip = tooltip
|
Nenue@2
|
225 button:SetText(text)
|
Nenue@2
|
226 button:SetWidth(max(button:GetWidth(), button:GetFontString():GetStringWidth() + 12))
|
Nenue@2
|
227
|
Nenue@2
|
228 SetButtonAnchor(button, self.controls, self.controlsAnchor, self.controlsGrowth)
|
Nenue@2
|
229 return button
|
Nenue@2
|
230 end
|
Nenue@2
|
231
|
Nenue@2
|
232 KT.uibutton = function(self, name, text, tooltip, onClick, texture, coords)
|
Nenue@2
|
233 local button = GetButtonTemplate(name, self, 'KTUIPanelButton', onClick)
|
Nenue@2
|
234
|
Nenue@2
|
235 button.tooltip = tooltip
|
Nenue@2
|
236 button:SetText(text)
|
Nenue@2
|
237 button.icon:SetTexture(texture)
|
Nenue@2
|
238 button:SetWidth(button:GetFontString():GetStringWidth() + button.icon:GetWidth()/1.5)
|
Nenue@2
|
239 if coords then
|
Nenue@2
|
240 button.icon:SetTexCoord(unpack(coords))
|
Nenue@2
|
241 end
|
Nenue@2
|
242 SetButtonAnchor(button, self.UIPanels, self.UIPanelAnchor, self.UIPanelGrowth)
|
Nenue@2
|
243 return button
|
Nenue@2
|
244 end
|