changeset 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 e2f2c6e3c01b
children 53ad43d5a463
files hgrunner.cpp hgrunner.h mainwindow.cpp mainwindow.h settingsdialog.cpp settingsdialog.h
diffstat 6 files changed, 253 insertions(+), 169 deletions(-) [+]
line wrap: on
line diff
--- a/hgrunner.cpp	Mon Jan 10 13:30:19 2011 +0000
+++ b/hgrunner.cpp	Mon Jan 10 15:18:21 2011 +0000
@@ -46,12 +46,18 @@
 {
     m_proc = 0;
 
+    // Always unbundle the extension: even if it already exists (in
+    // case we're upgrading) and even if we're not going to use it (so
+    // that it's available in case someone wants to use it later,
+    // e.g. to fix a malfunctioning setup).  But the path we actually
+    // prefer is the one in the settings first, if it exists; then the
+    // unbundled one; then anything in the path if for some reason
+    // unbundling failed
+    unbundleExtension();
+
     setTextVisible(false);
     setVisible(false);
     m_isRunning = false;
-
-    (void)findExtension();
-    (void)findHgBinaryName();
 }
 
 HgRunner::~HgRunner()
@@ -63,32 +69,6 @@
     }
 }
 
-QString HgRunner::findExtension()
-{
-    // Always unbundle the extension: even if it already exists (in
-    // case we're upgrading) and even if we're not going to use it (so
-    // that it's available in case someone wants to use it later,
-    // e.g. to fix a malfunctioning setup).  But the path we actually
-    // prefer is the one in the settings first, if it exists; then the
-    // unbundled one; then anything in the path if for some reason
-    // unbundling failed
-
-    QSettings settings;
-    settings.beginGroup("Locations");
-
-    QString unbundled = unbundleExtension();
-    QString extpath = settings.value("extensionpath", "").toString();
-    if (extpath != "" && QFile(extpath).exists()) return extpath;
-
-    extpath = unbundled;
-    if (extpath == "") {
-        extpath = findInPath("easyhg.py", m_myDirPath, false);
-    }
-
-    settings.setValue("extensionpath", extpath);
-    return extpath;
-}   
-
 QString HgRunner::getUnbundledFileName()
 {
     QString home = QDir::homePath();
@@ -175,20 +155,22 @@
     checkQueue();
 }
 
-QString HgRunner::findHgBinaryName()
+QString HgRunner::getHgBinaryName()
 {
     QSettings settings;
     settings.beginGroup("Locations");
-    QString hg = settings.value("hgbinary", "").toString();
-    if (hg == "") {
-        hg = findInPath("hg", m_myDirPath, true);
-    }
-    if (hg != "") {
-        settings.setValue("hgbinary", hg);
-    }
-    return hg;
+    return settings.value("hgbinary", "").toString();
 }
 
+QString HgRunner::getExtensionLocation()
+{
+    QSettings settings;
+    settings.beginGroup("Locations");
+    QString extpath = settings.value("extensionpath", "").toString();
+    if (extpath != "" && QFile(extpath).exists()) return extpath;
+    return "";
+}   
+
 void HgRunner::started()
 {
     DEBUG << "started" << endl;
@@ -403,7 +385,7 @@
 
     if (executable == "") {
         // This is a Hg command
-        executable = findHgBinaryName();
+        executable = getHgBinaryName();
 
         if (action.mayBeInteractive()) {
             params.push_front("ui.interactive=true");
@@ -412,7 +394,7 @@
             QSettings settings;
             settings.beginGroup("General");
             if (settings.value("useextension", true).toBool()) {
-                QString extpath = findExtension();
+                QString extpath = getExtensionLocation();
                 params.push_front(QString("extensions.easyhg=%1").arg(extpath));
                 params.push_front("--config");
             }
--- a/hgrunner.h	Mon Jan 10 13:30:19 2011 +0000
+++ b/hgrunner.h	Mon Jan 10 15:18:21 2011 +0000
@@ -67,8 +67,9 @@
     void openTerminal();
     void closeTerminal();
 
-    QString findExtension();
-    QString findHgBinaryName();
+    QString getHgBinaryName();
+    QString getExtensionLocation();
+
     QString getUnbundledFileName();
     QString unbundleExtension();
 
--- a/mainwindow.cpp	Mon Jan 10 13:30:19 2011 +0000
+++ b/mainwindow.cpp	Mon Jan 10 15:18:21 2011 +0000
@@ -113,9 +113,7 @@
         startupDialog();
     }
 
-    (void)findDiffBinaryName();
-    (void)findMergeBinaryName();
-    (void)findEditorBinaryName();
+    SettingsDialog::findDefaultLocations(m_myDirPath);
 
     ColourSet *cs = ColourSet::instance();
     cs->clearDefaultNames();
@@ -497,7 +495,7 @@
     
     params << hgIgnorePath;
     
-    QString editor = findEditorBinaryName();
+    QString editor = getEditorBinaryName();
 
     if (editor == "") {
         DEBUG << "Failed to find a text editor" << endl;
@@ -511,102 +509,25 @@
     runner->requestAction(action);
 }
 
-QString MainWindow::findDiffBinaryName()
+QString MainWindow::getDiffBinaryName()
 {
     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_myDirPath, true);
-            if (diff != "") {
-                found = true;
-                break;
-            }
-        }
-        if (found) {
-            settings.setValue("extdiffbinary", diff);
-        } else {
-            diff = "";
-        }
-    }
-    return diff;
+    return settings.value("extdiffbinary", "").toString();
 }
 
-QString MainWindow::findMergeBinaryName()
+QString MainWindow::getMergeBinaryName()
 {
     QSettings settings;
     settings.beginGroup("Locations");
-    if (settings.contains("mergebinary")) {
-        // use it even if empty: user may have specified no external tool
-        QVariant v = settings.value("mergebinary");
-        DEBUG << "v = " << v << endl;
-        return v.toString();
-    }
-    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_myDirPath, true);
-        if (merge != "") {
-            found = true;
-            break;
-        }
-    }
-    if (found) {
-        settings.setValue("mergebinary", merge);
-    } else {
-        merge = "";
-    }
-    return merge;
+    return settings.value("mergebinary", "").toString();
 }
 
-QString MainWindow::findEditorBinaryName()
+QString MainWindow::getEditorBinaryName()
 {
     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_myDirPath, true);
-            if (editor != "") {
-                found = true;
-                break;
-            }
-        }
-        if (found) {
-            settings.setValue("editorbinary", editor);
-        } else {
-            editor = "";
-        }
-    }
-    return editor;
+    return settings.value("editorbinary", "").toString();
 }
 
 void MainWindow::hgShowSummary()
@@ -620,7 +541,7 @@
 
 void MainWindow::hgFolderDiff()
 {
-    QString diff = findDiffBinaryName();
+    QString diff = getDiffBinaryName();
     if (diff == "") return;
 
     QStringList params;
@@ -638,7 +559,7 @@
 
 void MainWindow::hgDiffToCurrent(QString id)
 {
-    QString diff = findDiffBinaryName();
+    QString diff = getDiffBinaryName();
     if (diff == "") return;
 
     QStringList params;
@@ -655,7 +576,7 @@
 
 void MainWindow::hgDiffToParent(QString child, QString parent)
 {
-    QString diff = findDiffBinaryName();
+    QString diff = getDiffBinaryName();
     if (diff == "") return;
 
     QStringList params;
@@ -786,7 +707,7 @@
 
     params << "resolve";
 
-    QString merge = findMergeBinaryName();
+    QString merge = getMergeBinaryName();
     if (merge != "") {
         params << "--tool" << merge;
     }
@@ -819,7 +740,7 @@
 
     params << "merge";
 
-    QString merge = findMergeBinaryName();
+    QString merge = getMergeBinaryName();
     if (merge != "") {
         params << "--tool" << merge;
     }
@@ -841,7 +762,7 @@
     params << "merge";
     params << "--rev" << Changeset::hashOf(id);
 
-    QString merge = findMergeBinaryName();
+    QString merge = getMergeBinaryName();
     if (merge != "") {
         params << "--tool" << merge;
     }
--- a/mainwindow.h	Mon Jan 10 13:30:19 2011 +0000
+++ b/mainwindow.h	Mon Jan 10 15:18:21 2011 +0000
@@ -211,9 +211,9 @@
 
     bool shouldHgStat;
 
-    QString findDiffBinaryName();
-    QString findMergeBinaryName();
-    QString findEditorBinaryName();
+    QString getDiffBinaryName();
+    QString getMergeBinaryName();
+    QString getEditorBinaryName();
 
     QFileSystemWatcher *fsWatcher;
     QTimer *m_fsWatcherGeneralTimer;
--- 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;
--- a/settingsdialog.h	Mon Jan 10 13:30:19 2011 +0000
+++ b/settingsdialog.h	Mon Jan 10 15:18:21 2011 +0000
@@ -34,6 +34,8 @@
     bool presentationChanged() {
         return m_presentationChanged;
     }
+
+    static void findDefaultLocations(QString installPath = m_installPath);
     
 private slots:
     void hgPathBrowse();
@@ -43,6 +45,9 @@
     void extensionPathBrowse();
 
     void accept();
+    void reset();
+    void clear();
+    void restoreDefaults();
 
 private:
     QLineEdit *m_nameEdit;
@@ -63,6 +68,14 @@
     bool m_presentationChanged;
 
     void browseFor(QString, QLineEdit *);
+
+    static void findHgBinaryName();
+    static void findExtension();
+    static void findDiffBinaryName();
+    static void findMergeBinaryName();
+    static void findEditorBinaryName();
+
+    static QString m_installPath;
 };
 
 #endif