소스 검색

ctkSettingsPanel: Fix changedSettings() for empty QStringList

This commit updates setPreviousValue to ensure QVariant that should be
an empty QStringList is valid.

Partially address #646
Jean-Christophe Fillion-Robin 9 년 전
부모
커밋
b5da157193
3개의 변경된 파일27개의 추가작업 그리고 11개의 파일을 삭제
  1. 2 2
      Libs/Widgets/Testing/Cpp/ctkSettingsPanelTest.cpp
  2. 3 3
      Libs/Widgets/Testing/Cpp/ctkSettingsPanelTest1.cpp
  3. 22 6
      Libs/Widgets/ctkSettingsPanel.cpp

+ 2 - 2
Libs/Widgets/Testing/Cpp/ctkSettingsPanelTest.cpp

@@ -261,8 +261,8 @@ void ctkSettingsPanelTester::testEmptyQStringList()
   settingsPanel.setSettings(&settings2);
 
   QVariant listVal = settings2.value("list");
-//  QCOMPARE(listVal.isValid(), true); // See issue #646
-//  QCOMPARE(listVal, QVariant(QStringList())); // See issue #646
+  QCOMPARE(listVal.isValid(), false); // See issue #646
+  QCOMPARE(listVal, QVariant()); // See issue #646
   QCOMPARE(listVal.toStringList(), QStringList());
   QCOMPARE(settingsPanel.myPreviousPropertyValue("list").toStringList(), QStringList());
   QCOMPARE(settingsPanel.myDefaultPropertyValue("list").toStringList(), QStringList());

+ 3 - 3
Libs/Widgets/Testing/Cpp/ctkSettingsPanelTest1.cpp

@@ -397,13 +397,13 @@ int TestStringList(ctkSettingsPanelForTest& settingsPanel)
   settingsPanel.setSettings(&settings2);
 
   listVal = settings2.value("key list");
-  //CHECK_BOOL(listVal.isValid(), true); // Issue #646
-  //CHECK_QVARIANT(listVal, QVariant(QStringList())); // Issue #646
+  CHECK_BOOL(listVal.isValid(), false); // Issue #646
+  CHECK_QVARIANT(listVal, QVariant()); // Issue #646
   CHECK_QSTRINGLIST(listVal.toStringList(), QStringList());
   CHECK_QSTRINGLIST(settingsPanel.myPreviousPropertyValue("key list").toStringList(), QStringList());
   CHECK_QSTRINGLIST(settingsPanel.myDefaultPropertyValue("key list").toStringList(), QStringList());
   CHECK_QSTRINGLIST(settingsPanel.myPropertyValue("key list").toStringList(), QStringList());
-  //CHECK_QSTRINGLIST(settingsPanel.changedSettings(), QStringList()); // Issue #646
+  CHECK_QSTRINGLIST(settingsPanel.changedSettings(), QStringList()); // Issue #646
 
   return EXIT_SUCCESS;
 }

+ 22 - 6
Libs/Widgets/ctkSettingsPanel.cpp

@@ -36,6 +36,7 @@ namespace
 // --------------------------------------------------------------------------
 struct PropertyType
 {
+  typedef PropertyType Self;
   PropertyType();
   QObject* Object;
   QString  Property;
@@ -52,7 +53,11 @@ struct PropertyType
 
   QMetaProperty metaProperty();
 
+  /// Workaround https://bugreports.qt.io/browse/QTBUG-19823
+  static QVariant fixEmptyStringListVariant(const QVariant& value, const char* _typename);
+
 private:
+
   QVariant PreviousValue;
 };
 
@@ -83,11 +88,8 @@ bool PropertyType::setValue(const QVariant& val)
     return false;
     }
   QVariant value(val);
-  // HACK - See http://bugreports.qt.nokia.com/browse/QTBUG-19823
-  if (qstrcmp(this->metaProperty().typeName(), "QStringList") == 0 && !value.isValid())
-    {
-    value = QVariant(QStringList());
-    }
+  value = Self::fixEmptyStringListVariant(value,
+                                          this->metaProperty().typeName());
   bool success = true;
   if (this->Object->property(this->Property.toLatin1()) != value)
     {
@@ -106,7 +108,21 @@ QVariant PropertyType::previousValue()const
 // --------------------------------------------------------------------------
 void PropertyType::setPreviousValue(const QVariant& val)
 {
-  this->PreviousValue = val;
+  this->PreviousValue =
+      Self::fixEmptyStringListVariant(val, this->metaProperty().typeName());
+}
+
+// --------------------------------------------------------------------------
+QVariant PropertyType::fixEmptyStringListVariant(const QVariant& value,
+                                                 const char* _typename)
+{
+  QVariant fixedValue = value;
+  // HACK - See https://bugreports.qt.io/browse/QTBUG-19823
+  if (qstrcmp(_typename, "QStringList") == 0 && !value.isValid())
+    {
+    fixedValue = QVariant(QStringList());
+    }
+  return fixedValue;
 }
 
 // --------------------------------------------------------------------------