Mercurial > wow > askmrrobot
comparison ui/AmrUiTextarea.lua @ 57:01b63b8ed811 v21
total rewrite to version 21
author | yellowfive |
---|---|
date | Fri, 05 Jun 2015 11:05:15 -0700 |
parents | |
children | cf2b6b9a8337 |
comparison
equal
deleted
inserted
replaced
56:75431c084aa0 | 57:01b63b8ed811 |
---|---|
1 --[[----------------------------------------------------------------------------- | |
2 Textarea Widget | |
3 -------------------------------------------------------------------------------]] | |
4 local Type, Version = "AmrUiTextarea", 1 | |
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 local Amr = LibStub("AceAddon-3.0"):GetAddon("AskMrRobot") | |
9 | |
10 --[[----------------------------------------------------------------------------- | |
11 Scripts | |
12 -------------------------------------------------------------------------------]] | |
13 | |
14 -- handles clicking in the scrollframe but below the bounds of the editbox (which can't be sized to same as scrollframe) | |
15 local function scrollFrameMouseUp(self) | |
16 local editbox = self.obj.editbox | |
17 editbox:SetFocus() | |
18 editbox:SetCursorPosition(editbox:GetNumLetters()) | |
19 end | |
20 | |
21 local function scrollFrameVerticalScroll(self, offset) | |
22 local editbox = self.obj.editbox | |
23 editbox:SetHitRectInsets(0, 0, offset, editbox:GetHeight() - offset - self:GetHeight()) | |
24 end | |
25 | |
26 local function editboxCursorChanged(self, _, y, _, cursorHeight) | |
27 self, y = self.obj.scrollFrame, -y | |
28 local offset = self:GetVerticalScroll() | |
29 if y < offset then | |
30 self:SetVerticalScroll(y) | |
31 else | |
32 y = y + cursorHeight - self:GetHeight() | |
33 if y > offset then | |
34 self:SetVerticalScroll(y) | |
35 end | |
36 end | |
37 end | |
38 | |
39 local function editboxEditFocusLost(self) | |
40 self:HighlightText(0, 0) | |
41 self.obj:Fire("OnEditFocusLost") | |
42 end | |
43 | |
44 local function editboxEditFocusGained(frame) | |
45 AceGUI:SetFocus(frame.obj) | |
46 frame.obj:Fire("OnEditFocusGained") | |
47 end | |
48 | |
49 local function editboxTextChanged(self, userInput) | |
50 if userInput then | |
51 self = self.obj | |
52 self:Fire("OnTextChanged", self.editbox:GetText()) | |
53 end | |
54 end | |
55 | |
56 local function editboxTextSet(self) | |
57 self:HighlightText() | |
58 self:SetCursorPosition(self:GetNumLetters()) | |
59 self = self.obj | |
60 self:Fire("OnTextSet", self.editbox:GetText()) | |
61 end | |
62 | |
63 -- works for both the scrollframe and the editbox, handles e.g. dragging a spell link into the textarea | |
64 local function onReceiveDrag(self) | |
65 local type, id, info = GetCursorInfo() | |
66 if type == "spell" then | |
67 info = GetSpellInfo(id, info) | |
68 elseif type ~= "item" then | |
69 return | |
70 end | |
71 ClearCursor() | |
72 self = self.obj | |
73 local editbox = self.editbox | |
74 if not editbox:HasFocus() then | |
75 editbox:SetFocus() | |
76 editbox:SetCursorPosition(editbox:GetNumLetters()) | |
77 end | |
78 editbox:Insert(info) | |
79 end | |
80 | |
81 --[[----------------------------------------------------------------------------- | |
82 Methods | |
83 -------------------------------------------------------------------------------]] | |
84 local methods = { | |
85 ["OnAcquire"] = function(self) | |
86 -- restore default values | |
87 self:SetWidth(200) | |
88 self:SetHeight(24) | |
89 self:SetFont(Amr.CreateFont("Regular", 16, Amr.Colors.Text)) | |
90 self:SetText("") | |
91 self.frame:ClearAllPoints() | |
92 end, | |
93 | |
94 ["SetText"] = function(self, text) | |
95 self.editbox:SetText(text) | |
96 end, | |
97 | |
98 ["GetText"] = function(self) | |
99 return self.editbox:GetText() | |
100 end, | |
101 | |
102 ["SetFont"] = function(self, font) | |
103 self.editbox:SetFontObject(font) | |
104 end, | |
105 | |
106 ["SetDisabled"] = function(self, disabled) | |
107 self.disabled = disabled | |
108 if disabled then | |
109 self.editbox:Disable() | |
110 else | |
111 self.editbox:Enable() | |
112 end | |
113 end, | |
114 | |
115 ["OnWidthSet"] = function(self, width) | |
116 self.editbox:SetWidth(width) | |
117 end, | |
118 | |
119 ["OnHeightSet"] = function(self, height) | |
120 self.editbox:SetHeight(height) | |
121 end, | |
122 | |
123 ["ClearFocus"] = function(self) | |
124 self.editbox:ClearFocus() | |
125 self.frame:SetScript("OnShow", nil) | |
126 end, | |
127 | |
128 ["SetFocus"] = function(self, highlight) | |
129 self.editbox:SetFocus() | |
130 if highlight then | |
131 self.editbox:HighlightText() | |
132 end | |
133 if not self.frame:IsShown() then | |
134 self.frame:SetScript("OnShow", function(frame) | |
135 frame.obj.editbox:SetFocus() | |
136 if highlight then | |
137 self.editbox:HighlightText() | |
138 end | |
139 frame:SetScript("OnShow", nil) | |
140 end) | |
141 end | |
142 end | |
143 } | |
144 | |
145 --[[----------------------------------------------------------------------------- | |
146 Constructor | |
147 -------------------------------------------------------------------------------]] | |
148 local function Constructor() | |
149 local name = "AmrUiTextarea" .. AceGUI:GetNextWidgetNum(Type) | |
150 local frame = CreateFrame("ScrollFrame", name, UIParent) | |
151 frame:Hide() | |
152 | |
153 frame:SetScript("OnMouseUp", scrollFrameMouseUp) | |
154 frame:SetScript("OnReceiveDrag", onReceiveDrag) | |
155 frame:HookScript("OnVerticalScroll", scrollFrameVerticalScroll) | |
156 | |
157 local editbox = CreateFrame("EditBox", name .. "Edit", frame) | |
158 editbox:SetAllPoints() | |
159 editbox:EnableMouse(true) | |
160 editbox:SetMultiLine(true) | |
161 editbox:SetAutoFocus(false) | |
162 editbox:SetCountInvisibleLetters(false) | |
163 editbox:SetTextInsets(4, 4, 4, 4) | |
164 | |
165 editbox:SetScript("OnMouseDown", onReceiveDrag) | |
166 editbox:SetScript("OnReceiveDrag", onReceiveDrag) | |
167 | |
168 editbox:SetScript("OnCursorChanged", editboxCursorChanged) | |
169 editbox:SetScript("OnEscapePressed", editbox.ClearFocus) | |
170 editbox:SetScript("OnEditFocusLost", editboxEditFocusLost) | |
171 editbox:SetScript("OnTextChanged", editboxTextChanged) | |
172 editbox:SetScript("OnTextSet", editboxTextSet) | |
173 editbox:SetScript("OnEditFocusGained", editboxEditFocusGained) | |
174 | |
175 frame:SetScrollChild(editbox) | |
176 | |
177 local border = frame:CreateTexture(nil, "BACKGROUND") | |
178 border:SetTexture(Amr.Colors.BorderGray.R, Amr.Colors.BorderGray.G, Amr.Colors.BorderGray.B, 1) | |
179 border:SetAllPoints(true) | |
180 | |
181 local bg = frame:CreateTexture(nil, "BORDER") | |
182 bg:SetTexture(Amr.Colors.BgInput.R, Amr.Colors.BgInput.G, Amr.Colors.BgInput.B, 1) | |
183 bg:SetPoint("TOPLEFT", frame, "TOPLEFT", 1, -1) | |
184 bg:SetPoint("BOTTOMRIGHT", frame, "BOTTOMRIGHT", -1, 1) | |
185 | |
186 local widget = { | |
187 editbox = editbox, | |
188 scrollFrame = frame, | |
189 frame = frame, | |
190 type = Type | |
191 } | |
192 for method, func in pairs(methods) do | |
193 widget[method] = func | |
194 end | |
195 editbox.obj, frame.obj = widget, widget | |
196 | |
197 return AceGUI:RegisterAsWidget(widget) | |
198 end | |
199 | |
200 AceGUI:RegisterWidgetType(Type, Constructor, Version) |