Mercurial > wow > itemauditor
diff 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 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Libs/AceGUI-3.0/widgets/AceGUIWidget-ScrollFrame.lua Thu May 20 19:22:19 2010 -0700 @@ -0,0 +1,241 @@ +local AceGUI = LibStub("AceGUI-3.0") + +-- Lua APIs +local pairs, assert, type = pairs, assert, type +local min, max, floor = math.min, math.max, math.floor + +-- WoW APIs +local CreateFrame, UIParent = CreateFrame, UIParent + + +------------- +-- Widgets -- +------------- +--[[ + Widgets must provide the following functions + Acquire() - Called when the object is aquired, should set everything to a default hidden state + Release() - Called when the object is Released, should remove any anchors and hide the Widget + + And the following members + frame - the frame or derivitive object that will be treated as the widget for size and anchoring purposes + type - the type of the object, same as the name given to :RegisterWidget() + + Widgets contain a table called userdata, this is a safe place to store data associated with the wigdet + It will be cleared automatically when a widget is released + Placing values directly into a widget object should be avoided + + If the Widget can act as a container for other Widgets the following + content - frame or derivitive that children will be anchored to + + The Widget can supply the following Optional Members + + +]] + +-------------------------- +-- Scroll Frame -- +-------------------------- +do + local Type = "ScrollFrame" + local Version = 9 + + local function OnAcquire(self) + + end + + local function OnRelease(self) + self.frame:ClearAllPoints() + self.frame:Hide() + self.status = nil + -- do SetScroll after niling status, but before clearing localstatus + -- so the scroll value isnt populated back into status, but not kept in localstatus either + self:SetScroll(0) + for k in pairs(self.localstatus) do + self.localstatus[k] = nil + end + self.scrollframe:SetPoint("BOTTOMRIGHT",self.frame,"BOTTOMRIGHT",0,0) + self.scrollbar:Hide() + self.scrollBarShown = nil + self.content.height, self.content.width = nil, nil + end + + local function SetScroll(self, value) + local status = self.status or self.localstatus + local viewheight = self.scrollframe:GetHeight() + local height = self.content:GetHeight() + local offset + + if viewheight > height then + offset = 0 + else + offset = floor((height - viewheight) / 1000.0 * value) + end + self.content:ClearAllPoints() + self.content:SetPoint("TOPLEFT", self.scrollframe, "TOPLEFT", 0, offset) + self.content:SetPoint("TOPRIGHT", self.scrollframe, "TOPRIGHT", 0, offset) + status.offset = offset + status.scrollvalue = value + end + + local function MoveScroll(self, value) + local status = self.status or self.localstatus + local height, viewheight = self.scrollframe:GetHeight(), self.content:GetHeight() + + if height > viewheight then + self.scrollbar:Hide() + else + self.scrollbar:Show() + local diff = height - viewheight + local delta = 1 + if value < 0 then + delta = -1 + end + self.scrollbar:SetValue(min(max(status.scrollvalue + delta*(1000/(diff/45)),0), 1000)) + end + end + + + local function FixScroll(self) + if self.updateLock then return end + self.updateLock = true + local status = self.status or self.localstatus + local height, viewheight = self.scrollframe:GetHeight(), self.content:GetHeight() + local offset = status.offset or 0 + local curvalue = self.scrollbar:GetValue() + if viewheight < height then + if self.scrollBarShown then + self.scrollBarShown = nil + self.scrollbar:Hide() + self.scrollbar:SetValue(0) + self.scrollframe:SetPoint("BOTTOMRIGHT",self.frame,"BOTTOMRIGHT",0,0) + self:DoLayout() + end + else + if not self.scrollBarShown then + self.scrollBarShown = true + self.scrollbar:Show() + self.scrollframe:SetPoint("BOTTOMRIGHT", self.frame,"BOTTOMRIGHT",-20,0) + self:DoLayout() + end + local value = (offset / (viewheight - height) * 1000) + if value > 1000 then value = 1000 end + self.scrollbar:SetValue(value) + self:SetScroll(value) + if value < 1000 then + self.content:ClearAllPoints() + self.content:SetPoint("TOPLEFT", self.scrollframe, "TOPLEFT", 0, offset) + self.content:SetPoint("TOPRIGHT", self.scrollframe, "TOPRIGHT", 0, offset) + status.offset = offset + end + end + self.updateLock = nil + end + + local function OnMouseWheel(this, value) + this.obj:MoveScroll(value) + end + + local function OnScrollValueChanged(this, value) + this.obj:SetScroll(value) + end + + local function FixScrollOnUpdate(this) + this:SetScript("OnUpdate", nil) + this.obj:FixScroll() + end + + local function OnSizeChanged(this) + this:SetScript("OnUpdate", FixScrollOnUpdate) + end + + local function LayoutFinished(self, width, height) + self.content:SetHeight(height or 0 + 20) + self.scrollframe:SetScript("OnUpdate", FixScrollOnUpdate) + end + + -- called to set an external table to store status in + local function SetStatusTable(self, status) + assert(type(status) == "table") + self.status = status + if not status.scrollvalue then + status.scrollvalue = 0 + end + end + + local function OnWidthSet(self, width) + local content = self.content + content.width = width + end + + + local function OnHeightSet(self, height) + local content = self.content + content.height = height + end + + local function Constructor() + local frame = CreateFrame("Frame", nil, UIParent) + local self = {} + self.type = Type + + self.OnRelease = OnRelease + self.OnAcquire = OnAcquire + + self.MoveScroll = MoveScroll + self.FixScroll = FixScroll + self.SetScroll = SetScroll + self.LayoutFinished = LayoutFinished + self.SetStatusTable = SetStatusTable + self.OnWidthSet = OnWidthSet + self.OnHeightSet = OnHeightSet + + self.localstatus = {} + self.frame = frame + frame.obj = self + + --Container Support + local scrollframe = CreateFrame("ScrollFrame", nil, frame) + scrollframe.obj = self + scrollframe:SetPoint("TOPLEFT", frame, "TOPLEFT", 0, 0) + scrollframe:SetPoint("BOTTOMRIGHT", frame, "BOTTOMRIGHT", 0, 0) + scrollframe:EnableMouseWheel(true) + scrollframe:SetScript("OnMouseWheel", OnMouseWheel) + scrollframe:SetScript("OnSizeChanged", OnSizeChanged) + self.scrollframe = scrollframe + + local content = CreateFrame("Frame", nil, scrollframe) + content.obj = self + content:SetPoint("TOPLEFT", scrollframe, "TOPLEFT", 0, 0) + content:SetPoint("TOPRIGHT", scrollframe, "TOPRIGHT", 0, 0) + content:SetHeight(400) + self.content = content + scrollframe:SetScrollChild(content) + + local num = AceGUI:GetNextWidgetNum(Type) + local name = ("AceConfigDialogScrollFrame%dScrollBar"):format(num) + local scrollbar = CreateFrame("Slider", name, scrollframe, "UIPanelScrollBarTemplate") + scrollbar.obj = self + scrollbar:SetPoint("TOPLEFT", scrollframe, "TOPRIGHT", 4, -16) + scrollbar:SetPoint("BOTTOMLEFT", scrollframe, "BOTTOMRIGHT", 4, 16) + scrollbar:SetScript("OnValueChanged", OnScrollValueChanged) + scrollbar:SetMinMaxValues(0, 1000) + scrollbar:SetValueStep(1) + scrollbar:SetValue(0) + scrollbar:SetWidth(16) + scrollbar:Hide() + self.scrollbar = scrollbar + + local scrollbg = scrollbar:CreateTexture(nil, "BACKGROUND") + scrollbg:SetAllPoints(scrollbar) + scrollbg:SetTexture(0, 0, 0, 0.4) + + self.localstatus.scrollvalue = 0 + + --self:FixScroll() + AceGUI:RegisterAsContainer(self) + --AceGUI:RegisterAsWidget(self) + return self + end + + AceGUI:RegisterWidgetType(Type,Constructor,Version) +end