Develop and Download Open Source Software

Browse Subversion Repository

Contents of /trunk/echoes/EchoesStyleModel.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 101 - (show annotations) (download) (as text)
Fri Feb 1 01:09:56 2013 UTC (11 years, 1 month ago) by haruneko24
File MIME type: text/x-c++src
File size: 7379 byte(s)


1 #include "EchoesStyleModel.h"
2
3 #include <QtAlgorithms>
4 #include <QHash>
5 #include <QFileInfo>
6 #include <QDir>
7
8 #include "TreeItem.h"
9 #include "EchoesPhrase.h"
10 #include "envelope/Envelope.h"
11
12 using namespace stand::echoes;
13
14 EchoesStyleModel::EchoesStyleModel(QObject *parent) :
15 TreeItemModel(parent)
16 {
17 onDestroy();
18 }
19
20 EchoesStyleModel::~EchoesStyleModel()
21 {
22 QList<stand::utility::envelope::Envelope *> values = _envelopes.values();
23 qDeleteAll(values);
24 }
25
26 void EchoesStyleModel::onDestroy()
27 {
28 QList<stand::utility::envelope::Envelope *> es = _envelopes.values();
29 qDeleteAll(es);
30 _envelopes.clear();
31 _data.clear();
32
33 TreeItemModel::onDestroy();
34 _root = new stand::model::TreeItem("Style root");
35 _root->appendChild(new stand::model::TreeItem("Envelopes", _root));
36 _root->appendChild(new stand::model::TreeItem("Phrases", _root));
37 }
38
39 void EchoesStyleModel::onRead()
40 {
41 if(!_root)
42 {
43 onDestroy();
44 }
45 stand::model::TreeItem *phrases = _root->findChildItem("Phrases");
46 stand::model::TreeItem *envelopes = _root->findChildItem("Envelopes");
47 if(!phrases)
48 {
49 phrases = new stand::model::TreeItem("Phrases", _root);
50 _root->appendChild(phrases);
51 }
52 if(!envelopes)
53 {
54 envelopes = new stand::model::TreeItem("Envelopes", _root);
55 _root->appendChild(envelopes);
56 }
57
58 // ���������������������������������������������
59 for(int i = 0; i < envelopes->childCount(); i++)
60 {
61 stand::model::TreeItem *e = envelopes->child(i);
62 _registerEnvelope(e);
63 }
64
65 for(int i = 0; i < phrases->childCount(); i++)
66 {
67 stand::model::TreeItem *p = phrases->child(i);
68 _registerPhrase(p);
69 }
70 }
71
72 void EchoesStyleModel::_registerEnvelope(stand::model::TreeItem *e)
73 {
74 QFileInfo info(this->path());
75 QString path = info.absoluteDir().absoluteFilePath(e->data(_Path, 0).toString());
76 QString name = e->name();
77 stand::utility::envelope::Envelope *env = new stand::utility::envelope::Envelope();
78 if(!env->read(path.toLocal8Bit().data()))
79 {
80 qDebug("EchoesStyleModel::registerEnvelop(%s); // envelope not found", path.toUtf8().data());
81 delete env;
82 return;
83 }
84 appendEnvelope(name, path, env);
85 }
86
87 void EchoesStyleModel::_registerPhrase(stand::model::TreeItem *p)
88 {
89 EchoesNoteList notes;
90 for(int i = 0; i < p->childCount(); i++)
91 {
92 stand::model::TreeItem *item = p->child(i);
93 notes.append(EchoesNote(item->data(_MsPosition, 0).toDouble(), item->data(_MsLength, 0).toDouble(), item->data(_NoteNumber, 0).toInt()));
94 }
95 if(!notes.empty())
96 {
97 EchoesPhrase phrase(notes);
98 _Data d = {envelope(p->data(_PitchEnvelopeName, 0).toString()), envelope(p->data(_VolumeEnvelopeName, 0).toString())};
99 _data.append(QPair<EchoesPhrase, _Data>(phrase, d));
100 }
101 }
102
103 EchoesSegment EchoesStyleModel::findNearest(const EchoesPhrase &key) const
104 {
105 if(_data.empty())
106 {
107 return EchoesSegment();
108 }
109 int index = 0;
110 double distance = _data[0].first.distance(key);
111 for(int i = 0; i < _data.size(); i++)
112 {
113 double currentDistance = _data[i].first.distance(key);
114 if(distance < currentDistance)
115 {
116 index = i;
117 distance = currentDistance;
118 }
119 }
120 return EchoesSegment(&(_data[index].first), _data[index].second.pitch, _data[index].second.volume);
121 }
122
123
124 void EchoesStyleModel::appendEnvelope(const QString &name, const QString &path, stand::utility::envelope::Envelope *env)
125 {
126 // ���������������������
127 if(_envelopes.contains(name))
128 {
129 qDebug("EchoesStyleModel::appendEvelope(\"%s\"); // name duplication", name.toUtf8().data());
130 return;
131 }
132 // ������������������������������������������������
133 stand::model::TreeItem *envelopes = _root->findChildItem("Envelopes");
134 if(!envelopes)
135 {
136 envelopes = new stand::model::TreeItem("Envelopes", _root);
137 _root->appendChild(envelopes);
138 }
139
140 // ���������������������������������������
141 if(!env)
142 {
143 env = new stand::utility::envelope::Envelope();
144 QFileInfo info(this->path());
145 QDir current = info.dir();
146 if(!env->read((current.absoluteFilePath(path)).toLocal8Bit().data()))
147 {
148 delete env;
149 return;
150 }
151 }
152 _envelopes[name] = env;
153
154 // ���������������������������������������������
155 if(!envelopes->findChildItem(name))
156 {
157 stand::model::TreeItem *item = new stand::model::TreeItem(name, envelopes);
158 item->setData(_Path, path, 0);
159 envelopes->appendChild(item);
160 }
161 }
162
163 void EchoesStyleModel::appendPhrase(const QString &pitchName, const QString &volumeName, const EchoesPhrase &phrase)
164 {
165 if(phrase.notes().empty())
166 {
167 qDebug("EchoesStyleModel::appendPhrase(); // Phrsae has no note.");
168 return;
169 }
170 if(!_envelopes.contains(pitchName) || !_envelopes.contains(volumeName))
171 {
172 qDebug("EchoesStyleModel::appendPhrase(\"%s\", \"%s\"); // envelope not found", pitchName.toUtf8().data(), volumeName.toUtf8().data());
173 return;
174 }
175 /* ��������������������� */
176 stand::model::TreeItem *phrases = _root->findChildItem("Phrases");
177 if(!phrases)
178 {
179 phrases = new stand::model::TreeItem("Phrases", _root);
180 _root->appendChild(phrases);
181 }
182
183 stand::model::TreeItem *notes = new stand::model::TreeItem("Notes", phrases);
184 phrases->appendChild(notes);
185
186 notes->setData(_PitchEnvelopeName, pitchName, 0);
187 notes->setData(_VolumeEnvelopeName, volumeName, 0);
188
189 for(int i = 0; i < phrase.notes().size(); i++)
190 {
191 stand::model::TreeItem *note = new stand::model::TreeItem("Note" + QString::number(i), notes);
192 note->setData(_NoteNumber, phrase.notes().at(i).noteNumber(), 0);
193 note->setData(_MsPosition, phrase.notes().at(i).msPosition(), 0);
194 note->setData(_MsLength, phrase.notes().at(i).msLength(), 0);
195 notes->appendChild(note);
196 }
197 /* ��������������������� */
198 _Data d = {envelope(pitchName), envelope(volumeName)};
199 _data.append(QPair<EchoesPhrase, _Data>(phrase, d));
200 }
201
202 stand::utility::envelope::Envelope *EchoesStyleModel::envelope(const QString &key)
203 {
204 return _envelopes.value(key, NULL);
205 }
206
207 QString EchoesStyleModel::metaData(MetaTypes type)
208 {
209 if(!_root)
210 {
211 return QString();
212 }
213 return _root->data(type, 0).toString();
214 }
215
216 bool EchoesStyleModel::write(const QString &path) const
217 {
218 QFileInfo info(path);
219 QDir current = info.absoluteDir();
220
221 stand::model::TreeItem *envelopes = _root->findChildItem("Envelopes");
222 if(envelopes)
223 {
224 for(int i = 0; i < envelopes->childCount(); i++)
225 {
226 stand::model::TreeItem *item = envelopes->child(i);
227 stand::utility::envelope::Envelope *e = _envelopes[item->name()];
228 if(!e)
229 {
230 continue;
231 }
232 e->write(current.absoluteFilePath(item->data(0, 0).toString()).toLocal8Bit().data());
233 }
234 }
235 return TreeItemModel::write(path);
236 }

Back to OSDN">Back to OSDN
ViewVC Help
Powered by ViewVC 1.1.26