Repository: openmeetings Updated Branches: refs/heads/master d2a8e4003 -> a86a6551b
[OPENMEETINGS-1644] video windows are aligned Project: http://git-wip-us.apache.org/repos/asf/openmeetings/repo Commit: http://git-wip-us.apache.org/repos/asf/openmeetings/commit/a86a6551 Tree: http://git-wip-us.apache.org/repos/asf/openmeetings/tree/a86a6551 Diff: http://git-wip-us.apache.org/repos/asf/openmeetings/diff/a86a6551 Branch: refs/heads/master Commit: a86a6551b753212b36e84729055e5d496896faa8 Parents: d2a8e40 Author: Maxim Solodovnik <[email protected]> Authored: Sun Aug 20 14:31:35 2017 +0700 Committer: Maxim Solodovnik <[email protected]> Committed: Sun Aug 20 14:31:35 2017 +0700 ---------------------------------------------------------------------- openmeetings-flash/src/main/flex/main.mxml | 6 +- .../org/apache/openmeetings/web/room/room.js | 112 +++++++++++++++++-- .../org/apache/openmeetings/web/room/wb/wb.js | 2 +- 3 files changed, 108 insertions(+), 12 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/openmeetings/blob/a86a6551/openmeetings-flash/src/main/flex/main.mxml ---------------------------------------------------------------------- diff --git a/openmeetings-flash/src/main/flex/main.mxml b/openmeetings-flash/src/main/flex/main.mxml index afead77..092ac2e 100644 --- a/openmeetings-flash/src/main/flex/main.mxml +++ b/openmeetings-flash/src/main/flex/main.mxml @@ -155,7 +155,7 @@ if (!hasAudio()) { video.mute(); } - ExternalInterface.call("VideoManager.resetSize", params.uid); + ExternalInterface.call("VideoManager.securityMode", params.uid, false); }); } break; @@ -233,12 +233,14 @@ if (!camAvail()) { return; } + var params:Object = FlexGlobals.topLevelApplication.parameters; debug("Camera selected:: " + selectedCam); var cam:Camera = getCam(); debug("Camera selected:: " + cam, cam == null ? '' : cam.muted); if (cam != null) { if (cam.muted) { debug("Camera Muted"); + ExternalInterface.call("VideoManager.securityMode", params.uid, true); video.attachCamera(cam); cam.addEventListener(StatusEvent.STATUS, function (event:StatusEvent):void { debug("cameraStatusHandler! " + event); @@ -260,6 +262,8 @@ var _mic:Microphone = getMic(); if (_mic != null) { if (_mic.muted) { + debug("Mic Muted"); + ExternalInterface.call("VideoManager.securityMode", params.uid, true); var nc:NetConnection = new NetConnection(); nc.connect(null); var ns:NetStream = new NetStream(nc); http://git-wip-us.apache.org/repos/asf/openmeetings/blob/a86a6551/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/room.js ---------------------------------------------------------------------- diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/room.js b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/room.js index 3fdc8f9..a1c5d0f 100644 --- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/room.js +++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/room.js @@ -16,6 +16,7 @@ * specific language governing permissions and limitations * under the License. */ +const WBA_SELECTOR = '.room.wb.area .ui-tabs-panel.ui-corner-bottom.ui-widget-content:visible'; var VideoUtil = (function() { var self = {}; function _getVid(uid) { @@ -33,10 +34,90 @@ var VideoUtil = (function() { function _hasVideo(c) { return c.activities.indexOf('broadcastV') > -1; } + function _getRects(sel, excl) { + var list = []; + var elems = $(sel); + for (let i = 0; i < elems.length; ++i) { + if (excl !== $(elems[i]).attr('aria-describedby')) { + list.push(_getRect(elems[i])); + } + } + return list; + } + function _getRect(e) { + let win = $(e), winoff = win.offset(); + return {left: winoff.left + , top: winoff.top + , right: winoff.left + win.width() + , bottom: winoff.top + win.height()}; + } + function _getPos(list, w, h) { + /* TODO + if (isInterview) { + return [0, 0]; + } + */ + var wba = $(WBA_SELECTOR); + var woffset = wba.offset(); + const offsetX = 40, offsetY = 10 + , area = {left: woffset.left, top: woffset.top, right: woffset.left + wba.width(), bottom: woffset.top + wba.height()}; + var rectNew = { + _left: area.left + , _top: area.top + , right: area.left + w + , bottom: area.top + h + , get left() { + return this._left + } + , set left(l) { + this._left = l; + this.right = l + w; + } + , get top() { + return this._top + } + , set top(t) { + this._top = t; + this.bottom = t + h; + } + }; + //console.log("Area " + JSON.stringify(area)); + do { + let minY = area.bottom; + var posFound = true; + //console.log("Checking RECT " + JSON.stringify(rectNew)); + for (let i = 0; i < list.length; ++i) { + let rect = list[i]; + minY = Math.min(minY, rect.bottom); + + if (rectNew.left < rect.right && rectNew.right > rect.left && rectNew.top < rect.bottom && rectNew.bottom > rect.top) { + rectNew.left = rect.right + offsetX; + //console.log("Intersecting with " + JSON.stringify(rect) + ", new RECT " + JSON.stringify(rectNew)); + posFound = false; + } + if (rectNew.right >= area.right) { + rectNew.left = area.left; + rectNew.top = minY + offsetY; + //console.log("End of the row, new RECT " + JSON.stringify(rectNew)); + posFound = false; + } + if (rectNew.bottom >= area.bottom) { + rectNew.top = area.top; + //console.log("Bottom of the area, new RECT " + JSON.stringify(rectNew)); + posFound = true; + break; + } + } + } while (!posFound); + return {left: rectNew.left, top: rectNew.top}; + } + self.getVid = _getVid; self.isSharing = _isSharing; self.hasAudio = _hasAudio; self.hasVideo = _hasVideo; + self.getRects = _getRects; + self.getPos = _getPos; return self; })(); var Video = (function() { @@ -45,18 +126,28 @@ var Video = (function() { function _getName() { return c.user.firstName + ' ' + c.user.lastName; } - function _resetSize(_w, _h) { - var w = _w || size.width, h = _h || size.height; - v.dialog("option", "width", w).dialog("option", "height", t.height() + h + 2); - _setSize(w, h); + function _securityMode(on) { + if (on) { + //TODO buttons + v.dialog({ + position: {my: "center", at: "center", of: WBA_SELECTOR} + }); + } else { + let h = size.height + t.height() + 2; + v.dialog("option", "width", size.width) + .dialog("option", "height", h); + v.dialog("widget").css(VideoUtil.getPos(VideoUtil.getRects('.video.user-video', VideoUtil.getVid(c.uid)), c.width, h)); + _setSize(size.width, size.height); + } } function _setSize(w, h) { vc.width(w).height(h); swf.attr('width', w).attr('height', h); } - function _init(_box, _uid, _c) { + function _init(_box, _uid, _c, _pos) { c = _c; box = _box; + pos = _pos; size = {width: c.width, height: c.height}; var _id = VideoUtil.getVid(c.uid) , name = _getName() @@ -137,6 +228,7 @@ var Video = (function() { o.broadcastId = c.broadcastId; swf = initVideo(vc, _id + '-swf', o); swf.attr('width', _w).attr('height', _h); + v.dialog("widget").css(_pos); } function _update(_c) { c = _c; @@ -153,7 +245,7 @@ var Video = (function() { self.update = _update; self.init = _init; - self.resetSize = _resetSize; + self.securityMode = _securityMode; self.client = function() { return c; }; return self; }); @@ -171,7 +263,7 @@ var VideoManager = (function() { , av = VideoUtil.hasAudio(c) || VideoUtil.hasVideo(c) , v = $('#' + _id); if (av && v.length != 1 && !!c.self) { - Video().init(box, options.uid, c); + Video().init(box, options.uid, c, VideoUtil.getPos(VideoUtil.getRects('.video.user-video'), c.width, c.height + 25)); } else if (av && v.length == 1) { v.data().update(c); } else if (!av && v.length == 1) { @@ -193,13 +285,13 @@ var VideoManager = (function() { share.tooltip().off('click').click(function() { var v = $('#' + VideoUtil.getVid(c.uid)) if (v.length != 1) { - Video().init(box, options.uid, c); + Video().init(box, options.uid, c, $(WBA_SELECTOR).offset()); } else { v.dialog('open'); } }); } else if ('sharing' !== c.type) { - Video().init(box, options.uid, c); + Video().init(box, options.uid, c, VideoUtil.getPos(VideoUtil.getRects('.video.user-video'), c.width, c.height + 25)); } } function _close(uid) { @@ -227,7 +319,7 @@ var VideoManager = (function() { self.update = _update; self.play = _play; self.close = _close; - self.resetSize = function(uid) { $('#' + VideoUtil.getVid(uid)).data().resetSize(); }; + self.securityMode = function(uid, on) { $('#' + VideoUtil.getVid(uid)).data().securityMode(on); }; return self; })(); function setRoomSizes() { http://git-wip-us.apache.org/repos/asf/openmeetings/blob/a86a6551/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/wb.js ---------------------------------------------------------------------- diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/wb.js b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/wb.js index a104e0f..bb95011 100644 --- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/wb.js +++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/wb.js @@ -1195,7 +1195,7 @@ var Wb = function() { }; wb.clearAll = function() { for (var i = 1; i < canvases.length; ++i) { - var cc = $('#can-wb-tab-0-slide-' + i).closest('.canvas-container'); + let cc = $('#can-wb-tab-0-slide-' + i).closest('.canvas-container'); cc.remove(); canvases[i].dispose(); }
