diff Libs/DF/slider.lua @ 11:2f09fe4be15c

Added an Options Panel.
author Tercio
date Mon, 20 Apr 2015 16:34:18 -0300
parents
children 6dd01dcec75e
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Libs/DF/slider.lua	Mon Apr 20 16:34:18 2015 -0300
@@ -0,0 +1,1034 @@
+
+
+
+local DF = _G ["DetailsFramework"]
+local _
+
+local _rawset = rawset --> lua local
+local _rawget = rawget --> lua local
+local _setmetatable = setmetatable --> lua local
+local _unpack = unpack --> lua local
+local _type = type --> lua local
+local _math_floor = math.floor --> lua local
+local loadstring = loadstring --> lua local
+
+local SharedMedia = LibStub:GetLibrary("LibSharedMedia-3.0")
+
+local cleanfunction = function() end
+local APISliderFunctions = false
+local SliderMetaFunctions = {}
+local NameLessSlider = 1
+
+------------------------------------------------------------------------------------------------------------
+--> metatables
+
+	SliderMetaFunctions.__call = function (_table, value)
+		if (not value) then
+			if (_table.isSwitch) then
+			
+				if (type (value) == "boolean") then --> false
+					return _table.slider:SetValue (1)
+				end
+			
+				if (_table.slider:GetValue() == 1) then
+					return false
+				else
+					return true
+				end
+			end
+			return _table.slider:GetValue()
+		else
+			if (_table.isSwitch) then
+				if (type (value) == "boolean") then
+					if (value) then
+						_table.slider:SetValue (2)
+					else
+						_table.slider:SetValue (1)
+					end
+				else
+					_table.slider:SetValue (value)
+				end
+				return
+			end
+			
+			return _table.slider:SetValue (value)
+		end
+	end
+
+------------------------------------------------------------------------------------------------------------
+--> members
+
+	--> tooltip
+	local gmember_tooltip = function (_object)
+		return _object:GetTooltip()
+	end
+	--> shown
+	local gmember_shown = function (_object)
+		return _object:IsShown()
+	end
+	--> frame width
+	local gmember_width = function (_object)
+		return _object.slider:GetWidth()
+	end
+	--> frame height
+	local gmember_height = function (_object)
+		return _object.slider:GetHeight()
+	end
+	--> locked
+	local gmember_locked = function (_object)
+		return _rawget (_object, "lockdown")
+	end
+	--> fractional
+	local gmember_fractional = function (_object)
+		return _rawget (_object, "useDecimals")
+	end	
+	--> value
+	local gmember_value = function (_object)
+		return _object()
+	end	
+
+	local get_members_function_index = {
+		["tooltip"] = gmember_tooltip,
+		["shown"] = gmember_shown,
+		["width"] = gmember_width,
+		["height"] = gmember_height,
+		["locked"] = gmember_locked,
+		["fractional"] = gmember_fractional,
+		["value"] = gmember_value,
+	}
+
+	SliderMetaFunctions.__index = function (_table, _member_requested)
+
+		local func = get_members_function_index [_member_requested]
+		if (func) then
+			return func (_table, _member_requested)
+		end
+		
+		local fromMe = _rawget (_table, _member_requested)
+		if (fromMe) then
+			return fromMe
+		end
+		
+		return SliderMetaFunctions [_member_requested]
+	end
+
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+	
+	--> tooltip
+	local smember_tooltip = function (_object, _value)
+		return _object:SetTooltip (_value)
+	end
+	--> show
+	local smember_show = function (_object, _value)
+		if (_value) then
+			return _object:Show()
+		else
+			return _object:Hide()
+		end
+	end
+	--> hide
+	local smember_hide = function (_object, _value)
+		if (not _value) then
+			return _object:Show()
+		else
+			return _object:Hide()
+		end
+	end
+	--> frame width
+	local smember_width = function (_object, _value)
+		return _object.slider:SetWidth (_value)
+	end
+	--> frame height
+	local smember_height = function (_object, _value)
+		return _object.slider:SetHeight (_value)
+	end
+	--> locked
+	local smember_locked = function (_object, _value)
+		if (_value) then
+			return self:Disable()
+		else
+			return self:Enable()
+		end
+	end	
+	--> backdrop
+	local smember_backdrop = function (_object, _value)
+		return _object.slider:SetBackdrop (_value)
+	end
+	--> fractional
+	local smember_fractional = function (_object, _value)
+		return _rawset (_object, "useDecimals", _value)
+	end
+	--> value
+	local smember_value = function (_object, _value)
+		_object (_value)
+	end
+	
+	local set_members_function_index = {
+		["tooltip"] = smember_tooltip,
+		["show"] = smember_show,
+		["hide"] = smember_hide,
+		["backdrop"] = smember_backdrop,
+		["width"] = smember_width,
+		["height"] = smember_height,
+		["locked"] = smember_locked,
+		["fractional"] = smember_fractional,
+		["value"] = smember_value,
+	}
+	
+	SliderMetaFunctions.__newindex = function (_table, _key, _value)
+		local func = set_members_function_index [_key]
+		if (func) then
+			return func (_table, _value)
+		else
+			return _rawset (_table, _key, _value)
+		end
+	end	
+	
+------------------------------------------------------------------------------------------------------------
+--> methods
+
+--> show & hide
+	function SliderMetaFunctions:IsShown()
+		return self.slider:IsShown()
+	end
+	function SliderMetaFunctions:Show()
+		return self.slider:Show()
+	end
+	function SliderMetaFunctions:Hide()
+		return self.slider:Hide()
+	end
+	
+--> fixed value
+	function SliderMetaFunctions:SetFixedParameter (value)
+		_rawset (self, "FixedValue", value)
+	end
+	
+--> set value
+	function SliderMetaFunctions:SetValue (value)
+		return self (value)
+	end
+	
+-- thumb size
+	function SliderMetaFunctions:SetThumbSize (w, h)
+		if (not w) then
+			w = self.thumb:GetWidth()
+		end
+		if (not h) then
+			h = self.thumb:GetHeight()
+		end
+		return self.thumb:SetSize (w, h)
+	end	
+	
+	
+-- setpoint
+	function SliderMetaFunctions:SetPoint (v1, v2, v3, v4, v5)
+		v1, v2, v3, v4, v5 = DF:CheckPoints (v1, v2, v3, v4, v5, self)
+		if (not v1) then
+			print ("Invalid parameter for SetPoint")
+			return
+		end
+		return self.widget:SetPoint (v1, v2, v3, v4, v5)
+	end
+
+-- sizes
+	function SliderMetaFunctions:SetSize (w, h)
+		if (w) then
+			self.slider:SetWidth (w)
+		end
+		if (h) then
+			return self.slider:SetHeight (h)
+		end
+	end
+	
+-- tooltip
+	function SliderMetaFunctions:SetTooltip (tooltip)
+		if (tooltip) then
+			return _rawset (self, "have_tooltip", tooltip)
+		else
+			return _rawset (self, "have_tooltip", nil)
+		end
+	end
+	function SliderMetaFunctions:GetTooltip()
+		return _rawget (self, "have_tooltip")
+	end
+	
+-- frame levels
+	function SliderMetaFunctions:GetFrameLevel()
+		return self.slider:GetFrameLevel()
+	end
+	function SliderMetaFunctions:SetFrameLevel (level, frame)
+		if (not frame) then
+			return self.slider:SetFrameLevel (level)
+		else
+			local framelevel = frame:GetFrameLevel (frame) + level
+			return self.slider:SetFrameLevel (framelevel)
+		end
+	end
+
+-- frame stratas
+	function SliderMetaFunctions:SetFrameStrata()
+		return self.slider:GetFrameStrata()
+	end
+	function SliderMetaFunctions:SetFrameStrata (strata)
+		if (_type (strata) == "table") then
+			self.slider:SetFrameStrata (strata:GetFrameStrata())
+		else
+			self.slider:SetFrameStrata (strata)
+		end
+	end
+	
+-- enabled
+	function SliderMetaFunctions:IsEnabled()
+		return not _rawget (self, "lockdown")
+	end
+	function SliderMetaFunctions:Enable()
+		self.slider:Enable()
+		if (not self.lock_texture) then
+			DF:NewImage (self, [[Interface\PetBattles\PetBattle-LockIcon]], 12, 12, "overlay", {0.0546875, 0.9453125, 0.0703125, 0.9453125}, "lock_texture", "$parentLockTexture")
+			self.lock_texture:SetDesaturated (true)
+			self.lock_texture:SetPoint ("center", self.amt, "center")
+		end
+		self.lock_texture:Hide()
+		self.slider.amt:Show()
+		self:SetAlpha (1)
+		return _rawset (self, "lockdown", false)
+	end
+	
+	function SliderMetaFunctions:Disable()
+	
+		self.slider:Disable()
+		self.slider.amt:Hide()
+		self:SetAlpha (.4)
+		
+		if (not self.lock_texture) then
+			DF:NewImage (self, [[Interface\PetBattles\PetBattle-LockIcon]], 12, 12, "overlay", {0.0546875, 0.9453125, 0.0703125, 0.9453125}, "lock_texture", "$parentLockTexture")
+			self.lock_texture:SetDesaturated (true)
+			self.lock_texture:SetPoint ("center", self.amt, "center")
+		end
+		self.lock_texture:Show()
+		
+		return _rawset (self, "lockdown", true)
+	end
+
+--> hooks
+	function SliderMetaFunctions:SetHook (hookType, func)
+		if (func) then
+			_rawset (self, hookType.."Hook", func)
+		else
+			_rawset (self, hookType.."Hook", nil)
+		end
+	end
+
+------------------------------------------------------------------------------------------------------------
+--> scripts
+
+	local OnEnter = function (slider)
+	
+		if (_rawget (slider.MyObject, "lockdown")) then
+			return
+		end
+	
+		DetailsFrameworkSliderButtons1:ShowMe (slider)
+	
+		if (slider.MyObject.OnEnterHook) then
+			local interrupt = slider.MyObject.OnEnterHook (slider)
+			if (interrupt) then
+				return
+			end
+		end
+
+		slider.thumb:SetAlpha (1)
+	
+		if (slider.MyObject.have_tooltip and slider.MyObject.have_tooltip ~= "Right Click to Type the Value") then
+			GameCooltip2:Preset (2)
+			GameCooltip2:AddLine (slider.MyObject.have_tooltip)
+			GameCooltip2:ShowCooltip (slider, "tooltip")
+		else
+			GameCooltip2:Preset (1)
+			GameCooltip2:AddLine ("Right Click to Type the Value")
+			GameCooltip2:AddIcon ([[Interface\TUTORIALFRAME\UI-TUTORIAL-FRAME]], 1, 1, 16, 16, 0.015625, 0.15671875, 0.640625, 0.798828125)
+			GameCooltip2:ShowCooltip (slider, "tooltip")
+		end
+		
+		local parent = slider:GetParent().MyObject
+		if (parent and parent.type == "panel") then
+			if (parent.GradientEnabled) then
+				parent:RunGradient()
+			end
+		end
+		
+	end
+	
+	local OnLeave = function (slider)
+	
+		if (_rawget (slider.MyObject, "lockdown")) then
+			return
+		end
+	
+		DetailsFrameworkSliderButtons1:PrepareToHide()
+	
+		if (slider.MyObject.OnLeaveHook) then
+			local interrupt = slider.MyObject.OnLeaveHook (slider)
+			if (interrupt) then
+				return
+			end
+		end
+		
+		slider.thumb:SetAlpha (.7)
+	
+		if (slider.MyObject.have_tooltip) then 
+			GameCooltip2:ShowMe (false)
+		end
+		
+		local parent = slider:GetParent().MyObject
+		if (parent and parent.type == "panel") then
+			if (parent.GradientEnabled) then
+				parent:RunGradient (false)
+			end
+		end
+		
+	end
+	
+
+	local f = CreateFrame ("frame", "DetailsFrameworkSliderButtons1", UIParent)
+	f:Hide()
+	--f:SetBackdrop ({bgFile = [[Interface\DialogFrame\UI-DialogBox-Background-Dark]], tile = true, tileSize = 5})
+	f:SetHeight (18)
+	
+	local t = 0
+	f.is_going_hide = false
+	local going_hide = function (self, elapsed)
+		t = t + elapsed
+		if (t > 0.3) then
+			f:Hide()
+			f:SetScript ("OnUpdate", nil)
+			f.is_going_hide = false
+		end
+	end
+	
+	function f:ShowMe (host)
+		f:SetPoint ("bottomleft", host, "topleft", -3, -5)
+		f:SetPoint ("bottomright", host, "topright", 3, -5)
+		f:SetFrameStrata (host:GetFrameStrata())
+		f:SetFrameLevel (host:GetFrameLevel())
+		f:Show()
+		if (f.is_going_hide) then
+			f:SetScript ("OnUpdate", nil)
+			f.is_going_hide = false
+		end
+		
+		f.host = host.MyObject
+	end
+	
+	function f:PrepareToHide()
+		f.is_going_hide = true
+		t = 0
+		f:SetScript ("OnUpdate", going_hide)
+	end
+	
+	local button_plus = CreateFrame ("button", "DetailsFrameworkSliderButtonsPlusButton", f)
+	local button_minor = CreateFrame ("button", "DetailsFrameworkSliderButtonsMinorButton", f)
+	
+	button_plus:SetScript ("OnEnter", function (self)
+		if (f.is_going_hide) then
+			f:SetScript ("OnUpdate", nil)
+			f.is_going_hide = false
+		end
+	end)
+	button_minor:SetScript ("OnEnter", function (self)
+		if (f.is_going_hide) then
+			f:SetScript ("OnUpdate", nil)
+			f.is_going_hide = false
+		end
+	end)
+	
+	button_plus:SetScript ("OnLeave", function (self)
+		f:PrepareToHide()
+	end)
+	button_minor:SetScript ("OnLeave", function (self)
+		f:PrepareToHide()
+	end)
+	
+	button_plus:SetNormalTexture ([[Interface\Buttons\UI-PlusButton-Up]])
+	button_minor:SetNormalTexture ([[Interface\Buttons\UI-MinusButton-Up]])
+	
+	button_plus:SetPushedTexture ([[Interface\Buttons\UI-PlusButton-Down]])
+	button_minor:SetPushedTexture ([[Interface\Buttons\UI-MinusButton-Down]])
+	
+	button_plus:SetDisabledTexture ([[Interface\Buttons\UI-PlusButton-Disabled]])
+	button_minor:SetDisabledTexture ([[Interface\Buttons\UI-MinusButton-Disabled]])
+	
+	button_plus:SetHighlightTexture ([[Interface\Buttons\UI-PlusButton-Hilight]])
+	button_minor:SetHighlightTexture ([[Interface\Buttons\UI-PlusButton-Hilight]])
+	
+	--button_minor:SetPoint ("bottomleft", f, "bottomleft", -6, -13)
+	--button_plus:SetPoint ("bottomright", f, "bottomright", 6, -13)
+	
+	button_minor:SetPoint ("bottomright", f, "bottomright", 13, -13)
+	button_plus:SetPoint ("left", button_minor, "right", -2, 0)
+	
+	button_plus:SetSize (16, 16)
+	button_minor:SetSize (16, 16)
+	
+	local timer = 0
+	local change_timer = 0
+	
+	-- -- --
+	
+	local plus_button_script = function()
+
+		local current = f.host.value
+		local editbox = SliderMetaFunctions.editbox_typevalue
+		
+		if (f.host.fine_tuning) then
+			f.host:SetValue (current + f.host.fine_tuning)
+			if (editbox and SliderMetaFunctions.editbox_typevalue:IsShown()) then
+				SliderMetaFunctions.editbox_typevalue:SetText (tostring (string.format ("%.2f", current + f.host.fine_tuning)))
+			end
+		else
+			if (f.host.useDecimals) then
+				f.host:SetValue (current + 0.1)
+				if (editbox and SliderMetaFunctions.editbox_typevalue:IsShown()) then
+					SliderMetaFunctions.editbox_typevalue:SetText (string.format ("%.2f", current + 0.1))
+				end
+			else
+				f.host:SetValue (current + 1)
+				if (editbox and SliderMetaFunctions.editbox_typevalue:IsShown()) then
+					SliderMetaFunctions.editbox_typevalue:SetText (tostring (math.floor (current + 1)))
+				end
+			end
+		end
+
+	end
+	
+	button_plus:SetScript ("OnMouseUp", function (self)
+		if (not button_plus.got_click) then
+			plus_button_script()
+		end
+		button_plus.got_click = false
+		self:SetScript ("OnUpdate", nil)
+	end)
+	
+	local on_update = function (self, elapsed)
+		timer = timer + elapsed
+		if (timer > 0.4) then
+			change_timer = change_timer + elapsed
+			if (change_timer > 0.1) then
+				change_timer = 0
+				plus_button_script()
+				button_plus.got_click = true
+			end
+		end
+	end
+	button_plus:SetScript ("OnMouseDown", function (self)
+		timer = 0
+		change_timer = 0
+		self:SetScript ("OnUpdate", on_update)
+	end)
+	
+	-- -- --
+	
+	local minor_button_script = function()
+		local current = f.host.value
+		local editbox = SliderMetaFunctions.editbox_typevalue
+		
+		if (f.host.fine_tuning) then
+			f.host:SetValue (current - f.host.fine_tuning)
+			if (editbox and SliderMetaFunctions.editbox_typevalue:IsShown()) then
+				SliderMetaFunctions.editbox_typevalue:SetText (tostring (string.format ("%.2f", current - f.host.fine_tuning)))
+			end
+		else
+			if (f.host.useDecimals) then
+				f.host:SetValue (current - 0.1)
+				if (editbox and SliderMetaFunctions.editbox_typevalue:IsShown()) then
+					SliderMetaFunctions.editbox_typevalue:SetText (string.format ("%.2f", current - 0.1))
+				end
+			else
+				f.host:SetValue (current - 1)
+				if (editbox and SliderMetaFunctions.editbox_typevalue:IsShown()) then
+					SliderMetaFunctions.editbox_typevalue:SetText (tostring (math.floor (current - 1)))
+				end
+			end
+		end
+	end
+	
+	button_minor:SetScript ("OnMouseUp", function (self)
+		if (not button_minor.got_click) then
+			minor_button_script()
+		end
+		button_minor.got_click = false
+		self:SetScript ("OnUpdate", nil)
+	end)
+	
+	local on_update = function (self, elapsed)
+		timer = timer + elapsed
+		if (timer > 0.4) then
+			change_timer = change_timer + elapsed
+			if (change_timer > 0.1) then
+				change_timer = 0
+				minor_button_script()
+				button_minor.got_click = true
+			end
+		end
+	end
+	button_minor:SetScript ("OnMouseDown", function (self)
+		timer = 0
+		change_timer = 0
+		self:SetScript ("OnUpdate", on_update)
+	end)
+	
+	function SliderMetaFunctions:TypeValue()
+		if (not self.isSwitch) then
+		
+			if (not SliderMetaFunctions.editbox_typevalue) then
+			
+				local editbox = CreateFrame ("EditBox", "DetailsFrameworkSliderEditBox", UIParent)
+				
+				editbox:SetSize (40, 20)
+				editbox:SetJustifyH ("center")
+				editbox:SetBackdrop ({bgFile = [[Interface\DialogFrame\UI-DialogBox-Background-Dark]],
+				edgeFile = "Interface\\Buttons\\UI-SliderBar-Border", --edgeFile = [[Interface\Tooltips\UI-Tooltip-Border]],
+				tile = true, edgeSize = 8, tileSize = 5})
+				editbox:SetFontObject ("GameFontHighlightSmall")
+
+				editbox:SetScript ("OnEnterPressed", function()
+					editbox:ClearFocus()
+					editbox:Hide()
+					editbox:GetParent().MyObject.typing_value = false
+					editbox:GetParent().MyObject.value = tonumber (editbox:GetText())
+				end)
+				
+				editbox:SetScript ("OnEscapePressed", function()
+					editbox:ClearFocus()
+					editbox:Hide()
+					editbox:GetParent().MyObject.typing_value = false
+					editbox:GetParent().MyObject.value = tonumber (self.typing_value_started)
+				end)
+
+				editbox:SetScript ("OnTextChanged", function()
+					editbox:GetParent().MyObject.typing_can_change = true
+					editbox:GetParent().MyObject.value = tonumber (editbox:GetText())
+					editbox:GetParent().MyObject.typing_can_change = false
+					
+					-- esse self fica como o primeiro a ser alterado
+					--print ("text changed", self:GetName())
+					--print ()
+				end)
+				
+				SliderMetaFunctions.editbox_typevalue = editbox
+			end
+			
+			local pvalue = self.previous_value [2]
+			self:SetValue (pvalue)
+			
+			self.typing_value = true
+			self.typing_value_started = pvalue
+			
+			SliderMetaFunctions.editbox_typevalue:SetSize (self.width, self.height)
+			SliderMetaFunctions.editbox_typevalue:SetPoint ("center", self.widget, "center")
+			SliderMetaFunctions.editbox_typevalue:SetFocus()
+			SliderMetaFunctions.editbox_typevalue:SetParent (self.widget)
+			SliderMetaFunctions.editbox_typevalue:SetFrameLevel (self.widget:GetFrameLevel()+1)
+			
+			if (self.useDecimals) then
+				SliderMetaFunctions.editbox_typevalue:SetText (tostring (string.format ("%.1f", self.value)))
+			else
+				SliderMetaFunctions.editbox_typevalue:SetText (tostring (math.floor (self.value)))
+			end
+			
+			SliderMetaFunctions.editbox_typevalue:HighlightText()
+			
+			SliderMetaFunctions.editbox_typevalue:Show()
+		end
+	end
+	
+	local OnMouseDown = function (slider, button)
+		if (button == "RightButton") then
+			slider.MyObject:TypeValue()
+		end
+	end
+	
+	local OnMouseUp = function (slider, button)
+		--if (button == "RightButton") then
+		--	if (slider.MyObject.typing_value) then
+		--		slider.MyObject:SetValue (slider.MyObject.previous_value [2])
+		--	end
+		--end
+	end
+	
+	local OnHide = function (slider)
+		if (slider.MyObject.OnHideHook) then
+			local interrupt = slider.MyObject.OnHideHook (slider)
+			if (interrupt) then
+				return
+			end
+		end
+		
+		if (slider.MyObject.typing_value) then
+			SliderMetaFunctions.editbox_typevalue:ClearFocus()
+			SliderMetaFunctions.editbox_typevalue:SetText ("")
+			slider.MyObject.typing_valu = false
+		end
+	end
+	
+	local OnShow = function (slider)
+		if (slider.MyObject.OnShowHook) then
+			local interrupt = slider.MyObject.OnShowHook (slider)
+			if (interrupt) then
+				return
+			end
+		end
+	end
+	
+	local table_insert = table.insert
+	local table_remove = table.remove
+	
+	local OnValueChanged = function (slider)
+	
+		local amt = slider:GetValue()
+	
+		if (slider.MyObject.typing_value and not slider.MyObject.typing_can_change) then
+			slider.MyObject:SetValue (slider.MyObject.typing_value_started)
+			return
+		end
+
+		table_insert (slider.MyObject.previous_value, 1, amt)
+		table_remove (slider.MyObject.previous_value, 4)
+		
+		if (slider.MyObject.OnValueChangeHook) then
+			local interrupt = slider.MyObject.OnValueChangeHook (slider, slider.MyObject.FixedValue, amt)
+			if (interrupt) then
+				return
+			end
+		end
+
+		if (slider.MyObject.OnValueChanged) then
+			slider.MyObject.OnValueChanged (slider, slider.MyObject.FixedValue, amt)
+		end
+		
+		if (amt < 10 and amt >= 1) then
+			amt = "0"..amt
+		end
+		
+		if (slider.MyObject.useDecimals) then
+			slider.amt:SetText (string.format ("%.2f", amt))
+		else
+			slider.amt:SetText (math.floor (amt))
+		end
+		slider.MyObject.ivalue = amt
+	end
+
+------------------------------------------------------------------------------------------------------------
+--> object constructor
+
+local SwitchOnClick = function (self, button, forced_value, value)
+
+	local slider = self.MyObject
+	
+	if (_rawget (slider, "lockdown")) then
+		return
+	end
+	
+	if (forced_value) then
+		_rawset (slider, "value", not value)
+	end
+
+	if (_rawget (slider, "value")) then --actived
+	
+		_rawset (slider, "value", false)
+		slider._text:SetText (slider._ltext)
+		slider._thumb:ClearAllPoints()
+		
+		slider:SetBackdropColor (1, 0, 0, 0.4)
+		slider._thumb:SetPoint ("left", slider.widget, "left")
+	
+	else
+	
+		_rawset (slider, "value", true)
+		slider._text:SetText (slider._rtext)
+		slider._thumb:ClearAllPoints()
+
+		slider:SetBackdropColor (0, 0, 1, 0.4)
+		slider._thumb:SetPoint ("right", slider.widget, "right")
+
+	end
+	
+	if (slider.OnSwitch and not forced_value) then
+		local value = _rawget (slider, "value")
+		if (slider.return_func) then
+			value = slider:return_func (value)
+		end
+		slider.OnSwitch (slider, slider.FixedValue, value)
+	end
+	
+end
+
+local default_switch_func = function (self, passed_value)
+	if (self.value) then
+		return false
+	else
+		return true
+	end
+end
+
+local switch_get_value = function (self)
+	return self.value
+end
+
+local switch_set_value = function (self, value)
+	if (self.switch_func) then
+		value = self:switch_func (value)
+	end
+	
+	SwitchOnClick (self.widget, nil, true, value)
+end
+
+local switch_set_fixparameter = function (self, value)
+	_rawset (self, "FixedValue", value)
+end
+
+local switch_disable = function (self)	
+	if (not self.lock_texture) then
+		DF:NewImage (self, [[Interface\PetBattles\PetBattle-LockIcon]], 12, 12, "overlay", {0.0546875, 0.9453125, 0.0703125, 0.9453125}, "lock_texture", "$parentLockTexture")
+		self.lock_texture:SetDesaturated (true)
+		self.lock_texture:SetPoint ("center", self._thumb, "center")
+	end
+	
+	self.lock_texture:Show()
+	self._text:Hide()
+	self:SetAlpha (.4)
+	_rawset (self, "lockdown", true)
+end
+local switch_enable = function (self)
+	if (not self.lock_texture) then
+		DF:NewImage (self, [[Interface\PetBattles\PetBattle-LockIcon]], 12, 12, "overlay", {0.0546875, 0.9453125, 0.0703125, 0.9453125}, "lock_texture", "$parentLockTexture")
+		self.lock_texture:SetDesaturated (true)
+		self.lock_texture:SetPoint ("center", self._thumb, "center")
+	end
+	
+	self.lock_texture:Hide()
+	self._text:Show()
+	self:SetAlpha (1)
+	return _rawset (self, "lockdown", false)
+end
+
+function DF:CreateSwitch (parent, on_switch, default_value, w, h, ltext, rtext, member, name, color_inverted, switch_func, return_func, with_label)
+	local switch, label = DF:NewSwitch (parent, parent, name, member, w or 60, h or 20, ltext, rtext, default_value, color_inverted, switch_func, return_func, with_label)
+	if (on_switch) then
+		switch.OnSwitch = on_switch
+	end
+	return switch, label
+end
+
+function DF:NewSwitch (parent, container, name, member, w, h, ltext, rtext, default_value, color_inverted, switch_func, return_func, with_label)
+
+--> early checks
+	if (not name) then
+		name = "DetailsFrameWorkSlider" .. NameLessSlider
+		NameLessSlider = NameLessSlider + 1
+	elseif (not parent) then
+		return nil
+	end
+	if (not container) then
+		container = parent
+	end
+
+--> defaults
+	ltext = ltext or "OFF"
+	rtext = rtext or "ON"
+	
+--> build frames
+	
+	w = w or 60
+	h = h or 20
+	
+	local slider = DF:NewButton (parent, container, name, member, w, h)
+	
+	slider.switch_func = switch_func
+	slider.return_func = return_func
+	slider.SetValue = switch_set_value
+	slider.GetValue = switch_get_value
+	slider.SetFixedParameter = switch_set_fixparameter
+	slider.Disable = switch_disable
+	slider.Enable = switch_enable
+	
+	if (member) then
+		parent [member] = slider
+	end
+	
+	slider:SetBackdrop ({edgeFile = [[Interface\Buttons\UI-SliderBar-Border]], edgeSize = 8,
+	bgFile = [[Interface\AddOns\Details\images\background]], insets = {left = 3, right = 3, top = 5, bottom = 5}})
+	
+	local thumb = slider:CreateTexture (nil, "artwork")
+	thumb:SetTexture ("Interface\\Buttons\\UI-ScrollBar-Knob")
+	thumb:SetSize (34+(h*0.2), h*1.2)
+	thumb:SetAlpha (0.7)
+	thumb:SetPoint ("left", slider.widget, "left")
+	
+	local text = slider:CreateFontString (nil, "overlay", "GameFontHighlightSmall")
+	text:SetTextColor (.8, .8, .8, 1)
+	text:SetPoint ("center", thumb, "center")
+	
+	slider._text = text
+	slider._thumb = thumb
+	slider._ltext = ltext
+	slider._rtext = rtext
+	slider.thumb = thumb
+
+	slider.invert_colors = color_inverted
+	
+	slider:SetScript ("OnClick", SwitchOnClick)
+
+	slider:SetValue (default_value)
+
+	slider.isSwitch = true
+	
+	if (with_label) then
+		local label = DF:CreateLabel (slider.widget, with_label, nil, nil, nil, "label", nil, "overlay")
+		label.text = with_label
+		slider.widget:SetPoint ("left", label.widget, "right", 2, 0)
+		with_label = label
+	end
+
+	return slider, with_label
+end
+
+function DF:CreateSlider (parent, w, h, min, max, step, defaultv, isDecemal, member, name, with_label)
+	local slider, label = DF:NewSlider (parent, parent, name, member, w, h, min, max, step, defaultv, isDecemal, false, with_label)
+	return slider, label
+end
+
+function DF:NewSlider (parent, container, name, member, w, h, min, max, step, defaultv, isDecemal, isSwitch, with_label)
+	
+--> early checks
+	if (not name) then
+		name = "DetailsFrameworkSlider" .. DF.SliderCounter
+		DF.SliderCounter = DF.SliderCounter + 1
+	end
+	if (not parent) then
+		return nil
+	end
+	if (not container) then
+		container = parent
+	end
+	
+	if (name:find ("$parent")) then
+		name = name:gsub ("$parent", parent:GetName())
+	end
+	
+	local SliderObject = {type = "slider", dframework = true}
+	
+	if (member) then
+		parent [member] = SliderObject
+	end	
+	
+	if (parent.dframework) then
+		parent = parent.widget
+	end
+	if (container.dframework) then
+		container = container.widget
+	end
+	
+--> defaults	
+	min = min or 1
+	max = max or 2
+	step = step or 1
+	defaultv = defaultv or min
+	
+	w = w or 130
+	h = h or 19
+	
+	--> default members:
+		--> hooks
+		SliderObject.OnEnterHook = nil
+		SliderObject.OnLeaveHook = nil
+		SliderObject.OnHideHook = nil
+		SliderObject.OnShowHook = nil
+		SliderObject.OnValueChangeHook = nil
+		--> misc
+		SliderObject.lockdown = false
+		SliderObject.container = container
+		SliderObject.have_tooltip = nil
+		SliderObject.FixedValue = nil
+		SliderObject.useDecimals = isDecemal or false
+		
+	SliderObject.slider = CreateFrame ("slider", name, parent)
+	SliderObject.widget = SliderObject.slider
+
+	if (not APISliderFunctions) then
+		APISliderFunctions = true
+		local idx = getmetatable (SliderObject.slider).__index
+		for funcName, funcAddress in pairs (idx) do 
+			if (not SliderMetaFunctions [funcName]) then
+				SliderMetaFunctions [funcName] = function (object, ...)
+					local x = loadstring ( "return _G."..object.slider:GetName()..":"..funcName.."(...)")
+					return x (...)
+				end
+			end
+		end
+	end
+	
+	SliderObject.slider.MyObject = SliderObject
+	SliderObject.slider:SetWidth (w)
+	SliderObject.slider:SetHeight (h)
+	SliderObject.slider:SetOrientation ("horizontal")
+	SliderObject.slider:SetMinMaxValues (min, max)
+	SliderObject.slider:SetValueStep (step)
+	SliderObject.slider:SetValue (defaultv)
+	SliderObject.ivalue = defaultv
+
+	SliderObject.slider:SetBackdrop ({edgeFile = "Interface\\Buttons\\UI-SliderBar-Border", edgeSize = 8})
+	SliderObject.slider:SetBackdropColor (0.9, 0.7, 0.7, 1.0)
+
+	SliderObject.thumb = SliderObject.slider:CreateTexture (nil, "artwork")
+	SliderObject.thumb:SetTexture ("Interface\\Buttons\\UI-ScrollBar-Knob")
+	SliderObject.thumb:SetSize (30+(h*0.2), h*1.2)
+	SliderObject.thumb:SetAlpha (0.7)
+	SliderObject.slider:SetThumbTexture (SliderObject.thumb)
+	SliderObject.slider.thumb = SliderObject.thumb
+	
+	if (not isSwitch) then
+		SliderObject.have_tooltip = "Right Click to Type the Value"
+	end
+	
+	SliderObject.amt = SliderObject.slider:CreateFontString (nil, "overlay", "GameFontHighlightSmall")
+	
+	local amt = defaultv
+	if (amt < 10 and amt >= 1) then
+		amt = "0"..amt
+	end
+	
+	if (SliderObject.useDecimals) then
+		SliderObject.amt:SetText (string.format ("%.2f", amt))
+	else
+		SliderObject.amt:SetText (math.floor (amt))
+	end
+	
+	SliderObject.amt:SetTextColor (.8, .8, .8, 1)
+	SliderObject.amt:SetPoint ("center", SliderObject.thumb, "center")
+	SliderObject.slider.amt = SliderObject.amt
+
+	SliderObject.previous_value = {defaultv or 0, 0, 0}
+	
+	--> hooks
+		SliderObject.slider:SetScript ("OnEnter", OnEnter)
+		SliderObject.slider:SetScript ("OnLeave", OnLeave)
+		SliderObject.slider:SetScript ("OnHide", OnHide)
+		SliderObject.slider:SetScript ("OnShow", OnShow)
+		SliderObject.slider:SetScript ("OnValueChanged", OnValueChanged)
+		SliderObject.slider:SetScript ("OnMouseDown", OnMouseDown)
+		SliderObject.slider:SetScript ("OnMouseUp", OnMouseUp)
+		
+		
+	_setmetatable (SliderObject, SliderMetaFunctions)
+	
+	if (with_label) then
+		local label = DF:CreateLabel (SliderObject.slider, with_label, nil, nil, nil, "label", nil, "overlay")
+		label.text = with_label
+		SliderObject.slider:SetPoint ("left", label.widget, "right", 2, 0)
+		with_label = label
+	end
+	
+	return SliderObject, with_label
+	
+end
\ No newline at end of file