--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/ldHeader.cpp Wed Oct 22 20:19:53 2014 +0300 @@ -0,0 +1,136 @@ +#include "ldHeader.h" + +static const char* g_PartTypeNames[PARTTYPE_NUM_TYPES] = +{ + "Part", + "Subpart", + "Primitive", + "48_Primitive", + "Shortcut", + "Unofficial_Part", + "Unofficial_Subpart", + "Unofficial_Primitive", + "Unofficial_48_Primitive", + "Unofficial_Shortcut", +}; + +static const char g_HeaderBFCNames[] = +{ + "CCW", + "CW", + "NOCERTIFY", +} + +QString LDHeader::serialize() const +{ + QStringList result; + + // Title, name and part type + result << m_title; + result << "Name:" + m_name; + result << format ("0 !LDRAW_ORG %1 %2", g_PartTypeNames[int (partType())], qualifiers()) + + // License (if any, heh) + if (not license().isEmpty()) + result << "0 !LICENSE " + license(); + + // Help text, if any + if (not help().isEmpty()) + { + result << ""; + + for (QString const& a : keywords()) + result << "0 !HELP " + a; + } + + // BFC type - specs say this isn't mandatory for NOCERTIFY parts but + // highly recommended, so we'll add it in. + result << ""; + result << "0 BFC " + g_HeaderBFCNames[int (headerBFC())]; + + // Category, if present + if (not category().isEmpty()) + { + result << ""; + result << "0 !CATEGORY " + category(); + } + + // Keywords, if any + if (not keywords.isEmpty()) + { + if (category.isEmpty()) + result << ""; + + for (QString const& a : keywords()) + result << "0 !KEYWORDS " + a; + } + + // Command line, if any + if (not commandLine().isEmpty()) + result << "" << "0 !CMDLINE " + commandLine(); + + // History entries, if any + if (not history().isEmpty()) + { + result << ""; + + for (LDHistoryEntry const& a : history()) + result << a.serialize(); + } + + // Comments, if any + if (not comments().isEmpty()) + { + result << ""; + + for (QString const& a : comments()) + result << "0 // " + a; + } + + result << ""; + QString resultText; + + // Wrap it all up into a single string + for (QString a : result) + { + // Remove trailing space + while (a.right (1) == " ") + a.chop (1); + + result += a + "\r\n"; + } + + return result; +} + +bool LDHeader::isUnofficial() const +{ + return m_partType >= PARTTYPE_FIRST_UNOFFICIAL; +} + +void LDHeader::makeUnofficial() +{ + if (not isUnofficial()) + m_partType += PARTTYPE_FIRST_UNOFFICIAL; +} + +void LDHeader::makeOfficial() +{ + if (isUnofficial()) + m_partType -= PARTTYPE_FIRST_UNOFFICIAL; +} + +LDHistoryEntry::LDHistoryEntry() : + m_isRealName (false) {} + +QString LDHistoryEntry::serialize() const +{ + QString userblock; + + if (isRealName()) + userblock = format ("{%1}", username()); + else + userblock = format ("[%1]", username()); + + return format ("0 !HISTORY %1 %2 %3", date().toString ("yyyy-MM-dd"), userblock, description); +} \ No newline at end of file