refactor: Replace ApplicationController singleton with dependency injection

Co-authored-by: aider (gemini/gemini-2.5-pro) <aider@aider.chat>
This commit is contained in:
2026-02-13 17:33:17 -07:00
parent 1ded863b10
commit d51e7127af
5 changed files with 23 additions and 25 deletions

View File

@@ -9,12 +9,6 @@
#include <QDir>
#include <QFileInfo>
ApplicationController* ApplicationController::instance()
{
static ApplicationController instance;
return &instance;
}
ApplicationController::ApplicationController(QObject *parent)
: QObject(parent)
{

View File

@@ -12,7 +12,8 @@ class ApplicationController : public QObject
{
Q_OBJECT
public:
static ApplicationController* instance();
explicit ApplicationController(QObject *parent = nullptr);
~ApplicationController();
void setMainWindow(MainWindow* mainWindow);
Document* document() const;
@@ -33,8 +34,6 @@ signals:
void currentFileChanged(const QString& path);
private:
explicit ApplicationController(QObject *parent = nullptr);
~ApplicationController();
ApplicationController(const ApplicationController&) = delete;
ApplicationController& operator=(const ApplicationController&) = delete;

View File

@@ -18,8 +18,9 @@
#include <QInputDialog>
#include <QStringList>
MainWindow::MainWindow(QWidget *parent)
MainWindow::MainWindow(ApplicationController* appController, QWidget *parent)
: QMainWindow(parent)
, m_appController(appController)
{
setWindowTitle("OpenCAD");
resize(1920, 1080);
@@ -117,50 +118,50 @@ MainWindow::MainWindow(QWidget *parent)
m_viewport = new ViewportWidget;
setCentralWidget(m_viewport);
ApplicationController::instance()->setMainWindow(this);
Document* document = ApplicationController::instance()->document();
m_appController->setMainWindow(this);
Document* document = m_appController->document();
m_viewport->setDocument(document);
connect(document, &Document::featureAdded, m_viewport, QOverload<>::of(&QWidget::update));
connect(document, &Document::cleared, m_viewport, QOverload<>::of(&QWidget::update));
connect(ApplicationController::instance(), &ApplicationController::sketchModeStarted, this, &MainWindow::enterSketchMode);
connect(ApplicationController::instance(), &ApplicationController::sketchModeEnded, this, &MainWindow::exitSketchMode);
connect(ApplicationController::instance(), &ApplicationController::sketchModeStarted, m_viewport, &ViewportWidget::onSketchModeStarted);
connect(ApplicationController::instance(), &ApplicationController::sketchModeEnded, m_viewport, &ViewportWidget::onSketchModeEnded);
connect(ApplicationController::instance(), &ApplicationController::currentFileChanged, this, &MainWindow::updateWindowTitle);
connect(m_appController, &ApplicationController::sketchModeStarted, this, &MainWindow::enterSketchMode);
connect(m_appController, &ApplicationController::sketchModeEnded, this, &MainWindow::exitSketchMode);
connect(m_appController, &ApplicationController::sketchModeStarted, m_viewport, &ViewportWidget::onSketchModeStarted);
connect(m_appController, &ApplicationController::sketchModeEnded, m_viewport, &ViewportWidget::onSketchModeEnded);
connect(m_appController, &ApplicationController::currentFileChanged, this, &MainWindow::updateWindowTitle);
updateWindowTitle(QString());
}
void MainWindow::createSketch()
{
ApplicationController::instance()->beginSketchCreation();
m_appController->beginSketchCreation();
}
void MainWindow::saveSketch()
{
ApplicationController::instance()->endSketch();
m_appController->endSketch();
}
void MainWindow::newFile()
{
ApplicationController::instance()->newDocument();
m_appController->newDocument();
}
void MainWindow::open()
{
ApplicationController::instance()->openDocument();
m_appController->openDocument();
}
bool MainWindow::save()
{
return ApplicationController::instance()->saveDocument();
return m_appController->saveDocument();
}
bool MainWindow::saveAs()
{
return ApplicationController::instance()->saveDocumentAs();
return m_appController->saveDocumentAs();
}
void MainWindow::enterSketchMode()

View File

@@ -8,13 +8,14 @@ class Document;
class Feature;
class QTabWidget;
class QWidget;
class ApplicationController;
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = nullptr);
explicit MainWindow(ApplicationController* appController, QWidget *parent = nullptr);
private slots:
void newFile();
@@ -29,6 +30,7 @@ private slots:
void updateWindowTitle(const QString& filePath);
private:
ApplicationController* m_appController;
ViewportWidget *m_viewport;
QTabWidget *m_tabWidget;

View File

@@ -1,11 +1,13 @@
#include <QApplication>
#include "MainWindow.h"
#include "ApplicationController.h"
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
MainWindow window;
ApplicationController appController;
MainWindow window(&appController);
window.show();
return app.exec();