Develop and Download Open Source Software

Browse Subversion Repository

Annotation of /trunk/echoes/EchoesStyleModel.cpp

Parent Directory Parent Directory | Revision Log Revision Log


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


1 haruneko24 64 #include "EchoesStyleModel.h"
2    
3 haruneko24 65 #include <QtAlgorithms>
4 haruneko24 72 #include <QHash>
5 haruneko24 76 #include <QFileInfo>
6     #include <QDir>
7 haruneko24 72
8     #include "TreeItem.h"
9 haruneko24 65 #include "EchoesPhrase.h"
10 haruneko24 72 #include "envelope/Envelope.h"
11 haruneko24 65
12 haruneko24 64 using namespace stand::echoes;
13    
14     EchoesStyleModel::EchoesStyleModel(QObject *parent) :
15     TreeItemModel(parent)
16     {
17 haruneko24 72 onDestroy();
18 haruneko24 64 }
19 haruneko24 65
20 haruneko24 72 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 haruneko24 98 _data.clear();
32 haruneko24 72
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 haruneko24 97 stand::model::TreeItem *phrases = _root->findChildItem("Phrases");
46     stand::model::TreeItem *envelopes = _root->findChildItem("Envelopes");
47     if(!phrases)
48 haruneko24 72 {
49 haruneko24 97 phrases = new stand::model::TreeItem("Phrases", _root);
50     _root->appendChild(phrases);
51 haruneko24 72 }
52 haruneko24 97 if(!envelopes)
53 haruneko24 72 {
54 haruneko24 97 envelopes = new stand::model::TreeItem("Envelopes", _root);
55     _root->appendChild(envelopes);
56 haruneko24 72 }
57 haruneko24 97
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 haruneko24 72 }
71    
72 haruneko24 97 void EchoesStyleModel::_registerEnvelope(stand::model::TreeItem *e)
73     {
74 haruneko24 101 QFileInfo info(this->path());
75     QString path = info.absoluteDir().absoluteFilePath(e->data(_Path, 0).toString());
76 haruneko24 97 QString name = e->name();
77     stand::utility::envelope::Envelope *env = new stand::utility::envelope::Envelope();
78     if(!env->read(path.toLocal8Bit().data()))
79     {
80 haruneko24 101 qDebug("EchoesStyleModel::registerEnvelop(%s); // envelope not found", path.toUtf8().data());
81 haruneko24 97 delete env;
82     return;
83     }
84     appendEnvelope(name, path, env);
85     }
86 haruneko24 72
87 haruneko24 97 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 haruneko24 101 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 haruneko24 97 }
101     }
102    
103 haruneko24 98 EchoesSegment EchoesStyleModel::findNearest(const EchoesPhrase &key) const
104 haruneko24 97 {
105 haruneko24 98 if(_data.empty())
106 haruneko24 97 {
107 haruneko24 98 return EchoesSegment();
108 haruneko24 97 }
109     int index = 0;
110 haruneko24 98 double distance = _data[0].first.distance(key);
111     for(int i = 0; i < _data.size(); i++)
112 haruneko24 97 {
113 haruneko24 98 double currentDistance = _data[i].first.distance(key);
114     if(distance < currentDistance)
115 haruneko24 97 {
116     index = i;
117 haruneko24 98 distance = currentDistance;
118 haruneko24 97 }
119     }
120 haruneko24 98 return EchoesSegment(&(_data[index].first), _data[index].second.pitch, _data[index].second.volume);
121 haruneko24 97 }
122    
123    
124 haruneko24 72 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 haruneko24 76 QFileInfo info(this->path());
145     QDir current = info.dir();
146     if(!env->read((current.absoluteFilePath(path)).toLocal8Bit().data()))
147 haruneko24 72 {
148     delete env;
149     return;
150     }
151     }
152 haruneko24 78 _envelopes[name] = env;
153 haruneko24 72
154 haruneko24 76 // ���������������������������������������������
155     if(!envelopes->findChildItem(name))
156     {
157     stand::model::TreeItem *item = new stand::model::TreeItem(name, envelopes);
158 haruneko24 97 item->setData(_Path, path, 0);
159 haruneko24 76 envelopes->appendChild(item);
160     }
161 haruneko24 72 }
162    
163     void EchoesStyleModel::appendPhrase(const QString &pitchName, const QString &volumeName, const EchoesPhrase &phrase)
164     {
165 haruneko24 95 if(phrase.notes().empty())
166     {
167 haruneko24 96 qDebug("EchoesStyleModel::appendPhrase(); // Phrsae has no note.");
168 haruneko24 95 return;
169     }
170 haruneko24 72 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 haruneko24 96 /* ��������������������� */
176 haruneko24 72 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 haruneko24 95 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 haruneko24 96 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 haruneko24 95 notes->appendChild(note);
196     }
197 haruneko24 96 /* ��������������������� */
198 haruneko24 98 _Data d = {envelope(pitchName), envelope(volumeName)};
199 haruneko24 97 _data.append(QPair<EchoesPhrase, _Data>(phrase, d));
200 haruneko24 72 }
201    
202 haruneko24 98 stand::utility::envelope::Envelope *EchoesStyleModel::envelope(const QString &key)
203     {
204     return _envelopes.value(key, NULL);
205     }
206    
207 haruneko24 74 QString EchoesStyleModel::metaData(MetaTypes type)
208     {
209     if(!_root)
210     {
211     return QString();
212     }
213     return _root->data(type, 0).toString();
214     }
215 haruneko24 76
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