##// END OF EJS Templates
Merge branch 'feature/VariableMenu2' into develop
Alexandre Leroux -
r250:aa2508ab83a4 merge
parent child
Show More
@@ -182,10 +182,16 MainWindow::MainWindow(QWidget *parent)
182 182 connect(timeWidget, SIGNAL(timeUpdated(SqpDateTime)), &sqpApp->timeController(),
183 183 SLOT(onTimeToUpdate(SqpDateTime)));
184 184
185 // Variable
185 // Widgets / widgets connections
186 186 qRegisterMetaType<std::shared_ptr<Variable> >();
187 connect(&sqpApp->visualizationController(), SIGNAL(variableCreated(std::shared_ptr<Variable>)),
188 m_Ui->view, SLOT(displayVariable(std::shared_ptr<Variable>)));
187
188 // For the following connections, we use DirectConnection to allow each widget that can
189 // potentially attach a menu to the variable's menu to do so before this menu is displayed.
190 // The order of connections is also important, since it determines the order in which each
191 // widget will attach its menu
192 connect(m_Ui->variableInspectorWidget,
193 SIGNAL(tableMenuAboutToBeDisplayed(QMenu *, std::shared_ptr<Variable>)), m_Ui->view,
194 SLOT(attachVariableMenu(QMenu *, std::shared_ptr<Variable>)), Qt::DirectConnection);
189 195
190 196 /* QLopGUI::registerMenuBar(menuBar());
191 197 this->setWindowIcon(QIcon(":/sciqlopLOGO.svg"));
@@ -32,6 +32,8 public:
32 32 createVariable(const QString &name, const SqpDateTime &dateTime,
33 33 std::unique_ptr<IDataSeries> defaultDataSeries) noexcept;
34 34
35 std::shared_ptr<Variable> variable(int index) const;
36
35 37 // /////////////////////////// //
36 38 // QAbstractTableModel methods //
37 39 // /////////////////////////// //
@@ -44,6 +44,11 VariableModel::createVariable(const QString &name, const SqpDateTime &dateTime,
44 44 return variable;
45 45 }
46 46
47 std::shared_ptr<Variable> VariableModel::variable(int index) const
48 {
49 return (index >= 0 && index < impl->m_Variables.size()) ? impl->m_Variables.at(index) : nullptr;
50 }
51
47 52 int VariableModel::columnCount(const QModelIndex &parent) const
48 53 {
49 54 Q_UNUSED(parent);
@@ -1,8 +1,13
1 1 #ifndef SCIQLOP_VARIABLEINSPECTORWIDGET_H
2 2 #define SCIQLOP_VARIABLEINSPECTORWIDGET_H
3 3
4 #include <QMenu>
4 5 #include <QWidget>
5 6
7 #include <memory>
8
9 class Variable;
10
6 11 namespace Ui {
7 12 class VariableInspectorWidget;
8 13 } // Ui
@@ -19,8 +24,23 public:
19 24 explicit VariableInspectorWidget(QWidget *parent = 0);
20 25 virtual ~VariableInspectorWidget();
21 26
27 signals:
28 /**
29 * Signal emitted before a menu concerning a variable is displayed. It is used for other widgets
30 * to complete the menu.
31 * @param tableMenu the menu to be completed
32 * @param variable the variable concerned by the menu
33 * @remarks To make the dynamic addition of menus work, the connections to this signal must be
34 * in Qt :: DirectConnection
35 */
36 void tableMenuAboutToBeDisplayed(QMenu *tableMenu, std::shared_ptr<Variable> variable);
37
22 38 private:
23 39 Ui::VariableInspectorWidget *ui;
40
41 private slots:
42 /// Slot called when right clicking on an variable in the table (displays a menu)
43 void onTableMenuRequested(const QPoint &pos) noexcept;
24 44 };
25 45
26 46 #endif // SCIQLOP_VARIABLEINSPECTORWIDGET_H
@@ -8,6 +8,7
8 8
9 9 Q_DECLARE_LOGGING_CATEGORY(LOG_VisualizationWidget)
10 10
11 class QMenu;
11 12 class Variable;
12 13 class VisualizationTabWidget;
13 14
@@ -39,12 +40,11 public:
39 40
40 41 public slots:
41 42 /**
42 * Displays a variable in a new graph of a new zone of the current tab
43 * @param variable the variable to display
44 * @todo this is a temporary method that will be replaced by own actions for each type of
45 * visualization widget
43 * Attaches to a menu the menu relating to the visualization of a variable
44 * @param menu the parent menu of the generated menu
45 * @param variable the variable for which to generate the menu
46 46 */
47 void displayVariable(std::shared_ptr<Variable> variable) noexcept;
47 void attachVariableMenu(QMenu *menu, std::shared_ptr<Variable> variable) noexcept;
48 48
49 49 private:
50 50 Ui::VisualizationWidget *ui;
@@ -18,9 +18,33 VariableInspectorWidget::VariableInspectorWidget(QWidget *parent)
18 18 sortFilterModel->setSourceModel(sqpApp->variableController().variableModel());
19 19
20 20 ui->tableView->setModel(sortFilterModel);
21
22 // Connection to show a menu when right clicking on the tree
23 ui->tableView->setContextMenuPolicy(Qt::CustomContextMenu);
24 connect(ui->tableView, &QTableView::customContextMenuRequested, this,
25 &VariableInspectorWidget::onTableMenuRequested);
21 26 }
22 27
23 28 VariableInspectorWidget::~VariableInspectorWidget()
24 29 {
25 30 delete ui;
26 31 }
32
33 void VariableInspectorWidget::onTableMenuRequested(const QPoint &pos) noexcept
34 {
35 auto selectedIndex = ui->tableView->indexAt(pos);
36 if (selectedIndex.isValid()) {
37 // Gets the model to retrieve the underlying selected variable
38 auto model = sqpApp->variableController().variableModel();
39 if (auto selectedVariable = model->variable(selectedIndex.row())) {
40 QMenu tableMenu{};
41
42 // Emit a signal so that potential receivers can populate the menu before displaying it
43 emit tableMenuAboutToBeDisplayed(&tableMenu, selectedVariable);
44
45 if (!tableMenu.isEmpty()) {
46 tableMenu.exec(mapToGlobal(pos));
47 }
48 }
49 }
50 }
@@ -3,6 +3,7
3 3 #include "Visualization/VisualizationGraphWidget.h"
4 4 #include "Visualization/VisualizationTabWidget.h"
5 5 #include "Visualization/VisualizationZoneWidget.h"
6 #include "Visualization/operations/GenerateVariableMenuOperation.h"
6 7 #include "Visualization/qcustomplot.h"
7 8
8 9 #include "ui_VisualizationWidget.h"
@@ -121,16 +122,10 QString VisualizationWidget::name() const
121 122 return QStringLiteral("MainView");
122 123 }
123 124
124 void VisualizationWidget::displayVariable(std::shared_ptr<Variable> variable) noexcept
125 void VisualizationWidget::attachVariableMenu(QMenu *menu,
126 std::shared_ptr<Variable> variable) noexcept
125 127 {
126 if (auto currentTab = dynamic_cast<VisualizationTabWidget *>(ui->tabWidget->currentWidget())) {
127 if (!currentTab->createZone(variable)) {
128 qCCritical(LOG_VisualizationWidget())
129 << tr("Can't display the variable : can't create a new zone in the current tab");
130 }
131 }
132 else {
133 qCCritical(LOG_VisualizationWidget())
134 << tr("Can't display the variable : there is no current tab");
135 }
128 // Generates the actions that make it possible to visualize the variable
129 auto generateVariableMenuOperation = GenerateVariableMenuOperation{menu, variable};
130 accept(&generateVariableMenuOperation);
136 131 }
General Comments 0
You need to be logged in to leave comments. Login now