VisualizationGraphWidget.cpp
86 lines
| 2.7 KiB
| text/x-c
|
CppLexer
r95 | #include "Visualization/VisualizationGraphWidget.h" | |||
Alexandre Leroux
|
r184 | #include "Visualization/GraphPlottablesFactory.h" | ||
r58 | #include "ui_VisualizationGraphWidget.h" | |||
r118 | #include <Variable/Variable.h> | |||
#include <unordered_map> | ||||
Alexandre Leroux
|
r179 | namespace { | ||
/// Key pressed to enable zoom on horizontal axis | ||||
const auto HORIZONTAL_ZOOM_MODIFIER = Qt::NoModifier; | ||||
/// Key pressed to enable zoom on vertical axis | ||||
const auto VERTICAL_ZOOM_MODIFIER = Qt::ControlModifier; | ||||
} // namespace | ||||
r118 | struct VisualizationGraphWidget::VisualizationGraphWidgetPrivate { | |||
// 1 variable -> n qcpplot | ||||
Alexandre Leroux
|
r184 | std::unordered_map<std::shared_ptr<Variable>, QCPAbstractPlottable *> m_VariableToPlotMap; | ||
r118 | }; | |||
r58 | VisualizationGraphWidget::VisualizationGraphWidget(QWidget *parent) | |||
r120 | : QWidget{parent}, | |||
ui{new Ui::VisualizationGraphWidget}, | ||||
r118 | impl{spimpl::make_unique_impl<VisualizationGraphWidgetPrivate>()} | |||
r58 | { | |||
ui->setupUi(this); | ||||
Alexandre Leroux
|
r178 | |||
// Set qcpplot properties : | ||||
Alexandre Leroux
|
r180 | // - Drag (on x-axis) and zoom are enabled | ||
Alexandre Leroux
|
r179 | // - Mouse wheel on qcpplot is intercepted to determine the zoom orientation | ||
Alexandre Leroux
|
r178 | ui->widget->setInteractions(QCP::iRangeDrag | QCP::iRangeZoom); | ||
Alexandre Leroux
|
r180 | ui->widget->axisRect()->setRangeDrag(Qt::Horizontal); | ||
Alexandre Leroux
|
r179 | connect(ui->widget, &QCustomPlot::mouseWheel, this, &VisualizationGraphWidget::onMouseWheel); | ||
r58 | } | |||
VisualizationGraphWidget::~VisualizationGraphWidget() | ||||
{ | ||||
delete ui; | ||||
} | ||||
r118 | ||||
void VisualizationGraphWidget::addVariable(std::shared_ptr<Variable> variable) | ||||
{ | ||||
Alexandre Leroux
|
r184 | // Uses delegate to create the qcpplot components according to the variable | ||
auto createdPlottables = GraphPlottablesFactory::create(variable.get(), *ui->widget); | ||||
for (auto createdPlottable : qAsConst(createdPlottables)) { | ||||
impl->m_VariableToPlotMap.insert({variable, createdPlottable}); | ||||
} | ||||
r118 | } | |||
void VisualizationGraphWidget::accept(IVisualizationWidget *visitor) | ||||
{ | ||||
// TODO: manage the visitor | ||||
} | ||||
void VisualizationGraphWidget::close() | ||||
{ | ||||
// The main view cannot be directly closed. | ||||
return; | ||||
} | ||||
r119 | QString VisualizationGraphWidget::name() const | |||
r118 | { | |||
return QStringLiteral("MainView"); | ||||
} | ||||
Alexandre Leroux
|
r179 | |||
void VisualizationGraphWidget::onMouseWheel(QWheelEvent *event) noexcept | ||||
{ | ||||
auto zoomOrientations = QFlags<Qt::Orientation>{}; | ||||
// Lambda that enables a zoom orientation if the key modifier related to this orientation has | ||||
// been pressed | ||||
auto enableOrientation | ||||
= [&zoomOrientations, event](const auto &orientation, const auto &modifier) { | ||||
auto orientationEnabled = event->modifiers().testFlag(modifier); | ||||
zoomOrientations.setFlag(orientation, orientationEnabled); | ||||
}; | ||||
enableOrientation(Qt::Vertical, VERTICAL_ZOOM_MODIFIER); | ||||
enableOrientation(Qt::Horizontal, HORIZONTAL_ZOOM_MODIFIER); | ||||
ui->widget->axisRect()->setRangeZoom(zoomOrientations); | ||||
} | ||||