Commit 538f8840723cb2863edf83c30485ec7b817872c2

Authored by Josh Klontz
1 parent 32566f05

refactored Object::setProperty to fix #49

openbr/openbr_plugin.cpp
... ... @@ -633,62 +633,73 @@ void Object::load(QDataStream &stream)
633 633 init();
634 634 }
635 635  
636   -void Object::setProperty(const QString &name, const QString &value)
  636 +void Object::setProperty(const QString &name, QVariant value)
637 637 {
638 638 QString type;
639 639 int index = metaObject()->indexOfProperty(qPrintable(name));
640 640 if (index != -1) type = metaObject()->property(index).typeName();
641   - else type = "";
642 641  
643   - QVariant variant;
644   - if (type.startsWith("QList<") && type.endsWith(">")) {
645   - if (!value.startsWith('[')) qFatal("Expected a list.");
646   - const QStringList strings = parse(value.mid(1, value.size()-2));
  642 + if ((type.startsWith("QList<") && type.endsWith(">")) || (type == "QStringList")) {
  643 + QVariantList elements;
  644 + if (value.canConvert<QVariantList>()) {
  645 + elements = value.value<QVariantList>();
  646 + } else if (value.canConvert<QString>()) {
  647 + QString string = value.value<QString>();
  648 + if (!string.startsWith('[') || !string.endsWith(']'))
  649 + qFatal("Expected a list to start with '[' and end with 'brackets']'.");
  650 + foreach (const QString &element, parse(string.mid(1, string.size()-2)))
  651 + elements.append(element);
  652 + } else {
  653 + qFatal("Expected a list.");
  654 + }
647 655  
648   - if (type == "QList<float>") {
649   - QList<float> values;
650   - foreach (const QString &string, strings)
651   - values.append(string.toFloat());
652   - variant.setValue(values);
  656 + if ((type == "QList<QString>") || (type == "QStringList")) {
  657 + QStringList parsedValues;
  658 + foreach (const QVariant &element, elements)
  659 + parsedValues.append(element.toString());
  660 + value.setValue(parsedValues);
  661 + } else if (type == "QList<float>") {
  662 + QList<float> parsedValues; bool ok;
  663 + foreach (const QVariant &element, elements) {
  664 + parsedValues.append(element.toFloat(&ok));
  665 + if (!ok) qFatal("Failed to convert element to floating point format.");
  666 + }
  667 + value.setValue(parsedValues);
653 668 } else if (type == "QList<int>") {
654   - QList<int> values;
655   - foreach (const QString &string, strings)
656   - values.append(string.toInt());
657   - variant.setValue(values);
  669 + QList<int> parsedValues; bool ok;
  670 + foreach (const QVariant &element, elements) {
  671 + parsedValues.append(element.toInt(&ok));
  672 + if (!ok) qFatal("Failed to convert element to integer format.");
  673 + }
  674 + value.setValue(parsedValues);
658 675 } else if (type == "QList<br::Transform*>") {
659   - QList<Transform*> values;
660   - foreach (const QString &string, strings)
661   - values.append(Transform::make(string, this));
662   - variant.setValue(values);
  676 + QList<Transform*> parsedValues;
  677 + foreach (const QVariant &element, elements)
  678 + if (element.canConvert<QString>()) parsedValues.append(Transform::make(element.toString(), this));
  679 + else parsedValues.append(element.value<Transform*>());
  680 + value.setValue(parsedValues);
663 681 } else if (type == "QList<br::Distance*>") {
664   - QList<Distance*> values;
665   - foreach (const QString &string, strings)
666   - values.append(Distance::make(string, this));
667   - variant.setValue(values);
  682 + QList<Distance*> parsedValues;
  683 + foreach (const QVariant &element, elements)
  684 + if (element.canConvert<QString>()) parsedValues.append(Distance::make(element.toString(), this));
  685 + else parsedValues.append(element.value<Distance*>());
  686 + value.setValue(parsedValues);
668 687 } else {
669 688 qFatal("Unrecognized type: %s", qPrintable(type));
670 689 }
671 690 } else if (type == "br::Transform*") {
672   - variant.setValue(Transform::make(value, this));
  691 + if (value.canConvert<QString>())
  692 + value.setValue(Transform::make(value.toString(), this));
673 693 } else if (type == "br::Distance*") {
674   - variant.setValue(Distance::make(value, this));
675   - } else if (type == "QStringList") {
676   - variant.setValue(parse(value.mid(1, value.size()-2)));
  694 + if (value.canConvert<QString>())
  695 + value.setValue(Distance::make(value.toString(), this));
677 696 } else if (type == "bool") {
678   - if (value.isEmpty()) variant = true;
679   - else if (value == "false") variant = false;
680   - else if (value == "true") variant = true;
681   - else variant = value;
682   - } else {
683   - variant = value;
  697 + if (value.isNull()) value = true;
  698 + else if (value == "false") value = false;
  699 + else if (value == "true") value = true;
684 700 }
685 701  
686   - setProperty(name, variant, !type.isEmpty());
687   -}
688   -
689   -void Object::setProperty(const QString &name, const QVariant &value, bool failOnError)
690   -{
691   - if (!QObject::setProperty(qPrintable(name), value) && failOnError)
  702 + if (!QObject::setProperty(qPrintable(name), value) && !type.isEmpty())
692 703 qFatal("Failed to set %s::%s to: %s",
693 704 metaObject()->className(), qPrintable(name), qPrintable(value.toString()));
694 705 }
... ... @@ -731,20 +742,16 @@ void Object::init(const File &amp;file_)
731 742  
732 743 foreach (QString key, file.localKeys()) {
733 744 const QVariant value = file.value(key);
734   - const QString valueString = value.toString();
735   -
736 745 if (key.startsWith(("_Arg"))) {
737 746 int argumentNumber = key.mid(4).toInt();
738 747 int targetIdx = argumentNumber + firstAvailablePropertyIdx;
739 748 if (targetIdx >= metaObject()->propertyCount()) {
740   - qWarning("Too many arguments for object %s, ignoring %s", qPrintable(objectName()), qPrintable(valueString));
  749 + qWarning("Too many arguments for object: %s, ignoring: %s", qPrintable(objectName()), qPrintable(value.toString()));
741 750 continue;
742 751 }
743 752 key = metaObject()->property(targetIdx).name();
744 753 }
745   -
746   - if (valueString.isEmpty()) setProperty(key, value); // Set the property directly
747   - else setProperty(key, valueString); // Parse the value first
  754 + setProperty(key, value);
748 755 }
749 756  
750 757 init();
... ...
openbr/openbr_plugin.h
... ... @@ -511,8 +511,7 @@ public:
511 511 QStringList arguments() const; /*!< \brief A string describing the values the object has. */
512 512 QString argument(int index) const; /*!< \brief A string value for the argument at the specified index. */
513 513 QString description() const; /*!< \brief Returns a string description of the object. */
514   - void setProperty(const QString &name, const QString &value); /*!< \brief Overload of QObject::setProperty to handle OpenBR data types. */
515   - void setProperty(const QString &name, const QVariant &value, bool failOnError = false); /*!< \brief Overload of QObject::setProperty to handle OpenBR data types. */
  514 + void setProperty(const QString &name, QVariant value); /*!< \brief Overload of QObject::setProperty to handle OpenBR data types. */
516 515 static QStringList parse(const QString &string, char split = ','); /*!< \brief Splits the string while respecting lexical scoping of <tt>()</tt>, <tt>[]</tt>, <tt>\<\></tt>, and <tt>{}</tt>. */
517 516  
518 517 private:
... ...