libpappsomspp
Library for mass spectrometry
Loading...
Searching...
No Matches
tracejs.cpp
Go to the documentation of this file.
1#include "tracejs.h"
2#include "datapointjs.h"
3
4
5namespace pappso
6{
7
8
9TraceJs::TraceJs(QObject *parent) : QObject(parent), m_trace()
10{
11}
12
13TraceJs::TraceJs(const Trace &trace, QObject *parent) : QObject(parent), m_trace(trace)
14{
15}
16
17int
19{
20 return m_trace.size();
21}
22
23void
24TraceJs::append(double x, double y)
25{
26 m_trace.push_back(DataPoint(x, y));
27 emit sizeChangedSignal();
28}
29
30void
31TraceJs::append(const DataPointJs *data_point_js_p)
32{
33 if(data_point_js_p != nullptr)
34 {
35 m_trace.push_back(data_point_js_p->dataPoint());
36 emit sizeChangedSignal();
37 }
38}
39
41TraceJs::getPointAt(int index) const
42{
43 if(index < 0 || index >= static_cast<int>(m_trace.size()))
44 {
45 return nullptr;
46 }
47
48 // Simple version: create wrapper on the fly
49 return new DataPointJs(m_trace[index], const_cast<TraceJs *>(this));
50}
51
52
53QVariantList
55{
56 QVariantList list;
57
58 for(const DataPoint &data_point : m_trace)
59 {
60 DataPointJs *data_point_js_p = new DataPointJs(data_point, const_cast<TraceJs *>(this));
61 list.append(QVariant::fromValue(data_point_js_p));
62 }
63
64 return list;
65}
66
67void
68TraceJs::initialize(const QVariantList &js_points)
69{
70 m_trace.clear();
71
72 for(const QVariant &variant : js_points)
73 {
74 QObject *obj = variant.value<QObject *>();
75
76 // The cast returns nullptr if the variant did not
77 // convert to DataPointJs.
78 if(auto data_point_js = qobject_cast<DataPointJs *>(obj))
79 {
80 DataPoint data_point = data_point_js->dataPoint();
81 m_trace.push_back(data_point); // Extract the internal DataPoint
82 }
83 else
84 {
85 qWarning() << "Failed initializing Trace because list member is not a DataPointJs object:"
86 << obj;
87 }
88 }
89
90 emit sizeChangedSignal();
91}
92
93
94void
95TraceJs::initialize(const QVariantMap &map)
96{
97 m_trace.clear();
98 m_trace.reserve(map.size());
99
100 for(auto it = map.constBegin(); it != map.constEnd(); ++it)
101 {
102 bool key_ok, value_ok;
103 double key = it.key().toDouble(&key_ok);
104 double value = it.value().toDouble(&value_ok);
105
106 if(key_ok && value_ok)
107 m_trace.emplace_back(key, value);
108 else
109 qWarning() << "Skipping invalid map entry at key:" << it.key();
110 }
111
112 emit sizeChangedSignal();
113}
114
115std::size_t
116TraceJs::initialize(const QVariantList &x_values, const QVariantList &y_values)
117{
118 if(x_values.size() != y_values.size())
119 qFatal() << "The two containers must have the same size.";
120
121 m_trace.clear();
122 m_trace.reserve(x_values.size());
123
124 for(int iter = 0; iter < x_values.size(); ++iter)
125 m_trace.push_back(DataPoint(x_values.at(iter).toDouble(), y_values.at(iter).toDouble()));
126
127 emit sizeChangedSignal();
128
129 return m_trace.size();
130}
131
132size_t
133TraceJs::initialize(const QString &x_text, const QString &y_text)
134{
135 m_trace.initialize(x_text, y_text);
136
137 emit sizeChangedSignal();
138
139 return m_trace.size();
140}
141
142size_t
143TraceJs::initialize(const QString &space_sep_text)
144{
145 m_trace.initialize(space_sep_text);
146
147 emit sizeChangedSignal();
148
149 return m_trace.size();
150}
151
152size_t
154{
155 m_trace.clear();
156 m_trace.reserve(other.m_trace.size());
157 std::copy(other.m_trace.begin(), other.m_trace.end(), std::back_inserter(m_trace));
158
159 emit sizeChangedSignal();
160
161 return m_trace.size();
162}
163
164
165//////////////////////////////////////// OLD ///////////////////////////////
166
167
168QVariantList
170{
171 QVariantList list;
172 list.reserve(m_trace.size());
173
174 for(const DataPoint &point : m_trace)
175 {
176 list.append(QVariant::fromValue(point.x));
177 }
178
179 return list;
180}
181
182QVariantList
184{
185 QVariantList list;
186 list.reserve(m_trace.size());
187
188 for(const DataPoint &point : m_trace)
189 {
190 list.append(QVariant::fromValue(point.y));
191 }
192
193 return list;
194}
195
196QVariantMap
198{
199 QVariantMap map;
200 for(const auto &point : m_trace)
201 {
202 map.insert(QString::number(point.x), point.y);
203 }
204 return map;
205}
206
207void
209{
210 m_trace.clear();
211}
212
213void
215{
216 if(!engine)
217 {
218 qWarning() << "Cannot register class: engine is null";
219 return;
220 }
221
222 // Register the meta object as a constructor
223 QJSValue jsMetaObject = engine->newQMetaObject(&TraceJs::staticMetaObject);
224 engine->globalObject().setProperty("Trace", jsMetaObject);
225}
226
227} // namespace pappso
const DataPoint & dataPoint() const
Q_INVOKABLE void append(double x, double y)
Definition tracejs.cpp:24
Q_INVOKABLE int getSize() const
Definition tracejs.cpp:18
Q_INVOKABLE QVariantList yValues() const
Definition tracejs.cpp:183
Q_INVOKABLE DataPointJs * getPointAt(int index) const
Definition tracejs.cpp:41
void sizeChangedSignal()
Q_INVOKABLE void initialize(const QVariantList &js_points)
Definition tracejs.cpp:68
Q_INVOKABLE void clear()
Definition tracejs.cpp:208
Trace m_trace
Definition tracejs.h:69
static void registerJsConstructor(QJSEngine *engine)
Definition tracejs.cpp:214
Q_INVOKABLE QVariantList xValues() const
Definition tracejs.cpp:169
Q_INVOKABLE QVariantList getTrace() const
Definition tracejs.cpp:54
Q_INVOKABLE TraceJs(QObject *parent=nullptr)
Definition tracejs.cpp:9
Q_INVOKABLE QVariantMap toMap() const
Definition tracejs.cpp:197
A simple container of DataPoint instances.
Definition trace.h:152
tries to keep as much as possible monoisotopes, removing any possible C13 peaks and changes multichar...
Definition aa.cpp:39