diff --git a/app/src/MainWindow.cpp b/app/src/MainWindow.cpp index 3e6f828..1c1c4ca 100644 --- a/app/src/MainWindow.cpp +++ b/app/src/MainWindow.cpp @@ -189,9 +189,11 @@ MainWindow::MainWindow(QWidget *parent) // potentially attach a menu to the variable's menu to do so before this menu is displayed. // The order of connections is also important, since it determines the order in which each // widget will attach its menu - connect(m_Ui->variableInspectorWidget, - SIGNAL(tableMenuAboutToBeDisplayed(QMenu *, std::shared_ptr)), m_Ui->view, - SLOT(attachVariableMenu(QMenu *, std::shared_ptr)), Qt::DirectConnection); + connect( + m_Ui->variableInspectorWidget, + SIGNAL(tableMenuAboutToBeDisplayed(QMenu *, const QVector > &)), + m_Ui->view, SLOT(attachVariableMenu(QMenu *, const QVector > &)), + Qt::DirectConnection); /* QLopGUI::registerMenuBar(menuBar()); this->setWindowIcon(QIcon(":/sciqlopLOGO.svg")); diff --git a/gui/include/Variable/VariableInspectorWidget.h b/gui/include/Variable/VariableInspectorWidget.h index cc6faee..56fa387 100644 --- a/gui/include/Variable/VariableInspectorWidget.h +++ b/gui/include/Variable/VariableInspectorWidget.h @@ -29,14 +29,15 @@ public: signals: /** - * Signal emitted before a menu concerning a variable is displayed. It is used for other widgets + * Signal emitted before a menu concerning variables is displayed. It is used for other widgets * to complete the menu. * @param tableMenu the menu to be completed - * @param variable the variable concerned by the menu + * @param variables the variables concerned by the menu * @remarks To make the dynamic addition of menus work, the connections to this signal must be * in Qt :: DirectConnection */ - void tableMenuAboutToBeDisplayed(QMenu *tableMenu, std::shared_ptr variable); + void tableMenuAboutToBeDisplayed(QMenu *tableMenu, + const QVector > &variables); private: Ui::VariableInspectorWidget *ui; diff --git a/gui/include/Variable/VariableMenuHeaderWidget.h b/gui/include/Variable/VariableMenuHeaderWidget.h new file mode 100644 index 0000000..009b0c5 --- /dev/null +++ b/gui/include/Variable/VariableMenuHeaderWidget.h @@ -0,0 +1,37 @@ +#ifndef SCIQLOP_VARIABLEMENUHEADERWIDGET_H +#define SCIQLOP_VARIABLEMENUHEADERWIDGET_H + +#include +#include + +#include + +namespace Ui { +class VariableMenuHeaderWidget; +} // Ui + +class Variable; + +Q_DECLARE_LOGGING_CATEGORY(LOG_VariableMenuHeaderWidget) + +/** + * @brief The VariableMenuHeaderWidget class represents the widget used as a header of a menu in the + * variable inspector + * @sa VariableInspectorWidget + */ +class VariableMenuHeaderWidget : public QWidget { +public: + /** + * Ctor + * @param variables the list of variables used to generate the header + * @param parent the parent widget + */ + explicit VariableMenuHeaderWidget(const QVector > &variables, + QWidget *parent = 0); + virtual ~VariableMenuHeaderWidget() noexcept; + +private: + Ui::VariableMenuHeaderWidget *ui; +}; + +#endif // SCIQLOP_VARIABLEMENUHEADERWIDGET_H diff --git a/gui/include/Visualization/VisualizationWidget.h b/gui/include/Visualization/VisualizationWidget.h index 2321bbd..874203d 100644 --- a/gui/include/Visualization/VisualizationWidget.h +++ b/gui/include/Visualization/VisualizationWidget.h @@ -30,11 +30,12 @@ public: public slots: /** - * Attaches to a menu the menu relating to the visualization of a variable + * Attaches to a menu the menu relative to the visualization of variables * @param menu the parent menu of the generated menu - * @param variable the variable for which to generate the menu + * @param variables the variables for which to generate the menu */ - void attachVariableMenu(QMenu *menu, std::shared_ptr variable) noexcept; + void attachVariableMenu(QMenu *menu, + const QVector > &variables) noexcept; private: Ui::VisualizationWidget *ui; diff --git a/gui/resources/icones/delete.png b/gui/resources/icones/delete.png new file mode 100644 index 0000000000000000000000000000000000000000..a9e5409ad549c425690339c69d04bc5a7bcdf478 GIT binary patch literal 834 zc%17D@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7uRSEX7WqAsj$Z!;#Vf4nJ za0`PlBg3pY5)2GXPdr^5Ln`LHy%XyvZ79PfA#<8qT^1i^q_J_yJH3e<7%UBNg<-7GI{P=jbL(t%#xU%bkAI5GS4Ijnlh?+AU z^A|B>I(A+}lj)egh$7Rmcumu$;?>M`%^$TtN-#bSe+HDe-_gz?QJ-w+HD5p?`{v%%D_0*sH%uNg5Nd+*ZCA+g_BQ*h4;KbD^RD{Yk${+!E|WPEJB z(Uqm=z0X;Wpkw>HKJK1ubSDVNzcY(N!oFh?keD$CNUXR5BsNR|5<4ydi3xXr#DXgv zZBqZ!Uo)4ya(~UdVBMtU4fE_9TX?efajGyq&-x?b!Q!`c-=T8fAI2^Ze9oQTtuE-O zp}PL9u%keB-W!3&V$*l81RH}*^Ir-z8b{wbug;{tt;U#Luq3a){F8v=@^3Zw?F37f z9c?%3SRkxxztNec_v?p3U8RgA?H_ps->g{9&yIU{=CABkI!?|Wj!ZCJN*DF@$KziBU(j_I3 + icones/delete.png icones/openInspector.png icones/next.png icones/previous.png diff --git a/gui/src/Variable/VariableInspectorWidget.cpp b/gui/src/Variable/VariableInspectorWidget.cpp index b83cd4d..14df440 100644 --- a/gui/src/Variable/VariableInspectorWidget.cpp +++ b/gui/src/Variable/VariableInspectorWidget.cpp @@ -1,10 +1,12 @@ #include #include +#include #include #include #include +#include #include @@ -29,6 +31,10 @@ VariableInspectorWidget::VariableInspectorWidget(QWidget *parent) i, model->headerData(i, Qt::Horizontal, Qt::SizeHintRole).toSize().width()); } + // Sets selection options + ui->tableView->setSelectionBehavior(QTableView::SelectRows); + ui->tableView->setSelectionMode(QTableView::ExtendedSelection); + // Connection to show a menu when right clicking on the tree ui->tableView->setContextMenuPolicy(Qt::CustomContextMenu); connect(ui->tableView, &QTableView::customContextMenuRequested, this, @@ -42,24 +48,41 @@ VariableInspectorWidget::~VariableInspectorWidget() void VariableInspectorWidget::onTableMenuRequested(const QPoint &pos) noexcept { - auto selectedIndex = ui->tableView->indexAt(pos); - if (selectedIndex.isValid()) { - // Gets the model to retrieve the underlying selected variable - auto model = sqpApp->variableController().variableModel(); - if (auto selectedVariable = model->variable(selectedIndex.row())) { - QMenu tableMenu{}; - - // Emit a signal so that potential receivers can populate the menu before displaying it - emit tableMenuAboutToBeDisplayed(&tableMenu, selectedVariable); - - if (!tableMenu.isEmpty()) { - tableMenu.exec(mapToGlobal(pos)); - } + auto selectedRows = ui->tableView->selectionModel()->selectedRows(); + + // Gets the model to retrieve the underlying selected variables + auto model = sqpApp->variableController().variableModel(); + auto selectedVariables = QVector >{}; + for (const auto &selectedRow : qAsConst(selectedRows)) { + if (auto selectedVariable = model->variable(selectedRow.row())) { + selectedVariables.push_back(selectedVariable); } } - else { - qCCritical(LOG_VariableInspectorWidget()) - << tr("Can't display menu : invalid index (%1;%2)") - .arg(selectedIndex.row(), selectedIndex.column()); + + QMenu tableMenu{}; + + // Emits a signal so that potential receivers can populate the menu before displaying it + emit tableMenuAboutToBeDisplayed(&tableMenu, selectedVariables); + + // Adds menu-specific actions + if (!selectedVariables.isEmpty()) { + // 'Delete' action + auto deleteFun = []() { + /// @todo ALX : call variable deletion + }; + + tableMenu.addSeparator(); + tableMenu.addAction(QIcon{":/icones/delete.png"}, tr("Delete"), deleteFun); + } + + if (!tableMenu.isEmpty()) { + // Generates menu header (inserted before first action) + auto firstAction = tableMenu.actions().first(); + auto headerAction = new QWidgetAction{&tableMenu}; + headerAction->setDefaultWidget(new VariableMenuHeaderWidget{selectedVariables, &tableMenu}); + tableMenu.insertAction(firstAction, headerAction); + + // Displays menu + tableMenu.exec(mapToGlobal(pos)); } } diff --git a/gui/src/Variable/VariableMenuHeaderWidget.cpp b/gui/src/Variable/VariableMenuHeaderWidget.cpp new file mode 100644 index 0000000..7baf824 --- /dev/null +++ b/gui/src/Variable/VariableMenuHeaderWidget.cpp @@ -0,0 +1,38 @@ +#include "Variable/VariableMenuHeaderWidget.h" +#include "Variable/Variable.h" + +#include + +Q_LOGGING_CATEGORY(LOG_VariableMenuHeaderWidget, "VariableMenuHeaderWidget") + +VariableMenuHeaderWidget::VariableMenuHeaderWidget( + const QVector > &variables, QWidget *parent) + : QWidget{parent}, ui{new Ui::VariableMenuHeaderWidget} +{ + ui->setupUi(this); + + // Generates label according to the state of the variables. The label contains : + // - the variable name if there is only one variable in the list + // - 'x variables' where x is the number of variables otherwise + const auto nbVariables = variables.size(); + if (nbVariables == 1) { + if (auto variable = variables.first()) { + ui->label->setText(variable->name()); + } + else { + qCCritical(LOG_VariableMenuHeaderWidget()) + << tr("Can't get the name of the variable : variable is null"); + } + } + else if (nbVariables > 1) { + ui->label->setText(tr("%1 variables").arg(nbVariables)); + } + else { + ui->label->setText(tr("No variable")); + } +} + +VariableMenuHeaderWidget::~VariableMenuHeaderWidget() noexcept +{ + delete ui; +} diff --git a/gui/src/Visualization/VisualizationWidget.cpp b/gui/src/Visualization/VisualizationWidget.cpp index 8f04c44..77eec9c 100644 --- a/gui/src/Visualization/VisualizationWidget.cpp +++ b/gui/src/Visualization/VisualizationWidget.cpp @@ -106,10 +106,24 @@ QString VisualizationWidget::name() const return QStringLiteral("MainView"); } -void VisualizationWidget::attachVariableMenu(QMenu *menu, - std::shared_ptr variable) noexcept +void VisualizationWidget::attachVariableMenu( + QMenu *menu, const QVector > &variables) noexcept { - // Generates the actions that make it possible to visualize the variable - auto generateVariableMenuOperation = GenerateVariableMenuOperation{menu, variable}; - accept(&generateVariableMenuOperation); + // Menu is generated only if there is a single variable + if (variables.size() == 1) { + if (auto variable = variables.first()) { + // Generates the actions that make it possible to visualize the variable + auto generateVariableMenuOperation = GenerateVariableMenuOperation{menu, variable}; + accept(&generateVariableMenuOperation); + } + else { + qCCritical(LOG_VisualizationWidget()) << tr( + "Can't generate the menu relative to the visualization: the variable is null"); + } + } + else { + qCDebug(LOG_VisualizationWidget()) + << tr("No generation of the menu related to the visualization: several variables are " + "selected"); + } } diff --git a/gui/ui/Variable/VariableMenuHeaderWidget.ui b/gui/ui/Variable/VariableMenuHeaderWidget.ui new file mode 100644 index 0000000..141d286 --- /dev/null +++ b/gui/ui/Variable/VariableMenuHeaderWidget.ui @@ -0,0 +1,31 @@ + + + VariableMenuHeaderWidget + + + + 0 + 0 + 110 + 34 + + + + + + + background-color: rgba(127, 127, 127, 127); + + + TextLabel + + + Qt::AlignCenter + + + + + + + +