From ad84df7974a82d657938a226da2ceace150cc068 Mon Sep 17 00:00:00 2001 From: Miodrag Milanovic Date: Wed, 22 Aug 2018 17:38:42 +0200 Subject: Hover on items in tree --- gui/basewindow.cc | 1 + gui/designwidget.cc | 42 +++++++++++++++++++++++++++++++++++++----- gui/designwidget.h | 21 ++++++++++++++++++++- gui/fpgaviewwidget.cc | 8 ++++++++ gui/fpgaviewwidget.h | 1 + 5 files changed, 67 insertions(+), 6 deletions(-) (limited to 'gui') diff --git a/gui/basewindow.cc b/gui/basewindow.cc index 4444c8e9..92812285 100644 --- a/gui/basewindow.cc +++ b/gui/basewindow.cc @@ -109,6 +109,7 @@ BaseMainWindow::BaseMainWindow(std::unique_ptr context, ArchArgs args, connect(designview, &DesignWidget::selected, fpgaView, &FPGAViewWidget::onSelectedArchItem); connect(designview, &DesignWidget::zoomSelected, fpgaView, &FPGAViewWidget::zoomSelected); connect(designview, &DesignWidget::highlight, fpgaView, &FPGAViewWidget::onHighlightGroupChanged); + connect(designview, &DesignWidget::hover, fpgaView, &FPGAViewWidget::onHoverItemChanged); // Click event on device view connect(fpgaView, &FPGAViewWidget::clickedBel, designview, &DesignWidget::onClickedBel); diff --git a/gui/designwidget.cc b/gui/designwidget.cc index 1b0e617e..bd1c6c5a 100644 --- a/gui/designwidget.cc +++ b/gui/designwidget.cc @@ -30,15 +30,34 @@ NEXTPNR_NAMESPACE_BEGIN +TreeView::TreeView(QWidget *parent) : QTreeView(parent) {} + +TreeView::~TreeView() {} + +void TreeView::mouseMoveEvent(QMouseEvent *event) +{ + QModelIndex index = indexAt(event->pos()); + if (index!=current) { + current = index; + Q_EMIT hoverIndexChanged(index); + } + QTreeView::mouseMoveEvent(event); +} + +void TreeView::leaveEvent(QEvent *event) +{ + Q_EMIT hoverIndexChanged(QModelIndex()); +} + DesignWidget::DesignWidget(QWidget *parent) : QWidget(parent), ctx(nullptr), selectionModel(nullptr) { // Add tree view - treeView = new QTreeView(); + treeView = new TreeView(); treeModel = new TreeModel::Model(); treeView->setModel(treeModel); treeView->setContextMenuPolicy(Qt::CustomContextMenu); treeView->setSelectionMode(QAbstractItemView::ExtendedSelection); - + treeView->viewport()->setMouseTracking(true); // Add property view variantManager = new QtVariantPropertyManager(this); readOnlyManager = new QtVariantPropertyManager(this); @@ -159,8 +178,9 @@ DesignWidget::DesignWidget(QWidget *parent) : QWidget(parent), ctx(nullptr), sel &DesignWidget::prepareMenuProperty); connect(propertyEditor->treeWidget(), &QTreeWidget::itemDoubleClicked, this, &DesignWidget::onItemDoubleClicked); - connect(treeView, &QTreeView::customContextMenuRequested, this, &DesignWidget::prepareMenuTree); - connect(treeView, &QTreeView::doubleClicked, this, &DesignWidget::onDoubleClicked); + 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); @@ -388,7 +408,6 @@ void DesignWidget::onSelectionChanged(const QItemSelection &, const QItemSelecti ElementType type = clickItem->type(); if (type == ElementType::NONE) return; - std::vector decals; addToHistory(index); @@ -800,4 +819,17 @@ void DesignWidget::onSearchInserted() if (currentSearchIndexes.size() > 0 && currentIndex < currentSearchIndexes.size()) selectionModel->setCurrentIndex(currentSearchIndexes.at(currentIndex), QItemSelectionModel::ClearAndSelect); } + +void DesignWidget::onHoverIndexChanged(QModelIndex index) +{ + if (index.isValid()) { + TreeModel::Item *item = treeModel->nodeFromIndex(index); + if (item->type() != ElementType::NONE) { + Q_EMIT hover(getDecals(item->type(), item->id()).at(0)); + return; + } + } + Q_EMIT hover(DecalXY()); +} + NEXTPNR_NAMESPACE_END diff --git a/gui/designwidget.h b/gui/designwidget.h index c78d7232..37791aa1 100644 --- a/gui/designwidget.h +++ b/gui/designwidget.h @@ -22,6 +22,7 @@ #include #include +#include #include "nextpnr.h" #include "qtgroupboxpropertybrowser.h" #include "qtpropertymanager.h" @@ -31,6 +32,22 @@ NEXTPNR_NAMESPACE_BEGIN +class TreeView : public QTreeView +{ + Q_OBJECT + + public: + explicit TreeView(QWidget *parent = 0); + ~TreeView(); + void mouseMoveEvent(QMouseEvent *event) override; + void leaveEvent(QEvent *event) override; + + Q_SIGNALS: + void hoverIndexChanged(QModelIndex index); + private: + QModelIndex current; +}; + class DesignWidget : public QWidget { Q_OBJECT @@ -55,6 +72,7 @@ class DesignWidget : public QWidget Q_SIGNALS: void selected(std::vector decal, bool keep); void highlight(std::vector decal, int group); + void hover(DecalXY decal); void zoomSelected(); private Q_SLOTS: @@ -64,6 +82,7 @@ class DesignWidget : public QWidget void onItemDoubleClicked(QTreeWidgetItem *item, int column); void onDoubleClicked(const QModelIndex &index); void onSearchInserted(); + void onHoverIndexChanged(QModelIndex index); public Q_SLOTS: void newContext(Context *ctx); void updateTree(); @@ -74,7 +93,7 @@ class DesignWidget : public QWidget private: Context *ctx; - QTreeView *treeView; + TreeView *treeView; QItemSelectionModel *selectionModel; TreeModel::Model *treeModel; QLineEdit *searchEdit; diff --git a/gui/fpgaviewwidget.cc b/gui/fpgaviewwidget.cc index 2b0a3eff..53ee7282 100644 --- a/gui/fpgaviewwidget.cc +++ b/gui/fpgaviewwidget.cc @@ -559,6 +559,14 @@ void FPGAViewWidget::onHighlightGroupChanged(std::vector decals, int gr pokeRenderer(); } +void FPGAViewWidget::onHoverItemChanged(DecalXY decal) +{ + QMutexLocker locked(&rendererArgsLock_); + rendererArgs_->hoveredDecal = decal; + rendererArgs_->changed = true; + pokeRenderer(); +} + void FPGAViewWidget::resizeGL(int width, int height) {} boost::optional FPGAViewWidget::pickElement(float worldx, float worldy) diff --git a/gui/fpgaviewwidget.h b/gui/fpgaviewwidget.h index ee05aae3..51a038fc 100644 --- a/gui/fpgaviewwidget.h +++ b/gui/fpgaviewwidget.h @@ -113,6 +113,7 @@ class FPGAViewWidget : public QOpenGLWidget, protected QOpenGLFunctions void newContext(Context *ctx); void onSelectedArchItem(std::vector decals, bool keep); void onHighlightGroupChanged(std::vector decals, int group); + void onHoverItemChanged(DecalXY decal); void pokeRenderer(void); void zoomIn(); void zoomOut(); -- cgit v1.2.3