Sha256: 3030af3d630d5142788802c6f4d66ec8e318b554ac6ff0fb5f2b39e9ecabb04f

Contents?: true

Size: 1.72 KB

Versions: 1

Compression:

Stored size: 1.72 KB

Contents

class Shoes
  module Swt
    class MouseMoveListener
      include ::Swt::Events::MouseMoveListener

      def initialize app
        @app = app
      end

      def mouse_move(mouse_event)
        @app.dsl.mouse_pos = [mouse_event.x, mouse_event.y]
        @app.dsl.mouse_motion.each{|blk| eval_move_block blk, mouse_event}
        mouse_shape_control mouse_event
        mouse_leave_control mouse_event
        mouse_hover_control mouse_event
      end

      private
      def eval_move_block(blk, event)
        blk.call event.x, event.y
      end

      def mouse_shape_control(mouse_event)
        cursor = if cursor_over_clickable_element? mouse_event
                   ::Swt::SWT::CURSOR_HAND
                 else
                   ::Swt::SWT::CURSOR_ARROW
                 end
        @app.shell.setCursor  Shoes.display.getSystemCursor(cursor)
      end

      def mouse_leave_control(mouse_event)
        @app.dsl.mouse_hover_controls.each do |element|
          if !mouse_on?(element, mouse_event) and element.hovered?
            element.mouse_left
            element.leave_proc.call element if element.leave_proc
          end
        end
      end

      def mouse_hover_control(mouse_event)
        @app.dsl.mouse_hover_controls.each do |element|
          if mouse_on?(element, mouse_event) and !element.hovered?
            element.mouse_hovered
            element.hover_proc.call element if element.hover_proc
          end
        end
      end

      def mouse_on?(element, mouse_event)
        element.in_bounds? mouse_event.x, mouse_event.y
      end

      def cursor_over_clickable_element?(mouse_event)
        @app.clickable_elements.any? do |element|
          mouse_on? element, mouse_event
        end
      end
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
shoes-4.0.0.pre1 lib/shoes/swt/mouse_move_listener.rb