class Savio::ColorSlider

Attributes

animating[R]
baseColor[R]
knobColor[R]
optionsShown[R]
sectors[R]
textColor[R]

Public Class Methods

colorSliders() click to toggle source
# File lib/savio/ColorSlider.rb, line 8
def self.colorSliders
  @@colorSliders
end
new(args = {}) click to toggle source
Calls superclass method Savio::IORenderable::new
# File lib/savio/ColorSlider.rb, line 12
def initialize(args = {})
  args[:size] = args[:size] || 80
  super(args)
  @@colorSliders.push(self)

  @color = args[:color] || HsvColor.new(rand(0..360), rand(0.0..1.0),rand(0.0..1.0))
  @hue = @color[0]

  @baseColor = args[:baseColor] || Savio::Colors::White
  @knobColor = args[:baseColor] || Savio::Colors::Gray
  @textColor = args[:textColor] || Savio::Colors::Black
  @sectors = args[:sectors] || 64

  @optionsShown = false
  @steps = 0
  @animating = false

  @radiusStep = 0
  @yStep = 0

  build()
end

Public Instance Methods

add() click to toggle source
Calls superclass method Savio::IORenderable#add
# File lib/savio/ColorSlider.rb, line 56
def add()
  super()
  @innerCircle.add
  @outerCircle.add
  @knob.add
  @saturationSlider.add
  @valueSlider.add
end
animate() click to toggle source
# File lib/savio/ColorSlider.rb, line 65
def animate()
  animatorThread = Thread.new do
    12.times do
      sleep(1 / 60)
      @steps += 1
      @innerCircle.radius += @radiusStep
      @innerCircle.y += @yStep
      if @steps >= 12
        @steps = 0
        @radiusStep = 0
        @yStep = 0
        @animating = false
      end
    end
  end
end
baseColor=(c) click to toggle source
# File lib/savio/ColorSlider.rb, line 35
def baseColor=(c)
  @baseColor = c
  rebuild()
end
build() click to toggle source
# File lib/savio/ColorSlider.rb, line 156
def build()
  @shown = true

  @innerCircle = Circle.new(
    x: @x, y: @y,
    radius: @size * 0.95,
    color: 'black',
    z: @z + 4,
    sectors: @sectors
  )

  @outerCircle = Circle.new(
    x: @x, y: @y,
    radius: @size,
    color: @baseColor,
    z: @z,
    sectors: @sectors
  )

  @knob = Circle.new(
    x: @x + @size, y: @y,
    radius: @size * 0.15,
    color: @knobColor,
    z: @z + 5,
    sectors: @sectors
  )

  placement = chord(1.0)
  @saturationSlider = Slider.new(
    displayName: "Saturation",
    labelColor: @textColor,
    x:@x - @size + placement.adjust + placement.margin,
    y:@y - @size + placement.height,
    z:@z + 1,
    min:0.0,
    max:1.0,
    length:(placement.chord - placement.margin * 2),
    size: @size * 0.06,
    showValue: false
  )

  placement = chord(1.3)
  @valueSlider = Slider.new(
    displayName: "Value",
    labelColor: @textColor,
    x:@x - @size + placement.adjust + placement.margin,
    y:@y - @size + placement.height,
    z: @z + 1,
    min:0.0,
    max:1.0,
    length:(placement.chord - placement.margin * 2),
    size: @size * 0.06,
    showValue: false
  )
  @valueSlider.showValue=false
  @saturationSlider.showValue=false

  @valueSlider.onChange do
    setValue(@hue)
  end

  @saturationSlider.onChange do
    setValue(@hue)
  end

  setValue(@hue)
end
calculateStep(desire, start, steps) click to toggle source
# File lib/savio/ColorSlider.rb, line 82
def calculateStep(desire, start, steps)
  delta = desire.to_f - start.to_f
  step = delta/steps
  return step
end
chord(placement) click to toggle source
# File lib/savio/ColorSlider.rb, line 146
def chord(placement)
  margin = 20
  height = @size * placement
  angle = 2 * Math.acos( 1.0 - height / @size.to_f)
  angle = angle * 180/Math::PI
  chord = 2 * Math.sqrt(2 * @size * height - height**2)
  adjust = (@size * 2 - chord) / 2
  return Struct.new(:margin, :height, :angle, :chord, :adjust).new(margin,height,angle,chord,adjust)
end
hex() click to toggle source
# File lib/savio/ColorSlider.rb, line 141
def hex()
  rgb = RgbColor.newFromHSV(@color)
  return ("#%02x%02x%02x" % [rgb[0]*255,rgb[1]*255,rgb[2]*255])
end
hideOptions() click to toggle source
# File lib/savio/ColorSlider.rb, line 104
def hideOptions()
  if @optionsShown == true
    @optionsShown = false

    @steps = 0
    @radiusStep = 0
    @yStep = 0
    @animating = false

    @radiusStep = calculateStep(@size * 0.95, @innerCircle.radius, 12)
    @yStep = calculateStep(@y, @innerCircle.y, 12)
    @animating = true
    animate()
  end
end
hsv() click to toggle source
# File lib/savio/ColorSlider.rb, line 137
def hsv()
  return HsvColor.new(@color[0],@color[1],@color[2])
end
knobColor=(c) click to toggle source
# File lib/savio/ColorSlider.rb, line 39
def knobColor=(c)
  @knob.color = c
end
remove() click to toggle source
Calls superclass method Savio::IORenderable#remove
# File lib/savio/ColorSlider.rb, line 47
def remove()
  super()
  @innerCircle.remove
  @outerCircle.remove
  @knob.remove
  @saturationSlider.remove
  @valueSlider.remove
end
rgb() click to toggle source
# File lib/savio/ColorSlider.rb, line 133
def rgb()
  return RgbColor.newFromHSV(@color)
end
setValue(angle) click to toggle source
# File lib/savio/ColorSlider.rb, line 120
def setValue(angle)
  @knob.x = (@size).to_f * Math.cos((angle.to_f % 360.0) * Math::PI/180.0) + @x.to_f
  @knob.y = (@size).to_f * Math.sin((angle.to_f % 360.0) * Math::PI/180.0) + @y.to_f

  @color = HsvColor.new(angle % 360, @saturationSlider.value, @valueSlider.value)
  @hue = @color[0]

  rgb = RgbColor.newFromHSV(@color)
  @innerCircle.color.r = rgb[0]
  @innerCircle.color.g = rgb[1]
  @innerCircle.color.b = rgb[2]
end
showOptions() click to toggle source
# File lib/savio/ColorSlider.rb, line 88
def showOptions()
  if @optionsShown == false
    @optionsShown = true

    @steps = 0
    @radiusStep = 0
    @yStep = 0
    @animating = false

    @radiusStep = calculateStep(0.25 * @size, @innerCircle.radius, 12)
    @yStep = calculateStep(@y - @size + 0.35 * @size, @innerCircle.y, 12)
    @animating = true
    animate()
  end
end
textColor=(c) click to toggle source
# File lib/savio/ColorSlider.rb, line 42
def textColor=(c)
  @textColor = c
  rebuild()
end