From da457a34388dc9543c869f41490987f51c337c52 Mon Sep 17 00:00:00 2001 From: David Kekesi Date: Wed, 6 Nov 2024 11:51:29 +0100 Subject: [PATCH] subscribing all elements to element events --- .../Browser/Bridge/Base/BaseBridge.cpp | 35 ++++++++++++++++++- .../Browser/Bridge/Send/SendBridge.cpp | 16 --------- 2 files changed, 34 insertions(+), 17 deletions(-) diff --git a/SpeckleConnector/Connector/Interface/Browser/Bridge/Base/BaseBridge.cpp b/SpeckleConnector/Connector/Interface/Browser/Bridge/Base/BaseBridge.cpp index 6c9e660..2db15c8 100644 --- a/SpeckleConnector/Connector/Interface/Browser/Bridge/Base/BaseBridge.cpp +++ b/SpeckleConnector/Connector/Interface/Browser/Bridge/Base/BaseBridge.cpp @@ -11,8 +11,35 @@ #include "Connector/Interface/Browser/Bridge/Base/OpenUrl.h" #include "Speckle/Event/Type/ProjectEvent.h" +#include "Speckle/Environment/Project.h" +#include "Speckle/Record/Element/Element.h" +#include "Connector/Connector.h" +#include "Connector/ConnectorResource.h" +#include "Speckle/Database/Identity/RecordID.h" +#include "Speckle/Database/BIMElementDatabase.h" +#include "Connector/Record/Model/SenderModelCard.h" +#include "Connector/Record/Model/Filter/SendFilter.h" +#include "Connector/Database/ModelCardDatabase.h" + using namespace connector::interfac::browser::bridge; +namespace { +#ifdef ARCHICAD + void subscribeAllElementsToElementChangeEvents() + { + auto project = connector::connector()->getActiveProject().lock(); + if (!project) + return; + + auto elementDatabase = project->getElementDatabase(); + auto allElements = elementDatabase->findElements(); + + for (const auto& id : allElements) + ACAPI_Element_AttachObserver(id); + } +#endif +} + /*-------------------------------------------------------------------- Default constructor --------------------------------------------------------------------*/ @@ -28,6 +55,8 @@ BaseBridge::BaseBridge() : BrowserBridge{"baseBinding"} { addMethod(); addMethod(); addMethod(); + + subscribeAllElementsToElementChangeEvents(); } //BaseBridge::BaseBridge /*-------------------------------------------------------------------- @@ -40,7 +69,11 @@ BaseBridge::BaseBridge() : BrowserBridge{"baseBinding"} { bool BaseBridge::handle(const speckle::event::ProjectEvent& event) { using enum speckle::event::ProjectEvent::Type; switch (event.getType()) { - case open: case close: + case open: { + sendEvent("documentChanged"); + subscribeAllElementsToElementChangeEvents(); + } break; + case close: sendEvent("documentChanged"); break; default: diff --git a/SpeckleConnector/Connector/Interface/Browser/Bridge/Send/SendBridge.cpp b/SpeckleConnector/Connector/Interface/Browser/Bridge/Send/SendBridge.cpp index 7188881..6d8ae7e 100644 --- a/SpeckleConnector/Connector/Interface/Browser/Bridge/Send/SendBridge.cpp +++ b/SpeckleConnector/Connector/Interface/Browser/Bridge/Send/SendBridge.cpp @@ -32,22 +32,6 @@ SendBridge::SendBridge() : BrowserBridge{"sendBinding"} { addMethod(); addMethod(); addMethod(); - - // POC: do we have a better place to attach observer to elements? -#ifdef ARCHICAD - auto project = connector()->getActiveProject().lock(); - if (!project) { - // TODO: is this OK? should this throw? - return; - } - - auto elementDatabase = project->getElementDatabase(); - auto elements = elementDatabase->getElements(); - ElementIDList elementIds; - for (const auto& id : elementIds) { - ACAPI_Element_AttachObserver(id); - } -#endif } //SendBridge::SendBridge