summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBent Bisballe Nyeng <deva@aasimon.org>2018-05-13 09:35:53 +0200
committerBent Bisballe Nyeng <deva@aasimon.org>2018-05-13 09:35:53 +0200
commitf92d78241228f6a9c0b649c8addcc7ae82071167 (patch)
treeff62e5b54976473345b3c2a4689d85f13f9d3793
parentb59fa46fd31c812519527e6e21f9f2e080f128c8 (diff)
Added list of Instrument to Project including serialiser/deserialiser.
-rw-r--r--src/project.cc70
-rw-r--r--src/project.h30
-rw-r--r--src/projectserialiser.cc43
3 files changed, 141 insertions, 2 deletions
diff --git a/src/project.cc b/src/project.cc
index 33c3054..ba7f279 100644
--- a/src/project.cc
+++ b/src/project.cc
@@ -28,6 +28,35 @@
#include <QtGlobal>
+Instrument::Instrument(Project& project, int id)
+ : id(id)
+ , project(project)
+{
+}
+
+int Instrument::getId() const
+{
+ return id;
+}
+
+QString Instrument::getInstrumentName() const
+{
+ return instrument_name;
+}
+
+void Instrument::setInstrumentName(const QString& instrument_name)
+{
+ if(this->instrument_name == instrument_name)
+ {
+ return;
+ }
+
+ {
+ Project::RAIIBulkUpdate bulkUpdate(project);
+ this->instrument_name = instrument_name;
+ }
+}
+
void Project::bulkUpdateBegin()
{
++update_count;
@@ -90,9 +119,50 @@ void Project::setRawFileRoot(const QString& raw_file_root)
}
}
+Instrument& Project::getInstrument(int id)
+{
+ for(auto& instrument : instruments)
+ {
+ if(instrument.getId() == id)
+ {
+ return instrument;
+ }
+ }
+
+ Q_ASSERT(false); // No such instrument id.
+}
+
+int Project::createInstrument()
+{
+ RAIIBulkUpdate bulkUpdate(*this);
+
+ instruments.emplace_back(Instrument(*this, next_id));
+ ++next_id;
+
+ return instruments.back().getId();
+}
+
+void Project::deleteInstrument(int id)
+{
+ RAIIBulkUpdate bulkUpdate(*this);
+
+ for(auto it = instruments.begin(); it != instruments.end(); ++it)
+ {
+ if((*it).getId() == id)
+ {
+ instruments.erase(it);
+ return;
+ }
+ }
+
+ Q_ASSERT(false); // No such instrument id.
+}
+
void Project::reset()
{
RAIIBulkUpdate bulkUpdate(*this);
setRawFileRoot("");
setProjectName("");
+ instruments.clear();
+ next_id = 0;
}
diff --git a/src/project.h b/src/project.h
index 097b7c9..2124730 100644
--- a/src/project.h
+++ b/src/project.h
@@ -26,9 +26,32 @@
*/
#pragma once
+#include <list>
+
#include <QObject>
#include <QString>
+class Project;
+
+class Instrument
+{
+public:
+ Instrument(Project& project, int id);
+
+ int getId() const;
+
+ QString getInstrumentName() const;
+ void setInstrumentName(const QString& instrument_name);
+
+private:
+ friend class ProjectSerialiser;
+
+ int id;
+ QString instrument_name;
+
+ Project& project;
+};
+
class Project
: public QObject
{
@@ -63,6 +86,10 @@ public:
QString getRawFileRoot() const;
void setRawFileRoot(const QString& raw_file_root);
+ Instrument& getInstrument(int id);
+ int createInstrument();
+ void deleteInstrument(int id);
+
void reset();
signals:
@@ -75,5 +102,8 @@ private:
QString project_name;
QString raw_file_root;
+ std::list<Instrument> instruments;
+ int next_id{0};
+
int update_count{0};
};
diff --git a/src/projectserialiser.cc b/src/projectserialiser.cc
index 4b8247f..707ff18 100644
--- a/src/projectserialiser.cc
+++ b/src/projectserialiser.cc
@@ -75,14 +75,31 @@ public:
return elem.text();
}
- std::vector<DomHelper> children()
+ // Get child nodes with tag_name or all child nodes if tag_name == "".
+ std::vector<DomHelper> children(const QString& tag_name = "")
{
std::vector<DomHelper> children;
+ auto child_nodes = elem.childNodes();
+ for(int i = 0; i < child_nodes.count(); ++i)
+ {
+ auto node = child_nodes.at(i);
+ if(!node.isElement())
+ {
+ continue;
+ }
+
+ auto elem = node.toElement();
+ if(elem.tagName() == tag_name || tag_name == "")
+ {
+ children.emplace_back(DomHelper(elem));
+ }
+ }
+
return children;
}
private:
- const QDomElement& elem;
+ QDomElement elem;
};
QString ProjectSerialiser::serialise(const Project& project)
@@ -105,6 +122,19 @@ QString ProjectSerialiser::serialise(const Project& project)
raw_file_root.appendChild(doc.createTextNode(project.raw_file_root));
dgedit.appendChild(raw_file_root);
+ auto instruments = doc.createElement("instruments");
+ dgedit.appendChild(instruments);
+
+ for(const auto& i : project.instruments)
+ {
+ auto instrument = doc.createElement("instrument");
+ instruments.appendChild(instrument);
+
+ auto instrument_name = doc.createElement("instrument_name");
+ instrument_name.appendChild(doc.createTextNode(i.instrument_name));
+ instrument.appendChild(instrument_name);
+ }
+
return doc.toString();
}
@@ -130,5 +160,14 @@ bool ProjectSerialiser::deserialise(const QString& data, Project& project)
project.project_name = dom("project_name").text();
project.raw_file_root = dom("raw_file_root").text();
+ auto instruments = dom("instruments").children("instrument");
+ for(auto& instrument : instruments)
+ {
+ project.instruments.emplace_back(Instrument(project, project.next_id));
+ ++project.next_id;
+ auto& instr = project.instruments.back();
+ instr.instrument_name = instrument("instrument_name").text();
+ }
+
return true;
}