Mercurial > wow > askmrrobot
comparison Libs/AceGUI-3.0/widgets/AceGUIWidget-Slider.lua @ 57:01b63b8ed811 v21
total rewrite to version 21
author | yellowfive |
---|---|
date | Fri, 05 Jun 2015 11:05:15 -0700 |
parents | |
children | e31b02b24488 |
comparison
equal
deleted
inserted
replaced
56:75431c084aa0 | 57:01b63b8ed811 |
---|---|
1 --[[----------------------------------------------------------------------------- | |
2 Slider Widget | |
3 Graphical Slider, like, for Range values. | |
4 -------------------------------------------------------------------------------]] | |
5 local Type, Version = "Slider", 21 | |
6 local AceGUI = LibStub and LibStub("AceGUI-3.0", true) | |
7 if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end | |
8 | |
9 -- Lua APIs | |
10 local min, max, floor = math.min, math.max, math.floor | |
11 local tonumber, pairs = tonumber, pairs | |
12 | |
13 -- WoW APIs | |
14 local PlaySound = PlaySound | |
15 local CreateFrame, UIParent = CreateFrame, UIParent | |
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: GameFontHighlightSmall | |
20 | |
21 --[[----------------------------------------------------------------------------- | |
22 Support functions | |
23 -------------------------------------------------------------------------------]] | |
24 local function UpdateText(self) | |
25 local value = self.value or 0 | |
26 if self.ispercent then | |
27 self.editbox:SetText(("%s%%"):format(floor(value * 1000 + 0.5) / 10)) | |
28 else | |
29 self.editbox:SetText(floor(value * 100 + 0.5) / 100) | |
30 end | |
31 end | |
32 | |
33 local function UpdateLabels(self) | |
34 local min, max = (self.min or 0), (self.max or 100) | |
35 if self.ispercent then | |
36 self.lowtext:SetFormattedText("%s%%", (min * 100)) | |
37 self.hightext:SetFormattedText("%s%%", (max * 100)) | |
38 else | |
39 self.lowtext:SetText(min) | |
40 self.hightext:SetText(max) | |
41 end | |
42 end | |
43 | |
44 --[[----------------------------------------------------------------------------- | |
45 Scripts | |
46 -------------------------------------------------------------------------------]] | |
47 local function Control_OnEnter(frame) | |
48 frame.obj:Fire("OnEnter") | |
49 end | |
50 | |
51 local function Control_OnLeave(frame) | |
52 frame.obj:Fire("OnLeave") | |
53 end | |
54 | |
55 local function Frame_OnMouseDown(frame) | |
56 frame.obj.slider:EnableMouseWheel(true) | |
57 AceGUI:ClearFocus() | |
58 end | |
59 | |
60 local function Slider_OnValueChanged(frame) | |
61 local self = frame.obj | |
62 if not frame.setup then | |
63 local newvalue = frame:GetValue() | |
64 if self.step and self.step > 0 then | |
65 local min_value = self.min or 0 | |
66 newvalue = floor((newvalue - min_value) / self.step + 0.5) * self.step + min_value | |
67 end | |
68 if newvalue ~= self.value and not self.disabled then | |
69 self.value = newvalue | |
70 self:Fire("OnValueChanged", newvalue) | |
71 end | |
72 if self.value then | |
73 UpdateText(self) | |
74 end | |
75 end | |
76 end | |
77 | |
78 local function Slider_OnMouseUp(frame) | |
79 local self = frame.obj | |
80 self:Fire("OnMouseUp", self.value) | |
81 end | |
82 | |
83 local function Slider_OnMouseWheel(frame, v) | |
84 local self = frame.obj | |
85 if not self.disabled then | |
86 local value = self.value | |
87 if v > 0 then | |
88 value = min(value + (self.step or 1), self.max) | |
89 else | |
90 value = max(value - (self.step or 1), self.min) | |
91 end | |
92 self.slider:SetValue(value) | |
93 end | |
94 end | |
95 | |
96 local function EditBox_OnEscapePressed(frame) | |
97 frame:ClearFocus() | |
98 end | |
99 | |
100 local function EditBox_OnEnterPressed(frame) | |
101 local self = frame.obj | |
102 local value = frame:GetText() | |
103 if self.ispercent then | |
104 value = value:gsub('%%', '') | |
105 value = tonumber(value) / 100 | |
106 else | |
107 value = tonumber(value) | |
108 end | |
109 | |
110 if value then | |
111 PlaySound("igMainMenuOptionCheckBoxOn") | |
112 self.slider:SetValue(value) | |
113 self:Fire("OnMouseUp", value) | |
114 end | |
115 end | |
116 | |
117 local function EditBox_OnEnter(frame) | |
118 frame:SetBackdropBorderColor(0.5, 0.5, 0.5, 1) | |
119 end | |
120 | |
121 local function EditBox_OnLeave(frame) | |
122 frame:SetBackdropBorderColor(0.3, 0.3, 0.3, 0.8) | |
123 end | |
124 | |
125 --[[----------------------------------------------------------------------------- | |
126 Methods | |
127 -------------------------------------------------------------------------------]] | |
128 local methods = { | |
129 ["OnAcquire"] = function(self) | |
130 self:SetWidth(200) | |
131 self:SetHeight(44) | |
132 self:SetDisabled(false) | |
133 self:SetIsPercent(nil) | |
134 self:SetSliderValues(0,100,1) | |
135 self:SetValue(0) | |
136 self.slider:EnableMouseWheel(false) | |
137 end, | |
138 | |
139 -- ["OnRelease"] = nil, | |
140 | |
141 ["SetDisabled"] = function(self, disabled) | |
142 self.disabled = disabled | |
143 if disabled then | |
144 self.slider:EnableMouse(false) | |
145 self.label:SetTextColor(.5, .5, .5) | |
146 self.hightext:SetTextColor(.5, .5, .5) | |
147 self.lowtext:SetTextColor(.5, .5, .5) | |
148 --self.valuetext:SetTextColor(.5, .5, .5) | |
149 self.editbox:SetTextColor(.5, .5, .5) | |
150 self.editbox:EnableMouse(false) | |
151 self.editbox:ClearFocus() | |
152 else | |
153 self.slider:EnableMouse(true) | |
154 self.label:SetTextColor(1, .82, 0) | |
155 self.hightext:SetTextColor(1, 1, 1) | |
156 self.lowtext:SetTextColor(1, 1, 1) | |
157 --self.valuetext:SetTextColor(1, 1, 1) | |
158 self.editbox:SetTextColor(1, 1, 1) | |
159 self.editbox:EnableMouse(true) | |
160 end | |
161 end, | |
162 | |
163 ["SetValue"] = function(self, value) | |
164 self.slider.setup = true | |
165 self.slider:SetValue(value) | |
166 self.value = value | |
167 UpdateText(self) | |
168 self.slider.setup = nil | |
169 end, | |
170 | |
171 ["GetValue"] = function(self) | |
172 return self.value | |
173 end, | |
174 | |
175 ["SetLabel"] = function(self, text) | |
176 self.label:SetText(text) | |
177 end, | |
178 | |
179 ["SetSliderValues"] = function(self, min, max, step) | |
180 local frame = self.slider | |
181 frame.setup = true | |
182 self.min = min | |
183 self.max = max | |
184 self.step = step | |
185 frame:SetMinMaxValues(min or 0,max or 100) | |
186 UpdateLabels(self) | |
187 frame:SetValueStep(step or 1) | |
188 if self.value then | |
189 frame:SetValue(self.value) | |
190 end | |
191 frame.setup = nil | |
192 end, | |
193 | |
194 ["SetIsPercent"] = function(self, value) | |
195 self.ispercent = value | |
196 UpdateLabels(self) | |
197 UpdateText(self) | |
198 end | |
199 } | |
200 | |
201 --[[----------------------------------------------------------------------------- | |
202 Constructor | |
203 -------------------------------------------------------------------------------]] | |
204 local SliderBackdrop = { | |
205 bgFile = "Interface\\Buttons\\UI-SliderBar-Background", | |
206 edgeFile = "Interface\\Buttons\\UI-SliderBar-Border", | |
207 tile = true, tileSize = 8, edgeSize = 8, | |
208 insets = { left = 3, right = 3, top = 6, bottom = 6 } | |
209 } | |
210 | |
211 local ManualBackdrop = { | |
212 bgFile = "Interface\\ChatFrame\\ChatFrameBackground", | |
213 edgeFile = "Interface\\ChatFrame\\ChatFrameBackground", | |
214 tile = true, edgeSize = 1, tileSize = 5, | |
215 } | |
216 | |
217 local function Constructor() | |
218 local frame = CreateFrame("Frame", nil, UIParent) | |
219 | |
220 frame:EnableMouse(true) | |
221 frame:SetScript("OnMouseDown", Frame_OnMouseDown) | |
222 | |
223 local label = frame:CreateFontString(nil, "OVERLAY", "GameFontNormal") | |
224 label:SetPoint("TOPLEFT") | |
225 label:SetPoint("TOPRIGHT") | |
226 label:SetJustifyH("CENTER") | |
227 label:SetHeight(15) | |
228 | |
229 local slider = CreateFrame("Slider", nil, frame) | |
230 slider:SetOrientation("HORIZONTAL") | |
231 slider:SetHeight(15) | |
232 slider:SetHitRectInsets(0, 0, -10, 0) | |
233 slider:SetBackdrop(SliderBackdrop) | |
234 slider:SetThumbTexture("Interface\\Buttons\\UI-SliderBar-Button-Horizontal") | |
235 slider:SetPoint("TOP", label, "BOTTOM") | |
236 slider:SetPoint("LEFT", 3, 0) | |
237 slider:SetPoint("RIGHT", -3, 0) | |
238 slider:SetValue(0) | |
239 slider:SetScript("OnValueChanged",Slider_OnValueChanged) | |
240 slider:SetScript("OnEnter", Control_OnEnter) | |
241 slider:SetScript("OnLeave", Control_OnLeave) | |
242 slider:SetScript("OnMouseUp", Slider_OnMouseUp) | |
243 slider:SetScript("OnMouseWheel", Slider_OnMouseWheel) | |
244 | |
245 local lowtext = slider:CreateFontString(nil, "ARTWORK", "GameFontHighlightSmall") | |
246 lowtext:SetPoint("TOPLEFT", slider, "BOTTOMLEFT", 2, 3) | |
247 | |
248 local hightext = slider:CreateFontString(nil, "ARTWORK", "GameFontHighlightSmall") | |
249 hightext:SetPoint("TOPRIGHT", slider, "BOTTOMRIGHT", -2, 3) | |
250 | |
251 local editbox = CreateFrame("EditBox", nil, frame) | |
252 editbox:SetAutoFocus(false) | |
253 editbox:SetFontObject(GameFontHighlightSmall) | |
254 editbox:SetPoint("TOP", slider, "BOTTOM") | |
255 editbox:SetHeight(14) | |
256 editbox:SetWidth(70) | |
257 editbox:SetJustifyH("CENTER") | |
258 editbox:EnableMouse(true) | |
259 editbox:SetBackdrop(ManualBackdrop) | |
260 editbox:SetBackdropColor(0, 0, 0, 0.5) | |
261 editbox:SetBackdropBorderColor(0.3, 0.3, 0.30, 0.80) | |
262 editbox:SetScript("OnEnter", EditBox_OnEnter) | |
263 editbox:SetScript("OnLeave", EditBox_OnLeave) | |
264 editbox:SetScript("OnEnterPressed", EditBox_OnEnterPressed) | |
265 editbox:SetScript("OnEscapePressed", EditBox_OnEscapePressed) | |
266 | |
267 local widget = { | |
268 label = label, | |
269 slider = slider, | |
270 lowtext = lowtext, | |
271 hightext = hightext, | |
272 editbox = editbox, | |
273 alignoffset = 25, | |
274 frame = frame, | |
275 type = Type | |
276 } | |
277 for method, func in pairs(methods) do | |
278 widget[method] = func | |
279 end | |
280 slider.obj, editbox.obj = widget, widget | |
281 | |
282 return AceGUI:RegisterAsWidget(widget) | |
283 end | |
284 | |
285 AceGUI:RegisterWidgetType(Type,Constructor,Version) |