Asa@0: local AceGUI = LibStub("AceGUI-3.0") Asa@0: Asa@0: -- Lua APIs Asa@0: local min, max, floor = math.min, math.max, math.floor Asa@0: local tonumber = tonumber Asa@0: Asa@0: -- WoW APIs Asa@0: local CreateFrame, UIParent = CreateFrame, UIParent Asa@0: Asa@0: -- Global vars/functions that we don't upvalue since they might get hooked, or upgraded Asa@0: -- List them here for Mikk's FindGlobals script Asa@0: -- GLOBALS: GameFontHighlightSmall Asa@0: Asa@0: -------------------------- Asa@0: -- Slider -- Asa@0: -------------------------- Asa@0: do Asa@0: local Type = "Slider" Asa@0: local Version = 9 Asa@0: Asa@0: local function OnAcquire(self) Asa@0: self:SetWidth(200) Asa@0: self:SetHeight(44) Asa@0: self:SetDisabled(false) Asa@0: self:SetIsPercent(nil) Asa@0: self:SetSliderValues(0,100,1) Asa@0: self:SetValue(0) Asa@0: end Asa@0: Asa@0: local function OnRelease(self) Asa@0: self.frame:ClearAllPoints() Asa@0: self.frame:Hide() Asa@0: self.slider:EnableMouseWheel(false) Asa@0: self:SetDisabled(false) Asa@0: end Asa@0: Asa@0: local function Control_OnEnter(this) Asa@0: this.obj:Fire("OnEnter") Asa@0: end Asa@0: Asa@0: local function Control_OnLeave(this) Asa@0: this.obj:Fire("OnLeave") Asa@0: end Asa@0: Asa@0: local function UpdateText(self) Asa@0: local value = self.value or 0 Asa@0: if self.ispercent then Asa@0: self.editbox:SetText(("%s%%"):format(floor(value*1000+0.5)/10)) Asa@0: else Asa@0: self.editbox:SetText(floor(value*100+0.5)/100) Asa@0: end Asa@0: end Asa@0: Asa@0: local function UpdateLabels(self) Asa@0: local min, max = (self.min or 0), (self.max or 100) Asa@0: if self.ispercent then Asa@0: self.lowtext:SetFormattedText("%s%%",(min * 100)) Asa@0: self.hightext:SetFormattedText("%s%%",(max * 100)) Asa@0: else Asa@0: self.lowtext:SetText(min) Asa@0: self.hightext:SetText(max) Asa@0: end Asa@0: end Asa@0: Asa@0: local function Slider_OnValueChanged(this) Asa@0: local self = this.obj Asa@0: if not this.setup then Asa@0: local newvalue Asa@0: newvalue = this:GetValue() Asa@0: if newvalue ~= self.value and not self.disabled then Asa@0: self.value = newvalue Asa@0: self:Fire("OnValueChanged", newvalue) Asa@0: end Asa@0: if self.value then Asa@0: local value = self.value Asa@0: UpdateText(self) Asa@0: end Asa@0: end Asa@0: end Asa@0: Asa@0: local function Slider_OnMouseUp(this) Asa@0: local self = this.obj Asa@0: self:Fire("OnMouseUp",this:GetValue()) Asa@0: end Asa@0: Asa@0: local function Slider_OnMouseWheel(this, v) Asa@0: local self = this.obj Asa@0: if not self.disabled then Asa@0: local value = self.value Asa@0: if v > 0 then Asa@0: value = min(value + (self.step or 1),self.max) Asa@0: else Asa@0: value = max(value - (self.step or 1), self.min) Asa@0: end Asa@0: self.slider:SetValue(value) Asa@0: end Asa@0: end Asa@0: Asa@0: local function SetDisabled(self, disabled) Asa@0: self.disabled = disabled Asa@0: if disabled then Asa@0: self.slider:EnableMouse(false) Asa@0: self.label:SetTextColor(.5,.5,.5) Asa@0: self.hightext:SetTextColor(.5,.5,.5) Asa@0: self.lowtext:SetTextColor(.5,.5,.5) Asa@0: --self.valuetext:SetTextColor(.5,.5,.5) Asa@0: self.editbox:SetTextColor(.5,.5,.5) Asa@0: self.editbox:EnableMouse(false) Asa@0: self.editbox:ClearFocus() Asa@0: else Asa@0: self.slider:EnableMouse(true) Asa@0: self.label:SetTextColor(1,.82,0) Asa@0: self.hightext:SetTextColor(1,1,1) Asa@0: self.lowtext:SetTextColor(1,1,1) Asa@0: --self.valuetext:SetTextColor(1,1,1) Asa@0: self.editbox:SetTextColor(1,1,1) Asa@0: self.editbox:EnableMouse(true) Asa@0: end Asa@0: end Asa@0: Asa@0: local function SetValue(self, value) Asa@0: self.slider.setup = true Asa@0: self.slider:SetValue(value) Asa@0: self.value = value Asa@0: UpdateText(self) Asa@0: self.slider.setup = nil Asa@0: end Asa@0: Asa@0: local function SetLabel(self, text) Asa@0: self.label:SetText(text) Asa@0: end Asa@0: Asa@0: local function SetSliderValues(self, min, max, step) Asa@0: local frame = self.slider Asa@0: frame.setup = true Asa@0: self.min = min Asa@0: self.max = max Asa@0: self.step = step Asa@0: frame:SetMinMaxValues(min or 0,max or 100) Asa@0: UpdateLabels(self) Asa@0: frame:SetValueStep(step or 1) Asa@0: if self.value then Asa@0: frame:SetValue(self.value) Asa@0: end Asa@0: frame.setup = nil Asa@0: end Asa@0: Asa@0: local function EditBox_OnEscapePressed(this) Asa@0: this:ClearFocus() Asa@0: end Asa@0: Asa@0: local function EditBox_OnEnterPressed(this) Asa@0: local self = this.obj Asa@0: local value = this:GetText() Asa@0: if self.ispercent then Asa@0: value = value:gsub('%%','') Asa@0: value = tonumber(value) / 100 Asa@0: else Asa@0: value = tonumber(value) Asa@0: end Asa@0: Asa@0: if value then Asa@0: self:Fire("OnMouseUp",value) Asa@0: end Asa@0: end Asa@0: Asa@0: local function EditBox_OnEnter(this) Asa@0: this:SetBackdropBorderColor(0.5,0.5,0.5,1) Asa@0: end Asa@0: Asa@0: local function EditBox_OnLeave(this) Asa@0: this:SetBackdropBorderColor(0.3,0.3,0.3,0.8) Asa@0: end Asa@0: Asa@0: local function SetIsPercent(self, value) Asa@0: self.ispercent = value Asa@0: UpdateLabels(self) Asa@0: UpdateText(self) Asa@0: end Asa@0: Asa@0: local function FrameOnMouseDown(this) Asa@0: this.obj.slider:EnableMouseWheel(true) Asa@0: AceGUI:ClearFocus() Asa@0: end Asa@0: Asa@0: local SliderBackdrop = { Asa@0: bgFile = "Interface\\Buttons\\UI-SliderBar-Background", Asa@0: edgeFile = "Interface\\Buttons\\UI-SliderBar-Border", Asa@0: tile = true, tileSize = 8, edgeSize = 8, Asa@0: insets = { left = 3, right = 3, top = 6, bottom = 6 } Asa@0: } Asa@0: Asa@0: local ManualBackdrop = { Asa@0: bgFile = "Interface\\ChatFrame\\ChatFrameBackground", Asa@0: edgeFile = "Interface\\ChatFrame\\ChatFrameBackground", Asa@0: tile = true, edgeSize = 1, tileSize = 5, Asa@0: } Asa@0: Asa@0: local function Constructor() Asa@0: local frame = CreateFrame("Frame",nil,UIParent) Asa@0: local self = {} Asa@0: self.type = Type Asa@0: Asa@0: self.OnRelease = OnRelease Asa@0: self.OnAcquire = OnAcquire Asa@0: Asa@0: self.frame = frame Asa@0: frame.obj = self Asa@0: Asa@0: self.SetDisabled = SetDisabled Asa@0: self.SetValue = SetValue Asa@0: self.SetSliderValues = SetSliderValues Asa@0: self.SetLabel = SetLabel Asa@0: self.SetIsPercent = SetIsPercent Asa@0: Asa@0: self.alignoffset = 25 Asa@0: Asa@0: frame:EnableMouse(true) Asa@0: frame:SetScript("OnMouseDown",FrameOnMouseDown) Asa@0: self.slider = CreateFrame("Slider",nil,frame) Asa@0: local slider = self.slider Asa@0: slider:SetScript("OnEnter",Control_OnEnter) Asa@0: slider:SetScript("OnLeave",Control_OnLeave) Asa@0: slider:SetScript("OnMouseUp", Slider_OnMouseUp) Asa@0: slider.obj = self Asa@0: slider:SetOrientation("HORIZONTAL") Asa@0: slider:SetHeight(15) Asa@0: slider:SetHitRectInsets(0,0,-10,0) Asa@0: slider:SetBackdrop(SliderBackdrop) Asa@0: --slider:EnableMouseWheel(true) Asa@0: slider:SetScript("OnMouseWheel", Slider_OnMouseWheel) Asa@0: Asa@0: local label = frame:CreateFontString(nil,"OVERLAY","GameFontNormal") Asa@0: label:SetPoint("TOPLEFT",frame,"TOPLEFT",0,0) Asa@0: label:SetPoint("TOPRIGHT",frame,"TOPRIGHT",0,0) Asa@0: label:SetJustifyH("CENTER") Asa@0: label:SetHeight(15) Asa@0: self.label = label Asa@0: Asa@0: self.lowtext = slider:CreateFontString(nil,"ARTWORK","GameFontHighlightSmall") Asa@0: self.lowtext:SetPoint("TOPLEFT",slider,"BOTTOMLEFT",2,3) Asa@0: Asa@0: self.hightext = slider:CreateFontString(nil,"ARTWORK","GameFontHighlightSmall") Asa@0: self.hightext:SetPoint("TOPRIGHT",slider,"BOTTOMRIGHT",-2,3) Asa@0: Asa@0: Asa@0: local editbox = CreateFrame("EditBox",nil,frame) Asa@0: editbox:SetAutoFocus(false) Asa@0: editbox:SetFontObject(GameFontHighlightSmall) Asa@0: editbox:SetPoint("TOP",slider,"BOTTOM",0,0) Asa@0: editbox:SetHeight(14) Asa@0: editbox:SetWidth(70) Asa@0: editbox:SetJustifyH("CENTER") Asa@0: editbox:EnableMouse(true) Asa@0: editbox:SetScript("OnEscapePressed",EditBox_OnEscapePressed) Asa@0: editbox:SetScript("OnEnterPressed",EditBox_OnEnterPressed) Asa@0: editbox:SetScript("OnEnter",EditBox_OnEnter) Asa@0: editbox:SetScript("OnLeave",EditBox_OnLeave) Asa@0: editbox:SetBackdrop(ManualBackdrop) Asa@0: editbox:SetBackdropColor(0,0,0,0.5) Asa@0: editbox:SetBackdropBorderColor(0.3,0.3,0.30,0.80) Asa@0: self.editbox = editbox Asa@0: editbox.obj = self Asa@0: Asa@0: slider:SetThumbTexture("Interface\\Buttons\\UI-SliderBar-Button-Horizontal") Asa@0: Asa@0: frame:SetWidth(200) Asa@0: frame:SetHeight(44) Asa@0: slider:SetPoint("TOP",label,"BOTTOM",0,0) Asa@0: slider:SetPoint("LEFT",frame,"LEFT",3,0) Asa@0: slider:SetPoint("RIGHT",frame,"RIGHT",-3,0) Asa@0: Asa@0: Asa@0: slider:SetValue(self.value or 0) Asa@0: slider:SetScript("OnValueChanged",Slider_OnValueChanged) Asa@0: Asa@0: AceGUI:RegisterAsWidget(self) Asa@0: return self Asa@0: end Asa@0: Asa@0: AceGUI:RegisterWidgetType(Type,Constructor,Version) Asa@0: end