Mercurial > wow > askmrrobot
comparison Libs/AceGUI-3.0/widgets/AceGUIWidget-EditBox.lua @ 57:01b63b8ed811 v21
total rewrite to version 21
author | yellowfive |
---|---|
date | Fri, 05 Jun 2015 11:05:15 -0700 |
parents | |
children | e635cd648e01 |
comparison
equal
deleted
inserted
replaced
56:75431c084aa0 | 57:01b63b8ed811 |
---|---|
1 --[[----------------------------------------------------------------------------- | |
2 EditBox Widget | |
3 -------------------------------------------------------------------------------]] | |
4 local Type, Version = "EditBox", 25 | |
5 local AceGUI = LibStub and LibStub("AceGUI-3.0", true) | |
6 if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end | |
7 | |
8 -- Lua APIs | |
9 local tostring, pairs = tostring, pairs | |
10 | |
11 -- WoW APIs | |
12 local PlaySound = PlaySound | |
13 local GetCursorInfo, ClearCursor, GetSpellInfo = GetCursorInfo, ClearCursor, GetSpellInfo | |
14 local CreateFrame, UIParent = CreateFrame, UIParent | |
15 local _G = _G | |
16 | |
17 -- Global vars/functions that we don't upvalue since they might get hooked, or upgraded | |
18 -- List them here for Mikk's FindGlobals script | |
19 -- GLOBALS: AceGUIEditBoxInsertLink, ChatFontNormal, OKAY | |
20 | |
21 --[[----------------------------------------------------------------------------- | |
22 Support functions | |
23 -------------------------------------------------------------------------------]] | |
24 if not AceGUIEditBoxInsertLink then | |
25 -- upgradeable hook | |
26 hooksecurefunc("ChatEdit_InsertLink", function(...) return _G.AceGUIEditBoxInsertLink(...) end) | |
27 end | |
28 | |
29 function _G.AceGUIEditBoxInsertLink(text) | |
30 for i = 1, AceGUI:GetWidgetCount(Type) do | |
31 local editbox = _G["AceGUI-3.0EditBox"..i] | |
32 if editbox and editbox:IsVisible() and editbox:HasFocus() then | |
33 editbox:Insert(text) | |
34 return true | |
35 end | |
36 end | |
37 end | |
38 | |
39 local function ShowButton(self) | |
40 if not self.disablebutton then | |
41 self.button:Show() | |
42 self.editbox:SetTextInsets(0, 20, 3, 3) | |
43 end | |
44 end | |
45 | |
46 local function HideButton(self) | |
47 self.button:Hide() | |
48 self.editbox:SetTextInsets(0, 0, 3, 3) | |
49 end | |
50 | |
51 --[[----------------------------------------------------------------------------- | |
52 Scripts | |
53 -------------------------------------------------------------------------------]] | |
54 local function Control_OnEnter(frame) | |
55 frame.obj:Fire("OnEnter") | |
56 end | |
57 | |
58 local function Control_OnLeave(frame) | |
59 frame.obj:Fire("OnLeave") | |
60 end | |
61 | |
62 local function Frame_OnShowFocus(frame) | |
63 frame.obj.editbox:SetFocus() | |
64 frame:SetScript("OnShow", nil) | |
65 end | |
66 | |
67 local function EditBox_OnEscapePressed(frame) | |
68 AceGUI:ClearFocus() | |
69 end | |
70 | |
71 local function EditBox_OnEnterPressed(frame) | |
72 local self = frame.obj | |
73 local value = frame:GetText() | |
74 local cancel = self:Fire("OnEnterPressed", value) | |
75 if not cancel then | |
76 PlaySound("igMainMenuOptionCheckBoxOn") | |
77 HideButton(self) | |
78 end | |
79 end | |
80 | |
81 local function EditBox_OnReceiveDrag(frame) | |
82 local self = frame.obj | |
83 local type, id, info = GetCursorInfo() | |
84 if type == "item" then | |
85 self:SetText(info) | |
86 self:Fire("OnEnterPressed", info) | |
87 ClearCursor() | |
88 elseif type == "spell" then | |
89 local name = GetSpellInfo(id, info) | |
90 self:SetText(name) | |
91 self:Fire("OnEnterPressed", name) | |
92 ClearCursor() | |
93 elseif type == "macro" then | |
94 local name = GetMacroInfo(id) | |
95 self:SetText(name) | |
96 self:Fire("OnEnterPressed", name) | |
97 ClearCursor() | |
98 end | |
99 HideButton(self) | |
100 AceGUI:ClearFocus() | |
101 end | |
102 | |
103 local function EditBox_OnTextChanged(frame) | |
104 local self = frame.obj | |
105 local value = frame:GetText() | |
106 if tostring(value) ~= tostring(self.lasttext) then | |
107 self:Fire("OnTextChanged", value) | |
108 self.lasttext = value | |
109 ShowButton(self) | |
110 end | |
111 end | |
112 | |
113 local function EditBox_OnFocusGained(frame) | |
114 AceGUI:SetFocus(frame.obj) | |
115 end | |
116 | |
117 local function Button_OnClick(frame) | |
118 local editbox = frame.obj.editbox | |
119 editbox:ClearFocus() | |
120 EditBox_OnEnterPressed(editbox) | |
121 end | |
122 | |
123 --[[----------------------------------------------------------------------------- | |
124 Methods | |
125 -------------------------------------------------------------------------------]] | |
126 local methods = { | |
127 ["OnAcquire"] = function(self) | |
128 -- height is controlled by SetLabel | |
129 self:SetWidth(200) | |
130 self:SetDisabled(false) | |
131 self:SetLabel() | |
132 self:SetText() | |
133 self:DisableButton(false) | |
134 self:SetMaxLetters(0) | |
135 end, | |
136 | |
137 ["OnRelease"] = function(self) | |
138 self:ClearFocus() | |
139 end, | |
140 | |
141 ["SetDisabled"] = function(self, disabled) | |
142 self.disabled = disabled | |
143 if disabled then | |
144 self.editbox:EnableMouse(false) | |
145 self.editbox:ClearFocus() | |
146 self.editbox:SetTextColor(0.5,0.5,0.5) | |
147 self.label:SetTextColor(0.5,0.5,0.5) | |
148 else | |
149 self.editbox:EnableMouse(true) | |
150 self.editbox:SetTextColor(1,1,1) | |
151 self.label:SetTextColor(1,.82,0) | |
152 end | |
153 end, | |
154 | |
155 ["SetText"] = function(self, text) | |
156 self.lasttext = text or "" | |
157 self.editbox:SetText(text or "") | |
158 self.editbox:SetCursorPosition(0) | |
159 HideButton(self) | |
160 end, | |
161 | |
162 ["GetText"] = function(self, text) | |
163 return self.editbox:GetText() | |
164 end, | |
165 | |
166 ["SetLabel"] = function(self, text) | |
167 if text and text ~= "" then | |
168 self.label:SetText(text) | |
169 self.label:Show() | |
170 self.editbox:SetPoint("TOPLEFT",self.frame,"TOPLEFT",7,-18) | |
171 self:SetHeight(44) | |
172 self.alignoffset = 30 | |
173 else | |
174 self.label:SetText("") | |
175 self.label:Hide() | |
176 self.editbox:SetPoint("TOPLEFT",self.frame,"TOPLEFT",7,0) | |
177 self:SetHeight(26) | |
178 self.alignoffset = 12 | |
179 end | |
180 end, | |
181 | |
182 ["DisableButton"] = function(self, disabled) | |
183 self.disablebutton = disabled | |
184 if disabled then | |
185 HideButton(self) | |
186 end | |
187 end, | |
188 | |
189 ["SetMaxLetters"] = function (self, num) | |
190 self.editbox:SetMaxLetters(num or 0) | |
191 end, | |
192 | |
193 ["ClearFocus"] = function(self) | |
194 self.editbox:ClearFocus() | |
195 self.frame:SetScript("OnShow", nil) | |
196 end, | |
197 | |
198 ["SetFocus"] = function(self) | |
199 self.editbox:SetFocus() | |
200 if not self.frame:IsShown() then | |
201 self.frame:SetScript("OnShow", Frame_OnShowFocus) | |
202 end | |
203 end | |
204 } | |
205 | |
206 --[[----------------------------------------------------------------------------- | |
207 Constructor | |
208 -------------------------------------------------------------------------------]] | |
209 local function Constructor() | |
210 local num = AceGUI:GetNextWidgetNum(Type) | |
211 local frame = CreateFrame("Frame", nil, UIParent) | |
212 frame:Hide() | |
213 | |
214 local editbox = CreateFrame("EditBox", "AceGUI-3.0EditBox"..num, frame, "InputBoxTemplate") | |
215 editbox:SetAutoFocus(false) | |
216 editbox:SetFontObject(ChatFontNormal) | |
217 editbox:SetScript("OnEnter", Control_OnEnter) | |
218 editbox:SetScript("OnLeave", Control_OnLeave) | |
219 editbox:SetScript("OnEscapePressed", EditBox_OnEscapePressed) | |
220 editbox:SetScript("OnEnterPressed", EditBox_OnEnterPressed) | |
221 editbox:SetScript("OnTextChanged", EditBox_OnTextChanged) | |
222 editbox:SetScript("OnReceiveDrag", EditBox_OnReceiveDrag) | |
223 editbox:SetScript("OnMouseDown", EditBox_OnReceiveDrag) | |
224 editbox:SetScript("OnEditFocusGained", EditBox_OnFocusGained) | |
225 editbox:SetTextInsets(0, 0, 3, 3) | |
226 editbox:SetMaxLetters(256) | |
227 editbox:SetPoint("BOTTOMLEFT", 6, 0) | |
228 editbox:SetPoint("BOTTOMRIGHT") | |
229 editbox:SetHeight(19) | |
230 | |
231 local label = frame:CreateFontString(nil, "OVERLAY", "GameFontNormalSmall") | |
232 label:SetPoint("TOPLEFT", 0, -2) | |
233 label:SetPoint("TOPRIGHT", 0, -2) | |
234 label:SetJustifyH("LEFT") | |
235 label:SetHeight(18) | |
236 | |
237 local button = CreateFrame("Button", nil, editbox, "UIPanelButtonTemplate") | |
238 button:SetWidth(40) | |
239 button:SetHeight(20) | |
240 button:SetPoint("RIGHT", -2, 0) | |
241 button:SetText(OKAY) | |
242 button:SetScript("OnClick", Button_OnClick) | |
243 button:Hide() | |
244 | |
245 local widget = { | |
246 alignoffset = 30, | |
247 editbox = editbox, | |
248 label = label, | |
249 button = button, | |
250 frame = frame, | |
251 type = Type | |
252 } | |
253 for method, func in pairs(methods) do | |
254 widget[method] = func | |
255 end | |
256 editbox.obj, button.obj = widget, widget | |
257 | |
258 return AceGUI:RegisterAsWidget(widget) | |
259 end | |
260 | |
261 AceGUI:RegisterWidgetType(Type, Constructor, Version) |