farmbuyer@1
|
1 --[[
|
farmbuyer@1
|
2 Not really meant for public use. Stuff that I keep using everywhere and
|
farmbuyer@1
|
3 got tired of reimplementing, or even copy-and-pasting. The notes here are
|
farmbuyer@1
|
4 reminders to myself.
|
farmbuyer@1
|
5
|
farmbuyer@1
|
6 Library contents:
|
farmbuyer@1
|
7 - author_debug
|
farmbuyer@1
|
8 Evaluates to true if I'm hacking on something.
|
farmbuyer@1
|
9
|
farmbuyer@1
|
10 - tableprint(t)
|
farmbuyer@1
|
11 A single print() call to the contents of T, including nils; strings are
|
farmbuyer@1
|
12 cleaned up with respect to embedded '|'/control chars. If there is a
|
farmbuyer@1
|
13 global LIBFARMPRINT function, it is called with the cleaned-up T instead
|
farmbuyer@1
|
14 of directly calling print.
|
farmbuyer@1
|
15
|
farmbuyer@1
|
16 - safeprint(...)
|
farmbuyer@1
|
17 Same as tableprint() on the argument list.
|
farmbuyer@1
|
18
|
farmbuyer@1
|
19 - safeiprint(...)
|
farmbuyer@1
|
20 Same as safeprint() but with index numbers inserted. Ex:
|
farmbuyer@1
|
21 safeiprint(a,b,c) --> <1>,a,<2>,b,<3>,c
|
farmbuyer@1
|
22
|
farmbuyer@1
|
23 - CHAT(n)
|
farmbuyer@1
|
24 Returns a function suitable for assigning to LIBFARMPRINT, directing all
|
farmbuyer@1
|
25 output to builtin chat frame N.
|
farmbuyer@1
|
26
|
farmbuyer@1
|
27 - t = StaticPopup(t)
|
farmbuyer@1
|
28 Fills out "typical" settings inside T, especially if T contains any kind
|
farmbuyer@1
|
29 of editbox:
|
farmbuyer@1
|
30 + cannot accept an empty editbox
|
farmbuyer@1
|
31 + pressing Enter runs OnAccept
|
farmbuyer@1
|
32 + editbox grabs keyboard focus
|
farmbuyer@1
|
33 + OnAccept runs with editbox's text in dialog.usertext
|
farmbuyer@1
|
34 Returns T.
|
farmbuyer@1
|
35
|
farmbuyer@1
|
36 - nullfunc()
|
farmbuyer@1
|
37 Empty placeholder function. Will be less useful if WoW ever moves to Lua 5.2.
|
farmbuyer@1
|
38 This is a fascinating and educational place to insert print calls...
|
farmbuyer@1
|
39
|
farmbuyer@1
|
40 - tabledump(t)/dumptable(t)
|
farmbuyer@1
|
41 If author_debug, this runs the builtin /dump command on T. Otherwise nothing.
|
farmbuyer@1
|
42
|
farmbuyer@1
|
43 - DoOnceNextUpdate(f)
|
farmbuyer@1
|
44 Runs F on the next frame refresh cycle. Multiple calls in one cycle will
|
farmbuyer@1
|
45 stack LIFO. Calls *while* processing the stack are safe, and will be stacked
|
farmbuyer@1
|
46 up for the next cycle.
|
farmbuyer@1
|
47 ]]
|
farmbuyer@1
|
48
|
farmbuyer@1
|
49 local MAJOR, MINOR = "LibFarmbuyer", 7
|
farmbuyer@1
|
50 assert(LibStub,MAJOR.." requires LibStub")
|
farmbuyer@1
|
51 local lib = LibStub:NewLibrary(MAJOR, MINOR)
|
farmbuyer@1
|
52 if not lib then return end
|
farmbuyer@1
|
53
|
farmbuyer@1
|
54 _G[MAJOR] = lib
|
farmbuyer@1
|
55
|
farmbuyer@1
|
56 ----------------------------------------------------------------------
|
farmbuyer@1
|
57 local new, del, copy, clear
|
farmbuyer@1
|
58
|
farmbuyer@1
|
59
|
farmbuyer@1
|
60 ----------------------------------------------------------------------
|
farmbuyer@1
|
61 --[[
|
farmbuyer@1
|
62 safeprint
|
farmbuyer@1
|
63 ]]
|
farmbuyer@1
|
64 local function undocontrol(c)
|
farmbuyer@1
|
65 return ("\\%.3d"):format(c:byte())
|
farmbuyer@1
|
66 end
|
farmbuyer@1
|
67 function lib.CHAT(n)
|
farmbuyer@1
|
68 local cf = _G["ChatFrame"..n]
|
farmbuyer@1
|
69 return function(t)
|
farmbuyer@1
|
70 local msg = table.concat(t,' ', i, tonumber(t.n) or #t)
|
farmbuyer@1
|
71 cf:AddMessage(msg)
|
farmbuyer@1
|
72 end
|
farmbuyer@1
|
73 end
|
farmbuyer@1
|
74 function lib.safeprint(...)
|
farmbuyer@1
|
75 local args = { n=select('#',...), ... }
|
farmbuyer@1
|
76 lib.tableprint(args)
|
farmbuyer@1
|
77 end
|
farmbuyer@1
|
78 function lib.safeiprint(...)
|
farmbuyer@1
|
79 local args = { n=select('#',...), ... }
|
farmbuyer@1
|
80 local last = args.n
|
farmbuyer@1
|
81 while last > 0 do
|
farmbuyer@1
|
82 table.insert (args, last, "<"..last..">")
|
farmbuyer@1
|
83 last = last - 1
|
farmbuyer@1
|
84 end
|
farmbuyer@1
|
85 args.n = 2 * args.n
|
farmbuyer@1
|
86 lib.tableprint(args)
|
farmbuyer@1
|
87 end
|
farmbuyer@1
|
88 function lib.tableprint(t)
|
farmbuyer@1
|
89 for i = 1, (tonumber(t.n) or #t) do
|
farmbuyer@1
|
90 t[i] = tostring(t[i]):gsub('\124','\124\124')
|
farmbuyer@1
|
91 :gsub('(%c)', undocontrol)
|
farmbuyer@1
|
92 end
|
farmbuyer@1
|
93 if type(_G.LIBFARMPRINT) == 'function' then
|
farmbuyer@1
|
94 return _G.LIBFARMPRINT(t)
|
farmbuyer@1
|
95 else
|
farmbuyer@1
|
96 return print(unpack(t))
|
farmbuyer@1
|
97 end
|
farmbuyer@1
|
98 end
|
farmbuyer@1
|
99
|
farmbuyer@1
|
100 -- See below for global versions.
|
farmbuyer@1
|
101
|
farmbuyer@1
|
102
|
farmbuyer@1
|
103 ----------------------------------------------------------------------
|
farmbuyer@1
|
104 local StaticPopupDialogs = _G.StaticPopupDialogs
|
farmbuyer@1
|
105
|
farmbuyer@1
|
106 local function EditBoxOnTextChanged_notempty (editbox) -- this is also called when first shown
|
farmbuyer@1
|
107 if editbox:GetText() ~= "" then
|
farmbuyer@1
|
108 editbox:GetParent().button1:Enable()
|
farmbuyer@1
|
109 else
|
farmbuyer@1
|
110 editbox:GetParent().button1:Disable()
|
farmbuyer@1
|
111 end
|
farmbuyer@1
|
112 end
|
farmbuyer@1
|
113 local function EditBoxOnEnterPressed_accept (editbox)
|
farmbuyer@1
|
114 local dialog = editbox:GetParent()
|
farmbuyer@1
|
115 StaticPopupDialogs[dialog.which].OnAccept (dialog, dialog.data, dialog.data2)
|
farmbuyer@1
|
116 dialog:Hide()
|
farmbuyer@1
|
117 end
|
farmbuyer@1
|
118 local function OnShow_witheditbox (dialog, data)
|
farmbuyer@1
|
119 local info = StaticPopupDialogs[dialog.which]
|
farmbuyer@1
|
120 dialog[info.hasWideEditBox and "wideEditBox" or "editBox"]:SetFocus()
|
farmbuyer@1
|
121 if info.farm_OnShow then
|
farmbuyer@1
|
122 return info.farm_OnShow (dialog, data)
|
farmbuyer@1
|
123 end
|
farmbuyer@1
|
124 end
|
farmbuyer@1
|
125 local function OnAccept_witheditbox (dialog, data, data2)
|
farmbuyer@1
|
126 local info = StaticPopupDialogs[dialog.which]
|
farmbuyer@1
|
127 dialog.usertext = dialog[info.hasWideEditBox and "wideEditBox" or "editBox"]:GetText():trim()
|
farmbuyer@1
|
128 if info.farm_OnAccept then
|
farmbuyer@1
|
129 return info.farm_OnAccept (dialog, data, data2)
|
farmbuyer@1
|
130 end
|
farmbuyer@1
|
131 end
|
farmbuyer@1
|
132
|
farmbuyer@1
|
133 --[[
|
farmbuyer@1
|
134 StaticPopup
|
farmbuyer@1
|
135 ]]
|
farmbuyer@1
|
136 function lib.StaticPopup (t)
|
farmbuyer@1
|
137 if t.hasEditBox then
|
farmbuyer@1
|
138 t.EditBoxOnTextChanged = EditBoxOnTextChanged_notempty
|
farmbuyer@1
|
139 t.EditBoxOnEnterPressed = EditBoxOnEnterPressed_accept
|
farmbuyer@1
|
140 if t.OnShow then
|
farmbuyer@1
|
141 t.farm_OnShow = t.OnShow
|
farmbuyer@1
|
142 end
|
farmbuyer@1
|
143 t.OnShow = OnShow_witheditbox
|
farmbuyer@1
|
144 if t.OnAccept then
|
farmbuyer@1
|
145 t.farm_OnAccept = t.OnAccept
|
farmbuyer@1
|
146 end
|
farmbuyer@1
|
147 t.OnAccept = OnAccept_witheditbox
|
farmbuyer@1
|
148 -- this calls OnCancel with "clicked", unless noCancelOnEscape is set
|
farmbuyer@1
|
149 t.EditBoxOnEscapePressed = StaticPopup_EscapePressed
|
farmbuyer@1
|
150 end
|
farmbuyer@1
|
151
|
farmbuyer@1
|
152 t.timeout = 0
|
farmbuyer@1
|
153 t.whileDead = true
|
farmbuyer@1
|
154 t.hideOnEscape = true
|
farmbuyer@1
|
155 t.enterClicksFirstButton = true
|
farmbuyer@1
|
156
|
farmbuyer@1
|
157 return t
|
farmbuyer@1
|
158 end
|
farmbuyer@1
|
159
|
farmbuyer@1
|
160
|
farmbuyer@1
|
161 ----------------------------------------------------------------------
|
farmbuyer@1
|
162 --[[
|
farmbuyer@1
|
163 This is ugly, but at least it all gets GC'd almost immediately.
|
farmbuyer@1
|
164 ]]
|
farmbuyer@1
|
165 function lib.nullfunc() end
|
farmbuyer@1
|
166
|
farmbuyer@1
|
167 if ({
|
farmbuyer@1
|
168 ["Bandwagon"] = true, ["Kilvin"] = true, ["Waterfaucet"] = true,
|
farmbuyer@1
|
169 ["Farmbuyer"] = true, ["Oxdeadbeef"] = true, ["Pointystick"] = true,
|
farmbuyer@1
|
170 ["Angryhobbit"] = true, ["Malrubius"] = true, ["Hemogoblin"] = true,
|
farmbuyer@1
|
171 })[UnitName("player")] then
|
farmbuyer@1
|
172 lib.author_debug = true
|
farmbuyer@1
|
173 _G.safeprint = lib.safeprint
|
farmbuyer@1
|
174 _G.safeiprint = lib.safeiprint
|
farmbuyer@1
|
175 function lib.tabledump(t)
|
farmbuyer@1
|
176 _G.UIParentLoadAddOn("Blizzard_DebugTools")
|
farmbuyer@1
|
177 _G.LibF_DEBUG = t
|
farmbuyer@1
|
178 _G.SlashCmdList.DUMP("LibF_DEBUG")
|
farmbuyer@1
|
179 end
|
farmbuyer@1
|
180 else
|
farmbuyer@1
|
181 lib.tabledump = lib.nullfunc
|
farmbuyer@1
|
182 end
|
farmbuyer@1
|
183 lib.dumptable = lib.tabledump
|
farmbuyer@1
|
184
|
farmbuyer@1
|
185
|
farmbuyer@1
|
186 ----------------------------------------------------------------------
|
farmbuyer@1
|
187 --[[
|
farmbuyer@1
|
188 DoOnceNextUpdate
|
farmbuyer@1
|
189 ]]
|
farmbuyer@1
|
190 do
|
farmbuyer@1
|
191 local frame = CreateFrame("Frame", "LibFarmbuyerDONUFrame")
|
farmbuyer@1
|
192 frame:Hide()
|
farmbuyer@1
|
193 frame:SetScript("OnUpdate", function()
|
farmbuyer@1
|
194 frame:Hide()
|
farmbuyer@1
|
195 local q = frame.nexttime
|
farmbuyer@1
|
196 local tmp
|
farmbuyer@1
|
197 frame.nexttime = nil
|
farmbuyer@1
|
198 while q do
|
farmbuyer@1
|
199 tmp = q
|
farmbuyer@1
|
200 q.f(frame)
|
farmbuyer@1
|
201 q = q.n
|
farmbuyer@1
|
202 del(tmp)
|
farmbuyer@1
|
203 end
|
farmbuyer@1
|
204 end)
|
farmbuyer@1
|
205
|
farmbuyer@1
|
206 function lib.DoOnceNextUpdate (func)
|
farmbuyer@1
|
207 local nextt = new()
|
farmbuyer@1
|
208 nextt.f = func
|
farmbuyer@1
|
209 nextt.n = frame.nexttime
|
farmbuyer@1
|
210 frame.nexttime = nextt
|
farmbuyer@1
|
211 frame:Show()
|
farmbuyer@1
|
212 end
|
farmbuyer@1
|
213 end
|
farmbuyer@1
|
214
|
farmbuyer@1
|
215
|
farmbuyer@1
|
216 ----------------------------------------------------------------------
|
farmbuyer@1
|
217 -- Recycling functions yoinked from AceConfigDialog and tweaked
|
farmbuyer@1
|
218 do
|
farmbuyer@1
|
219 local pool = setmetatable({},{__mode="k"})
|
farmbuyer@1
|
220 function clear()
|
farmbuyer@1
|
221 wipe(pool)
|
farmbuyer@1
|
222 end
|
farmbuyer@1
|
223 function new(...) -- slightly modified variant, takes optional initializers
|
farmbuyer@1
|
224 local t = next(pool)
|
farmbuyer@1
|
225 if t then
|
farmbuyer@1
|
226 pool[t] = nil
|
farmbuyer@1
|
227 for i = 1, select('#',...) do
|
farmbuyer@1
|
228 t[i] = select(i,...)
|
farmbuyer@1
|
229 end
|
farmbuyer@1
|
230 return t
|
farmbuyer@1
|
231 else
|
farmbuyer@1
|
232 return {...}
|
farmbuyer@1
|
233 end
|
farmbuyer@1
|
234 end
|
farmbuyer@1
|
235 function copy(t)
|
farmbuyer@1
|
236 local c = new()
|
farmbuyer@1
|
237 for k, v in pairs(t) do
|
farmbuyer@1
|
238 c[k] = v
|
farmbuyer@1
|
239 end
|
farmbuyer@1
|
240 return c
|
farmbuyer@1
|
241 end
|
farmbuyer@1
|
242 function del(t)
|
farmbuyer@1
|
243 wipe(t)
|
farmbuyer@1
|
244 pool[t] = true
|
farmbuyer@1
|
245 end
|
farmbuyer@1
|
246 end
|
farmbuyer@1
|
247
|
farmbuyer@1
|
248 -- vim: noet
|