diff --git a/gui/include/DataSource/DataSourceWidget.h b/gui/include/DataSource/DataSourceWidget.h index c661fa2..4134f86 100644 --- a/gui/include/DataSource/DataSourceWidget.h +++ b/gui/include/DataSource/DataSourceWidget.h @@ -29,6 +29,10 @@ public slots: private: Ui::DataSourceWidget *ui; + +private slots: + /// Slot called when right clicking on an item in the tree (displays a menu) + void onTreeMenuRequested(const QPoint &pos) noexcept; }; #endif // SCIQLOP_DATASOURCEWIDGET_H diff --git a/gui/src/DataSource/DataSourceWidget.cpp b/gui/src/DataSource/DataSourceWidget.cpp index 0891a00..0209719 100644 --- a/gui/src/DataSource/DataSourceWidget.cpp +++ b/gui/src/DataSource/DataSourceWidget.cpp @@ -5,6 +5,8 @@ #include #include +#include + namespace { /// Number of columns displayed in the tree @@ -40,6 +42,11 @@ DataSourceWidget::DataSourceWidget(QWidget *parent) : QWidget{parent}, ui{new Ui // Set tree properties ui->treeWidget->setColumnCount(TREE_NB_COLUMNS); ui->treeWidget->setHeaderLabels(TREE_HEADER_LABELS); + ui->treeWidget->setContextMenuPolicy(Qt::CustomContextMenu); + + // Connection to show a menu when right clicking on the tree + connect(ui->treeWidget, &QTreeWidget::customContextMenuRequested, this, + &DataSourceWidget::onTreeMenuRequested); } void DataSourceWidget::addDataSource(DataSourceItem *dataSource) noexcept @@ -50,3 +57,16 @@ void DataSourceWidget::addDataSource(DataSourceItem *dataSource) noexcept ui->treeWidget->addTopLevelItem(createTreeWidgetItem(dataSource)); } } + +void DataSourceWidget::onTreeMenuRequested(const QPoint &pos) noexcept +{ + // Retrieves the selected item in the tree, and build the menu from its actions + if (auto selectedItem = dynamic_cast(ui->treeWidget->itemAt(pos))) { + QMenu treeMenu{}; + treeMenu.addActions(selectedItem->actions()); + + if (!treeMenu.isEmpty()) { + treeMenu.exec(mapToGlobal(pos)); + } + } +}