Skip to content

Commit

Permalink
fix: player controls
Browse files Browse the repository at this point in the history
  • Loading branch information
brandonocasey committed May 31, 2018
1 parent 33db8a8 commit 8ace4ad
Show file tree
Hide file tree
Showing 3 changed files with 144 additions and 0 deletions.
5 changes: 5 additions & 0 deletions scripts/rollup-replace.js
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,11 @@ export default function(options) {

code = globalReplace(code, 'rotateLeft', 'scope.rotateLeft');
code = globalReplace(code, 'rotateUp', 'scope.rotateUp');
// comment out the context menu prevent default line...
code = globalReplace(code,
"scope.domElement.addEventListener\\( 'contextmenu'",
"\/\/scope.domElement.addEventListener\\( 'contextmenu'"
);
}
});
return code;
Expand Down
131 changes: 131 additions & 0 deletions src/canvas-player-controls.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,131 @@
import videojs from 'video.js';
/**
* This class reacts to interactions with the canvas and
* triggers appropriate functionality on the player. Right now
* it does two things:
*
* 1. A `mousedown`/`touchstart` followed by `touchend`/`mouseup` without any
* `touchmove` or `mousemove` toggles play/pause on the player
* 2. Only moving on/clicking the control bar or toggling play/pause should
* show the control bar. Moving around the scene in the canvas should not.
*
*
*/
class CanvasPlayerControls extends videojs.EventTarget {
constructor(player, canvas) {
super();

this.player = player;
this.canvas = canvas;

this.onMoveEnd = videojs.bind(this, this.onMoveEnd);
this.onMoveStart = videojs.bind(this, this.onMoveStart);
this.onMove = videojs.bind(this, this.onMove);
this.controlBarMove = videojs.bind(this, this.controlBarMove);

// canvas movements
this.canvas.addEventListener('mousedown', this.onMoveStart);
this.canvas.addEventListener('touchstart', this.onMoveStart);
this.canvas.addEventListener('mousemove', this.onMove);
this.canvas.addEventListener('touchmove', this.onMove);
this.canvas.addEventListener('mouseup', this.onMoveEnd);
this.canvas.addEventListener('touchend', this.onMoveEnd);

this.player.controlBar.on([
'mousedown',
'mousemove',
'mouseup',
'touchstart',
'touchmove',
'touchend'
], this.controlBarMove);

this.shouldTogglePlay = false;

this.oldUserActive_ = this.player.userActive;
this.player.userActive = (v) => {
if (typeof v === 'undefined') {
return this.oldUserActive_.call(this.player);
}

if (v !== this.userActive_) {
return;
}

return this.oldUserActive_.call(this.player, v);
};
}

userActive(v) {
this.userActive_ = v;
this.player.userActive(v);
}

togglePlay() {
if (this.player.paused()) {
this.player.play();
} else {
this.player.pause();
}
}

onMoveStart(e) {
this.userActive(false);

// if the player does not have a controlbar do no toggle play
if (!this.player.controls()) {
this.shouldTogglePlay = false;
return;
}

// if the move start was a mouse click but not left click
// do not toggle play
if (e.type === 'mousedown' && !videojs.dom.isSingleLeftClick(e)) {
this.shouldTogglePlay = false;
return;
}

this.shouldTogglePlay = true;
}

onMoveEnd(e) {
if (!this.shouldTogglePlay) {
this.userActive_ = false;
this.userActive(false);
return;
}
this.userActive(true);
this.togglePlay();
}

onMove(e) {
this.shouldTogglePlay = false;
this.userActive(false);
}

controlBarMove(e) {
this.userActive(true);
}

dispose() {
this.canvas.removeEventListener('mousedown', this.onMoveStart);
this.canvas.removeEventListener('touchstart', this.onMoveStart);
this.canvas.removeEventListener('mousemove', this.onMove);
this.canvas.removeEventListener('touchmove', this.onMove);
this.canvas.removeEventListener('mouseup', this.onMoveEnd);
this.canvas.removeEventListener('touchend', this.onMoveEnd);

this.player.controlBar.off([
'mousedown',
'mousemove',
'mouseup',
'touchstart',
'touchmove',
'touchend'
], this.controlBarMove);

this.player.userActive = this.oldUserActive_;
}
}

export default CanvasPlayerControls;
8 changes: 8 additions & 0 deletions src/plugin.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import VRControls from 'three/examples/js/controls/VRControls.js';
import VREffect from 'three/examples/js/effects/VREffect.js';
import OrbitOrientationContols from './orbit-orientation-controls.js';
import * as utils from './utils';
import CanvasPlayerControls from './canvas-player-controls';

// import controls so they get regisetered with videojs
import './cardboard-button';
Expand Down Expand Up @@ -497,7 +498,9 @@ class VR extends Plugin {
canvas: this.renderedCanvas,
orientation: videojs.browser.IS_IOS || videojs.browser.IS_ANDROID || false
});
this.canvasPlayerControls = new CanvasPlayerControls(this.player_, this.renderedCanvas);
}

this.animationFrameId_ = this.requestAnimationFrame(this.animate_);
});
} else if (window.navigator.getVRDevices) {
Expand Down Expand Up @@ -533,6 +536,11 @@ class VR extends Plugin {
if (this.controls3d) {
this.controls3d.dispose();
}

if (this.canvasPlayerControls) {
this.canvasPlayerControls.dispose();
}

if (this.effect) {
this.effect.dispose();
}
Expand Down

0 comments on commit 8ace4ad

Please sign in to comment.