Mercurial > wow > breuesk
changeset 53:708d8a423b4c
Scroller functional
author | John@Yosemite-PC |
---|---|
date | Sat, 24 Mar 2012 14:22:01 -0400 |
parents | 7c7e80f63b51 |
children | c8c17286af95 |
files | SelectorList.lua |
diffstat | 1 files changed, 88 insertions(+), 42 deletions(-) [+] |
line wrap: on
line diff
--- a/SelectorList.lua Sat Mar 24 13:37:29 2012 -0400 +++ b/SelectorList.lua Sat Mar 24 14:22:01 2012 -0400 @@ -33,6 +33,29 @@ local DEFAULT_SL_WIDTH = 175 --local DEFAULT_TREE_SIZABLE = true +local function SL_OnMouseWheel(frame, delta) + local self = frame.obj + if self.showscroll then + local scrollbar = self.scrollbar + local min, max = scrollbar:GetMinMaxValues() + local value = scrollbar:GetValue() + local newvalue = math_min(max,math_max(min,value - delta)) + if value ~= newvalue then + scrollbar:SetValue(newvalue) + end + end +end + +local function OnScrollValueChanged(frame, value) + if frame.obj.noupdate then return end + local self = frame.obj + local status = self.status or self.localstatus + status.scrollvalue = value + self:Refresh() + AceGUI:ClearFocus() +end + + local function Layout(self) self:SetHeight(self.numlines * 18 + 20) @@ -114,6 +137,7 @@ end + local methods = { ["OnAcquire"] = function(self) @@ -137,22 +161,62 @@ Layout(self) end, ["SetList"] = function(self, list) + self.lines = {} for i,v in ipairs(list) do self.lines[i] = v end self:Refresh() end, + + ["ShowScroll"] = function(self, show) + self.showscroll = show + if show then + self.scrollbar:Show() + if self.buttons[1] then + self.buttons[1]:SetPoint("TOPRIGHT", self.slframe,"TOPRIGHT",-22,-10) + end + else + self.scrollbar:Hide() + if self.buttons[1] then + self.buttons[1]:SetPoint("TOPRIGHT", self.slframe,"TOPRIGHT",0,-10) + end + end + end, + ["Refresh"] = function(self) local f = self.slframe local buttons = self.buttons local lines = self.lines + local status = self.status or self.localstatus + + for i, v in ipairs(buttons) do + v:Hide() + end + local numlines = #lines + local maxlines = self.numlines + + if numlines <= maxlines then + status.scrollvalue = 0 + self:ShowScroll(false) + first, last = 1, numlines + else + self:ShowScroll(true) + self.noupdate = true + self.scrollbar:SetMinMaxValues(0, numlines - maxlines) + if numlines - status.scrollvalue < maxlines then + status.scrollvalue = numlines - maxlines + end + self.noupdate = nil + first, last = status.scrollvalue+1, status.scrollvalue + maxlines + + if self.scrollbar:GetValue() ~= status.scrollvalue then + self.scrollbar:SetValue(status.scrollvalue) + end + end local bnum = 1 - for i=1,self.numlines do + for i= first, last do local l = lines[i] - if not l then - break - end local b = buttons[bnum] if not b then b = CreateButton(self) @@ -161,9 +225,12 @@ b:SetFrameLevel(f:GetFrameLevel()+1) b:ClearAllPoints() if bnum == 1 then - -- todo: if scroll ... + if self.showscroll then + b:SetPoint("TOPRIGHT",-22,-10) + else + b:SetPoint("TOPRIGHT",0,-10) + end b:SetPoint("TOPLEFT",0,-10) - b:SetPoint("TOPRIGHT",0,-10) else b:SetPoint("TOPRIGHT", buttons[bnum-1], "BOTTOMRIGHT", 0, 0) b:SetPoint("TOPLEFT", buttons[bnum-1], "BOTTOMLEFT", 0, 0) @@ -197,10 +264,6 @@ local slframe = CreateFrame("Frame", nil, frame) slframe:SetAllPoints() - --slframe:SetPoint("TOPLEFT") - --slframe:SetPoint("BOTTOMLEFT") - --slframe:SetWidth(DEFAULT_SL_WIDTH) - --slframe:SetHeight(DEFAULT_SL_WIDTH) -- todo slframe:EnableMouseWheel(true) slframe:SetBackdrop(PaneBackdrop) slframe:SetBackdropColor(0.1, 0.1, 0.1, 0.5) @@ -210,49 +273,33 @@ --slframe:SetMaxResize(400, 1600) --slframe:SetScript("OnUpdate", FirstFrameUpdate) --slframe:SetScript("OnSizeChanged", Tree_OnSizeChanged) - --slframe:SetScript("OnMouseWheel", Tree_OnMouseWheel) + slframe:SetScript("OnMouseWheel", SL_OnMouseWheel) - --local scrollbar = CreateFrame("Slider", ("AceConfigDialogTreeGroup%dScrollBar"):format(num), slframe, "UIPanelScrollBarTemplate") - --scrollbar:SetScript("OnValueChanged", nil) - --scrollbar:SetPoint("TOPRIGHT", -10, -26) - --scrollbar:SetPoint("BOTTOMRIGHT", -10, 26) - --scrollbar:SetMinMaxValues(0,0) - --scrollbar:SetValueStep(1) - --scrollbar:SetValue(0) - --scrollbar:SetWidth(16) - --scrollbar:SetScript("OnValueChanged", OnScrollValueChanged) + local scrollbar = CreateFrame("Slider", ("SelectorList%dScrollBar"):format(num), slframe, "UIPanelScrollBarTemplate") + scrollbar:SetScript("OnValueChanged", nil) + scrollbar:SetPoint("TOPRIGHT", -10, -26) + scrollbar:SetPoint("BOTTOMRIGHT", -10, 26) + scrollbar:SetMinMaxValues(0,0) + scrollbar:SetValueStep(1) + scrollbar:SetValue(0) + scrollbar:SetWidth(16) + scrollbar:SetScript("OnValueChanged", OnScrollValueChanged) - --local scrollbg = scrollbar:CreateTexture(nil, "BACKGROUND") - --scrollbg:SetAllPoints(scrollbar) - --scrollbg:SetTexture(0,0,0,0.4) - - --local border = CreateFrame("Frame",nil,frame) - --border:SetPoint("TOPLEFT", slframe, "TOPRIGHT") - --border:SetPoint("BOTTOMRIGHT") - --border:SetBackdrop(PaneBackdrop) - --border:SetBackdropColor(0.1, 0.1, 0.1, 0.5) - --border:SetBackdropBorderColor(0.4, 0.4, 0.4) - - ----Container Support - --local content = CreateFrame("Frame", nil, border) - --content:SetPoint("TOPLEFT", 10, -10) - --content:SetPoint("BOTTOMRIGHT", -10, 10) + local scrollbg = scrollbar:CreateTexture(nil, "BACKGROUND") + scrollbg:SetAllPoints(scrollbar) + scrollbg:SetTexture(0,0,0,0.4) local widget = { frame = frame, lines = {}, --levels = {}, buttons = {}, - --hasChildren = {}, localstatus = { --groups = {}, scrollvalue = 0 }, filter = false, slframe = slframe, - --dragger = dragger, - --scrollbar = scrollbar, - --border = border, - --content = slframe, -- content is for containers + scrollbar = scrollbar, type = Type } if methods then @@ -261,8 +308,7 @@ end end slframe.obj = widget - --dragger.obj = widget - --scrollbar.obj = widget + scrollbar.obj = widget return AceGUI:RegisterAsWidget(widget) end