From 6e335ef7246eba2c8050b2d5312d7206b2975eca Mon Sep 17 00:00:00 2001 From: Tanner Collin Date: Mon, 9 Feb 2026 17:36:45 -0700 Subject: [PATCH] refactor: Refactor feature browser, move to top-left, and increase font size Co-authored-by: aider (gemini/gemini-2.5-pro) --- src/FeatureBrowser.cpp | 61 ++++++++++++++++++++++++++++++++++++++++++ src/FeatureBrowser.h | 19 +++++++++++++ src/ViewportWidget.cpp | 55 ++++--------------------------------- src/ViewportWidget.h | 5 ++-- 4 files changed, 87 insertions(+), 53 deletions(-) create mode 100644 src/FeatureBrowser.cpp create mode 100644 src/FeatureBrowser.h diff --git a/src/FeatureBrowser.cpp b/src/FeatureBrowser.cpp new file mode 100644 index 0000000..ec03797 --- /dev/null +++ b/src/FeatureBrowser.cpp @@ -0,0 +1,61 @@ +#include "FeatureBrowser.h" +#include "Document.h" +#include "Feature.h" + +#include +#include +#include + +FeatureBrowser::FeatureBrowser() +{ +} + +void FeatureBrowser::setDocument(Document* document) +{ + m_document = document; +} + +void FeatureBrowser::paint(QPainter& painter, int viewportWidth, int viewportHeight) +{ + if (!m_document) { + return; + } + + painter.setRenderHint(QPainter::Antialiasing); + painter.setFont(QFont("Arial", 12)); + + const int padding = 5; + const int margin = 10; + int x = margin; + int y = margin; + int lineHeight = painter.fontMetrics().height(); + const QList& features = m_document->features(); + QString docName = m_document->fileName(); + + int maxWidth = painter.fontMetrics().horizontalAdvance(docName); + + for (const Feature* feature : features) { + maxWidth = std::max(maxWidth, painter.fontMetrics().horizontalAdvance(" " + feature->name())); + } + + int boxWidth = maxWidth + 2 * padding; + int boxHeight = (features.size() + 1) * lineHeight + 2 * padding; + + // Draw transparent background + painter.setPen(Qt::NoPen); + painter.setBrush(QColor(50, 50, 50, 150)); + painter.drawRoundedRect(x, y, boxWidth, boxHeight, 3, 3); + + // Draw text + painter.setPen(Qt::white); + int currentY = y + padding + lineHeight; + int textX = x + padding; + + painter.drawText(textX, currentY, docName); + currentY += lineHeight; + + for (const Feature* feature : features) { + painter.drawText(textX + 10, currentY, feature->name()); + currentY += lineHeight; + } +} diff --git a/src/FeatureBrowser.h b/src/FeatureBrowser.h new file mode 100644 index 0000000..4b2cda3 --- /dev/null +++ b/src/FeatureBrowser.h @@ -0,0 +1,19 @@ +#ifndef FEATUREBROWSER_H +#define FEATUREBROWSER_H + +class QPainter; +class Document; + +class FeatureBrowser +{ +public: + FeatureBrowser(); + + void setDocument(Document* document); + void paint(QPainter& painter, int viewportWidth, int viewportHeight); + +private: + Document* m_document = nullptr; +}; + +#endif // FEATUREBROWSER_H diff --git a/src/ViewportWidget.cpp b/src/ViewportWidget.cpp index b00ff0a..b1599dd 100644 --- a/src/ViewportWidget.cpp +++ b/src/ViewportWidget.cpp @@ -2,8 +2,7 @@ #include "ViewCube.h" #include "SketchGrid.h" #include "Document.h" -#include "Feature.h" -#include +#include "FeatureBrowser.h" #include #include #include @@ -16,17 +15,19 @@ ViewportWidget::ViewportWidget(QWidget *parent) { m_viewCube = new ViewCube(); m_sketchGrid = new SketchGrid(); + m_featureBrowser = new FeatureBrowser(); } ViewportWidget::~ViewportWidget() { delete m_viewCube; delete m_sketchGrid; + delete m_featureBrowser; } void ViewportWidget::setDocument(Document* document) { - m_document = document; + m_featureBrowser->setDocument(document); } void ViewportWidget::initializeGL() @@ -73,7 +74,7 @@ void ViewportWidget::paintGL() if (m_currentPlane != SketchPlane::NONE) { drawAxisLabels(painter, model, projection); } - drawFeatureBrowser(painter); + m_featureBrowser->paint(painter, width(), height()); painter.end(); } @@ -191,49 +192,3 @@ void ViewportWidget::drawAxisLabels(QPainter& painter, const QMatrix4x4& modelVi } } -void ViewportWidget::drawFeatureBrowser(QPainter& painter) -{ - if (!m_document) { - return; - } - - painter.setRenderHint(QPainter::Antialiasing); - painter.setFont(QFont("Arial", 10)); - - const int padding = 5; - const int margin = 10; - int x = margin; - int y = height() - margin; - int lineHeight = painter.fontMetrics().height(); - const QList& features = m_document->features(); - QString docName = m_document->fileName(); - - int maxWidth = painter.fontMetrics().horizontalAdvance(docName); - - for (const Feature* feature : features) { - maxWidth = std::max(maxWidth, painter.fontMetrics().horizontalAdvance(" " + feature->name())); - } - - int boxWidth = maxWidth + 2 * padding; - int boxHeight = (features.size() + 1) * lineHeight + 2 * padding; - - y -= boxHeight; // Adjust y to be the top of the box - - // Draw transparent background - painter.setPen(Qt::NoPen); - painter.setBrush(QColor(50, 50, 50, 150)); - painter.drawRoundedRect(x, y, boxWidth, boxHeight, 3, 3); - - // Draw text - painter.setPen(Qt::white); - int currentY = y + padding + lineHeight; - int textX = x + padding; - - painter.drawText(textX, currentY, docName); - currentY += lineHeight; - - for (const Feature* feature : features) { - painter.drawText(textX + 10, currentY, feature->name()); - currentY += lineHeight; - } -} diff --git a/src/ViewportWidget.h b/src/ViewportWidget.h index 932596a..4e47d50 100644 --- a/src/ViewportWidget.h +++ b/src/ViewportWidget.h @@ -11,7 +11,7 @@ class ViewCube; class SketchGrid; class Document; -class Feature; +class FeatureBrowser; class ViewportWidget : public QOpenGLWidget, protected QOpenGLFunctions { @@ -43,12 +43,11 @@ protected: private: QVector3D project(const QVector3D& worldCoord, const QMatrix4x4& modelView, const QMatrix4x4& projection, const QRect& viewport); void drawAxisLabels(QPainter& painter, const QMatrix4x4& modelView, const QMatrix4x4& projection); - void drawFeatureBrowser(QPainter& painter); QMatrix4x4 projection; ViewCube* m_viewCube; SketchGrid* m_sketchGrid = nullptr; - Document* m_document = nullptr; + FeatureBrowser* m_featureBrowser = nullptr; SketchPlane m_currentPlane = SketchPlane::NONE; float xRot = 0;