From 465206dd122bd4d1754f3ec3bcec84cb74ef09e5 Mon Sep 17 00:00:00 2001 From: Chad Pilkey Date: Thu, 17 Aug 2017 11:38:44 -0400 Subject: [PATCH 1/2] change annotation storage in client for quicker lookup --- .../WhiteboardCanvasDisplayModel.as | 173 +++++++----------- .../business/shapes/ShapeFactory.as | 2 +- .../modules/whiteboard/models/Whiteboard.as | 39 ++-- 3 files changed, 84 insertions(+), 130 deletions(-) diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/WhiteboardCanvasDisplayModel.as b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/WhiteboardCanvasDisplayModel.as index d4240e2829..34910b8ca4 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/WhiteboardCanvasDisplayModel.as +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/WhiteboardCanvasDisplayModel.as @@ -18,7 +18,8 @@ */ package org.bigbluebutton.modules.whiteboard { - import flash.display.DisplayObject; + import flash.display.DisplayObject; + import org.as3commons.logging.api.ILogger; import org.as3commons.logging.api.getClassLogger; import org.bigbluebutton.core.UsersUtil; @@ -42,7 +43,7 @@ package org.bigbluebutton.modules.whiteboard private var whiteboardModel:WhiteboardModel; private var wbCanvas:WhiteboardCanvas; - private var _annotationsList:Array = new Array(); + private var _annotationsMap:Object = new Object(); private var _cursors:Object = new Object(); private var shapeFactory:ShapeFactory = new ShapeFactory(); private var textUpdateListener:TextUpdateListener = new TextUpdateListener(); @@ -71,140 +72,96 @@ package org.bigbluebutton.modules.whiteboard var gobj:GraphicObject; switch (o.status) { case AnnotationStatus.DRAW_START: - createGraphic(o); + createGraphic(o, false); break; case AnnotationStatus.DRAW_UPDATE: case AnnotationStatus.DRAW_END: - for (var i:int = _annotationsList.length -1; i >= 0; i--) { - gobj = _annotationsList[i] as GraphicObject; - if (gobj != null && gobj.id == o.id) { - gobj.updateAnnotation(o); - return; - } + if (_annotationsMap.propertyIsEnumerable(o.id)) { + (_annotationsMap[o.id] as GraphicObject).updateAnnotation(o); + } else { + createGraphic(o, false); } - - createGraphic(o); break; } } - public function createGraphic(o:Annotation):void { - var gobj:GraphicObject = shapeFactory.makeGraphicObject(o, whiteboardModel); - if (gobj != null) { - gobj.draw(o, shapeFactory.parentWidth, shapeFactory.parentHeight); - wbCanvas.addGraphic(gobj as DisplayObject); - _annotationsList.push(gobj); - - if (o.type == AnnotationType.TEXT && - o.status != AnnotationStatus.DRAW_END && - o.userId == UsersUtil.getMyUserID()) { - textUpdateListener.newTextObject(gobj as TextObject); - } - } - } - - /* the following three methods are used to remove any GraphicObjects (and its subclasses) if the id of the object to remove is specified. The latter - two are convenience methods, the main one is the first of the three. - */ - private function removeGraphic(id:String):void { - var gobjData:Array = getGobjInfoWithID(id); - var removeIndex:int = gobjData[0]; - var gobjToRemove:GraphicObject = gobjData[1] as GraphicObject; - wbCanvas.removeGraphic(gobjToRemove as DisplayObject); - _annotationsList.splice(removeIndex, 1); - - if (gobjToRemove.toolType == WhiteboardConstants.TYPE_TEXT) { - textUpdateListener.removedTextObject(gobjToRemove as TextObject); - } - } - - /* returns an array of the GraphicObject that has the specified id, - and the index of that GraphicObject (if it exists, of course) - */ - private function getGobjInfoWithID(id:String):Array { - var data:Array = new Array(); - for(var i:int = 0; i < _annotationsList.length; i++) { - var currObj:GraphicObject = _annotationsList[i] as GraphicObject; - if(currObj.id == id) { - data.push(i); - data.push(currObj); - return data; + private function createGraphic(o:Annotation, fromHistory:Boolean):void { + var gobj:GraphicObject = shapeFactory.makeGraphicObject(o); + if (gobj != null) { + gobj.draw(o, shapeFactory.parentWidth, shapeFactory.parentHeight); + wbCanvas.addGraphic(gobj as DisplayObject); + _annotationsMap[gobj.id] = gobj; + + if (!fromHistory && + o.type == AnnotationType.TEXT && + o.status != AnnotationStatus.DRAW_END && + o.userId == UsersUtil.getMyUserID()) { + textUpdateListener.newTextObject(gobj as TextObject); } } - return null; } - private function removeLastGraphic():void { - var gobj:GraphicObject = _annotationsList.pop(); - if (gobj.toolType == WhiteboardConstants.TYPE_TEXT) { - textUpdateListener.removedTextObject(gobj as TextObject); + private function removeGraphic(id:String):void { + if (_annotationsMap.propertyIsEnumerable(id)) { + var gobjToRemove:GraphicObject = _annotationsMap[id] as GraphicObject; + wbCanvas.removeGraphic(gobjToRemove as DisplayObject); + delete _annotationsMap[id]; + + if (gobjToRemove.toolType == WhiteboardConstants.TYPE_TEXT) { + textUpdateListener.removedTextObject(gobjToRemove as TextObject); + } } - wbCanvas.removeGraphic(gobj as DisplayObject); } public function clearBoard(userId:String=null):void { + var gobj:GraphicObject; + if (userId) { - for (var i:Number = _annotationsList.length-1; i >= 0; i--){ - var gobj:GraphicObject = _annotationsList[i] as GraphicObject; + for each (gobj in _annotationsMap){ if (gobj.userId == userId) { - removeGraphic(_annotationsList[i].id); + removeGraphic(gobj.id); } } } else { - var numGraphics:int = this._annotationsList.length; - for (var j:Number = 0; j < numGraphics; j++){ - removeLastGraphic(); + for each (gobj in _annotationsMap){ + removeGraphic(gobj.id); } } } public function undoAnnotation(annotation:Annotation):void { - if (this._annotationsList.length > 0) { - removeGraphic(annotation.id); - } + removeGraphic(annotation.id); } public function receivedAnnotationsHistory(wbId:String):void { var annotations:Array = whiteboardModel.getAnnotations(wbId); for (var i:int = 0; i < annotations.length; i++) { - var an:Annotation = annotations[i] as Annotation; - var gobj:GraphicObject = shapeFactory.makeGraphicObject(an, whiteboardModel); - if (gobj != null) { - gobj.draw(an, shapeFactory.parentWidth, shapeFactory.parentHeight); - wbCanvas.addGraphic(gobj as DisplayObject); - _annotationsList.push(gobj); - } + createGraphic(annotations[i], true); } } - public function changeWhiteboard(wbId:String):void{ - textUpdateListener.canvasMouseDown(); - -// LogUtil.debug("**** CanvasDisplay changePage. Clearing page *****"); - clearBoard(); - - var annotations:Array = whiteboardModel.getAnnotations(wbId); -// LogUtil.debug("**** CanvasDisplay changePage [" + annotations.length + "] *****"); - for (var i:int = 0; i < annotations.length; i++) { - var an:Annotation = annotations[i] as Annotation; - // LogUtil.debug("**** Drawing graphic from changePage [" + an.type + "] *****"); - var gobj:GraphicObject = shapeFactory.makeGraphicObject(an, whiteboardModel); - if (gobj != null) { - gobj.draw(an, shapeFactory.parentWidth, shapeFactory.parentHeight); - wbCanvas.addGraphic(gobj as DisplayObject); - _annotationsList.push(gobj); - } - } - } - + public function changeWhiteboard(wbId:String):void{ + textUpdateListener.canvasMouseDown(); + + //LogUtil.debug("**** CanvasDisplay changePage. Clearing page *****"); + clearBoard(); + + var annotations:Array = whiteboardModel.getAnnotations(wbId); + //LogUtil.debug("**** CanvasDisplay changePage [" + annotations.length + "] *****"); + for (var i:int = 0; i < annotations.length; i++) { + createGraphic(annotations[i], true); + } + } + public function drawCursor(userId:String, xPercent:Number, yPercent:Number):void { if (!_cursors.hasOwnProperty(userId)) { var userName:String = UsersUtil.getUserName(userId); - if (userName == null) userName = "Unknown"; - var newCursor:WhiteboardCursor = new WhiteboardCursor(userId, userName, xPercent, yPercent, shapeFactory.parentWidth, shapeFactory.parentHeight, presenterId == userId); - wbCanvas.addCursor(newCursor); - - _cursors[userId] = newCursor; + if (userName) { + var newCursor:WhiteboardCursor = new WhiteboardCursor(userId, userName, xPercent, yPercent, shapeFactory.parentWidth, shapeFactory.parentHeight, presenterId == userId); + wbCanvas.addCursor(newCursor); + + _cursors[userId] = newCursor; + } } else { (_cursors[userId] as WhiteboardCursor).updatePosition(xPercent, yPercent); } @@ -225,22 +182,18 @@ package org.bigbluebutton.modules.whiteboard } } - public function zoomCanvas(width:Number, height:Number):void{ + public function zoomCanvas(width:Number, height:Number):void { shapeFactory.setParentDim(width, height); this.width = width; this.height = height; - for (var i:int = 0; i < this._annotationsList.length; i++){ - redrawGraphic(this._annotationsList[i] as GraphicObject, i); + for each (var gobj:GraphicObject in _annotationsMap) { + gobj.redraw(shapeFactory.parentWidth, shapeFactory.parentHeight); + } + + for(var j:String in _cursors) { + (_cursors[j] as WhiteboardCursor).updateParentSize(width, height); } - - for(var j:String in _cursors) { - (_cursors[j] as WhiteboardCursor).updateParentSize(width, height); - } - } - - private function redrawGraphic(gobj:GraphicObject, objIndex:int):void { - gobj.redraw(shapeFactory.parentWidth, shapeFactory.parentHeight); } } } diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/business/shapes/ShapeFactory.as b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/business/shapes/ShapeFactory.as index fc4099eb07..9715ce768d 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/business/shapes/ShapeFactory.as +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/business/shapes/ShapeFactory.as @@ -54,7 +54,7 @@ package org.bigbluebutton.modules.whiteboard.business.shapes return _parentHeight; } - public function makeGraphicObject(a:Annotation, whiteboardModel:WhiteboardModel):GraphicObject{ + public function makeGraphicObject(a:Annotation):GraphicObject{ if (a.type == AnnotationType.PENCIL) { return new Pencil(a.id, a.type, a.status, a.userId); } else if (a.type == AnnotationType.RECTANGLE) { diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/models/Whiteboard.as b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/models/Whiteboard.as index 981d9b739c..0862fec2d2 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/models/Whiteboard.as +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/models/Whiteboard.as @@ -9,6 +9,7 @@ package org.bigbluebutton.modules.whiteboard.models private var _id:String; private var _historyLoaded:Boolean = false; private var _annotations:ArrayCollection = new ArrayCollection(); + private var _annotationsMap:Object = new Object(); public function Whiteboard(id:String) { _id = id; @@ -28,10 +29,12 @@ package org.bigbluebutton.modules.whiteboard.models public function addAnnotation(annotation:Annotation):void { _annotations.addItem(annotation); + _annotationsMap[annotation.id] = annotation; } public function addAnnotationAt(annotation:Annotation, index:int):void { _annotations.addItemAt(annotation, index); + _annotationsMap[annotation.id] = annotation; } public function updateAnnotation(annotation:Annotation):void { @@ -48,42 +51,40 @@ package org.bigbluebutton.modules.whiteboard.models } public function undo(id:String):Annotation { - for (var i:int = _annotations.length-1; i >= 0; i--) { - if ((_annotations.getItemAt(i) as Annotation).id == id) { - return (_annotations.removeItemAt(i) as Annotation); - } + if (_annotationsMap.propertyIsEnumerable(id)) { + var annotation:Annotation = _annotationsMap[id]; + delete _annotationsMap[id]; + _annotations.removeItem(annotation); + return annotation; + } else { + return null; } - return null; } public function clearAll():void { _annotations.removeAll(); + _annotationsMap = new Object(); } public function clear(userId:String):void { - for (var i:int = _annotations.length-1; i >= 0; i--) { - if ((_annotations.getItemAt(i) as Annotation).userId == userId) { - _annotations.removeItemAt(i); + for each (var annotation:Annotation in _annotationsMap) { + if (annotation.userId == userId) { + delete _annotationsMap[annotation.id] + _annotations.removeItem(annotation); } } } public function getAnnotations():Array { - var a:Array = new Array(); - for (var i:int = 0; i < _annotations.length; i++) { - a.push(_annotations.getItemAt(i) as Annotation); - } - return a; + return _annotations.toArray(); } public function getAnnotation(id:String):Annotation { - for (var i:int = _annotations.length-1; i >= 0; i--) { - if ((_annotations.getItemAt(i) as Annotation).id == id) { - return _annotations.getItemAt(i) as Annotation; - } + if (_annotationsMap.propertyIsEnumerable(id)) { + return _annotationsMap[id]; + } else { + return null; } - - return null; } } } \ No newline at end of file From bf153d6efcf82948e2d9301c57758cc3344888b8 Mon Sep 17 00:00:00 2001 From: Chad Pilkey Date: Thu, 17 Aug 2017 13:02:06 -0400 Subject: [PATCH 2/2] fix multiuser icon and button visibility --- bigbluebutton-client/branding/default/style/css/V2Theme.css | 4 ++-- .../modules/whiteboard/views/WhiteboardToolbar.mxml | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) mode change 100644 => 100755 bigbluebutton-client/branding/default/style/css/V2Theme.css diff --git a/bigbluebutton-client/branding/default/style/css/V2Theme.css b/bigbluebutton-client/branding/default/style/css/V2Theme.css old mode 100644 new mode 100755 index 226751d6c0..5aa9333b32 --- a/bigbluebutton-client/branding/default/style/css/V2Theme.css +++ b/bigbluebutton-client/branding/default/style/css/V2Theme.css @@ -1607,9 +1607,9 @@ whiteboard|WhiteboardTextToolbar { } .multiUserWhiteboardOnButtonStyle { - icon : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_Whiteboard"); + icon : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_Multi_Whiteboard"); } .multiUserWhiteboardOffButtonStyle { - icon : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_Multi_Whiteboard"); + icon : Embed(source="assets/swf/v2_skin.swf", symbol="Icon_Whiteboard"); } diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/views/WhiteboardToolbar.mxml b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/views/WhiteboardToolbar.mxml index 9b4768a1f0..4e445df0eb 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/views/WhiteboardToolbar.mxml +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/views/WhiteboardToolbar.mxml @@ -84,7 +84,7 @@ with BigBlueButton; if not, see . private var _hideToolbarTimer:Timer = new Timer(500, 1); private function onCreationComplete():void { - multiUserBtn.enabled = multiUserBtn.visible = UsersUtil.amIPresenter(); + multiUserBtn.enabled = multiUserBtn.visible = multiUserBtn.includeInLayout = UsersUtil.amIPresenter(); setToolType(WhiteboardConstants.TYPE_ZOOM, null); _hideToolbarTimer.addEventListener(TimerEvent.TIMER, onHideToolbarTimerComplete); @@ -153,12 +153,12 @@ with BigBlueButton; if not, see . } private function presenterMode(e:MadePresenterEvent):void { - multiUserBtn.enabled = multiUserBtn.visible = true; + multiUserBtn.enabled = multiUserBtn.visible = multiUserBtn.includeInLayout = true; checkVisibility(); } private function viewerMode(e:MadePresenterEvent):void { - multiUserBtn.enabled = multiUserBtn.visible = false; + multiUserBtn.enabled = multiUserBtn.visible = multiUserBtn.includeInLayout = false; checkToolReset(); checkVisibility(); }