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