19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
|
# File 'lib/fusuma/plugin/detectors/pinch_detector.rb', line 19
def detect(buffers)
gesture_buffer = buffers.find { |b| b.type == BUFFER_TYPE }
.select_from_last_begin
.select_by_events { |e| e.record.gesture == GESTURE_RECORD_TYPE }
updating_events = gesture_buffer.updating_events
return if updating_events.empty?
finger = gesture_buffer.finger
status = case gesture_buffer.events.last.record.status
when 'end'
'end'
when 'update'
if updating_events.length == 1
'begin'
else
'update'
end
else
gesture_buffer.events.last.record.status
end
prev_event, event = if status == 'end'
[
gesture_buffer.events[-3],
gesture_buffer.events[-2]
]
else
[
gesture_buffer.events[-2],
gesture_buffer.events[-1]
]
end
delta = event.record.delta
prev_delta = prev_event.record.delta
repeat_direction = Direction.new(target: delta.zoom, base: (prev_delta&.zoom || 1.0)).to_s
repeat_index = create_repeat_index(gesture: type, finger: finger,
direction: repeat_direction,
status: status)
if status == 'update'
return unless moved?(prev_event, event)
first_zoom, avg_zoom = if updating_events.size >= 10
[updating_events[-10].record.delta.zoom,
gesture_buffer.class.new(
updating_events[-10..-1]
).avg_attrs(:zoom)]
else
[updating_events.first.record.delta.zoom,
gesture_buffer.avg_attrs(:zoom)]
end
oneshot_quantity = Quantity.new(target: avg_zoom, base: first_zoom).to_f
oneshot_direction = Direction.new(target: avg_zoom, base: first_zoom).to_s
oneshot_index = create_oneshot_index(gesture: type, finger: finger,
direction: oneshot_direction)
if enough_oneshot_threshold?(index: oneshot_index, quantity: oneshot_quantity)
return [
create_event(record: Events::Records::IndexRecord.new(
index: oneshot_index, trigger: :oneshot, args: delta.to_h
)),
create_event(record: Events::Records::IndexRecord.new(
index: repeat_index, trigger: :repeat, args: delta.to_h
))
]
end
end
create_event(record: Events::Records::IndexRecord.new(
index: repeat_index, trigger: :repeat, args: delta.to_h
))
end
|