WoWInterface SVN PhanxConfigWidgets

Compare Revisions

  • This comparison shows the changes necessary to convert path
    /trunk/PhanxConfig-Slider
    from Rev 120 to Rev 126
    Reverse comparison

Rev 120 → Rev 126

PhanxConfig-Slider.lua
9,95 → 9,109
its internals may change at any time without notice.
----------------------------------------------------------------------]]
 
local MINOR_VERSION = tonumber( strmatch( "$Revision$", "%d+" ) )
local MINOR_VERSION = tonumber(strmatch("$Revision$", "%d+"))
 
local lib, oldminor = LibStub:NewLibrary( "PhanxConfig-Slider", MINOR_VERSION )
local lib, oldminor = LibStub:NewLibrary("PhanxConfig-Slider", MINOR_VERSION)
if not lib then return end
 
local function OnEnter( self )
local text = self:GetParent( ).desc
if text then
GameTooltip:SetOwner( self, "ANCHOR_RIGHT" )
GameTooltip:SetText( text, nil, nil, nil, nil, true )
end
end
local scripts = {
OnEnter = function(self)
local text = self:GetParent().desc
if text then
GameTooltip:SetOwner(self, "ANCHOR_RIGHT")
GameTooltip:SetText(text, nil, nil, nil, nil, true)
end
end,
OnLeave = function(self)
GameTooltip:Hide()
end,
OnMouseWheel = function(self, delta)
local step = self:GetValueStep() * delta
local minValue, maxValue = self:GetMinMaxValues()
if step > 0 then
self:SetValue(min(self:GetValue() + step, maxValue))
else
self:SetValue(max(self:GetValue() + step, minValue))
end
end,
OnValueChanged = function(self)
local parent = self:GetParent()
local value = self:GetValue()
 
local function OnLeave( )
GameTooltip:Hide( )
end
local valueStep = self.valueStep
if valueStep and valueStep > 0 then
local minValue = self.minValue or 0
value = floor((value - minValue) / valueStep + 0.5) * valueStep + minValue
end
 
local function OnMouseWheel( self, delta )
local step = self:GetValueStep( ) * delta
local minValue, maxValue = self:GetMinMaxValues( )
if step > 0 then
self:SetValue( min( self:GetValue( ) + step, maxValue ) )
else
self:SetValue( max( self:GetValue( ) + step, minValue ) )
end
end
if self.valueFactor then
value = value / self.valueFactor
end
 
local function OnValueChanged( self )
local parent = self:GetParent( )
local value = self:GetValue( )
local handler = parent.ApplyValue or parent.OnValueChanged
if handler then
value = handler(parent, value) or value
end
 
local valueStep = self.valueStep
if valueStep and valueStep > 0 then
local minValue = self.minValue or 0
value = floor( ( value - minValue ) / valueStep + 0.5 ) * valueStep + minValue
if parent.isPercent then
parent.valueText:SetFormattedText("%.0f%%", value * 100)
else
parent:SetText(value)
end
end
}
 
if self.valueFactor then
value = value / self.valueFactor
end
local methods = {
GetText = function(self)
return self.valueText:GetText()
end,
SetText = function(self, text)
return self.valueText:SetText(text)
end,
 
local handler = parent.ApplyValue or parent.OnValueChanged
if handler then
value = handler( parent, value ) or value
end
GetLabel = function(self)
return self.labelText:GetText()
end,
SetLabel = function(self, text)
return self.labelText:SetText(text)
end,
 
if parent.isPercent then
parent.valueText:SetFormattedText( "%.0f%%", value * 100 )
else
parent:SetText( value )
end
end
GetValue = function(self)
return self.slider:GetValue()
end,
SetValue = function(self, value)
if self.isPercent then
self.valueText:SetFormattedText("%.0f%%", value * 100)
else
self:SetText(value)
end
 
local function SetText( self, text )
return self.valueText:SetText( text )
end
if self.slider.valueFactor then
value = value * self.slider.valueFactor
end
 
local function SetValue( self, value )
if self.isPercent then
self.valueText:SetFormattedText( "%.0f%%", value * 100 )
else
self:SetText( value )
end
return self.slider:SetValue(value)
end,
}
 
if self.slider.valueFactor then
value = value * self.slider.valueFactor
end
local function EditBox_OnEnterPressed(self) -- print("OnEnterPressed SLIDER")
local parent = self:GetParent():GetParent()
local text = self:GetText()
self:ClearFocus()
 
return self.slider:SetValue( value )
end
 
local function EditBox_OnEnterPressed( self ) -- print( "OnEnterPressed SLIDER" )
local parent = self:GetParent( ):GetParent( )
local text = self:GetText( )
self:ClearFocus( )
 
local value
if parent.isPercent then
value = tonumber( text:match( "%d+" ) ) / 100
value = tonumber(strmatch(text, "%d+")) / 100
else
value = tonumber( text )
value = tonumber(text)
end
if value then
SetValue( parent, value )
parent:SetValue(value)
end
end
 
local function EditBoxContainer_SetFormattedText( self, text, ... )
return self.editbox:SetText( text:format( ... ) )
local function EditBoxContainer_SetFormattedText(self, text, ...)
return self.editbox:SetText(text:format(...))
end
 
local sliderBG = {
107,93 → 121,94
insets = { left = 3, right = 3, top = 6, bottom = 6 }
}
 
function lib:New( parent, name, desc, lowvalue, highvalue, valuestep, percent, noEditBox )
assert( type( parent ) == "table" and parent.CreateFontString, "PhanxConfig-Slider: Parent is not a valid frame!" )
if type( name ) ~= "string" then name = nil end
if type( desc ) ~= "string" then desc = nil end
if type( lowvalue ) ~= "number" then lowvalue = 0 end
if type( highvalue ) ~= "number" then highvalue = 100 end
if type( valuestep ) ~= "number" then valuestep = 1 end
function lib:New(parent, name, desc, lowvalue, highvalue, valuestep, percent, noEditBox)
assert(type(parent) == "table" and parent.CreateFontString, "PhanxConfig-Slider: Parent is not a valid frame!")
if type(name) ~= "string" then name = nil end
if type(desc) ~= "string" then desc = nil end
if type(lowvalue) ~= "number" then lowvalue = 0 end
if type(highvalue) ~= "number" then highvalue = 100 end
if type(valuestep) ~= "number" then valuestep = 1 end
 
local frame = CreateFrame( "Frame", nil, parent )
frame:SetWidth( 186 )
frame:SetHeight( 42 )
local frame = CreateFrame("Frame", nil, parent)
frame:SetWidth(186)
frame:SetHeight(42)
 
frame.desc = desc
 
frame.bg = frame:CreateTexture( nil, "BACKGROUND" )
frame.bg:SetAllPoints( true )
frame.bg:SetTexture( 0, 0, 0, 0 )
frame.bg = frame:CreateTexture(nil, "BACKGROUND")
frame.bg:SetAllPoints(true)
frame.bg:SetTexture(0, 0, 0, 0)
 
local slider = CreateFrame( "Slider", nil, frame )
slider:SetPoint( "BOTTOMLEFT", 3, 10 )
slider:SetPoint( "BOTTOMRIGHT", -3, 10 )
slider:SetHeight( 17 )
slider:SetHitRectInsets( 0, 0, -10, -10 )
slider:SetOrientation( "HORIZONTAL" )
slider:SetThumbTexture( "Interface\\Buttons\\UI-SliderBar-Button-Horizontal" )
slider:SetBackdrop( sliderBG )
local slider = CreateFrame("Slider", nil, frame)
slider:SetPoint("BOTTOMLEFT", 3, 10)
slider:SetPoint("BOTTOMRIGHT", -3, 10)
slider:SetHeight(17)
slider:SetHitRectInsets(0, 0, -10, -10)
slider:SetOrientation("HORIZONTAL")
slider:SetThumbTexture("Interface\\Buttons\\UI-SliderBar-Button-Horizontal")
slider:SetBackdrop(sliderBG)
 
local label = slider:CreateFontString( nil, "ARTWORK", "GameFontNormal" )
label:SetPoint( "TOPLEFT", frame, 5, 0 )
label:SetPoint( "TOPRIGHT", frame, -5, 0 )
label:SetJustifyH( "LEFT" )
label:SetText( name )
local label = slider:CreateFontString(nil, "ARTWORK", "GameFontNormal")
label:SetPoint("TOPLEFT", frame, 5, 0)
label:SetPoint("TOPRIGHT", frame, -5, 0)
label:SetJustifyH("LEFT")
label:SetText(name)
 
local low = slider:CreateFontString( nil, "ARTWORK", "GameFontNormalSmall" )
low:SetPoint( "TOPLEFT", slider, "BOTTOMLEFT", 0, 3 )
local low = slider:CreateFontString(nil, "ARTWORK", "GameFontNormalSmall")
low:SetPoint("TOPLEFT", slider, "BOTTOMLEFT", 0, 3)
if percent then
low:SetFormattedText( "%.0f%%", lowvalue * 100 )
low:SetFormattedText("%.0f%%", lowvalue * 100)
else
low:SetText( lowvalue )
low:SetText(lowvalue)
end
 
local high = slider:CreateFontString( nil, "ARTWORK", "GameFontNormalSmall" )
high:SetPoint( "TOPRIGHT", slider, "BOTTOMRIGHT", 0, 3 )
local high = slider:CreateFontString(nil, "ARTWORK", "GameFontNormalSmall")
high:SetPoint("TOPRIGHT", slider, "BOTTOMRIGHT", 0, 3)
if percent then
high:SetFormattedText( "%.0f%%", highvalue * 100 )
high:SetFormattedText("%.0f%%", highvalue * 100)
else
high:SetText( highvalue )
high:SetText(highvalue)
end
 
local value
if not noEditBox and LibStub( "PhanxConfig-EditBox", true ) then
value = LibStub( "PhanxConfig-EditBox" ).CreateEditBox( frame, nil, desc, 5 )
value:SetPoint( "TOP", slider, "BOTTOM", 0, 13 )
value:SetWidth( 100 )
value.editbox:SetScript( "OnEnter", OnEnter )
value.editbox:SetScript( "OnLeave", OnLeave )
value.editbox:SetScript( "OnEnterPressed", EditBox_OnEnterPressed )
value.editbox:SetScript( "OnTabPressed", EditBox_OnEnterPressed )
value.editbox:SetFontObject( GameFontHighlightSmall )
value.editbox:SetJustifyH( "CENTER" )
if not noEditBox and LibStub("PhanxConfig-EditBox", true) then
value = LibStub("PhanxConfig-EditBox"):New(frame, nil, desc, 5)
value:SetPoint("TOP", slider, "BOTTOM", 0, 13)
value:SetWidth(100)
value.editbox:SetScript("OnEnter", scripts.OnEnter)
value.editbox:SetScript("OnLeave", scripts.OnLeave)
value.editbox:SetScript("OnEnterPressed", EditBox_OnEnterPressed)
value.editbox:SetScript("OnTabPressed", EditBox_OnEnterPressed)
value.editbox:SetFontObject(GameFontHighlightSmall)
value.editbox:SetJustifyH("CENTER")
value.SetFormattedText = EditBoxContainer_SetFormattedText
else
value = slider:CreateFontString( nil, "ARTWORK", "GameFontHighlightSmall" )
value:SetPoint( "TOP", slider, "BOTTOM", 0, 3 )
value = slider:CreateFontString(nil, "ARTWORK", "GameFontHighlightSmall")
value:SetPoint("TOP", slider, "BOTTOM", 0, 3)
end
 
local factor = 10 ^ max( strlen( tostring( valuestep ):match( "%.( %d+ )" ) or "" ),
strlen( tostring( minvalue ):match( "%.( %d+ )" ) or "" ),
strlen( tostring( maxvalue ):match( "%.( %d+ )" ) or "" ) )
local factor = 10 ^ max(strlen(tostring(valuestep):match("%.(%d+)") or ""),
strlen(tostring(minvalue):match("%.(%d+)") or ""),
strlen(tostring(maxvalue):match("%.(%d+)") or ""))
if factor > 1 then
slider.valueFactor = factor
slider:SetMinMaxValues( lowvalue * factor, highvalue * factor )
slider:SetValueStep( valuestep * factor )
slider:SetMinMaxValues(lowvalue * factor, highvalue * factor)
slider.minValue, slider.maxValue = lowvalue * factor, highvalue * factor
slider:SetValueStep(valuestep * factor)
slider.valueStep = valuestep * factor
else
slider:SetMinMaxValues( lowvalue, highvalue )
slider:SetValueStep( valuestep )
slider:SetMinMaxValues(lowvalue, highvalue)
slider.minValue, slider.maxValue = lowvalue, highvalue
slider:SetValueStep(valuestep)
slider.valueStep = valuestep
end
 
slider:EnableMouseWheel( true )
slider:SetScript( "OnEnter", OnEnter )
slider:SetScript( "OnLeave", OnLeave )
slider:SetScript( "OnMouseWheel", OnMouseWheel )
slider:SetScript( "OnValueChanged", OnValueChanged )
slider:EnableMouseWheel(true)
slider:SetScript("OnEnter", scripts.OnEnter)
slider:SetScript("OnLeave", scripts.OnLeave)
slider:SetScript("OnMouseWheel", scripts.OnMouseWheel)
slider:SetScript("OnValueChanged", scripts.OnValueChanged)
 
slider.valueStep = slider:GetValueStep( )
slider.minValue, slider.maxValue = slider:GetMinMaxValues( )
 
frame.slider = slider
frame.labelText = label
frame.lowText = low
202,10 → 217,12
 
frame.isPercent = percent
 
frame.SetText = SetText
frame.SetValue = SetValue
frame.GetText = methods.GetText
frame.SetText = methods.SetText
frame.GetValue = methods.GetValue
frame.SetValue = methods.SetValue
 
return frame
end
 
function lib.CreateSlider( ... ) return lib:New( ... ) end
\ No newline at end of file +function lib.CreateSlider(...) return lib:New(...) end \ No newline at end of file