ExperimentalGear/scripts/titlescreen/fields/service/inputknobfield.lua

81 lines
2.4 KiB
Lua

require("common.class")
local Util = require("common.util")
local ServiceField = require("titlescreen.fields.service.servicefield")
---@class InputKnobField: ServiceField
---@field knob integer
local InputKnobField = {
__tostring = function() return "InputKnobField" end,
SLIDER_SIZE = {200, 16}, --{w, h}
SLIDER_BGCOLOR = {255, 0, 0, 255},
SLIDER_FRAME_COLOR = ServiceField.FONT_COLOR,
SLIDER_FRAME_WIDTH = 1,
SLIDER_OFFSETX = 64,
SLIDER_INDICATOR_COLOR = {0, 255, 0, 255},
SLIDER_INDICATOR_WIDTH = 4
}
---Create a new InputKnobField instance
---@param o? table # initial parameters
---@return InputKnobField
function InputKnobField.new(o)
o = o or {}
o.knob = o.knob or nil
return CreateInstance(InputKnobField, o, ServiceField)
end
---@param obj? any # message object for the field
function InputKnobField:activate(obj) end
---@param obj? any # message object for the field
function InputKnobField:focus(obj) end
---@param obj? any # message object for the field
function InputKnobField:deactivate(obj) end
---@param deltaTime number # frametime in seconds
function InputKnobField:drawValue(deltaTime)
gfx.Translate(self.VALUE_OFFSETX, 0)
if not self.knob then
gfx.Text("<KNOB NOT SET>", 0, 0)
return
end
local knobAngle = game.GetKnob(self.knob)
local sliderWidth = self.SLIDER_SIZE[1]
local sliderHeight = self.SLIDER_SIZE[2]
local sliderBgColor = self.SLIDER_BGCOLOR
local sliderFrameColor = self.SLIDER_FRAME_COLOR
local sliderFrameWidth = self.SLIDER_FRAME_WIDTH
local maxValue = 1024
self.value = math.floor(Util.lerp(knobAngle,0, 0, 2 * math.pi, maxValue)) % maxValue
--draw value
gfx.Text(self.value, 0, 0)
--draw slider
gfx.Translate(self.SLIDER_OFFSETX, 0)
gfx.BeginPath()
gfx.Rect(0, 0, sliderWidth, sliderHeight)
gfx.FillColor(table.unpack(sliderBgColor))
gfx.StrokeColor(table.unpack(sliderFrameColor))
gfx.StrokeWidth(sliderFrameWidth)
gfx.Fill()
gfx.Stroke()
local sliderIndicatorX = Util.lerp(self.value, 0, 0, maxValue, sliderWidth)
local sliderIndicatorWidth = self.SLIDER_INDICATOR_WIDTH
local sliderIndicatorColor = self.SLIDER_INDICATOR_COLOR
--draw indicator
gfx.BeginPath()
gfx.Rect(sliderIndicatorX, sliderFrameWidth, sliderIndicatorWidth, sliderHeight - 2 * sliderFrameWidth)
gfx.FillColor(table.unpack(sliderIndicatorColor))
gfx.Fill()
end
return InputKnobField