Commit 538f8840723cb2863edf83c30485ec7b817872c2
1 parent
32566f05
refactored Object::setProperty to fix #49
Showing
2 changed files
with
53 additions
and
47 deletions
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 &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: | ... | ... |