#include "MainWindow.h" #include "ViewportWidget.h" #include "Document.h" #include "SketchFeature.h" #include "Feature.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) { setWindowTitle("OpenCAD"); resize(1280, 720); QMenu *fileMenu = menuBar()->addMenu("&File"); QAction *newAction = fileMenu->addAction("&New"); connect(newAction, &QAction::triggered, this, &MainWindow::newFile); QAction *openAction = fileMenu->addAction("&Open..."); connect(openAction, &QAction::triggered, this, &MainWindow::open); QAction *saveAction = fileMenu->addAction("&Save"); connect(saveAction, &QAction::triggered, this, &MainWindow::save); QAction *saveAsAction = fileMenu->addAction("Save &As..."); connect(saveAsAction, &QAction::triggered, this, &MainWindow::saveAs); QToolBar* mainToolBar = addToolBar("Main Toolbar"); mainToolBar->setMovable(false); mainToolBar->setFloatable(false); mainToolBar->setStyleSheet("QToolBar { border: 0px }"); QTabWidget *tabWidget = new QTabWidget(); mainToolBar->addWidget(tabWidget); // --- SOLID Tab --- QWidget *solidTab = new QWidget(); QHBoxLayout *solidLayout = new QHBoxLayout(solidTab); solidLayout->setContentsMargins(5, 5, 5, 5); solidLayout->setSpacing(5); solidLayout->setAlignment(Qt::AlignLeft); QToolButton *createSketchButton = new QToolButton(); createSketchButton->setText("Create Sketch"); createSketchButton->setIcon(QIcon(":/icons/create-sketch.svg")); createSketchButton->setIconSize(QSize(48, 48)); createSketchButton->setToolButtonStyle(Qt::ToolButtonTextUnderIcon); connect(createSketchButton, &QToolButton::clicked, this, &MainWindow::createSketch); solidLayout->addWidget(createSketchButton); QToolButton *extrudeButton = new QToolButton(); extrudeButton->setText("Extrude"); extrudeButton->setIcon(QIcon(":/icons/extrude.svg")); extrudeButton->setIconSize(QSize(48, 48)); extrudeButton->setToolButtonStyle(Qt::ToolButtonTextUnderIcon); solidLayout->addWidget(extrudeButton); tabWidget->addTab(solidTab, "SOLID"); // --- SURFACE Tab --- QWidget *surfaceTab = new QWidget(); tabWidget->addTab(surfaceTab, "SURFACE"); // --- TOOLS Tab --- QWidget *toolsTab = new QWidget(); tabWidget->addTab(toolsTab, "TOOLS"); m_viewport = new ViewportWidget; setCentralWidget(m_viewport); 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()); } void MainWindow::createSketch() { QStringList items; items << "XY-Plane" << "XZ-Plane" << "YZ-Plane"; bool ok; QString item = QInputDialog::getItem(this, "Select Sketch Plane", "Plane:", items, 0, false, &ok); if (ok && !item.isEmpty()) { auto feature = new SketchFeature("Sketch"); if (item == "XY-Plane") { m_viewport->startSketch(ViewportWidget::SketchPlane::XY); feature->setPlane(SketchFeature::SketchPlane::XY); } else if (item == "XZ-Plane") { m_viewport->startSketch(ViewportWidget::SketchPlane::XZ); feature->setPlane(SketchFeature::SketchPlane::XZ); } else if (item == "YZ-Plane") { m_viewport->startSketch(ViewportWidget::SketchPlane::YZ); feature->setPlane(SketchFeature::SketchPlane::YZ); } m_document->addFeature(feature); } } void MainWindow::newFile() { m_document->clear(); setCurrentFile(QString()); } void MainWindow::open() { const QString fileName = QFileDialog::getOpenFileName(this); if (!fileName.isEmpty()) { if (!m_document->load(fileName)) { QMessageBox::warning(this, tr("OpenCAD"), tr("Cannot read file %1").arg(QDir::toNativeSeparators(fileName))); return; } setCurrentFile(fileName); } } bool MainWindow::save() { if (m_currentFile.isEmpty()) { return saveAs(); } else { if (!m_document->save(m_currentFile)) { QMessageBox::warning(this, tr("OpenCAD"), tr("Cannot write file %1").arg(QDir::toNativeSeparators(m_currentFile))); return false; } return true; } } bool MainWindow::saveAs() { QFileDialog dialog(this); dialog.setWindowModality(Qt::WindowModal); dialog.setAcceptMode(QFileDialog::AcceptSave); if (dialog.exec() != QDialog::Accepted) return false; const QString fileName = dialog.selectedFiles().first(); setCurrentFile(fileName); return save(); } void MainWindow::setCurrentFile(const QString &fileName) { m_currentFile = fileName; setWindowFilePath(m_currentFile); QString shownName = m_currentFile; if (m_currentFile.isEmpty()) shownName = "Untitled"; 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()); }