Mercurial > wow > itemauditor
comparison Libs/AceGUI-3.0/widgets/AceGUIWidget-ScrollFrame.lua @ 0:169f5211fc7f
First public revision.
At this point ItemAuditor watches mail for auctions sold or purchased, watches for buy/sell (money and 1 item type change) and conversions/tradeskills. Milling isn't working yet because there is too much time between the first event and the last event.
author | Asa Ayers <Asa.Ayers@Gmail.com> |
---|---|
date | Thu, 20 May 2010 19:22:19 -0700 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:169f5211fc7f |
---|---|
1 local AceGUI = LibStub("AceGUI-3.0") | |
2 | |
3 -- Lua APIs | |
4 local pairs, assert, type = pairs, assert, type | |
5 local min, max, floor = math.min, math.max, math.floor | |
6 | |
7 -- WoW APIs | |
8 local CreateFrame, UIParent = CreateFrame, UIParent | |
9 | |
10 | |
11 ------------- | |
12 -- Widgets -- | |
13 ------------- | |
14 --[[ | |
15 Widgets must provide the following functions | |
16 Acquire() - Called when the object is aquired, should set everything to a default hidden state | |
17 Release() - Called when the object is Released, should remove any anchors and hide the Widget | |
18 | |
19 And the following members | |
20 frame - the frame or derivitive object that will be treated as the widget for size and anchoring purposes | |
21 type - the type of the object, same as the name given to :RegisterWidget() | |
22 | |
23 Widgets contain a table called userdata, this is a safe place to store data associated with the wigdet | |
24 It will be cleared automatically when a widget is released | |
25 Placing values directly into a widget object should be avoided | |
26 | |
27 If the Widget can act as a container for other Widgets the following | |
28 content - frame or derivitive that children will be anchored to | |
29 | |
30 The Widget can supply the following Optional Members | |
31 | |
32 | |
33 ]] | |
34 | |
35 -------------------------- | |
36 -- Scroll Frame -- | |
37 -------------------------- | |
38 do | |
39 local Type = "ScrollFrame" | |
40 local Version = 9 | |
41 | |
42 local function OnAcquire(self) | |
43 | |
44 end | |
45 | |
46 local function OnRelease(self) | |
47 self.frame:ClearAllPoints() | |
48 self.frame:Hide() | |
49 self.status = nil | |
50 -- do SetScroll after niling status, but before clearing localstatus | |
51 -- so the scroll value isnt populated back into status, but not kept in localstatus either | |
52 self:SetScroll(0) | |
53 for k in pairs(self.localstatus) do | |
54 self.localstatus[k] = nil | |
55 end | |
56 self.scrollframe:SetPoint("BOTTOMRIGHT",self.frame,"BOTTOMRIGHT",0,0) | |
57 self.scrollbar:Hide() | |
58 self.scrollBarShown = nil | |
59 self.content.height, self.content.width = nil, nil | |
60 end | |
61 | |
62 local function SetScroll(self, value) | |
63 local status = self.status or self.localstatus | |
64 local viewheight = self.scrollframe:GetHeight() | |
65 local height = self.content:GetHeight() | |
66 local offset | |
67 | |
68 if viewheight > height then | |
69 offset = 0 | |
70 else | |
71 offset = floor((height - viewheight) / 1000.0 * value) | |
72 end | |
73 self.content:ClearAllPoints() | |
74 self.content:SetPoint("TOPLEFT", self.scrollframe, "TOPLEFT", 0, offset) | |
75 self.content:SetPoint("TOPRIGHT", self.scrollframe, "TOPRIGHT", 0, offset) | |
76 status.offset = offset | |
77 status.scrollvalue = value | |
78 end | |
79 | |
80 local function MoveScroll(self, value) | |
81 local status = self.status or self.localstatus | |
82 local height, viewheight = self.scrollframe:GetHeight(), self.content:GetHeight() | |
83 | |
84 if height > viewheight then | |
85 self.scrollbar:Hide() | |
86 else | |
87 self.scrollbar:Show() | |
88 local diff = height - viewheight | |
89 local delta = 1 | |
90 if value < 0 then | |
91 delta = -1 | |
92 end | |
93 self.scrollbar:SetValue(min(max(status.scrollvalue + delta*(1000/(diff/45)),0), 1000)) | |
94 end | |
95 end | |
96 | |
97 | |
98 local function FixScroll(self) | |
99 if self.updateLock then return end | |
100 self.updateLock = true | |
101 local status = self.status or self.localstatus | |
102 local height, viewheight = self.scrollframe:GetHeight(), self.content:GetHeight() | |
103 local offset = status.offset or 0 | |
104 local curvalue = self.scrollbar:GetValue() | |
105 if viewheight < height then | |
106 if self.scrollBarShown then | |
107 self.scrollBarShown = nil | |
108 self.scrollbar:Hide() | |
109 self.scrollbar:SetValue(0) | |
110 self.scrollframe:SetPoint("BOTTOMRIGHT",self.frame,"BOTTOMRIGHT",0,0) | |
111 self:DoLayout() | |
112 end | |
113 else | |
114 if not self.scrollBarShown then | |
115 self.scrollBarShown = true | |
116 self.scrollbar:Show() | |
117 self.scrollframe:SetPoint("BOTTOMRIGHT", self.frame,"BOTTOMRIGHT",-20,0) | |
118 self:DoLayout() | |
119 end | |
120 local value = (offset / (viewheight - height) * 1000) | |
121 if value > 1000 then value = 1000 end | |
122 self.scrollbar:SetValue(value) | |
123 self:SetScroll(value) | |
124 if value < 1000 then | |
125 self.content:ClearAllPoints() | |
126 self.content:SetPoint("TOPLEFT", self.scrollframe, "TOPLEFT", 0, offset) | |
127 self.content:SetPoint("TOPRIGHT", self.scrollframe, "TOPRIGHT", 0, offset) | |
128 status.offset = offset | |
129 end | |
130 end | |
131 self.updateLock = nil | |
132 end | |
133 | |
134 local function OnMouseWheel(this, value) | |
135 this.obj:MoveScroll(value) | |
136 end | |
137 | |
138 local function OnScrollValueChanged(this, value) | |
139 this.obj:SetScroll(value) | |
140 end | |
141 | |
142 local function FixScrollOnUpdate(this) | |
143 this:SetScript("OnUpdate", nil) | |
144 this.obj:FixScroll() | |
145 end | |
146 | |
147 local function OnSizeChanged(this) | |
148 this:SetScript("OnUpdate", FixScrollOnUpdate) | |
149 end | |
150 | |
151 local function LayoutFinished(self, width, height) | |
152 self.content:SetHeight(height or 0 + 20) | |
153 self.scrollframe:SetScript("OnUpdate", FixScrollOnUpdate) | |
154 end | |
155 | |
156 -- called to set an external table to store status in | |
157 local function SetStatusTable(self, status) | |
158 assert(type(status) == "table") | |
159 self.status = status | |
160 if not status.scrollvalue then | |
161 status.scrollvalue = 0 | |
162 end | |
163 end | |
164 | |
165 local function OnWidthSet(self, width) | |
166 local content = self.content | |
167 content.width = width | |
168 end | |
169 | |
170 | |
171 local function OnHeightSet(self, height) | |
172 local content = self.content | |
173 content.height = height | |
174 end | |
175 | |
176 local function Constructor() | |
177 local frame = CreateFrame("Frame", nil, UIParent) | |
178 local self = {} | |
179 self.type = Type | |
180 | |
181 self.OnRelease = OnRelease | |
182 self.OnAcquire = OnAcquire | |
183 | |
184 self.MoveScroll = MoveScroll | |
185 self.FixScroll = FixScroll | |
186 self.SetScroll = SetScroll | |
187 self.LayoutFinished = LayoutFinished | |
188 self.SetStatusTable = SetStatusTable | |
189 self.OnWidthSet = OnWidthSet | |
190 self.OnHeightSet = OnHeightSet | |
191 | |
192 self.localstatus = {} | |
193 self.frame = frame | |
194 frame.obj = self | |
195 | |
196 --Container Support | |
197 local scrollframe = CreateFrame("ScrollFrame", nil, frame) | |
198 scrollframe.obj = self | |
199 scrollframe:SetPoint("TOPLEFT", frame, "TOPLEFT", 0, 0) | |
200 scrollframe:SetPoint("BOTTOMRIGHT", frame, "BOTTOMRIGHT", 0, 0) | |
201 scrollframe:EnableMouseWheel(true) | |
202 scrollframe:SetScript("OnMouseWheel", OnMouseWheel) | |
203 scrollframe:SetScript("OnSizeChanged", OnSizeChanged) | |
204 self.scrollframe = scrollframe | |
205 | |
206 local content = CreateFrame("Frame", nil, scrollframe) | |
207 content.obj = self | |
208 content:SetPoint("TOPLEFT", scrollframe, "TOPLEFT", 0, 0) | |
209 content:SetPoint("TOPRIGHT", scrollframe, "TOPRIGHT", 0, 0) | |
210 content:SetHeight(400) | |
211 self.content = content | |
212 scrollframe:SetScrollChild(content) | |
213 | |
214 local num = AceGUI:GetNextWidgetNum(Type) | |
215 local name = ("AceConfigDialogScrollFrame%dScrollBar"):format(num) | |
216 local scrollbar = CreateFrame("Slider", name, scrollframe, "UIPanelScrollBarTemplate") | |
217 scrollbar.obj = self | |
218 scrollbar:SetPoint("TOPLEFT", scrollframe, "TOPRIGHT", 4, -16) | |
219 scrollbar:SetPoint("BOTTOMLEFT", scrollframe, "BOTTOMRIGHT", 4, 16) | |
220 scrollbar:SetScript("OnValueChanged", OnScrollValueChanged) | |
221 scrollbar:SetMinMaxValues(0, 1000) | |
222 scrollbar:SetValueStep(1) | |
223 scrollbar:SetValue(0) | |
224 scrollbar:SetWidth(16) | |
225 scrollbar:Hide() | |
226 self.scrollbar = scrollbar | |
227 | |
228 local scrollbg = scrollbar:CreateTexture(nil, "BACKGROUND") | |
229 scrollbg:SetAllPoints(scrollbar) | |
230 scrollbg:SetTexture(0, 0, 0, 0.4) | |
231 | |
232 self.localstatus.scrollvalue = 0 | |
233 | |
234 --self:FixScroll() | |
235 AceGUI:RegisterAsContainer(self) | |
236 --AceGUI:RegisterAsWidget(self) | |
237 return self | |
238 end | |
239 | |
240 AceGUI:RegisterWidgetType(Type,Constructor,Version) | |
241 end |