From b4645eb8f4e102dcb9abb6e46ed0e4536ea03f0f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ra=C3=BCl=20Ojeda=20Gandia?= Date: Fri, 3 Jul 2026 13:02:44 +0200 Subject: [PATCH] Make draw area expand horizontally and improve axis rendering MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Raül Ojeda Gandia --- forms/mainwindow.ui | 20 ++++-------- images/eProsimaLogo.png | Bin 11123 -> 9912 bytes include/eprosimashapesdemo/qt/DrawArea.h | 20 ++++++++++++ .../shapesdemo/ShapesDemo.h | 9 ++++++ src/qt/AxisArrowOverlay.cpp | 10 ++++-- src/qt/DrawArea.cpp | 22 +++++++++++++ src/qt/mainwindow.cpp | 3 ++ src/shapesdemo/ShapesDemo.cpp | 30 ++++++++++++++++++ 8 files changed, 98 insertions(+), 16 deletions(-) diff --git a/forms/mainwindow.ui b/forms/mainwindow.ui index 13605a8..12d45f3 100644 --- a/forms/mainwindow.ui +++ b/forms/mainwindow.ui @@ -76,16 +76,16 @@ - QFrame::StyledPanel + QFrame::NoFrame - QFrame::Sunken + QFrame::Plain - + 0 0 @@ -98,7 +98,7 @@ - 237 + 16777215 267 @@ -130,7 +130,7 @@ - + 0 0 @@ -143,7 +143,7 @@ - 235 + 16777215 265 @@ -288,14 +288,6 @@ - - - BottomToolBarArea - - - false - - diff --git a/images/eProsimaLogo.png b/images/eProsimaLogo.png index acc4dce95eb5887218bb11479bb1fe04ab9d7c9f..8d1d750d1b5b1a3ef798bf54b083c2456ae92e91 100644 GIT binary patch literal 9912 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 KqIi|4VbFgghQ??B diff --git a/include/eprosimashapesdemo/qt/DrawArea.h b/include/eprosimashapesdemo/qt/DrawArea.h index c9108cf..9ce68a3 100644 --- a/include/eprosimashapesdemo/qt/DrawArea.h +++ b/include/eprosimashapesdemo/qt/DrawArea.h @@ -100,8 +100,25 @@ class DrawArea : public QWidget void addContentFilter( ShapeSubscriber* ssub); + /** + * @brief setDrawAreaResizeTarget Sets the ShapesDemo that should be notified + * of the draw area width whenever it changes, so the movement bounds track + * the window size. + * @param SD Pointer to the ShapesDemo object. + */ + void setDrawAreaResizeTarget( + ShapesDemo* SD); + protected: + /** + * @brief resizeEvent Reports the new width to the ShapesDemo so shapes can + * use the extra horizontal space (and be dragged back in when shrinking). + * @param event Pointer to the resize event. + */ + void resizeEvent( + QResizeEvent* event) override; + /** * @brief paintEvent Paintevent method. * @param event Pointer to the event. @@ -135,6 +152,9 @@ class DrawArea : public QWidget bool isHistory = false); ShapesDemo* mp_SD; + // ShapesDemo notified of width changes (may differ from mp_SD lifetime-wise, + // kept separate so a resize before setShapesDemo() is still safe). + ShapesDemo* mp_resizeSD = nullptr; bool m_isInitialized; // std::vector m_shapes; float firstA, lastA; diff --git a/include/eprosimashapesdemo/shapesdemo/ShapesDemo.h b/include/eprosimashapesdemo/shapesdemo/ShapesDemo.h index aaa31c9..d3ce592 100644 --- a/include/eprosimashapesdemo/shapesdemo/ShapesDemo.h +++ b/include/eprosimashapesdemo/shapesdemo/ShapesDemo.h @@ -210,6 +210,15 @@ class ShapesDemo Topic* getTopic( std::string topic_name); + /** + * @brief setDrawAreaWidth Update the horizontal movement bound to match the + * current draw area width. When the area shrinks, already-published shapes + * are dragged back inside so they do not end up outside the visible window. + * @param width New draw area width in pixels. + */ + void setDrawAreaWidth( + uint32_t width); + private: std::vector m_publishers; diff --git a/src/qt/AxisArrowOverlay.cpp b/src/qt/AxisArrowOverlay.cpp index cfc0d0e..447d14c 100644 --- a/src/qt/AxisArrowOverlay.cpp +++ b/src/qt/AxisArrowOverlay.cpp @@ -22,6 +22,7 @@ #include #include #include +#include #include #include #include @@ -99,9 +100,14 @@ void AxisArrowOverlay::paintEvent( const int bottomY = fd2.bottom() - 1; const int leftX = qMax(0, fd2.left() - yw - 3); + // Follow the theme foreground: black in a light theme, light grey in a dark + // theme. darker(140) tones the dark-theme near-white down to a grey; on the + // light-theme black it has no effect (black cannot be darkened further). + const QColor axisColor = palette().color(QPalette::WindowText).darker(140); + // Draw filled shapes (no outline) p.setPen(Qt::NoPen); - p.setBrush(Qt::black); + p.setBrush(axisColor); // Origin dot at the corner where both axes meet. // Not inverted: top-left corner. Inverted: bottom-left corner. @@ -143,7 +149,7 @@ void AxisArrowOverlay::paintEvent( } // Axis labels - p.setPen(Qt::black); + p.setPen(axisColor); p.drawText(QRect(rightX, invertY ? bottomY : topY, xw, lh), Qt::AlignLeft | Qt::AlignTop, "X"); p.drawText(QRect(leftX, invertY ? topY : bottomY, yw, lh), diff --git a/src/qt/DrawArea.cpp b/src/qt/DrawArea.cpp index 1548e55..dd18633 100644 --- a/src/qt/DrawArea.cpp +++ b/src/qt/DrawArea.cpp @@ -28,6 +28,7 @@ #include #include +#include #include #include #include @@ -250,3 +251,24 @@ void DrawArea::setShapesDemo( m_isInitialized = true; } } + +void DrawArea::setDrawAreaResizeTarget( + ShapesDemo* SD) +{ + mp_resizeSD = SD; + // Report the initial width so the bounds are consistent from the start. + if (mp_resizeSD != NULL) + { + mp_resizeSD->setDrawAreaWidth(width()); + } +} + +void DrawArea::resizeEvent( + QResizeEvent* e) +{ + QWidget::resizeEvent(e); + if (mp_resizeSD != NULL) + { + mp_resizeSD->setDrawAreaWidth(width()); + } +} diff --git a/src/qt/mainwindow.cpp b/src/qt/mainwindow.cpp index 54b29f9..9681e29 100644 --- a/src/qt/mainwindow.cpp +++ b/src/qt/mainwindow.cpp @@ -50,6 +50,9 @@ MainWindow::MainWindow( ui->setupUi(this); ui->areaDraw->setShapesDemo(this->getShapesDemo()); + // Let the draw area report its size back so the movement bounds (maxX) can + // grow/shrink together with the window width. + ui->areaDraw->setDrawAreaResizeTarget(this->getShapesDemo()); m_axisOverlay = new AxisArrowOverlay(ui->frameDraw, ui->frameDraw2, this->getShapesDemo()); m_axisOverlay->raise(); diff --git a/src/shapesdemo/ShapesDemo.cpp b/src/shapesdemo/ShapesDemo.cpp index 2be8aa2..b986ad7 100644 --- a/src/shapesdemo/ShapesDemo.cpp +++ b/src/shapesdemo/ShapesDemo.cpp @@ -388,6 +388,36 @@ void ShapesDemo::moveShape( sh->m_shape.y(ny); } +void ShapesDemo::setDrawAreaWidth( + uint32_t width) +{ + // Never shrink below the historical/default width, so the coordinate space + // stays consistent with other Shapes Demo implementations. + uint32_t new_max_x = width < MAX_DRAW_AREA_X ? MAX_DRAW_AREA_X : width; + + QMutexLocker lock(&m_mutex); + bool shrinking = new_max_x < maxX; + maxX = new_max_x; + + // When the area shrinks, drag any published shape that would now fall + // outside the window back inside its right edge. + if (shrinking) + { + for (std::vector::iterator it = m_publishers.begin(); + it != m_publishers.end(); ++it) + { + QMutexLocker lock2(&(*it)->m_mutex); + Shape& sh = (*it)->m_shape; + int half = (int)sh.m_shape.shapesize() / 2; + int max_center = (int)maxX - half; + if ((int)sh.m_shape.x() > max_center) + { + sh.m_shape.x(max_center > half ? max_center : half); + } + } + } +} + void ShapesDemo::getNewDirection( Shape* sh) {