diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/WhiteboardApp.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/WhiteboardApp.scala index f259b77323537ea990eddcf92d1e193339ff9462..a0afefad684db9d1b207216b8e66220b0bce7e7c 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/WhiteboardApp.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/WhiteboardApp.scala @@ -43,23 +43,12 @@ trait WhiteboardApp { } - /* - private def initWhiteboard(wbId: String) { - if (!wbModel.hasWhiteboard(wbId)) { - wbModel.createWhiteboard(wbId) - } - } - */ - def handleGetWhiteboardShapesRequest(msg: GetWhiteboardShapesRequest) { //println("WB: Received page history [" + msg.whiteboardId + "]") val history = wbModel.getHistory(msg.whiteboardId); if (history.length > 0) { outGW.send(new GetWhiteboardShapesReply(mProps.meetingID, mProps.recorded, msg.requesterID, msg.whiteboardId, history, msg.replyTo)) } - //wbModel.history(msg.whiteboardId) foreach { wb => - // outGW.send(new GetWhiteboardShapesReply(mProps.meetingID, mProps.recorded, msg.requesterID, wb.id, wb.shapes.toArray, msg.replyTo)) - //} } def handleClearWhiteboardRequest(msg: ClearWhiteboardRequest) { @@ -72,7 +61,9 @@ trait WhiteboardApp { def handleUndoWhiteboardRequest(msg: UndoWhiteboardRequest) { // println("WB: Received undo whiteboard") - + wbModel.undoWhiteboard(msg.whiteboardId, msg.requesterID) foreach { last => + outGW.send(new UndoWhiteboardEvent(mProps.meetingID, mProps.recorded, msg.requesterID, msg.whiteboardId, last.id)) + } // wbModel.getWhiteboard(msg.whiteboardId) foreach { wb => // wbModel.undoWhiteboard(msg.whiteboardId) foreach { last => // outGW.send(new UndoWhiteboardEvent(mProps.meetingID, mProps.recorded, msg.requesterID, wb.id, last.id)) diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/WhiteboardModel.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/WhiteboardModel.scala index 6aba79cf919f399e29c4e98e4934c844438e0889..f9173548ef4b1729670a52611311faa29b8757fb 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/WhiteboardModel.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/WhiteboardModel.scala @@ -86,20 +86,38 @@ class WhiteboardModel { } */ - /* - def undoWhiteboard(wbId: String): Option[AnnotationVO] = { + def undoWhiteboard(wbId: String, userId: String): Option[AnnotationVO] = { var last: Option[AnnotationVO] = None - getWhiteboard(wbId) foreach { wb => - if (!wb.shapes.isEmpty) { - last = Some(wb.shapes.last) - val remaining = wb.shapes.dropRight(1) - val newWb = wb.copy(shapes = remaining) + val wb = getWhiteboard(wbId) + + if (_multiUser) { + val usersShapes = getShapesByUserId(wb, userId) + + //not empty and head id equals shape id + if (!usersShapes.isEmpty) { + last = Some(usersShapes.head) + + val newWb = removeHeadShape(wb, userId, usersShapes) + //println("Removing shape on page [" + wb.id + "]. After numShapes=[" + getShapesByUserId(wb, userId).length + "].") + saveWhiteboard(newWb) + } + } else { + if (wb.shapesMap.nonEmpty) { + val lastElement = wb.shapesMap.maxBy(_._2.head.position) + val lastList = lastElement._2 + last = Some(lastList.head) + val newWb = removeHeadShape(wb, lastElement._1, lastList) + //println("Removing shape on page [" + wb.id + "]. After numShapes=[" + getShapesByUserId(wb, userId).length + "].") saveWhiteboard(newWb) } } last } - */ + + private def removeHeadShape(wb: Whiteboard, key: String, list: List[AnnotationVO]): Whiteboard = { + val newShapesMap = if (list.tail == Nil) wb.shapesMap - key else wb.shapesMap + (key -> list.tail) + wb.copy(shapesMap = newShapesMap) + } def modifyWhiteboardAccess(multiUser: Boolean) { _multiUser = multiUser diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/WhiteboardCanvasDisplayModel.as b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/WhiteboardCanvasDisplayModel.as index 243c81305b97cff66baf856e4318d3cae7f6c72b..c9dcbb2f86cfbeb26ffc0dfb6801d2cc01dd8eed 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/WhiteboardCanvasDisplayModel.as +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/WhiteboardCanvasDisplayModel.as @@ -299,10 +299,13 @@ package org.bigbluebutton.modules.whiteboard wbCanvas.textToolbar.visible = false; } - public function undoAnnotation(id:String):void { - /** We'll just remove the last annotation for now **/ + public function undoAnnotation(annotation:Annotation):void { if (this._annotationsList.length > 0) { - removeLastGraphic(); + if (annotation.type == DrawObject.TEXT) { + removeText(annotation.id); + } else { + removeGraphic(annotation.id); + } } } diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/managers/WhiteboardManager.as b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/managers/WhiteboardManager.as index 66554b127f531762221b8bfc075eb1a762a38aed..e5881a8232f2018a71ccb26fc2b9393a6fc374e7 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/managers/WhiteboardManager.as +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/managers/WhiteboardManager.as @@ -122,7 +122,7 @@ package org.bigbluebutton.modules.whiteboard.managers } public function undoAnnotation(event:WhiteboardUpdate):void { - displayModel.undoAnnotation(event.annotationID); + displayModel.undoAnnotation(event.annotation); } public function toggleGrid(event:ToggleGridEvent = null):void { diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/models/WhiteboardModel.as b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/models/WhiteboardModel.as index 1e7e0cd0a683e099b5d673390a9f7a06f8338d67..01e43038e54c95c29f957ce3516c50aa0df0c702 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/models/WhiteboardModel.as +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/models/WhiteboardModel.as @@ -105,8 +105,17 @@ package org.bigbluebutton.modules.whiteboard.models _dispatcher.dispatchEvent(new WhiteboardShapesEvent(wb.id)); } - public function removeAnnotation(id:String):void { - + public function removeAnnotation(wbId:String, shapeId:String):void { + LOGGER.debug("Removing annotation"); + var wb:Whiteboard = getWhiteboard(wbId); + if (wb != null) { + var removedAnnotation:Annotation = wb.undo(shapeId); + if (removedAnnotation != null) { + var e:WhiteboardUpdate = new WhiteboardUpdate(WhiteboardUpdate.UNDO_ANNOTATION); + e.annotation = removedAnnotation; + _dispatcher.dispatchEvent(e); + } + } } public function getAnnotation(id:String):Annotation { @@ -128,16 +137,6 @@ package org.bigbluebutton.modules.whiteboard.models // Just return an empty array. return new Array(); } - - public function undo(wbId:String):void { - LOGGER.debug("Undoing whiteboard"); - var wb:Whiteboard = getWhiteboard(wbId); - if (wb != null) { - wb.undo(); - _dispatcher.dispatchEvent(new WhiteboardUpdate(WhiteboardUpdate.UNDO_ANNOTATION)); - } - - } public function clear(wbId:String = null):void { LOGGER.debug("Clearing whiteboard"); diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/services/MessageReceiver.as b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/services/MessageReceiver.as index 681c0933e84a880b3191ee3b8233247d7808b80b..a1e149b5f2ec50638857a696fbdf4678cbd4e2ba 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/services/MessageReceiver.as +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/services/MessageReceiver.as @@ -74,8 +74,8 @@ package org.bigbluebutton.modules.whiteboard.services private function handleUndoCommand(message:Object):void { var map:Object = JSON.parse(message.msg); - if (map.hasOwnProperty("whiteboardId")) { - whiteboardModel.undo(map.whiteboardId); + if (map.hasOwnProperty("whiteboardId") && map.hasOwnProperty("shapeId")) { + whiteboardModel.removeAnnotation(map.whiteboardId, map.shapeId); } }