diff --git a/app/src/RoomClient.js b/app/src/RoomClient.js index 8dbc9d1..656f443 100644 --- a/app/src/RoomClient.js +++ b/app/src/RoomClient.js @@ -298,6 +298,16 @@ export default class RoomClient switch (key) { + case String.fromCharCode(37): + { + this._spotlights.setPrevAsSelected(); + break; + } + case String.fromCharCode(39): + { + this._spotlights.setNextAsSelected(); + break; + } case 'A': // Activate advanced mode { store.dispatch(settingsActions.toggleAdvancedMode()); diff --git a/app/src/Spotlights.js b/app/src/Spotlights.js index 30dc48a..dd119df 100644 --- a/app/src/Spotlights.js +++ b/app/src/Spotlights.js @@ -12,6 +12,7 @@ export default class Spotlights extends EventEmitter this._signalingSocket = signalingSocket; this._maxSpotlights = maxSpotlights; this._peerList = []; + this._unmutablePeerList = []; this._selectedSpotlights = []; this._currentSpotlights = []; this._started = false; @@ -45,6 +46,66 @@ export default class Spotlights extends EventEmitter } } + setNextAsSelected() + { + let peerId = null; + if (this._selectedSpotlights.length > 0) { + peerId = this._selectedSpotlights[0]; + } else if (this._unmutablePeerList.length > 0) { + peerId = this._unmutablePeerList[0]; + } + + if (peerId != null && this._currentSpotlights.length < this._unmutablePeerList.length) { + let oldIndex = this._unmutablePeerList.indexOf(peerId); + let index = oldIndex; + index++; + do { + if (index >= this._unmutablePeerList.length) { + index = 0; + } + let newSelectedPeer = this._unmutablePeerList[index]; + if (!this._currentSpotlights.includes(newSelectedPeer)) { + this.setPeerSpotlight(newSelectedPeer); + break; + } + index++; + if (index === oldIndex) { + break; + } + } while (true); + } + } + + setPrevAsSelected() + { + let peerId = null; + if (this._selectedSpotlights.length > 0) { + peerId = this._selectedSpotlights[0]; + } else if (this._unmutablePeerList.length > 0) { + peerId = this._unmutablePeerList[0]; + } + + if (peerId != null && this._currentSpotlights.length < this._unmutablePeerList.length) { + let oldIndex = this._unmutablePeerList.indexOf(peerId); + let index = oldIndex; + index--; + do { + if (index < 0) { + index = this._unmutablePeerList.length - 1; + } + let newSelectedPeer = this._unmutablePeerList[index]; + if (!this._currentSpotlights.includes(newSelectedPeer)) { + this.setPeerSpotlight(newSelectedPeer); + break; + } + index--; + if (index === oldIndex) { + break; + } + } while (true); + } + } + setPeerSpotlight(peerId) { logger.debug('setPeerSpotlight() [peerId:"%s"]', peerId); @@ -105,6 +166,7 @@ export default class Spotlights extends EventEmitter logger.debug('_handlePeer() | adding peer [peerId: "%s"]', id); this._peerList.push(id); + this._unmutablePeerList.push(id); if (this._started) this._spotlightsUpdated(); @@ -117,6 +179,7 @@ export default class Spotlights extends EventEmitter 'room "peerClosed" event [peerId:%o]', id); this._peerList = this._peerList.filter((peer) => peer !== id); + this._unmutablePeerList = this._unmutablePeerList.filter((peer) => peer !== id); this._selectedSpotlights = this._selectedSpotlights.filter((peer) => peer !== id);