style specific fields are now editable&saveable

git-svn-id: svn://svn.code.sf.net/p/magicseteditor/code/trunk@392 0fc631ac-6414-0410-93d0-97cfa31319b6
This commit is contained in:
twanvl
2007-05-19 00:05:18 +00:00
parent 7230a79d85
commit 936fb57b69
16 changed files with 69 additions and 11 deletions
+43
View File
@@ -12,6 +12,7 @@
#include <data/field.hpp>
#include <util/error.hpp>
#include <util/reflect.hpp>
#include <wx/sstream.h>
DECLARE_TYPEOF_COLLECTION(FieldP);
DECLARE_TYPEOF_NO_REV(IndexMap<FieldP COMMA ValueP>);
@@ -51,6 +52,48 @@ void mark_dependency_member(const Card& card, const String& name, const Dependen
IMPLEMENT_REFLECTION(Card) {
REFLECT(stylesheet);
REFLECT(notes);
REFLECT_NO_SCRIPT(extra_data);
REFLECT_NAMELESS(data);
}
// ----------------------------------------------------------------------------- : Styling
// TODO : this is practically the same as Set::Styling, maybe somehow abstract it
// Extra card data, for a specific stylesheet
/* The data is not read immediatly, because we do not know the stylesheet */
class Card::Styling : public IntrusivePtrBase<Card::Styling> {
public:
/// The values on the extra card fields of the card.
/** The indices should correspond to the extra_card_fields in the StyleSheet */
IndexMap<FieldP, ValueP> extra_data;
/// Unparsed extra_data
String unread_data;
DECLARE_REFLECTION();
};
IndexMap<FieldP, ValueP>& Card::extraDataFor(const StyleSheet& stylesheet) {
StylingP& styling = extra_data[stylesheet.name()];
if (!styling) {
styling = new_intrusive<Styling>();
styling->extra_data.init(stylesheet.extra_card_fields);
} else if (!styling->unread_data.empty() || (styling->extra_data.empty()) && !stylesheet.extra_card_fields.empty()) {
// we delayed the reading of the data, read it now
styling->extra_data.init(stylesheet.extra_card_fields);
Reader reader(new_shared1<wxStringInputStream>(styling->unread_data), _("extra card values for ") + stylesheet.stylesheetName());
reader.handle_greedy(styling->extra_data);
styling->unread_data.clear();
}
return styling->extra_data;
}
// custom reflection : read into unread_data
template <> void Reader::handle(Card::Styling& s) {
handle(s.unread_data);
}
template <> void Writer::handle(const Card::Styling& s) {
handle(s.extra_data);
}
// for the love of god, don't depend on styling
template <> void GetMember::handle(const Card::Styling& s) {}
template <> void GetDefaultMember::handle(const Card::Styling& s) {}