From cc0ffee3fe53371915a1aa583878b15a57f9e390 Mon Sep 17 00:00:00 2001 From: Sergiusz Bazanski Date: Tue, 31 Jul 2018 15:49:47 +0100 Subject: gui: lazy loading of tree model --- gui/designwidget.cc | 138 ++++++++++++++++++++++++++-------------------------- 1 file changed, 69 insertions(+), 69 deletions(-) (limited to 'gui/designwidget.cc') diff --git a/gui/designwidget.cc b/gui/designwidget.cc index 5107fbee..249df423 100644 --- a/gui/designwidget.cc +++ b/gui/designwidget.cc @@ -222,9 +222,9 @@ void DesignWidget::updateTree() { clearProperties(); - QMap::iterator i = highlightSelected.begin(); + QMap::iterator i = highlightSelected.begin(); while (i != highlightSelected.end()) { - QMap::iterator prev = i; + QMap::iterator prev = i; ++i; if (prev.key()->type() == ElementType::NET && ctx->nets.find(prev.key()->id()) == ctx->nets.end()) { highlightSelected.erase(prev); @@ -308,25 +308,25 @@ QtProperty *DesignWidget::addSubGroup(QtProperty *topItem, const QString &name) void DesignWidget::onClickedBel(BelId bel, bool keep) { - ContextTreeItem *item = treeModel->nodeForIdType(ElementType::BEL, ctx->getBelName(bel).c_str(ctx)); - selectionModel->setCurrentIndex(treeModel->indexFromNode(item), - keep ? QItemSelectionModel::Select : QItemSelectionModel::ClearAndSelect); + //LazyTreeItem *item = treeModel->nodeForIdType(ElementType::BEL, ctx->getBelName(bel).c_str(ctx)); + //selectionModel->setCurrentIndex(treeModel->indexFromNode(item), + // keep ? QItemSelectionModel::Select : QItemSelectionModel::ClearAndSelect); Q_EMIT selected(getDecals(ElementType::BEL, ctx->getBelName(bel)), keep); } void DesignWidget::onClickedWire(WireId wire, bool keep) { - ContextTreeItem *item = treeModel->nodeForIdType(ElementType::WIRE, ctx->getWireName(wire).c_str(ctx)); - selectionModel->setCurrentIndex(treeModel->indexFromNode(item), - keep ? QItemSelectionModel::Select : QItemSelectionModel::ClearAndSelect); + //LazyTreeItem *item = treeModel->nodeForIdType(ElementType::WIRE, ctx->getWireName(wire).c_str(ctx)); + //selectionModel->setCurrentIndex(treeModel->indexFromNode(item), + // keep ? QItemSelectionModel::Select : QItemSelectionModel::ClearAndSelect); Q_EMIT selected(getDecals(ElementType::WIRE, ctx->getWireName(wire)), keep); } void DesignWidget::onClickedPip(PipId pip, bool keep) { - ContextTreeItem *item = treeModel->nodeForIdType(ElementType::PIP, ctx->getPipName(pip).c_str(ctx)); - selectionModel->setCurrentIndex(treeModel->indexFromNode(item), - keep ? QItemSelectionModel::Select : QItemSelectionModel::ClearAndSelect); + //LazyTreeItem *item = treeModel->nodeForIdType(ElementType::PIP, ctx->getPipName(pip).c_str(ctx)); + //selectionModel->setCurrentIndex(treeModel->indexFromNode(item), + // keep ? QItemSelectionModel::Select : QItemSelectionModel::ClearAndSelect); Q_EMIT selected(getDecals(ElementType::PIP, ctx->getPipName(pip)), keep); } @@ -338,7 +338,7 @@ void DesignWidget::onSelectionChanged(const QItemSelection &, const QItemSelecti if (selectionModel->selectedIndexes().size() > 1) { std::vector decals; for (auto index : selectionModel->selectedIndexes()) { - ContextTreeItem *item = treeModel->nodeFromIndex(index); + LazyTreeItem *item = treeModel->nodeFromIndex(index); std::vector d = getDecals(item->type(), item->id()); std::move(d.begin(), d.end(), std::back_inserter(decals)); } @@ -348,7 +348,7 @@ void DesignWidget::onSelectionChanged(const QItemSelection &, const QItemSelecti QModelIndex index = selectionModel->selectedIndexes().at(0); if (!index.isValid()) return; - ContextTreeItem *clickItem = treeModel->nodeFromIndex(index); + LazyTreeItem *clickItem = treeModel->nodeFromIndex(index); ElementType type = clickItem->type(); if (type == ElementType::NONE) @@ -596,7 +596,7 @@ std::vector DesignWidget::getDecals(ElementType type, IdString value) return decals; } -void DesignWidget::updateHighlightGroup(QList items, int group) +void DesignWidget::updateHighlightGroup(QList items, int group) { const bool shouldClear = items.size() == 1; for (auto item : items) { @@ -620,53 +620,53 @@ void DesignWidget::updateHighlightGroup(QList items, int grou void DesignWidget::prepareMenuProperty(const QPoint &pos) { - QTreeWidget *tree = propertyEditor->treeWidget(); - QList items; - for (auto itemContextMenu : tree->selectedItems()) { - QtBrowserItem *browserItem = propertyEditor->itemToBrowserItem(itemContextMenu); - if (!browserItem) - continue; - QtProperty *selectedProperty = browserItem->property(); - ElementType type = getElementTypeByName(selectedProperty->propertyId()); - if (type == ElementType::NONE) - continue; - IdString value = ctx->id(selectedProperty->valueText().toStdString()); - items.append(treeModel->nodeForIdType(type, value.c_str(ctx))); - } - int selectedIndex = -1; - if (items.size() == 1) { - ContextTreeItem *item = items.at(0); - if (highlightSelected.contains(item)) - selectedIndex = highlightSelected[item]; - } - - QMenu menu(this); - QAction *selectAction = new QAction("&Select", this); - connect(selectAction, &QAction::triggered, this, [this, items] { - std::vector decals; - for (auto clickItem : items) { - std::vector d = getDecals(clickItem->type(), clickItem->id()); - std::move(d.begin(), d.end(), std::back_inserter(decals)); - } - Q_EMIT selected(decals, false); - }); - menu.addAction(selectAction); - - QMenu *subMenu = menu.addMenu("Highlight"); - QActionGroup *group = new QActionGroup(this); - group->setExclusive(true); - for (int i = 0; i < 8; i++) { - QPixmap pixmap(32, 32); - pixmap.fill(QColor(highlightColors[i])); - QAction *action = new QAction(QIcon(pixmap), ("Group " + std::to_string(i)).c_str(), this); - action->setCheckable(true); - subMenu->addAction(action); - group->addAction(action); - if (selectedIndex == i) - action->setChecked(true); - connect(action, &QAction::triggered, this, [this, i, items] { updateHighlightGroup(items, i); }); - } - menu.exec(tree->mapToGlobal(pos)); + //QTreeWidget *tree = propertyEditor->treeWidget(); + //QList items; + //for (auto itemContextMenu : tree->selectedItems()) { + // QtBrowserItem *browserItem = propertyEditor->itemToBrowserItem(itemContextMenu); + // if (!browserItem) + // continue; + // QtProperty *selectedProperty = browserItem->property(); + // ElementType type = getElementTypeByName(selectedProperty->propertyId()); + // if (type == ElementType::NONE) + // continue; + // IdString value = ctx->id(selectedProperty->valueText().toStdString()); + // items.append(treeModel->nodeForIdType(type, value.c_str(ctx))); + //} + //int selectedIndex = -1; + //if (items.size() == 1) { + // LazyTreeItem *item = items.at(0); + // if (highlightSelected.contains(item)) + // selectedIndex = highlightSelected[item]; + //} + + //QMenu menu(this); + //QAction *selectAction = new QAction("&Select", this); + //connect(selectAction, &QAction::triggered, this, [this, items] { + // std::vector decals; + // for (auto clickItem : items) { + // std::vector d = getDecals(clickItem->type(), clickItem->id()); + // std::move(d.begin(), d.end(), std::back_inserter(decals)); + // } + // Q_EMIT selected(decals, false); + //}); + //menu.addAction(selectAction); + + //QMenu *subMenu = menu.addMenu("Highlight"); + //QActionGroup *group = new QActionGroup(this); + //group->setExclusive(true); + //for (int i = 0; i < 8; i++) { + // QPixmap pixmap(32, 32); + // pixmap.fill(QColor(highlightColors[i])); + // QAction *action = new QAction(QIcon(pixmap), ("Group " + std::to_string(i)).c_str(), this); + // action->setCheckable(true); + // subMenu->addAction(action); + // group->addAction(action); + // if (selectedIndex == i) + // action->setChecked(true); + // connect(action, &QAction::triggered, this, [this, i, items] { updateHighlightGroup(items, i); }); + //} + //menu.exec(tree->mapToGlobal(pos)); } void DesignWidget::prepareMenuTree(const QPoint &pos) @@ -676,13 +676,13 @@ void DesignWidget::prepareMenuTree(const QPoint &pos) if (selectionModel->selectedIndexes().size() == 0) return; - QList items; + QList items; for (auto index : selectionModel->selectedIndexes()) { - ContextTreeItem *item = treeModel->nodeFromIndex(index); + LazyTreeItem *item = treeModel->nodeFromIndex(index); items.append(item); } if (items.size() == 1) { - ContextTreeItem *item = items.at(0); + LazyTreeItem *item = items.at(0); if (highlightSelected.contains(item)) selectedIndex = highlightSelected[item]; } @@ -706,11 +706,11 @@ void DesignWidget::prepareMenuTree(const QPoint &pos) void DesignWidget::onItemDoubleClicked(QTreeWidgetItem *item, int column) { - QtProperty *selectedProperty = propertyEditor->itemToBrowserItem(item)->property(); - ElementType type = getElementTypeByName(selectedProperty->propertyId()); - ContextTreeItem *it = treeModel->nodeForIdType(type, selectedProperty->valueText()); - if (it) - selectionModel->setCurrentIndex(treeModel->indexFromNode(it), QItemSelectionModel::ClearAndSelect); + //QtProperty *selectedProperty = propertyEditor->itemToBrowserItem(item)->property(); + //ElementType type = getElementTypeByName(selectedProperty->propertyId()); + //LazyTreeItem *it = treeModel->nodeForIdType(type, selectedProperty->valueText()); + //if (it) + // selectionModel->setCurrentIndex(treeModel->indexFromNode(it), QItemSelectionModel::ClearAndSelect); } void DesignWidget::onDoubleClicked(const QModelIndex &index) { Q_EMIT zoomSelected(); } -- cgit v1.2.3 From bf43c27567c475cbd8f2c9c66295d492cfd565e8 Mon Sep 17 00:00:00 2001 From: Sergiusz Bazanski Date: Wed, 1 Aug 2018 01:59:58 +0100 Subject: gui: restore lookup into tree after new model --- gui/designwidget.cc | 27 ++++++++++++++++++--------- 1 file changed, 18 insertions(+), 9 deletions(-) (limited to 'gui/designwidget.cc') diff --git a/gui/designwidget.cc b/gui/designwidget.cc index ad1362c8..0247d7c0 100644 --- a/gui/designwidget.cc +++ b/gui/designwidget.cc @@ -309,25 +309,34 @@ QtProperty *DesignWidget::addSubGroup(QtProperty *topItem, const QString &name) void DesignWidget::onClickedBel(BelId bel, bool keep) { - //LazyTreeItem *item = treeModel->nodeForIdType(ElementType::BEL, ctx->getBelName(bel).c_str(ctx)); - //selectionModel->setCurrentIndex(treeModel->indexFromNode(item), - // keep ? QItemSelectionModel::Select : QItemSelectionModel::ClearAndSelect); + auto item = treeModel->nodeForIdType(ElementType::BEL, ctx->getBelName(bel)); + if (!item) + return; + + selectionModel->setCurrentIndex(treeModel->indexFromNode(*item), + keep ? QItemSelectionModel::Select : QItemSelectionModel::ClearAndSelect); Q_EMIT selected(getDecals(ElementType::BEL, ctx->getBelName(bel)), keep); } void DesignWidget::onClickedWire(WireId wire, bool keep) { - //LazyTreeItem *item = treeModel->nodeForIdType(ElementType::WIRE, ctx->getWireName(wire).c_str(ctx)); - //selectionModel->setCurrentIndex(treeModel->indexFromNode(item), - // keep ? QItemSelectionModel::Select : QItemSelectionModel::ClearAndSelect); + auto item = treeModel->nodeForIdType(ElementType::WIRE, ctx->getWireName(wire)); + if (!item) + return; + + selectionModel->setCurrentIndex(treeModel->indexFromNode(*item), + keep ? QItemSelectionModel::Select : QItemSelectionModel::ClearAndSelect); Q_EMIT selected(getDecals(ElementType::WIRE, ctx->getWireName(wire)), keep); } void DesignWidget::onClickedPip(PipId pip, bool keep) { - //LazyTreeItem *item = treeModel->nodeForIdType(ElementType::PIP, ctx->getPipName(pip).c_str(ctx)); - //selectionModel->setCurrentIndex(treeModel->indexFromNode(item), - // keep ? QItemSelectionModel::Select : QItemSelectionModel::ClearAndSelect); + auto item = treeModel->nodeForIdType(ElementType::PIP, ctx->getPipName(pip)); + if (!item) + return; + + selectionModel->setCurrentIndex(treeModel->indexFromNode(*item), + keep ? QItemSelectionModel::Select : QItemSelectionModel::ClearAndSelect); Q_EMIT selected(getDecals(ElementType::PIP, ctx->getPipName(pip)), keep); } -- cgit v1.2.3 From 1038b7ef23dbc1336212962be12994f98a68226a Mon Sep 17 00:00:00 2001 From: Sergiusz Bazanski Date: Wed, 1 Aug 2018 02:08:56 +0100 Subject: gui: restore property navigation in tree --- gui/designwidget.cc | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) (limited to 'gui/designwidget.cc') diff --git a/gui/designwidget.cc b/gui/designwidget.cc index 0247d7c0..fe99a3c2 100644 --- a/gui/designwidget.cc +++ b/gui/designwidget.cc @@ -716,11 +716,11 @@ void DesignWidget::prepareMenuTree(const QPoint &pos) void DesignWidget::onItemDoubleClicked(QTreeWidgetItem *item, int column) { - //QtProperty *selectedProperty = propertyEditor->itemToBrowserItem(item)->property(); - //ElementType type = getElementTypeByName(selectedProperty->propertyId()); - //LazyTreeItem *it = treeModel->nodeForIdType(type, selectedProperty->valueText()); - //if (it) - // selectionModel->setCurrentIndex(treeModel->indexFromNode(it), QItemSelectionModel::ClearAndSelect); + QtProperty *selectedProperty = propertyEditor->itemToBrowserItem(item)->property(); + ElementType type = getElementTypeByName(selectedProperty->propertyId()); + auto it = treeModel->nodeForIdType(type, ctx->id(selectedProperty->valueText().toStdString())); + if (it) + selectionModel->setCurrentIndex(treeModel->indexFromNode(*it), QItemSelectionModel::ClearAndSelect); } void DesignWidget::onDoubleClicked(const QModelIndex &index) { Q_EMIT zoomSelected(); } -- cgit v1.2.3 From c728cdcae0e73c3046628838dc318f1d92c65b79 Mon Sep 17 00:00:00 2001 From: Sergiusz Bazanski Date: Wed, 1 Aug 2018 02:11:23 +0100 Subject: gui: restore menu for new tree model --- gui/designwidget.cc | 97 +++++++++++++++++++++++++++-------------------------- 1 file changed, 50 insertions(+), 47 deletions(-) (limited to 'gui/designwidget.cc') diff --git a/gui/designwidget.cc b/gui/designwidget.cc index fe99a3c2..d5c0c963 100644 --- a/gui/designwidget.cc +++ b/gui/designwidget.cc @@ -630,53 +630,56 @@ void DesignWidget::updateHighlightGroup(QList items, int group) void DesignWidget::prepareMenuProperty(const QPoint &pos) { - //QTreeWidget *tree = propertyEditor->treeWidget(); - //QList items; - //for (auto itemContextMenu : tree->selectedItems()) { - // QtBrowserItem *browserItem = propertyEditor->itemToBrowserItem(itemContextMenu); - // if (!browserItem) - // continue; - // QtProperty *selectedProperty = browserItem->property(); - // ElementType type = getElementTypeByName(selectedProperty->propertyId()); - // if (type == ElementType::NONE) - // continue; - // IdString value = ctx->id(selectedProperty->valueText().toStdString()); - // items.append(treeModel->nodeForIdType(type, value.c_str(ctx))); - //} - //int selectedIndex = -1; - //if (items.size() == 1) { - // LazyTreeItem *item = items.at(0); - // if (highlightSelected.contains(item)) - // selectedIndex = highlightSelected[item]; - //} - - //QMenu menu(this); - //QAction *selectAction = new QAction("&Select", this); - //connect(selectAction, &QAction::triggered, this, [this, items] { - // std::vector decals; - // for (auto clickItem : items) { - // std::vector d = getDecals(clickItem->type(), clickItem->id()); - // std::move(d.begin(), d.end(), std::back_inserter(decals)); - // } - // Q_EMIT selected(decals, false); - //}); - //menu.addAction(selectAction); - - //QMenu *subMenu = menu.addMenu("Highlight"); - //QActionGroup *group = new QActionGroup(this); - //group->setExclusive(true); - //for (int i = 0; i < 8; i++) { - // QPixmap pixmap(32, 32); - // pixmap.fill(QColor(highlightColors[i])); - // QAction *action = new QAction(QIcon(pixmap), ("Group " + std::to_string(i)).c_str(), this); - // action->setCheckable(true); - // subMenu->addAction(action); - // group->addAction(action); - // if (selectedIndex == i) - // action->setChecked(true); - // connect(action, &QAction::triggered, this, [this, i, items] { updateHighlightGroup(items, i); }); - //} - //menu.exec(tree->mapToGlobal(pos)); + QTreeWidget *tree = propertyEditor->treeWidget(); + QList items; + for (auto itemContextMenu : tree->selectedItems()) { + QtBrowserItem *browserItem = propertyEditor->itemToBrowserItem(itemContextMenu); + if (!browserItem) + continue; + QtProperty *selectedProperty = browserItem->property(); + ElementType type = getElementTypeByName(selectedProperty->propertyId()); + if (type == ElementType::NONE) + continue; + IdString value = ctx->id(selectedProperty->valueText().toStdString()); + auto node = treeModel->nodeForIdType(type, value); + if (!node) + continue; + items.append(*node); + } + int selectedIndex = -1; + if (items.size() == 1) { + LazyTreeItem *item = items.at(0); + if (highlightSelected.contains(item)) + selectedIndex = highlightSelected[item]; + } + + QMenu menu(this); + QAction *selectAction = new QAction("&Select", this); + connect(selectAction, &QAction::triggered, this, [this, items] { + std::vector decals; + for (auto clickItem : items) { + std::vector d = getDecals(clickItem->type(), clickItem->id()); + std::move(d.begin(), d.end(), std::back_inserter(decals)); + } + Q_EMIT selected(decals, false); + }); + menu.addAction(selectAction); + + QMenu *subMenu = menu.addMenu("Highlight"); + QActionGroup *group = new QActionGroup(this); + group->setExclusive(true); + for (int i = 0; i < 8; i++) { + QPixmap pixmap(32, 32); + pixmap.fill(QColor(highlightColors[i])); + QAction *action = new QAction(QIcon(pixmap), ("Group " + std::to_string(i)).c_str(), this); + action->setCheckable(true); + subMenu->addAction(action); + group->addAction(action); + if (selectedIndex == i) + action->setChecked(true); + connect(action, &QAction::triggered, this, [this, i, items] { updateHighlightGroup(items, i); }); + } + menu.exec(tree->mapToGlobal(pos)); } void DesignWidget::prepareMenuTree(const QPoint &pos) -- cgit v1.2.3 From 6baf8216ed1c6bd730a130a4aa4ad489ad70b2a7 Mon Sep 17 00:00:00 2001 From: Sergiusz Bazanski Date: Wed, 1 Aug 2018 02:19:30 +0100 Subject: gui: move tree model into own namespace --- gui/designwidget.cc | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) (limited to 'gui/designwidget.cc') diff --git a/gui/designwidget.cc b/gui/designwidget.cc index d5c0c963..c75991eb 100644 --- a/gui/designwidget.cc +++ b/gui/designwidget.cc @@ -34,7 +34,7 @@ DesignWidget::DesignWidget(QWidget *parent) : QWidget(parent), ctx(nullptr), sel { // Add tree view treeView = new QTreeView(); - treeModel = new ContextTreeModel(); + treeModel = new TreeModel::Model(); treeView->setModel(treeModel); treeView->setContextMenuPolicy(Qt::CustomContextMenu); treeView->setSelectionMode(QAbstractItemView::ExtendedSelection); @@ -223,9 +223,9 @@ void DesignWidget::updateTree() { clearProperties(); - QMap::iterator i = highlightSelected.begin(); + QMap::iterator i = highlightSelected.begin(); while (i != highlightSelected.end()) { - QMap::iterator prev = i; + QMap::iterator prev = i; ++i; if (prev.key()->type() == ElementType::NET && ctx->nets.find(prev.key()->id()) == ctx->nets.end()) { highlightSelected.erase(prev); @@ -348,7 +348,7 @@ void DesignWidget::onSelectionChanged(const QItemSelection &, const QItemSelecti if (selectionModel->selectedIndexes().size() > 1) { std::vector decals; for (auto index : selectionModel->selectedIndexes()) { - LazyTreeItem *item = treeModel->nodeFromIndex(index); + TreeModel::Item *item = treeModel->nodeFromIndex(index); std::vector d = getDecals(item->type(), item->id()); std::move(d.begin(), d.end(), std::back_inserter(decals)); } @@ -358,7 +358,7 @@ void DesignWidget::onSelectionChanged(const QItemSelection &, const QItemSelecti QModelIndex index = selectionModel->selectedIndexes().at(0); if (!index.isValid()) return; - LazyTreeItem *clickItem = treeModel->nodeFromIndex(index); + TreeModel::Item *clickItem = treeModel->nodeFromIndex(index); ElementType type = clickItem->type(); if (type == ElementType::NONE) @@ -606,7 +606,7 @@ std::vector DesignWidget::getDecals(ElementType type, IdString value) return decals; } -void DesignWidget::updateHighlightGroup(QList items, int group) +void DesignWidget::updateHighlightGroup(QList items, int group) { const bool shouldClear = items.size() == 1; for (auto item : items) { @@ -631,7 +631,7 @@ void DesignWidget::updateHighlightGroup(QList items, int group) void DesignWidget::prepareMenuProperty(const QPoint &pos) { QTreeWidget *tree = propertyEditor->treeWidget(); - QList items; + QList items; for (auto itemContextMenu : tree->selectedItems()) { QtBrowserItem *browserItem = propertyEditor->itemToBrowserItem(itemContextMenu); if (!browserItem) @@ -648,7 +648,7 @@ void DesignWidget::prepareMenuProperty(const QPoint &pos) } int selectedIndex = -1; if (items.size() == 1) { - LazyTreeItem *item = items.at(0); + TreeModel::Item *item = items.at(0); if (highlightSelected.contains(item)) selectedIndex = highlightSelected[item]; } @@ -689,13 +689,13 @@ void DesignWidget::prepareMenuTree(const QPoint &pos) if (selectionModel->selectedIndexes().size() == 0) return; - QList items; + QList items; for (auto index : selectionModel->selectedIndexes()) { - LazyTreeItem *item = treeModel->nodeFromIndex(index); + TreeModel::Item *item = treeModel->nodeFromIndex(index); items.append(item); } if (items.size() == 1) { - LazyTreeItem *item = items.at(0); + TreeModel::Item *item = items.at(0); if (highlightSelected.contains(item)) selectedIndex = highlightSelected[item]; } -- cgit v1.2.3 From f9d30bcdea72e4860361d8ab350282703dc3bfcf Mon Sep 17 00:00:00 2001 From: Sergiusz Bazanski Date: Wed, 1 Aug 2018 03:26:27 +0100 Subject: gui: lock arch when accessing/building treemodel --- gui/designwidget.cc | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) (limited to 'gui/designwidget.cc') diff --git a/gui/designwidget.cc b/gui/designwidget.cc index c75991eb..34e358ae 100644 --- a/gui/designwidget.cc +++ b/gui/designwidget.cc @@ -215,7 +215,11 @@ void DesignWidget::newContext(Context *ctx) highlightSelected.clear(); this->ctx = ctx; - treeModel->loadContext(ctx); + { + std::lock_guard lock_ui(ctx->ui_mutex); + std::lock_guard lock(ctx->mutex); + treeModel->loadContext(ctx); + } updateTree(); } @@ -235,7 +239,11 @@ void DesignWidget::updateTree() } } - treeModel->updateCellsNets(ctx); + { + std::lock_guard lock_ui(ctx->ui_mutex); + std::lock_guard lock(ctx->mutex); + treeModel->updateCellsNets(ctx); + } } QtProperty *DesignWidget::addTopLevelProperty(const QString &id) { @@ -735,6 +743,9 @@ void DesignWidget::onSearchInserted() if (currentIndex >= currentSearchIndexes.size()) currentIndex = 0; } else { + std::lock_guard lock_ui(ctx->ui_mutex); + std::lock_guard lock(ctx->mutex); + currentSearch = searchEdit->text(); currentSearchIndexes = treeModel->search(searchEdit->text()); currentIndex = 0; -- cgit v1.2.3