Class: Fidgit::Selection

Inherits:
Object show all
Defined in:
lib/fidgit/selection.rb

Constant Summary

MIN_DRAG_DISTANCE =
2

Instance Method Summary (collapse)

Constructor Details

- (Selection) initialize



20
21
22
23
24
# File 'lib/fidgit/selection.rb', line 20

def initialize
  @items = []
  @moved = false
  @dragging = false
end

Instance Method Details

- (Object) [](index)



9
# File 'lib/fidgit/selection.rb', line 9

def [](index); @items[index]; end

- (Object) add(object)



26
27
28
29
30
31
# File 'lib/fidgit/selection.rb', line 26

def add(object)
  object.selected = true
  @items.push(object)

  self
end

- (Object) begin_drag(x, y)



49
50
51
52
53
54
55
56
# File 'lib/fidgit/selection.rb', line 49

def begin_drag(x, y)
  @initial_x, @initial_y = x, y
  @last_x, @last_y = x, y
  @dragging = true
  @moved = false

  self
end

- (Object) clear



41
42
43
44
45
46
47
# File 'lib/fidgit/selection.rb', line 41

def clear
  end_drag if dragging?
  @items.each { |o| o.selected = false; o.dragging = false }
  @items.clear

  self
end

- (Boolean) dragging?

Current being dragged?



15
# File 'lib/fidgit/selection.rb', line 15

def dragging?; @dragging; end

- (Object) each(&block)



10
# File 'lib/fidgit/selection.rb', line 10

def each(&block); @items.each(&block); end

- (Boolean) empty?



8
# File 'lib/fidgit/selection.rb', line 8

def empty?; @items.empty?; end

- (Object) end_drag



58
59
60
61
62
63
64
65
66
67
# File 'lib/fidgit/selection.rb', line 58

def end_drag
  @items.each do |object|
    object.x, object.y = object.x.round, object.y.round
    object.dragging = false
  end
  @dragging = false
  @moved = false

  self
end

- (Boolean) include?(object)



12
# File 'lib/fidgit/selection.rb', line 12

def include?(object); @items.include? object; end

- (Boolean) moved?

Actually moved during a dragging operation?



18
# File 'lib/fidgit/selection.rb', line 18

def moved?; @moved; end

- (Object) remove(object)



33
34
35
36
37
38
39
# File 'lib/fidgit/selection.rb', line 33

def remove(object)
  @items.delete(object)
  object.selected = false
  object.dragging = false

  self
end

- (Object) reset_drag

Move all dragged object back to original positions.



70
71
72
73
74
75
76
77
78
79
80
81
# File 'lib/fidgit/selection.rb', line 70

def reset_drag
  if moved?
    @items.each do |o|
      o.x += @initial_x - @last_x
      o.y += @initial_y - @last_y
    end
  end

  self.end_drag

  self
end

- (Object) size



7
# File 'lib/fidgit/selection.rb', line 7

def size; @items.size; end

- (Object) to_a



11
# File 'lib/fidgit/selection.rb', line 11

def to_a; @items.dup; end

- (Object) update_drag(x, y)



83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
# File 'lib/fidgit/selection.rb', line 83

def update_drag(x, y)
  x, y = x.round, y.round

  # If the mouse has been dragged far enough from the initial click position, then 'pick up' the objects and drag.
  unless moved?
    if distance(@initial_x, @initial_y, x, y) > MIN_DRAG_DISTANCE
      @items.each { |o| o.dragging = true }
      @moved = true
    end
  end

  if moved?
    @items.each do |o|
      o.x += x - @last_x
      o.y += y - @last_y
    end

    @last_x, @last_y = x, y
  end

  self
end