feat: Add feature browser dock widget with document synchronization

Co-authored-by: aider (gemini/gemini-2.5-pro) <aider@aider.chat>
This commit is contained in:
2026-02-09 17:26:51 -07:00
parent d2d49726d6
commit 0b6cbf825a
4 changed files with 48 additions and 1 deletions

View File

@@ -19,12 +19,14 @@ Document::~Document()
void Document::addFeature(Feature* feature) void Document::addFeature(Feature* feature)
{ {
m_features.append(feature); m_features.append(feature);
emit featureAdded(feature);
} }
void Document::clear() void Document::clear()
{ {
qDeleteAll(m_features); qDeleteAll(m_features);
m_features.clear(); m_features.clear();
emit cleared();
} }
bool Document::save(const QString& path) const bool Document::save(const QString& path) const

View File

@@ -19,6 +19,10 @@ public:
bool save(const QString& path) const; bool save(const QString& path) const;
bool load(const QString& path); bool load(const QString& path);
signals:
void featureAdded(Feature* feature);
void cleared();
private: private:
QList<Feature*> m_features; QList<Feature*> m_features;
}; };

View File

@@ -2,11 +2,15 @@
#include "ViewportWidget.h" #include "ViewportWidget.h"
#include "Document.h" #include "Document.h"
#include "SketchFeature.h" #include "SketchFeature.h"
#include "Feature.h"
#include <QMenuBar> #include <QMenuBar>
#include <QMenu> #include <QMenu>
#include <QFileDialog> #include <QFileDialog>
#include <QMessageBox> #include <QMessageBox>
#include <QDockWidget>
#include <QTreeWidget>
#include <QTreeWidgetItem>
#include <QToolBar> #include <QToolBar>
#include <QTabWidget> #include <QTabWidget>
#include <QWidget> #include <QWidget>
@@ -80,6 +84,18 @@ MainWindow::MainWindow(QWidget *parent)
setCentralWidget(m_viewport); setCentralWidget(m_viewport);
m_document = new Document(this); m_document = new Document(this);
connect(m_document, &Document::featureAdded, this, &MainWindow::onFeatureAdded);
connect(m_document, &Document::cleared, this, &MainWindow::onDocumentCleared);
QDockWidget *dock = new QDockWidget("Browser", this);
addDockWidget(Qt::LeftDockWidgetArea, dock);
m_featureTree = new QTreeWidget(dock);
m_featureTree->setHeaderHidden(true);
dock->setWidget(m_featureTree);
m_rootItem = new QTreeWidgetItem(m_featureTree);
setCurrentFile(QString()); setCurrentFile(QString());
} }
@@ -161,6 +177,22 @@ void MainWindow::setCurrentFile(const QString &fileName)
QString shownName = m_currentFile; QString shownName = m_currentFile;
if (m_currentFile.isEmpty()) if (m_currentFile.isEmpty())
shownName = "untitled.json"; shownName = "Untitled";
setWindowTitle(tr("%1[*] - %2").arg(QFileInfo(shownName).fileName(), tr("OpenCAD"))); setWindowTitle(tr("%1[*] - %2").arg(QFileInfo(shownName).fileName(), tr("OpenCAD")));
if (m_rootItem) {
m_rootItem->setText(0, QFileInfo(shownName).fileName());
}
}
void MainWindow::onFeatureAdded(Feature* feature)
{
QTreeWidgetItem *item = new QTreeWidgetItem(m_rootItem);
item->setText(0, feature->name());
m_rootItem->setExpanded(true);
}
void MainWindow::onDocumentCleared()
{
qDeleteAll(m_rootItem->takeChildren());
} }

View File

@@ -5,6 +5,9 @@
class ViewportWidget; class ViewportWidget;
class Document; class Document;
class Feature;
class QTreeWidget;
class QTreeWidgetItem;
class MainWindow : public QMainWindow class MainWindow : public QMainWindow
{ {
@@ -20,12 +23,18 @@ private slots:
bool saveAs(); bool saveAs();
void createSketch(); void createSketch();
void onFeatureAdded(Feature* feature);
void onDocumentCleared();
private: private:
void setCurrentFile(const QString &fileName); void setCurrentFile(const QString &fileName);
ViewportWidget *m_viewport; ViewportWidget *m_viewport;
Document *m_document; Document *m_document;
QString m_currentFile; QString m_currentFile;
QTreeWidget* m_featureTree;
QTreeWidgetItem* m_rootItem;
}; };
#endif // MAINWINDOW_H #endif // MAINWINDOW_H