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