1+ #include " DspxClipboardData.h"
2+
3+ #include < QJsonDocument>
4+ #include < QJsonObject>
5+ #include < QJsonArray>
6+
7+ #include < opendspxserializer/serializer.h>
8+ #include < opendspxserializer/jsonconverterv1.h>
9+
10+ namespace Core {
11+
12+ QString DspxClipboardData::mimeType (Type type) {
13+ switch (type) {
14+ case Tempo:
15+ return " application/x.diffscope.clipboard.tempo+json" ;
16+ case Label:
17+ return " application/x.diffscope.clipboard.label+json" ;
18+ case Track:
19+ return " application/x.diffscope.clipboard.track+json" ;
20+ case Clip:
21+ return " application/x.diffscope.clipboard.clip+json" ;
22+ case Note:
23+ return " application/x.diffscope.clipboard.note+json" ;
24+ default :
25+ return {};
26+ }
27+ }
28+
29+ DspxClipboardData::Type DspxClipboardData::typeFromMimeType (const QString &mimeType, bool *ok) {
30+ if (ok)
31+ *ok = true ;
32+ if (mimeType == " application/x.diffscope.clipboard.tempo+json" ) {
33+ return Tempo;
34+ }
35+ if (mimeType == " application/x.diffscope.clipboard.label+json" ) {
36+ return Label;
37+ }
38+ if (mimeType == " application/x.diffscope.clipboard.track+json" ) {
39+ return Track;
40+ }
41+ if (mimeType == " application/x.diffscope.clipboard.clip+json" ) {
42+ return Clip;
43+ }
44+ if (mimeType == " application/x.diffscope.clipboard.note+json" ) {
45+ return Note;
46+ }
47+ if (ok)
48+ *ok = false ;
49+ return {};
50+ }
51+
52+ QByteArray DspxClipboardData::toData () const {
53+ QJsonObject json;
54+ json.insert (" version" , QDspx::Serializer::versionToText (QDspx::Model::V1 ));
55+ json.insert (" playhead" , m_playhead);
56+ json.insert (" absolute" , m_absolute);
57+ json.insert (" track" , m_track);
58+ QJsonArray dataArray;
59+ QDspx::SerializationErrorList errors;
60+ auto toJsonArray = [&]<Type t> {
61+ for (const auto &item : std::get<t>(m_data)) {
62+ dataArray.append (QDspx::JsonConverterV1::toJson (item, errors, {}));
63+ }
64+ };
65+ switch (type ()) {
66+ case Tempo:
67+ toJsonArray.operator ()<Tempo>();
68+ break ;
69+ case Label:
70+ toJsonArray.operator ()<Label>();
71+ break ;
72+ case Track:
73+ toJsonArray.operator ()<Track>();
74+ break ;
75+ case Clip:
76+ toJsonArray.operator ()<Clip>();
77+ break ;
78+ case Note:
79+ toJsonArray.operator ()<Note>();
80+ break ;
81+ }
82+ json.insert (" data" , dataArray);
83+ return QJsonDocument (json).toJson (QJsonDocument::Compact);
84+ }
85+
86+ DspxClipboardData DspxClipboardData::fromData (const QByteArray &data, Type type, bool *ok) {
87+ QJsonParseError jsonError;
88+ auto json = QJsonDocument::fromJson (data, &jsonError).object ();
89+ if (jsonError.error != QJsonParseError::NoError) {
90+ if (ok)
91+ *ok = false ;
92+ return {};
93+ }
94+ auto version = QDspx::Serializer::versionFromText (json.value (" version" ).toString (), ok);
95+ if (ok && !*ok) {
96+ return {};
97+ }
98+ DspxClipboardData result;
99+ result.m_playhead = json.value (" playhead" ).toInt ();
100+ result.m_absolute = json.value (" absolute" ).toInt ();
101+ result.m_track = json.value (" track" ).toInt ();
102+ if (!json.value (" data" ).isArray ()) {
103+ if (ok)
104+ *ok = false ;
105+ return {};
106+ }
107+ auto dataArray = json.value (" data" ).toArray ();
108+ QDspx::SerializationErrorList errors;
109+ switch (version) {
110+ case QDspx::Model::V1 : {
111+ auto fromJsonArrayV1 = [&]<Type t> {
112+ using T = std::variant_alternative_t <t, decltype (m_data)>;
113+ T list;
114+ for (const auto &item : dataArray) {
115+ list.append (QDspx::JsonConverterV1::fromJson<typename T::value_type>(item, errors));
116+ }
117+ result.m_data = std::move (list);
118+ };
119+ switch (type) {
120+ case Tempo:
121+ fromJsonArrayV1.operator ()<Tempo>();
122+ break ;
123+ case Label:
124+ fromJsonArrayV1.operator ()<Label>();
125+ break ;
126+ case Track:
127+ fromJsonArrayV1.operator ()<Track>();
128+ break ;
129+ case Clip:
130+ fromJsonArrayV1.operator ()<Clip>();
131+ break ;
132+ case Note:
133+ fromJsonArrayV1.operator ()<Note>();
134+ break ;
135+ }
136+ break ;
137+ }
138+
139+ }
140+ if (errors.containsFatal () || errors.containsError ()) {
141+ if (ok)
142+ *ok = false ;
143+ return {};
144+ }
145+ if (ok)
146+ *ok = true ;
147+ return result;
148+ }
149+
150+ }
0 commit comments