WoWInterface SVN PhanxConfigWidgets

Compare Revisions

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

Rev 126 → Rev 129

PhanxConfig-Slider.lua
1,228 → 1,246
--[[--------------------------------------------------------------------
PhanxConfig-Slider
Simple slider widget generator.
Based on tekKonfig-Slider and AceGUI-3.0-Slider.
Requires LibStub.
 
This library is not intended for use by other authors. Absolutely no
support of any kind will be provided for other authors using it, and
its internals may change at any time without notice.
----------------------------------------------------------------------]]
 
local MINOR_VERSION = tonumber(strmatch("$Revision$", "%d+"))
 
local lib, oldminor = LibStub:NewLibrary("PhanxConfig-Slider", MINOR_VERSION)
if not lib then return 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 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
 
if self.valueFactor then
value = value / self.valueFactor
end
 
local handler = parent.ApplyValue or parent.OnValueChanged
if handler then
value = handler(parent, value) or value
end
 
if parent.isPercent then
parent.valueText:SetFormattedText("%.0f%%", value * 100)
else
parent:SetText(value)
end
end
}
 
local methods = {
GetText = function(self)
return self.valueText:GetText()
end,
SetText = function(self, text)
return self.valueText:SetText(text)
end,
 
GetLabel = function(self)
return self.labelText:GetText()
end,
SetLabel = function(self, text)
return self.labelText:SetText(text)
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
 
if self.slider.valueFactor then
value = value * self.slider.valueFactor
end
 
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(strmatch(text, "%d+")) / 100
else
value = tonumber(text)
end
if value then
parent:SetValue(value)
end
end
 
local function EditBoxContainer_SetFormattedText(self, text, ...)
return self.editbox:SetText(text:format(...))
end
 
local sliderBG = {
bgFile = "Interface\\Buttons\\UI-SliderBar-Background",
edgeFile = "Interface\\Buttons\\UI-SliderBar-Border",
edgeSize = 8, tile = true, tileSize = 8,
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
 
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)
 
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 low = slider:CreateFontString(nil, "ARTWORK", "GameFontNormalSmall")
low:SetPoint("TOPLEFT", slider, "BOTTOMLEFT", 0, 3)
if percent then
low:SetFormattedText("%.0f%%", lowvalue * 100)
else
low:SetText(lowvalue)
end
 
local high = slider:CreateFontString(nil, "ARTWORK", "GameFontNormalSmall")
high:SetPoint("TOPRIGHT", slider, "BOTTOMRIGHT", 0, 3)
if percent then
high:SetFormattedText("%.0f%%", highvalue * 100)
else
high:SetText(highvalue)
end
 
local value
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)
end
 
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.minValue, slider.maxValue = lowvalue * factor, highvalue * factor
slider:SetValueStep(valuestep * factor)
slider.valueStep = valuestep * factor
else
slider:SetMinMaxValues(lowvalue, highvalue)
slider.minValue, slider.maxValue = lowvalue, highvalue
slider:SetValueStep(valuestep)
slider.valueStep = valuestep
end
 
slider:EnableMouseWheel(true)
slider:SetScript("OnEnter", scripts.OnEnter)
slider:SetScript("OnLeave", scripts.OnLeave)
slider:SetScript("OnMouseWheel", scripts.OnMouseWheel)
slider:SetScript("OnValueChanged", scripts.OnValueChanged)
 
frame.slider = slider
frame.labelText = label
frame.lowText = low
frame.highText = high
frame.valueText = value
 
frame.isPercent = percent
 
frame.GetText = methods.GetText
frame.SetText = methods.SetText
frame.GetValue = methods.GetValue
frame.SetValue = methods.SetValue
 
return frame
end
 
--[[--------------------------------------------------------------------
PhanxConfig-Slider
Simple slider widget generator.
Based on tekKonfig-Slider and AceGUI-3.0-Slider.
Requires LibStub.
 
This library is not intended for use by other authors. Absolutely no
support of any kind will be provided for other authors using it, and
its internals may change at any time without notice.
----------------------------------------------------------------------]]
 
local MINOR_VERSION = tonumber(strmatch("$Revision$", "%d+"))
 
local lib, oldminor = LibStub:NewLibrary("PhanxConfig-Slider", MINOR_VERSION)
if not lib then return end
 
------------------------------------------------------------------------
 
local scripts = {}
 
function scripts:OnEnter()
local text = self:GetParent().tooltipText
if text then
GameTooltip:SetOwner(self, "ANCHOR_RIGHT")
GameTooltip:SetText(text, nil, nil, nil, nil, true)
end
end
function scripts:OnLeave()
GameTooltip:Hide()
end
 
function scripts:OnMouseWheel(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
 
function scripts:OnValueChanged()
local parent = self:GetParent()
local value = self:GetValue()
local minValue, maxValue = self:GetMinMaxValues()
 
local valueStep = self.valueStep
if valueStep and valueStep > 0 then
value = floor((value - minValue) / valueStep + 0.5) * valueStep + minValue
end
 
if self.valueFactor then
value = value / self.valueFactor
end
 
local func = parent.func or parent.ApplyValue or parent.OnValueChanged
if func then
value = func(parent, value) or value
end
 
if parent.isPercent then
parent.valueText:SetFormattedText("%.0f%%", value * 100)
else
parent:SetText(value)
end
end
 
------------------------------------------------------------------------
 
local methods = {}
 
function methods:GetValue()
return self.slider:GetValue()
end,
function methods:SetValue(value)
if self.isPercent then
self.valueText:SetFormattedText("%.0f%%", value * 100)
else
self:SetText(value)
end
 
if self.slider.valueFactor then
value = value * self.slider.valueFactor
end
 
return self.slider:SetValue(value)
end
 
function methods:GetLabel()
return self.labelText:GetText()
end
function methods:SetLabel(text)
return self.labelText:SetText(text)
end
 
function methods:GetText()
return self.valueText:GetText()
end
function methods:SetText(text)
return self.valueText:SetText(text)
end
 
function methods:GetTooltipText()
return self.tooltipText
end
function methods:SetTooltipText(text)
self.tooltipText = text
end
 
function methods:SetFunction(func)
self.func = func
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(strmatch(text, "%d+")) / 100
else
value = tonumber(text)
end
if value then
parent:SetValue(value)
end
end
 
local function EditBoxContainer_SetFormattedText(self, text, ...)
return self.editbox:SetFormattedText(text, ...)
end
 
local sliderBG = {
bgFile = "Interface\\Buttons\\UI-SliderBar-Background",
edgeFile = "Interface\\Buttons\\UI-SliderBar-Border",
edgeSize = 8, tile = true, tileSize = 8,
insets = { left = 3, right = 3, top = 6, bottom = 6 }
}
 
function lib:New(parent, name, tooltipText, 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(tooltipText) ~= "string" then tooltipText = 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)
 
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 label = slider:CreateFontString(nil, "ARTWORK", "GameFontNormal")
label:SetPoint("TOPLEFT", frame, 5, 0)
label:SetPoint("TOPRIGHT", frame, -5, 0)
label:SetJustifyH("LEFT")
 
local low = slider:CreateFontString(nil, "ARTWORK", "GameFontNormalSmall")
low:SetPoint("TOPLEFT", slider, "BOTTOMLEFT", 0, 3)
if percent then
low:SetFormattedText("%.0f%%", lowvalue * 100)
else
low:SetText(lowvalue)
end
 
local high = slider:CreateFontString(nil, "ARTWORK", "GameFontNormalSmall")
high:SetPoint("TOPRIGHT", slider, "BOTTOMRIGHT", 0, 3)
if percent then
high:SetFormattedText("%.0f%%", highvalue * 100)
else
high:SetText(highvalue)
end
 
local value
if not noEditBox and LibStub("PhanxConfig-EditBox", true) then
value = LibStub("PhanxConfig-EditBox"):New(frame, nil, tooltipText, 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)
end
 
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.minValue, slider.maxValue = lowvalue * factor, highvalue * factor
slider:SetValueStep(valuestep * factor)
slider.valueStep = valuestep * factor
else
slider:SetMinMaxValues(lowvalue, highvalue)
slider.minValue, slider.maxValue = lowvalue, highvalue
slider:SetValueStep(valuestep)
slider.valueStep = valuestep
end
 
slider:EnableMouseWheel(true)
slider:SetScript("OnEnter", scripts.OnEnter)
slider:SetScript("OnLeave", scripts.OnLeave)
slider:SetScript("OnMouseWheel", scripts.OnMouseWheel)
slider:SetScript("OnValueChanged", scripts.OnValueChanged)
 
frame.slider = slider
frame.labelText = label
frame.lowText = low
frame.highText = high
frame.valueText = value
 
frame.isPercent = percent
 
for name, func in pairs(methods) do
frame[name] = func
end
 
label:SetText(name)
frame.tooltipText = tooltipText
 
return frame
end
 
function lib.CreateSlider(...) return lib:New(...) end
\ No newline at end of file Property changes : Added: svn:eol-style + native