Save world editor files.

--HG--
branch : gsoc2014-dfighter
This commit is contained in:
dfighter1985 2014-07-15 01:30:30 +02:00
parent 2d865a8567
commit 61b8a4ef82
4 changed files with 212 additions and 0 deletions

View file

@ -209,6 +209,178 @@ void CreateWorldCommand::redo()
m_model->createWorldEditNode(m_fileName); m_model->createWorldEditNode(m_fileName);
} }
WorldSaver::WorldSaver( PrimitivesTreeModel *model, LandscapeEditor::ZoneBuilderBase *zoneBuilder, const std::string &dataDir, const std::string &context )
{
m_model = model;
m_zoneBuilder = zoneBuilder;
m_dataDir = dataDir;
m_context = context;
}
bool WorldSaver::save()
{
QModelIndex pidx = m_model->index( 0, 0 );
if( !pidx.isValid() )
{
lastError = "No root node.";
return false;
}
int rows = m_model->rowCount( pidx );
bool ok = false;
for( int i = 0; i < rows; i++ )
{
QModelIndex idx = m_model->index( i, 0, pidx );
Node *node = reinterpret_cast< Node* >( idx.internalPointer() );
Node::NodeType t = node->type();
switch( t )
{
case Node::LandscapeNodeType: ok = saveLandscapeNode( node ); break;
case Node::RootPrimitiveNodeType: ok = savePrimitiveNode( node ); break;
}
if( !ok )
return false;
}
ok = saveWorldEditFile();
return ok;
}
bool WorldSaver::saveLandscapeNode( Node *node )
{
LandscapeNode *n = dynamic_cast< LandscapeNode* >( node );
if( n == NULL )
{
lastError = "Trying to save a non-landscape node as landscape.";
return false;
}
LandscapeEditor::ZoneRegionObject *z = m_zoneBuilder->zoneRegion( n->id() );
if( z == NULL )
{
lastError = "The specified zoneregion doesn't exist.";
return false;
}
z->setFileName( n->fileName().toUtf8().constData() );
bool ok = z->save();
if( ok )
{
std::pair< std::string, std::string > p;
p.first = "landscape";
p.second = n->fileName().toUtf8().constData();
m_data.push_back( p );
}
else
{
lastError = "Couldn't save landscape file " + std::string( n->fileName().toUtf8().constData() );
}
return ok;
}
bool WorldSaver::savePrimitiveNode( Node *node )
{
RootPrimitiveNode *n = dynamic_cast< RootPrimitiveNode* >( node );
if( n == NULL )
{
lastError = "Trying to save a non-primitive node as primitive.";
return false;
}
bool ok = NLLIGO::saveXmlPrimitiveFile( *(n->primitives()), n->fileName().toUtf8().constData() );
if( ok )
{
std::pair< std::string, std::string > p;
p.first = "primitive";
p.second = n->fileName().toUtf8().constData();
m_data.push_back( p );
}
else
{
lastError = "Couldn't save primitive file " + std::string( n->fileName().toUtf8().constData() );
}
return ok;
}
bool WorldSaver::saveWorldEditFile()
{
QModelIndex idx = m_model->index( 0, 0 );
Node *node = reinterpret_cast< Node* >( idx.internalPointer() );
Node::NodeType t = node->type();
WorldEditNode *n = dynamic_cast< WorldEditNode* >( node );
if( n == NULL )
{
lastError = "Not a worldedit node.";
return false;
}
std::string fn = n->data( 0 ).toString().toUtf8().constData();
bool ok = writeWorldEditFile( fn );
return ok;
}
bool WorldSaver::writeWorldEditFile( const std::string &fn )
{
if( fn.empty() )
return false;
NLMISC::COFile of;
if( !of.open( fn, false, true, false ) )
{
lastError = "Couldn't open file " + fn + " for writing.";
return false;
}
NLMISC::COXml xml;
xml.init( &of );
xmlNodePtr rootNode = xmlNewDocNode (xml.getDocument (), NULL, (const xmlChar*)"NEL_WORLD_EDITOR_PROJECT", NULL);
xmlDocSetRootElement (xml.getDocument (), rootNode);
xmlNodePtr node = xmlNewChild ( rootNode, NULL, (const xmlChar*)"VERSION", NULL);
xmlNodePtr text = xmlNewText ((const xmlChar *) NLMISC::toString( WORLD_EDITOR_FILE_VERSION ).c_str ());
xmlAddChild( node, text );
node = xmlNewChild ( rootNode, NULL, (const xmlChar*)"DATA_DIRECTORY", NULL);
xmlSetProp (node, (const xmlChar*)"VALUE", (const xmlChar*)m_dataDir.c_str ());
node = xmlNewChild ( rootNode, NULL, (const xmlChar*)"CONTEXT", NULL);
xmlSetProp (node, (const xmlChar*)"VALUE", (const xmlChar*)m_context.c_str ());
std::vector< std::pair< std::string, std::string > >::const_iterator itr = m_data.begin();
while( itr != m_data.end() )
{
const std::pair< std::string, std::string > &p = *itr;
node = xmlNewChild ( rootNode, NULL, (const xmlChar*)"DATABASE_ELEMENT", NULL);
xmlSetProp (node, (const xmlChar*)"FILENAME", (const xmlChar*)p.second.c_str ());
if( p.first == "landscape" )
xmlSetProp (node, (const xmlChar*)"TYPE", (const xmlChar*)("landscape"));
else
xmlSetProp (node, (const xmlChar*)"TYPE", (const xmlChar*)("primitive"));
++itr;
}
xml.flush();
of.close();
return true;
}
LoadLandscapeCommand::LoadLandscapeCommand(const QString &fileName, PrimitivesTreeModel *model, LoadLandscapeCommand::LoadLandscapeCommand(const QString &fileName, PrimitivesTreeModel *model,
LandscapeEditor::ZoneBuilderBase *zoneBuilder, QUndoCommand *parent) LandscapeEditor::ZoneBuilderBase *zoneBuilder, QUndoCommand *parent)
: QUndoCommand(parent), : QUndoCommand(parent),

View file

@ -72,6 +72,31 @@ private:
PrimitivesTreeModel *const m_model; PrimitivesTreeModel *const m_model;
}; };
class WorldSaver
{
public:
WorldSaver( PrimitivesTreeModel *model, LandscapeEditor::ZoneBuilderBase *zoneBuilder, const std::string &dataDir, const std::string &context );
bool save();
std::string getLastError() const{ return lastError; }
private:
bool saveLandscapeNode( Node *node );
bool savePrimitiveNode( Node *node );
bool saveWorldEditFile();
bool writeWorldEditFile( const std::string &fn );
std::string m_dataDir;
std::string m_context;
PrimitivesTreeModel *m_model;
LandscapeEditor::ZoneBuilderBase *m_zoneBuilder;
std::vector< std::pair< std::string, std::string > > m_data;
std::string lastError;
};
/** /**
@class LoadLandscapeCommand @class LoadLandscapeCommand
@brief @brief

View file

@ -194,8 +194,10 @@ void WorldEditorWindow::loadWorldEditFile(const QString &fileName)
{ {
case Utils::DataDirectoryType: case Utils::DataDirectoryType:
m_zoneBuilderBase->init(QString(worldEditList[i].second.c_str()), true); m_zoneBuilderBase->init(QString(worldEditList[i].second.c_str()), true);
m_dataDir = worldEditList[i].second.c_str();
break; break;
case Utils::ContextType: case Utils::ContextType:
m_context = worldEditList[i].second.c_str();
break; break;
case Utils::LandscapeType: case Utils::LandscapeType:
m_undoStack->push(new LoadLandscapeCommand(QString(worldEditList[i].second.c_str()), m_primitivesModel, m_zoneBuilderBase)); m_undoStack->push(new LoadLandscapeCommand(QString(worldEditList[i].second.c_str()), m_primitivesModel, m_zoneBuilderBase));
@ -221,6 +223,16 @@ void WorldEditorWindow::newWorldEditFile()
void WorldEditorWindow::saveWorldEditFile() void WorldEditorWindow::saveWorldEditFile()
{ {
WorldSaver saver( m_primitivesModel, m_zoneBuilderBase, m_dataDir.toUtf8().constData(), m_context.toUtf8().constData() );
bool ok = saver.save();
QString error = saver.getLastError().c_str();
if( !ok )
{
QMessageBox::critical( this,
tr( "Failed to save world editor files" ),
tr( "Failed to save world editor files.\nError:\n " ) + error );
}
} }
void WorldEditorWindow::openProjectSettings() void WorldEditorWindow::openProjectSettings()

View file

@ -76,6 +76,9 @@ private:
void loadWorldEditFile(const QString &fileName); void loadWorldEditFile(const QString &fileName);
void checkCurrentWorld(); void checkCurrentWorld();
QString m_context;
QString m_dataDir;
QString m_lastDir; QString m_lastDir;
QLabel *m_statusInfo; QLabel *m_statusInfo;