@@ -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 |
|
|
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