View Feature Request
Extended slider with a user input box to refine selection.
Feature #: 44
File: LibAddonMenu-2.0
Date: 04/05/14 10:47 PM
By: Kith
Status: Flagged for Future Version
Been working on a mod which is using offsets to position UI elements and as the offsets can range to as much as -800 to +800 and beyond (1600 range), the base slider doesn't allow enough refinement. The request is to add an EditBox in place of the slider value to allow user input directly as well as the slider selection.

I've already added such a code setup to my mod but as it may be useful to others as well, i'm suggesting the feature to be included in the Library itself. The code I have is below, hopefully it won't format to terribly.

Additionally, added one extra bool-var to allow the setFunc to trigger on -every- value change rather than on release (which fits my example of using the offset to move frames so you can see in realtime).

function lam:AddExtendedSlider(panelID, controlName, text, tooltip, minValue, maxValue, step, getFunc, setFunc, setOnChange, warning, warningText)
local slider = wm:CreateControlFromVirtual(controlName, optionsWindow, 'ZO_Options_Slider')
local edit = wm:CreateControlFromVirtual(controlName .. 'Edit', slider, 'ZO_DefaultEditForBackdrop')

slider:SetAnchor(TOPLEFT, lastAddedControl[panelID], BOTTOMLEFT, 0, 6)
slider.controlType = OPTIONS_SLIDER
slider.system = SETTING_TYPE_UI
slider.panel = panelID
slider.text = text
slider.tooltipText = tooltip
slider.showValue = true
slider.showValueMin = minValue
slider.showValueMax = maxValue
slider:GetNamedChild('ValueLabel'):SetHidden(true)
local range = maxValue - minValue
local slidercontrol = slider:GetNamedChild('Slider')
slidercontrol:SetValueStep(1 / range * step)
slider:SetHandler('OnShow', function()
local curValue = getFunc()
slidercontrol:SetValue((curValue - minValue) / range)
edit:SetText(curValue)
end)
slidercontrol:SetHandler('OnValueChanged', function (self, value)
value = round(value * range + minValue)
edit:SetText(value)
if (setOnChange) then setFunc(value) end -- return new value on every value change if set to do so
end)
slidercontrol:SetHandler('OnSliderReleased', function(self, value)
value = round(value * range + minValue)
if (not setOnChange) then setFunc(value) end -- return new value only when user stops using the slider
end)

edit:SetTextType(TEXT_TYPE_NUMERIC)
edit:SetHeight(21)
edit:SetWidth(40)
edit:ClearAnchors()
edit:SetAnchor(RIGHT, slider, RIGHT, 40, -1)
edit:SetHandler('OnFocusLost', function(self)
local num = tonumber(self:GetText())

if (not num or num > maxValue or num < minValue) then -- ensure a number in the valid range is set or reset to current value
self:SetText(round(slidercontrol:GetValue() * range + minValue))
else
slidercontrol:SetValue((num - minValue) / range)
if (not setOnChange) then setFunc(num) end -- would return twice if not restricted to setOnChange = false as this also triggers OnValueChanged
end
end)

local bg = wm:CreateControlFromVirtual(controlName .. 'EditBG', edit, 'ZO_EditBackdrop')
bg:SetAnchorFill(edit)

if warning then
slider.warning = GetWindowManager():CreateControlFromVirtual(controlName..'WarningIcon', slider, 'ZO_Options_WarningIcon')
slider.warning:SetAnchor(RIGHT, slidercontrol, LEFT, -5, 0)
slider.warning.tooltipText = warningText
end

ZO_OptionsWindow_InitializeControl(slider)

lastAddedControl[panelID] = slider

return slider
end

RSS 2.0 Feed for Favorite CommentsNotes Sort Options
By: Kith - 04/06/14 12:03 AM
* May have been to hasty with the "on change" part of the code addendum, still a few bugs to that part that i'm tinkering with now.
By: Seerah - 05/02/14 10:02 PM
I'll add this in the rewrite this summer.