VisualizationZoneWidget.cpp
200 lines
| 8.2 KiB
| text/x-c
|
CppLexer
r93 | #include "Visualization/VisualizationZoneWidget.h" | |||
r410 | ||||
#include "Data/SqpDateTime.h" | ||||
Alexandre Leroux
|
r192 | #include "Visualization/IVisualizationWidgetVisitor.h" | ||
r410 | #include "Visualization/VisualizationGraphWidget.h" | |||
r58 | #include "ui_VisualizationZoneWidget.h" | |||
r111 | ||||
Alexandre Leroux
|
r245 | #include <SqpApplication.h> | ||
Alexandre Leroux
|
r204 | Q_LOGGING_CATEGORY(LOG_VisualizationZoneWidget, "VisualizationZoneWidget") | ||
Alexandre Leroux
|
r186 | namespace { | ||
Alexandre Leroux
|
r284 | /// Minimum height for graph added in zones (in pixels) | ||
const auto GRAPH_MINIMUM_HEIGHT = 300; | ||||
Alexandre Leroux
|
r186 | /// Generates a default name for a new graph, according to the number of graphs already displayed in | ||
/// the zone | ||||
QString defaultGraphName(const QLayout &layout) | ||||
{ | ||||
auto count = 0; | ||||
for (auto i = 0; i < layout.count(); ++i) { | ||||
if (dynamic_cast<VisualizationGraphWidget *>(layout.itemAt(i)->widget())) { | ||||
count++; | ||||
} | ||||
} | ||||
return QObject::tr("Graph %1").arg(count + 1); | ||||
} | ||||
} // namespace | ||||
Alexandre Leroux
|
r183 | VisualizationZoneWidget::VisualizationZoneWidget(const QString &name, QWidget *parent) | ||
r89 | : QWidget{parent}, ui{new Ui::VisualizationZoneWidget} | |||
r58 | { | |||
ui->setupUi(this); | ||||
Alexandre Leroux
|
r183 | |||
ui->zoneNameLabel->setText(name); | ||||
Alexandre Leroux
|
r245 | |||
// 'Close' options : widget is deleted when closed | ||||
setAttribute(Qt::WA_DeleteOnClose); | ||||
connect(ui->closeButton, &QToolButton::clicked, this, &VisualizationZoneWidget::close); | ||||
ui->closeButton->setIcon(sqpApp->style()->standardIcon(QStyle::SP_TitleBarCloseButton)); | ||||
r58 | } | |||
VisualizationZoneWidget::~VisualizationZoneWidget() | ||||
{ | ||||
delete ui; | ||||
} | ||||
r111 | ||||
void VisualizationZoneWidget::addGraph(VisualizationGraphWidget *graphWidget) | ||||
{ | ||||
ui->visualizationZoneFrame->layout()->addWidget(graphWidget); | ||||
} | ||||
Alexandre Leroux
|
r186 | VisualizationGraphWidget *VisualizationZoneWidget::createGraph(std::shared_ptr<Variable> variable) | ||
r111 | { | |||
Alexandre Leroux
|
r186 | auto graphWidget = new VisualizationGraphWidget{ | ||
defaultGraphName(*ui->visualizationZoneFrame->layout()), this}; | ||||
Alexandre Leroux
|
r284 | |||
r410 | ||||
Alexandre Leroux
|
r284 | // Set graph properties | ||
graphWidget->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::MinimumExpanding); | ||||
graphWidget->setMinimumHeight(GRAPH_MINIMUM_HEIGHT); | ||||
r111 | this->addGraph(graphWidget); | |||
Alexandre Leroux
|
r186 | graphWidget->addVariable(variable); | ||
r410 | // Lambda to synchronize zone widget | |||
auto synchronizeZoneWidget = [this, graphWidget](const SqpDateTime &dateTime, | ||||
const SqpDateTime &oldDateTime, | ||||
VisualizationGraphWidgetZoomType zoomType) { | ||||
auto frameLayout = ui->visualizationZoneFrame->layout(); | ||||
for (auto i = 0; i < frameLayout->count(); ++i) { | ||||
auto graphChild | ||||
= dynamic_cast<VisualizationGraphWidget *>(frameLayout->itemAt(i)->widget()); | ||||
if (graphChild && (graphChild != graphWidget)) { | ||||
auto graphChildRange = graphChild->graphRange(); | ||||
switch (zoomType) { | ||||
case VisualizationGraphWidgetZoomType::ZoomIn: { | ||||
auto deltaLeft = dateTime.m_TStart - oldDateTime.m_TStart; | ||||
auto deltaRight = oldDateTime.m_TEnd - dateTime.m_TEnd; | ||||
graphChildRange.m_TStart += deltaLeft; | ||||
graphChildRange.m_TEnd -= deltaRight; | ||||
r411 | qCCritical(LOG_VisualizationZoneWidget()) << tr("TORM: ZoomIn"); | |||
qCCritical(LOG_VisualizationZoneWidget()) << tr("TORM: deltaLeft") | ||||
<< deltaLeft; | ||||
qCCritical(LOG_VisualizationZoneWidget()) << tr("TORM: deltaRight") | ||||
<< deltaRight; | ||||
qCCritical(LOG_VisualizationZoneWidget()) | ||||
<< tr("TORM: dt") << dateTime.m_TEnd - dateTime.m_TStart; | ||||
r410 | break; | |||
} | ||||
case VisualizationGraphWidgetZoomType::ZoomOut: { | ||||
r411 | qCCritical(LOG_VisualizationZoneWidget()) << tr("TORM: ZoomOut"); | |||
r410 | auto deltaLeft = oldDateTime.m_TStart - dateTime.m_TStart; | |||
auto deltaRight = dateTime.m_TEnd - oldDateTime.m_TEnd; | ||||
r411 | qCCritical(LOG_VisualizationZoneWidget()) << tr("TORM: deltaLeft") | |||
<< deltaLeft; | ||||
qCCritical(LOG_VisualizationZoneWidget()) << tr("TORM: deltaRight") | ||||
<< deltaRight; | ||||
qCCritical(LOG_VisualizationZoneWidget()) | ||||
<< tr("TORM: dt") << dateTime.m_TEnd - dateTime.m_TStart; | ||||
r410 | graphChildRange.m_TStart -= deltaLeft; | |||
graphChildRange.m_TEnd += deltaRight; | ||||
break; | ||||
} | ||||
case VisualizationGraphWidgetZoomType::PanRight: { | ||||
r411 | qCCritical(LOG_VisualizationZoneWidget()) << tr("TORM: PanRight"); | |||
r410 | auto deltaRight = dateTime.m_TEnd - oldDateTime.m_TEnd; | |||
graphChildRange.m_TStart += deltaRight; | ||||
graphChildRange.m_TEnd += deltaRight; | ||||
r411 | qCCritical(LOG_VisualizationZoneWidget()) | |||
<< tr("TORM: dt") << dateTime.m_TEnd - dateTime.m_TStart; | ||||
r410 | break; | |||
} | ||||
case VisualizationGraphWidgetZoomType::PanLeft: { | ||||
r411 | qCCritical(LOG_VisualizationZoneWidget()) << tr("TORM: PanLeft"); | |||
r410 | auto deltaLeft = oldDateTime.m_TStart - dateTime.m_TStart; | |||
graphChildRange.m_TStart -= deltaLeft; | ||||
graphChildRange.m_TEnd -= deltaLeft; | ||||
break; | ||||
} | ||||
case VisualizationGraphWidgetZoomType::Unknown: { | ||||
qCCritical(LOG_VisualizationZoneWidget()) | ||||
<< tr("Impossible to synchronize: zoom type unknown"); | ||||
break; | ||||
} | ||||
default: | ||||
qCCritical(LOG_VisualizationZoneWidget()) | ||||
<< tr("Impossible to synchronize: zoom type not take into account"); | ||||
// No action | ||||
break; | ||||
} | ||||
graphChild->enableSynchronize(false); | ||||
r411 | qCCritical(LOG_VisualizationZoneWidget()) << tr("TORM: Range before: ") | |||
<< graphChild->graphRange(); | ||||
qCCritical(LOG_VisualizationZoneWidget()) << tr("TORM: Range after : ") | ||||
<< graphChildRange; | ||||
qCCritical(LOG_VisualizationZoneWidget()) | ||||
<< tr("TORM: child dt") << graphChildRange.m_TEnd - graphChildRange.m_TStart; | ||||
graphChild->setGraphRange(graphChildRange); | ||||
r410 | graphChild->enableSynchronize(true); | |||
} | ||||
} | ||||
}; | ||||
// connection for synchronization | ||||
connect(graphWidget, &VisualizationGraphWidget::synchronize, synchronizeZoneWidget); | ||||
r111 | return graphWidget; | |||
} | ||||
Alexandre Leroux
|
r192 | void VisualizationZoneWidget::accept(IVisualizationWidgetVisitor *visitor) | ||
r111 | { | |||
Alexandre Leroux
|
r193 | if (visitor) { | ||
visitor->visitEnter(this); | ||||
// Apply visitor to graph children | ||||
auto layout = ui->visualizationZoneFrame->layout(); | ||||
for (auto i = 0; i < layout->count(); ++i) { | ||||
if (auto item = layout->itemAt(i)) { | ||||
Alexandre Leroux
|
r205 | // Widgets different from graphs are not visited (no action) | ||
Alexandre Leroux
|
r193 | if (auto visualizationGraphWidget | ||
= dynamic_cast<VisualizationGraphWidget *>(item->widget())) { | ||||
visualizationGraphWidget->accept(visitor); | ||||
} | ||||
} | ||||
} | ||||
visitor->visitLeave(this); | ||||
} | ||||
Alexandre Leroux
|
r204 | else { | ||
qCCritical(LOG_VisualizationZoneWidget()) << tr("Can't visit widget : the visitor is null"); | ||||
} | ||||
r111 | } | |||
Alexandre Leroux
|
r194 | bool VisualizationZoneWidget::canDrop(const Variable &variable) const | ||
{ | ||||
// A tab can always accomodate a variable | ||||
Q_UNUSED(variable); | ||||
return true; | ||||
} | ||||
Alexandre Leroux
|
r301 | bool VisualizationZoneWidget::contains(const Variable &variable) const | ||
{ | ||||
Q_UNUSED(variable); | ||||
return false; | ||||
} | ||||
r112 | QString VisualizationZoneWidget::name() const | |||
r111 | { | |||
Alexandre Leroux
|
r183 | return ui->zoneNameLabel->text(); | ||
r111 | } | |||