public GestureArenaEntry add(int pointer, GestureArenaMember member) { _GestureArena state = this._arenas.putIfAbsent(pointer, () => { D.assert(this._debugLogDiagnostic(pointer, () => "★ Opening new gesture arena.")); return(state = new _GestureArena()); }); state.add(member); D.assert(this._debugLogDiagnostic(pointer, () => $"Adding: {member}")); return(new GestureArenaEntry(this, pointer, member)); }
void _resolveByDefault(int pointer, _GestureArena state) { if (!_arenas.ContainsKey(pointer)) { return; } D.assert(_arenas[pointer] == state); D.assert(!state.isOpen); D.assert(state.members.Count == 1); _arenas.Remove(pointer); D.assert(_debugLogDiagnostic(pointer, () => $"Default winner: {state.members.First()}")); state.members[0].acceptGesture(pointer); }
void _resolveByDefault(int pointer, _GestureArena state) { if (!this._arenas.ContainsKey(pointer)) { return; } D.assert(this._arenas[pointer] == state); D.assert(!state.isOpen); List <GestureArenaMember> members = state.members; D.assert(members.Count == 1); this._arenas.Remove(pointer); D.assert(this._debugLogDiagnostic(pointer, $"Default winner: {state.members.First()}")); state.members.First().acceptGesture(pointer); }
bool _debugLogDiagnostic(int pointer, Func <string> message, _GestureArena state = null) { D.assert(() => { if (D.debugPrintGestureArenaDiagnostics) { int?count = state?.members.Count; string s = count != 1 ? "s" : ""; Debug.LogFormat("Gesture arena {0} ❙ {1}{2}", pointer.ToString().PadRight(4), message(), count != null ? $" with {count} member{s}." : ""); } return(true); }); return(true); }
void _resolveInFavorOf(int pointer, _GestureArena state, GestureArenaMember member) { D.assert(state == this._arenas[pointer]); D.assert(state != null); D.assert(state.eagerWinner == null || state.eagerWinner == member); D.assert(!state.isOpen); this._arenas.Remove(pointer); foreach (GestureArenaMember rejectedMember in state.members) { if (rejectedMember != member) { rejectedMember.rejectGesture(pointer); } } member.acceptGesture(pointer); }
void _tryToResolveArena(int pointer, _GestureArena state) { D.assert(this._arenas[pointer] == state); D.assert(!state.isOpen); if (state.members.Count == 1) { Window.instance.scheduleMicrotask(() => this._resolveByDefault(pointer, state)); } else if (state.members.isEmpty()) { this._arenas.Remove(pointer); D.assert(this._debugLogDiagnostic(pointer, () => "Arena empty.")); } else if (state.eagerWinner != null) { D.assert(this._debugLogDiagnostic(pointer, () => $"Eager winner: {state.eagerWinner}")); this._resolveInFavorOf(pointer, state, state.eagerWinner); } }