Files
unnamed-cad-software/src/MainWindow.cpp
Tanner Collin eea8099bd2 feat: Hide sketch grid when saving a sketch
Co-authored-by: aider (gemini/gemini-2.5-pro) <aider@aider.chat>
2026-02-09 18:08:42 -07:00

223 lines
7.4 KiB
C++

#include "MainWindow.h"
#include "ViewportWidget.h"
#include "Document.h"
#include "SketchFeature.h"
#include "Feature.h"
#include <QMenuBar>
#include <QMenu>
#include <QFileDialog>
#include <QMessageBox>
#include <QToolBar>
#include <QTabWidget>
#include <QWidget>
#include <QHBoxLayout>
#include <QToolButton>
#include <QIcon>
#include <QInputDialog>
#include <QStringList>
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")));
}