diff options
author | Sergiusz Bazanski <q3k@q3k.org> | 2018-07-27 02:14:40 +0100 |
---|---|---|
committer | Sergiusz Bazanski <q3k@q3k.org> | 2018-07-27 02:14:40 +0100 |
commit | 1fe1b99a5afea488a801f303cb1eda0d9343a1f0 (patch) | |
tree | 16ef38f6dec23b462f0c7d40fe497346fbeed74c /gui | |
parent | 83371248fca5ab217def81ee101ecdb0d299cee4 (diff) | |
download | nextpnr-1fe1b99a5afea488a801f303cb1eda0d9343a1f0.tar.gz nextpnr-1fe1b99a5afea488a801f303cb1eda0d9343a1f0.tar.bz2 nextpnr-1fe1b99a5afea488a801f303cb1eda0d9343a1f0.zip |
gui: ctrl click to select multiple elements
Diffstat (limited to 'gui')
-rw-r--r-- | gui/basewindow.cc | 8 | ||||
-rw-r--r-- | gui/designwidget.cc | 14 | ||||
-rw-r--r-- | gui/designwidget.h | 6 | ||||
-rw-r--r-- | gui/fpgaviewwidget.cc | 16 | ||||
-rw-r--r-- | gui/fpgaviewwidget.h | 6 |
5 files changed, 28 insertions, 22 deletions
diff --git a/gui/basewindow.cc b/gui/basewindow.cc index c7e637f6..96799e85 100644 --- a/gui/basewindow.cc +++ b/gui/basewindow.cc @@ -80,10 +80,10 @@ BaseMainWindow::BaseMainWindow(std::unique_ptr<Context> context, QWidget *parent centralTabWidget->tabBar()->tabButton(0, QTabBar::RightSide)->resize(0, 0);
connect(this, SIGNAL(contextChanged(Context *)), fpgaView, SLOT(newContext(Context *)));
- connect(designview, SIGNAL(selected(std::vector<DecalXY>)), fpgaView,
- SLOT(onSelectedArchItem(std::vector<DecalXY>)));
- connect(fpgaView, SIGNAL(clickedBel(BelId)), designview, SLOT(onClickedBel(BelId)));
- connect(fpgaView, SIGNAL(clickedWire(WireId)), designview, SLOT(onClickedWire(WireId)));
+ connect(designview, SIGNAL(selected(std::vector<DecalXY>, bool)), fpgaView,
+ SLOT(onSelectedArchItem(std::vector<DecalXY>, bool)));
+ connect(fpgaView, SIGNAL(clickedBel(BelId, bool)), designview, SLOT(onClickedBel(BelId, bool)));
+ connect(fpgaView, SIGNAL(clickedWire(WireId, bool)), designview, SLOT(onClickedWire(WireId, bool)));
connect(designview, SIGNAL(highlight(std::vector<DecalXY>, int)), fpgaView,
SLOT(onHighlightGroupChanged(std::vector<DecalXY>, int)));
diff --git a/gui/designwidget.cc b/gui/designwidget.cc index 34f7a656..674c74c7 100644 --- a/gui/designwidget.cc +++ b/gui/designwidget.cc @@ -507,18 +507,18 @@ QtProperty *DesignWidget::addSubGroup(QtProperty *topItem, const QString &name) return item;
}
-void DesignWidget::onClickedBel(BelId bel)
+void DesignWidget::onClickedBel(BelId bel, bool keep)
{
QTreeWidgetItem *item = nameToItem[getElementIndex(ElementType::BEL)].value(ctx->getBelName(bel).c_str(ctx));
treeWidget->setCurrentItem(item);
- Q_EMIT selected(getDecals(ElementType::BEL, ctx->getBelName(bel)));
+ Q_EMIT selected(getDecals(ElementType::BEL, ctx->getBelName(bel)), keep);
}
-void DesignWidget::onClickedWire(WireId wire)
+void DesignWidget::onClickedWire(WireId wire, bool keep)
{
QTreeWidgetItem *item = nameToItem[getElementIndex(ElementType::WIRE)].value(ctx->getWireName(wire).c_str(ctx));
treeWidget->setCurrentItem(item);
- Q_EMIT selected(getDecals(ElementType::WIRE, ctx->getWireName(wire)));
+ Q_EMIT selected(getDecals(ElementType::WIRE, ctx->getWireName(wire)), keep);
}
void DesignWidget::onItemSelectionChanged()
@@ -534,7 +534,7 @@ void DesignWidget::onItemSelectionChanged() std::vector<DecalXY> d = getDecals(type, value);
std::move(d.begin(), d.end(), std::back_inserter(decals));
}
- Q_EMIT selected(decals);
+ Q_EMIT selected(decals, false);
return;
}
@@ -555,7 +555,7 @@ void DesignWidget::onItemSelectionChanged() clearProperties();
IdString c = static_cast<IdStringTreeItem *>(clickItem)->getData();
- Q_EMIT selected(getDecals(type, c));
+ Q_EMIT selected(getDecals(type, c), false);
if (type == ElementType::BEL) {
BelId bel = ctx->getBelByName(c);
@@ -847,7 +847,7 @@ void DesignWidget::prepareMenuProperty(const QPoint &pos) std::vector<DecalXY> d = getDecals(type, value);
std::move(d.begin(), d.end(), std::back_inserter(decals));
}
- Q_EMIT selected(decals);
+ Q_EMIT selected(decals, false);
});
menu.addAction(selectAction);
diff --git a/gui/designwidget.h b/gui/designwidget.h index fec0d069..a11ed062 100644 --- a/gui/designwidget.h +++ b/gui/designwidget.h @@ -64,7 +64,7 @@ class DesignWidget : public QWidget void updateHighlightGroup(QList<QTreeWidgetItem *> item, int group);
Q_SIGNALS:
void info(std::string text);
- void selected(std::vector<DecalXY> decal);
+ void selected(std::vector<DecalXY> decal, bool keep);
void highlight(std::vector<DecalXY> decal, int group);
private Q_SLOTS:
@@ -75,8 +75,8 @@ class DesignWidget : public QWidget public Q_SLOTS:
void newContext(Context *ctx);
void updateTree();
- void onClickedBel(BelId bel);
- void onClickedWire(WireId wire);
+ void onClickedBel(BelId bel, bool keep);
+ void onClickedWire(WireId wire, bool keep);
private:
Context *ctx;
diff --git a/gui/fpgaviewwidget.cc b/gui/fpgaviewwidget.cc index 873800c5..5d7cb8ed 100644 --- a/gui/fpgaviewwidget.cc +++ b/gui/fpgaviewwidget.cc @@ -83,7 +83,7 @@ FPGAViewWidget::~FPGAViewWidget() {} void FPGAViewWidget::newContext(Context *ctx) { ctx_ = ctx; - onSelectedArchItem(std::vector<DecalXY>()); + onSelectedArchItem(std::vector<DecalXY>(), false); for (int i = 0; i < 8; i++) onHighlightGroupChanged(std::vector<DecalXY>(), i); { @@ -508,11 +508,15 @@ void FPGAViewWidget::renderLines(void) } } -void FPGAViewWidget::onSelectedArchItem(std::vector<DecalXY> decals) +void FPGAViewWidget::onSelectedArchItem(std::vector<DecalXY> decals, bool keep) { { QMutexLocker locker(&rendererArgsLock_); - rendererArgs_->selectedDecals = decals; + if (keep) { + std::copy(decals.begin(), decals.end(), std::back_inserter(rendererArgs_->selectedDecals)); + } else { + rendererArgs_->selectedDecals = decals; + } rendererArgs_->changed = true; } pokeRenderer(); @@ -576,6 +580,8 @@ void FPGAViewWidget::mousePressEvent(QMouseEvent *event) lastDragPos_ = event->pos(); } if (event->buttons() & Qt::LeftButton) { + bool ctrl = QApplication::keyboardModifiers().testFlag(Qt::ControlModifier); + auto world = mouseToWorldCoordinates(event->x(), event->y()); auto closestOr = pickElement(world.x(), world.y()); if (!closestOr) @@ -583,9 +589,9 @@ void FPGAViewWidget::mousePressEvent(QMouseEvent *event) auto closest = closestOr.value(); if (closest.type == ElementType::BEL) { - clickedBel(closest.element.bel); + clickedBel(closest.element.bel, ctrl); } else if (closest.type == ElementType::WIRE) { - clickedWire(closest.element.wire); + clickedWire(closest.element.wire, ctrl); } } } diff --git a/gui/fpgaviewwidget.h b/gui/fpgaviewwidget.h index 732f4e3e..335ee51b 100644 --- a/gui/fpgaviewwidget.h +++ b/gui/fpgaviewwidget.h @@ -110,7 +110,7 @@ class FPGAViewWidget : public QOpenGLWidget, protected QOpenGLFunctions public Q_SLOTS: void newContext(Context *ctx); - void onSelectedArchItem(std::vector<DecalXY> decals); + void onSelectedArchItem(std::vector<DecalXY> decals, bool keep); void onHighlightGroupChanged(std::vector<DecalXY> decals, int group); void pokeRenderer(void); void zoomIn(); @@ -119,8 +119,8 @@ class FPGAViewWidget : public QOpenGLWidget, protected QOpenGLFunctions void zoomOutbound(); Q_SIGNALS: - void clickedBel(BelId bel); - void clickedWire(WireId wire); + void clickedBel(BelId bel, bool add); + void clickedWire(WireId wire, bool add); private: const float zoomNear_ = 0.1f; // do not zoom closer than this |