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,62 +633,73 @@ void Object::load(QDataStream &stream)
633 init(); 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 QString type; 638 QString type;
639 int index = metaObject()->indexOfProperty(qPrintable(name)); 639 int index = metaObject()->indexOfProperty(qPrintable(name));
640 if (index != -1) type = metaObject()->property(index).typeName(); 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 } else if (type == "QList<int>") { 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 } else if (type == "QList<br::Transform*>") { 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 } else if (type == "QList<br::Distance*>") { 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 } else { 687 } else {
669 qFatal("Unrecognized type: %s", qPrintable(type)); 688 qFatal("Unrecognized type: %s", qPrintable(type));
670 } 689 }
671 } else if (type == "br::Transform*") { 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 } else if (type == "br::Distance*") { 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 } else if (type == "bool") { 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 qFatal("Failed to set %s::%s to: %s", 703 qFatal("Failed to set %s::%s to: %s",
693 metaObject()->className(), qPrintable(name), qPrintable(value.toString())); 704 metaObject()->className(), qPrintable(name), qPrintable(value.toString()));
694 } 705 }
@@ -731,20 +742,16 @@ void Object::init(const File &amp;file_) @@ -731,20 +742,16 @@ void Object::init(const File &amp;file_)
731 742
732 foreach (QString key, file.localKeys()) { 743 foreach (QString key, file.localKeys()) {
733 const QVariant value = file.value(key); 744 const QVariant value = file.value(key);
734 - const QString valueString = value.toString();  
735 -  
736 if (key.startsWith(("_Arg"))) { 745 if (key.startsWith(("_Arg"))) {
737 int argumentNumber = key.mid(4).toInt(); 746 int argumentNumber = key.mid(4).toInt();
738 int targetIdx = argumentNumber + firstAvailablePropertyIdx; 747 int targetIdx = argumentNumber + firstAvailablePropertyIdx;
739 if (targetIdx >= metaObject()->propertyCount()) { 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 continue; 750 continue;
742 } 751 }
743 key = metaObject()->property(targetIdx).name(); 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 init(); 757 init();
openbr/openbr_plugin.h
@@ -511,8 +511,7 @@ public: @@ -511,8 +511,7 @@ public:
511 QStringList arguments() const; /*!< \brief A string describing the values the object has. */ 511 QStringList arguments() const; /*!< \brief A string describing the values the object has. */
512 QString argument(int index) const; /*!< \brief A string value for the argument at the specified index. */ 512 QString argument(int index) const; /*!< \brief A string value for the argument at the specified index. */
513 QString description() const; /*!< \brief Returns a string description of the object. */ 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 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>. */ 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 private: 517 private: