local DF = _G [ " DetailsFramework " ]
if ( not DF or not DetailsFrameworkCanLoad ) then
return
end
local _
local APISliderFunctions = false
do
local metaPrototype = {
WidgetType = " slider " ,
dversion = DF.dversion
}
--check if there's a metaPrototype already existing
if ( _G [ DF.GlobalWidgetControlNames [ " slider " ] ] ) then
--get the already existing metaPrototype
local oldMetaPrototype = _G [ DF.GlobalWidgetControlNames [ " slider " ] ]
--check if is older
if ( ( not oldMetaPrototype.dversion ) or ( oldMetaPrototype.dversion < DF.dversion ) ) then
--the version is older them the currently loading one
--copy the new values into the old metatable
for funcName , _ in pairs ( metaPrototype ) do
oldMetaPrototype [ funcName ] = metaPrototype [ funcName ]
end
end
else
--first time loading the framework
_G [ DF.GlobalWidgetControlNames [ " slider " ] ] = metaPrototype
end
end
local DFSliderMetaFunctions = _G [ DF.GlobalWidgetControlNames [ " slider " ] ]
DF : Mixin ( DFSliderMetaFunctions , DF.SetPointMixin )
DF : Mixin ( DFSliderMetaFunctions , DF.FrameMixin )
DF : Mixin ( DFSliderMetaFunctions , DF.TooltipHandlerMixin )
DF : Mixin ( DFSliderMetaFunctions , DF.ScriptHookMixin )
------------------------------------------------------------------------------------------------------------
--metatables
DFSliderMetaFunctions.__call = function ( object , value )
if ( not value ) then
if ( object.isSwitch ) then
if ( type ( value ) == " boolean " ) then
object.slider : SetValue ( 1 )
return
end
if ( object.slider : GetValue ( ) == 1 ) then
return false
else
return true
end
end
return object.slider : GetValue ( )
else
if ( object.isSwitch ) then
if ( type ( value ) == " boolean " ) then
if ( value ) then
object.slider : SetValue ( 2 )
else
object.slider : SetValue ( 1 )
end
else
object.slider : SetValue ( value )
end
return
end
return object.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
DFSliderMetaFunctions.GetMembers = DFSliderMetaFunctions.GetMembers or { }
DFSliderMetaFunctions.GetMembers [ " tooltip " ] = gmember_tooltip
DFSliderMetaFunctions.GetMembers [ " shown " ] = gmember_shown
DFSliderMetaFunctions.GetMembers [ " width " ] = gmember_width
DFSliderMetaFunctions.GetMembers [ " height " ] = gmember_height
DFSliderMetaFunctions.GetMembers [ " locked " ] = gmember_locked
DFSliderMetaFunctions.GetMembers [ " fractional " ] = gmember_fractional
DFSliderMetaFunctions.GetMembers [ " value " ] = gmember_value
DFSliderMetaFunctions.__index = function ( object , key )
local func = DFSliderMetaFunctions.GetMembers [ key ]
if ( func ) then
return func ( object , key )
end
local alreadyHaveKey = rawget ( object , key )
if ( alreadyHaveKey ) then
return alreadyHaveKey
end
return DFSliderMetaFunctions [ key ]
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 object : Disable ( )
else
return object : 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
DFSliderMetaFunctions.SetMembers = DFSliderMetaFunctions.SetMembers or { }
DFSliderMetaFunctions.SetMembers [ " tooltip " ] = smember_tooltip
DFSliderMetaFunctions.SetMembers [ " show " ] = smember_show
DFSliderMetaFunctions.SetMembers [ " hide " ] = smember_hide
DFSliderMetaFunctions.SetMembers [ " backdrop " ] = smember_backdrop
DFSliderMetaFunctions.SetMembers [ " width " ] = smember_width
DFSliderMetaFunctions.SetMembers [ " height " ] = smember_height
DFSliderMetaFunctions.SetMembers [ " locked " ] = smember_locked
DFSliderMetaFunctions.SetMembers [ " fractional " ] = smember_fractional
DFSliderMetaFunctions.SetMembers [ " value " ] = smember_value
DFSliderMetaFunctions.__newindex = function ( object , key , value )
local func = DFSliderMetaFunctions.SetMembers [ key ]
if ( func ) then
return func ( object , value )
else
return rawset ( object , key , value )
end
end
------------------------------------------------------------------------------------------------------------
--methods
--fixed value
function DFSliderMetaFunctions : SetFixedParameter ( value )
rawset ( self , " FixedValue " , value )
end
function DFSliderMetaFunctions : GetFixedParameter ( )
return rawget ( self , " FixedValue " )
end
--set value
function DFSliderMetaFunctions : SetValue ( value )
return self ( value )
end
function DFSliderMetaFunctions : SetValueNoCallback ( value )
self.NoCallback = true
self.slider : SetValue ( value )
end
-- thumb size
function DFSliderMetaFunctions : SetThumbSize ( width , height )
if ( not width ) then
width = self.thumb : GetWidth ( )
end
if ( not height ) then
height = self.thumb : GetHeight ( )
end
return self.thumb : SetSize ( width , height )
end
--clear focus
function DFSliderMetaFunctions : ClearFocus ( )
local editbox = DFSliderMetaFunctions.editbox_typevalue
if editbox and self.typing_value then
editbox : ClearFocus ( )
editbox : Hide ( )
editbox : GetParent ( ) . MyObject.typing_value = false
editbox : GetParent ( ) . MyObject.value = self.typing_value_started
end
end
--enabled
function DFSliderMetaFunctions : IsEnabled ( )
return not rawget ( self , " lockdown " )
end
function DFSliderMetaFunctions : Enable ( )
self.slider : Enable ( )
if ( not self.is_checkbox ) then
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 ( )
end
self.slider . amt : Show ( )
self : SetAlpha ( 1 )
if ( self.is_checkbox ) then
self.checked_texture : Show ( )
end
return rawset ( self , " lockdown " , false )
end
function DFSliderMetaFunctions : Disable ( )
self : ClearFocus ( )
self.slider : Disable ( )
self.slider . amt : Hide ( )
self : SetAlpha ( .4 )
if ( not self.is_checkbox ) then
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 ( )
end
if ( self.is_checkbox ) then
self.checked_texture : Show ( )
end
return rawset ( self , " lockdown " , true )
end
------------------------------------------------------------------------------------------------------------
--scripts
local OnEnter = function ( slider )
local object = slider.MyObject
if ( rawget ( object , " lockdown " ) ) then
return
end
DetailsFrameworkSliderButtons1 : ShowMe ( slider , object.bAttachButtonsToLeft )
local kill = object : RunHooksForWidget ( " OnEnter " , slider , object )
if ( kill ) then
return
end
slider.thumb : SetAlpha ( 1 )
if ( object.onenter_backdrop_border_color ) then
slider : SetBackdropBorderColor ( unpack ( object.onenter_backdrop_border_color ) )
end
object : ShowTooltip ( )
end
local OnLeave = function ( slider )
local object = slider.MyObject
if ( rawget ( object , " lockdown " ) ) then
return
end
DetailsFrameworkSliderButtons1 : PrepareToHide ( )
local kill = object : RunHooksForWidget ( " OnLeave " , slider , object )
if ( kill ) then
return
end
slider.thumb : SetAlpha ( .7 )
if ( object.onleave_backdrop_border_color ) then
slider : SetBackdropBorderColor ( unpack ( object.onleave_backdrop_border_color ) )
end
object : HideTooltip ( )
end
--parent frame for the plus and minus buttons which shows when the slider is hovered over
local sliderButtonsParentFrame = DetailsFrameworkSliderButtons1 or CreateFrame ( " frame " , " DetailsFrameworkSliderButtons1 " , UIParent , " BackdropTemplate " )
sliderButtonsParentFrame : Hide ( )
sliderButtonsParentFrame : SetHeight ( 18 ) --width is set by setpoint
C_Timer.After ( 0 , function ( )
if ( not sliderButtonsParentFrame.__background ) then
DetailsFramework : ApplyStandardBackdrop ( sliderButtonsParentFrame ) --ApplyStandardBackdrop loads after this file
end
sliderButtonsParentFrame : SetBackdropBorderColor ( 0 , 0 , 0 , 0 )
sliderButtonsParentFrame : SetBackdropColor ( .05 , .05 , .05 , .9 )
end )
sliderButtonsParentFrame.isGoingToHide = false
local timeToHide = 0
local onUpdateTimeToHide = function ( self , elapsed )
timeToHide = timeToHide + elapsed
if ( timeToHide > 0.3 ) then
sliderButtonsParentFrame : Hide ( )
sliderButtonsParentFrame : SetScript ( " OnUpdate " , nil )
sliderButtonsParentFrame.isGoingToHide = false
end
end
function sliderButtonsParentFrame : ShowMe ( sliderFrame , bAnchorToLeft )
sliderButtonsParentFrame.bAnchorToLeft = bAnchorToLeft
sliderButtonsParentFrame : SetParent ( sliderFrame )
sliderButtonsParentFrame : ClearAllPoints ( )
sliderButtonsParentFrame.buttonMinor : ClearAllPoints ( )
sliderButtonsParentFrame.buttonPlus : ClearAllPoints ( )
sliderButtonsParentFrame : SetWidth ( 35 )
if ( sliderButtonsParentFrame.bAnchorToLeft ) then
sliderButtonsParentFrame : SetPoint ( " topright " , sliderFrame , " topleft " , 0 , 0 )
sliderButtonsParentFrame : SetPoint ( " bottomright " , sliderFrame , " bottomleft " , 0 , 0 )
sliderButtonsParentFrame.buttonPlus : SetPoint ( " right " , sliderButtonsParentFrame , " right " , - 2 , 0 )
sliderButtonsParentFrame.buttonMinor : SetPoint ( " right " , sliderButtonsParentFrame.buttonPlus , " left " , 0 , 0 )
else
sliderButtonsParentFrame : SetPoint ( " topleft " , sliderFrame , " topright " , 2 , 0 )
sliderButtonsParentFrame : SetPoint ( " bottomleft " , sliderFrame , " bottomright " , 2 , 0 )
sliderButtonsParentFrame.buttonMinor : SetPoint ( " left " , sliderButtonsParentFrame , " left " , 2 , 0 )
sliderButtonsParentFrame.buttonPlus : SetPoint ( " left " , sliderButtonsParentFrame.buttonMinor , " right " , 0 , 0 )
end
sliderButtonsParentFrame : SetFrameStrata ( " FULLSCREEN " )
sliderButtonsParentFrame : SetFrameLevel ( sliderFrame : GetFrameLevel ( ) + 1000 )
sliderButtonsParentFrame : Show ( )
if ( sliderButtonsParentFrame.isGoingToHide ) then
sliderButtonsParentFrame : SetScript ( " OnUpdate " , nil )
sliderButtonsParentFrame.isGoingToHide = false
end
sliderButtonsParentFrame.host = sliderFrame.MyObject
end
function sliderButtonsParentFrame : PrepareToHide ( )
sliderButtonsParentFrame.isGoingToHide = true
timeToHide = 0
sliderButtonsParentFrame : SetScript ( " OnUpdate " , onUpdateTimeToHide )
end
local buttonPlus = DetailsFrameworkSliderButtonsPlusButton or CreateFrame ( " button " , " DetailsFrameworkSliderButtonsPlusButton " , sliderButtonsParentFrame , " BackdropTemplate " )
local buttonMinor = DetailsFrameworkSliderButtonsMinorButton or CreateFrame ( " button " , " DetailsFrameworkSliderButtonsMinorButton " , sliderButtonsParentFrame , " BackdropTemplate " )
buttonPlus : SetFrameStrata ( sliderButtonsParentFrame : GetFrameStrata ( ) )
buttonMinor : SetFrameStrata ( sliderButtonsParentFrame : GetFrameStrata ( ) )
sliderButtonsParentFrame.buttonPlus = buttonPlus
sliderButtonsParentFrame.buttonMinor = buttonMinor
buttonPlus : SetScript ( " OnEnter " , function ( self )
if ( sliderButtonsParentFrame.isGoingToHide ) then
sliderButtonsParentFrame : SetScript ( " OnUpdate " , nil )
sliderButtonsParentFrame.isGoingToHide = false
end
end )
buttonMinor : SetScript ( " OnEnter " , function ( self )
if ( sliderButtonsParentFrame.isGoingToHide ) then
sliderButtonsParentFrame : SetScript ( " OnUpdate " , nil )
sliderButtonsParentFrame.isGoingToHide = false
end
end )
buttonPlus : SetScript ( " OnLeave " , function ( self )
sliderButtonsParentFrame : PrepareToHide ( )
end )
buttonMinor : SetScript ( " OnLeave " , function ( self )
sliderButtonsParentFrame : PrepareToHide ( )
end )
buttonPlus : SetNormalTexture ( [[Interface\Buttons\UI-PlusButton-Up]] )
buttonMinor : SetNormalTexture ( [[Interface\Buttons\UI-MinusButton-Up]] )
buttonPlus : SetPushedTexture ( [[Interface\Buttons\UI-PlusButton-Down]] )
buttonMinor : SetPushedTexture ( [[Interface\Buttons\UI-MinusButton-Down]] )
buttonPlus : SetDisabledTexture ( [[Interface\Buttons\UI-PlusButton-Disabled]] )
buttonMinor : SetDisabledTexture ( [[Interface\Buttons\UI-MinusButton-Disabled]] )
buttonPlus : SetHighlightTexture ( [[Interface\Buttons\UI-PlusButton-Hilight]] )
buttonMinor : SetHighlightTexture ( [[Interface\Buttons\UI-PlusButton-Hilight]] )
C_Timer.After ( 0 , function ( )
DF : SetButtonTexture ( buttonPlus , " AlliedRace-UnlockingFrame-ZoomIn " )
DF : SetButtonTexture ( buttonMinor , " AlliedRace-UnlockingFrame-ZoomOut " )
end )
buttonMinor : ClearAllPoints ( )
buttonPlus : ClearAllPoints ( )
buttonMinor : SetPoint ( " bottomright " , sliderButtonsParentFrame , " bottomright " , 13 , - 13 )
buttonPlus : SetPoint ( " left " , buttonMinor , " right " , - 2 , 0 )
buttonPlus : SetSize ( 16 , 16 )
buttonMinor : SetSize ( 16 , 16 )
buttonPlus : SetAlpha ( 0.834 )
buttonMinor : SetAlpha ( 0.834 )
--increate the value on pressing the button or holding the button pressed
local buttonPlusOnClick = function ( )
local sliderObject = sliderButtonsParentFrame.host
local currentValueOnSlider = sliderObject.value
local editboxShowingValue = DFSliderMetaFunctions.editbox_typevalue
if ( sliderObject.fine_tuning ) then
sliderObject : SetValue ( currentValueOnSlider + sliderObject.fine_tuning )
if ( editboxShowingValue and DFSliderMetaFunctions.editbox_typevalue : IsShown ( ) ) then
DFSliderMetaFunctions.editbox_typevalue : SetText ( tostring ( string.format ( " %.2f " , currentValueOnSlider + sliderObject.fine_tuning ) ) )
end
else
if ( sliderObject.useDecimals ) then
sliderObject : SetValue ( currentValueOnSlider + 0.1 )
if ( editboxShowingValue and DFSliderMetaFunctions.editbox_typevalue : IsShown ( ) ) then
DFSliderMetaFunctions.editbox_typevalue : SetText ( string.format ( " %.2f " , currentValueOnSlider + 0.1 ) )
end
else
sliderObject : SetValue ( currentValueOnSlider + 1 )
if ( editboxShowingValue and DFSliderMetaFunctions.editbox_typevalue : IsShown ( ) ) then
DFSliderMetaFunctions.editbox_typevalue : SetText ( tostring ( math.floor ( currentValueOnSlider + 1 ) ) )
end
end
end
end
buttonPlus : SetScript ( " OnMouseUp " , function ( self )
if ( not buttonPlus.got_click ) then
buttonPlusOnClick ( )
end
buttonPlus.got_click = false
self : SetScript ( " OnUpdate " , nil )
end )
--hold the plus or minus button for x amount of time before start changing the value
local delayBeforeStartSimulatingClicks = 0
--after the delay been passed, trigger a click each x seconds
local simulateClickTimer = 0
local buttonPlusOnUpdate = function ( self , deltaTime )
delayBeforeStartSimulatingClicks = delayBeforeStartSimulatingClicks + deltaTime
if ( delayBeforeStartSimulatingClicks > 0.4 ) then
simulateClickTimer = simulateClickTimer + deltaTime
if ( simulateClickTimer > 0.1 ) then
simulateClickTimer = 0
buttonPlusOnClick ( )
buttonPlus.got_click = true
end
end
end
buttonPlus : SetScript ( " OnMouseDown " , function ( self )
delayBeforeStartSimulatingClicks = 0
simulateClickTimer = 0
self : SetScript ( " OnUpdate " , buttonPlusOnUpdate )
end )
-- -- --
--increate the value on pressing the button or holding the button pressed
local buttonMinusOnClick = function ( )
local sliderObject = sliderButtonsParentFrame.host
local currentValueOnSlider = sliderObject.value
local editboxShowingValue = DFSliderMetaFunctions.editbox_typevalue
if ( sliderObject.fine_tuning ) then
sliderObject : SetValue ( currentValueOnSlider - sliderObject.fine_tuning )
if ( editboxShowingValue and DFSliderMetaFunctions.editbox_typevalue : IsShown ( ) ) then
DFSliderMetaFunctions.editbox_typevalue : SetText ( tostring ( string.format ( " %.2f " , currentValueOnSlider - sliderObject.fine_tuning ) ) )
end
else
if ( sliderObject.useDecimals ) then
sliderObject : SetValue ( currentValueOnSlider - 0.1 )
if ( editboxShowingValue and DFSliderMetaFunctions.editbox_typevalue : IsShown ( ) ) then
DFSliderMetaFunctions.editbox_typevalue : SetText ( string.format ( " %.2f " , currentValueOnSlider - 0.1 ) )
end
else
sliderObject : SetValue ( currentValueOnSlider - 1 )
if ( editboxShowingValue and DFSliderMetaFunctions.editbox_typevalue : IsShown ( ) ) then
DFSliderMetaFunctions.editbox_typevalue : SetText ( tostring ( math.floor ( currentValueOnSlider - 1 ) ) )
end
end
end
end
buttonMinor : SetScript ( " OnMouseUp " , function ( self )
if ( not buttonMinor.got_click ) then
buttonMinusOnClick ( )
end
buttonMinor.got_click = false
self : SetScript ( " OnUpdate " , nil )
end )
local buttonMinusOnUpdate = function ( self , elapsed )
delayBeforeStartSimulatingClicks = delayBeforeStartSimulatingClicks + elapsed
if ( delayBeforeStartSimulatingClicks > 0.4 ) then
simulateClickTimer = simulateClickTimer + elapsed
if ( simulateClickTimer > 0.1 ) then
simulateClickTimer = 0
buttonMinusOnClick ( )
buttonMinor.got_click = true
end
end
end
buttonMinor : SetScript ( " OnMouseDown " , function ( self )
delayBeforeStartSimulatingClicks = 0
simulateClickTimer = 0
self : SetScript ( " OnUpdate " , buttonMinusOnUpdate )
end )
local do_precision = function ( text )
if ( type ( text ) == " string " and text : find ( " %. " ) ) then
local left , right = strsplit ( " . " , text )
left = tonumber ( left )
right = tonumber ( right )
if ( left and right ) then
local newString = tostring ( left ) .. " . " .. tostring ( right )
local newNumber = tonumber ( newString )
if ( newNumber ) then
return newNumber
end
end
end
return tonumber ( text )
end
DF.TextToFloor = do_precision
function DFSliderMetaFunctions : TypeValue ( )
if ( not self.isSwitch ) then
if ( not DFSliderMetaFunctions.editbox_typevalue ) then
local editbox = CreateFrame ( " EditBox " , " DetailsFrameworkSliderEditBox " , UIParent , " BackdropTemplate " )
editbox : SetSize ( 40 , 20 )
editbox : SetJustifyH ( " center " )
DF : ApplyStandardBackdrop ( editbox )
editbox : SetFontObject ( " GameFontHighlightSmall " )
editbox : SetScript ( " OnEnterPressed " , function ( )
editbox : ClearFocus ( )
editbox : Hide ( )
editbox : GetParent ( ) . MyObject.typing_value = false
editbox : GetParent ( ) . MyObject.value = tonumber ( editbox : GetText ( ) ) --do_precision (editbox:GetText())
end )
editbox : SetScript ( " OnEscapePressed " , function ( )
editbox : ClearFocus ( )
editbox : Hide ( )
editbox : GetParent ( ) . MyObject.typing_value = false
editbox : GetParent ( ) . MyObject.value = self.typing_value_started --do_precision (self.typing_value_started)
end )
editbox : SetScript ( " OnTextChanged " , function ( )
editbox : GetParent ( ) . MyObject.typing_can_change = true
editbox : GetParent ( ) . MyObject.value = tonumber ( editbox : GetText ( ) ) --do_precision
editbox : GetParent ( ) . MyObject.typing_can_change = false
end )
DFSliderMetaFunctions.editbox_typevalue = editbox
end
local pvalue = self.previous_value [ 2 ]
self : SetValue ( pvalue )
self.typing_value = true
self.typing_value_started = pvalue
DFSliderMetaFunctions.editbox_typevalue : SetSize ( self.width , self.height )
DFSliderMetaFunctions.editbox_typevalue : SetPoint ( " center " , self.widget , " center " )
DFSliderMetaFunctions.editbox_typevalue : SetFocus ( )
DFSliderMetaFunctions.editbox_typevalue : SetParent ( self.widget )
DFSliderMetaFunctions.editbox_typevalue : SetFrameLevel ( self.widget : GetFrameLevel ( ) + 1 )
if ( self.useDecimals ) then
DFSliderMetaFunctions.editbox_typevalue : SetText ( tostring ( string.format ( " %.1f " , self.value ) ) )
else
DFSliderMetaFunctions.editbox_typevalue : SetText ( tostring ( math.floor ( self.value ) ) )
end
DFSliderMetaFunctions.editbox_typevalue : HighlightText ( )
DFSliderMetaFunctions.editbox_typevalue : Show ( )
end
end
local OnMouseDown = function ( slider , button )
local object = slider.MyObject
object.IsValueChanging = true
local kill = object : RunHooksForWidget ( " OnMouseDown " , slider , button , object )
if ( kill ) then
return
end
if ( button == " RightButton " ) then
object : TypeValue ( )
end
end
local OnMouseUp = function ( slider , button )
local object = slider.MyObject
object.IsValueChanging = nil
local kill = object : RunHooksForWidget ( " OnMouseUp " , slider , button , object )
if ( kill ) then
return
end
end
local OnHide = function ( slider )
local object = slider.MyObject
local kill = object : RunHooksForWidget ( " OnHide " , slider , object )
if ( kill ) then
return
end
if ( object.typing_value ) then
DFSliderMetaFunctions.editbox_typevalue : ClearFocus ( )
DFSliderMetaFunctions.editbox_typevalue : SetText ( " " )
object.typing_valu = false
end
end
local OnShow = function ( slider )
local object = slider.MyObject
local kill = object : RunHooksForWidget ( " OnShow " , slider , object )
if ( kill ) then
return
end
end
local OnValueChanged = function ( slider )
local object = slider.MyObject
local amt
if ( object.useDecimals ) then
amt = slider : GetValue ( )
else
amt = do_precision ( slider : GetValue ( ) )
end
if ( object.typing_value and not object.typing_can_change ) then
object : SetValue ( object.typing_value_started )
return
end
table.insert ( object.previous_value , 1 , amt )
table.remove ( object.previous_value , 4 )
if ( object.useDecimals ) then
slider.amt : SetText ( string.format ( " %.2f " , amt ) )
else
slider.amt : SetText ( math.floor ( amt ) )
end
object.ivalue = amt
if ( object.NoCallback ) then
object.NoCallback = false
return
end
--some plugins registered OnValueChanged and others with OnValueChange
local kill = object : RunHooksForWidget ( " OnValueChanged " , slider , object.FixedValue , amt , object )
if ( kill ) then
return
end
local kill = object : RunHooksForWidget ( " OnValueChange " , slider , object.FixedValue , amt , object )
if ( kill ) then
return
end
if ( object.OnValueChanged ) then
object.OnValueChanged ( slider , object.FixedValue , amt )
end
end
------------------------------------------------------------------------------------------------------------
--object constructor
local SwitchOnClick = function ( self , button , forced_value , value )
local object = self.MyObject
if ( rawget ( object , " lockdown " ) ) then
return
end
if ( forced_value ) then
rawset ( object , " value " , not value )
end
if ( rawget ( object , " value " ) ) then --actived
rawset ( object , " value " , false )
if ( object.backdrop_disabledcolor ) then
object : SetBackdropColor ( unpack ( object.backdrop_disabledcolor ) )
else
object : SetBackdropColor ( 1 , 0 , 0 , 0.4 )
end
if ( object.is_checkbox ) then
object.checked_texture : Hide ( )
else
object._text : SetText ( object._ltext )
object._thumb : ClearAllPoints ( )
object._thumb : SetPoint ( " left " , object.widget , " left " )
end
else
rawset ( object , " value " , true )
if ( object.backdrop_enabledcolor ) then
object : SetBackdropColor ( unpack ( object.backdrop_enabledcolor ) )
else
object : SetBackdropColor ( 0 , 0 , 1 , 0.4 )
end
if ( object.is_checkbox ) then
object.checked_texture : Show ( )
else
object._text : SetText ( object._rtext )
object._thumb : ClearAllPoints ( )
object._thumb : SetPoint ( " right " , object.widget , " right " )
end
end
if ( object.OnSwitch and not forced_value ) then
local value = rawget ( object , " value " )
if ( object.return_func ) then
value = object : return_func ( value )
end
local success , errorText = xpcall ( object.OnSwitch , geterrorhandler ( ) , object , object.FixedValue , value )
if ( not success ) then
return
end
--trigger hooks
object : RunHooksForWidget ( " OnSwitch " , object , object.FixedValue , value )
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_get_fixparameter = function ( self )
return rawget ( self , " FixedValue " )
end
local switch_disable = function ( self )
if ( self.is_checkbox ) then
self.checked_texture : Hide ( )
else
self._text : Hide ( )
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 ( )
end
self : SetAlpha ( .4 )
rawset ( self , " lockdown " , true )
end
local switch_enable = function ( self )
if ( self.is_checkbox ) then
if ( rawget ( self , " value " ) ) then
self.checked_texture : Show ( )
else
self.checked_texture : Hide ( )
end
else
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 ( )
end
self : SetAlpha ( 1 )
return rawset ( self , " lockdown " , false )
end
local set_switch_func = function ( self , newFunction )
self.OnSwitch = newFunction
end
local get_switch_func = function ( self )
return self.OnSwitch
end
local setCheckedTexture = function ( self , texture , xOffSet , yOffSet , sizePercent , color )
if ( texture ) then
self.checked_texture : SetTexture ( texture , " CLAMP " , " CLAMP " , " TRILINEAR " )
end
if ( xOffSet or yOffSet ) then
self.checked_texture : SetPoint ( " center " , self.button , " center " , xOffSet or - 1 , yOffSet or - 1 )
else
self.checked_texture : SetPoint ( " center " , self.button , " center " , - 1 , - 1 )
end
if ( sizePercent and type ( sizePercent ) == " number " ) then
local width = self : GetWidth ( ) * sizePercent
self.checked_texture : SetSize ( width , width )
end
if ( color ) then
local r , g , b , a = DF : ParseColors ( color )
self.checked_texture : SetVertexColor ( r , g , b , a )
end
end
local set_as_checkbok = function ( self )
if self.is_checkbox and self.checked_texture then return end
local checked = self : CreateTexture ( self : GetName ( ) .. " CheckTexture " , " overlay " )
checked : SetTexture ( [[Interface\Buttons\UI-CheckBox-Check]] )
checked : SetPoint ( " center " , self.button , " center " , - 1 , - 1 )
local size_pct = self : GetWidth ( ) / 32
checked : SetSize ( 32 * size_pct , 32 * size_pct )
self.checked_texture = checked
self.SetCheckedTexture = setCheckedTexture
self.SetChecked = switch_set_value
self.GetChecked = switch_get_value
self._thumb : Hide ( )
self._text : Hide ( )
self.is_checkbox = true
if ( rawget ( self , " value " ) ) then
self.checked_texture : Show ( )
if ( self.backdrop_enabledcolor ) then
self : SetBackdropColor ( unpack ( self.backdrop_enabledcolor ) )
else
self : SetBackdropColor ( 0 , 0 , 1 , 0.4 )
end
else
self.checked_texture : Hide ( )
if ( self.backdrop_disabledcolor ) then
self : SetBackdropColor ( unpack ( self.backdrop_disabledcolor ) )
else
self : SetBackdropColor ( 0 , 0 , 1 , 0.4 )
end
end
end
---@class df_checkbox : df_button, df_widgets
---@field OnSwitch fun(self:df_checkbox, fixedValue:any, value:boolean)
---@field SetValue fun(self:df_button, value:boolean)
---@field GetValue fun(self:df_button):boolean
---@field SetFixedParameter fun(self:df_button, value:any)
---@field GetFixedParameter fun(self:df_button):any
---@field Disable fun(self:df_button)
---@field Enable fun(self:df_button)
---@field SetAsCheckBox fun(self:df_button)
---@field SetTemplate fun(self:df_button, template: table)
---@field GetSwitchFunction fun(self:df_button):function
---@field SetSwitchFunction fun(self:df_button, newOnSwitchFunction: function)
---@field GetCapsule fun(self:df_button):df_button capsule only exists in the actual frame of the encapsulated widget
---@field SetCheckedTexture fun(self:df_button, texture:string)
function DF : CreateSwitch ( parent , onSwitch , defaultValue , width , height , leftText , rightText , member , name , colorInverted , switchFunc , returnFunc , withLabel , switch_template , label_template )
local switch , label = DF : NewSwitch ( parent , parent , name , member , width or 60 , height or 20 , leftText , rightText , defaultValue , colorInverted , switchFunc , returnFunc , withLabel , switch_template , label_template )
if ( onSwitch ) then
switch.OnSwitch = onSwitch
end
---@cast switch df_checkbox
---@cast label df_label
return switch , label
end
function DF : NewSwitch ( parent , container , name , member , width , height , leftText , rightText , defaultValue , colorInverted , switch_func , return_func , with_label , switch_template , label_template )
--early checks
if ( not name ) then
name = " DetailsFrameWorkSlider " .. DF.SwitchCounter
DF.SwitchCounter = DF.SwitchCounter + 1
elseif ( not parent ) then
return error ( " Details! FrameWork: parent not found. " , 2 )
end
if ( not container ) then
container = parent
end
--defaults
leftText = leftText or " OFF "
rightText = rightText or " ON "
--build frames
width = width or 60
height = height or 20
local slider = DF : NewButton ( parent , container , name , member , width , height )
slider.HookList . OnSwitch = { }
slider.type = " switch "
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.GetFixedParameter = switch_get_fixparameter
slider.Disable = switch_disable
slider.Enable = switch_enable
slider.SetAsCheckBox = set_as_checkbok
slider.SetTemplate = DFSliderMetaFunctions.SetTemplate
slider.SetSwitchFunction = set_switch_func
slider.GetSwitchFunction = get_switch_func
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 + ( height * 0.2 ) , height * 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 = leftText
slider._rtext = rightText
slider.thumb = thumb
slider.invert_colors = colorInverted
slider : SetScript ( " OnClick " , SwitchOnClick )
slider : SetValue ( defaultValue )
slider.isSwitch = true
if ( switch_template ) then
slider : SetTemplate ( switch_template )
end
if ( with_label ) then
local label = DF : CreateLabel ( slider.widget , with_label , nil , nil , nil , " label " , nil , " overlay " )
label.text = with_label
PixelUtil.SetPoint ( slider.widget , " left " , label.widget , " right " , 2 , 0 )
with_label = label
if ( label_template ) then
label : SetTemplate ( label_template )
end
end
return slider , with_label
end
function DFSliderMetaFunctions : SetTemplate ( template )
template = DF : ParseTemplate ( self.type , template )
--slider e switch
if ( template.width ) then
PixelUtil.SetWidth ( self.widget , template.width )
end
if ( template.height ) then
PixelUtil.SetHeight ( self.widget , template.height )
end
if ( template.backdrop ) then
self : SetBackdrop ( template.backdrop )
end
if ( template.backdropcolor ) then
local r , g , b , a = DF : ParseColors ( template.backdropcolor )
self : SetBackdropColor ( r , g , b , a )
end
if ( template.backdropbordercolor ) then
local r , g , b , a = DF : ParseColors ( template.backdropbordercolor )
self : SetBackdropBorderColor ( r , g , b , a )
self.onleave_backdrop_border_color = { r , g , b , a }
end
if ( template.onenterbordercolor ) then
local r , g , b , a = DF : ParseColors ( template.onenterbordercolor )
self.onenter_backdrop_border_color = { r , g , b , a }
end
if ( template.onleavebordercolor ) then
local r , g , b , a = DF : ParseColors ( template.onleavebordercolor )
self.onleave_backdrop_border_color = { r , g , b , a }
end
if ( template.thumbtexture ) then
if ( self.thumb ) then
DF : SetAtlas ( self.thumb , template.thumbtexture )
end
end
if ( template.slider_left ) then
if ( self.slider_left ) then
DF : SetAtlas ( self.slider_left , template.slider_left )
end
end
if ( template.slider_right ) then
if ( self.slider_right ) then
DF : SetAtlas ( self.slider_right , template.slider_right )
end
end
if ( template.slider_middle ) then
if ( self.slider_middle ) then
self : SetBackdrop ( nil )
DF : SetAtlas ( self.slider_middle , template.slider_middle )
end
end
if ( template.thumbwidth ) then
if ( self.thumb ) then
self.thumb : SetWidth ( template.thumbwidth )
end
end
if ( template.thumbheight ) then
if ( self.thumb ) then
self.thumb : SetHeight ( template.thumbheight )
end
end
if ( template.thumbcolor ) then
if ( self.thumb ) then
local r , g , b , a = DF : ParseColors ( template.thumbcolor )
self.thumb : SetVertexColor ( r , g , b , a )
end
end
if ( template.amount_color ) then
DF : SetFontColor ( self.amt , template.amount_color )
end
if ( template.amount_outline ) then
DF : SetFontOutline ( self.amt , template.amount_outline )
end
if ( template.amount_size ) then
DF : SetFontSize ( self.amt , template.amount_size )
end
--switch only
if ( template.enabled_backdropcolor ) then
local r , g , b , a = DF : ParseColors ( template.enabled_backdropcolor )
self.backdrop_enabledcolor = { r , g , b , a }
end
if ( template.disabled_backdropcolor ) then
local r , g , b , a = DF : ParseColors ( template.disabled_backdropcolor )
self.backdrop_disabledcolor = { r , g , b , a }
end
if ( template.is_checkbox ) then
self : SetAsCheckBox ( )
self : SetCheckedTexture ( template.checked_texture , template.checked_xoffset or 0 , template.checked_yoffset or 0 , template.checked_size_percent or 0.7 , template.checked_color )
end
if ( template.rounded_corner ) then
self : SetBackdrop ( nil )
DF : AddRoundedCornersToFrame ( self.widget or self , template.rounded_corner )
end
end
--DF:Mixin(DFSliderMetaFunctions, DF.SetPointMixin)
--DF:Mixin(DFSliderMetaFunctions, DF.FrameMixin)
--DF:Mixin(DFSliderMetaFunctions, DF.TooltipHandlerMixin)
---@class df_slider : slider, df_scripthookmixin, df_widgets
---@field tooltip string?
---@field widget slider
---@field slider slider
---@field type string
---@field dframework boolean
---@field SetTemplate fun(self:df_slider, template: table|string)
---@field SetFixedParameter fun(value: any)
---@field GetFixedParameter fun()
---@field SetValueNoCallback fun(value: number)
---@field SetThumbSize fun(width:number, height:number)
---@field ClearFocus fun()
---@param parent frame
---@param width number? default 150
---@param height number? default 20
---@param minValue number? default 1
---@param maxValue number? default 2
---@param step number? default 1
---@param defaultv number? default to minValue
---@param isDecemal boolean? default false
---@param member string?
---@param name string?
---@param label string?
---@param sliderTemplate string|table|nil
---@param labelTemplate string|table|nil
---@return df_slider, df_label?
function DF : CreateSlider ( parent , width , height , minValue , maxValue , step , defaultv , isDecemal , member , name , label , sliderTemplate , labelTemplate )
local slider , labelText = DF : NewSlider ( parent , parent , name , member , width , height , minValue , maxValue , step , defaultv , isDecemal , false , label , sliderTemplate , labelTemplate )
return slider , labelText
end
---@return df_slider, df_label?
function DF : NewSlider ( parent , container , name , member , width , height , minValue , maxValue , step , defaultValue , isDecemal , isSwitch , with_label , slider_template , label_template )
if ( not name ) then
name = " DetailsFrameworkSlider " .. DF.SliderCounter
DF.SliderCounter = DF.SliderCounter + 1
end
if ( not parent ) then
error ( " Details! FrameWork: parent not found. " , 2 )
end
if ( not container ) then
container = parent
end
if ( name : find ( " $parent " ) ) then
local parentName = DF : GetParentName ( parent )
name = name : gsub ( " $parent " , parentName )
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
minValue = minValue or 1
maxValue = maxValue or 2
step = step or 1
defaultValue = defaultValue or minValue
width = width or 160
height = height or 20
--default members
SliderObject.lockdown = false
SliderObject.container = container
SliderObject.slider = CreateFrame ( " slider " , name , parent , " BackdropTemplate " )
SliderObject.widget = SliderObject.slider
SliderObject.useDecimals = isDecemal or false
if ( SliderObject.useDecimals ) then
SliderObject.slider : SetValueStep ( 0.01 )
else
SliderObject.slider : SetValueStep ( step )
SliderObject.slider : SetObeyStepOnDrag ( true )
end
if ( not APISliderFunctions ) then
APISliderFunctions = true
local idx = getmetatable ( SliderObject.slider ) . __index
for funcName , funcAddress in pairs ( idx ) do
if ( not DFSliderMetaFunctions [ funcName ] ) then
DFSliderMetaFunctions [ funcName ] = function ( object , ... )
local x = loadstring ( " return _G[' " .. object.slider : GetName ( ) .. " ']: " .. funcName .. " (...) " )
return x ( ... )
end
end
end
end
SliderObject.slider . MyObject = SliderObject
PixelUtil.SetSize ( SliderObject.slider , width , height )
SliderObject.slider : SetOrientation ( " horizontal " )
SliderObject.slider : SetMinMaxValues ( minValue , maxValue )
SliderObject.slider : SetValue ( defaultValue )
SliderObject.ivalue = defaultValue
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 + ( height * 0.2 ) , height * 1.2 )
SliderObject.thumb . originalWidth = SliderObject.thumb : GetWidth ( )
SliderObject.thumb . originalHeight = SliderObject.thumb : GetHeight ( )
SliderObject.thumb : SetAlpha ( 0.7 )
SliderObject.slider : SetThumbTexture ( SliderObject.thumb )
SliderObject.slider . thumb = SliderObject.thumb
SliderObject.slider_left = SliderObject.slider : CreateTexture ( " $parentLeft " , " artwork " )
SliderObject.slider_left : SetPoint ( " topright " , SliderObject.slider , " topleft " , 0 , 0 )
SliderObject.slider_left : SetPoint ( " bottomright " , SliderObject.slider , " bottomleft " , 0 , 0 )
SliderObject.slider_left : SetWidth ( 11 )
SliderObject.slider_right = SliderObject.slider : CreateTexture ( " $parentRight " , " artwork " )
SliderObject.slider_right : SetPoint ( " topleft " , SliderObject.slider , " topright " , 0 , 0 )
SliderObject.slider_right : SetPoint ( " bottomleft " , SliderObject.slider , " bottomright " , 0 , 0 )
SliderObject.slider_right : SetWidth ( 11 )
SliderObject.slider_middle = SliderObject.slider : CreateTexture ( " $parentMiddle " , " artwork " )
SliderObject.slider_middle : SetPoint ( " topleft " , SliderObject.slider_left , " topright " , 0 , 0 )
SliderObject.slider_middle : SetPoint ( " bottomleft " , SliderObject.slider_left , " bottomright " , 0 , 0 )
SliderObject.slider_middle : SetPoint ( " topright " , SliderObject.slider_right , " topleft " , 0 , 0 )
SliderObject.slider_middle : SetPoint ( " bottomright " , SliderObject.slider_right , " bottomleft " , 0 , 0 )
if ( not isSwitch ) then
SliderObject.have_tooltip = " Right Click to Type the Value "
end
SliderObject.amt = SliderObject.slider : CreateFontString ( nil , " overlay " , " GameFontHighlightSmall " )
local amt = defaultValue
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 = { defaultValue or 0 , 0 , 0 }
--hooks
SliderObject.HookList = {
OnEnter = { } ,
OnLeave = { } ,
OnHide = { } ,
OnShow = { } ,
OnMouseDown = { } ,
OnMouseUp = { } ,
OnValueChange = { } ,
OnValueChanged = { } ,
}
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 , DFSliderMetaFunctions )
SliderObject : SetTooltip ( " right click to type the value " )
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
if ( label_template ) then
label : SetTemplate ( label_template )
end
SliderObject.label = label
end
if ( slider_template ) then
SliderObject : SetTemplate ( slider_template )
end
return SliderObject , with_label
end
DF.AdjustmentSliderOptions = {
width = 70 ,
height = 20 ,
scale_factor = 1 ,
}
DF.AdjustmentSliderFunctions = {
SetScaleFactor = function ( self , scalar )
self.options . scale_factor = scalar or 1
end ,
GetScaleFactor = function ( self , scalar )
return self.options . scale_factor
end ,
SetCallback = function ( self , func )
self.callback = func
end ,
SetPayload = function ( self , ... )
self.payload = { ... }
end ,
RunCallback = function ( adjustmentSlider , valueX , valueY , isLiteral )
local result , errorText = pcall ( adjustmentSlider.callback , adjustmentSlider , valueX , valueY , isLiteral , adjustmentSlider : DumpPayload ( ) )
if ( not result ) then
DF : Msg ( " AdjustmentSlider callback Error: " , errorText )
return false
end
end ,
--calculate if the mouse has moved and call a callback
PressingOnUpdate = function ( adjustmentSlider , deltaTime )
if ( GetTime ( ) > adjustmentSlider.NextTick ) then
--get currentr mouse position
local mouseX , mouseY = GetCursorPosition ( )
local verticalValue
local horizontalValue
--find distance
local xDelta = adjustmentSlider.MouseX - mouseX --moving the mouse to right or up result in a negative delta
local yDelta = adjustmentSlider.MouseY - mouseY
if ( adjustmentSlider.buttonPressed ~= " center " ) then
if ( adjustmentSlider.buttonPressedTime + 0.5 < GetTime ( ) ) then
local scaleResultBy = adjustmentSlider : GetScaleFactor ( )
if ( adjustmentSlider.buttonPressed == " left " ) then
DF.AdjustmentSliderFunctions . RunCallback ( adjustmentSlider , - 1 * scaleResultBy , 0 , true )
elseif ( adjustmentSlider.buttonPressed == " right " ) then
DF.AdjustmentSliderFunctions . RunCallback ( adjustmentSlider , 1 * scaleResultBy , 0 , true )
end
end
elseif ( xDelta ~= 0 or yDelta ~= 0 ) then
if ( adjustmentSlider.buttonPressed == " center " ) then
--invert axis as left is positive and right is negative in the deltas
xDelta = xDelta * - 1
yDelta = yDelta * - 1
horizontalValue = DF : MapRangeClamped ( - 20 , 20 , - 1 , 1 , xDelta )
verticalValue = DF : MapRangeClamped ( - 20 , 20 , - 1 , 1 , yDelta )
local speed = 6 --how fast it moves
local mouseDirection = CreateVector2D ( mouseX - adjustmentSlider.initialMouseX , mouseY - adjustmentSlider.initialMouseY )
local length = DF : MapRangeClamped ( - 100 , 100 , - 1 , 1 , mouseDirection : GetLength ( ) )
mouseDirection : Normalize ( )
mouseDirection : ScaleBy ( speed * length )
adjustmentSlider.centerArrowArtwork : SetPoint ( " center " , adjustmentSlider.centerButton . widget , " center " , mouseDirection : GetXY ( ) )
end
local scaleResultBy = adjustmentSlider : GetScaleFactor ( )
DF.AdjustmentSliderFunctions . RunCallback ( adjustmentSlider , horizontalValue * scaleResultBy , verticalValue * scaleResultBy , false )
adjustmentSlider.MouseX = mouseX
adjustmentSlider.MouseY = mouseY
end
adjustmentSlider.NextTick = GetTime ( ) + 0.05
end
end ,
--button can be the left or right button
OnButtonDownkHook = function ( button )
local object = button.MyObject
--change the icon
if ( object.direction == " center " ) then
DF : DisableOnEnterScripts ( )
end
local adjustmentSlider = object : GetParent ( )
adjustmentSlider.NextTick = GetTime ( ) + 0.05
--save where the mouse is on the moment of the click
local mouseX , mouseY = GetCursorPosition ( )
adjustmentSlider.MouseX = mouseX
adjustmentSlider.MouseY = mouseY
adjustmentSlider.initialMouseX = mouseX
adjustmentSlider.initialMouseY = mouseY
adjustmentSlider.buttonPressed = object.direction
--start monitoring the mouse moviment
adjustmentSlider.buttonPressedTime = GetTime ( )
adjustmentSlider : SetScript ( " OnUpdate " , DF.AdjustmentSliderFunctions . PressingOnUpdate )
end ,
--button can be the left or right button
OnButtonUpHook = function ( button )
local object = button.MyObject
--change the icon
if ( object.direction == " center " ) then
DF : EnableOnEnterScripts ( )
end
local adjustmentSlider = object : GetParent ( )
--check if the mouse did not moved at all, if not send a callback with a value of 1
local mouseX , mouseY = GetCursorPosition ( )
if ( mouseX == adjustmentSlider.MouseX and mouseY == adjustmentSlider.MouseY and adjustmentSlider.buttonPressedTime + 0.5 > GetTime ( ) ) then
if ( object.direction == " left " ) then
DF.AdjustmentSliderFunctions . RunCallback ( adjustmentSlider , - 1 , 0 , true )
elseif ( object.direction == " right " ) then
DF.AdjustmentSliderFunctions . RunCallback ( adjustmentSlider , 1 , 0 , true )
end
end
adjustmentSlider.centerArrowArtwork : SetPoint ( " center " , adjustmentSlider.centerButton . widget , " center " , 0 , 0 )
adjustmentSlider : SetScript ( " OnUpdate " , nil )
end ,
Disable = function ( adjustmentSlider )
adjustmentSlider.leftButton : Disable ( )
adjustmentSlider.rightButton : Disable ( )
adjustmentSlider.centerButton : Disable ( )
end ,
Enable = function ( adjustmentSlider )
adjustmentSlider.leftButton : Enable ( )
adjustmentSlider.rightButton : Enable ( )
adjustmentSlider.centerButton : Enable ( )
end ,
}
local createAdjustmentSliderFrames = function ( parent , options , name )
--frame it self
local adjustmentSlider = CreateFrame ( " frame " , name , parent , " BackdropTemplate " )
DF : Mixin ( adjustmentSlider , DF.OptionsFunctions )
DF : Mixin ( adjustmentSlider , DF.AdjustmentSliderFunctions )
DF : Mixin ( adjustmentSlider , DF.PayloadMixin )
DF : Mixin ( adjustmentSlider , DF.SetPointMixin )
--DF:Mixin(adjustmentSlider, DF.FrameMixin)
adjustmentSlider : BuildOptionsTable ( DF.AdjustmentSliderOptions , options )
adjustmentSlider : SetSize ( adjustmentSlider.options . width , adjustmentSlider.options . height )
local leftButton = DF : CreateButton ( adjustmentSlider , function ( ) end , 20 , 20 , " " , " left " , - 1 , nil , nil , name .. " LeftButton " )
local rightButton = DF : CreateButton ( adjustmentSlider , function ( ) end , 20 , 20 , " " , " right " , 1 , nil , nil , name .. " RightButton " )
leftButton : SetHook ( " OnMouseDown " , DF.AdjustmentSliderFunctions . OnButtonDownkHook )
rightButton : SetHook ( " OnMouseDown " , DF.AdjustmentSliderFunctions . OnButtonDownkHook )
leftButton : SetHook ( " OnMouseUp " , DF.AdjustmentSliderFunctions . OnButtonUpHook )
rightButton : SetHook ( " OnMouseUp " , DF.AdjustmentSliderFunctions . OnButtonUpHook )
leftButton : SetPoint ( " left " , adjustmentSlider , " left " , 0 , 0 )
rightButton : SetPoint ( " right " , adjustmentSlider , " right " , 0 , 0 )
leftButton : SetIcon ( " Minimal_SliderBar_Button_Left " , 8 , 14 )
rightButton : SetIcon ( " Minimal_SliderBar_Button_Right " , 8 , 14 )
leftButton.direction = " left "
rightButton.direction = " right "
--center button
local centerButton = DF : CreateButton ( adjustmentSlider , function ( ) end , 20 , 20 , " " , " center " , 0 , nil , nil , name .. " CenterButton " )
centerButton : SetPoint ( " center " , adjustmentSlider , " center " , - 3 , 0 )
centerButton : SetIcon ( " Minimal_SliderBar_Button " , nil , nil , nil , nil , " transparent " )
centerButton.direction = " center "
centerButton : SetHook ( " OnMouseDown " , DF.AdjustmentSliderFunctions . OnButtonDownkHook )
centerButton : SetHook ( " OnMouseUp " , DF.AdjustmentSliderFunctions . OnButtonUpHook )
local centerArrowArtwork = centerButton : CreateTexture ( " $parentCenterArrowArtwork " , " artwork " )
centerArrowArtwork : SetAtlas ( " Minimal_SliderBar_Button " )
centerArrowArtwork : SetPoint ( " center " , centerButton.widget , " center " , 0 , 0 )
centerArrowArtwork : SetSize ( 16 , 16 )
centerArrowArtwork : SetAlpha ( 1 )
adjustmentSlider.leftButton = leftButton
adjustmentSlider.rightButton = rightButton
adjustmentSlider.centerButton = centerButton
adjustmentSlider.centerArrowArtwork = centerArrowArtwork
return adjustmentSlider
end
--creates a slider with left and right buttons and a center button, on click the hold, mouse moviments adjust the value and trigger a callback with a normallized x and y values of the mouse movement
--@parent: who is the parent of this frame
--@callback: run when there's a change in any of the two axis
--@options: a table containing options for the frame, see /dump DetailsFramework.AdjustmentSliderOptions
--@name: the name of the frame, if none a generic name is created
function DF : CreateAdjustmentSlider ( parent , callback , options , name , ... )
if ( not name ) then
name = " DetailsFrameworkAdjustmentSlider " .. DF.SliderCounter
DF.SliderCounter = DF.SliderCounter + 1
elseif ( not parent ) then
return error ( " DF:CreateAdjustmentSlider(): parent not found. " , 2 )
end
local ASFrame = createAdjustmentSliderFrames ( parent , options , name )
ASFrame : SetPayload ( ... )
ASFrame.callback = callback
return ASFrame
end
----------------------------------------------------------------------------------------------------------------
function DF : DisableOnEnterScripts ( )
local ignoreOnEnterZone = DF : CreateOnEnterIgnoreZone ( )
ignoreOnEnterZone : Show ( )
end
function DF : EnableOnEnterScripts ( )
local ignoreOnEnterZone = DF : CreateOnEnterIgnoreZone ( )
ignoreOnEnterZone : Hide ( )
end
function DF : CreateOnEnterIgnoreZone ( )
if ( not _G.DetailsFrameworkIgnoreHoverOverFrame ) then
local ignoreOnEnterFrame = CreateFrame ( " frame " , " DetailsFrameworkIgnoreHoverOverFrame " , UIParent )
ignoreOnEnterFrame : SetFrameStrata ( " TOOLTIP " )
ignoreOnEnterFrame : SetFrameLevel ( 9999 )
ignoreOnEnterFrame : SetAllPoints ( )
ignoreOnEnterFrame : EnableMouse ( true )
ignoreOnEnterFrame : Hide ( )
end
return _G.DetailsFrameworkIgnoreHoverOverFrame
end