lbajardsilogic@0
|
1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
|
lbajardsilogic@0
|
2
|
lbajardsilogic@0
|
3 /*
|
lbajardsilogic@0
|
4 Sonic Visualiser
|
lbajardsilogic@0
|
5 An audio file viewer and annotation editor.
|
lbajardsilogic@0
|
6 Centre for Digital Music, Queen Mary, University of London.
|
lbajardsilogic@0
|
7 This file copyright 2006 Chris Cannam and QMUL.
|
lbajardsilogic@0
|
8
|
lbajardsilogic@0
|
9 This program is free software; you can redistribute it and/or
|
lbajardsilogic@0
|
10 modify it under the terms of the GNU General Public License as
|
lbajardsilogic@0
|
11 published by the Free Software Foundation; either version 2 of the
|
lbajardsilogic@0
|
12 License, or (at your option) any later version. See the file
|
lbajardsilogic@0
|
13 COPYING included with this distribution for more information.
|
lbajardsilogic@0
|
14 */
|
lbajardsilogic@0
|
15
|
lbajardsilogic@0
|
16 #include "PropertyContainer.h"
|
lbajardsilogic@0
|
17 #include "CommandHistory.h"
|
lbajardsilogic@0
|
18 #include "RangeMapper.h"
|
lbajardsilogic@0
|
19 #include "UnitDatabase.h"
|
lbajardsilogic@0
|
20
|
lbajardsilogic@0
|
21 #include <QColor>
|
lbajardsilogic@0
|
22
|
lbajardsilogic@0
|
23 #include <iostream>
|
lbajardsilogic@0
|
24
|
lbajardsilogic@0
|
25 PropertyContainer::PropertyList
|
lbajardsilogic@0
|
26 PropertyContainer::getProperties() const
|
lbajardsilogic@0
|
27 {
|
lbajardsilogic@0
|
28 return PropertyList();
|
lbajardsilogic@0
|
29 }
|
lbajardsilogic@0
|
30
|
lbajardsilogic@0
|
31 //QString
|
lbajardsilogic@0
|
32 //PropertyContainer::getPropertyLabel(const PropertyName &) const
|
lbajardsilogic@0
|
33 //{
|
lbajardsilogic@0
|
34 // return "";
|
lbajardsilogic@0
|
35 //}
|
lbajardsilogic@0
|
36
|
lbajardsilogic@0
|
37 PropertyContainer::PropertyType
|
lbajardsilogic@0
|
38 PropertyContainer::getPropertyType(const PropertyName &) const
|
lbajardsilogic@0
|
39 {
|
lbajardsilogic@0
|
40 return InvalidProperty;
|
lbajardsilogic@0
|
41 }
|
lbajardsilogic@0
|
42
|
lbajardsilogic@0
|
43 QString
|
lbajardsilogic@0
|
44 PropertyContainer::getPropertyGroupName(const PropertyName &) const
|
lbajardsilogic@0
|
45 {
|
lbajardsilogic@0
|
46 return QString();
|
lbajardsilogic@0
|
47 }
|
lbajardsilogic@0
|
48
|
lbajardsilogic@0
|
49 int
|
lbajardsilogic@0
|
50 PropertyContainer::getPropertyRangeAndValue(const PropertyName &,
|
lbajardsilogic@0
|
51 int *min, int *max, int *deflt) const
|
lbajardsilogic@0
|
52 {
|
lbajardsilogic@0
|
53 if (min) *min = 0;
|
lbajardsilogic@0
|
54 if (max) *max = 0;
|
lbajardsilogic@0
|
55 if (deflt) *deflt = 0;
|
lbajardsilogic@0
|
56 return 0;
|
lbajardsilogic@0
|
57 }
|
lbajardsilogic@0
|
58
|
lbajardsilogic@0
|
59 QString
|
lbajardsilogic@0
|
60 PropertyContainer::getPropertyValueLabel(const PropertyName &, int) const
|
lbajardsilogic@0
|
61 {
|
lbajardsilogic@0
|
62 return QString();
|
lbajardsilogic@0
|
63 }
|
lbajardsilogic@0
|
64
|
lbajardsilogic@0
|
65 RangeMapper *
|
lbajardsilogic@0
|
66 PropertyContainer::getNewPropertyRangeMapper(const PropertyName &) const
|
lbajardsilogic@0
|
67 {
|
lbajardsilogic@0
|
68 return 0;
|
lbajardsilogic@0
|
69 }
|
lbajardsilogic@0
|
70
|
lbajardsilogic@0
|
71 void
|
lbajardsilogic@0
|
72 PropertyContainer::setProperty(const PropertyName &name, int)
|
lbajardsilogic@0
|
73 {
|
lbajardsilogic@0
|
74 std::cerr << "WARNING: PropertyContainer[" << getPropertyContainerName().toStdString() << "]::setProperty(" << name.toStdString() << "): no implementation in subclass!" << std::endl;
|
lbajardsilogic@0
|
75 }
|
lbajardsilogic@0
|
76
|
lbajardsilogic@0
|
77 void
|
lbajardsilogic@0
|
78 PropertyContainer::setPropertyWithCommand(const PropertyName &name, int value)
|
lbajardsilogic@0
|
79 {
|
lbajardsilogic@0
|
80 int currentValue = getPropertyRangeAndValue(name, 0, 0, 0);
|
lbajardsilogic@0
|
81 if (value == currentValue) return;
|
lbajardsilogic@0
|
82
|
lbajardsilogic@0
|
83 CommandHistory::getInstance()->addCommand
|
lbajardsilogic@0
|
84 (new SetPropertyCommand(this, name, value), true, true); // bundled
|
lbajardsilogic@0
|
85 }
|
lbajardsilogic@229
|
86
|
lbajardsilogic@0
|
87 void
|
lbajardsilogic@0
|
88 PropertyContainer::setProperty(QString nameString, QString valueString)
|
lbajardsilogic@0
|
89 {
|
lbajardsilogic@0
|
90 PropertyName name;
|
lbajardsilogic@0
|
91 int value;
|
lbajardsilogic@0
|
92 if (!convertPropertyStrings(nameString, valueString, name, value)) {
|
lbajardsilogic@0
|
93 std::cerr << "WARNING: PropertyContainer::setProperty(\""
|
lbajardsilogic@0
|
94 << nameString.toStdString() << "\", \""
|
lbajardsilogic@0
|
95 << valueString.toStdString()
|
lbajardsilogic@0
|
96 << "\"): Name and value conversion failed" << std::endl;
|
lbajardsilogic@0
|
97 return;
|
lbajardsilogic@0
|
98 }
|
lbajardsilogic@0
|
99 setProperty(name, value);
|
lbajardsilogic@0
|
100 }
|
lbajardsilogic@0
|
101
|
lbajardsilogic@0
|
102 void
|
lbajardsilogic@0
|
103 PropertyContainer::setPropertyWithCommand(QString nameString, QString valueString)
|
lbajardsilogic@0
|
104 {
|
lbajardsilogic@0
|
105 PropertyName name;
|
lbajardsilogic@0
|
106 int value;
|
lbajardsilogic@0
|
107 if (!convertPropertyStrings(nameString, valueString, name, value)) {
|
lbajardsilogic@0
|
108 std::cerr << "WARNING: PropertyContainer::setPropertyWithCommand(\""
|
lbajardsilogic@0
|
109 << nameString.toStdString() << "\", \""
|
lbajardsilogic@0
|
110 << valueString.toStdString()
|
lbajardsilogic@0
|
111 << "\"): Name and value conversion failed" << std::endl;
|
lbajardsilogic@0
|
112 return;
|
lbajardsilogic@0
|
113 }
|
lbajardsilogic@0
|
114 setPropertyWithCommand(name, value);
|
lbajardsilogic@0
|
115 }
|
lbajardsilogic@0
|
116
|
lbajardsilogic@0
|
117 bool
|
lbajardsilogic@0
|
118 PropertyContainer::convertPropertyStrings(QString nameString, QString valueString,
|
lbajardsilogic@0
|
119 PropertyName &name, int &value)
|
lbajardsilogic@0
|
120 {
|
lbajardsilogic@0
|
121 PropertyList pl = getProperties();
|
lbajardsilogic@0
|
122
|
lbajardsilogic@0
|
123 QString adjusted = nameString.trimmed();
|
lbajardsilogic@0
|
124 adjusted.replace('_', ' ');
|
lbajardsilogic@0
|
125 adjusted.replace('-', ' ');
|
lbajardsilogic@0
|
126
|
lbajardsilogic@0
|
127 name = "";
|
lbajardsilogic@0
|
128
|
lbajardsilogic@0
|
129 for (PropertyList::iterator pli = pl.begin(); pli != pl.end(); ++pli) {
|
lbajardsilogic@0
|
130
|
lbajardsilogic@0
|
131 QString label = getPropertyLabel(*pli);
|
lbajardsilogic@0
|
132
|
lbajardsilogic@0
|
133 if (label != "" && (nameString == label || adjusted == label)) {
|
lbajardsilogic@0
|
134 name = *pli;
|
lbajardsilogic@0
|
135 break;
|
lbajardsilogic@0
|
136 } else if (nameString == *pli) {
|
lbajardsilogic@0
|
137 name = *pli;
|
lbajardsilogic@0
|
138 break;
|
lbajardsilogic@0
|
139 }
|
lbajardsilogic@0
|
140 }
|
lbajardsilogic@0
|
141
|
lbajardsilogic@0
|
142 if (name == "") {
|
lbajardsilogic@0
|
143 std::cerr << "PropertyContainer::convertPropertyStrings: Unable to match name string \"" << nameString.toStdString() << "\"" << std::endl;
|
lbajardsilogic@0
|
144 return false;
|
lbajardsilogic@0
|
145 }
|
lbajardsilogic@0
|
146
|
lbajardsilogic@0
|
147 value = 0;
|
lbajardsilogic@0
|
148 bool success = false;
|
lbajardsilogic@0
|
149
|
lbajardsilogic@0
|
150 bool isDouble = false;
|
lbajardsilogic@0
|
151 double dval = valueString.toDouble(&isDouble);
|
lbajardsilogic@0
|
152
|
lbajardsilogic@0
|
153 switch (getPropertyType(name)) {
|
lbajardsilogic@0
|
154
|
lbajardsilogic@0
|
155 case ToggleProperty:
|
lbajardsilogic@0
|
156 if (valueString == tr("yes") ||
|
lbajardsilogic@0
|
157 valueString == tr("on") ||
|
lbajardsilogic@0
|
158 valueString == tr("true")) {
|
lbajardsilogic@0
|
159 value = 1; success = true;
|
lbajardsilogic@0
|
160 } else if (valueString == tr("no") ||
|
lbajardsilogic@0
|
161 valueString == tr("off") ||
|
lbajardsilogic@0
|
162 valueString == tr("false")) {
|
lbajardsilogic@0
|
163 value = 0; success = true;
|
lbajardsilogic@0
|
164 }
|
lbajardsilogic@0
|
165 break;
|
lbajardsilogic@0
|
166
|
lbajardsilogic@0
|
167 case RangeProperty:
|
benoitrigolleau@276
|
168 case RangePropertyWithLabel:
|
lbajardsilogic@0
|
169 if (isDouble) {
|
lbajardsilogic@0
|
170 RangeMapper *mapper = getNewPropertyRangeMapper(name);
|
lbajardsilogic@0
|
171 if (mapper) {
|
lbajardsilogic@0
|
172 value = mapper->getPositionForValue(dval);
|
lbajardsilogic@0
|
173 delete mapper;
|
lbajardsilogic@0
|
174 success = true;
|
lbajardsilogic@0
|
175 }
|
lbajardsilogic@0
|
176 }
|
lbajardsilogic@0
|
177 break;
|
lbajardsilogic@0
|
178
|
benoitrigolleau@276
|
179
|
lbajardsilogic@0
|
180 case ValueProperty:
|
lbajardsilogic@0
|
181 {
|
lbajardsilogic@0
|
182 int min, max;
|
lbajardsilogic@0
|
183 getPropertyRangeAndValue(name, &min, &max, 0);
|
lbajardsilogic@0
|
184 for (int i = min; i <= max; ++i) {
|
lbajardsilogic@0
|
185 if (valueString == getPropertyValueLabel(name, i)) {
|
lbajardsilogic@0
|
186 value = i;
|
lbajardsilogic@0
|
187 success = true;
|
lbajardsilogic@0
|
188 break;
|
lbajardsilogic@0
|
189 }
|
lbajardsilogic@0
|
190 }
|
lbajardsilogic@0
|
191 break;
|
lbajardsilogic@0
|
192 }
|
lbajardsilogic@0
|
193
|
lbajardsilogic@0
|
194 case ColourProperty:
|
lbajardsilogic@0
|
195 {
|
lbajardsilogic@0
|
196 QColor c(valueString);
|
lbajardsilogic@0
|
197 if (c.isValid()) {
|
lbajardsilogic@0
|
198 value = c.rgb();
|
lbajardsilogic@0
|
199 success = true;
|
lbajardsilogic@0
|
200 }
|
lbajardsilogic@0
|
201 break;
|
lbajardsilogic@0
|
202 }
|
lbajardsilogic@0
|
203
|
lbajardsilogic@0
|
204 case UnitsProperty:
|
lbajardsilogic@0
|
205 value = UnitDatabase::getInstance()->getUnitId(valueString, false);
|
lbajardsilogic@0
|
206 if (value >= 0) success = true;
|
lbajardsilogic@0
|
207 else value = 0;
|
lbajardsilogic@0
|
208 break;
|
lbajardsilogic@0
|
209
|
lbajardsilogic@0
|
210 case InvalidProperty:
|
lbajardsilogic@0
|
211 std::cerr << "PropertyContainer::convertPropertyStrings: Invalid property name \"" << name.toStdString() << "\"" << std::endl;
|
lbajardsilogic@0
|
212 return false;
|
lbajardsilogic@0
|
213 }
|
lbajardsilogic@0
|
214
|
lbajardsilogic@0
|
215 if (success) return true;
|
lbajardsilogic@0
|
216
|
lbajardsilogic@0
|
217 int min, max;
|
lbajardsilogic@0
|
218 getPropertyRangeAndValue(name, &min, &max, 0);
|
lbajardsilogic@0
|
219
|
lbajardsilogic@0
|
220 bool ok = false;
|
lbajardsilogic@0
|
221 int i = valueString.toInt(&ok);
|
lbajardsilogic@0
|
222 if (!ok) {
|
lbajardsilogic@0
|
223 std::cerr << "PropertyContainer::convertPropertyStrings: Unable to parse value string \"" << valueString.toStdString() << "\"" << std::endl;
|
lbajardsilogic@0
|
224 return false;
|
lbajardsilogic@0
|
225 } else if (i < min || i > max) {
|
lbajardsilogic@0
|
226 std::cerr << "PropertyContainer::convertPropertyStrings: Property value \"" << i << "\" outside valid range " << min << " to " << max << std::endl;
|
lbajardsilogic@0
|
227 return false;
|
lbajardsilogic@0
|
228 }
|
lbajardsilogic@0
|
229
|
lbajardsilogic@0
|
230 value = i;
|
lbajardsilogic@0
|
231 return true;
|
lbajardsilogic@0
|
232 }
|
lbajardsilogic@0
|
233
|
lbajardsilogic@0
|
234 PropertyContainer::SetPropertyCommand::SetPropertyCommand(PropertyContainer *pc,
|
lbajardsilogic@0
|
235 const PropertyName &pn,
|
lbajardsilogic@0
|
236 int value) :
|
lbajardsilogic@0
|
237 m_pc(pc),
|
lbajardsilogic@0
|
238 m_pn(pn),
|
lbajardsilogic@0
|
239 m_value(value),
|
lbajardsilogic@0
|
240 m_oldValue(0)
|
lbajardsilogic@0
|
241 {
|
lbajardsilogic@0
|
242 }
|
lbajardsilogic@0
|
243
|
lbajardsilogic@0
|
244 void
|
lbajardsilogic@0
|
245 PropertyContainer::SetPropertyCommand::execute()
|
lbajardsilogic@0
|
246 {
|
lbajardsilogic@0
|
247 m_oldValue = m_pc->getPropertyRangeAndValue(m_pn, 0, 0, 0);
|
lbajardsilogic@0
|
248 m_pc->setProperty(m_pn, m_value);
|
lbajardsilogic@0
|
249 }
|
lbajardsilogic@0
|
250
|
lbajardsilogic@0
|
251 void
|
lbajardsilogic@0
|
252 PropertyContainer::SetPropertyCommand::unexecute()
|
lbajardsilogic@0
|
253 {
|
lbajardsilogic@0
|
254 m_pc->setProperty(m_pn, m_oldValue);
|
lbajardsilogic@0
|
255 }
|
lbajardsilogic@0
|
256
|
lbajardsilogic@0
|
257 QString
|
lbajardsilogic@0
|
258 PropertyContainer::SetPropertyCommand::getName() const
|
lbajardsilogic@0
|
259 {
|
lbajardsilogic@0
|
260 return tr("Set %1 Property").arg(m_pn);
|
lbajardsilogic@0
|
261 }
|