src/ldHeader.cpp

changeset 900
680009bac81f
--- /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

mercurial