From 6165e7e6caca031480fa6f7ce37c8db0f09fdc29 Mon Sep 17 00:00:00 2001 From: Zander Otavka Date: Thu, 6 Aug 2015 11:40:49 -0700 Subject: [PATCH] Improve cross-thread support for panel children. --- examples/example/ui/floatingUIExample.js | 4 ++ examples/libraries/overlayManager.js | 49 +++++++------------ interface/src/ui/overlays/FloatingUIPanel.cpp | 7 +++ interface/src/ui/overlays/FloatingUIPanel.h | 2 +- interface/src/ui/overlays/Overlays.cpp | 10 ++-- 5 files changed, 37 insertions(+), 35 deletions(-) diff --git a/examples/example/ui/floatingUIExample.js b/examples/example/ui/floatingUIExample.js index f9baf78eea..7acb081eb5 100644 --- a/examples/example/ui/floatingUIExample.js +++ b/examples/example/ui/floatingUIExample.js @@ -186,6 +186,10 @@ function onScriptEnd() { mainPanel.destroy(); } +print(JSON.stringify(mainPanel.children)); +print(JSON.stringify(bluePanel.children)); +print(bluePanel._id); + Controller.mousePressEvent.connect(onMouseDown); Controller.mouseReleaseEvent.connect(onMouseUp); Script.scriptEnding.connect(onScriptEnd); diff --git a/examples/libraries/overlayManager.js b/examples/libraries/overlayManager.js index b7c5940929..6a993807ad 100644 --- a/examples/libraries/overlayManager.js +++ b/examples/libraries/overlayManager.js @@ -60,10 +60,6 @@ } var overlay = new overlayTypes[type](); overlay._id = id; - var attachedPanel = findPanel(Overlays.getAttachedPanel(id)) - if (attachedPanel) { - attachedPanel.addChild(overlay); - } overlays[id] = overlay; return overlay; } @@ -101,10 +97,6 @@ } var panel = new FloatingUIPanel(); panel._id = id; - var attachedPanel = findPanel(Overlays.getAttachedPanel(id)) - if (attachedPanel) { - attachedPanel.addChild(panel); - } overlays[id] = overlay; return overlay; } @@ -133,6 +125,11 @@ return null; } + function findOverlayOrPanel(id, knownObjectsOnly, searchList) { + return findOverlay(id, knownObjectsOnly, searchList) || + findPanel(id, knownObjectsOnly, searchList); + } + // // Perform global scoped operations on overlays, such as finding by ray intersection. @@ -154,10 +151,10 @@ return OverlayManager.findOnRay(pickRay, knownOverlaysOnly, searchList); } }, - makeSearchList: function(overlayArray) { + makeSearchList: function(array) { var searchList = {}; - overlayArray.forEach(function(overlay){ - searchList[overlay._id] = overlay; + array.forEach(function(object) { + searchList[object._id] = object; }); return searchList; } @@ -280,7 +277,7 @@ }; that.prototype.isPanelAttachable = function() { - return true; + return false; }; return generateOverlayClass(that, ABSTRACT, [ @@ -380,17 +377,11 @@ FloatingUIPanel = (function() { var that = function(params) { this._id = Overlays.addPanel(params); - this._children = []; - this._visible = Boolean(params.visible); panels[this._id] = this; }; that.prototype.constructor = that; - that.AddChildException = function(message) { - this.message = message; - }; - [ "anchorPosition", "anchorPositionBinding", "offsetRotation", "offsetRotationBinding", "offsetPosition", "facingRotation", "visible" @@ -416,27 +407,23 @@ Object.defineProperty(that.prototype, "children", { get: function() { - return this._children.slice(); + var idArray = Overlays.getPanelProperty(this._id, "children"); + var objArray = []; + for (var i = 0; i < idArray.length; i++) { + objArray[i] = findOverlayOrPanel(idArray[i]); + } + return objArray; } }); that.prototype.addChild = function(child) { - if (child instanceof Overlay && child.isPanelAttachable() || - child instanceof FloatingUIPanel) { - Overlays.setAttachedPanel(child._id, this._id); - } else { - throw new that.AddChildException("Given child is not panel attachable."); - } - child.visible = this.visible; - this._children.push(child); + Overlays.setAttachedPanel(child._id, this._id); return child; }; that.prototype.removeChild = function(child) { - var i = this._children.indexOf(child); - if (i >= 0) { + if (child.attachedPanel === this) { Overlays.setAttachedPanel(child._id, 0); - this._children.splice(i, 1); } }; @@ -445,7 +432,7 @@ }; that.prototype.setChildrenVisible = function() { - this._children.forEach(function(child) { + this.children.forEach(function(child) { child.visible = true; if (child.setChildrenVisible !== undefined) { child.setChildrenVisible(); diff --git a/interface/src/ui/overlays/FloatingUIPanel.cpp b/interface/src/ui/overlays/FloatingUIPanel.cpp index a44f26fcc3..eae0a978e0 100644 --- a/interface/src/ui/overlays/FloatingUIPanel.cpp +++ b/interface/src/ui/overlays/FloatingUIPanel.cpp @@ -116,6 +116,13 @@ QScriptValue FloatingUIPanel::getProperty(const QString &property) { if (property == "visible") { return getVisible(); } + if (property == "children") { + QScriptValue array = _scriptEngine->newArray(_children.length()); + for (int i = 0; i < _children.length(); i++) { + array.setProperty(i, _children[i]); + } + return array; + } return QScriptValue(); } diff --git a/interface/src/ui/overlays/FloatingUIPanel.h b/interface/src/ui/overlays/FloatingUIPanel.h index 1a50848f05..2c071b4351 100644 --- a/interface/src/ui/overlays/FloatingUIPanel.h +++ b/interface/src/ui/overlays/FloatingUIPanel.h @@ -70,7 +70,7 @@ private: Pointer _attachedPanel = nullptr; QList _children; - bool _visible = false; + bool _visible = true; QScriptEngine* _scriptEngine; }; diff --git a/interface/src/ui/overlays/Overlays.cpp b/interface/src/ui/overlays/Overlays.cpp index a715001040..17aa99207d 100644 --- a/interface/src/ui/overlays/Overlays.cpp +++ b/interface/src/ui/overlays/Overlays.cpp @@ -202,7 +202,12 @@ unsigned int Overlays::cloneOverlay(unsigned int id) { Overlay::Pointer thisOverlay = getOverlay(id); if (thisOverlay) { - return addOverlay(Overlay::Pointer(thisOverlay->createClone())); + unsigned int cloneId = addOverlay(Overlay::Pointer(thisOverlay->createClone())); + auto attachable = std::dynamic_pointer_cast(thisOverlay); + if (attachable && attachable->getAttachedPanel()) { + attachable->getAttachedPanel()->addChild(cloneId); + } + return cloneId; } return 0; // Not found @@ -284,8 +289,7 @@ unsigned int Overlays::getAttachedPanel(unsigned int childId) const { } void Overlays::setAttachedPanel(unsigned int childId, unsigned int panelId) { - Overlay::Pointer overlay = getOverlay(childId); - auto attachable = std::dynamic_pointer_cast(overlay); + auto attachable = std::dynamic_pointer_cast(getOverlay(childId)); if (attachable) { if (_panels.contains(panelId)) { auto panel = getPanel(panelId);