Sfoglia il codice sorgente

Merge pull request #451 from mwoehlke-kitware/add-reload-settings

Allow reload in case of external changes
Julien Finet 11 anni fa
parent
commit
f94708dd9e

+ 25 - 1
Libs/Widgets/Testing/Cpp/ctkSettingsDialogTest1.cpp

@@ -105,7 +105,7 @@ int ctkSettingsDialogTest1(int argc, char * argv [] )
     return EXIT_FAILURE;
     }
   settingsDialog.resetSettings();
-  // Reset button should be enabled after settings are reset
+  // Reset button should be disabled after settings are reset
   if (buttonBox->button(QDialogButtonBox::Reset)->isEnabled())
     {
     std::cerr << "Line " << __LINE__ << " - Reset button should be disabled !" << std::endl;
@@ -117,6 +117,11 @@ int ctkSettingsDialogTest1(int argc, char * argv [] )
     std::cerr << "Reset failed" << std::endl;
     return EXIT_FAILURE;
     }
+  if (box->isChecked())
+    {
+    std::cerr << "Reset failed" << std::endl;
+    return EXIT_FAILURE;
+    }
 
   // Reset button should be enabled after settings are modified
   box->setChecked(true);
@@ -140,7 +145,26 @@ int ctkSettingsDialogTest1(int argc, char * argv [] )
     return EXIT_FAILURE;
     }
 
+  settings2.setValue("key 1", true);
+  settingsDialog.reloadSettings();
+  if (!box->isChecked())
+    {
+    std::cerr << "Reload failed" << std::endl;
+    return EXIT_FAILURE;
+    }
 
+  settingsDialog.restoreDefaultSettings();
+  boxVal = settings2.value("key 1");
+  if (!boxVal.isValid() || boxVal.toBool() != false)
+    {
+    std::cerr << "Restore to default failed" << std::endl;
+    return EXIT_FAILURE;
+    }
+  if (box->isChecked())
+    {
+    std::cerr << "Restore to default failed" << std::endl;
+    return EXIT_FAILURE;
+    }
 
   settingsDialog.setCurrentPanel("Panel 4");
 

+ 149 - 0
Libs/Widgets/Testing/Cpp/ctkSettingsPanelTest.cpp

@@ -44,6 +44,9 @@ private slots:
   void testChangeProperty_data();
 
   void testEmptyQStringList();
+
+  void testResetRestoreReloadSettings();
+  void testResetRestoreReloadSettings_data();
 };
 
 //-----------------------------------------------------------------------------
@@ -235,6 +238,152 @@ void ctkSettingsPanelTester::testEmptyQStringList()
   settingsPanel.setSettings(&settings2);
 }
 
+//-----------------------------------------------------------------------------
+void ctkSettingsPanelTester::testResetRestoreReloadSettings()
+{
+  QSettings settings(QSettings::IniFormat, QSettings::UserScope, "Common ToolKit", "CTK");
+  // Clear settings
+  settings.clear();
+  settings.sync();
+
+  int settingsValue = 1;
+  int initValue = 2;
+  int newValue = 3;
+
+  QFETCH(bool, setSettingsValue);
+  if (setSettingsValue)
+    {
+    settings.setValue("key 1", settingsValue);
+    }
+
+  QSpinBox spinBox;
+  spinBox.setValue(initValue);
+
+  ctkSettingsPanel settingsPanel;
+  settingsPanel.setSettings(&settings);
+  settingsPanel.registerProperty("key 1", &spinBox, "value",
+                                 SIGNAL(valueChanged(int)));
+
+  QFETCH(bool, setSpinBoxValue);
+  if (setSpinBoxValue)
+    {
+    spinBox.setValue(newValue);
+    }
+
+  QFETCH(bool, applySettings);
+  if (applySettings)
+    {
+    settingsPanel.applySettings();
+    }
+
+  QFETCH(bool, resetSettings);
+  if (resetSettings)
+    {
+    settingsPanel.resetSettings();
+    }
+
+  QFETCH(bool, restoreDefaultSettings);
+  if (restoreDefaultSettings)
+    {
+    settingsPanel.restoreDefaultSettings();
+    }
+
+  QFETCH(bool, reloadSettings);
+  if (reloadSettings)
+    {
+    settingsPanel.reloadSettings();
+    }
+
+  QFETCH(int, finalValue);
+  QCOMPARE(settings.value("key 1").toInt(), finalValue);
+}
+
+//-----------------------------------------------------------------------------
+void ctkSettingsPanelTester::testResetRestoreReloadSettings_data()
+{
+  QTest::addColumn<bool>("setSettingsValue");
+  QTest::addColumn<bool>("setSpinBoxValue");
+  QTest::addColumn<bool>("applySettings");
+  QTest::addColumn<bool>("resetSettings");
+  QTest::addColumn<bool>("restoreDefaultSettings");
+  QTest::addColumn<bool>("reloadSettings");
+  QTest::addColumn<int>("finalValue");
+
+  int settingsValue = 1;
+  int initValue = 2;
+  int newValue = 3;
+
+  //   settings spinbox apply    reset   restore  reload  final
+  QTest::newRow("set value")
+    << false << true << false << false << false << false << newValue;
+  QTest::newRow("reload")
+    << false << true << false << false << false << true << newValue;
+  QTest::newRow("restore")
+    << false << true << false << false << true << false << initValue;
+  QTest::newRow("restore and reload")
+    << false << true << false << false << true << true << initValue;
+  QTest::newRow("reset")
+    << false << true << false << true << false << false << initValue;
+  QTest::newRow("reset and reload")
+    << false << true << false << true << false << true << initValue;
+  QTest::newRow("reset and restore")
+    << false << true << false << true << true << false << initValue;
+  QTest::newRow("reset, restore and reload")
+    << false << true << false << true << true << true << initValue;
+  QTest::newRow("apply")
+    << false << true << true << false << false << false << newValue;
+  QTest::newRow("apply and reload")
+    << false << true << true << false << false << true << newValue;
+  QTest::newRow("apply and restore")
+    << false << true << true << false << true << false << initValue;
+  QTest::newRow("apply, restore and reload")
+    << false << true << true << false << true << true << initValue;
+  QTest::newRow("apply and reset")
+    << false << true << true << true << false << false << newValue;
+  QTest::newRow("apply, reset and reload")
+    << false << true << true << true << false << true << newValue;
+  QTest::newRow("apply, reset and restore")
+    << false << true << true << true << true << false << initValue;
+  QTest::newRow("apply, reset, restore and reload")
+    << false << true << true << true << true << true << initValue;
+
+  // with existing settings
+  //   settings spinbox apply    reset   restore  reload  final
+  QTest::newRow("set value with settings")
+    << true << true << false << false << false << false << newValue;
+  QTest::newRow("reload with settings")
+    << true << true << false << false << false << true << newValue;
+  QTest::newRow("restore with settings")
+    << true << true << false << false << true << false << initValue;
+  QTest::newRow("restore and reload with settings")
+    << true << true << false << false << true << true << initValue;
+  QTest::newRow("reset with settings")
+    << true << true << false << true << false << false << settingsValue;
+  QTest::newRow("reset and reload with settings")
+    << true << true << false << true << false << true << settingsValue;
+  QTest::newRow("reset and restore with settings")
+    << true << true << false << true << true << false << initValue;
+  QTest::newRow("reset, restore and reload with settings")
+    << true << true << false << true << true << true << initValue;
+  QTest::newRow("apply with settings")
+    << true << true << true << false << false << false << newValue;
+  QTest::newRow("apply and reload with settings")
+    << true << true << true << false << false << true << newValue;
+  QTest::newRow("apply and restore with settings")
+    << true << true << true << false << true << false << initValue;
+  QTest::newRow("apply, restore and reload with settings")
+    << true << true << true << false << true << true << initValue;
+  QTest::newRow("apply and reset with settings")
+    << true << true << true << true << false << false << newValue;
+  QTest::newRow("apply, reset and reload with settings")
+    << true << true << true << true << false << true << newValue;
+  QTest::newRow("apply, reset and restore with settings")
+    << true << true << true << true << true << false << initValue;
+  QTest::newRow("apply, reset, restore and reload with settings")
+    << true << true << true << true << true << true << initValue;
+
+}
+
 // ----------------------------------------------------------------------------
 CTK_TEST_MAIN(ctkSettingsPanelTest)
 #include "moc_ctkSettingsPanelTest.cpp"

+ 11 - 0
Libs/Widgets/ctkSettingsDialog.cpp

@@ -337,6 +337,17 @@ void ctkSettingsDialog::applySettings()
 }
 
 // --------------------------------------------------------------------------
+void ctkSettingsDialog::reloadSettings()
+{
+  Q_D(ctkSettingsDialog);
+  foreach(ctkSettingsPanel* panel, d->Panels.values())
+    {
+    panel->reloadSettings();
+    }
+  d->SettingsButtonBox->button(QDialogButtonBox::Reset)->setEnabled(false);
+}
+
+// --------------------------------------------------------------------------
 void ctkSettingsDialog::resetSettings()
 {
   Q_D(ctkSettingsDialog);

+ 8 - 0
Libs/Widgets/ctkSettingsDialog.h

@@ -105,6 +105,14 @@ public Q_SLOTS:
   void resetSettings();
   void restoreDefaultSettings();
 
+  /// Reload settings for all registered panels.
+  ///
+  /// This reloads the settings for all panels, effectively throwing out any
+  /// values in the UI or the panels' caches and reverting to the values in the
+  /// associated QSettings. You should call this if you have made changes to
+  /// the QSettings that were not made through ctkSettingsPanel.
+  void reloadSettings();
+
   virtual void accept();
   virtual void reject();
 

+ 2 - 2
Libs/Widgets/ctkSettingsPanel.cpp

@@ -191,11 +191,11 @@ void ctkSettingsPanel::setSettings(QSettings* settings)
     return;
     }
   d->Settings = settings;
-  this->updateProperties();
+  this->reloadSettings();
 }
 
 // --------------------------------------------------------------------------
-void ctkSettingsPanel::updateProperties()
+void ctkSettingsPanel::reloadSettings()
 {
   Q_D(ctkSettingsPanel);
   foreach(const QString& key, d->Properties.keys())

+ 7 - 1
Libs/Widgets/ctkSettingsPanel.h

@@ -123,6 +123,13 @@ public Q_SLOTS:
   /// of the properties when they were registered using registerProperty().
   virtual void restoreDefaultSettings();
 
+  /// Reload all properties from disk.
+  ///
+  /// This reloads all properties from their respective QSettings instance(s).
+  /// The previous values are discarded (as in resetSettings()).
+  /// \sa resetSettings(), restoreDefaultSettings()
+  virtual void reloadSettings();
+
 Q_SIGNALS:
   /// Fired anytime a property is modified.
   void settingChanged(const QString& key, const QVariant& value);
@@ -146,7 +153,6 @@ protected Q_SLOTS:
 protected:
   QScopedPointer<ctkSettingsPanelPrivate> d_ptr;
 
-  virtual void updateProperties();
 private:
   Q_DECLARE_PRIVATE(ctkSettingsPanel);
   Q_DISABLE_COPY(ctkSettingsPanel);