Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- class LookLookSee < Shoes
- url '/', :index
- # TODO Use actual Shoes::Color objects for these values?
- BACKGROUND = [20,20,20]
- START_COLOR = [24,24,24]
- HOVER_COLOR = [36,36,36]
- PIXEL_SIZE = 20
- ANIMATING = { }
- PAINTED = { }
- @@painting = false
- @@paint_color = [240,240,240]
- # A pixel-painting app for Shoes
- def index
- nostroke
- background rgb(*BACKGROUND)
- release { @@painting = false }
- 500.times do
- # TODO Subclass widget with a Pixel class
- stack :width => PIXEL_SIZE, :height => PIXEL_SIZE, :margin_left => 1, :margin_bottom => 1 do
- background rgb(*START_COLOR)
- hover { |p| handle_hover(p) unless PAINTED[p] }
- leave { |p| handle_leave(p) unless PAINTED[p] }
- click { @@painting = true }
- end
- end
- button("Reset") do
- @@painting = false
- PAINTED.keys.each do |p|
- PAINTED.delete(p)
- handle_leave(p)
- end
- end
- button("Color") do
- m = ask_color("Pick a Color").inspect.match(/rgb\((\d+), (\d+), (\d+)\)/)
- @@paint_color = [m[1], m[2], m[3]].map { |p| p.to_i }
- end
- animate(60) do
- ANIMATING.each { |p, c| fade(p, c) }
- end
- end
- private
- def handle_hover(pixel)
- @@painting ? paint(pixel) : pixel.background(rgb(*HOVER_COLOR))
- end
- def handle_leave(pixel)
- ANIMATING[pixel] = HOVER_COLOR.first unless @@painting
- end
- def fade(pixel, color)
- ANIMATING.delete(pixel) and return if color <= START_COLOR.first
- ANIMATING[pixel] = color -= 2
- pixel.background rgb(color,color,color)
- end
- def paint(pixel)
- return if PAINTED[pixel]
- pixel.background rgb(*@@paint_color)
- PAINTED[pixel] = true
- end
- end
- Shoes.app :height => 436, :width => 500, :title => 'looklooksee'
Add Comment
Please, Sign In to add comment