diff --git a/src/studio/lib/project.cpp b/src/studio/lib/project.cpp index 3dca01f5..c2b4abe8 100644 --- a/src/studio/lib/project.cpp +++ b/src/studio/lib/project.cpp @@ -8,7 +8,6 @@ #include #include -#include #include namespace nostalgia { @@ -16,25 +15,55 @@ namespace studio { using namespace ox::fs; +QString Project::ROM_FILE = "/ROM.oxfs"; + Project::Project(QString path) { m_path = path; } +Project::~Project() { + if (m_fs) { + delete m_fs; + m_fs = nullptr; + } + if (m_romBuff) { + delete m_romBuff; + m_romBuff = nullptr; + } +} + void Project::create() { QDir().mkpath(m_path); m_romBuff = new QByteArray(1024, 0); FileSystem32::format(m_romBuff->data(), m_romBuff->size(), true); - auto fs = ox::fs::createFileSystem(m_romBuff->data(), m_romBuff->size()); + m_fs = createFileSystem(m_romBuff->data(), m_romBuff->size()); - fs->mkdir("/Tilesets"); + m_fs->mkdir("/Tilesets"); - QFile file(m_path + "/ROM.oxfs"); + QFile file(m_path + ROM_FILE); file.open(QIODevice::WriteOnly); file.write(*m_romBuff); file.close(); +} - delete fs; +int Project::open() { + QFile file(m_path + ROM_FILE); + m_romBuff = new QByteArray(file.size(), 0); + file.open(QIODevice::ReadOnly); + if (file.read(m_romBuff->data(), file.size()) > 0) { + m_fs = createFileSystem(m_romBuff->data(), m_romBuff->size()); + return 0; + } else { + return 1; + } +} + +void Project::save() { + QFile file(m_path + ROM_FILE); + file.open(QIODevice::WriteOnly); + file.write(*m_romBuff); + file.close(); } } diff --git a/src/studio/lib/project.hpp b/src/studio/lib/project.hpp index a5b8c949..414ce63f 100644 --- a/src/studio/lib/project.hpp +++ b/src/studio/lib/project.hpp @@ -8,6 +8,8 @@ #pragma once +#include + namespace nostalgia { namespace studio { @@ -15,13 +17,22 @@ class Project: public QObject { Q_OBJECT private: + static QString ROM_FILE; + QString m_path = ""; QByteArray *m_romBuff = nullptr; + ox::fs::FileSystem *m_fs = nullptr; public: Project(QString path); + ~Project(); + void create(); + + int open(); + + void save(); }; } diff --git a/src/studio/mainwindow.cpp b/src/studio/mainwindow.cpp index afd827fc..26f1a3ac 100644 --- a/src/studio/mainwindow.cpp +++ b/src/studio/mainwindow.cpp @@ -9,6 +9,7 @@ #include #include #include +#include #include #include #include @@ -63,6 +64,16 @@ void MainWindow::setupMenu() { QKeySequence::Quit, QApplication::quit ); + + + addAction( + fileMenu, + tr("Open &Project"), + tr(""), + QKeySequence::Open, + this, + SLOT(openProject()) + ); } void MainWindow::addAction(QMenu *menu, QString text, QString toolTip, @@ -87,6 +98,13 @@ void MainWindow::addAction(QMenu *menu, QString text, QString toolTip, }); } +void MainWindow::openProject() { + auto p = QFileDialog::getExistingDirectory(this, tr("Select Project Directory..."), QDir::homePath()); + auto project = new Project(p); + project->open(); + m_project = project; +} + void MainWindow::showNewWizard() { const QString PROJECT_NAME = "projectName"; const QString PROJECT_PATH = "projectPath"; diff --git a/src/studio/mainwindow.hpp b/src/studio/mainwindow.hpp index d91da39c..70eeb512 100644 --- a/src/studio/mainwindow.hpp +++ b/src/studio/mainwindow.hpp @@ -8,7 +8,6 @@ #pragma once -#include #include #include #include @@ -16,6 +15,10 @@ #include #include +#include + +#include "lib/project.hpp" + namespace nostalgia { namespace studio { @@ -38,7 +41,7 @@ class MainWindow: public QMainWindow { static const QString AppTitle; private: - QString m_projectPath; + Project *m_project = nullptr; QVector> m_cleanupTasks; public: @@ -63,6 +66,8 @@ class MainWindow: public QMainWindow { int writeSettings(QString path); private slots: + void openProject(); + void showNewWizard(); };