#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 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 }"); m_tabWidget = new QTabWidget(); mainToolBar->addWidget(m_tabWidget); // --- SOLID Tab --- m_solidTab = new QWidget(); QHBoxLayout *solidLayout = new QHBoxLayout(m_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); m_tabWidget->addTab(m_solidTab, "SOLID"); // --- SURFACE Tab --- m_surfaceTab = new QWidget(); m_tabWidget->addTab(m_surfaceTab, "SURFACE"); // --- TOOLS Tab --- m_toolsTab = new QWidget(); m_tabWidget->addTab(m_toolsTab, "TOOLS"); // --- SKETCH Tab --- m_sketchTab = new QWidget(); QHBoxLayout *sketchLayout = new QHBoxLayout(m_sketchTab); sketchLayout->setContentsMargins(5, 5, 5, 5); sketchLayout->setSpacing(5); sketchLayout->setAlignment(Qt::AlignLeft); QToolButton *lineButton = new QToolButton(); lineButton->setText("Line"); lineButton->setIcon(QIcon(":/icons/line.svg")); lineButton->setIconSize(QSize(48, 48)); lineButton->setToolButtonStyle(Qt::ToolButtonTextUnderIcon); sketchLayout->addWidget(lineButton); QToolButton *rectangleButton = new QToolButton(); rectangleButton->setText("Rectangle"); rectangleButton->setIcon(QIcon(":/icons/rectangle.svg")); rectangleButton->setIconSize(QSize(48, 48)); rectangleButton->setToolButtonStyle(Qt::ToolButtonTextUnderIcon); sketchLayout->addWidget(rectangleButton); QToolButton *circleButton = new QToolButton(); circleButton->setText("Circle"); circleButton->setIcon(QIcon(":/icons/circle.svg")); circleButton->setIconSize(QSize(48, 48)); circleButton->setToolButtonStyle(Qt::ToolButtonTextUnderIcon); sketchLayout->addWidget(circleButton); QToolButton *saveSketchButton = new QToolButton(); saveSketchButton->setText("Save Sketch"); saveSketchButton->setIcon(QIcon(":/icons/save-sketch.svg")); saveSketchButton->setIconSize(QSize(48, 48)); saveSketchButton->setToolButtonStyle(Qt::ToolButtonTextUnderIcon); connect(saveSketchButton, &QToolButton::clicked, this, &MainWindow::saveSketch); sketchLayout->addWidget(saveSketchButton); m_viewport = new ViewportWidget; setCentralWidget(m_viewport); m_document = new Document(this); m_viewport->setDocument(m_document); connect(m_document, &Document::featureAdded, m_viewport, QOverload<>::of(&QWidget::update)); connect(m_document, &Document::cleared, m_viewport, QOverload<>::of(&QWidget::update)); 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); m_tabWidget->removeTab(m_tabWidget->indexOf(m_toolsTab)); m_tabWidget->removeTab(m_tabWidget->indexOf(m_surfaceTab)); m_tabWidget->removeTab(m_tabWidget->indexOf(m_solidTab)); m_tabWidget->addTab(m_sketchTab, "SKETCH"); } } void MainWindow::saveSketch() { m_viewport->saveSketch(); m_tabWidget->removeTab(m_tabWidget->indexOf(m_sketchTab)); m_tabWidget->addTab(m_solidTab, "SOLID"); m_tabWidget->addTab(m_surfaceTab, "SURFACE"); m_tabWidget->addTab(m_toolsTab, "TOOLS"); } 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; m_document->setFileName(fileName); setWindowFilePath(m_currentFile); QString shownName = m_currentFile; if (m_currentFile.isEmpty()) shownName = "Untitled"; setWindowTitle(tr("%1[*] - %2").arg(QFileInfo(shownName).fileName(), tr("OpenCAD"))); }