Project::OSiRiON - Git repositories
Project::OSiRiON
News . About . Screenshots . Downloads . Forum . Wiki . Tracker . Git
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStijn Buys <ingar@osirion.org>2012-02-21 22:30:21 +0000
committerStijn Buys <ingar@osirion.org>2012-02-21 22:30:21 +0000
commit0392694560d530c14aced7ac21f85b18b676a685 (patch)
tree2410f58516767913b6fdd5f2efcdca9fb1155fc2
parentba14d604adfee8b7596e0bfca81ad2720bbc0cf5 (diff)
Initial support to preserve ini file comments
-rw-r--r--src/editorwindow.cc10
-rw-r--r--src/entityproperties.cc25
-rw-r--r--src/entityproperties.h4
-rw-r--r--src/inistream.cc9
-rw-r--r--src/inistream.h14
-rw-r--r--src/properties.cc5
-rw-r--r--src/properties.h18
-rw-r--r--src/zoneproperties.cc13
8 files changed, 83 insertions, 15 deletions
diff --git a/src/editorwindow.cc b/src/editorwindow.cc
index 446f6d7..a15ed43 100644
--- a/src/editorwindow.cc
+++ b/src/editorwindow.cc
@@ -77,6 +77,7 @@ bool EditorWindow::loadFile(const QString &filename)
in_subsection = false;
if (ini.got_section("zone")) {
+ editorwindow_zoneproperties.set_comment(ini.comment());
in_entity = false;
} else if (ini.got_section("entity")) {
@@ -116,9 +117,10 @@ bool EditorWindow::loadFile(const QString &filename)
if (in_entity) {
entity = editorwindow_mapwidget->addEntity();
entity->properties()->set_type(ini.section());
+ entity->properties()->set_comment(ini.comment());
}
if (entity && in_subsection) {
- entity->properties()->add_subsection_header(ini.section());
+ entity->properties()->add_subsection_header(ini.section(), ini.comment());
}
} else if(ini.got_key()) {
@@ -143,11 +145,11 @@ bool EditorWindow::loadFile(const QString &filename)
entity->properties()->add_info(str);
} else if (ini.got_key()) {
- entity->properties()->add_value(ini.key(), ini.value());
+ entity->properties()->add_value(ini.key(), ini.value(), ini.comment());
}
} else if (entity && in_subsection) {
- entity->properties()->add_subsection_value(ini.key(), ini.value());
+ entity->properties()->add_subsection_value(ini.key(), ini.value(), ini.comment());
} else if (ini.in_section("zone")) {
@@ -159,7 +161,7 @@ bool EditorWindow::loadFile(const QString &filename)
editorwindow_zoneproperties.add_info(str);
} else if (ini.got_key()) {
- editorwindow_zoneproperties.add_value(ini.key(), ini.value());
+ editorwindow_zoneproperties.add_value(ini.key(), ini.value(), ini.comment());
}
}
diff --git a/src/entityproperties.cc b/src/entityproperties.cc
index bbef6c9..e9ed1d0 100644
--- a/src/entityproperties.cc
+++ b/src/entityproperties.cc
@@ -19,12 +19,15 @@ EntityProperties::~EntityProperties()
{
}
-void EntityProperties::add_subsection_header(const QString &header)
+void EntityProperties::add_subsection_header(const QString &header, const QString &comment)
{
if (properties_subsections.size()) {
properties_subsections += '\n';
}
-
+
+ if (comment.size())
+ properties_subsections += comment;
+
properties_subsections += '[';
properties_subsections += header;
properties_subsections += ']';
@@ -32,8 +35,11 @@ void EntityProperties::add_subsection_header(const QString &header)
}
-void EntityProperties::add_subsection_value(const QString &key, const QString &value)
+void EntityProperties::add_subsection_value(const QString &key, const QString &value, const QString &comment)
{
+ if (comment.size())
+ properties_subsections += comment;
+
properties_subsections += key;
properties_subsections += '=';
properties_subsections += value;
@@ -42,6 +48,19 @@ void EntityProperties::add_subsection_value(const QString &key, const QString &v
void EntityProperties::save(QTextStream &textstream)
{
+ // comments
+ if (comment().size()) {
+ // QTextStream operates on QString, not on QString const
+ QString commentbuffer = comment();
+ QTextStream commentstream(&commentbuffer);
+ QString line;
+ while (!commentstream.atEnd()) {
+ line = commentstream.readLine(1024);
+ textstream << line << '\n';
+ }
+ textstream << '\n';
+ }
+
textstream << "[" << type() << "]" << '\n';
if (label().size())
textstream << "label=" << label() << '\n';
diff --git a/src/entityproperties.h b/src/entityproperties.h
index a47fc53..edf7f38 100644
--- a/src/entityproperties.h
+++ b/src/entityproperties.h
@@ -64,12 +64,12 @@ public:
/**
* @brief add a header to the subsection string of this object
* */
- void add_subsection_header(const QString &header);
+ void add_subsection_header(const QString &header, const QString &comment);
/**
* @brief add a value key pair to the subsection string of this object
* */
- void add_subsection_value(const QString &key, const QString &value);
+ void add_subsection_value(const QString &key, const QString &value,const QString &comment);
/**
* @brief set the type string of this object
diff --git a/src/inistream.cc b/src/inistream.cc
index c89056f..7a73ea9 100644
--- a/src/inistream.cc
+++ b/src/inistream.cc
@@ -51,6 +51,9 @@ bool IniStream::getline(QTextStream &textstream)
if (line[0] == '#' || line[0] == ';') {
// line with comment
+ comment_next += line;
+ comment_next += '\n';
+
} else {
// section header
if (line.size() > 2 && line.startsWith('[') && line.endsWith(']')) {
@@ -61,6 +64,9 @@ bool IniStream::getline(QTextStream &textstream)
section_current = section_current.trimmed();
section_current.toLower();
+ comment_current = comment_next;
+ comment_next.clear();
+
last_read_was_section = true;
return true;
} else {
@@ -78,6 +84,9 @@ bool IniStream::getline(QTextStream &textstream)
value_current.remove(0, key_current.size() + 1);
value_current = value_current.trimmed();
+ comment_current = comment_next;
+ comment_next.clear();
+
last_read_was_key = true;
return true;
}
diff --git a/src/inistream.h b/src/inistream.h
index 08a6ef4..5ff1237 100644
--- a/src/inistream.h
+++ b/src/inistream.h
@@ -31,17 +31,17 @@ public:
bool getline(QTextStream &textstream);
/// current section label
- inline QString section() const {
+ inline const QString & section() const {
return section_current;
}
/// current key
- inline QString key() const {
+ inline const QString & key() const {
return key_current;
}
/// current value
- inline QString value() const {
+ inline const QString & value() const {
return value_current;
}
@@ -49,6 +49,11 @@ public:
inline unsigned int line() const {
return line_number;
}
+
+ /// comment string for the current section or key/value pair
+ inline const QString & comment() const {
+ return comment_current;
+ }
/// true if the last read statement was a section header
bool got_section() const;
@@ -94,6 +99,9 @@ private:
QString section_current;
QString key_current;
QString value_current;
+
+ QString comment_current;
+ QString comment_next;
bool last_read_was_key;
bool last_read_was_section;
diff --git a/src/properties.cc b/src/properties.cc
index f5e2159..87633f7 100644
--- a/src/properties.cc
+++ b/src/properties.cc
@@ -18,8 +18,11 @@ Properties::~Properties()
{
}
-void Properties::add_value(const QString &key, const QString &value)
+void Properties::add_value(const QString &key, const QString &value, const QString &comment)
{
+ if (comment.size())
+ properties_values += comment;
+
properties_values += key;
properties_values += '=';
properties_values += value;
diff --git a/src/properties.h b/src/properties.h
index 6faf885..c6147e4 100644
--- a/src/properties.h
+++ b/src/properties.h
@@ -56,7 +56,13 @@ public:
return properties_color;
}
-
+ /**
+ * @brief returns the comment string of this object
+ * */
+ inline const QString &comment() const {
+ return properties_comment;
+ }
+
/**
* @brief returns the info string of this object
* */
@@ -74,6 +80,13 @@ public:
/* ---- mutators ---- */
/**
+ * @brief set the comments string of this object
+ * */
+ inline void set_comment(const QString &text) {
+ properties_comment = text;
+ }
+
+ /**
* @brief set the info string of this object
* */
inline void set_info(const QString &text) {
@@ -95,7 +108,7 @@ public:
/**
* @brief add a value key pair to the values string
* */
- void add_value(const QString &key, const QString &value);
+ void add_value(const QString &key, const QString &value, const QString &comment);
/**
* @brief set the object label
@@ -151,6 +164,7 @@ public:
}
private:
+ QString properties_comment;
QString properties_label;
QString properties_name;
diff --git a/src/zoneproperties.cc b/src/zoneproperties.cc
index 35d994a..43e4804 100644
--- a/src/zoneproperties.cc
+++ b/src/zoneproperties.cc
@@ -20,6 +20,19 @@ ZoneProperties::~ZoneProperties()
void ZoneProperties::save(QTextStream & textstream)
{
+ // comments
+ if (comment().size()) {
+ // QTextStream operates on QString, not on QString const
+ QString commentbuffer = comment();
+ QTextStream commentstream(&commentbuffer);
+ QString line;
+ while (!commentstream.atEnd()) {
+ line = commentstream.readLine(1024);
+ textstream << line << '\n';
+ }
+ textstream << '\n';
+ }
+
textstream << "[zone]" << '\n';
if (name().size())