Add project explorer

This commit is contained in:
Gary Talent 2017-05-12 17:20:54 -05:00
parent cb427dccd0
commit 1b9f8f40f4
8 changed files with 238 additions and 36 deletions

View File

@ -20,7 +20,7 @@ target_link_libraries(
OxStd OxStd
NostalgiaCommon NostalgiaCommon
NostalgiaCore NostalgiaCore
NostalgiaStudioStatic NostalgiaStudio
NostalgiaStudioJson NostalgiaStudioJson
) )

View File

@ -6,7 +6,7 @@ set(CMAKE_INCLUDE_CURRENT_DIR ON)
set(CMAKE_AUTOMOC ON) set(CMAKE_AUTOMOC ON)
add_library( add_library(
NostalgiaStudioStatic NostalgiaStudio
newwizard.cpp newwizard.cpp
oxfstreeview.cpp oxfstreeview.cpp
project.cpp project.cpp
@ -14,27 +14,11 @@ add_library(
set_property( set_property(
TARGET TARGET
NostalgiaStudioStatic NostalgiaStudio
PROPERTY PROPERTY
POSITION_INDEPENDENT_CODE ON POSITION_INDEPENDENT_CODE ON
) )
target_link_libraries(
NostalgiaStudioStatic
Qt5::Core
Qt5::Widgets
OxFS
OxStd
)
add_library(
NostalgiaStudio
SHARED
newwizard.cpp
oxfstreeview.cpp
project.cpp
)
target_link_libraries( target_link_libraries(
NostalgiaStudio NostalgiaStudio
Qt5::Core Qt5::Core

View File

@ -6,12 +6,168 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. * file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/ */
#include <QVector>
#include "oxfstreeview.hpp" #include "oxfstreeview.hpp"
namespace nostalgia { namespace nostalgia {
namespace studio { namespace studio {
using namespace ox;
OxFSFile::OxFSFile(FileSystem *fs, QString path, OxFSFile *parentItem) {
m_fs = fs;
m_path = path;
m_parentItem = parentItem;
}
OxFSFile::~OxFSFile() {
qDeleteAll(m_childItems);
}
void OxFSFile::appendChild(OxFSFile*) {
}
OxFSFile *OxFSFile::child(int row) {
if (m_fs) {
QVector<DirectoryListing<QString>> ls;
m_fs->ls(m_path.toUtf8(), &ls);
auto ch = new OxFSFile(m_fs, m_path + "/" + ls[row].name, this);
m_childItems.push_back(ch);
return ch;
} else {
return nullptr;
}
}
int OxFSFile::childCount() const {
if (m_fs) {
QVector<DirectoryListing<QString>> ls;
m_fs->ls(m_path.toUtf8(), &ls);
return ls.size();
} else {
return 0;
}
}
int OxFSFile::columnCount() const {
return 1;
}
QVariant OxFSFile::data(int) const {
return m_path.mid(m_path.lastIndexOf('/') + 1);
}
int OxFSFile::row() const {
if (m_parentItem) {
return m_parentItem->m_childItems.indexOf(const_cast<OxFSFile*>(this));
} else {
return 0;
}
}
OxFSFile *OxFSFile::parentItem() {
return m_parentItem;
}
// OxFSModel
OxFSModel::OxFSModel(FileSystem *fs, QObject *parent) {
m_rootItem = new OxFSFile(fs, "");
}
OxFSModel::~OxFSModel() {
if (m_rootItem) {
delete m_rootItem;
}
}
QVariant OxFSModel::data(const QModelIndex &index, int role) const {
if (!index.isValid() || role != Qt::DisplayRole) {
return QVariant();
} else {
OxFSFile *item = static_cast<OxFSFile*>(index.internalPointer());
return item->data(index.column());
}
}
Qt::ItemFlags OxFSModel::flags(const QModelIndex &index) const {
if (!index.isValid()) {
return 0;
} else {
return QAbstractItemModel::flags(index);
}
}
QVariant OxFSModel::headerData(int section, Qt::Orientation orientation, int role) const {
return QVariant();
if (orientation == Qt::Horizontal && role == Qt::DisplayRole) {
return m_rootItem->data(section);
} else {
return QVariant();
}
}
QModelIndex OxFSModel::index(int row, int column, const QModelIndex &parent) const {
if (!hasIndex(row, column, parent)) {
return QModelIndex();
}
OxFSFile *parentItem;
if (!parent.isValid()) {
parentItem = m_rootItem;
} else {
parentItem = static_cast<OxFSFile*>(parent.internalPointer());
}
OxFSFile *childItem = parentItem->child(row);
if (childItem) {
return createIndex(row, column, childItem);
} else {
return QModelIndex();
}
}
QModelIndex OxFSModel::parent(const QModelIndex &index) const {
if (!index.isValid()) {
return QModelIndex();
}
OxFSFile *childItem = static_cast<OxFSFile*>(index.internalPointer());
OxFSFile *parentItem = childItem->parentItem();
if (parentItem == m_rootItem) {
return QModelIndex();
}
return createIndex(parentItem->row(), 0, parentItem);
}
int OxFSModel::rowCount(const QModelIndex &parent) const {
if (parent.column() > 0) {
return 0;
}
OxFSFile *parentItem;
if (!parent.isValid()) {
parentItem = m_rootItem;
} else {
parentItem = static_cast<OxFSFile*>(parent.internalPointer());
}
return parentItem->childCount();
}
int OxFSModel::columnCount(const QModelIndex &parent) const {
if (parent.isValid()) {
return static_cast<OxFSFile*>(parent.internalPointer())->columnCount();
} else {
return m_rootItem->columnCount();
}
}
void OxFSModel::setupModelData(const QStringList &lines, OxFSFile *parent) {
}
} }
} }

View File

@ -8,31 +8,71 @@
#pragma once #pragma once
#include <QList> #include <QModelIndex>
#include <QVariant> #include <QVector>
#include <QVariant> #include <QVariant>
#include <ox/fs/filesystem.hpp>
namespace nostalgia { namespace nostalgia {
namespace studio { namespace studio {
class OxFSFile { class OxFSFile {
private: private:
QList<OxFSFile*> m_childItems; ox::FileSystem *m_fs = nullptr;
QList<QVariant> m_itemData; OxFSFile *m_parentItem = nullptr;
OxFSFile *m_parentItem; QString m_path;
QVector<OxFSFile*> m_childItems;
public: public:
explicit OxFSFile(const QList<QVariant> &data, OxFSFile *parentItem = 0); OxFSFile(ox::FileSystem *fs, QString path, OxFSFile *parentItem = nullptr);
~OxFSFile();
void appendChild(OxFSFile *child); ~OxFSFile();
OxFSFile *child(int row); void appendChild(OxFSFile *child);
int childCount() const;
int columnCount() const; OxFSFile *child(int row);
QVariant data(int column) const;
int row() const; int childCount() const;
OxFSFile *parentItem();
int columnCount() const;
QVariant data(int column) const;
int row() const;
OxFSFile *parentItem();
};
class OxFSModel: public QAbstractItemModel {
Q_OBJECT
private:
OxFSFile *m_rootItem = nullptr;
public:
explicit OxFSModel(ox::FileSystem *fs, QObject *parent = 0);
~OxFSModel();
QVariant data(const QModelIndex &index, int role) const override;
Qt::ItemFlags flags(const QModelIndex &index) const override;
QVariant headerData(int section, Qt::Orientation orientation,
int role = Qt::DisplayRole) const override;
QModelIndex index(int row, int column,
const QModelIndex &parent = QModelIndex()) const override;
QModelIndex parent(const QModelIndex &index) const override;
int rowCount(const QModelIndex &parent = QModelIndex()) const override;
int columnCount(const QModelIndex &parent = QModelIndex()) const override;
private:
void setupModelData(const QStringList &lines, OxFSFile *parent);
}; };
} }

View File

@ -22,6 +22,9 @@ Project::Project(QString path) {
} }
Project::~Project() { Project::~Project() {
if (m_fs) {
delete m_fs;
}
} }
void Project::create() { void Project::create() {
@ -29,7 +32,7 @@ void Project::create() {
m_romBuff = QSharedPointer<QByteArray>(new QByteArray(1024, 0)); m_romBuff = QSharedPointer<QByteArray>(new QByteArray(1024, 0));
FileSystem32::format(m_romBuff->data(), m_romBuff->size(), true); FileSystem32::format(m_romBuff->data(), m_romBuff->size(), true);
m_fs = QSharedPointer<FileSystem>(createFileSystem(m_romBuff->data(), m_romBuff->size())); m_fs = createFileSystem(m_romBuff->data(), m_romBuff->size());
m_fs->mkdir("/Tilesets"); m_fs->mkdir("/Tilesets");
@ -45,7 +48,9 @@ int Project::open() {
if (file.exists()) { if (file.exists()) {
file.open(QIODevice::ReadOnly); file.open(QIODevice::ReadOnly);
if (file.read(m_romBuff->data(), file.size()) > 0) { if (file.read(m_romBuff->data(), file.size()) > 0) {
m_fs = QSharedPointer<FileSystem>(createFileSystem(m_romBuff->data(), m_romBuff->size())); m_fs = createFileSystem(m_romBuff->data(), m_romBuff->size());
m_fs->mkdir("/Tilesets");
return 0; return 0;
} else { } else {
return 1; return 1;
@ -62,5 +67,9 @@ void Project::save() {
file.close(); file.close();
} }
FileSystem *Project::romFS() {
return m_fs;
}
} }
} }

View File

@ -23,7 +23,7 @@ class Project: public QObject {
QString m_path = ""; QString m_path = "";
QSharedPointer<QByteArray> m_romBuff; QSharedPointer<QByteArray> m_romBuff;
QSharedPointer<ox::FileSystem> m_fs; ox::FileSystem *m_fs = nullptr;
public: public:
Project(QString path); Project(QString path);
@ -35,6 +35,8 @@ class Project: public QObject {
int open(); int open();
void save(); void save();
ox::FileSystem *romFS();
}; };
} }

View File

@ -11,6 +11,7 @@
#include <QDialog> #include <QDialog>
#include <QFileDialog> #include <QFileDialog>
#include <QGridLayout> #include <QGridLayout>
#include <QHeaderView>
#include <QLabel> #include <QLabel>
#include <QLineEdit> #include <QLineEdit>
#include <QMenuBar> #include <QMenuBar>
@ -18,6 +19,7 @@
#include <QVector> #include <QVector>
#include "lib/newwizard.hpp" #include "lib/newwizard.hpp"
#include "lib/oxfstreeview.hpp"
#include "lib/project.hpp" #include "lib/project.hpp"
#include "mainwindow.hpp" #include "mainwindow.hpp"
@ -43,6 +45,9 @@ MainWindow::MainWindow(NostalgiaStudioProfile config, QWidget *parent) {
} }
MainWindow::~MainWindow() { MainWindow::~MainWindow() {
if (m_projectExplorer->model()) {
delete m_projectExplorer->model();
}
for (auto f : m_cleanupTasks) { for (auto f : m_cleanupTasks) {
f(); f();
} }
@ -91,6 +96,9 @@ void MainWindow::setupProjectExplorer() {
resizeDocks({dock}, {(int) (width() * 0.25)}, Qt::Horizontal); resizeDocks({dock}, {(int) (width() * 0.25)}, Qt::Horizontal);
// setup tree view // setup tree view
m_projectExplorer = new QTreeView(dock);
m_projectExplorer->header()->hide();
dock->setWidget(m_projectExplorer);
} }
void MainWindow::addDockWidget(Qt::DockWidgetArea area, QDockWidget *dockWidget) { void MainWindow::addDockWidget(Qt::DockWidgetArea area, QDockWidget *dockWidget) {
@ -127,6 +135,7 @@ void MainWindow::openProject() {
auto err = project->open(); auto err = project->open();
if (err == 0) { if (err == 0) {
m_project = project; m_project = project;
m_projectExplorer->setModel(new OxFSModel(m_project->romFS()));
} }
} }

View File

@ -15,6 +15,7 @@
#include <QPointer> #include <QPointer>
#include <QSharedPointer> #include <QSharedPointer>
#include <QString> #include <QString>
#include <QTreeView>
#include <QVector> #include <QVector>
#include <functional> #include <functional>
@ -60,6 +61,7 @@ class MainWindow: public QMainWindow {
QPointer<QMenu> m_viewMenu; QPointer<QMenu> m_viewMenu;
QVector<std::function<void()>> m_cleanupTasks; QVector<std::function<void()>> m_cleanupTasks;
QVector<QPointer<QDockWidget>> m_dockWidgets; QVector<QPointer<QDockWidget>> m_dockWidgets;
QTreeView *m_projectExplorer = nullptr;
public: public:
MainWindow(NostalgiaStudioProfile config, QWidget *parent = 0); MainWindow(NostalgiaStudioProfile config, QWidget *parent = 0);