From 5d5324c073a2795689410a2baabff5cd1f0ff9a8 Mon Sep 17 00:00:00 2001 From: Miodrag Milanovic Date: Sat, 20 Oct 2018 15:15:23 +0200 Subject: Split tree models and make other features work with it --- gui/designwidget.cc | 187 ++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 130 insertions(+), 57 deletions(-) (limited to 'gui/designwidget.cc') diff --git a/gui/designwidget.cc b/gui/designwidget.cc index a45752fc..a75147d0 100644 --- a/gui/designwidget.cc +++ b/gui/designwidget.cc @@ -46,15 +46,29 @@ void TreeView::mouseMoveEvent(QMouseEvent *event) void TreeView::leaveEvent(QEvent *event) { Q_EMIT hoverIndexChanged(QModelIndex()); } -DesignWidget::DesignWidget(QWidget *parent) : QWidget(parent), ctx(nullptr), selectionModel(nullptr) +DesignWidget::DesignWidget(QWidget *parent) : QWidget(parent), ctx(nullptr) { + tabWidget = new QTabWidget(); + // Add tree view - treeView = new TreeView(); - treeModel = new TreeModel::Model(); - treeView->setModel(treeModel); - treeView->setContextMenuPolicy(Qt::CustomContextMenu); - treeView->setSelectionMode(QAbstractItemView::ExtendedSelection); - treeView->viewport()->setMouseTracking(true); + for(int i=0;i<6;i++) + { + treeView[i] = new TreeView(); + treeModel[i] = new TreeModel::Model(); + treeView[i]->setModel(treeModel[i]); + treeView[i]->setContextMenuPolicy(Qt::CustomContextMenu); + treeView[i]->setSelectionMode(QAbstractItemView::ExtendedSelection); + treeView[i]->viewport()->setMouseTracking(true); + selectionModel[i] = nullptr; + } + + tabWidget->addTab(treeView[0], "Bels"); + tabWidget->addTab(treeView[1], "Wires"); + tabWidget->addTab(treeView[2], "Pips"); + tabWidget->addTab(treeView[3], "Cells"); + tabWidget->addTab(treeView[4], "Nets"); + tabWidget->addTab(treeView[5], "Groups"); + // Add property view variantManager = new QtVariantPropertyManager(this); readOnlyManager = new QtVariantPropertyManager(this); @@ -80,7 +94,9 @@ DesignWidget::DesignWidget(QWidget *parent) : QWidget(parent), ctx(nullptr), sel connect(actionFirst, &QAction::triggered, this, [this] { history_ignore = true; history_index = 0; - selectionModel->setCurrentIndex(history.at(history_index), QItemSelectionModel::ClearAndSelect); + auto h = history.at(history_index); + selectionModel[h.first]->setCurrentIndex(h.second, QItemSelectionModel::ClearAndSelect); + if (tabWidget->currentIndex()!=h.first) tabWidget->setCurrentIndex(h.first); updateButtons(); }); @@ -90,7 +106,9 @@ DesignWidget::DesignWidget(QWidget *parent) : QWidget(parent), ctx(nullptr), sel connect(actionPrev, &QAction::triggered, this, [this] { history_ignore = true; history_index--; - selectionModel->setCurrentIndex(history.at(history_index), QItemSelectionModel::ClearAndSelect); + auto h = history.at(history_index); + selectionModel[h.first]->setCurrentIndex(h.second, QItemSelectionModel::ClearAndSelect); + if (tabWidget->currentIndex()!=h.first) tabWidget->setCurrentIndex(h.first); updateButtons(); }); @@ -100,7 +118,9 @@ DesignWidget::DesignWidget(QWidget *parent) : QWidget(parent), ctx(nullptr), sel connect(actionNext, &QAction::triggered, this, [this] { history_ignore = true; history_index++; - selectionModel->setCurrentIndex(history.at(history_index), QItemSelectionModel::ClearAndSelect); + auto h = history.at(history_index); + selectionModel[h.first]->setCurrentIndex(h.second, QItemSelectionModel::ClearAndSelect); + if (tabWidget->currentIndex()!=h.first) tabWidget->setCurrentIndex(h.first); updateButtons(); }); @@ -110,7 +130,9 @@ DesignWidget::DesignWidget(QWidget *parent) : QWidget(parent), ctx(nullptr), sel connect(actionLast, &QAction::triggered, this, [this] { history_ignore = true; history_index = int(history.size() - 1); - selectionModel->setCurrentIndex(history.at(history_index), QItemSelectionModel::ClearAndSelect); + auto h = history.at(history_index); + selectionModel[h.first]->setCurrentIndex(h.second, QItemSelectionModel::ClearAndSelect); + if (tabWidget->currentIndex()!=h.first) tabWidget->setCurrentIndex(h.first); updateButtons(); }); @@ -120,11 +142,15 @@ DesignWidget::DesignWidget(QWidget *parent) : QWidget(parent), ctx(nullptr), sel connect(actionClear, &QAction::triggered, this, [this] { history_index = -1; history.clear(); - QModelIndex index = selectionModel->selectedIndexes().at(0); - if (index.isValid()) { - ElementType type = treeModel->nodeFromIndex(index)->type(); - if (type != ElementType::NONE) - addToHistory(index); + int num = tabWidget->currentIndex(); + if (selectionModel[num]->selectedIndexes().size()> 0) + { + QModelIndex index = selectionModel[num]->selectedIndexes().at(0); + if (index.isValid()) { + ElementType type = treeModel[num]->nodeFromIndex(index)->type(); + if (type != ElementType::NONE) + addToHistory(num, index); + } } updateButtons(); }); @@ -142,7 +168,7 @@ DesignWidget::DesignWidget(QWidget *parent) : QWidget(parent), ctx(nullptr), sel vbox1->setSpacing(5); vbox1->setContentsMargins(0, 0, 0, 0); vbox1->addWidget(searchEdit); - vbox1->addWidget(treeView); + vbox1->addWidget(tabWidget); QWidget *toolbarWidget = new QWidget(); QHBoxLayout *hbox = new QHBoxLayout; @@ -177,12 +203,14 @@ DesignWidget::DesignWidget(QWidget *parent) : QWidget(parent), ctx(nullptr), sel connect(propertyEditor->treeWidget(), &QTreeWidget::itemDoubleClicked, this, &DesignWidget::onItemDoubleClicked); connect(propertyEditor, &QtTreePropertyBrowser::hoverPropertyChanged, this, &DesignWidget::onHoverPropertyChanged); - connect(treeView, &TreeView::customContextMenuRequested, this, &DesignWidget::prepareMenuTree); - connect(treeView, &TreeView::doubleClicked, this, &DesignWidget::onDoubleClicked); - connect(treeView, &TreeView::hoverIndexChanged, this, &DesignWidget::onHoverIndexChanged); - selectionModel = treeView->selectionModel(); - connect(selectionModel, &QItemSelectionModel::selectionChanged, this, &DesignWidget::onSelectionChanged); - + for(int num=0;num<6;num++) { + connect(treeView[num], &TreeView::customContextMenuRequested, [this,num](const QPoint &pos) { prepareMenuTree(num, pos); }); + connect(treeView[num], &TreeView::doubleClicked, [this](const QModelIndex &index) { onDoubleClicked(index); } ); + connect(treeView[num], &TreeView::hoverIndexChanged, [this,num](QModelIndex index) { onHoverIndexChanged(num, index); } ); + selectionModel[num] = treeView[num]->selectionModel(); + connect(selectionModel[num], &QItemSelectionModel::selectionChanged, [this,num](const QItemSelection &selected, const QItemSelection &deselected) { onSelectionChanged(num, selected, deselected); }); + } + history_index = -1; history_ignore = false; @@ -207,13 +235,13 @@ void DesignWidget::updateButtons() actionLast->setEnabled(history_index < (count - 1)); } -void DesignWidget::addToHistory(QModelIndex item) +void DesignWidget::addToHistory(int tab, QModelIndex item) { if (!history_ignore) { int count = int(history.size()); for (int i = count - 1; i > history_index; i--) history.pop_back(); - history.push_back(item); + history.push_back(std::make_pair(tab,item)); history_index++; } history_ignore = false; @@ -236,7 +264,12 @@ void DesignWidget::newContext(Context *ctx) { std::lock_guard lock_ui(ctx->ui_mutex); std::lock_guard lock(ctx->mutex); - treeModel->loadContext(ctx); + + getTreeByElementType(ElementType::BEL)->loadContext(ElementType::BEL, ctx); + getTreeByElementType(ElementType::WIRE)->loadContext(ElementType::WIRE, ctx); + getTreeByElementType(ElementType::PIP)->loadContext(ElementType::PIP, ctx); + getTreeByElementType(ElementType::CELL)->loadContext(ElementType::CELL, ctx); + getTreeByElementType(ElementType::NET)->loadContext(ElementType::NET, ctx); } updateTree(); } @@ -260,7 +293,8 @@ void DesignWidget::updateTree() { std::lock_guard lock_ui(ctx->ui_mutex); std::lock_guard lock(ctx->mutex); - treeModel->updateCellsNets(ctx); + getTreeByElementType(ElementType::CELL)->updateCells(ctx); + getTreeByElementType(ElementType::NET)->updateNets(ctx); } } QtProperty *DesignWidget::addTopLevelProperty(const QString &id) @@ -315,6 +349,38 @@ ElementType DesignWidget::getElementTypeByName(QString type) return ElementType::NONE; } +TreeModel::Model *DesignWidget::getTreeByElementType(ElementType type) +{ + if (type == ElementType::NONE) + return nullptr; + if (type == ElementType::BEL) + return treeModel[0]; + if (type == ElementType::WIRE) + return treeModel[1]; + if (type == ElementType::PIP) + return treeModel[2]; + if (type == ElementType::NET) + return treeModel[3]; + if (type == ElementType::CELL) + return treeModel[4]; + return nullptr; +} +int DesignWidget::getIndexByElementType(ElementType type) +{ + if (type == ElementType::NONE) + return -1; + if (type == ElementType::BEL) + return 0; + if (type == ElementType::WIRE) + return 1; + if (type == ElementType::PIP) + return 2; + if (type == ElementType::NET) + return 3; + if (type == ElementType::CELL) + return 4; + return -1; +} void DesignWidget::addProperty(QtProperty *topItem, int propertyType, const QString &name, QVariant value, const ElementType &type) { @@ -340,13 +406,14 @@ void DesignWidget::onClickedBel(BelId bel, bool keep) std::lock_guard lock_ui(ctx->ui_mutex); std::lock_guard lock(ctx->mutex); - item = treeModel->nodeForIdType(ElementType::BEL, ctx->getBelName(bel)); + item = getTreeByElementType(ElementType::BEL)->nodeForIdType(ElementType::BEL, ctx->getBelName(bel)); if (!item) return; Q_EMIT selected(getDecals(ElementType::BEL, ctx->getBelName(bel)), keep); } - selectionModel->setCurrentIndex(treeModel->indexFromNode(*item), + if (tabWidget->currentIndex()!=0) tabWidget->setCurrentIndex(0); + selectionModel[0]->setCurrentIndex(getTreeByElementType(ElementType::BEL)->indexFromNode(*item), keep ? QItemSelectionModel::Select : QItemSelectionModel::ClearAndSelect); } @@ -357,13 +424,14 @@ void DesignWidget::onClickedWire(WireId wire, bool keep) std::lock_guard lock_ui(ctx->ui_mutex); std::lock_guard lock(ctx->mutex); - item = treeModel->nodeForIdType(ElementType::WIRE, ctx->getWireName(wire)); + item = getTreeByElementType(ElementType::WIRE)->nodeForIdType(ElementType::WIRE, ctx->getWireName(wire)); if (!item) return; Q_EMIT selected(getDecals(ElementType::WIRE, ctx->getWireName(wire)), keep); } - selectionModel->setCurrentIndex(treeModel->indexFromNode(*item), + if (tabWidget->currentIndex()!=1) tabWidget->setCurrentIndex(1); + selectionModel[1]->setCurrentIndex(getTreeByElementType(ElementType::WIRE)->indexFromNode(*item), keep ? QItemSelectionModel::Select : QItemSelectionModel::ClearAndSelect); } @@ -374,41 +442,42 @@ void DesignWidget::onClickedPip(PipId pip, bool keep) std::lock_guard lock_ui(ctx->ui_mutex); std::lock_guard lock(ctx->mutex); - item = treeModel->nodeForIdType(ElementType::PIP, ctx->getPipName(pip)); + item = getTreeByElementType(ElementType::PIP)->nodeForIdType(ElementType::PIP, ctx->getPipName(pip)); if (!item) return; Q_EMIT selected(getDecals(ElementType::PIP, ctx->getPipName(pip)), keep); } - selectionModel->setCurrentIndex(treeModel->indexFromNode(*item), + if (tabWidget->currentIndex()!=2) tabWidget->setCurrentIndex(2); + selectionModel[2]->setCurrentIndex(getTreeByElementType(ElementType::PIP)->indexFromNode(*item), keep ? QItemSelectionModel::Select : QItemSelectionModel::ClearAndSelect); } -void DesignWidget::onSelectionChanged(const QItemSelection &, const QItemSelection &) +void DesignWidget::onSelectionChanged(int num, const QItemSelection &, const QItemSelection &) { - if (selectionModel->selectedIndexes().size() == 0) + if (selectionModel[num]->selectedIndexes().size() == 0) return; - if (selectionModel->selectedIndexes().size() > 1) { + if (selectionModel[num]->selectedIndexes().size() > 1) { std::vector decals; - for (auto index : selectionModel->selectedIndexes()) { - TreeModel::Item *item = treeModel->nodeFromIndex(index); + for (auto index : selectionModel[num]->selectedIndexes()) { + TreeModel::Item *item = treeModel[num]->nodeFromIndex(index); std::vector d = getDecals(item->type(), item->id()); std::move(d.begin(), d.end(), std::back_inserter(decals)); } Q_EMIT selected(decals, false); return; } - QModelIndex index = selectionModel->selectedIndexes().at(0); + QModelIndex index = selectionModel[num]->selectedIndexes().at(0); if (!index.isValid()) return; - TreeModel::Item *clickItem = treeModel->nodeFromIndex(index); + TreeModel::Item *clickItem = treeModel[num]->nodeFromIndex(index); ElementType type = clickItem->type(); if (type == ElementType::NONE) return; - addToHistory(index); + addToHistory(num, index); clearProperties(); @@ -667,7 +736,7 @@ std::vector DesignWidget::getDecals(ElementType type, IdString value) } } } break; - case ElementType::CELL: { + case ElementType::CELL: { CellInfo *cell = ctx->cells.at(value).get(); if (cell->bel != BelId()) { decals.push_back(ctx->getBelDecal(cell->bel)); @@ -714,7 +783,7 @@ void DesignWidget::prepareMenuProperty(const QPoint &pos) if (type == ElementType::NONE) continue; IdString value = ctx->id(selectedProperty->valueText().toStdString()); - auto node = treeModel->nodeForIdType(type, value); + auto node = getTreeByElementType(type)->nodeForIdType(type, value); if (!node) continue; items.append(*node); @@ -755,16 +824,16 @@ void DesignWidget::prepareMenuProperty(const QPoint &pos) menu.exec(tree->mapToGlobal(pos)); } -void DesignWidget::prepareMenuTree(const QPoint &pos) +void DesignWidget::prepareMenuTree(int num, const QPoint &pos) { int selectedIndex = -1; - if (selectionModel->selectedIndexes().size() == 0) + if (selectionModel[num]->selectedIndexes().size() == 0) return; QList items; - for (auto index : selectionModel->selectedIndexes()) { - TreeModel::Item *item = treeModel->nodeFromIndex(index); + for (auto index : selectionModel[num]->selectedIndexes()) { + TreeModel::Item *item = treeModel[num]->nodeFromIndex(index); items.append(item); } if (items.size() == 1) { @@ -787,23 +856,26 @@ void DesignWidget::prepareMenuTree(const QPoint &pos) action->setChecked(true); connect(action, &QAction::triggered, this, [this, i, items] { updateHighlightGroup(items, i); }); } - menu.exec(treeView->mapToGlobal(pos)); + menu.exec(treeView[num]->mapToGlobal(pos)); } void DesignWidget::onItemDoubleClicked(QTreeWidgetItem *item, int column) { 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); + auto it = getTreeByElementType(type)->nodeForIdType(type, ctx->id(selectedProperty->valueText().toStdString())); + if (it) { + int num = getIndexByElementType(type); + if (tabWidget->currentIndex()!=num) tabWidget->setCurrentIndex(num); + selectionModel[num]->setCurrentIndex(getTreeByElementType(type)->indexFromNode(*it), QItemSelectionModel::ClearAndSelect); + } } void DesignWidget::onDoubleClicked(const QModelIndex &index) { Q_EMIT zoomSelected(); } void DesignWidget::onSearchInserted() { - if (currentSearch == searchEdit->text()) { + if (currentSearch == searchEdit->text() && currentIndexTab == tabWidget->currentIndex()) { currentIndex++; if (currentIndex >= currentSearchIndexes.size()) currentIndex = 0; @@ -812,17 +884,18 @@ void DesignWidget::onSearchInserted() std::lock_guard lock(ctx->mutex); currentSearch = searchEdit->text(); - currentSearchIndexes = treeModel->search(searchEdit->text()); + currentSearchIndexes = treeModel[tabWidget->currentIndex()]->search(searchEdit->text()); currentIndex = 0; + currentIndexTab = tabWidget->currentIndex(); } if (currentSearchIndexes.size() > 0 && currentIndex < currentSearchIndexes.size()) - selectionModel->setCurrentIndex(currentSearchIndexes.at(currentIndex), QItemSelectionModel::ClearAndSelect); + selectionModel[tabWidget->currentIndex()]->setCurrentIndex(currentSearchIndexes.at(currentIndex), QItemSelectionModel::ClearAndSelect); } -void DesignWidget::onHoverIndexChanged(QModelIndex index) +void DesignWidget::onHoverIndexChanged(int num, QModelIndex index) { if (index.isValid()) { - TreeModel::Item *item = treeModel->nodeFromIndex(index); + TreeModel::Item *item = treeModel[num]->nodeFromIndex(index); if (item->type() != ElementType::NONE) { std::vector decals = getDecals(item->type(), item->id()); if (decals.size() > 0) @@ -841,7 +914,7 @@ void DesignWidget::onHoverPropertyChanged(QtBrowserItem *item) if (type != ElementType::NONE) { IdString value = ctx->id(selectedProperty->valueText().toStdString()); if (value != IdString()) { - auto node = treeModel->nodeForIdType(type, value); + auto node = getTreeByElementType(type)->nodeForIdType(type, value); if (node) { std::vector decals = getDecals((*node)->type(), (*node)->id()); if (decals.size() > 0) -- cgit v1.2.3 From ba0ab7cb3069b76c2f6644afb211f66c54c7208c Mon Sep 17 00:00:00 2001 From: Miodrag Milanovic Date: Sat, 20 Oct 2018 16:52:38 +0200 Subject: simplify and move arround --- gui/designwidget.cc | 62 +++++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 51 insertions(+), 11 deletions(-) (limited to 'gui/designwidget.cc') diff --git a/gui/designwidget.cc b/gui/designwidget.cc index a75147d0..300c8271 100644 --- a/gui/designwidget.cc +++ b/gui/designwidget.cc @@ -265,11 +265,49 @@ void DesignWidget::newContext(Context *ctx) std::lock_guard lock_ui(ctx->ui_mutex); std::lock_guard lock(ctx->mutex); - getTreeByElementType(ElementType::BEL)->loadContext(ElementType::BEL, ctx); - getTreeByElementType(ElementType::WIRE)->loadContext(ElementType::WIRE, ctx); - getTreeByElementType(ElementType::PIP)->loadContext(ElementType::PIP, ctx); - getTreeByElementType(ElementType::CELL)->loadContext(ElementType::CELL, ctx); - getTreeByElementType(ElementType::NET)->loadContext(ElementType::NET, ctx); + { + std::map, std::vector> belMap; + for (auto bel : ctx->getBels()) { + auto loc = ctx->getBelLocation(bel); + belMap[std::pair(loc.x, loc.y)].push_back(bel); + } + auto belGetter = [](Context *ctx, BelId id) { return ctx->getBelName(id); }; + + getTreeByElementType(ElementType::BEL)->loadData(std::unique_ptr>( + new TreeModel::ElementXYRoot(ctx, belMap, belGetter, ElementType::BEL))); + } + +#ifdef ARCH_ICE40 + { + std::map, std::vector> wireMap; + for (int i = 0; i < ctx->chip_info->num_wires; i++) { + const auto wire = &ctx->chip_info->wire_data[i]; + WireId wireid; + wireid.index = i; + wireMap[std::pair(wire->x, wire->y)].push_back(wireid); + } + auto wireGetter = [](Context *ctx, WireId id) { return ctx->getWireName(id); }; + getTreeByElementType(ElementType::WIRE)->loadData(std::unique_ptr>( + new TreeModel::ElementXYRoot(ctx, wireMap, wireGetter, ElementType::WIRE))); + } + + { + std::map, std::vector> pipMap; + for (int i = 0; i < ctx->chip_info->num_pips; i++) { + const auto pip = &ctx->chip_info->pip_data[i]; + PipId pipid; + pipid.index = i; + pipMap[std::pair(pip->x, pip->y)].push_back(pipid); + } + auto pipGetter = [](Context *ctx, PipId id) { return ctx->getPipName(id); }; + getTreeByElementType(ElementType::PIP)->loadData(std::unique_ptr>( + new TreeModel::ElementXYRoot(ctx, pipMap, pipGetter, ElementType::PIP))); + } +#endif + getTreeByElementType(ElementType::CELL)->loadData(std::unique_ptr(new TreeModel::IdStringList(ElementType::CELL))); + getTreeByElementType(ElementType::NET)->loadData(std::unique_ptr(new TreeModel::IdStringList(ElementType::NET))); + getTreeByElementType(ElementType::CELL)->updateCells(ctx); + getTreeByElementType(ElementType::NET)->updateNets(ctx); } updateTree(); } @@ -406,7 +444,7 @@ void DesignWidget::onClickedBel(BelId bel, bool keep) std::lock_guard lock_ui(ctx->ui_mutex); std::lock_guard lock(ctx->mutex); - item = getTreeByElementType(ElementType::BEL)->nodeForIdType(ElementType::BEL, ctx->getBelName(bel)); + item = getTreeByElementType(ElementType::BEL)->nodeForId(ctx->getBelName(bel)); if (!item) return; @@ -424,7 +462,7 @@ void DesignWidget::onClickedWire(WireId wire, bool keep) std::lock_guard lock_ui(ctx->ui_mutex); std::lock_guard lock(ctx->mutex); - item = getTreeByElementType(ElementType::WIRE)->nodeForIdType(ElementType::WIRE, ctx->getWireName(wire)); + item = getTreeByElementType(ElementType::WIRE)->nodeForId(ctx->getWireName(wire)); if (!item) return; @@ -442,7 +480,7 @@ void DesignWidget::onClickedPip(PipId pip, bool keep) std::lock_guard lock_ui(ctx->ui_mutex); std::lock_guard lock(ctx->mutex); - item = getTreeByElementType(ElementType::PIP)->nodeForIdType(ElementType::PIP, ctx->getPipName(pip)); + item = getTreeByElementType(ElementType::PIP)->nodeForId(ctx->getPipName(pip)); if (!item) return; @@ -783,7 +821,7 @@ void DesignWidget::prepareMenuProperty(const QPoint &pos) if (type == ElementType::NONE) continue; IdString value = ctx->id(selectedProperty->valueText().toStdString()); - auto node = getTreeByElementType(type)->nodeForIdType(type, value); + auto node = getTreeByElementType(type)->nodeForId(value); if (!node) continue; items.append(*node); @@ -863,7 +901,9 @@ void DesignWidget::onItemDoubleClicked(QTreeWidgetItem *item, int column) { QtProperty *selectedProperty = propertyEditor->itemToBrowserItem(item)->property(); ElementType type = getElementTypeByName(selectedProperty->propertyId()); - auto it = getTreeByElementType(type)->nodeForIdType(type, ctx->id(selectedProperty->valueText().toStdString())); + if (type == ElementType::NONE) + return; + auto it = getTreeByElementType(type)->nodeForId(ctx->id(selectedProperty->valueText().toStdString())); if (it) { int num = getIndexByElementType(type); if (tabWidget->currentIndex()!=num) tabWidget->setCurrentIndex(num); @@ -914,7 +954,7 @@ void DesignWidget::onHoverPropertyChanged(QtBrowserItem *item) if (type != ElementType::NONE) { IdString value = ctx->id(selectedProperty->valueText().toStdString()); if (value != IdString()) { - auto node = getTreeByElementType(type)->nodeForIdType(type, value); + auto node = getTreeByElementType(type)->nodeForId(value); if (node) { std::vector decals = getDecals((*node)->type(), (*node)->id()); if (decals.size() > 0) -- cgit v1.2.3 From f43ee265e8d303d7b41b9b79036c3c2ba433877b Mon Sep 17 00:00:00 2001 From: Miodrag Milanovic Date: Sat, 20 Oct 2018 17:04:49 +0200 Subject: Cleanup --- gui/designwidget.cc | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) (limited to 'gui/designwidget.cc') diff --git a/gui/designwidget.cc b/gui/designwidget.cc index 300c8271..310fcdd6 100644 --- a/gui/designwidget.cc +++ b/gui/designwidget.cc @@ -306,8 +306,6 @@ void DesignWidget::newContext(Context *ctx) #endif getTreeByElementType(ElementType::CELL)->loadData(std::unique_ptr(new TreeModel::IdStringList(ElementType::CELL))); getTreeByElementType(ElementType::NET)->loadData(std::unique_ptr(new TreeModel::IdStringList(ElementType::NET))); - getTreeByElementType(ElementType::CELL)->updateCells(ctx); - getTreeByElementType(ElementType::NET)->updateNets(ctx); } updateTree(); } @@ -331,8 +329,18 @@ void DesignWidget::updateTree() { std::lock_guard lock_ui(ctx->ui_mutex); std::lock_guard lock(ctx->mutex); - getTreeByElementType(ElementType::CELL)->updateCells(ctx); - getTreeByElementType(ElementType::NET)->updateNets(ctx); + + std::vector cells; + for (auto &pair : ctx->cells) { + cells.push_back(pair.first); + } + std::vector nets; + for (auto &pair : ctx->nets) { + nets.push_back(pair.first); + } + + getTreeByElementType(ElementType::CELL)->updateElements(ctx, cells); + getTreeByElementType(ElementType::NET)->updateElements(ctx, nets); } } QtProperty *DesignWidget::addTopLevelProperty(const QString &id) -- cgit v1.2.3 From d08fe2109dcb7e037d4321f9804a5c0aeca3b87b Mon Sep 17 00:00:00 2001 From: Miodrag Milanovic Date: Sun, 21 Oct 2018 13:19:44 +0200 Subject: clangformat --- gui/designwidget.cc | 90 ++++++++++++++++++++++++++++++++--------------------- 1 file changed, 54 insertions(+), 36 deletions(-) (limited to 'gui/designwidget.cc') diff --git a/gui/designwidget.cc b/gui/designwidget.cc index 310fcdd6..e6baf090 100644 --- a/gui/designwidget.cc +++ b/gui/designwidget.cc @@ -51,8 +51,7 @@ DesignWidget::DesignWidget(QWidget *parent) : QWidget(parent), ctx(nullptr) tabWidget = new QTabWidget(); // Add tree view - for(int i=0;i<6;i++) - { + for (int i = 0; i < 6; i++) { treeView[i] = new TreeView(); treeModel[i] = new TreeModel::Model(); treeView[i]->setModel(treeModel[i]); @@ -96,7 +95,8 @@ DesignWidget::DesignWidget(QWidget *parent) : QWidget(parent), ctx(nullptr) history_index = 0; auto h = history.at(history_index); selectionModel[h.first]->setCurrentIndex(h.second, QItemSelectionModel::ClearAndSelect); - if (tabWidget->currentIndex()!=h.first) tabWidget->setCurrentIndex(h.first); + if (tabWidget->currentIndex() != h.first) + tabWidget->setCurrentIndex(h.first); updateButtons(); }); @@ -108,7 +108,8 @@ DesignWidget::DesignWidget(QWidget *parent) : QWidget(parent), ctx(nullptr) history_index--; auto h = history.at(history_index); selectionModel[h.first]->setCurrentIndex(h.second, QItemSelectionModel::ClearAndSelect); - if (tabWidget->currentIndex()!=h.first) tabWidget->setCurrentIndex(h.first); + if (tabWidget->currentIndex() != h.first) + tabWidget->setCurrentIndex(h.first); updateButtons(); }); @@ -120,7 +121,8 @@ DesignWidget::DesignWidget(QWidget *parent) : QWidget(parent), ctx(nullptr) history_index++; auto h = history.at(history_index); selectionModel[h.first]->setCurrentIndex(h.second, QItemSelectionModel::ClearAndSelect); - if (tabWidget->currentIndex()!=h.first) tabWidget->setCurrentIndex(h.first); + if (tabWidget->currentIndex() != h.first) + tabWidget->setCurrentIndex(h.first); updateButtons(); }); @@ -132,7 +134,8 @@ DesignWidget::DesignWidget(QWidget *parent) : QWidget(parent), ctx(nullptr) history_index = int(history.size() - 1); auto h = history.at(history_index); selectionModel[h.first]->setCurrentIndex(h.second, QItemSelectionModel::ClearAndSelect); - if (tabWidget->currentIndex()!=h.first) tabWidget->setCurrentIndex(h.first); + if (tabWidget->currentIndex() != h.first) + tabWidget->setCurrentIndex(h.first); updateButtons(); }); @@ -143,8 +146,7 @@ DesignWidget::DesignWidget(QWidget *parent) : QWidget(parent), ctx(nullptr) history_index = -1; history.clear(); int num = tabWidget->currentIndex(); - if (selectionModel[num]->selectedIndexes().size()> 0) - { + if (selectionModel[num]->selectedIndexes().size() > 0) { QModelIndex index = selectionModel[num]->selectedIndexes().at(0); if (index.isValid()) { ElementType type = treeModel[num]->nodeFromIndex(index)->type(); @@ -203,14 +205,19 @@ DesignWidget::DesignWidget(QWidget *parent) : QWidget(parent), ctx(nullptr) connect(propertyEditor->treeWidget(), &QTreeWidget::itemDoubleClicked, this, &DesignWidget::onItemDoubleClicked); connect(propertyEditor, &QtTreePropertyBrowser::hoverPropertyChanged, this, &DesignWidget::onHoverPropertyChanged); - for(int num=0;num<6;num++) { - connect(treeView[num], &TreeView::customContextMenuRequested, [this,num](const QPoint &pos) { prepareMenuTree(num, pos); }); - connect(treeView[num], &TreeView::doubleClicked, [this](const QModelIndex &index) { onDoubleClicked(index); } ); - connect(treeView[num], &TreeView::hoverIndexChanged, [this,num](QModelIndex index) { onHoverIndexChanged(num, index); } ); + for (int num = 0; num < 6; num++) { + connect(treeView[num], &TreeView::customContextMenuRequested, + [this, num](const QPoint &pos) { prepareMenuTree(num, pos); }); + connect(treeView[num], &TreeView::doubleClicked, [this](const QModelIndex &index) { onDoubleClicked(index); }); + connect(treeView[num], &TreeView::hoverIndexChanged, + [this, num](QModelIndex index) { onHoverIndexChanged(num, index); }); selectionModel[num] = treeView[num]->selectionModel(); - connect(selectionModel[num], &QItemSelectionModel::selectionChanged, [this,num](const QItemSelection &selected, const QItemSelection &deselected) { onSelectionChanged(num, selected, deselected); }); + connect(selectionModel[num], &QItemSelectionModel::selectionChanged, + [this, num](const QItemSelection &selected, const QItemSelection &deselected) { + onSelectionChanged(num, selected, deselected); + }); } - + history_index = -1; history_ignore = false; @@ -241,7 +248,7 @@ void DesignWidget::addToHistory(int tab, QModelIndex item) int count = int(history.size()); for (int i = count - 1; i > history_index; i--) history.pop_back(); - history.push_back(std::make_pair(tab,item)); + history.push_back(std::make_pair(tab, item)); history_index++; } history_ignore = false; @@ -264,7 +271,7 @@ void DesignWidget::newContext(Context *ctx) { std::lock_guard lock_ui(ctx->ui_mutex); std::lock_guard lock(ctx->mutex); - + { std::map, std::vector> belMap; for (auto bel : ctx->getBels()) { @@ -272,12 +279,13 @@ void DesignWidget::newContext(Context *ctx) belMap[std::pair(loc.x, loc.y)].push_back(bel); } auto belGetter = [](Context *ctx, BelId id) { return ctx->getBelName(id); }; - - getTreeByElementType(ElementType::BEL)->loadData(std::unique_ptr>( - new TreeModel::ElementXYRoot(ctx, belMap, belGetter, ElementType::BEL))); + + getTreeByElementType(ElementType::BEL) + ->loadData(std::unique_ptr>( + new TreeModel::ElementXYRoot(ctx, belMap, belGetter, ElementType::BEL))); } -#ifdef ARCH_ICE40 +#ifdef ARCH_ICE40 { std::map, std::vector> wireMap; for (int i = 0; i < ctx->chip_info->num_wires; i++) { @@ -287,8 +295,9 @@ void DesignWidget::newContext(Context *ctx) wireMap[std::pair(wire->x, wire->y)].push_back(wireid); } auto wireGetter = [](Context *ctx, WireId id) { return ctx->getWireName(id); }; - getTreeByElementType(ElementType::WIRE)->loadData(std::unique_ptr>( - new TreeModel::ElementXYRoot(ctx, wireMap, wireGetter, ElementType::WIRE))); + getTreeByElementType(ElementType::WIRE) + ->loadData(std::unique_ptr>( + new TreeModel::ElementXYRoot(ctx, wireMap, wireGetter, ElementType::WIRE))); } { @@ -300,12 +309,15 @@ void DesignWidget::newContext(Context *ctx) pipMap[std::pair(pip->x, pip->y)].push_back(pipid); } auto pipGetter = [](Context *ctx, PipId id) { return ctx->getPipName(id); }; - getTreeByElementType(ElementType::PIP)->loadData(std::unique_ptr>( - new TreeModel::ElementXYRoot(ctx, pipMap, pipGetter, ElementType::PIP))); + getTreeByElementType(ElementType::PIP) + ->loadData(std::unique_ptr>( + new TreeModel::ElementXYRoot(ctx, pipMap, pipGetter, ElementType::PIP))); } #endif - getTreeByElementType(ElementType::CELL)->loadData(std::unique_ptr(new TreeModel::IdStringList(ElementType::CELL))); - getTreeByElementType(ElementType::NET)->loadData(std::unique_ptr(new TreeModel::IdStringList(ElementType::NET))); + getTreeByElementType(ElementType::CELL) + ->loadData(std::unique_ptr(new TreeModel::IdStringList(ElementType::CELL))); + getTreeByElementType(ElementType::NET) + ->loadData(std::unique_ptr(new TreeModel::IdStringList(ElementType::NET))); } updateTree(); } @@ -458,9 +470,10 @@ void DesignWidget::onClickedBel(BelId bel, bool keep) Q_EMIT selected(getDecals(ElementType::BEL, ctx->getBelName(bel)), keep); } - if (tabWidget->currentIndex()!=0) tabWidget->setCurrentIndex(0); + if (tabWidget->currentIndex() != 0) + tabWidget->setCurrentIndex(0); selectionModel[0]->setCurrentIndex(getTreeByElementType(ElementType::BEL)->indexFromNode(*item), - keep ? QItemSelectionModel::Select : QItemSelectionModel::ClearAndSelect); + keep ? QItemSelectionModel::Select : QItemSelectionModel::ClearAndSelect); } void DesignWidget::onClickedWire(WireId wire, bool keep) @@ -476,9 +489,10 @@ void DesignWidget::onClickedWire(WireId wire, bool keep) Q_EMIT selected(getDecals(ElementType::WIRE, ctx->getWireName(wire)), keep); } - if (tabWidget->currentIndex()!=1) tabWidget->setCurrentIndex(1); + if (tabWidget->currentIndex() != 1) + tabWidget->setCurrentIndex(1); selectionModel[1]->setCurrentIndex(getTreeByElementType(ElementType::WIRE)->indexFromNode(*item), - keep ? QItemSelectionModel::Select : QItemSelectionModel::ClearAndSelect); + keep ? QItemSelectionModel::Select : QItemSelectionModel::ClearAndSelect); } void DesignWidget::onClickedPip(PipId pip, bool keep) @@ -494,9 +508,10 @@ void DesignWidget::onClickedPip(PipId pip, bool keep) Q_EMIT selected(getDecals(ElementType::PIP, ctx->getPipName(pip)), keep); } - if (tabWidget->currentIndex()!=2) tabWidget->setCurrentIndex(2); + if (tabWidget->currentIndex() != 2) + tabWidget->setCurrentIndex(2); selectionModel[2]->setCurrentIndex(getTreeByElementType(ElementType::PIP)->indexFromNode(*item), - keep ? QItemSelectionModel::Select : QItemSelectionModel::ClearAndSelect); + keep ? QItemSelectionModel::Select : QItemSelectionModel::ClearAndSelect); } void DesignWidget::onSelectionChanged(int num, const QItemSelection &, const QItemSelection &) @@ -782,7 +797,7 @@ std::vector DesignWidget::getDecals(ElementType type, IdString value) } } } break; - case ElementType::CELL: { + case ElementType::CELL: { CellInfo *cell = ctx->cells.at(value).get(); if (cell->bel != BelId()) { decals.push_back(ctx->getBelDecal(cell->bel)); @@ -914,8 +929,10 @@ void DesignWidget::onItemDoubleClicked(QTreeWidgetItem *item, int column) auto it = getTreeByElementType(type)->nodeForId(ctx->id(selectedProperty->valueText().toStdString())); if (it) { int num = getIndexByElementType(type); - if (tabWidget->currentIndex()!=num) tabWidget->setCurrentIndex(num); - selectionModel[num]->setCurrentIndex(getTreeByElementType(type)->indexFromNode(*it), QItemSelectionModel::ClearAndSelect); + if (tabWidget->currentIndex() != num) + tabWidget->setCurrentIndex(num); + selectionModel[num]->setCurrentIndex(getTreeByElementType(type)->indexFromNode(*it), + QItemSelectionModel::ClearAndSelect); } } @@ -937,7 +954,8 @@ void DesignWidget::onSearchInserted() currentIndexTab = tabWidget->currentIndex(); } if (currentSearchIndexes.size() > 0 && currentIndex < currentSearchIndexes.size()) - selectionModel[tabWidget->currentIndex()]->setCurrentIndex(currentSearchIndexes.at(currentIndex), QItemSelectionModel::ClearAndSelect); + selectionModel[tabWidget->currentIndex()]->setCurrentIndex(currentSearchIndexes.at(currentIndex), + QItemSelectionModel::ClearAndSelect); } void DesignWidget::onHoverIndexChanged(int num, QModelIndex index) -- cgit v1.2.3 From f66c5a0094c42ae57398f4d91eaba5f2b9015d55 Mon Sep 17 00:00:00 2001 From: Miodrag Milanovic Date: Sat, 27 Oct 2018 16:00:47 +0200 Subject: update properties based on move history --- gui/designwidget.cc | 54 ++++++++++++++++++++++++++++++++++++----------------- 1 file changed, 37 insertions(+), 17 deletions(-) (limited to 'gui/designwidget.cc') diff --git a/gui/designwidget.cc b/gui/designwidget.cc index e6baf090..5356258f 100644 --- a/gui/designwidget.cc +++ b/gui/designwidget.cc @@ -94,9 +94,13 @@ DesignWidget::DesignWidget(QWidget *parent) : QWidget(parent), ctx(nullptr) history_ignore = true; history_index = 0; auto h = history.at(history_index); - selectionModel[h.first]->setCurrentIndex(h.second, QItemSelectionModel::ClearAndSelect); - if (tabWidget->currentIndex() != h.first) + if (tabWidget->currentIndex() != h.first) { + selectionModel[tabWidget->currentIndex()]->clearSelection(); tabWidget->setCurrentIndex(h.first); + selectionModel[h.first]->setCurrentIndex(h.second, QItemSelectionModel::Select); + } else { + selectionModel[h.first]->setCurrentIndex(h.second, QItemSelectionModel::ClearAndSelect); + } updateButtons(); }); @@ -107,9 +111,13 @@ DesignWidget::DesignWidget(QWidget *parent) : QWidget(parent), ctx(nullptr) history_ignore = true; history_index--; auto h = history.at(history_index); - selectionModel[h.first]->setCurrentIndex(h.second, QItemSelectionModel::ClearAndSelect); - if (tabWidget->currentIndex() != h.first) + if (tabWidget->currentIndex() != h.first) { + selectionModel[tabWidget->currentIndex()]->clearSelection(); tabWidget->setCurrentIndex(h.first); + selectionModel[h.first]->setCurrentIndex(h.second, QItemSelectionModel::Select); + } else { + selectionModel[h.first]->setCurrentIndex(h.second, QItemSelectionModel::ClearAndSelect); + } updateButtons(); }); @@ -120,9 +128,13 @@ DesignWidget::DesignWidget(QWidget *parent) : QWidget(parent), ctx(nullptr) history_ignore = true; history_index++; auto h = history.at(history_index); - selectionModel[h.first]->setCurrentIndex(h.second, QItemSelectionModel::ClearAndSelect); - if (tabWidget->currentIndex() != h.first) + if (tabWidget->currentIndex() != h.first) { + selectionModel[tabWidget->currentIndex()]->clearSelection(); tabWidget->setCurrentIndex(h.first); + selectionModel[h.first]->setCurrentIndex(h.second, QItemSelectionModel::Select); + } else { + selectionModel[h.first]->setCurrentIndex(h.second, QItemSelectionModel::ClearAndSelect); + } updateButtons(); }); @@ -133,9 +145,13 @@ DesignWidget::DesignWidget(QWidget *parent) : QWidget(parent), ctx(nullptr) history_ignore = true; history_index = int(history.size() - 1); auto h = history.at(history_index); - selectionModel[h.first]->setCurrentIndex(h.second, QItemSelectionModel::ClearAndSelect); - if (tabWidget->currentIndex() != h.first) + if (tabWidget->currentIndex() != h.first) { + selectionModel[tabWidget->currentIndex()]->clearSelection(); tabWidget->setCurrentIndex(h.first); + selectionModel[h.first]->setCurrentIndex(h.second, QItemSelectionModel::Select); + } else { + selectionModel[h.first]->setCurrentIndex(h.second, QItemSelectionModel::ClearAndSelect); + } updateButtons(); }); @@ -470,9 +486,10 @@ void DesignWidget::onClickedBel(BelId bel, bool keep) Q_EMIT selected(getDecals(ElementType::BEL, ctx->getBelName(bel)), keep); } - if (tabWidget->currentIndex() != 0) - tabWidget->setCurrentIndex(0); - selectionModel[0]->setCurrentIndex(getTreeByElementType(ElementType::BEL)->indexFromNode(*item), + int index = getIndexByElementType(ElementType::BEL); + if (tabWidget->currentIndex() != index) + tabWidget->setCurrentIndex(index); + selectionModel[index]->setCurrentIndex(getTreeByElementType(ElementType::BEL)->indexFromNode(*item), keep ? QItemSelectionModel::Select : QItemSelectionModel::ClearAndSelect); } @@ -489,9 +506,10 @@ void DesignWidget::onClickedWire(WireId wire, bool keep) Q_EMIT selected(getDecals(ElementType::WIRE, ctx->getWireName(wire)), keep); } - if (tabWidget->currentIndex() != 1) - tabWidget->setCurrentIndex(1); - selectionModel[1]->setCurrentIndex(getTreeByElementType(ElementType::WIRE)->indexFromNode(*item), + int index = getIndexByElementType(ElementType::WIRE); + if (tabWidget->currentIndex() != index) + tabWidget->setCurrentIndex(index); + selectionModel[index]->setCurrentIndex(getTreeByElementType(ElementType::WIRE)->indexFromNode(*item), keep ? QItemSelectionModel::Select : QItemSelectionModel::ClearAndSelect); } @@ -508,9 +526,11 @@ void DesignWidget::onClickedPip(PipId pip, bool keep) Q_EMIT selected(getDecals(ElementType::PIP, ctx->getPipName(pip)), keep); } - if (tabWidget->currentIndex() != 2) - tabWidget->setCurrentIndex(2); - selectionModel[2]->setCurrentIndex(getTreeByElementType(ElementType::PIP)->indexFromNode(*item), + + int index = getIndexByElementType(ElementType::PIP); + if (tabWidget->currentIndex() != index) + tabWidget->setCurrentIndex(index); + selectionModel[index]->setCurrentIndex(getTreeByElementType(ElementType::PIP)->indexFromNode(*item), keep ? QItemSelectionModel::Select : QItemSelectionModel::ClearAndSelect); } -- cgit v1.2.3 From 436c2a0444a38b2f25e39a400de3bf805b6adbe8 Mon Sep 17 00:00:00 2001 From: Miodrag Milanovic Date: Sat, 27 Oct 2018 17:04:08 +0200 Subject: Fix keep selection on multiple trees --- gui/designwidget.cc | 40 ++++++++++++++++++++++++++++++++-------- 1 file changed, 32 insertions(+), 8 deletions(-) (limited to 'gui/designwidget.cc') diff --git a/gui/designwidget.cc b/gui/designwidget.cc index 5356258f..069f4cfa 100644 --- a/gui/designwidget.cc +++ b/gui/designwidget.cc @@ -487,8 +487,14 @@ void DesignWidget::onClickedBel(BelId bel, bool keep) Q_EMIT selected(getDecals(ElementType::BEL, ctx->getBelName(bel)), keep); } int index = getIndexByElementType(ElementType::BEL); - if (tabWidget->currentIndex() != index) + if (!keep) + { + for(int i=0;i<6;i++) + selectionModel[i]->clearSelection(); + } + if (tabWidget->currentIndex() != index) { tabWidget->setCurrentIndex(index); + } selectionModel[index]->setCurrentIndex(getTreeByElementType(ElementType::BEL)->indexFromNode(*item), keep ? QItemSelectionModel::Select : QItemSelectionModel::ClearAndSelect); } @@ -507,6 +513,11 @@ void DesignWidget::onClickedWire(WireId wire, bool keep) Q_EMIT selected(getDecals(ElementType::WIRE, ctx->getWireName(wire)), keep); } int index = getIndexByElementType(ElementType::WIRE); + if (!keep) + { + for(int i=0;i<6;i++) + selectionModel[i]->clearSelection(); + } if (tabWidget->currentIndex() != index) tabWidget->setCurrentIndex(index); selectionModel[index]->setCurrentIndex(getTreeByElementType(ElementType::WIRE)->indexFromNode(*item), @@ -528,6 +539,11 @@ void DesignWidget::onClickedPip(PipId pip, bool keep) } int index = getIndexByElementType(ElementType::PIP); + if (!keep) + { + for(int i=0;i<6;i++) + selectionModel[i]->clearSelection(); + } if (tabWidget->currentIndex() != index) tabWidget->setCurrentIndex(index); selectionModel[index]->setCurrentIndex(getTreeByElementType(ElementType::PIP)->indexFromNode(*item), @@ -539,13 +555,17 @@ void DesignWidget::onSelectionChanged(int num, const QItemSelection &, const QIt if (selectionModel[num]->selectedIndexes().size() == 0) return; - if (selectionModel[num]->selectedIndexes().size() > 1) { - std::vector decals; - for (auto index : selectionModel[num]->selectedIndexes()) { - TreeModel::Item *item = treeModel[num]->nodeFromIndex(index); + int num_selected = 0; + std::vector decals; + for(int i=0;i<6;i++) { + num_selected += selectionModel[i]->selectedIndexes().size(); + for (auto index : selectionModel[i]->selectedIndexes()) { + TreeModel::Item *item = treeModel[i]->nodeFromIndex(index); std::vector d = getDecals(item->type(), item->id()); std::move(d.begin(), d.end(), std::back_inserter(decals)); } + } + if (num_selected>1) { Q_EMIT selected(decals, false); return; } @@ -913,9 +933,11 @@ void DesignWidget::prepareMenuTree(int num, const QPoint &pos) return; QList items; - for (auto index : selectionModel[num]->selectedIndexes()) { - TreeModel::Item *item = treeModel[num]->nodeFromIndex(index); - items.append(item); + for(int i=0;i<6;i++) { + for (auto index : selectionModel[i]->selectedIndexes()) { + TreeModel::Item *item = treeModel[i]->nodeFromIndex(index); + items.append(item); + } } if (items.size() == 1) { TreeModel::Item *item = items.at(0); @@ -949,6 +971,8 @@ void DesignWidget::onItemDoubleClicked(QTreeWidgetItem *item, int column) auto it = getTreeByElementType(type)->nodeForId(ctx->id(selectedProperty->valueText().toStdString())); if (it) { int num = getIndexByElementType(type); + for(int i=0;i<6;i++) + selectionModel[i]->clearSelection(); if (tabWidget->currentIndex() != num) tabWidget->setCurrentIndex(num); selectionModel[num]->setCurrentIndex(getTreeByElementType(type)->indexFromNode(*it), -- cgit v1.2.3 From 37580292277b2998b7152489060a7161fdcf3fd7 Mon Sep 17 00:00:00 2001 From: Miodrag Milanovic Date: Sun, 28 Oct 2018 14:50:48 +0100 Subject: fix unselect from tree --- gui/designwidget.cc | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) (limited to 'gui/designwidget.cc') diff --git a/gui/designwidget.cc b/gui/designwidget.cc index 069f4cfa..29e9ed0c 100644 --- a/gui/designwidget.cc +++ b/gui/designwidget.cc @@ -552,9 +552,6 @@ void DesignWidget::onClickedPip(PipId pip, bool keep) void DesignWidget::onSelectionChanged(int num, const QItemSelection &, const QItemSelection &) { - if (selectionModel[num]->selectedIndexes().size() == 0) - return; - int num_selected = 0; std::vector decals; for(int i=0;i<6;i++) { @@ -565,10 +562,11 @@ void DesignWidget::onSelectionChanged(int num, const QItemSelection &, const QIt std::move(d.begin(), d.end(), std::back_inserter(decals)); } } - if (num_selected>1) { + if (num_selected>1 || (selectionModel[num]->selectedIndexes().size() == 0)) { Q_EMIT selected(decals, false); return; } + QModelIndex index = selectionModel[num]->selectedIndexes().at(0); if (!index.isValid()) return; -- cgit v1.2.3 From 02edd66ae9494e0323e618747eeb0d38f0df75d4 Mon Sep 17 00:00:00 2001 From: Miodrag Milanovic Date: Mon, 29 Oct 2018 19:39:52 +0100 Subject: Changes to cover issues from code review --- gui/designwidget.cc | 50 ++++++++++++++++++++++++-------------------------- 1 file changed, 24 insertions(+), 26 deletions(-) (limited to 'gui/designwidget.cc') diff --git a/gui/designwidget.cc b/gui/designwidget.cc index 29e9ed0c..daeea19d 100644 --- a/gui/designwidget.cc +++ b/gui/designwidget.cc @@ -289,7 +289,7 @@ void DesignWidget::newContext(Context *ctx) std::lock_guard lock(ctx->mutex); { - std::map, std::vector> belMap; + TreeModel::ElementXYRoot::ElementMap belMap; for (auto bel : ctx->getBels()) { auto loc = ctx->getBelLocation(bel); belMap[std::pair(loc.x, loc.y)].push_back(bel); @@ -303,7 +303,7 @@ void DesignWidget::newContext(Context *ctx) #ifdef ARCH_ICE40 { - std::map, std::vector> wireMap; + TreeModel::ElementXYRoot::ElementMap wireMap; for (int i = 0; i < ctx->chip_info->num_wires; i++) { const auto wire = &ctx->chip_info->wire_data[i]; WireId wireid; @@ -317,7 +317,7 @@ void DesignWidget::newContext(Context *ctx) } { - std::map, std::vector> pipMap; + TreeModel::ElementXYRoot::ElementMap pipMap; for (int i = 0; i < ctx->chip_info->num_pips; i++) { const auto pip = &ctx->chip_info->pip_data[i]; PipId pipid; @@ -453,6 +453,8 @@ int DesignWidget::getIndexByElementType(ElementType type) return 3; if (type == ElementType::CELL) return 4; + if (type == ElementType::GROUP) + return 5; return -1; } void DesignWidget::addProperty(QtProperty *topItem, int propertyType, const QString &name, QVariant value, @@ -473,6 +475,12 @@ QtProperty *DesignWidget::addSubGroup(QtProperty *topItem, const QString &name) return item; } +void DesignWidget::clearAllSelectionModels() +{ + for (int i = 0; i <= getIndexByElementType(ElementType::GROUP); i++) + selectionModel[i]->clearSelection(); +} + void DesignWidget::onClickedBel(BelId bel, bool keep) { boost::optional item; @@ -488,15 +496,12 @@ void DesignWidget::onClickedBel(BelId bel, bool keep) } int index = getIndexByElementType(ElementType::BEL); if (!keep) - { - for(int i=0;i<6;i++) - selectionModel[i]->clearSelection(); - } - if (tabWidget->currentIndex() != index) { + clearAllSelectionModels(); + if (tabWidget->currentIndex() != index) { tabWidget->setCurrentIndex(index); } selectionModel[index]->setCurrentIndex(getTreeByElementType(ElementType::BEL)->indexFromNode(*item), - keep ? QItemSelectionModel::Select : QItemSelectionModel::ClearAndSelect); + keep ? QItemSelectionModel::Select : QItemSelectionModel::ClearAndSelect); } void DesignWidget::onClickedWire(WireId wire, bool keep) @@ -512,16 +517,13 @@ void DesignWidget::onClickedWire(WireId wire, bool keep) Q_EMIT selected(getDecals(ElementType::WIRE, ctx->getWireName(wire)), keep); } - int index = getIndexByElementType(ElementType::WIRE); + int index = getIndexByElementType(ElementType::WIRE); if (!keep) - { - for(int i=0;i<6;i++) - selectionModel[i]->clearSelection(); - } + clearAllSelectionModels(); if (tabWidget->currentIndex() != index) tabWidget->setCurrentIndex(index); selectionModel[index]->setCurrentIndex(getTreeByElementType(ElementType::WIRE)->indexFromNode(*item), - keep ? QItemSelectionModel::Select : QItemSelectionModel::ClearAndSelect); + keep ? QItemSelectionModel::Select : QItemSelectionModel::ClearAndSelect); } void DesignWidget::onClickedPip(PipId pip, bool keep) @@ -537,24 +539,21 @@ void DesignWidget::onClickedPip(PipId pip, bool keep) Q_EMIT selected(getDecals(ElementType::PIP, ctx->getPipName(pip)), keep); } - + int index = getIndexByElementType(ElementType::PIP); if (!keep) - { - for(int i=0;i<6;i++) - selectionModel[i]->clearSelection(); - } + clearAllSelectionModels(); if (tabWidget->currentIndex() != index) tabWidget->setCurrentIndex(index); selectionModel[index]->setCurrentIndex(getTreeByElementType(ElementType::PIP)->indexFromNode(*item), - keep ? QItemSelectionModel::Select : QItemSelectionModel::ClearAndSelect); + keep ? QItemSelectionModel::Select : QItemSelectionModel::ClearAndSelect); } void DesignWidget::onSelectionChanged(int num, const QItemSelection &, const QItemSelection &) { int num_selected = 0; std::vector decals; - for(int i=0;i<6;i++) { + for (int i = 0; i <= getIndexByElementType(ElementType::GROUP); i++) { num_selected += selectionModel[i]->selectedIndexes().size(); for (auto index : selectionModel[i]->selectedIndexes()) { TreeModel::Item *item = treeModel[i]->nodeFromIndex(index); @@ -562,7 +561,7 @@ void DesignWidget::onSelectionChanged(int num, const QItemSelection &, const QIt std::move(d.begin(), d.end(), std::back_inserter(decals)); } } - if (num_selected>1 || (selectionModel[num]->selectedIndexes().size() == 0)) { + if (num_selected > 1 || (selectionModel[num]->selectedIndexes().size() == 0)) { Q_EMIT selected(decals, false); return; } @@ -931,7 +930,7 @@ void DesignWidget::prepareMenuTree(int num, const QPoint &pos) return; QList items; - for(int i=0;i<6;i++) { + for (int i = 0; i <= getIndexByElementType(ElementType::GROUP); i++) { for (auto index : selectionModel[i]->selectedIndexes()) { TreeModel::Item *item = treeModel[i]->nodeFromIndex(index); items.append(item); @@ -969,8 +968,7 @@ void DesignWidget::onItemDoubleClicked(QTreeWidgetItem *item, int column) auto it = getTreeByElementType(type)->nodeForId(ctx->id(selectedProperty->valueText().toStdString())); if (it) { int num = getIndexByElementType(type); - for(int i=0;i<6;i++) - selectionModel[i]->clearSelection(); + clearAllSelectionModels(); if (tabWidget->currentIndex() != num) tabWidget->setCurrentIndex(num); selectionModel[num]->setCurrentIndex(getTreeByElementType(type)->indexFromNode(*it), -- cgit v1.2.3 From 0a3ebfbb5b4f502e66861d3857c83b825ac34795 Mon Sep 17 00:00:00 2001 From: Miodrag Milanovic Date: Tue, 30 Oct 2018 08:07:31 +0100 Subject: change to const auto& --- gui/designwidget.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'gui/designwidget.cc') diff --git a/gui/designwidget.cc b/gui/designwidget.cc index daeea19d..8be71f3f 100644 --- a/gui/designwidget.cc +++ b/gui/designwidget.cc @@ -290,7 +290,7 @@ void DesignWidget::newContext(Context *ctx) { TreeModel::ElementXYRoot::ElementMap belMap; - for (auto bel : ctx->getBels()) { + for (const auto& bel : ctx->getBels()) { auto loc = ctx->getBelLocation(bel); belMap[std::pair(loc.x, loc.y)].push_back(bel); } -- cgit v1.2.3 From b8870bb99c24d2998ca5bb5245589dd9d0703ea4 Mon Sep 17 00:00:00 2001 From: Miodrag Milanovic Date: Sun, 11 Nov 2018 10:53:48 +0100 Subject: Propagate proper ctx, fixes fetchMore --- gui/designwidget.cc | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) (limited to 'gui/designwidget.cc') diff --git a/gui/designwidget.cc b/gui/designwidget.cc index 8be71f3f..f7805320 100644 --- a/gui/designwidget.cc +++ b/gui/designwidget.cc @@ -297,7 +297,7 @@ void DesignWidget::newContext(Context *ctx) auto belGetter = [](Context *ctx, BelId id) { return ctx->getBelName(id); }; getTreeByElementType(ElementType::BEL) - ->loadData(std::unique_ptr>( + ->loadData(ctx, std::unique_ptr>( new TreeModel::ElementXYRoot(ctx, belMap, belGetter, ElementType::BEL))); } @@ -312,7 +312,7 @@ void DesignWidget::newContext(Context *ctx) } auto wireGetter = [](Context *ctx, WireId id) { return ctx->getWireName(id); }; getTreeByElementType(ElementType::WIRE) - ->loadData(std::unique_ptr>( + ->loadData(ctx, std::unique_ptr>( new TreeModel::ElementXYRoot(ctx, wireMap, wireGetter, ElementType::WIRE))); } @@ -326,14 +326,14 @@ void DesignWidget::newContext(Context *ctx) } auto pipGetter = [](Context *ctx, PipId id) { return ctx->getPipName(id); }; getTreeByElementType(ElementType::PIP) - ->loadData(std::unique_ptr>( + ->loadData(ctx, std::unique_ptr>( new TreeModel::ElementXYRoot(ctx, pipMap, pipGetter, ElementType::PIP))); } #endif getTreeByElementType(ElementType::CELL) - ->loadData(std::unique_ptr(new TreeModel::IdStringList(ElementType::CELL))); + ->loadData(ctx, std::unique_ptr(new TreeModel::IdStringList(ElementType::CELL))); getTreeByElementType(ElementType::NET) - ->loadData(std::unique_ptr(new TreeModel::IdStringList(ElementType::NET))); + ->loadData(ctx, std::unique_ptr(new TreeModel::IdStringList(ElementType::NET))); } updateTree(); } @@ -367,8 +367,8 @@ void DesignWidget::updateTree() nets.push_back(pair.first); } - getTreeByElementType(ElementType::CELL)->updateElements(ctx, cells); - getTreeByElementType(ElementType::NET)->updateElements(ctx, nets); + getTreeByElementType(ElementType::CELL)->updateElements(cells); + getTreeByElementType(ElementType::NET)->updateElements(nets); } } QtProperty *DesignWidget::addTopLevelProperty(const QString &id) -- cgit v1.2.3 From a445ae37ee3c485495170ccadd7b0ce71297019f Mon Sep 17 00:00:00 2001 From: Miodrag Milanovic Date: Sun, 11 Nov 2018 11:08:34 +0100 Subject: Pip visible for all archs --- gui/designwidget.cc | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) (limited to 'gui/designwidget.cc') diff --git a/gui/designwidget.cc b/gui/designwidget.cc index f7805320..561d5361 100644 --- a/gui/designwidget.cc +++ b/gui/designwidget.cc @@ -315,21 +315,21 @@ void DesignWidget::newContext(Context *ctx) ->loadData(ctx, std::unique_ptr>( new TreeModel::ElementXYRoot(ctx, wireMap, wireGetter, ElementType::WIRE))); } +#endif { TreeModel::ElementXYRoot::ElementMap pipMap; - for (int i = 0; i < ctx->chip_info->num_pips; i++) { - const auto pip = &ctx->chip_info->pip_data[i]; - PipId pipid; - pipid.index = i; - pipMap[std::pair(pip->x, pip->y)].push_back(pipid); + for (const auto& pip : ctx->getPips()) { + auto loc = ctx->getPipLocation(pip); + pipMap[std::pair(loc.x, loc.y)].push_back(pip); } auto pipGetter = [](Context *ctx, PipId id) { return ctx->getPipName(id); }; + getTreeByElementType(ElementType::PIP) ->loadData(ctx, std::unique_ptr>( new TreeModel::ElementXYRoot(ctx, pipMap, pipGetter, ElementType::PIP))); } -#endif + getTreeByElementType(ElementType::CELL) ->loadData(ctx, std::unique_ptr(new TreeModel::IdStringList(ElementType::CELL))); getTreeByElementType(ElementType::NET) -- cgit v1.2.3 From 5d11af5a251850576431d4ac210d9ca1af375888 Mon Sep 17 00:00:00 2001 From: Miodrag Milanovic Date: Sun, 11 Nov 2018 13:26:33 +0100 Subject: multiple selection fix --- gui/designwidget.cc | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) (limited to 'gui/designwidget.cc') diff --git a/gui/designwidget.cc b/gui/designwidget.cc index 561d5361..e99637bf 100644 --- a/gui/designwidget.cc +++ b/gui/designwidget.cc @@ -20,6 +20,7 @@ #include "designwidget.h" #include +#include #include #include #include @@ -561,10 +562,18 @@ void DesignWidget::onSelectionChanged(int num, const QItemSelection &, const QIt std::move(d.begin(), d.end(), std::back_inserter(decals)); } } - if (num_selected > 1 || (selectionModel[num]->selectedIndexes().size() == 0)) { + + // Keep other tree seleciton only if Control is pressed + if (num_selected > 1 && QApplication::keyboardModifiers().testFlag(Qt::ControlModifier) == true) { Q_EMIT selected(decals, false); return; } + + // For deselect and multiple select just send all + if (selectionModel[num]->selectedIndexes().size() != 1) { + Q_EMIT selected(decals, false); + return; + } QModelIndex index = selectionModel[num]->selectedIndexes().at(0); if (!index.isValid()) @@ -575,6 +584,10 @@ void DesignWidget::onSelectionChanged(int num, const QItemSelection &, const QIt if (type == ElementType::NONE) return; + // Clear other tab selections + for (int i = 0; i <= getIndexByElementType(ElementType::GROUP); i++) + if (i!=num) selectionModel[i]->clearSelection(); + addToHistory(num, index); clearProperties(); -- cgit v1.2.3 From 2d35d99ed27bdbe3c654a642aa4c1cc4d4d2cb70 Mon Sep 17 00:00:00 2001 From: Miodrag Milanovic Date: Sun, 11 Nov 2018 13:52:19 +0100 Subject: Show wires in tree for ECP5 as well --- gui/designwidget.cc | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) (limited to 'gui/designwidget.cc') diff --git a/gui/designwidget.cc b/gui/designwidget.cc index e99637bf..20a81a7d 100644 --- a/gui/designwidget.cc +++ b/gui/designwidget.cc @@ -302,21 +302,26 @@ void DesignWidget::newContext(Context *ctx) new TreeModel::ElementXYRoot(ctx, belMap, belGetter, ElementType::BEL))); } -#ifdef ARCH_ICE40 { TreeModel::ElementXYRoot::ElementMap wireMap; +#ifdef ARCH_ICE40 for (int i = 0; i < ctx->chip_info->num_wires; i++) { const auto wire = &ctx->chip_info->wire_data[i]; WireId wireid; wireid.index = i; wireMap[std::pair(wire->x, wire->y)].push_back(wireid); } +#endif +#ifdef ARCH_ECP5 + for (const auto& wire : ctx->getWires()) { + wireMap[std::pair(wire.location.x, wire.location.y)].push_back(wire); + } +#endif auto wireGetter = [](Context *ctx, WireId id) { return ctx->getWireName(id); }; getTreeByElementType(ElementType::WIRE) ->loadData(ctx, std::unique_ptr>( new TreeModel::ElementXYRoot(ctx, wireMap, wireGetter, ElementType::WIRE))); } -#endif { TreeModel::ElementXYRoot::ElementMap pipMap; -- cgit v1.2.3