From 0352e19e34c1fb651a4f41be1e123448b68d4e29 Mon Sep 17 00:00:00 2001 From: Michel Dagenais Date: Tue, 26 May 2020 13:56:11 -0400 Subject: [PATCH] Clip the Meter Widgets to the visible portion of the Video Window (#3462) When the video widget is scrolled, the MeterWidget windows appeared on top of the Main Window user interface. Now the visible portion of the Video Window is tracked and used as a clipping region. This avoids blocking the controls on bottom toolbar. --- src/Train/MeterWidget.cpp | 12 ++++++++++++ src/Train/MeterWidget.h | 2 ++ src/Train/VideoLayoutParser.cpp | 1 + 3 files changed, 15 insertions(+) diff --git a/src/Train/MeterWidget.cpp b/src/Train/MeterWidget.cpp index a34444577..9552e2dc4 100644 --- a/src/Train/MeterWidget.cpp +++ b/src/Train/MeterWidget.cpp @@ -70,6 +70,7 @@ void MeterWidget::SetRelativePos(float RelativePosX, float RelativePosY) void MeterWidget::AdjustSizePos() { + // Compute the size and position relative to its parent QPoint p; if (m_container->windowFlags() & Qt::Window) p = m_container->pos(); @@ -80,6 +81,11 @@ void MeterWidget::AdjustSizePos() m_PosY = p.y() + m_container->height() * m_RelativePosY - m_Height/2; move(m_PosX, m_PosY); adjustSize(); + + // Translate the Video Container visible region to our coordinate for clipping + QPoint vp = m_VideoContainer->pos(); + videoContainerRegion = m_VideoContainer->visibleRegion(); + videoContainerRegion.translate(mapFromGlobal(m_VideoContainer->mapToGlobal(vp)) - vp); } void MeterWidget::ComputeSize() @@ -116,6 +122,7 @@ void MeterWidget::paintEvent(QPaintEvent* paintevent) //painter QPainter painter(this); + painter.setClipRegion(videoContainerRegion); painter.setRenderHint(QPainter::Antialiasing); painter.setPen(m_OutlinePen); @@ -151,6 +158,7 @@ void TextMeterWidget::paintEvent(QPaintEvent* paintevent) //painter QPainter painter(this); + painter.setClipRegion(videoContainerRegion); painter.setRenderHint(QPainter::Antialiasing); //draw background @@ -196,6 +204,7 @@ void CircularIndicatorMeterWidget::paintEvent(QPaintEvent* paintevent) //painter QPainter painter(this); + painter.setClipRegion(videoContainerRegion); painter.setRenderHint(QPainter::Antialiasing); // define scale and location painter.translate(m_Width / 2, m_Height / 2); @@ -242,6 +251,7 @@ void CircularBargraphMeterWidget::paintEvent(QPaintEvent* paintevent) //painter QPainter painter(this); + painter.setClipRegion(videoContainerRegion); painter.setRenderHint(QPainter::Antialiasing); //draw bargraph @@ -277,6 +287,7 @@ void NeedleMeterWidget::paintEvent(QPaintEvent* paintevent) //painter QPainter painter(this); + painter.setClipRegion(videoContainerRegion); painter.setRenderHint(QPainter::Antialiasing); //draw background @@ -339,6 +350,7 @@ void ElevationMeterWidget::paintEvent(QPaintEvent* paintevent) //painter QPainter painter(this); + painter.setClipRegion(videoContainerRegion); painter.setRenderHint(QPainter::Antialiasing); // Find min/max diff --git a/src/Train/MeterWidget.h b/src/Train/MeterWidget.h index b699424df..9350cf75a 100644 --- a/src/Train/MeterWidget.h +++ b/src/Train/MeterWidget.h @@ -54,6 +54,8 @@ class MeterWidget : public QWidget QString m_Name; QWidget* m_container; QString m_Source; + QWidget* m_VideoContainer; + QRegion videoContainerRegion; float m_RelativeWidth, m_RelativeHeight; float m_RelativePosX, m_RelativePosY; int m_PosX, m_PosY, m_Width, m_Height; diff --git a/src/Train/VideoLayoutParser.cpp b/src/Train/VideoLayoutParser.cpp index 43646e6a8..3c44b807f 100644 --- a/src/Train/VideoLayoutParser.cpp +++ b/src/Train/VideoLayoutParser.cpp @@ -50,6 +50,7 @@ void VideoLayoutParser::SetDefaultValues() meterWidget->m_BackgroundColor = QColor(100,100,100,0); meterWidget->m_MainFont = QFont(meterWidget->font().family(), 64); meterWidget->m_AltFont = QFont(meterWidget->font().family(), 48); + meterWidget->m_VideoContainer = VideoContainer; } }