diff settingsdialog.cpp @ 239:661f5808aa0a

* Overhaul settings-defaults mechanism, and add Restore Defaults button to settings dialog
author Chris Cannam
date Mon, 10 Jan 2011 15:18:21 +0000
parents e67bd8abc3e3
children 53ad43d5a463
line wrap: on
line diff
--- a/settingsdialog.cpp	Mon Jan 10 13:30:19 2011 +0000
+++ b/settingsdialog.cpp	Mon Jan 10 15:18:21 2011 +0000
@@ -26,6 +26,9 @@
 #include <QDir>
 #include <QFileDialog>
 
+QString
+SettingsDialog::m_installPath;
+
 SettingsDialog::SettingsDialog(QWidget *parent) :
     QDialog(parent),
     m_presentationChanged(false)
@@ -33,8 +36,6 @@
     setModal(true);
     setWindowTitle(tr("Settings"));
 
-    QSettings settings;
-    
     QGridLayout *mainLayout = new QGridLayout;
     setLayout(mainLayout);
 
@@ -45,24 +46,18 @@
     QGridLayout *meLayout = new QGridLayout;
     meBox->setLayout(meLayout);
 
-    settings.beginGroup("User Information");
-
     int row = 0;
 
     meLayout->addWidget(new QLabel(tr("Name:")), row, 0);
 
     m_nameEdit = new QLineEdit();
-    m_nameEdit->setText(settings.value("name", getUserRealName()).toString());
     meLayout->addWidget(m_nameEdit, row++, 1);
     
     meLayout->addWidget(new QLabel(tr("Email address:")), row, 0);
 
     m_emailEdit = new QLineEdit();
-    m_emailEdit->setText(settings.value("email").toString());
     meLayout->addWidget(m_emailEdit, row++, 1);
 
-    settings.endGroup();
-
 
 
     QGroupBox *lookBox = new QGroupBox(tr("Presentation"));
@@ -70,20 +65,14 @@
     QGridLayout *lookLayout = new QGridLayout;
     lookBox->setLayout(lookLayout);
 
-    settings.beginGroup("Presentation");
-
     row = 0;
 
     m_showIconLabels = new QCheckBox(tr("Show labels on toolbar icons"));
-    m_showIconLabels->setChecked(settings.value("showiconlabels", true).toBool());
     lookLayout->addWidget(m_showIconLabels, row++, 0);
 
     m_showExtraText = new QCheckBox(tr("Show long descriptions for file status headings"));
-    m_showExtraText->setChecked(settings.value("showhelpfultext", true).toBool());
     lookLayout->addWidget(m_showExtraText, row++, 0);
 
-    settings.endGroup();
-
 
 
     QGroupBox *pathsBox = new QGroupBox(tr("System application locations"));
@@ -91,14 +80,11 @@
     QGridLayout *pathsLayout = new QGridLayout;
     pathsBox->setLayout(pathsLayout);
 
-    settings.beginGroup("Locations");
-
     row = 0;
 
     pathsLayout->addWidget(new QLabel(tr("Mercurial (hg) program:")), row, 0);
 
     m_hgPathLabel = new QLineEdit();
-    m_hgPathLabel->setText(settings.value("hgbinary").toString());
     pathsLayout->addWidget(m_hgPathLabel, row, 2);
 
     QPushButton *browse = new QPushButton(tr("Browse..."));
@@ -108,7 +94,6 @@
     pathsLayout->addWidget(new QLabel(tr("External diff program:")), row, 0);
 
     m_diffPathLabel = new QLineEdit();
-    m_diffPathLabel->setText(settings.value("extdiffbinary").toString());
     pathsLayout->addWidget(m_diffPathLabel, row, 2);
 
     browse = new QPushButton(tr("Browse..."));
@@ -118,7 +103,6 @@
     pathsLayout->addWidget(new QLabel(tr("External file-merge program:")), row, 0);
 
     m_mergePathLabel = new QLineEdit();
-    m_mergePathLabel->setText(settings.value("mergebinary").toString());
     pathsLayout->addWidget(m_mergePathLabel, row, 2);
 
     browse = new QPushButton(tr("Browse..."));
@@ -128,41 +112,32 @@
     pathsLayout->addWidget(new QLabel(tr("External text editor:")), row, 0);
 
     m_editPathLabel = new QLineEdit();
-    m_editPathLabel->setText(settings.value("editorbinary").toString());
     pathsLayout->addWidget(m_editPathLabel, row, 2);
 
     browse = new QPushButton(tr("Browse..."));
     pathsLayout->addWidget(browse, row++, 1);
     connect(browse, SIGNAL(clicked()), this, SLOT(editPathBrowse()));
 
-    settings.endGroup();
-    
-    settings.beginGroup("Locations");
-
     pathsLayout->addWidget(new QLabel(tr("EasyHg Mercurial extension:")), row, 0);
 
     m_extensionPathLabel = new QLineEdit();
-    m_extensionPathLabel->setText(settings.value("extensionpath").toString());
     pathsLayout->addWidget(m_extensionPathLabel, row, 2);
 
     browse = new QPushButton(tr("Browse..."));
     pathsLayout->addWidget(browse, row++, 1);
     connect(browse, SIGNAL(clicked()), this, SLOT(extensionPathBrowse()));
 
-    settings.endGroup();
-
-    settings.beginGroup("General");
-
     //!!! more info plz
     m_useExtension = new QCheckBox(tr("Use EasyHg Mercurial extension"));
-    m_useExtension->setChecked(settings.value("useextension", true).toBool());
     pathsLayout->addWidget(m_useExtension, row++, 2);
 
-    settings.endGroup();
 
+    reset(); // loads current defaults from settings
 
 
     QDialogButtonBox *bbox = new QDialogButtonBox(QDialogButtonBox::Ok);
+    connect(bbox->addButton(tr("Restore defaults"), QDialogButtonBox::ResetRole),
+            SIGNAL(clicked()), this, SLOT(restoreDefaults()));
     connect(bbox, SIGNAL(accepted()), this, SLOT(accept()));
     mainLayout->addWidget(bbox, 3, 0);
     m_ok = bbox->button(QDialogButtonBox::Ok);
@@ -218,6 +193,198 @@
 }
 
 void
+SettingsDialog::restoreDefaults()
+{
+    clear();
+    findDefaultLocations();
+    reset();
+}
+
+void
+SettingsDialog::findDefaultLocations(QString installPath)
+{
+    m_installPath = installPath;
+    findHgBinaryName();
+    findExtension();
+    findDiffBinaryName();
+    findMergeBinaryName();
+    findEditorBinaryName();
+}
+
+void
+SettingsDialog::findHgBinaryName()
+{
+    QSettings settings;
+    settings.beginGroup("Locations");
+    QString hg = settings.value("hgbinary", "").toString();
+    if (hg == "") {
+        hg = findInPath("hg", m_installPath, true);
+    }
+    if (hg != "") {
+        settings.setValue("hgbinary", hg);
+    }
+}
+
+void
+SettingsDialog::findExtension()
+{
+    QSettings settings;
+    settings.beginGroup("Locations");
+
+    QString extpath = settings.value("extensionpath", "").toString();
+    if (extpath != "" || !QFile(extpath).exists()) {
+
+        //!!! bad: this is a dupe with hgrunner
+
+        QString home = QDir::homePath();
+        QString target = QString("%1/.easyhg").arg(home);
+        extpath = QString("%1/easyhg.py").arg(target);
+
+        if (!QFile(extpath).exists()) {
+            extpath = findInPath("easyhg.py", m_installPath, false);
+        }
+    }
+
+    settings.setValue("extensionpath", extpath);
+}   
+
+void
+SettingsDialog::findDiffBinaryName()
+{
+    QSettings settings;
+    settings.beginGroup("Locations");
+    QString diff = settings.value("extdiffbinary", "").toString();
+    if (diff == "") {
+        QStringList bases;
+#ifdef Q_OS_MAC
+        bases << "easyhg-extdiff-osx.sh";
+#endif 
+        bases << "kompare" << "kdiff3" << "meld";
+        bool found = false;
+        foreach (QString base, bases) {
+            diff = findInPath(base, m_installPath, true);
+            if (diff != "") {
+                found = true;
+                break;
+            }
+        }
+        if (found) {
+            settings.setValue("extdiffbinary", diff);
+        }
+    }
+}
+
+void
+SettingsDialog::findMergeBinaryName()
+{
+    QSettings settings;
+    settings.beginGroup("Locations");
+    if (settings.contains("mergebinary")) {
+        return;
+    }
+    QString merge;
+    QStringList bases;
+#ifdef Q_OS_MAC
+    bases << "easyhg-merge-osx.sh";
+#endif
+    // I think this is too dangerous, given command line ordering
+    // differences and suchlike.  Need to make sure the hg
+    // installation is configured OK instead
+//    bases << "meld" << "diffuse" << "kdiff3";
+    bool found = false;
+    foreach (QString base, bases) {
+        merge = findInPath(base, m_installPath, true);
+        if (merge != "") {
+            found = true;
+            break;
+        }
+    }
+    if (found) {
+        settings.setValue("mergebinary", merge);
+    }
+}
+
+void
+SettingsDialog::findEditorBinaryName()
+{
+    QSettings settings;
+    settings.beginGroup("Locations");
+    QString editor = settings.value("editorbinary", "").toString();
+    if (editor == "") {
+        QStringList bases;
+        bases
+#if defined Q_OS_WIN32
+            << "wordpad.exe"
+            << "C:\\Program Files\\Windows NT\\Accessories\\wordpad.exe"
+            << "notepad.exe"
+#elif defined Q_OS_MAC
+            << "/Applications/TextEdit.app/Contents/MacOS/TextEdit"
+#else
+            << "gedit" << "kate"
+#endif
+            ;
+        bool found = false;
+        foreach (QString base, bases) {
+            editor = findInPath(base, m_installPath, true);
+            if (editor != "") {
+                found = true;
+                break;
+            }
+        }
+        if (found) {
+            settings.setValue("editorbinary", editor);
+        }
+    }
+}
+
+void
+SettingsDialog::clear()
+{
+    // Clear everything that has a default setting
+    DEBUG << "SettingsDialog::clear" << endl;
+    QSettings settings;
+    settings.beginGroup("Presentation");
+    settings.remove("showiconlabels");
+    settings.remove("showhelpfultext");
+    settings.endGroup();
+    settings.beginGroup("Locations");
+    settings.remove("hgbinary");
+    settings.remove("extdiffbinary");
+    settings.remove("mergebinary");
+    settings.remove("editorbinary");
+    settings.remove("extensionpath");
+    settings.endGroup();
+    settings.beginGroup("General");
+    settings.remove("useextension");
+    settings.endGroup();
+}
+
+void
+SettingsDialog::reset()
+{
+    DEBUG << "SettingsDialog::reset" << endl;
+    QSettings settings;
+    settings.beginGroup("User Information");
+    m_nameEdit->setText(settings.value("name", getUserRealName()).toString());
+    m_emailEdit->setText(settings.value("email").toString());
+    settings.endGroup();
+    settings.beginGroup("Presentation");
+    m_showIconLabels->setChecked(settings.value("showiconlabels", true).toBool());
+    m_showExtraText->setChecked(settings.value("showhelpfultext", true).toBool());
+    settings.endGroup();
+    settings.beginGroup("Locations");
+    m_hgPathLabel->setText(settings.value("hgbinary").toString());
+    m_diffPathLabel->setText(settings.value("extdiffbinary").toString());
+    m_mergePathLabel->setText(settings.value("mergebinary").toString());
+    m_editPathLabel->setText(settings.value("editorbinary").toString());
+    m_extensionPathLabel->setText(settings.value("extensionpath").toString());
+    settings.endGroup();
+    settings.beginGroup("General");
+    m_useExtension->setChecked(settings.value("useextension", true).toBool());
+    settings.endGroup();
+}
+
+void
 SettingsDialog::accept()
 {
     DEBUG << "SettingsDialog::accept" << endl;