瀏覽代碼

Merge branch 'settingspanel-add-mechanism-to-specify-alternative-settings'

* settingspanel-add-mechanism-to-specify-alternative-settings:
  Alternative settings can be specified for each panel settings entry
Jean-Christophe Fillion-Robin 12 年之前
父節點
當前提交
fc9a964cc9
共有 3 個文件被更改,包括 167 次插入43 次删除
  1. 115 25
      Libs/Widgets/Testing/Cpp/ctkSettingsPanelTest.cpp
  2. 47 17
      Libs/Widgets/ctkSettingsPanel.cpp
  3. 5 1
      Libs/Widgets/ctkSettingsPanel.h

+ 115 - 25
Libs/Widgets/Testing/Cpp/ctkSettingsPanelTest.cpp

@@ -49,7 +49,16 @@ private slots:
 //-----------------------------------------------------------------------------
 void ctkSettingsPanelTester::testChangeProperty()
 {
+  QFETCH(bool, registerSpecificSettings);
   QSettings settings(QSettings::IniFormat, QSettings::UserScope, "Common ToolKit", "CTK");
+  QSettings specificSettings(QSettings::IniFormat, QSettings::UserScope, "Common ToolKit", "CTK-specific");
+  
+  // Clear settings
+  settings.clear();
+  settings.sync();
+  specificSettings.clear();
+  specificSettings.sync();
+  
   QSpinBox spinBox;
   ctkSettingsPanel panel;
   panel.setSettings(&settings);
@@ -59,7 +68,7 @@ void ctkSettingsPanelTester::testChangeProperty()
   QFETCH(ctkSettingsPanel::SettingOptions, options);
   panel.registerProperty("property", &spinBox,
                          "value", SIGNAL(valueChanged(int)),
-                         label, options);
+                         label, options, registerSpecificSettings ? &specificSettings : 0);
 
   QCOMPARE(spinBox.value(), 1);
   QCOMPARE(panel.settingLabel("property"), label);
@@ -86,6 +95,59 @@ void ctkSettingsPanelTester::testChangeProperty()
   // make sure it didn't change
   QCOMPARE(panel.settingLabel("property"), label);
   QCOMPARE(panel.settingOptions("property"), options);
+  
+  QString currentSettingContent;
+  {
+    settings.sync();
+    if (QFile::exists(settings.fileName()))
+      {
+      QFile file(settings.fileName());
+      QVERIFY(file.open(QIODevice::ReadOnly));
+      currentSettingContent = file.readAll();
+      file.close();
+      }
+  }
+  
+  QString currentSpecificSettingsContent;
+  {
+    specificSettings.sync();
+    if (QFile::exists(specificSettings.fileName()))
+      {
+      QFile file(specificSettings.fileName());
+      QVERIFY(file.open(QIODevice::ReadOnly));
+      currentSpecificSettingsContent = file.readAll();
+      file.close();
+      }
+  }
+
+  QString expectedSettingsContent = QLatin1String("[General]\nproperty=%1\n");
+ 
+  if (expectedChangedSettings.count() > 0)
+    {
+    if (registerSpecificSettings)
+      {
+      QCOMPARE(currentSettingContent, QString(""));
+      QCOMPARE(currentSpecificSettingsContent, expectedSettingsContent.arg(value));
+      }
+    else
+      {
+      QCOMPARE(currentSettingContent, expectedSettingsContent.arg(value));
+      QCOMPARE(currentSpecificSettingsContent, QString(""));
+      }
+    }
+  else
+    {
+    if (registerSpecificSettings)
+      {
+      QCOMPARE(currentSettingContent, QString(""));
+      QCOMPARE(currentSpecificSettingsContent, expectedSettingsContent.arg(1));
+      }
+    else
+      {
+      QCOMPARE(currentSettingContent, expectedSettingsContent.arg(1));
+      QCOMPARE(currentSpecificSettingsContent, QString(""));
+      }
+    }
 
   panel.resetSettings();
 }
@@ -97,33 +159,61 @@ void ctkSettingsPanelTester::testChangeProperty_data()
   QTest::addColumn<ctkSettingsPanel::SettingOptions>("options");
   QTest::addColumn<int>("value");
   QTest::addColumn<bool>("setOnObject");
+  QTest::addColumn<bool>("registerSpecificSettings");
   QTest::addColumn<int>("expectedSettingChangedCount");
   QTest::addColumn<QStringList>("expectedChangedSettings");
 
-  QTest::newRow("null none changed obj") << QString() << ctkSettingsPanel::SettingOptions(ctkSettingsPanel::OptionNone) << 2 << true << 1 << QStringList("property");
-  QTest::newRow("null none changed panel") << QString() << ctkSettingsPanel::SettingOptions(ctkSettingsPanel::OptionNone) << 2 << false << 1 << QStringList("property");
-  QTest::newRow("null none unchanged obj") << QString() << ctkSettingsPanel::SettingOptions(ctkSettingsPanel::OptionNone) << 1 << true << 0 << QStringList();
-  QTest::newRow("null none unchanged panel") << QString() << ctkSettingsPanel::SettingOptions(ctkSettingsPanel::OptionNone) << 1 << false << 0 << QStringList();
-  QTest::newRow("null RequireRestart changed obj") << QString() << ctkSettingsPanel::SettingOptions(ctkSettingsPanel::OptionRequireRestart) << 2 << true << 1 << QStringList("property");
-  QTest::newRow("null RequireRestart changed panel") << QString() << ctkSettingsPanel::SettingOptions(ctkSettingsPanel::OptionRequireRestart) << 2 << false << 1 << QStringList("property");
-  QTest::newRow("null RequireRestart unchanged obj") << QString() << ctkSettingsPanel::SettingOptions(ctkSettingsPanel::OptionRequireRestart) << 1 << true << 0 << QStringList();
-  QTest::newRow("null RequireRestart unchanged panel") << QString() << ctkSettingsPanel::SettingOptions(ctkSettingsPanel::OptionRequireRestart) << 1 << false << 0 << QStringList();
-  QTest::newRow("empty none changed obj") << QString("") << ctkSettingsPanel::SettingOptions(ctkSettingsPanel::OptionNone) << 2 << true << 1 << QStringList("property");
-  QTest::newRow("empty none changed panel") << QString("") << ctkSettingsPanel::SettingOptions(ctkSettingsPanel::OptionNone) << 2 << false << 1 << QStringList("property");
-  QTest::newRow("empty none unchanged obj") << QString("") << ctkSettingsPanel::SettingOptions(ctkSettingsPanel::OptionNone) << 1 << true << 0 << QStringList();
-  QTest::newRow("empty none unchanged panel") << QString("") << ctkSettingsPanel::SettingOptions(ctkSettingsPanel::OptionNone) << 1 << false << 0 << QStringList();
-  QTest::newRow("empty RequireRestart changed obj") << QString("") << ctkSettingsPanel::SettingOptions(ctkSettingsPanel::OptionRequireRestart) << 2 << true << 1 << QStringList("property");
-  QTest::newRow("empty RequireRestart changed panel") << QString("") << ctkSettingsPanel::SettingOptions(ctkSettingsPanel::OptionRequireRestart) << 2 << false << 1 << QStringList("property");
-  QTest::newRow("empty RequireRestart unchanged obj") << QString("") << ctkSettingsPanel::SettingOptions(ctkSettingsPanel::OptionRequireRestart) << 1 << true << 0 << QStringList();
-  QTest::newRow("empty RequireRestart unchanged panel") << QString("") << ctkSettingsPanel::SettingOptions(ctkSettingsPanel::OptionRequireRestart) << 1 << false << 0 << QStringList();
-  QTest::newRow("label none changed obj") << QString("label") << ctkSettingsPanel::SettingOptions(ctkSettingsPanel::OptionNone) << 2 << true << 1 << QStringList("property");
-  QTest::newRow("label none changed panel") << QString("label") << ctkSettingsPanel::SettingOptions(ctkSettingsPanel::OptionNone) << 2 << false << 1 << QStringList("property");
-  QTest::newRow("label none unchanged obj") << QString("label") << ctkSettingsPanel::SettingOptions(ctkSettingsPanel::OptionNone) << 1 << true << 0 << QStringList();
-  QTest::newRow("label none unchanged panel") << QString("label") << ctkSettingsPanel::SettingOptions(ctkSettingsPanel::OptionNone) << 1 << false << 0 << QStringList();
-  QTest::newRow("label RequireRestart changed obj") << QString("label") << ctkSettingsPanel::SettingOptions(ctkSettingsPanel::OptionRequireRestart) << 2 << true << 1 << QStringList("property");
-  QTest::newRow("label RequireRestart changed panel") << QString("label") << ctkSettingsPanel::SettingOptions(ctkSettingsPanel::OptionRequireRestart) << 2 << false << 1 << QStringList("property");
-  QTest::newRow("label RequireRestart unchanged obj") << QString("label") << ctkSettingsPanel::SettingOptions(ctkSettingsPanel::OptionRequireRestart) << 1 << true << 0 << QStringList();
-  QTest::newRow("label RequireRestart unchanged panel") << QString("label") << ctkSettingsPanel::SettingOptions(ctkSettingsPanel::OptionRequireRestart) << 1 << false << 0 << QStringList();
+  // registerSpecificSettings: false
+  QTest::newRow("null none changed obj") << QString() << ctkSettingsPanel::SettingOptions(ctkSettingsPanel::OptionNone) << 2 << true << false << 1 << QStringList("property");
+  QTest::newRow("null none changed panel") << QString() << ctkSettingsPanel::SettingOptions(ctkSettingsPanel::OptionNone) << 2 << false << false << 1 << QStringList("property");
+  QTest::newRow("null none unchanged obj") << QString() << ctkSettingsPanel::SettingOptions(ctkSettingsPanel::OptionNone) << 1 << true << false << 0 << QStringList();
+  QTest::newRow("null none unchanged panel") << QString() << ctkSettingsPanel::SettingOptions(ctkSettingsPanel::OptionNone) << 1 << false << false << 0 << QStringList();
+  QTest::newRow("null RequireRestart changed obj") << QString() << ctkSettingsPanel::SettingOptions(ctkSettingsPanel::OptionRequireRestart) << 2 << true << false << 1 << QStringList("property");
+  QTest::newRow("null RequireRestart changed panel") << QString() << ctkSettingsPanel::SettingOptions(ctkSettingsPanel::OptionRequireRestart) << 2 << false << false << 1 << QStringList("property");
+  QTest::newRow("null RequireRestart unchanged obj") << QString() << ctkSettingsPanel::SettingOptions(ctkSettingsPanel::OptionRequireRestart) << 1 << true << false << 0 << QStringList();
+  QTest::newRow("null RequireRestart unchanged panel") << QString() << ctkSettingsPanel::SettingOptions(ctkSettingsPanel::OptionRequireRestart) << 1 << false << false << 0 << QStringList();
+  QTest::newRow("empty none changed obj") << QString("") << ctkSettingsPanel::SettingOptions(ctkSettingsPanel::OptionNone) << 2 << true << false << 1 << QStringList("property");
+  QTest::newRow("empty none changed panel") << QString("") << ctkSettingsPanel::SettingOptions(ctkSettingsPanel::OptionNone) << 2 << false << false << 1 << QStringList("property");
+  QTest::newRow("empty none unchanged obj") << QString("") << ctkSettingsPanel::SettingOptions(ctkSettingsPanel::OptionNone) << 1 << true << false << 0 << QStringList();
+  QTest::newRow("empty none unchanged panel") << QString("") << ctkSettingsPanel::SettingOptions(ctkSettingsPanel::OptionNone) << 1 << false << false << 0 << QStringList();
+  QTest::newRow("empty RequireRestart changed obj") << QString("") << ctkSettingsPanel::SettingOptions(ctkSettingsPanel::OptionRequireRestart) << 2 << true << false << 1 << QStringList("property");
+  QTest::newRow("empty RequireRestart changed panel") << QString("") << ctkSettingsPanel::SettingOptions(ctkSettingsPanel::OptionRequireRestart) << 2 << false << false << 1 << QStringList("property");
+  QTest::newRow("empty RequireRestart unchanged obj") << QString("") << ctkSettingsPanel::SettingOptions(ctkSettingsPanel::OptionRequireRestart) << 1 << true << false << 0 << QStringList();
+  QTest::newRow("empty RequireRestart unchanged panel") << QString("") << ctkSettingsPanel::SettingOptions(ctkSettingsPanel::OptionRequireRestart) << 1 << false << false << 0 << QStringList();
+  QTest::newRow("label none changed obj") << QString("label") << ctkSettingsPanel::SettingOptions(ctkSettingsPanel::OptionNone) << 2 << true << false << 1 << QStringList("property");
+  QTest::newRow("label none changed panel") << QString("label") << ctkSettingsPanel::SettingOptions(ctkSettingsPanel::OptionNone) << 2 << false << false << 1 << QStringList("property");
+  QTest::newRow("label none unchanged obj") << QString("label") << ctkSettingsPanel::SettingOptions(ctkSettingsPanel::OptionNone) << 1 << true << false << 0 << QStringList();
+  QTest::newRow("label none unchanged panel") << QString("label") << ctkSettingsPanel::SettingOptions(ctkSettingsPanel::OptionNone) << 1 << false << false << 0 << QStringList();
+  QTest::newRow("label RequireRestart changed obj") << QString("label") << ctkSettingsPanel::SettingOptions(ctkSettingsPanel::OptionRequireRestart) << 2 << true << false << 1 << QStringList("property");
+  QTest::newRow("label RequireRestart changed panel") << QString("label") << ctkSettingsPanel::SettingOptions(ctkSettingsPanel::OptionRequireRestart) << 2 << false << false << 1 << QStringList("property");
+  QTest::newRow("label RequireRestart unchanged obj") << QString("label") << ctkSettingsPanel::SettingOptions(ctkSettingsPanel::OptionRequireRestart) << 1 << true << false << 0 << QStringList();
+  QTest::newRow("label RequireRestart unchanged panel") << QString("label") << ctkSettingsPanel::SettingOptions(ctkSettingsPanel::OptionRequireRestart) << 1 << false << false << 0 << QStringList();
+  
+  // registerSpecificSettings: true
+  QTest::newRow("null none changed obj") << QString() << ctkSettingsPanel::SettingOptions(ctkSettingsPanel::OptionNone) << 2 << true << true << 1 << QStringList("property");
+  QTest::newRow("null none changed panel") << QString() << ctkSettingsPanel::SettingOptions(ctkSettingsPanel::OptionNone) << 2 << false << true << 1 << QStringList("property");
+  QTest::newRow("null none unchanged obj") << QString() << ctkSettingsPanel::SettingOptions(ctkSettingsPanel::OptionNone) << 1 << true << true << 0 << QStringList();
+  QTest::newRow("null none unchanged panel") << QString() << ctkSettingsPanel::SettingOptions(ctkSettingsPanel::OptionNone) << 1 << false << true << 0 << QStringList();
+  QTest::newRow("null RequireRestart changed obj") << QString() << ctkSettingsPanel::SettingOptions(ctkSettingsPanel::OptionRequireRestart) << 2 << true << true << 1 << QStringList("property");
+  QTest::newRow("null RequireRestart changed panel") << QString() << ctkSettingsPanel::SettingOptions(ctkSettingsPanel::OptionRequireRestart) << 2 << false << true << 1 << QStringList("property");
+  QTest::newRow("null RequireRestart unchanged obj") << QString() << ctkSettingsPanel::SettingOptions(ctkSettingsPanel::OptionRequireRestart) << 1 << true << true << 0 << QStringList();
+  QTest::newRow("null RequireRestart unchanged panel") << QString() << ctkSettingsPanel::SettingOptions(ctkSettingsPanel::OptionRequireRestart) << 1 << false << true << 0 << QStringList();
+  QTest::newRow("empty none changed obj") << QString("") << ctkSettingsPanel::SettingOptions(ctkSettingsPanel::OptionNone) << 2 << true << true << 1 << QStringList("property");
+  QTest::newRow("empty none changed panel") << QString("") << ctkSettingsPanel::SettingOptions(ctkSettingsPanel::OptionNone) << 2 << false << true << 1 << QStringList("property");
+  QTest::newRow("empty none unchanged obj") << QString("") << ctkSettingsPanel::SettingOptions(ctkSettingsPanel::OptionNone) << 1 << true << true << 0 << QStringList();
+  QTest::newRow("empty none unchanged panel") << QString("") << ctkSettingsPanel::SettingOptions(ctkSettingsPanel::OptionNone) << 1 << false << true << 0 << QStringList();
+  QTest::newRow("empty RequireRestart changed obj") << QString("") << ctkSettingsPanel::SettingOptions(ctkSettingsPanel::OptionRequireRestart) << 2 << true << true << 1 << QStringList("property");
+  QTest::newRow("empty RequireRestart changed panel") << QString("") << ctkSettingsPanel::SettingOptions(ctkSettingsPanel::OptionRequireRestart) << 2 << false << true << 1 << QStringList("property");
+  QTest::newRow("empty RequireRestart unchanged obj") << QString("") << ctkSettingsPanel::SettingOptions(ctkSettingsPanel::OptionRequireRestart) << 1 << true << true << 0 << QStringList();
+  QTest::newRow("empty RequireRestart unchanged panel") << QString("") << ctkSettingsPanel::SettingOptions(ctkSettingsPanel::OptionRequireRestart) << 1 << false << true << 0 << QStringList();
+  QTest::newRow("label none changed obj") << QString("label") << ctkSettingsPanel::SettingOptions(ctkSettingsPanel::OptionNone) << 2 << true << true << 1 << QStringList("property");
+  QTest::newRow("label none changed panel") << QString("label") << ctkSettingsPanel::SettingOptions(ctkSettingsPanel::OptionNone) << 2 << false << true << 1 << QStringList("property");
+  QTest::newRow("label none unchanged obj") << QString("label") << ctkSettingsPanel::SettingOptions(ctkSettingsPanel::OptionNone) << 1 << true << true << 0 << QStringList();
+  QTest::newRow("label none unchanged panel") << QString("label") << ctkSettingsPanel::SettingOptions(ctkSettingsPanel::OptionNone) << 1 << false << true << 0 << QStringList();
+  QTest::newRow("label RequireRestart changed obj") << QString("label") << ctkSettingsPanel::SettingOptions(ctkSettingsPanel::OptionRequireRestart) << 2 << true << true << 1 << QStringList("property");
+  QTest::newRow("label RequireRestart changed panel") << QString("label") << ctkSettingsPanel::SettingOptions(ctkSettingsPanel::OptionRequireRestart) << 2 << false << true << 1 << QStringList("property");
+  QTest::newRow("label RequireRestart unchanged obj") << QString("label") << ctkSettingsPanel::SettingOptions(ctkSettingsPanel::OptionRequireRestart) << 1 << true << true << 0 << QStringList();
+  QTest::newRow("label RequireRestart unchanged panel") << QString("label") << ctkSettingsPanel::SettingOptions(ctkSettingsPanel::OptionRequireRestart) << 1 << false << true << 0 << QStringList();
 }
 
 //-----------------------------------------------------------------------------

+ 47 - 17
Libs/Widgets/ctkSettingsPanel.cpp

@@ -42,6 +42,7 @@ struct PropertyType
   QVariant PreviousValue;
   QVariant DefaultValue;
   QString  Label;
+  QSettings* Settings;
   ctkSettingsPanel::SettingOptions Options;
 
   QVariant value()const;
@@ -52,7 +53,7 @@ struct PropertyType
 
 // --------------------------------------------------------------------------
 PropertyType::PropertyType()
-  : Object(0)
+  : Object(0), Settings(0)
   , Options(ctkSettingsPanel::OptionNone)
 {
 }
@@ -115,6 +116,11 @@ public:
   ctkSettingsPanelPrivate(ctkSettingsPanel& object);
   void init();
 
+  /// Return QSettings associated with a given settingKey or the general \a Settings. 
+  /// If \a settingKey is not found, it will return 0.
+  /// \sa ctkSettingsPanel::registerProperty
+  QSettings* settings(const QString& settingKey)const;
+
   QSettings*                  Settings;
   QMap<QString, PropertyType> Properties;
   bool                        SaveToSettingsWhenRegister;
@@ -136,6 +142,21 @@ void ctkSettingsPanelPrivate::init()
 }
 
 // --------------------------------------------------------------------------
+QSettings* ctkSettingsPanelPrivate::settings(const QString& settingKey)const
+{
+  if (!this->Properties.contains(settingKey))
+    {
+    return 0;
+    }
+  const PropertyType& prop = this->Properties[settingKey];
+  if (prop.Settings != 0)
+    {
+    return prop.Settings;
+    }
+  return this->Settings;
+}
+
+// --------------------------------------------------------------------------
 ctkSettingsPanel::ctkSettingsPanel(QWidget* _parent)
   : Superclass(_parent)
   , d_ptr(new ctkSettingsPanelPrivate(*this))
@@ -173,15 +194,16 @@ void ctkSettingsPanel::setSettings(QSettings* settings)
 void ctkSettingsPanel::updateProperties()
 {
   Q_D(ctkSettingsPanel);
-  if (!d->Settings)
-    {
-    return;
-    }
   foreach(const QString& key, d->Properties.keys())
     {
-    if (d->Settings->contains(key))
+    QSettings* settings = d->settings(key);
+    if (!settings)
+      {
+      continue;
+      }
+    if (settings->contains(key))
       {
-      QVariant value = d->Settings->value(key);
+      QVariant value = settings->value(key);
       PropertyType& prop = d->Properties[key];
       // Update object registered using registerProperty()
       prop.setValue(value);
@@ -198,7 +220,7 @@ void ctkSettingsPanel::updateProperties()
 void ctkSettingsPanel::updateSetting(const QString& key)
 {
   Q_D(ctkSettingsPanel);
-  if (!d->Settings)
+  if (!d->settings(key))
     {
     return;
     }
@@ -209,17 +231,18 @@ void ctkSettingsPanel::updateSetting(const QString& key)
 void ctkSettingsPanel::setSetting(const QString& key, const QVariant& newVal)
 {
   Q_D(ctkSettingsPanel);
-  if (!d->Settings)
+  QSettings* settings = d->settings(key);
+  if (!settings)
     {
     return;
     }
-  QVariant oldVal = d->Settings->value(key);
-  d->Settings->setValue(key, newVal);
+  QVariant oldVal = settings->value(key);
+  settings->setValue(key, newVal);
   d->Properties[key].setValue(newVal);
-  if (d->Settings->status() != QSettings::NoError)
+  if (settings->status() != QSettings::NoError)
     {
     logger.warn( QString("Error #%1 while writing setting \"%2\"")
-      .arg(static_cast<int>(d->Settings->status()))
+      .arg(static_cast<int>(settings->status()))
       .arg(key));
     }
   if (oldVal != newVal)
@@ -234,7 +257,8 @@ void ctkSettingsPanel::registerProperty(const QString& key,
                                         const QString& property,
                                         const char* signal,
                                         const QString& label,
-                                        ctkSettingsPanel::SettingOptions options)
+                                        ctkSettingsPanel::SettingOptions options,
+                                        QSettings* settings)
 {
   Q_D(ctkSettingsPanel);
   PropertyType prop;
@@ -243,13 +267,19 @@ void ctkSettingsPanel::registerProperty(const QString& key,
   prop.DefaultValue = prop.PreviousValue = prop.value();
   prop.Label = label;
   prop.Options = options;
-
-  if (d->Settings && d->Settings->contains(key))
+  if (d->Settings != settings)
+    {
+    prop.Settings = settings;
+    }
+  
+  QSettings* propSettings = settings ? settings : d->Settings;
+  if (propSettings && propSettings->contains(key))
     {
-    QVariant val = d->Settings->value(key);
+    QVariant val = propSettings->value(key);
     prop.setValue(val);
     prop.PreviousValue = val;
     }
+    
   d->Properties[key] = prop;
 
   // Create a signal mapper per property to be able to support

+ 5 - 1
Libs/Widgets/ctkSettingsPanel.h

@@ -71,13 +71,17 @@ public:
   ///                         new ctkBooleanMapper(checkBox, "checked", SIGNAL(toggled(bool))),
   ///                         "complement", SIGNAL(complementChanged(bool)));
   /// </code>
+  /// By default, property are associated with the general settings set using setSettings(QSettings*)
+  /// or ctkSettingsDialog::setSettings(QSettings*). Note that it also possible to associate
+  /// a specific \a settings for any given \a settingKey.
   /// \sa Q_PROPERTY(), \sa ctkBooleanMapper
   void registerProperty(const QString& settingKey,
                         QObject* object,
                         const QString& objectProperty,
                         const char* propertySignal,
                         const QString& settingLabel = QString(),
-                        SettingOptions options = OptionNone);
+                        SettingOptions options = OptionNone,
+                        QSettings * settings = 0);
 
   /// Set the setting to the property defined by the key.
   /// The old value can be restored using resetSettings()