annotate base/PropertyContainer.cpp @ 282:d9319859a4cf tip

(none)
author benoitrigolleau
date Fri, 31 Oct 2008 11:00:24 +0000
parents a9af42a93073
children
rev   line source
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 }