199 lines
6.0 KiB
C++
199 lines
6.0 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 <QDockWidget>
|
|
#include <QTreeWidget>
|
|
#include <QTreeWidgetItem>
|
|
#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 }");
|
|
|
|
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());
|
|
}
|