# HG changeset patch # User Chris Cannam # Date 1294672701 0 # Node ID 661f5808aa0a8a3e2dbfef27c66e3360cc9ae25a # Parent e2f2c6e3c01b4ce42e6d90e13e6ffb7860f41f15 * Overhaul settings-defaults mechanism, and add Restore Defaults button to settings dialog diff -r e2f2c6e3c01b -r 661f5808aa0a hgrunner.cpp --- 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"); } diff -r e2f2c6e3c01b -r 661f5808aa0a hgrunner.h --- 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(); diff -r e2f2c6e3c01b -r 661f5808aa0a mainwindow.cpp --- 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; } diff -r e2f2c6e3c01b -r 661f5808aa0a mainwindow.h --- 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; diff -r e2f2c6e3c01b -r 661f5808aa0a settingsdialog.cpp --- 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 #include +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; diff -r e2f2c6e3c01b -r 661f5808aa0a settingsdialog.h --- 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