Various small fixes and minimal improvements
This was SVN commit r2035.
This commit is contained in:
parent
5b11dbb6b0
commit
5460b8982e
@ -164,10 +164,9 @@ bool CObjectBase::Load(const char* filename)
|
||||
|
||||
XERO_ITER_EL(root, child)
|
||||
{
|
||||
int element_name = child.getNodeName();
|
||||
CStr element_value (child.getText());
|
||||
int child_name = child.getNodeName();
|
||||
|
||||
if (element_name == el_group)
|
||||
if (child_name == el_group)
|
||||
{
|
||||
m_Variants.resize(m_Variants.size()+1);
|
||||
|
||||
@ -246,7 +245,7 @@ bool CObjectBase::Load(const char* filename)
|
||||
m_Variants.pop_back();
|
||||
}
|
||||
}
|
||||
else if (element_name == el_material)
|
||||
else if (child_name == el_material)
|
||||
{
|
||||
m_Material = child.getText();
|
||||
}
|
||||
|
@ -201,7 +201,7 @@ void CObjectManager::LoadObjectsIn(CStr& pathname)
|
||||
else
|
||||
{
|
||||
m_ObjectTypes[0].m_ObjectNameToFilename[objectName] = *it;
|
||||
debug_out("%s -> %s\n", objectName.c_str(), it->c_str());
|
||||
// debug_out("%s -> %s\n", objectName.c_str(), it->c_str());
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -308,7 +308,7 @@ int sem_timedwait(sem_t* sem, const struct timespec* abs_timeout)
|
||||
|
||||
HANDLE h = sem_t_to_HANDLE(sem);
|
||||
DWORD ret = WaitForSingleObject(h, timeout_ms);
|
||||
// succesfully decremented semaphore; bail.
|
||||
// successfully decremented semaphore; bail.
|
||||
if(ret == WAIT_OBJECT_0)
|
||||
return 0;
|
||||
|
||||
|
@ -132,8 +132,8 @@ public:
|
||||
// Miscellaneous utility functions:
|
||||
namespace AtlasObject
|
||||
{
|
||||
void LoadFromXML(AtObj& obj, const wchar_t* filename);
|
||||
void SaveToXML(AtObj& obj, const wchar_t* filename);
|
||||
AtObj LoadFromXML(const wchar_t* filename);
|
||||
bool SaveToXML(AtObj& obj, const wchar_t* filename);
|
||||
};
|
||||
|
||||
#endif // ATLASOBJECT_H__
|
||||
|
@ -140,8 +140,8 @@ void AtObj::set(const char* key, const wchar_t* value)
|
||||
|
||||
bool AtObj::hasContent() const
|
||||
{
|
||||
if (! p)
|
||||
return true;
|
||||
if (!p)
|
||||
return false;
|
||||
|
||||
return p->hasContent();
|
||||
}
|
||||
|
@ -19,4 +19,4 @@ namespace AtlasObject
|
||||
// as an easy way of visualising the data (without any horridly ugly
|
||||
// XML junk)
|
||||
std::wstring ConvertToString(const AtObj& obj);
|
||||
}
|
||||
}
|
||||
|
@ -21,7 +21,7 @@ XERCES_CPP_NAMESPACE_USE
|
||||
|
||||
static AtSmartPtr<AtNode> ConvertNode(DOMElement* element);
|
||||
|
||||
void AtlasObject::LoadFromXML(AtObj& obj, const wchar_t* filename)
|
||||
AtObj AtlasObject::LoadFromXML(const wchar_t* filename)
|
||||
{
|
||||
// TODO: Convert wchar_t* to XMLCh* when running under GCC
|
||||
assert(sizeof(wchar_t) == sizeof(XMLCh));
|
||||
@ -39,16 +39,24 @@ void AtlasObject::LoadFromXML(AtObj& obj, const wchar_t* filename)
|
||||
if (parser->getErrorCount() != 0)
|
||||
{
|
||||
assert(! "Error while loading XML - invalid XML data?");
|
||||
return;
|
||||
return AtObj();
|
||||
}
|
||||
|
||||
DOMDocument* doc = parser->getDocument();
|
||||
DOMElement* root = doc->getDocumentElement();
|
||||
|
||||
AtObj obj;
|
||||
obj.p = ConvertNode(root);
|
||||
|
||||
AtObj rootObj;
|
||||
char* rootName = XMLString::transcode(root->getNodeName());
|
||||
rootObj.set(rootName, obj);
|
||||
XMLString::release(&rootName);
|
||||
|
||||
// TODO: Initialise/terminate properly
|
||||
// XMLPlatformUtils::Terminate();
|
||||
|
||||
return rootObj;
|
||||
}
|
||||
|
||||
// Convert from a DOMElement to an AtNode
|
||||
@ -70,16 +78,14 @@ static AtSmartPtr<AtNode> ConvertNode(DOMElement* element)
|
||||
|
||||
// Use its name for the AtNode key
|
||||
char* name = XMLString::transcode(node->getNodeName());
|
||||
const std::string namestr (name);
|
||||
|
||||
// Recursively convert the sub-element, and add it into this node
|
||||
AtNode::child_pairtype n (
|
||||
namestr, ConvertNode((DOMElement*)node)
|
||||
);
|
||||
obj->children.insert(n);
|
||||
obj->children.insert(AtNode::child_pairtype(
|
||||
name, ConvertNode((DOMElement*)node)
|
||||
));
|
||||
|
||||
// Free memory
|
||||
XMLString::release(&name);
|
||||
XMLString::release((char**)&name);
|
||||
}
|
||||
else if (type == DOMNode::TEXT_NODE)
|
||||
{
|
||||
@ -127,7 +133,7 @@ static DOMNode* BuildDOM(DOMDocument* doc, const XMLCh* name, AtNode::Ptr p)
|
||||
return node;
|
||||
}
|
||||
|
||||
void AtlasObject::SaveToXML(AtObj& obj, const wchar_t* filename)
|
||||
bool AtlasObject::SaveToXML(AtObj& obj, const wchar_t* filename)
|
||||
{
|
||||
// TODO: Convert wchar_t* to XMLCh* when running under GCC
|
||||
assert(sizeof(wchar_t) == sizeof(XMLCh));
|
||||
@ -136,9 +142,9 @@ void AtlasObject::SaveToXML(AtObj& obj, const wchar_t* filename)
|
||||
XMLPlatformUtils::Initialize();
|
||||
|
||||
// Why does it take so much work just to create a DOMWriter? :-(
|
||||
XMLCh tempStr[100];
|
||||
XMLString::transcode("LS", tempStr, 99);
|
||||
DOMImplementation* impl = DOMImplementationRegistry::getDOMImplementation(tempStr);
|
||||
XMLCh domFeatures[100];
|
||||
XMLString::transcode("LS", domFeatures, 99); // maybe "LS" means "load/save", but I really don't know
|
||||
DOMImplementation* impl = DOMImplementationRegistry::getDOMImplementation(domFeatures);
|
||||
DOMWriter* writer = ((DOMImplementationLS*)impl)->createDOMWriter();
|
||||
|
||||
if (writer->canSetFeature(XMLUni::fgDOMWRTDiscardDefaultContent, true))
|
||||
@ -147,11 +153,23 @@ void AtlasObject::SaveToXML(AtObj& obj, const wchar_t* filename)
|
||||
if (writer->canSetFeature(XMLUni::fgDOMWRTFormatPrettyPrint, true))
|
||||
writer->setFeature(XMLUni::fgDOMWRTFormatPrettyPrint, true);
|
||||
|
||||
DOMDocument* doc = impl->createDocument();
|
||||
doc->appendChild(BuildDOM(doc, L"actor", obj.p)); // TODO: this is stupid
|
||||
|
||||
// Find the root element of the object:
|
||||
|
||||
if (obj.p->children.size() != 1)
|
||||
{
|
||||
assert(! "SaveToXML: root must only have one child");
|
||||
return false;
|
||||
}
|
||||
XMLCh rootName[255];
|
||||
XMLString::transcode(obj.p->children.begin()->first.c_str(), rootName, 255);
|
||||
AtNode::Ptr firstChild (obj.p->children.begin()->second);
|
||||
|
||||
try
|
||||
{
|
||||
DOMDocument* doc = impl->createDocument();
|
||||
doc->appendChild(BuildDOM(doc, rootName, firstChild));
|
||||
|
||||
XMLFormatTarget* FormatTarget = new LocalFileFormatTarget((XMLCh*)filename);
|
||||
writer->writeNode(FormatTarget, *doc);
|
||||
delete FormatTarget;
|
||||
@ -160,18 +178,20 @@ void AtlasObject::SaveToXML(AtObj& obj, const wchar_t* filename)
|
||||
char* message = XMLString::transcode(e.getMessage());
|
||||
assert(! "XML exception - maybe failed while writing the file");
|
||||
XMLString::release(&message);
|
||||
XMLPlatformUtils::Terminate();
|
||||
return;
|
||||
// XMLPlatformUtils::Terminate();
|
||||
return false;
|
||||
}
|
||||
catch (const DOMException& e) {
|
||||
char* message = XMLString::transcode(e.msg);
|
||||
assert(! "DOM exception");
|
||||
XMLString::release(&message);
|
||||
XMLPlatformUtils::Terminate();
|
||||
return;
|
||||
// XMLPlatformUtils::Terminate();
|
||||
return false;
|
||||
}
|
||||
|
||||
writer->release();
|
||||
|
||||
// XMLPlatformUtils::Terminate();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
@ -67,22 +67,33 @@ ActorEditor::ActorEditor(wxWindow* parent)
|
||||
|
||||
void ActorEditor::Import(AtObj& in)
|
||||
{
|
||||
m_ActorEditorListCtrl->Import(in);
|
||||
if (! in["actor"].defined())
|
||||
{
|
||||
// TODO: report error
|
||||
return;
|
||||
}
|
||||
|
||||
if (in["castshadow"].defined())
|
||||
AtObj actor (in["actor"]);
|
||||
m_ActorEditorListCtrl->Import(actor);
|
||||
|
||||
if (actor["castshadow"].defined())
|
||||
m_CastShadows->SetValue(true);
|
||||
else
|
||||
m_CastShadows->SetValue(false);
|
||||
|
||||
m_Material->SetValue(in["material"]);
|
||||
m_Material->SetValue(actor["material"]);
|
||||
}
|
||||
|
||||
void ActorEditor::Export(AtObj& out)
|
||||
AtObj ActorEditor::Export()
|
||||
{
|
||||
m_ActorEditorListCtrl->Export(out);
|
||||
AtObj actor (m_ActorEditorListCtrl->Export());
|
||||
|
||||
if (m_CastShadows->IsChecked())
|
||||
out.set("castshadow", L"true");
|
||||
actor.set("castshadow", L"true");
|
||||
|
||||
out.set("material", m_Material->GetValue().c_str());
|
||||
actor.set("material", m_Material->GetValue().c_str());
|
||||
|
||||
AtObj out;
|
||||
out.set("actor", actor);
|
||||
return out;
|
||||
}
|
||||
|
@ -9,11 +9,11 @@ public:
|
||||
|
||||
protected:
|
||||
void Import(AtObj& in);
|
||||
void Export(AtObj& out);
|
||||
AtObj Export();
|
||||
|
||||
private:
|
||||
ActorEditorListCtrl* m_ActorEditorListCtrl;
|
||||
|
||||
wxCheckBox* m_CastShadows;
|
||||
wxTextCtrl* m_Material;
|
||||
};
|
||||
};
|
||||
|
@ -45,8 +45,10 @@ void ActorEditorListCtrl::Import(AtObj& in)
|
||||
UpdateDisplay();
|
||||
}
|
||||
|
||||
void ActorEditorListCtrl::Export(AtObj& out)
|
||||
AtObj ActorEditorListCtrl::Export()
|
||||
{
|
||||
AtObj out;
|
||||
|
||||
AtObj group;
|
||||
|
||||
for (size_t i = 0; i < m_ListData.size(); ++i)
|
||||
@ -66,6 +68,8 @@ void ActorEditorListCtrl::Export(AtObj& out)
|
||||
|
||||
if (! group.isNull())
|
||||
out.add("group", group);
|
||||
|
||||
return out;
|
||||
}
|
||||
|
||||
wxListItemAttr* ActorEditorListCtrl::OnGetItemAttr(long item) const
|
||||
|
@ -17,7 +17,7 @@ public:
|
||||
|
||||
private:
|
||||
void Import(AtObj& in);
|
||||
void Export(AtObj& out);
|
||||
AtObj Export();
|
||||
|
||||
wxListItemAttr m_ListItemAttr_Model[2];
|
||||
wxListItemAttr m_ListItemAttr_Texture[2];
|
||||
|
@ -26,9 +26,9 @@ void AnimListEditor::Import(AtObj& in)
|
||||
m_MainListBox->Import(in);
|
||||
}
|
||||
|
||||
void AnimListEditor::Export(AtObj& out)
|
||||
AtObj AnimListEditor::Export()
|
||||
{
|
||||
m_MainListBox->Export(out);
|
||||
return m_MainListBox->Export();
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
@ -50,8 +50,10 @@ void AnimListEditorListCtrl::Import(AtObj& in)
|
||||
UpdateDisplay();
|
||||
}
|
||||
|
||||
void AnimListEditorListCtrl::Export(AtObj& out)
|
||||
AtObj AnimListEditorListCtrl::Export()
|
||||
{
|
||||
AtObj out;
|
||||
for (size_t i = 0; i < m_ListData.size(); ++i)
|
||||
out.add("animation", m_ListData[i]);
|
||||
return out;
|
||||
}
|
||||
|
@ -16,7 +16,7 @@ public:
|
||||
|
||||
protected:
|
||||
void Import(AtObj& in);
|
||||
void Export(AtObj& out);
|
||||
AtObj Export();
|
||||
|
||||
private:
|
||||
AnimListEditorListCtrl* m_MainListBox;
|
||||
@ -34,5 +34,5 @@ public:
|
||||
void OnUpdate(wxCommandEvent& event);
|
||||
|
||||
void Import(AtObj& in);
|
||||
void Export(AtObj& out);
|
||||
AtObj Export();
|
||||
};
|
||||
|
@ -26,9 +26,9 @@ void PropListEditor::Import(AtObj& in)
|
||||
m_MainListBox->Import(in);
|
||||
}
|
||||
|
||||
void PropListEditor::Export(AtObj& out)
|
||||
AtObj PropListEditor::Export()
|
||||
{
|
||||
m_MainListBox->Export(out);
|
||||
return m_MainListBox->Export();
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
@ -49,8 +49,10 @@ void PropListEditorListCtrl::Import(AtObj& in)
|
||||
UpdateDisplay();
|
||||
}
|
||||
|
||||
void PropListEditorListCtrl::Export(AtObj& out)
|
||||
AtObj PropListEditorListCtrl::Export()
|
||||
{
|
||||
AtObj out;
|
||||
for (size_t i = 0; i < m_ListData.size(); ++i)
|
||||
out.add("prop", m_ListData[i]);
|
||||
return out;
|
||||
}
|
||||
|
@ -16,7 +16,7 @@ public:
|
||||
|
||||
protected:
|
||||
void Import(AtObj& in);
|
||||
void Export(AtObj& out);
|
||||
AtObj Export();
|
||||
|
||||
private:
|
||||
PropListEditorListCtrl* m_MainListBox;
|
||||
@ -34,5 +34,5 @@ public:
|
||||
void OnUpdate(wxCommandEvent& event);
|
||||
|
||||
void Import(AtObj& in);
|
||||
void Export(AtObj& out);
|
||||
AtObj Export();
|
||||
};
|
||||
|
@ -34,4 +34,4 @@ private:
|
||||
long m_DragSource;
|
||||
|
||||
DECLARE_EVENT_TABLE();
|
||||
};
|
||||
};
|
||||
|
@ -80,8 +80,7 @@ void FieldEditCtrl_Dialog::StartEdit(wxWindow* parent, wxRect WXUNUSED(rect), lo
|
||||
|
||||
if (ret == wxID_OK)
|
||||
{
|
||||
AtObj out;
|
||||
dialog->Export(out);
|
||||
AtObj out (dialog->Export());
|
||||
|
||||
AtlasWindowCommandProc::GetFromParentFrame(parent)->Submit(
|
||||
new EditCommand_Dialog(editCtrl, row, col, out)
|
||||
@ -89,4 +88,4 @@ void FieldEditCtrl_Dialog::StartEdit(wxWindow* parent, wxRect WXUNUSED(rect), lo
|
||||
}
|
||||
|
||||
delete dialog;
|
||||
}
|
||||
}
|
||||
|
@ -32,4 +32,3 @@ protected:
|
||||
private:
|
||||
wxString m_DialogType;
|
||||
};
|
||||
|
||||
|
@ -19,4 +19,4 @@ private:
|
||||
EditableListCtrl* m_listCtrl;
|
||||
long m_Row;
|
||||
int m_Col;
|
||||
};
|
||||
};
|
||||
|
@ -10,4 +10,4 @@ public:
|
||||
|
||||
private:
|
||||
DECLARE_EVENT_TABLE();
|
||||
};
|
||||
};
|
||||
|
@ -82,8 +82,7 @@ void AtlasWindow::OnImport(wxCommandEvent& WXUNUSED(event))
|
||||
|
||||
wxString filename = dlg.GetPath();
|
||||
|
||||
AtObj file;
|
||||
AtlasObject::LoadFromXML(file, filename.c_str());
|
||||
AtObj file (AtlasObject::LoadFromXML(filename.c_str()));
|
||||
|
||||
Import(file);
|
||||
|
||||
@ -99,8 +98,7 @@ void AtlasWindow::OnExport(wxCommandEvent& WXUNUSED(event))
|
||||
|
||||
wxString filename = dlg.GetPath();
|
||||
|
||||
AtObj file;
|
||||
Export(file);
|
||||
AtObj file (Export());
|
||||
|
||||
AtlasObject::SaveToXML(file, filename.c_str());
|
||||
|
||||
|
@ -35,4 +35,4 @@ private:
|
||||
wxString m_WindowTitle;
|
||||
|
||||
DECLARE_EVENT_TABLE();
|
||||
};
|
||||
};
|
||||
|
@ -7,7 +7,7 @@ class IAtlasExporter // and also importer, but I can't think of a nice concise n
|
||||
{
|
||||
public:
|
||||
virtual void Import(AtObj& in)=0;
|
||||
virtual void Export(AtObj& out)=0;
|
||||
virtual AtObj Export()=0;
|
||||
};
|
||||
|
||||
#endif // IATLASEXPORTER_H__
|
||||
|
@ -1 +1 @@
|
||||
#include "stdafx.h"
|
||||
#include "stdafx.h"
|
||||
|
@ -1,23 +1,54 @@
|
||||
* Copy and paste
|
||||
* Sort this list
|
||||
|
||||
* s/PropListEditor/PropListEditor/
|
||||
|
||||
* Rearrange directory structure
|
||||
===
|
||||
|
||||
* Don't hardcode "actor" in XML files (urgh)
|
||||
|
||||
* Document lots
|
||||
|
||||
* Make import undoable
|
||||
|
||||
* Combo boxes for prop/anim names, loaded from file
|
||||
|
||||
* Right click to edit
|
||||
|
||||
===
|
||||
|
||||
* Better input controls (=> export nicely, support undo, etc)
|
||||
|
||||
* Copy and paste
|
||||
|
||||
* Browse for meshes/actors/etc.
|
||||
|
||||
* Save on exit
|
||||
|
||||
* Help (tooltips, etc)
|
||||
|
||||
===
|
||||
|
||||
* Window size memory
|
||||
|
||||
* Column width memory
|
||||
|
||||
* Allow reset memory
|
||||
|
||||
* Input validation?
|
||||
|
||||
* Browse for meshes/actors/etc, with mods
|
||||
|
||||
* Customised AtObj->string conversion
|
||||
|
||||
* Import/export filter, for validation(?) and for handling attributes
|
||||
|
||||
* Undo in text-editing boxes
|
||||
|
||||
* AtlasObjectXML error handling
|
||||
|
||||
* Use standard wxWidgets 2.5.4 release
|
||||
|
||||
===
|
||||
|
||||
|
||||
* Document lots
|
||||
|
||||
* wxListItemAttr* OnGetItemAttr(long item) >>>const<<< - wx documentation??
|
||||
|
||||
* Better widths
|
||||
|
||||
* Combo boxes for prop/anim names, loaded from file
|
||||
|
||||
* Input validation?
|
||||
|
||||
* Better input controls (=> export nicely, support undo, etc)
|
||||
|
||||
* Handle undo correctly after importing
|
Loading…
Reference in New Issue
Block a user