Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
120 changes: 86 additions & 34 deletions worldeditor/src/screens/scenecomposer/scenecomposer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -27,10 +27,14 @@

#include "main/documentmodel.h"

Q_DECLARE_METATYPE(Object *)
Q_DECLARE_METATYPE(Scene *)
Q_DECLARE_METATYPE(Actor *)

namespace {
static const char *gSingle = "single";

static const char *gObject = "object";
};

class WorldObserver : public Object {
Expand Down Expand Up @@ -78,7 +82,6 @@ class WorldObserver : public Object {

SceneComposer::SceneComposer(QWidget *parent) :
ui(new Ui::SceneComposer),
m_menuObject(nullptr),
m_controller(nullptr),
m_worldObserver(new WorldObserver),
m_isolationSettings(nullptr),
Expand Down Expand Up @@ -246,8 +249,16 @@ void SceneComposer::onUpdated() {
}

void SceneComposer::onSetActiveScene() {
if(dynamic_cast<Scene *>(m_menuObject)) {
UndoManager::instance()->push(new SelectScene(static_cast<Scene *>(m_menuObject), m_controller));
Scene *scene = nullptr;

QAction *action = dynamic_cast<QAction *>(sender());
if(action) {
QMenu *menu = action->menu();
scene = dynamic_cast<Scene *>(menu->property(gObject).value<Object *>());
}

if(scene) {
UndoManager::instance()->push(new SelectScene(scene, m_controller));
}
}

Expand Down Expand Up @@ -290,7 +301,6 @@ void SceneComposer::restoreBackupScenes() {
}
}
m_backupScenes.clear();
m_menuObject = Engine::world()->activeScene();

emit objectsHierarchyChanged(Engine::world());
// Repick selection
Expand Down Expand Up @@ -353,7 +363,14 @@ void SceneComposer::onActivated() {
}

void SceneComposer::onRemoveScene() {
Scene *scene = dynamic_cast<Scene *>(m_menuObject);
Scene *scene = nullptr;

QAction *action = dynamic_cast<QAction *>(sender());
if(action) {
QMenu *menu = action->menu();
scene = dynamic_cast<Scene *>(menu->property(gObject).value<Object *>());
}

if(scene) {
if(scene->isModified()) {
onSave();
Expand All @@ -363,7 +380,6 @@ void SceneComposer::onRemoveScene() {
for(auto it : Engine::world()->getChildren()) {
Scene *scene = dynamic_cast<Scene *>(it);
if(scene) {
m_menuObject = scene;
Engine::world()->setActiveScene(scene);
break;
}
Expand All @@ -376,7 +392,14 @@ void SceneComposer::onRemoveScene() {
}

void SceneComposer::onDiscardChanges() {
Scene *scene = dynamic_cast<Scene *>(m_menuObject);
Scene *scene = nullptr;

QAction *action = dynamic_cast<QAction *>(sender());
if(action) {
QMenu *menu = action->menu();
scene = dynamic_cast<Scene *>(menu->property(gObject).value<Object *>());
}

if(scene) {
QString text = QString(tr("This action will lead to discard all of your changes in the folowing scene:\n\t%1\nYour changes will be lost."))
.arg(scene->name().c_str());
Expand All @@ -393,7 +416,7 @@ void SceneComposer::onDiscardChanges() {

AssetConverterSettings *settings = m_sceneSettings.value(uuid);
if(settings) {
loadMap(settings->source(), true);
loadScene(settings->source(), true);
} else { // This is unsaved "New Scene"
onNewAsset();
}
Expand All @@ -419,7 +442,7 @@ void SceneComposer::onNewAsset() {

void SceneComposer::loadAsset(AssetConverterSettings *settings) {
if(settings->typeName() == "Map") {
if(loadMap(settings->source(), false)) {
if(loadScene(settings->source(), false)) {
UndoManager::instance()->clear();
}
} else {
Expand All @@ -429,7 +452,7 @@ void SceneComposer::loadAsset(AssetConverterSettings *settings) {

void SceneComposer::saveAsset(const QString &path) {
World *graph = m_controller->isolatedActor() ? m_isolationWorld : Engine::world();
saveMap(path, graph->activeScene());
saveScene(path, graph->activeScene());
/*
QImage result = ui->viewport->grabFramebuffer();
if(!result.isNull()) {
Expand All @@ -446,10 +469,17 @@ void SceneComposer::onLocal(bool flag) {

void SceneComposer::onCreateActor() {
Scene *scene = Engine::world()->activeScene();
Actor *actor = dynamic_cast<Actor *>(m_menuObject);
if(actor) {
scene = actor->scene();

QAction *action = dynamic_cast<QAction *>(sender());
if(action) {
QMenu *menu = action->menu();
Actor *actor = dynamic_cast<Actor *>(menu->property(gObject).value<Object *>());

if(actor) {
scene = actor->scene();
}
}

if(scene) {
UndoManager::instance()->push(new CreateObject("Actor", scene, m_controller));
}
Expand All @@ -476,9 +506,11 @@ void SceneComposer::onObjectsChanged(const QList<Object *> &objects, QString pro
}

QMenu *SceneComposer::objectMenu(Object *object) {
m_menuObject = object;
if(dynamic_cast<Scene *>(object)) {
m_activeSceneAction->setEnabled(object != Engine::world()->activeScene());
Scene *scene = dynamic_cast<Scene *>(object);
if(scene) {
m_activeSceneAction->setEnabled(scene != Engine::world()->activeScene());

m_sceneMenu.setProperty(gObject, QVariant::fromValue(scene));

return &m_sceneMenu;
} else {
Expand All @@ -505,6 +537,8 @@ QMenu *SceneComposer::objectMenu(Object *object) {
it->setEnabled((!it->property(gSingle).toBool() || single) && prefabEnabled);
}

m_actorMenu.setProperty(gObject, QVariant::fromValue(object));

return &m_actorMenu;
}
}
Expand Down Expand Up @@ -554,10 +588,10 @@ void SceneComposer::onDropMap(QString name, bool additive) {
emit dropAsset(name);
return;
}
loadMap(name, additive);
loadScene(name, additive);
}

bool SceneComposer::loadMap(QString path, bool additive) {
bool SceneComposer::loadScene(QString path, bool additive) {
quitFromIsolation();

if(!additive) {
Expand Down Expand Up @@ -589,7 +623,7 @@ bool SceneComposer::loadMap(QString path, bool additive) {
return false;
}

void SceneComposer::saveMap(QString path, Scene *scene) {
void SceneComposer::saveScene(QString path, Scene *scene) {
string data = Json::save(Engine::toVariant(scene), 0);
if(!data.empty()) {
QFile file(path);
Expand All @@ -601,6 +635,20 @@ void SceneComposer::saveMap(QString path, Scene *scene) {
}
}

void SceneComposer::saveSceneAs(Scene *scene) {
if(scene) {
QString path = QFileDialog::getSaveFileName(nullptr, tr("Save Scene"),
ProjectSettings::instance()->contentPath(),
"Map (*.map)");
if(!path.isEmpty()) {
QFileInfo info(path);
scene->setName(info.baseName().toStdString());
saveScene(path, scene);
m_sceneSettings[scene->uuid()] = AssetManager::instance()->fetchSettings(info);
}
}
}

void SceneComposer::onSaveIsolated() {
if(m_isolationSettings && !m_isolationSettings->isReadOnly()) {
Actor *actor = m_controller->isolatedActor();
Expand All @@ -618,27 +666,32 @@ void SceneComposer::onSaveIsolated() {
}

void SceneComposer::onSave() {
if(m_menuObject == nullptr) {
m_menuObject = Engine::world()->activeScene();
Scene *scene = Engine::world()->activeScene();

QAction *action = dynamic_cast<QAction *>(sender());
if(action) {
QMenu *menu = action->menu();
scene = dynamic_cast<Scene *>(menu->property(gObject).value<Object *>());
}
AssetConverterSettings *settings = m_sceneSettings.value(m_menuObject->uuid());

AssetConverterSettings *settings = m_sceneSettings.value(scene->uuid());
if(settings) {
saveMap(settings->source(), static_cast<Scene *>(m_menuObject));
saveScene(settings->source(), scene);
} else {
onSaveAs();
}
}

void SceneComposer::onSaveAs() {
QString path = QFileDialog::getSaveFileName(nullptr, tr("Save Scene"),
ProjectSettings::instance()->contentPath(),
"Map (*.map)");
if(!path.isEmpty()) {
QFileInfo info(path);
m_menuObject->setName(info.baseName().toStdString());
saveMap(path, static_cast<Scene *>(m_menuObject));
m_sceneSettings[m_menuObject->uuid()] = AssetManager::instance()->fetchSettings(info);
Scene *scene = Engine::world()->activeScene();

QAction *action = dynamic_cast<QAction *>(sender());
if(action) {
QMenu *menu = action->menu();
scene = dynamic_cast<Scene *>(menu->property(gObject).value<Object *>());
}

saveSceneAs(scene);
}

void SceneComposer::onSaveAll() {
Expand All @@ -647,10 +700,9 @@ void SceneComposer::onSaveAll() {
if(scene) {
AssetConverterSettings *settings = m_sceneSettings.value(it->uuid());
if(settings) {
saveMap(settings->source(), scene);
saveScene(settings->source(), scene);
} else {
m_menuObject = scene;
onSaveAs();
saveSceneAs(scene);
}
}
}
Expand Down
7 changes: 3 additions & 4 deletions worldeditor/src/screens/scenecomposer/scenecomposer.h
Original file line number Diff line number Diff line change
Expand Up @@ -89,8 +89,9 @@ private slots:

QStringList componentGroups() const override;

bool loadMap(QString path, bool additive);
void saveMap(QString path, Scene *scene);
bool loadScene(QString path, bool additive);
void saveScene(QString path, Scene *scene);
void saveSceneAs(Scene *scene);

void enterToIsolation(AssetConverterSettings *settings);
void quitFromIsolation();
Expand All @@ -103,8 +104,6 @@ private slots:
QMenu m_actorMenu;
QMenu m_sceneMenu;

Object *m_menuObject;

ObjectController *m_controller;

WorldObserver *m_worldObserver;
Expand Down