| digraph { |
| label="MOTION RECOGNIZER" labelloc="t" |
| rankdir="LR" |
| |
| // The gesture arena, which invokes methods on the various states of the recognizer. |
| arena [shape="doublecircle"] |
| |
| // `InitialContender` definition. |
| arena -> examine_at_initial_contender [label="examine\nevent()"] |
| examine_at_initial_contender [shape="diamond" label="exactly\none\nfinger?"] |
| examine_at_initial_contender -> examine2_at_initial_contender [label="yes"] |
| examine_at_initial_contender -> return_mismatch_at_initial_contender [label="no"] |
| examine2_at_initial_contender [shape="diamond" label="button\npressed?"] |
| examine2_at_initial_contender -> return_finger_down_contender_at_initial_contender [label="no"] |
| examine2_at_initial_contender -> return_mismatch_at_initial_contender [label="yes"] |
| return_mismatch_at_initial_contender [shape="rectangle" label="return\nMismatch"] |
| return_finger_down_contender_at_initial_contender [shape="rectangle" label="return\nFingerDownContender"] |
| subgraph cluster_initial_contender { |
| label="InitialContender" |
| examine_at_initial_contender |
| examine2_at_initial_contender |
| return_mismatch_at_initial_contender |
| return_finger_down_contender_at_initial_contender |
| } |
| |
| // How `finger_down_contender` handles examine_event(). |
| arena -> examine_at_finger_down_contender [label="examine\nevent()"] |
| examine_at_finger_down_contender [shape="diamond" label="exactly\none\nfinger?"] |
| examine_at_finger_down_contender -> return_mismatch_at_finger_down_contender [label="no"] |
| examine_at_finger_down_contender -> examine2_at_finger_down_contender [label="yes"] |
| examine2_at_finger_down_contender [shape="diamond" label="button\npressed?"] |
| examine2_at_finger_down_contender -> return_mismatch_at_finger_down_contender [label="yes"] |
| examine2_at_finger_down_contender -> examine3_at_finger_down_contender [label="no"] |
| examine3_at_finger_down_contender [shape="diamond" label="displacement\n>\nthreshold?"] |
| examine3_at_finger_down_contender -> return_matched_contender_at_finger_down_contender [label="yes"] |
| examine3_at_finger_down_contender -> return_self_at_finger_down_contender [label="no"] |
| return_mismatch_at_finger_down_contender [shape="rectangle" label="return\nMismatch"] |
| return_matched_contender_at_finger_down_contender [shape="rectangle" label="return\nMatched\nContender"] |
| return_self_at_finger_down_contender [shape="rectangle" label="return\n`self`"] |
| subgraph cluster_finger_down_contender { |
| label="FingerDownContender\n`impl Contender`" |
| examine_at_finger_down_contender |
| examine2_at_finger_down_contender |
| examine3_at_finger_down_contender |
| return_mismatch_at_finger_down_contender |
| return_matched_contender_at_finger_down_contender |
| return_self_at_finger_down_contender |
| } |
| |
| // Definition of `MatchedContender` |
| arena -> verify_at_matched_contender [label="verify\nevent()"] |
| verify_at_matched_contender [shape="diamond" label="exactly\none\nfinger?"] |
| verify_at_matched_contender -> return_mismatch_at_matched_contender [label="no"] |
| verify_at_matched_contender -> examine2_at_matched_contender [label="yes"] |
| examine2_at_matched_contender [shape="diamond" label="button\npressed?"] |
| examine2_at_matched_contender -> return_mismatch_at_matched_contender [label="yes"] |
| examine2_at_matched_contender -> return_self_at_matched_contender [label="no"] |
| arena -> return_winner_at_matched_contender [label="process\nbuffered\nevents()"] |
| return_mismatch_at_matched_contender [shape="rectangle" label="return\nMismatch"] |
| return_self_at_matched_contender [shape="rectangle" label="return\n`self`"] |
| return_winner_at_matched_contender [shape="rectangle" label="return\n`events`, Winner, Motion"] |
| subgraph cluster_matched_contender { |
| label="MatchedContender" |
| verify_at_matched_contender |
| examine2_at_matched_contender |
| return_mismatch_at_matched_contender |
| return_self_at_matched_contender |
| return_winner_at_matched_contender |
| } |
| |
| // Definition of `Winner` |
| arena -> process_at_winner [label="process\nnew\nevent()"] |
| process_at_winner -> return_end_without_event_at_winner [label="0"] |
| process_at_winner [shape="diamond" label="num\nfingers\npresent"] |
| process_at_winner -> process2_at_winner [label="1"] |
| process_at_winner -> return_end_with_event_at_winner [label=">1"] |
| process2_at_winner [shape="diamond" label="button\npressed?"] |
| process2_at_winner -> return_end_with_event_at_winner [label="yes"] |
| process2_at_winner -> return_continue_with_event_at_winner [label="no"] |
| return_end_without_event_at_winner [shape="rectangle" label="return\nEndGesture(None)"] |
| return_end_with_event_at_winner [shape="rectangle" label="return\nEndGesture(Some)"] |
| return_continue_with_event_at_winner [shape="rectangle" label="return\nContinueGesture(\nSome, self)"] |
| subgraph cluster_winner { |
| label="Winner" |
| process_at_winner |
| process2_at_winner |
| return_end_without_event_at_winner |
| return_end_with_event_at_winner |
| return_continue_with_event_at_winner |
| } |
| } |