diff --git a/src/openstudio_lib/ConstructionObjectVectorController.cpp b/src/openstudio_lib/ConstructionObjectVectorController.cpp index ff74590a5..463c167ea 100644 --- a/src/openstudio_lib/ConstructionObjectVectorController.cpp +++ b/src/openstudio_lib/ConstructionObjectVectorController.cpp @@ -43,51 +43,27 @@ #include #include -#include -#include namespace openstudio { // ConstructionObjectVectorController ConstructionObjectVectorController::ConstructionObjectVectorController(QWidget* parentWidget) - : ModelObjectVectorController(), m_reportScheduled(false), m_reportItemsMutex(new QMutex()), m_parentWidget(parentWidget) {} + : ModelObjectVectorController(), m_parentWidget(parentWidget) {} -ConstructionObjectVectorController::~ConstructionObjectVectorController() { - delete m_reportItemsMutex; -} - -void ConstructionObjectVectorController::reportItemsLater() { - m_reportScheduled = true; - - QTimer::singleShot(0, this, &ConstructionObjectVectorController::reportItems); -} - -void ConstructionObjectVectorController::reportItems() { - if (!m_reportItemsMutex->tryLock()) { - return; - } - - if (m_reportScheduled) { - m_reportScheduled = false; - - ModelObjectVectorController::reportItems(); - } - - m_reportItemsMutex->unlock(); -} +ConstructionObjectVectorController::~ConstructionObjectVectorController() {} void ConstructionObjectVectorController::onChangeRelationship(const model::ModelObject& /*modelObject*/, int /*index*/, Handle /*newHandle*/, Handle /*oldHandle*/) { - reportItemsLater(); + reportItems(); } void ConstructionObjectVectorController::onDataChange(const model::ModelObject& /*modelObject*/) { - reportItemsLater(); + reportItems(); } void ConstructionObjectVectorController::onChange(const model::ModelObject& /*modelObject*/) { - reportItemsLater(); + reportItems(); } std::vector ConstructionObjectVectorController::makeVector() { diff --git a/src/openstudio_lib/ConstructionObjectVectorController.hpp b/src/openstudio_lib/ConstructionObjectVectorController.hpp index 05a79efe9..16173c021 100644 --- a/src/openstudio_lib/ConstructionObjectVectorController.hpp +++ b/src/openstudio_lib/ConstructionObjectVectorController.hpp @@ -33,8 +33,6 @@ #include "ModelObjectVectorController.hpp" #include -class QMutex; - namespace openstudio { class ConstructionObjectVectorController : public ModelObjectVectorController @@ -49,13 +47,6 @@ class ConstructionObjectVectorController : public ModelObjectVectorController void setParentWidget(QWidget* parentWidget); - public slots: - - // reportItemsLater should be used as it wraps the call to reportItems in a QTimer::singleShot - // which eventually calls ModelObjectVector::reportItems - void reportItemsLater(); - void reportItems(); - protected: virtual void onChangeRelationship(const model::ModelObject& modelObject, int index, Handle newHandle, Handle oldHandle) override; @@ -76,9 +67,6 @@ class ConstructionObjectVectorController : public ModelObjectVectorController void insert(const OSItemId& itemId, int insertPosition = -1, boost::optional erasePosition_ = boost::none); - bool m_reportScheduled; - QMutex* m_reportItemsMutex; - enum LayerType { FENESTRATION, diff --git a/src/openstudio_lib/ConstructionsView.cpp b/src/openstudio_lib/ConstructionsView.cpp index 98a0e3d2f..3839e3af9 100644 --- a/src/openstudio_lib/ConstructionsView.cpp +++ b/src/openstudio_lib/ConstructionsView.cpp @@ -47,7 +47,7 @@ namespace openstudio { ConstructionsView::ConstructionsView(bool isIP, const openstudio::model::Model& model, QWidget* parent) - : ModelSubTabView(new ModelObjectTypeListView(ConstructionsView::modelObjectTypesAndNames(), model, true, OSItemType::ListItem, parent), + : ModelSubTabView(new ModelObjectTypeListView(ConstructionsView::modelObjectTypesAndNames(), model, true, OSItemType::ListItem, false, parent), new ConstructionsInspectorView(isIP, model, parent), false, parent) { connect(this, &ConstructionsView::toggleUnitsClicked, modelObjectInspectorView(), &ModelObjectInspectorView::toggleUnitsClicked); } diff --git a/src/openstudio_lib/DefaultConstructionSetsView.cpp b/src/openstudio_lib/DefaultConstructionSetsView.cpp index 4e095a0c3..7317646ba 100644 --- a/src/openstudio_lib/DefaultConstructionSetsView.cpp +++ b/src/openstudio_lib/DefaultConstructionSetsView.cpp @@ -46,7 +46,7 @@ namespace openstudio { DefaultConstructionSetsView::DefaultConstructionSetsView(const openstudio::model::Model& model, const QString& tabLabel, bool hasSubTabs, QWidget* parent) - : ModelSubTabView(new ModelObjectListView(IddObjectType::OS_DefaultConstructionSet, model, true, parent), + : ModelSubTabView(new ModelObjectListView(IddObjectType::OS_DefaultConstructionSet, model, true, false, parent), new DefaultConstructionSetInspectorView(model, parent), false, parent) {} } // namespace openstudio diff --git a/src/openstudio_lib/HVACSystemsController.cpp b/src/openstudio_lib/HVACSystemsController.cpp index 9e5eabf90..d2b26285f 100644 --- a/src/openstudio_lib/HVACSystemsController.cpp +++ b/src/openstudio_lib/HVACSystemsController.cpp @@ -1602,12 +1602,9 @@ void HVACLayoutController::updateLater() { QTimer::singleShot(0, this, &HVACLayoutController::update); } -SystemAvailabilityVectorController::SystemAvailabilityVectorController() - : ModelObjectVectorController(), m_reportScheduled(false), m_reportItemsMutex(new QMutex()) {} +SystemAvailabilityVectorController::SystemAvailabilityVectorController() : ModelObjectVectorController() {} -SystemAvailabilityVectorController::~SystemAvailabilityVectorController() { - delete m_reportItemsMutex; -} +SystemAvailabilityVectorController::~SystemAvailabilityVectorController() {} void SystemAvailabilityVectorController::attach(const model::ModelObject& modelObject) { detach(); @@ -1617,11 +1614,10 @@ void SystemAvailabilityVectorController::attach(const model::ModelObject& modelO if (m_modelObject) { m_model = m_modelObject->model(); - m_model->getImpl() - ->onChange.connect(this); + m_model->getImpl()->onChange.connect(this); } - reportItemsLater(); + reportItems(); } void SystemAvailabilityVectorController::detach() { @@ -1630,33 +1626,12 @@ void SystemAvailabilityVectorController::detach() { } if (m_model) { - m_model->getImpl() - ->onChange.disconnect(this); + m_model->getImpl()->onChange.disconnect(this); m_model.reset(); } - reportItemsLater(); -} - -void SystemAvailabilityVectorController::reportItemsLater() { - m_reportScheduled = true; - - QTimer::singleShot(0, this, &SystemAvailabilityVectorController::reportItems); -} - -void SystemAvailabilityVectorController::reportItems() { - if (!m_reportItemsMutex->tryLock()) { - return; - } - - if (m_reportScheduled) { - m_reportScheduled = false; - - ModelObjectVectorController::reportItems(); - } - - m_reportItemsMutex->unlock(); + reportItems(); } boost::optional SystemAvailabilityVectorController::airLoopHVAC() { @@ -1698,12 +1673,9 @@ void SystemAvailabilityVectorController::onReplaceItem(OSItem* /*currentItem*/, onDrop(replacementItemId); } -SupplyAirTempScheduleVectorController::SupplyAirTempScheduleVectorController() - : ModelObjectVectorController(), m_reportScheduled(false), m_reportItemsMutex(new QMutex()) {} +SupplyAirTempScheduleVectorController::SupplyAirTempScheduleVectorController() : ModelObjectVectorController() {} -SupplyAirTempScheduleVectorController::~SupplyAirTempScheduleVectorController() { - delete m_reportItemsMutex; -} +SupplyAirTempScheduleVectorController::~SupplyAirTempScheduleVectorController() {} void SystemAvailabilityVectorController::onDropZoneItemClicked(OSItem* item) { OSAppBase::instance()->currentDocument()->mainRightColumnController()->inspectModelObjectByItem(item, false); @@ -1717,11 +1689,10 @@ void SupplyAirTempScheduleVectorController::attach(const model::ModelObject& mod if (m_modelObject) { m_model = m_modelObject->model(); - m_model->getImpl() - ->onChange.connect(this); + m_model->getImpl()->onChange.connect(this); } - reportItemsLater(); + reportItems(); } void SupplyAirTempScheduleVectorController::detach() { @@ -1730,33 +1701,10 @@ void SupplyAirTempScheduleVectorController::detach() { } if (m_model) { - m_model->getImpl() - ->onChange.disconnect(this); + m_model->getImpl()->onChange.disconnect(this); m_model.reset(); } - - reportItemsLater(); -} - -void SupplyAirTempScheduleVectorController::reportItemsLater() { - m_reportScheduled = true; - - QTimer::singleShot(0, this, &SupplyAirTempScheduleVectorController::reportItems); -} - -void SupplyAirTempScheduleVectorController::reportItems() { - if (!m_reportItemsMutex->tryLock()) { - return; - } - - if (m_reportScheduled) { - m_reportScheduled = false; - - ModelObjectVectorController::reportItems(); - } - - m_reportItemsMutex->unlock(); } boost::optional SupplyAirTempScheduleVectorController::setpointManagerScheduled() { @@ -1811,12 +1759,9 @@ void SupplyAirTempScheduleVectorController::onDropZoneItemClicked(OSItem* item) // CLASSIC ONES // CTOR -AvailabilityManagerObjectVectorController::AvailabilityManagerObjectVectorController() - : ModelObjectVectorController(), m_reportScheduled(false), m_reportItemsMutex(new QMutex()) {} +AvailabilityManagerObjectVectorController::AvailabilityManagerObjectVectorController() : ModelObjectVectorController() {} -AvailabilityManagerObjectVectorController::~AvailabilityManagerObjectVectorController() { - delete m_reportItemsMutex; -} +AvailabilityManagerObjectVectorController::~AvailabilityManagerObjectVectorController() {} void AvailabilityManagerObjectVectorController::attach(const model::ModelObject& modelObject) { detach(); @@ -1826,11 +1771,10 @@ void AvailabilityManagerObjectVectorController::attach(const model::ModelObject& if (m_modelObject) { m_model = m_modelObject->model(); - m_model->getImpl() - ->onChange.connect(this); + m_model->getImpl()->onChange.connect(this); } - reportItemsLater(); + reportItems(); } void AvailabilityManagerObjectVectorController::detach() { @@ -1839,33 +1783,12 @@ void AvailabilityManagerObjectVectorController::detach() { } if (m_model) { - m_model->getImpl() - ->onChange.disconnect(this); + m_model->getImpl()->onChange.disconnect(this); m_model.reset(); } - reportItemsLater(); -} - -void AvailabilityManagerObjectVectorController::reportItemsLater() { - m_reportScheduled = true; - - QTimer::singleShot(0, this, &AvailabilityManagerObjectVectorController::reportItems); -} - -void AvailabilityManagerObjectVectorController::reportItems() { - if (!m_reportItemsMutex->tryLock()) { - return; - } - - if (m_reportScheduled) { - m_reportScheduled = false; - - ModelObjectVectorController::reportItems(); - } - - m_reportItemsMutex->unlock(); + reportItems(); } // ACTUAL STUFF diff --git a/src/openstudio_lib/HVACSystemsController.hpp b/src/openstudio_lib/HVACSystemsController.hpp index 1d8082493..210c8146f 100644 --- a/src/openstudio_lib/HVACSystemsController.hpp +++ b/src/openstudio_lib/HVACSystemsController.hpp @@ -330,10 +330,6 @@ class SystemAvailabilityVectorController : public ModelObjectVectorController public slots: - void reportItemsLater(); - - void reportItems(); - void onDropZoneItemClicked(OSItem* item); protected: @@ -342,11 +338,6 @@ class SystemAvailabilityVectorController : public ModelObjectVectorController void onReplaceItem(OSItem* currentItem, const OSItemId& replacementItemId) override; void onDrop(const OSItemId& itemId) override; - - private: - bool m_reportScheduled; - - QMutex* m_reportItemsMutex; }; class SupplyAirTempScheduleVectorController : public ModelObjectVectorController @@ -366,10 +357,6 @@ class SupplyAirTempScheduleVectorController : public ModelObjectVectorController public slots: - void reportItemsLater(); - - void reportItems(); - void onDropZoneItemClicked(OSItem* item); protected: @@ -378,11 +365,6 @@ class SupplyAirTempScheduleVectorController : public ModelObjectVectorController void onReplaceItem(OSItem* currentItem, const OSItemId& replacementItemId) override; void onDrop(const OSItemId& itemId) override; - - private: - bool m_reportScheduled; - - QMutex* m_reportItemsMutex; }; class AvailabilityManagerObjectVectorController : public ModelObjectVectorController @@ -404,10 +386,6 @@ class AvailabilityManagerObjectVectorController : public ModelObjectVectorContro public slots: - void reportItemsLater(); - - void reportItems(); - void onDropZoneItemClicked(OSItem* item); protected: @@ -422,11 +400,6 @@ class AvailabilityManagerObjectVectorController : public ModelObjectVectorContro virtual void onReplaceItem(OSItem* currentItem, const OSItemId& replacementItemId) override; virtual void onDrop(const OSItemId& itemId) override; - - private: - bool m_reportScheduled; - - QMutex* m_reportItemsMutex; }; } // namespace openstudio diff --git a/src/openstudio_lib/LoadsView.cpp b/src/openstudio_lib/LoadsView.cpp index 054049ce8..10a4db253 100644 --- a/src/openstudio_lib/LoadsView.cpp +++ b/src/openstudio_lib/LoadsView.cpp @@ -57,7 +57,7 @@ namespace openstudio { LoadsView::LoadsView(bool isIP, const openstudio::model::Model& model, QWidget* parent) - : ModelSubTabView(new ModelObjectTypeListView(LoadsView::modelObjectTypesAndNames(), model, true, OSItemType::CollapsibleListHeader, parent), + : ModelSubTabView(new ModelObjectTypeListView(LoadsView::modelObjectTypesAndNames(), model, true, OSItemType::CollapsibleListHeader, false, parent), new LoadsInspectorView(isIP, model, parent), false, parent) { connect(this, &LoadsView::toggleUnitsClicked, modelObjectInspectorView(), &ModelObjectInspectorView::toggleUnitsClicked); } diff --git a/src/openstudio_lib/MainRightColumnController.cpp b/src/openstudio_lib/MainRightColumnController.cpp index 896e760ea..a00ce25da 100644 --- a/src/openstudio_lib/MainRightColumnController.cpp +++ b/src/openstudio_lib/MainRightColumnController.cpp @@ -262,7 +262,7 @@ void MainRightColumnController::configureForSchedulesSubTab(int subTabID) { model::Model lib = doc->componentLibrary(); // my model - auto* myModelList = new ModelObjectTypeListView(m_model, true, OSItemType::CollapsibleListHeader); + auto* myModelList = new ModelObjectTypeListView(m_model, true, OSItemType::CollapsibleListHeader, false); myModelList->setItemsType(OSItemType::LibraryItem); myModelList->setItemsDraggable(true); myModelList->setItemsRemoveable(false); @@ -277,7 +277,7 @@ void MainRightColumnController::configureForSchedulesSubTab(int subTabID) { setMyModelView(myModelList); // my library - auto* myLibraryList = new ModelObjectTypeListView(lib, true, OSItemType::CollapsibleListHeader); + auto* myLibraryList = new ModelObjectTypeListView(lib, true, OSItemType::CollapsibleListHeader, true); myLibraryList->setItemsDraggable(true); myLibraryList->setItemsRemoveable(false); myLibraryList->setItemsType(OSItemType::LibraryItem); @@ -300,7 +300,7 @@ void MainRightColumnController::configureForSchedulesSubTab(int subTabID) { model::Model lib = doc->componentLibrary(); // my library - auto* myLibraryList = new ModelObjectTypeListView(lib, true, OSItemType::CollapsibleListHeader); + auto* myLibraryList = new ModelObjectTypeListView(lib, true, OSItemType::CollapsibleListHeader, true); myLibraryList->setItemsDraggable(true); myLibraryList->setItemsRemoveable(false); myLibraryList->setItemsType(OSItemType::LibraryItem); @@ -330,7 +330,7 @@ void MainRightColumnController::configureForConstructionsSubTab(int subTabID) { model::Model lib = doc->componentLibrary(); // my model - auto* myModelList = new ModelObjectTypeListView(m_model, true, OSItemType::CollapsibleListHeader); + auto* myModelList = new ModelObjectTypeListView(m_model, true, OSItemType::CollapsibleListHeader, false); myModelList->setItemsDraggable(true); myModelList->setItemsRemoveable(false); myModelList->setItemsType(OSItemType::LibraryItem); @@ -367,7 +367,7 @@ void MainRightColumnController::configureForConstructionsSubTab(int subTabID) { model::Model lib = doc->componentLibrary(); // my model - auto* myModelList = new ModelObjectTypeListView(m_model, true, OSItemType::CollapsibleListHeader); + auto* myModelList = new ModelObjectTypeListView(m_model, true, OSItemType::CollapsibleListHeader, false); myModelList->setItemsDraggable(true); myModelList->setItemsRemoveable(false); myModelList->setItemsType(OSItemType::LibraryItem); @@ -435,7 +435,7 @@ void MainRightColumnController::configureForConstructionsSubTab(int subTabID) { model::Model lib = doc->componentLibrary(); // my model - auto* myModelList = new ModelObjectTypeListView(m_model, true, OSItemType::CollapsibleListHeader); + auto* myModelList = new ModelObjectTypeListView(m_model, true, OSItemType::CollapsibleListHeader, false); myModelList->setItemsDraggable(true); myModelList->setItemsRemoveable(false); myModelList->setItemsType(OSItemType::LibraryItem); @@ -508,7 +508,7 @@ void MainRightColumnController::configureForLoadsSubTab(int subTabID) { // my model - auto* myModelList = new ModelObjectTypeListView(m_model, true, OSItemType::CollapsibleListHeader); + auto* myModelList = new ModelObjectTypeListView(m_model, true, OSItemType::CollapsibleListHeader, false); myModelList->setItemsDraggable(true); myModelList->setItemsRemoveable(false); myModelList->setItemsType(OSItemType::LibraryItem); @@ -572,7 +572,7 @@ void MainRightColumnController::configureForSpaceTypesSubTab(int subTabID) { std::shared_ptr doc = OSAppBase::instance()->currentDocument(); // my model - auto* myModelList = new ModelObjectTypeListView(m_model, true, OSItemType::CollapsibleListHeader); + auto* myModelList = new ModelObjectTypeListView(m_model, true, OSItemType::CollapsibleListHeader, false); myModelList->setItemsDraggable(true); myModelList->setItemsRemoveable(false); myModelList->setItemsType(OSItemType::LibraryItem); @@ -652,7 +652,7 @@ void MainRightColumnController::configureForFacilitySubTab(int subTabID) { std::shared_ptr doc = OSAppBase::instance()->currentDocument(); // my model - auto* myModelList = new ModelObjectTypeListView(m_model, true, OSItemType::CollapsibleListHeader); + auto* myModelList = new ModelObjectTypeListView(m_model, true, OSItemType::CollapsibleListHeader, false); myModelList->setItemsDraggable(true); myModelList->setItemsRemoveable(false); myModelList->setItemsType(OSItemType::LibraryItem); @@ -697,7 +697,7 @@ void MainRightColumnController::configureForFacilitySubTab(int subTabID) { // Library model::Model lib = doc->componentLibrary(); - auto* myLibraryList = new ModelObjectTypeListView(lib, true, OSItemType::CollapsibleListHeader); + auto* myLibraryList = new ModelObjectTypeListView(lib, true, OSItemType::CollapsibleListHeader, true); myLibraryList->setItemsDraggable(true); myLibraryList->setItemsRemoveable(false); myLibraryList->setItemsType(OSItemType::LibraryItem); @@ -757,7 +757,7 @@ void MainRightColumnController::configureForSpacesSubTab(int subTabID) { std::shared_ptr doc = OSAppBase::instance()->currentDocument(); // my model - auto* myModelList = new ModelObjectTypeListView(m_model, true, OSItemType::CollapsibleListHeader); + auto* myModelList = new ModelObjectTypeListView(m_model, true, OSItemType::CollapsibleListHeader, false); myModelList->setItemsDraggable(true); myModelList->setItemsRemoveable(false); myModelList->setItemsType(OSItemType::LibraryItem); @@ -870,7 +870,7 @@ void MainRightColumnController::configureForThermalZonesSubTab(int subTabID) { // My Model - auto* myModelList = new ModelObjectTypeListView(m_model, true, OSItemType::CollapsibleListHeader); + auto* myModelList = new ModelObjectTypeListView(m_model, true, OSItemType::CollapsibleListHeader, false); myModelList->setItemsDraggable(true); myModelList->setItemsRemoveable(false); myModelList->setItemsType(OSItemType::LibraryItem); @@ -889,7 +889,7 @@ void MainRightColumnController::configureForThermalZonesSubTab(int subTabID) { // Library model::Model lib = doc->componentLibrary(); - auto* libraryWidget = new ModelObjectTypeListView(lib, true, OSItemType::CollapsibleListHeader); + auto* libraryWidget = new ModelObjectTypeListView(lib, true, OSItemType::CollapsibleListHeader, true); libraryWidget->setItemsDraggable(true); libraryWidget->setItemsRemoveable(false); libraryWidget->setItemsType(OSItemType::LibraryItem); @@ -936,7 +936,7 @@ void MainRightColumnController::configureForHVACSystemsSubTab(int subTabID) { setEditView(nullptr); // my model - auto* myModelList = new ModelObjectTypeListView(m_model, true, OSItemType::CollapsibleListHeader); + auto* myModelList = new ModelObjectTypeListView(m_model, true, OSItemType::CollapsibleListHeader, false); myModelList->setItemsDraggable(true); myModelList->setItemsRemoveable(false); myModelList->setItemsType(OSItemType::LibraryItem); diff --git a/src/openstudio_lib/MaterialsView.cpp b/src/openstudio_lib/MaterialsView.cpp index 468fca1ba..c3f1d5d9a 100644 --- a/src/openstudio_lib/MaterialsView.cpp +++ b/src/openstudio_lib/MaterialsView.cpp @@ -57,8 +57,9 @@ namespace openstudio { MaterialsView::MaterialsView(bool isIP, const openstudio::model::Model& model, const QString& tabLabel, bool hasSubTabs, QWidget* parent) - : ModelSubTabView(new ModelObjectTypeListView(MaterialsView::modelObjectTypesAndNames(), model, true, OSItemType::CollapsibleListHeader, parent), - new MaterialsInspectorView(isIP, model, parent), false, parent) { + : ModelSubTabView( + new ModelObjectTypeListView(MaterialsView::modelObjectTypesAndNames(), model, true, OSItemType::CollapsibleListHeader, false, parent), + new MaterialsInspectorView(isIP, model, parent), false, parent) { // ModelObjectTypeListView will call reportItems for each IddObjectType, this results in inspector being build for each IddObjecType then thrown away connect(this, &MaterialsView::toggleUnitsClicked, modelObjectInspectorView(), &ModelObjectInspectorView::toggleUnitsClicked); } diff --git a/src/openstudio_lib/ModelObjectListView.cpp b/src/openstudio_lib/ModelObjectListView.cpp index e05b3a559..82ce4c055 100644 --- a/src/openstudio_lib/ModelObjectListView.cpp +++ b/src/openstudio_lib/ModelObjectListView.cpp @@ -51,17 +51,26 @@ #include #include +#include +#include namespace openstudio { -ModelObjectListController::ModelObjectListController(const openstudio::IddObjectType& iddObjectType, const model::Model& model, bool showLocalBCL) - : m_iddObjectType(iddObjectType), m_model(model), m_showLocalBCL(showLocalBCL) { +ModelObjectListController::ModelObjectListController(const openstudio::IddObjectType& iddObjectType, const model::Model& model, bool isLibrary) + : m_iddObjectType(iddObjectType), m_model(model), m_isLibrary(isLibrary), m_reportScheduled(false), m_reportItemsMutex(new QMutex()) { - // model.getImpl().get()->addWorkspaceObjectPtr.connect(this); - connect(OSAppBase::instance(), &OSAppBase::workspaceObjectAddedPtr, this, &ModelObjectListController::objectAdded, Qt::QueuedConnection); + if (!m_isLibrary) { - //model.getImpl().get()->removeWorkspaceObjectPtr.connect(this); - connect(OSAppBase::instance(), &OSAppBase::workspaceObjectRemovedPtr, this, &ModelObjectListController::objectRemoved, Qt::QueuedConnection); + // model.getImpl().get()->addWorkspaceObjectPtr.connect(this); + connect(OSAppBase::instance(), &OSAppBase::workspaceObjectAddedPtr, this, &ModelObjectListController::objectAdded, Qt::QueuedConnection); + + //model.getImpl().get()->removeWorkspaceObjectPtr.connect(this); + connect(OSAppBase::instance(), &OSAppBase::workspaceObjectRemovedPtr, this, &ModelObjectListController::objectRemoved, Qt::QueuedConnection); + } +} + +ModelObjectListController::~ModelObjectListController() { + delete m_reportItemsMutex; } IddObjectType ModelObjectListController::iddObjectType() const { @@ -71,29 +80,58 @@ IddObjectType ModelObjectListController::iddObjectType() const { void ModelObjectListController::objectAdded(std::shared_ptr impl, const openstudio::IddObjectType& iddObjectType, const openstudio::UUID& handle) { if (iddObjectType == m_iddObjectType) { - std::vector ids = this->makeVector(); - emit itemIds(ids); + m_reportItemsMutex->lock(); - for (const OSItemId& id : ids) { - if (id.itemId() == toQString(impl->handle())) { - emit selectedItemId(id); - break; - } + m_selectedHandle = handle; + if (!m_reportScheduled) { + m_reportScheduled = true; + QTimer::singleShot(0, this, &ModelObjectListController::reportItemsImpl); } + + m_reportItemsMutex->unlock(); } } void ModelObjectListController::objectRemoved(std::shared_ptr impl, const openstudio::IddObjectType& iddObjectType, const openstudio::UUID& handle) { if (iddObjectType == m_iddObjectType) { - emit itemIds(makeVector()); + m_reportItemsMutex->lock(); + + if (!m_reportScheduled) { + m_reportScheduled = true; + QTimer::singleShot(0, this, &ModelObjectListController::reportItemsImpl); + } + + m_reportItemsMutex->unlock(); } } +void ModelObjectListController::reportItemsImpl() { + m_reportItemsMutex->lock(); + + if (m_reportScheduled) { + m_reportScheduled = false; + std::vector ids = this->makeVector(); + emit itemIds(ids); + + if (m_selectedHandle) { + for (const OSItemId& id : ids) { + if (id.itemId() == toQString(*m_selectedHandle)) { + emit selectedItemId(id); + break; + } + } + m_selectedHandle.reset(); + } + } + + m_reportItemsMutex->unlock(); +} + std::vector ModelObjectListController::makeVector() { std::vector result; - if (m_showLocalBCL) { + if (m_isLibrary) { std::vector> pairs; pairs.push_back(std::make_pair("OpenStudio Type", m_iddObjectType.valueDescription())); @@ -150,8 +188,8 @@ std::vector ModelObjectListController::makeVector() { } ModelObjectListView::ModelObjectListView(const openstudio::IddObjectType& iddObjectType, const model::Model& model, bool addScrollArea, - bool showLocalBCL, QWidget* parent) - : OSItemList(new ModelObjectListController(iddObjectType, model, showLocalBCL), addScrollArea, parent) {} + bool isLibrary, QWidget* parent) + : OSItemList(new ModelObjectListController(iddObjectType, model, isLibrary), addScrollArea, parent) {} boost::optional ModelObjectListView::selectedModelObject() const { OSItem* selectedItem = this->selectedItem(); diff --git a/src/openstudio_lib/ModelObjectListView.hpp b/src/openstudio_lib/ModelObjectListView.hpp index d12d40593..75f3fc2f2 100644 --- a/src/openstudio_lib/ModelObjectListView.hpp +++ b/src/openstudio_lib/ModelObjectListView.hpp @@ -37,6 +37,8 @@ #include #include "../model_editor/QMetaTypes.hpp" +class QMutex; + namespace openstudio { class ModelObjectListController : public OSVectorController @@ -44,9 +46,9 @@ class ModelObjectListController : public OSVectorController Q_OBJECT public: - ModelObjectListController(const openstudio::IddObjectType& iddObjectType, const model::Model& model, bool showLocalBCL = false); + ModelObjectListController(const openstudio::IddObjectType& iddObjectType, const model::Model& model, bool isLibrary); - virtual ~ModelObjectListController() {} + virtual ~ModelObjectListController(); IddObjectType iddObjectType() const; @@ -60,7 +62,12 @@ class ModelObjectListController : public OSVectorController private: openstudio::IddObjectType m_iddObjectType; model::Model m_model; - bool m_showLocalBCL; + bool m_isLibrary; + bool m_reportScheduled; + boost::optional m_selectedHandle; + QMutex* m_reportItemsMutex; + + void reportItemsImpl(); }; class ModelObjectListView : public OSItemList @@ -68,7 +75,7 @@ class ModelObjectListView : public OSItemList Q_OBJECT public: - ModelObjectListView(const openstudio::IddObjectType& iddObjectType, const model::Model& model, bool addScrollArea, bool showLocalBCL = false, + ModelObjectListView(const openstudio::IddObjectType& iddObjectType, const model::Model& model, bool addScrollArea, bool isLibrary, QWidget* parent = nullptr); virtual ~ModelObjectListView() {} diff --git a/src/openstudio_lib/ModelObjectTypeListView.cpp b/src/openstudio_lib/ModelObjectTypeListView.cpp index 3ffc09387..38a06fc82 100644 --- a/src/openstudio_lib/ModelObjectTypeListView.cpp +++ b/src/openstudio_lib/ModelObjectTypeListView.cpp @@ -42,18 +42,18 @@ namespace openstudio { -ModelObjectTypeListView::ModelObjectTypeListView(const model::Model& model, bool addScrollArea, OSItemType headerType, bool showLocalBCL, +ModelObjectTypeListView::ModelObjectTypeListView(const model::Model& model, bool addScrollArea, OSItemType headerType, bool isLibrary, QWidget* parent) - : OSCollapsibleItemList(addScrollArea, parent), m_model(model), m_headerType(headerType), m_showLocalBCL(showLocalBCL) {} + : OSCollapsibleItemList(addScrollArea, parent), m_model(model), m_headerType(headerType), m_isLibrary(isLibrary) {} ModelObjectTypeListView::ModelObjectTypeListView(const std::vector>& modelObjectTypesAndNames, - const model::Model& model, bool addScrollArea, OSItemType headerType, bool showLocalBCL, + const model::Model& model, bool addScrollArea, OSItemType headerType, bool isLibrary, QWidget* parent) : OSCollapsibleItemList(addScrollArea, parent), m_modelObjectTypesAndNames(modelObjectTypesAndNames), m_model(model), m_headerType(headerType), - m_showLocalBCL(showLocalBCL) { + m_isLibrary(isLibrary) { for (auto modelObjectTypeAndName = m_modelObjectTypesAndNames.rbegin(); modelObjectTypeAndName != m_modelObjectTypesAndNames.rend(); ++modelObjectTypeAndName) { addModelObjectType(modelObjectTypeAndName->first, modelObjectTypeAndName->second); @@ -62,7 +62,7 @@ ModelObjectTypeListView::ModelObjectTypeListView(const std::vector>& modelObjectTypesAndNames, const model::Model& model, - bool addScrollArea, OSItemType headerType, bool showLocalBCL = false, QWidget* parent = nullptr); + bool addScrollArea, OSItemType headerType, bool isLibrary, QWidget* parent = nullptr); virtual ~ModelObjectTypeListView() {} @@ -66,7 +66,7 @@ class ModelObjectTypeListView : public OSCollapsibleItemList model::Model m_model; OSItemType m_headerType; - bool m_showLocalBCL; + bool m_isLibrary; }; } // namespace openstudio diff --git a/src/openstudio_lib/OSItemList.cpp b/src/openstudio_lib/OSItemList.cpp index 723b7e973..f03c29cb4 100644 --- a/src/openstudio_lib/OSItemList.cpp +++ b/src/openstudio_lib/OSItemList.cpp @@ -48,8 +48,7 @@ OSItemList::OSItemList(OSVectorController* vectorController, bool addScrollArea, m_selectedItem(nullptr), m_itemsDraggable(false), m_itemsRemoveable(false), - m_type(OSItemType::ListItem), - m_dirty(false) { + m_type(OSItemType::ListItem) { // for now we will allow this item list to manage memory of OS_ASSERT(!m_vectorController->parent()); m_vectorController->setParent(this); @@ -203,15 +202,6 @@ void OSItemList::setItemIds(const std::vector& itemIds) { } } selectItem(firstItem()); - - m_dirty = true; - QTimer::singleShot(0, this, &OSItemList::refresh); -} - -void OSItemList::refresh() { - if (m_dirty) { - m_dirty = false; - } } void OSItemList::addItem(OSItem* item, bool selectItem) { @@ -234,9 +224,6 @@ void OSItemList::addItem(OSItem* item, bool selectItem) { if (selectItem) { this->selectItem(item); } - - m_dirty = true; - QTimer::singleShot(0, this, &OSItemList::refresh); } void OSItemList::selectItem(OSItem* selectItem) { diff --git a/src/openstudio_lib/OSItemList.hpp b/src/openstudio_lib/OSItemList.hpp index 6cc36ce25..922103845 100644 --- a/src/openstudio_lib/OSItemList.hpp +++ b/src/openstudio_lib/OSItemList.hpp @@ -89,8 +89,6 @@ class OSItemList : public OSItemSelector void setItemIds(const std::vector& itemIds); - void refresh(); - signals: void itemsRequested(); @@ -105,7 +103,6 @@ class OSItemList : public OSItemSelector bool m_itemsDraggable; bool m_itemsRemoveable; OSItemType m_type; - bool m_dirty; }; } // namespace openstudio diff --git a/src/openstudio_lib/OSVectorController.cpp b/src/openstudio_lib/OSVectorController.cpp index b5aed33c1..fb933bb4b 100644 --- a/src/openstudio_lib/OSVectorController.cpp +++ b/src/openstudio_lib/OSVectorController.cpp @@ -29,12 +29,37 @@ #include "OSVectorController.hpp" +#include +#include + namespace openstudio { -OSVectorController::OSVectorController() : QObject() {} +OSVectorController::OSVectorController() : QObject(), m_reportScheduled(false), m_reportItemsMutex(new QMutex()) {} + +OSVectorController::~OSVectorController() { + delete m_reportItemsMutex; +} void OSVectorController::reportItems() { - emit itemIds(this->makeVector()); + m_reportItemsMutex->lock(); + + if (!m_reportScheduled) { + m_reportScheduled = true; + QTimer::singleShot(0, this, &OSVectorController::reportItemsImpl); + } + + m_reportItemsMutex->unlock(); +} + +void OSVectorController::reportItemsImpl() { + m_reportItemsMutex->lock(); + + if (m_reportScheduled) { + m_reportScheduled = false; + emit itemIds(this->makeVector()); + } + + m_reportItemsMutex->unlock(); } void OSVectorController::removeItem(OSItem* item) { diff --git a/src/openstudio_lib/OSVectorController.hpp b/src/openstudio_lib/OSVectorController.hpp index f96f84ee6..92f29c4d1 100644 --- a/src/openstudio_lib/OSVectorController.hpp +++ b/src/openstudio_lib/OSVectorController.hpp @@ -39,6 +39,8 @@ #include #include // Signal-Slot replacement +class QMutex; + namespace openstudio { class OSVectorController @@ -52,7 +54,7 @@ class OSVectorController // for now, each controller must be parented by a widget OSVectorController(); - virtual ~OSVectorController() {} + virtual ~OSVectorController(); public slots: @@ -82,6 +84,15 @@ class OSVectorController virtual void onDrop(const OSItemId& itemId); virtual void onMakeNewItem(); + + private: + bool m_reportScheduled; + + QMutex* m_reportItemsMutex; + + private slots: + + void reportItemsImpl(); }; } // namespace openstudio diff --git a/src/openstudio_lib/ScheduleSetsView.cpp b/src/openstudio_lib/ScheduleSetsView.cpp index 8f5f02615..dc6988d47 100644 --- a/src/openstudio_lib/ScheduleSetsView.cpp +++ b/src/openstudio_lib/ScheduleSetsView.cpp @@ -49,8 +49,8 @@ namespace openstudio { ScheduleSetsView::ScheduleSetsView(const openstudio::model::Model& model, QWidget* parent) - : ModelSubTabView(new ModelObjectListView(IddObjectType::OS_DefaultScheduleSet, model, true, parent), new ScheduleSetInspectorView(model, parent), - false, parent) {} + : ModelSubTabView(new ModelObjectListView(IddObjectType::OS_DefaultScheduleSet, model, true, false, parent), + new ScheduleSetInspectorView(model, parent), false, parent) {} std::vector> ScheduleSetsView::modelObjectTypesAndNames() { std::vector> result; diff --git a/src/openstudio_lib/SpaceTypesView.cpp b/src/openstudio_lib/SpaceTypesView.cpp index 1c6c2160b..71bbd1547 100644 --- a/src/openstudio_lib/SpaceTypesView.cpp +++ b/src/openstudio_lib/SpaceTypesView.cpp @@ -54,7 +54,7 @@ namespace openstudio { SpaceTypesView::SpaceTypesView(bool isIP, const openstudio::model::Model& model, QWidget* parent) - : ModelSubTabView(new ModelObjectListView(IddObjectType::OS_SpaceType, model, true, parent), new SpaceTypeInspectorView(isIP, model, parent), + : ModelSubTabView(new ModelObjectListView(IddObjectType::OS_SpaceType, model, true, false, parent), new SpaceTypeInspectorView(isIP, model, parent), true, // Note: "true" creates a GridView SubTabView parent) { auto* modelObjectListView = qobject_cast(this->itemSelector()); diff --git a/src/openstudio_lib/ThermalZonesView.cpp b/src/openstudio_lib/ThermalZonesView.cpp index 6a50c8a40..526085fbe 100644 --- a/src/openstudio_lib/ThermalZonesView.cpp +++ b/src/openstudio_lib/ThermalZonesView.cpp @@ -43,8 +43,8 @@ namespace openstudio { ThermalZonesView::ThermalZonesView(bool isIP, const model::Model& model, QWidget* parent) - : ModelSubTabView(new ModelObjectListView(IddObjectType::OS_ThermalZone, model, true, parent), new ThermalZoneView(isIP, model, parent), true, - parent) { + : ModelSubTabView(new ModelObjectListView(IddObjectType::OS_ThermalZone, model, true, false, parent), new ThermalZoneView(isIP, model, parent), + true, parent) { connect(itemSelector(), &OSItemSelector::selectionCleared, inspectorView(), &OSInspectorView::clearSelection);