lib/fidgit/elements/slider.rb in fidgit-0.2.4 vs lib/fidgit/elements/slider.rb in fidgit-0.2.5

- old
+ new

@@ -1,125 +1,125 @@ -# encoding: utf-8 - -module Fidgit - class Slider < Composite - # @private - class Handle < Element - event :begin_drag - event :end_drag - event :update_drag - - def drag?(button); button == :left; end - - # @param (see Element#initialize) - # - # @option (see Element#initialize) - def initialize(options = {}, &block) - options = { - background_color: default(:background_color), - border_color: default(:border_color), - }.merge! options - - super options - - subscribe :begin_drag do |sender, x, y| - # Store position of the handle when it starts to drag. - @drag_start_pos = [x - self.x, y - self.y] - end - - subscribe :update_drag do |sender, x, y| - if parent.enabled? - parent.handle_dragged_to x - @drag_start_pos[0], y - @drag_start_pos[1] - else - publish :end_drag - end - end - - subscribe :end_drag do - @drag_start_pos = nil - end - end - - def tip; parent.tip; end - end - - event :changed - - attr_reader :value, :range, :handle - - # @param (see Composite#initialize) - # - # @option (see Composite#initialize) - # @option options [Range] :range (0.0..1.0) - # @option options [Range] :value (minimum of :range) - def initialize(options = {}, &block) - options = { - range: 0.0..1.0, - height: 25, - background_color: default(:background_color), - border_color: default(:border_color), - groove_color: default(:groove_color), - handle_color: default(:handle_color), - groove_thickness: 5, - }.merge! options - - @range = options[:range].dup - @groove_color = options[:groove_color].dup - @groove_thickness = options[:groove_thickness] - @continuous = @range.min.is_a?(Float) || @range.max.is_a?(Float) - - super(options) - - @handle = Handle.new(parent: self, width: (height / 2 - padding_left), height: height - padding_top + padding_bottom, - background_color: options[:handle_color]) - - self.value = options.has_key?(:value) ? options[:value] : @range.min - end - - def value=(value) - @value = @continuous ? value.to_f : value.round - @value = [[@value, @range.min].max, @range.max].min - @handle.x = x + padding_left + ((width - @handle.width) * (@value - @range.min) / (@range.max - @range.min).to_f) - publish :changed, @value - - @value - end - - def tip - tip = super - tip.empty? ? @value.to_s : "#{tip}: #{@value}" - end - - def left_mouse_button(sender, x, y) - # In this case, x should be the centre of the handle after it has moved. - self.value = ((x - (@handle.width / 2) - self.x) / (width - @handle.width)) * (@range.max - @range.min) + @range.min - @mouse_down = true - - nil - end - - def handle_dragged_to(x, y) - # In this case, x is the left-hand side fo the handle. - self.value = ((x - self.x) / (width - @handle.width)) * (@range.max - @range.min) + @range.min - end - - protected - # Prevent standard packing layout change. - def layout - nil - end - - protected - def draw_background - super - # Draw a groove for the handle to move along. - draw_rect x + (@handle.width / 2), y + (height - @groove_thickness) / 2, width - @handle.width, @groove_thickness, z, @groove_color - nil - end - - protected - # Use block as an event handler. - def post_init_block(&block) - subscribe :changed, &block - end - end +# encoding: utf-8 + +module Fidgit + class Slider < Composite + # @private + class Handle < Element + event :begin_drag + event :end_drag + event :update_drag + + def drag?(button); button == :left; end + + # @param (see Element#initialize) + # + # @option (see Element#initialize) + def initialize(options = {}, &block) + options = { + background_color: default(:background_color), + border_color: default(:border_color), + }.merge! options + + super options + + subscribe :begin_drag do |sender, x, y| + # Store position of the handle when it starts to drag. + @drag_start_pos = [x - self.x, y - self.y] + end + + subscribe :update_drag do |sender, x, y| + if parent.enabled? + parent.handle_dragged_to x - @drag_start_pos[0], y - @drag_start_pos[1] + else + publish :end_drag + end + end + + subscribe :end_drag do + @drag_start_pos = nil + end + end + + def tip; parent.tip; end + end + + event :changed + + attr_reader :value, :range, :handle + + # @param (see Composite#initialize) + # + # @option (see Composite#initialize) + # @option options [Range] :range (0.0..1.0) + # @option options [Range] :value (minimum of :range) + def initialize(options = {}, &block) + options = { + range: 0.0..1.0, + height: 25, + background_color: default(:background_color), + border_color: default(:border_color), + groove_color: default(:groove_color), + handle_color: default(:handle_color), + groove_thickness: 5, + }.merge! options + + @range = options[:range].dup + @groove_color = options[:groove_color].dup + @groove_thickness = options[:groove_thickness] + @continuous = @range.min.is_a?(Float) || @range.max.is_a?(Float) + + super(options) + + @handle = Handle.new(parent: self, width: (height / 2 - padding_left), height: height - padding_top + padding_bottom, + background_color: options[:handle_color]) + + self.value = options.has_key?(:value) ? options[:value] : @range.min + end + + def value=(value) + @value = @continuous ? value.to_f : value.round + @value = [[@value, @range.min].max, @range.max].min + @handle.x = x + padding_left + ((width - @handle.width) * (@value - @range.min) / (@range.max - @range.min).to_f) + publish :changed, @value + + @value + end + + def tip + tip = super + tip.empty? ? @value.to_s : "#{tip}: #{@value}" + end + + def left_mouse_button(sender, x, y) + # In this case, x should be the centre of the handle after it has moved. + self.value = ((x - (@handle.width / 2) - self.x) / (width - @handle.width)) * (@range.max - @range.min) + @range.min + @mouse_down = true + + nil + end + + def handle_dragged_to(x, y) + # In this case, x is the left-hand side fo the handle. + self.value = ((x - self.x) / (width - @handle.width)) * (@range.max - @range.min) + @range.min + end + + protected + # Prevent standard packing layout change. + def layout + nil + end + + protected + def draw_background + super + # Draw a groove for the handle to move along. + draw_rect x + (@handle.width / 2), y + (height - @groove_thickness) / 2, width - @handle.width, @groove_thickness, z, @groove_color + nil + end + + protected + # Use block as an event handler. + def post_init_block(&block) + subscribe :changed, &block + end + end end \ No newline at end of file