203 lines
5.2 KiB
JavaScript
203 lines
5.2 KiB
JavaScript
|
/* global $ */
|
||
|
|
||
|
var Private = {
|
||
|
addControls: function() {
|
||
|
var self = this;
|
||
|
|
||
|
this.$audioControl = $('<div class="video-audio"></div>');
|
||
|
this.$videoControl = $('<div class="video-video"></div>');
|
||
|
|
||
|
this.$audioControl.on('click', function () {
|
||
|
Handlers.audioControlClick.call(self);
|
||
|
});
|
||
|
|
||
|
this.$videoControl.on('click', function () {
|
||
|
Handlers.videoControlClick.call(self);
|
||
|
});
|
||
|
|
||
|
this.$container.append(this.$audioControl);
|
||
|
this.$container.append(this.$videoControl);
|
||
|
},
|
||
|
cancelClick: function() {
|
||
|
this.mouseIsDown = false;
|
||
|
|
||
|
if (this.hasMoved) {
|
||
|
|
||
|
}
|
||
|
|
||
|
$(document).trigger(VideoView.events.dragEnd);
|
||
|
}
|
||
|
};
|
||
|
|
||
|
var Handlers = {
|
||
|
mousedown: function(event) {
|
||
|
this.mouseIsDown = true;
|
||
|
this.hasMoved = false;
|
||
|
this.mouseMoveStart = {
|
||
|
x: event.pageX,
|
||
|
y: event.pageY
|
||
|
};
|
||
|
this.posStart = {
|
||
|
x: parseInt(this.$container.css('left'), '10'),
|
||
|
y: parseInt(this.$container.css('top'), '10')
|
||
|
}
|
||
|
|
||
|
$(document).trigger(VideoView.events.mousedown);
|
||
|
},
|
||
|
mouseup: function(event) {
|
||
|
$(document).trigger(VideoView.events.mouseup, [this]);
|
||
|
|
||
|
var storedTime = this.lastClick;
|
||
|
var now = Date.now();
|
||
|
this.lastClick = now;
|
||
|
|
||
|
if (now - storedTime < this.config.DOUBLE_CLICK_TOLERANCE) {
|
||
|
$(document).trigger(VideoView.events.doubleClick, [this]);
|
||
|
}
|
||
|
},
|
||
|
mousemove: function(event) {
|
||
|
var
|
||
|
diffX,
|
||
|
diffY,
|
||
|
newX,
|
||
|
newY;
|
||
|
|
||
|
if (this.$parent && this.mouseIsDown) {
|
||
|
this.manuallyPositioned = true;
|
||
|
this.hasMoved = true;
|
||
|
diffX = event.pageX - this.mouseMoveStart.x;
|
||
|
diffY = this.mouseMoveStart.y - event.pageY;
|
||
|
newX = this.posStart.x + diffX;
|
||
|
newY = this.posStart.y - diffY;
|
||
|
this.$container.css({
|
||
|
top: newY,
|
||
|
left: newX
|
||
|
});
|
||
|
}
|
||
|
},
|
||
|
audioControlClick: function() {
|
||
|
if (this.audioStatus) {
|
||
|
this.audioOff();
|
||
|
} else {
|
||
|
this.audioOn();
|
||
|
}
|
||
|
$(document).trigger(VideoView.events.audioControlClick, [this]);
|
||
|
},
|
||
|
videoControlClick: function() {
|
||
|
if (this.videoStatus) {
|
||
|
this.videoOff();
|
||
|
} else {
|
||
|
this.videoOn();
|
||
|
}
|
||
|
$(document).trigger(VideoView.events.videoControlClick, [this]);
|
||
|
},
|
||
|
};
|
||
|
|
||
|
var VideoView = function(video, $parent, id, isMyself, config) {
|
||
|
var self = this;
|
||
|
|
||
|
this.$parent = $parent; // mapView
|
||
|
|
||
|
this.video = video;
|
||
|
this.id = id;
|
||
|
|
||
|
this.config = config;
|
||
|
|
||
|
this.mouseIsDown = false;
|
||
|
this.mouseDownOffset = { x: 0, y: 0 };
|
||
|
this.lastClick = null;
|
||
|
this.hasMoved = false;
|
||
|
|
||
|
this.audioStatus = true;
|
||
|
this.videoStatus = true;
|
||
|
|
||
|
this.$container = $('<div></div>');
|
||
|
this.$container.addClass('collaborator-video' + (isMyself ? ' my-video' : ''));
|
||
|
this.$container.attr('id', 'container_' + id);
|
||
|
|
||
|
|
||
|
var $vidContainer = $('<div></div>');
|
||
|
$vidContainer.addClass('video-cutoff');
|
||
|
$vidContainer.append(this.video);
|
||
|
|
||
|
this.avatar = config.avatar;
|
||
|
this.$avatar = $('<img draggable="false" class="collaborator-video-avatar" src="' + config.avatar + '" width="150" height="150" />');
|
||
|
$vidContainer.append(this.$avatar);
|
||
|
|
||
|
this.$container.append($vidContainer);
|
||
|
|
||
|
this.$container.on('mousedown', function (event) {
|
||
|
Handlers.mousedown.call(self, event);
|
||
|
});
|
||
|
|
||
|
if (isMyself) {
|
||
|
Private.addControls.call(this);
|
||
|
}
|
||
|
|
||
|
// suppress contextmenu
|
||
|
this.video.oncontextmenu = function () { return false; };
|
||
|
|
||
|
if (this.$parent) this.setParent(this.$parent);
|
||
|
};
|
||
|
|
||
|
VideoView.prototype.setParent = function($parent) {
|
||
|
var self = this;
|
||
|
this.$parent = $parent;
|
||
|
this.$parent.off('.video' + this.id);
|
||
|
this.$parent.on('mouseup.video' + this.id, function (event) {
|
||
|
Handlers.mouseup.call(self, event);
|
||
|
Private.cancelClick.call(self);
|
||
|
});
|
||
|
this.$parent.on('mousemove.video' + this.id, function (event) {
|
||
|
Handlers.mousemove.call(self, event);
|
||
|
});
|
||
|
}
|
||
|
|
||
|
VideoView.prototype.setAvatar = function (src) {
|
||
|
this.$avatar.attr('src', src);
|
||
|
this.avatar = src;
|
||
|
}
|
||
|
|
||
|
VideoView.prototype.remove = function () {
|
||
|
this.$container.off();
|
||
|
if (this.$parent) this.$parent.off('.video' + this.id);
|
||
|
this.$container.remove();
|
||
|
}
|
||
|
|
||
|
VideoView.prototype.videoOff = function () {
|
||
|
this.$videoControl.addClass('active');
|
||
|
this.$avatar.show();
|
||
|
this.videoStatus = false;
|
||
|
}
|
||
|
|
||
|
VideoView.prototype.videoOn = function () {
|
||
|
this.$videoControl.removeClass('active');
|
||
|
this.$avatar.hide();
|
||
|
this.videoStatus = true;
|
||
|
}
|
||
|
|
||
|
VideoView.prototype.audioOff = function () {
|
||
|
this.$audioControl.addClass('active');
|
||
|
this.audioStatus = false;
|
||
|
}
|
||
|
|
||
|
VideoView.prototype.audioOn = function () {
|
||
|
this.$audioControl.removeClass('active');
|
||
|
this.audioStatus = true;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @class
|
||
|
* @static
|
||
|
*/
|
||
|
VideoView.events = {
|
||
|
mousedown: "VideoView:mousedown",
|
||
|
mouseup: "VideoView:mouseup",
|
||
|
doubleClick: "VideoView:doubleClick",
|
||
|
dragEnd: "VideoView:dragEnd",
|
||
|
audioControlClick: "VideoView:audioControlClick",
|
||
|
videoControlClick: "VideoView:videoControlClick",
|
||
|
};
|
||
|
|
||
|
export default VideoView
|