Various small fixes and minimal improvements

This was SVN commit r2035.
This commit is contained in:
Ykkrosh 2005-03-22 13:54:37 +00:00
parent 5b11dbb6b0
commit 5460b8982e
25 changed files with 143 additions and 78 deletions

View File

@ -164,10 +164,9 @@ bool CObjectBase::Load(const char* filename)
XERO_ITER_EL(root, child) XERO_ITER_EL(root, child)
{ {
int element_name = child.getNodeName(); int child_name = child.getNodeName();
CStr element_value (child.getText());
if (element_name == el_group) if (child_name == el_group)
{ {
m_Variants.resize(m_Variants.size()+1); m_Variants.resize(m_Variants.size()+1);
@ -246,7 +245,7 @@ bool CObjectBase::Load(const char* filename)
m_Variants.pop_back(); m_Variants.pop_back();
} }
} }
else if (element_name == el_material) else if (child_name == el_material)
{ {
m_Material = child.getText(); m_Material = child.getText();
} }

View File

@ -201,7 +201,7 @@ void CObjectManager::LoadObjectsIn(CStr& pathname)
else else
{ {
m_ObjectTypes[0].m_ObjectNameToFilename[objectName] = *it; 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());
} }
} }

View File

@ -308,7 +308,7 @@ int sem_timedwait(sem_t* sem, const struct timespec* abs_timeout)
HANDLE h = sem_t_to_HANDLE(sem); HANDLE h = sem_t_to_HANDLE(sem);
DWORD ret = WaitForSingleObject(h, timeout_ms); DWORD ret = WaitForSingleObject(h, timeout_ms);
// succesfully decremented semaphore; bail. // successfully decremented semaphore; bail.
if(ret == WAIT_OBJECT_0) if(ret == WAIT_OBJECT_0)
return 0; return 0;

View File

@ -132,8 +132,8 @@ public:
// Miscellaneous utility functions: // Miscellaneous utility functions:
namespace AtlasObject namespace AtlasObject
{ {
void LoadFromXML(AtObj& obj, const wchar_t* filename); AtObj LoadFromXML(const wchar_t* filename);
void SaveToXML(AtObj& obj, const wchar_t* filename); bool SaveToXML(AtObj& obj, const wchar_t* filename);
}; };
#endif // ATLASOBJECT_H__ #endif // ATLASOBJECT_H__

View File

@ -140,8 +140,8 @@ void AtObj::set(const char* key, const wchar_t* value)
bool AtObj::hasContent() const bool AtObj::hasContent() const
{ {
if (! p) if (!p)
return true; return false;
return p->hasContent(); return p->hasContent();
} }

View File

@ -19,4 +19,4 @@ namespace AtlasObject
// as an easy way of visualising the data (without any horridly ugly // as an easy way of visualising the data (without any horridly ugly
// XML junk) // XML junk)
std::wstring ConvertToString(const AtObj& obj); std::wstring ConvertToString(const AtObj& obj);
} }

View File

@ -21,7 +21,7 @@ XERCES_CPP_NAMESPACE_USE
static AtSmartPtr<AtNode> ConvertNode(DOMElement* element); 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 // TODO: Convert wchar_t* to XMLCh* when running under GCC
assert(sizeof(wchar_t) == sizeof(XMLCh)); assert(sizeof(wchar_t) == sizeof(XMLCh));
@ -39,16 +39,24 @@ void AtlasObject::LoadFromXML(AtObj& obj, const wchar_t* filename)
if (parser->getErrorCount() != 0) if (parser->getErrorCount() != 0)
{ {
assert(! "Error while loading XML - invalid XML data?"); assert(! "Error while loading XML - invalid XML data?");
return; return AtObj();
} }
DOMDocument* doc = parser->getDocument(); DOMDocument* doc = parser->getDocument();
DOMElement* root = doc->getDocumentElement(); DOMElement* root = doc->getDocumentElement();
AtObj obj;
obj.p = ConvertNode(root); obj.p = ConvertNode(root);
AtObj rootObj;
char* rootName = XMLString::transcode(root->getNodeName());
rootObj.set(rootName, obj);
XMLString::release(&rootName);
// TODO: Initialise/terminate properly // TODO: Initialise/terminate properly
// XMLPlatformUtils::Terminate(); // XMLPlatformUtils::Terminate();
return rootObj;
} }
// Convert from a DOMElement to an AtNode // Convert from a DOMElement to an AtNode
@ -70,16 +78,14 @@ static AtSmartPtr<AtNode> ConvertNode(DOMElement* element)
// Use its name for the AtNode key // Use its name for the AtNode key
char* name = XMLString::transcode(node->getNodeName()); char* name = XMLString::transcode(node->getNodeName());
const std::string namestr (name);
// Recursively convert the sub-element, and add it into this node // Recursively convert the sub-element, and add it into this node
AtNode::child_pairtype n ( obj->children.insert(AtNode::child_pairtype(
namestr, ConvertNode((DOMElement*)node) name, ConvertNode((DOMElement*)node)
); ));
obj->children.insert(n);
// Free memory // Free memory
XMLString::release(&name); XMLString::release((char**)&name);
} }
else if (type == DOMNode::TEXT_NODE) else if (type == DOMNode::TEXT_NODE)
{ {
@ -127,7 +133,7 @@ static DOMNode* BuildDOM(DOMDocument* doc, const XMLCh* name, AtNode::Ptr p)
return node; 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 // TODO: Convert wchar_t* to XMLCh* when running under GCC
assert(sizeof(wchar_t) == sizeof(XMLCh)); assert(sizeof(wchar_t) == sizeof(XMLCh));
@ -136,9 +142,9 @@ void AtlasObject::SaveToXML(AtObj& obj, const wchar_t* filename)
XMLPlatformUtils::Initialize(); XMLPlatformUtils::Initialize();
// Why does it take so much work just to create a DOMWriter? :-( // Why does it take so much work just to create a DOMWriter? :-(
XMLCh tempStr[100]; XMLCh domFeatures[100];
XMLString::transcode("LS", tempStr, 99); XMLString::transcode("LS", domFeatures, 99); // maybe "LS" means "load/save", but I really don't know
DOMImplementation* impl = DOMImplementationRegistry::getDOMImplementation(tempStr); DOMImplementation* impl = DOMImplementationRegistry::getDOMImplementation(domFeatures);
DOMWriter* writer = ((DOMImplementationLS*)impl)->createDOMWriter(); DOMWriter* writer = ((DOMImplementationLS*)impl)->createDOMWriter();
if (writer->canSetFeature(XMLUni::fgDOMWRTDiscardDefaultContent, true)) 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)) if (writer->canSetFeature(XMLUni::fgDOMWRTFormatPrettyPrint, true))
writer->setFeature(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 try
{ {
DOMDocument* doc = impl->createDocument();
doc->appendChild(BuildDOM(doc, rootName, firstChild));
XMLFormatTarget* FormatTarget = new LocalFileFormatTarget((XMLCh*)filename); XMLFormatTarget* FormatTarget = new LocalFileFormatTarget((XMLCh*)filename);
writer->writeNode(FormatTarget, *doc); writer->writeNode(FormatTarget, *doc);
delete FormatTarget; delete FormatTarget;
@ -160,18 +178,20 @@ void AtlasObject::SaveToXML(AtObj& obj, const wchar_t* filename)
char* message = XMLString::transcode(e.getMessage()); char* message = XMLString::transcode(e.getMessage());
assert(! "XML exception - maybe failed while writing the file"); assert(! "XML exception - maybe failed while writing the file");
XMLString::release(&message); XMLString::release(&message);
XMLPlatformUtils::Terminate(); // XMLPlatformUtils::Terminate();
return; return false;
} }
catch (const DOMException& e) { catch (const DOMException& e) {
char* message = XMLString::transcode(e.msg); char* message = XMLString::transcode(e.msg);
assert(! "DOM exception"); assert(! "DOM exception");
XMLString::release(&message); XMLString::release(&message);
XMLPlatformUtils::Terminate(); // XMLPlatformUtils::Terminate();
return; return false;
} }
writer->release(); writer->release();
// XMLPlatformUtils::Terminate(); // XMLPlatformUtils::Terminate();
return true;
} }

View File

@ -67,22 +67,33 @@ ActorEditor::ActorEditor(wxWindow* parent)
void ActorEditor::Import(AtObj& in) 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); m_CastShadows->SetValue(true);
else else
m_CastShadows->SetValue(false); 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()) 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;
} }

View File

@ -9,11 +9,11 @@ public:
protected: protected:
void Import(AtObj& in); void Import(AtObj& in);
void Export(AtObj& out); AtObj Export();
private: private:
ActorEditorListCtrl* m_ActorEditorListCtrl; ActorEditorListCtrl* m_ActorEditorListCtrl;
wxCheckBox* m_CastShadows; wxCheckBox* m_CastShadows;
wxTextCtrl* m_Material; wxTextCtrl* m_Material;
}; };

View File

@ -45,8 +45,10 @@ void ActorEditorListCtrl::Import(AtObj& in)
UpdateDisplay(); UpdateDisplay();
} }
void ActorEditorListCtrl::Export(AtObj& out) AtObj ActorEditorListCtrl::Export()
{ {
AtObj out;
AtObj group; AtObj group;
for (size_t i = 0; i < m_ListData.size(); ++i) for (size_t i = 0; i < m_ListData.size(); ++i)
@ -66,6 +68,8 @@ void ActorEditorListCtrl::Export(AtObj& out)
if (! group.isNull()) if (! group.isNull())
out.add("group", group); out.add("group", group);
return out;
} }
wxListItemAttr* ActorEditorListCtrl::OnGetItemAttr(long item) const wxListItemAttr* ActorEditorListCtrl::OnGetItemAttr(long item) const

View File

@ -17,7 +17,7 @@ public:
private: private:
void Import(AtObj& in); void Import(AtObj& in);
void Export(AtObj& out); AtObj Export();
wxListItemAttr m_ListItemAttr_Model[2]; wxListItemAttr m_ListItemAttr_Model[2];
wxListItemAttr m_ListItemAttr_Texture[2]; wxListItemAttr m_ListItemAttr_Texture[2];

View File

@ -26,9 +26,9 @@ void AnimListEditor::Import(AtObj& in)
m_MainListBox->Import(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(); UpdateDisplay();
} }
void AnimListEditorListCtrl::Export(AtObj& out) AtObj AnimListEditorListCtrl::Export()
{ {
AtObj out;
for (size_t i = 0; i < m_ListData.size(); ++i) for (size_t i = 0; i < m_ListData.size(); ++i)
out.add("animation", m_ListData[i]); out.add("animation", m_ListData[i]);
return out;
} }

View File

@ -16,7 +16,7 @@ public:
protected: protected:
void Import(AtObj& in); void Import(AtObj& in);
void Export(AtObj& out); AtObj Export();
private: private:
AnimListEditorListCtrl* m_MainListBox; AnimListEditorListCtrl* m_MainListBox;
@ -34,5 +34,5 @@ public:
void OnUpdate(wxCommandEvent& event); void OnUpdate(wxCommandEvent& event);
void Import(AtObj& in); void Import(AtObj& in);
void Export(AtObj& out); AtObj Export();
}; };

View File

@ -26,9 +26,9 @@ void PropListEditor::Import(AtObj& in)
m_MainListBox->Import(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(); UpdateDisplay();
} }
void PropListEditorListCtrl::Export(AtObj& out) AtObj PropListEditorListCtrl::Export()
{ {
AtObj out;
for (size_t i = 0; i < m_ListData.size(); ++i) for (size_t i = 0; i < m_ListData.size(); ++i)
out.add("prop", m_ListData[i]); out.add("prop", m_ListData[i]);
return out;
} }

View File

@ -16,7 +16,7 @@ public:
protected: protected:
void Import(AtObj& in); void Import(AtObj& in);
void Export(AtObj& out); AtObj Export();
private: private:
PropListEditorListCtrl* m_MainListBox; PropListEditorListCtrl* m_MainListBox;
@ -34,5 +34,5 @@ public:
void OnUpdate(wxCommandEvent& event); void OnUpdate(wxCommandEvent& event);
void Import(AtObj& in); void Import(AtObj& in);
void Export(AtObj& out); AtObj Export();
}; };

View File

@ -34,4 +34,4 @@ private:
long m_DragSource; long m_DragSource;
DECLARE_EVENT_TABLE(); DECLARE_EVENT_TABLE();
}; };

View File

@ -80,8 +80,7 @@ void FieldEditCtrl_Dialog::StartEdit(wxWindow* parent, wxRect WXUNUSED(rect), lo
if (ret == wxID_OK) if (ret == wxID_OK)
{ {
AtObj out; AtObj out (dialog->Export());
dialog->Export(out);
AtlasWindowCommandProc::GetFromParentFrame(parent)->Submit( AtlasWindowCommandProc::GetFromParentFrame(parent)->Submit(
new EditCommand_Dialog(editCtrl, row, col, out) new EditCommand_Dialog(editCtrl, row, col, out)
@ -89,4 +88,4 @@ void FieldEditCtrl_Dialog::StartEdit(wxWindow* parent, wxRect WXUNUSED(rect), lo
} }
delete dialog; delete dialog;
} }

View File

@ -32,4 +32,3 @@ protected:
private: private:
wxString m_DialogType; wxString m_DialogType;
}; };

View File

@ -19,4 +19,4 @@ private:
EditableListCtrl* m_listCtrl; EditableListCtrl* m_listCtrl;
long m_Row; long m_Row;
int m_Col; int m_Col;
}; };

View File

@ -10,4 +10,4 @@ public:
private: private:
DECLARE_EVENT_TABLE(); DECLARE_EVENT_TABLE();
}; };

View File

@ -82,8 +82,7 @@ void AtlasWindow::OnImport(wxCommandEvent& WXUNUSED(event))
wxString filename = dlg.GetPath(); wxString filename = dlg.GetPath();
AtObj file; AtObj file (AtlasObject::LoadFromXML(filename.c_str()));
AtlasObject::LoadFromXML(file, filename.c_str());
Import(file); Import(file);
@ -99,8 +98,7 @@ void AtlasWindow::OnExport(wxCommandEvent& WXUNUSED(event))
wxString filename = dlg.GetPath(); wxString filename = dlg.GetPath();
AtObj file; AtObj file (Export());
Export(file);
AtlasObject::SaveToXML(file, filename.c_str()); AtlasObject::SaveToXML(file, filename.c_str());

View File

@ -35,4 +35,4 @@ private:
wxString m_WindowTitle; wxString m_WindowTitle;
DECLARE_EVENT_TABLE(); DECLARE_EVENT_TABLE();
}; };

View File

@ -7,7 +7,7 @@ class IAtlasExporter // and also importer, but I can't think of a nice concise n
{ {
public: public:
virtual void Import(AtObj& in)=0; virtual void Import(AtObj& in)=0;
virtual void Export(AtObj& out)=0; virtual AtObj Export()=0;
}; };
#endif // IATLASEXPORTER_H__ #endif // IATLASEXPORTER_H__

View File

@ -1 +1 @@
#include "stdafx.h" #include "stdafx.h"

View File

@ -1,23 +1,54 @@
* Copy and paste * Sort this list
* s/PropListEditor/PropListEditor/ ===
* Rearrange directory structure
* Don't hardcode "actor" in XML files (urgh) * Don't hardcode "actor" in XML files (urgh)
* Document lots
* Make import undoable * 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?? * wxListItemAttr* OnGetItemAttr(long item) >>>const<<< - wx documentation??
* Better widths * 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