indexing description: "[ Implements a slider delegate. Note: In this class it's described how de slider is drawed. ]" date: "$Date$" revision: "$Revision$" class MIXER_SLIDER_DELEGATE inherit EM_SLIDER_DELEGATE redefine install, optimal_width, optimal_height, draw_body end MIXER_CONSTANTS export {NONE} all end EM_SHARED_BITMAP_FACTORY export {NONE} all end feature -- Initialisation install (slider: EM_SLIDER) is -- Install style on `slider'. -- Set up all default values for background, border, font and colors. do Precursor {EM_SLIDER_DELEGATE} (slider) end feature -- Measurement optimal_width (slider: EM_SLIDER): INTEGER is -- Optimal width of `slider' do if slider.is_vertical then Result := 14 + slider.border.left + slider.border.right else Result := (slider.right_value - slider.left_value) + slider.border.left + slider.border.right + 10 end end optimal_height (slider: EM_SLIDER): INTEGER is -- Optimal height of `slider'. do if slider.is_vertical then Result := 14 + slider.border.top + slider.border.bottom else Result := (slider.right_value - slider.left_value) + slider.border.top + slider.border.bottom + 10 end end feature -- Drawing draw_body (slider: EM_SLIDER) is -- Draw body of `slider'. local left, right, top, bottom: INTEGER x: INTEGER do if slider.is_vertical then if slider_image = Void then bitmap_factory.create_bitmap_from_image (image_directory + "/slider_volume.png") slider_image := bitmap_factory.last_bitmap end left := slider.width // 2 right := left top := slider.border.top bottom := slider.height - slider.border.bottom - slider_image.height x := top + ((bottom - top) / (slider.right_value - slider.left_value) * (slider.current_value - slider.left_value)).floor slider.surface.blit_surface (slider_image, left - (slider_image.width // 2), top + x) else if slider_image = Void then bitmap_factory.create_bitmap_from_image (image_directory + "/slider_panning.png") slider_image := bitmap_factory.last_bitmap end left := slider.border.left right := slider.width - slider.border.right - slider_image.width top := slider.height // 2 - (slider_image.height // 2) bottom := top x := left + ((right - left) / (slider.right_value - slider.left_value) * (slider.current_value - slider.left_value)).floor slider.surface.blit_surface (slider_image, left + x, top) end end feature -- Basic operations position_to_value (slider: EM_SLIDER; an_x, a_y: INTEGER): INTEGER is -- Slider value at position `an_x' `a_y' local left, right, top, bottom: INTEGER do if slider.is_vertical then top := slider.border.top + (slider_image.height // 2) bottom := slider.height - slider.border.bottom - (slider_image.height // 2) Result := ((a_y - top) * (slider.right_value - slider.left_value) / (bottom - top)).floor + slider.left_value else left := slider.border.left + (slider_image.width // 2) right := slider.width - slider.border.right - (slider_image.width // 2) Result := ((an_x - left) * (slider.right_value - slider.left_value) / (right - left)).floor + slider.left_value end end feature {NONE} -- Look slider_image: EM_BITMAP -- Slider image end