diff src/settingsdialog.cpp @ 370:b9c153e00e84

Move source files to src/
author Chris Cannam
date Thu, 24 Mar 2011 10:27:51 +0000
parents settingsdialog.cpp@cc95394e2392
children c567fed39559
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/settingsdialog.cpp	Thu Mar 24 10:27:51 2011 +0000
@@ -0,0 +1,469 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*-  vi:set ts=8 sts=4 sw=4: */
+
+/*
+    EasyMercurial
+
+    Based on HgExplorer by Jari Korhonen
+    Copyright (c) 2010 Jari Korhonen
+    Copyright (c) 2011 Chris Cannam
+    Copyright (c) 2011 Queen Mary, University of London
+    
+    This program is free software; you can redistribute it and/or
+    modify it under the terms of the GNU General Public License as
+    published by the Free Software Foundation; either version 2 of the
+    License, or (at your option) any later version.  See the file
+    COPYING included with this distribution for more information.
+*/
+
+#include "settingsdialog.h"
+#include "common.h"
+#include "debug.h"
+
+#include <QGridLayout>
+#include <QGroupBox>
+#include <QDialogButtonBox>
+#include <QSettings>
+#include <QDir>
+#include <QFileDialog>
+#include <QMessageBox>
+
+QString
+SettingsDialog::m_installPath;
+
+SettingsDialog::SettingsDialog(QWidget *parent) :
+    QDialog(parent),
+    m_presentationChanged(false)
+{
+    setModal(true);
+    setWindowTitle(tr("Settings"));
+
+    QGridLayout *mainLayout = new QGridLayout;
+    setLayout(mainLayout);
+
+
+
+    QGroupBox *meBox = new QGroupBox(tr("User details"));
+    mainLayout->addWidget(meBox, 0, 0);
+    QGridLayout *meLayout = new QGridLayout;
+    meBox->setLayout(meLayout);
+
+    int row = 0;
+
+    meLayout->addWidget(new QLabel(tr("Name:")), row, 0);
+
+    m_nameEdit = new QLineEdit();
+    meLayout->addWidget(m_nameEdit, row++, 1);
+    
+    meLayout->addWidget(new QLabel(tr("Email address:")), row, 0);
+
+    m_emailEdit = new QLineEdit();
+    meLayout->addWidget(m_emailEdit, row++, 1);
+
+
+
+    QGroupBox *lookBox = new QGroupBox(tr("Presentation"));
+    mainLayout->addWidget(lookBox, 1, 0);
+    QGridLayout *lookLayout = new QGridLayout;
+    lookBox->setLayout(lookLayout);
+
+    row = 0;
+
+    m_showIconLabels = new QCheckBox(tr("Show labels on toolbar icons"));
+    lookLayout->addWidget(m_showIconLabels, row++, 0, 1, 2);
+
+    m_showExtraText = new QCheckBox(tr("Show long descriptions for file status headings"));
+    lookLayout->addWidget(m_showExtraText, row++, 0, 1, 2);
+    
+#ifdef NOT_IMPLEMENTED_YET
+    lookLayout->addWidget(new QLabel(tr("Place the work and history views")), row, 0);
+    m_workHistoryArrangement = new QComboBox();
+    m_workHistoryArrangement->addItem(tr("In separate tabs"));
+    m_workHistoryArrangement->addItem(tr("Side-by-side in a single pane"));
+    lookLayout->addWidget(m_workHistoryArrangement, row++, 1, Qt::AlignLeft);
+    lookLayout->setColumnStretch(1, 20);
+#endif
+
+    lookLayout->addWidget(new QLabel(tr("Label the history timeline with")), row, 0);
+    m_dateFormat = new QComboBox();
+    m_dateFormat->addItem(tr("Ages, for example \"5 weeks ago\""));
+    m_dateFormat->addItem(tr("Dates, for example \"2010-06-23\""));
+    lookLayout->addWidget(m_dateFormat, row++, 1, Qt::AlignLeft);
+    lookLayout->setColumnStretch(1, 20);
+    
+
+    QGroupBox *pathsBox = new QGroupBox(tr("System application locations"));
+    mainLayout->addWidget(pathsBox, 2, 0);
+    QGridLayout *pathsLayout = new QGridLayout;
+    pathsBox->setLayout(pathsLayout);
+
+    row = 0;
+
+    pathsLayout->addWidget(new QLabel(tr("Mercurial (hg) program:")), row, 0);
+
+    m_hgPathLabel = new QLineEdit();
+    pathsLayout->addWidget(m_hgPathLabel, row, 2);
+
+    QPushButton *browse = new QPushButton(tr("Browse..."));
+    pathsLayout->addWidget(browse, row++, 1);
+    connect(browse, SIGNAL(clicked()), this, SLOT(hgPathBrowse()));
+
+    pathsLayout->addWidget(new QLabel(tr("External diff program:")), row, 0);
+
+    m_diffPathLabel = new QLineEdit();
+    pathsLayout->addWidget(m_diffPathLabel, row, 2);
+
+    browse = new QPushButton(tr("Browse..."));
+    pathsLayout->addWidget(browse, row++, 1);
+    connect(browse, SIGNAL(clicked()), this, SLOT(diffPathBrowse()));
+    
+    pathsLayout->addWidget(new QLabel(tr("External file-merge program:")), row, 0);
+
+    m_mergePathLabel = new QLineEdit();
+    pathsLayout->addWidget(m_mergePathLabel, row, 2);
+
+    browse = new QPushButton(tr("Browse..."));
+    pathsLayout->addWidget(browse, row++, 1);
+    connect(browse, SIGNAL(clicked()), this, SLOT(mergePathBrowse()));
+
+    pathsLayout->addWidget(new QLabel(tr("External text editor:")), row, 0);
+
+    m_editPathLabel = new QLineEdit();
+    pathsLayout->addWidget(m_editPathLabel, row, 2);
+
+    browse = new QPushButton(tr("Browse..."));
+    pathsLayout->addWidget(browse, row++, 1);
+    connect(browse, SIGNAL(clicked()), this, SLOT(editPathBrowse()));
+
+    pathsLayout->addWidget(new QLabel(tr("EasyHg Mercurial extension:")), row, 0);
+
+    m_extensionPathLabel = new QLineEdit();
+    pathsLayout->addWidget(m_extensionPathLabel, row, 2);
+
+    browse = new QPushButton(tr("Browse..."));
+    pathsLayout->addWidget(browse, row++, 1);
+    connect(browse, SIGNAL(clicked()), this, SLOT(extensionPathBrowse()));
+
+    //!!! more info plz
+    m_useExtension = new QCheckBox(tr("Use EasyHg Mercurial extension"));
+    pathsLayout->addWidget(m_useExtension, row++, 2);
+
+
+    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);
+}
+
+void
+SettingsDialog::hgPathBrowse()
+{
+    browseFor(tr("Mercurial program"), m_hgPathLabel);
+}
+
+void
+SettingsDialog::diffPathBrowse()
+{
+    browseFor(tr("External diff program"), m_diffPathLabel);
+}
+
+void
+SettingsDialog::mergePathBrowse()
+{
+    browseFor(tr("External file-merge program"), m_mergePathLabel);
+}
+
+void
+SettingsDialog::editPathBrowse()
+{
+    browseFor(tr("External text editor"), m_editPathLabel);
+}
+
+void
+SettingsDialog::extensionPathBrowse()
+{
+    browseFor(tr("EasyHg Mercurial extension"), m_extensionPathLabel);
+}
+
+void
+SettingsDialog::browseFor(QString title, QLineEdit *edit)
+{
+    QString origin = edit->text();
+
+    if (origin == "") {
+#ifdef Q_OS_WIN32
+        origin = "c:";
+#else
+        origin = QDir::homePath();
+#endif
+    }
+    
+    QString path = QFileDialog::getOpenFileName(this, title, origin);
+    if (path != QString()) {
+        edit->setText(path);
+    }
+}
+
+void
+SettingsDialog::restoreDefaults()
+{
+    if (QMessageBox::question
+        (this, tr("Restore default settings?"),
+         tr("<qt><b>Restore default settings?</b><br><br>Are you sure you want to reset all settings to their default values?"),
+         QMessageBox::Ok | QMessageBox::Cancel,
+         QMessageBox::Cancel) == QMessageBox::Ok) {
+        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);
+    }
+}
+
+QString
+SettingsDialog::getUnbundledExtensionFileName()
+{
+    QString home = QDir::homePath();
+    QString target = QString("%1/.easyhg").arg(home);
+    QString extpath = QString("%1/easyhg.py").arg(target);
+    return extpath;
+}
+
+void
+SettingsDialog::findExtension()
+{
+    QSettings settings;
+    settings.beginGroup("Locations");
+
+    QString extpath = settings.value("extensionpath", "").toString();
+    if (extpath != "" || !QFile(extpath).exists()) {
+
+        extpath = getUnbundledExtensionFileName();
+
+        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_WIN32
+        bases << "easyhg-extdiff.bat";
+#else
+        bases << "easyhg-extdiff.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_WIN32
+    bases << "easyhg-merge.bat";
+#else
+    bases << "easyhg-merge.sh";
+#endif
+    // NB it's not a good idea to add other tools here, as command
+    // line argument ordering varies.  Configure them through hgrc
+    // instead
+    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());
+#ifdef NOT_IMPLEMENTED_YET
+    m_workHistoryArrangement->setCurrentIndex(settings.value("workhistoryarrangement", 0).toInt());
+#endif
+    m_dateFormat->setCurrentIndex(settings.value("dateformat", 0).toInt());
+    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;
+    QSettings settings;
+    settings.beginGroup("User Information");
+    settings.setValue("name", m_nameEdit->text());
+    settings.setValue("email", m_emailEdit->text());
+    settings.endGroup();
+    settings.beginGroup("Presentation");
+    bool b;
+    b = m_showIconLabels->isChecked();
+    if (b != settings.value("showiconlabels", true)) {
+        settings.setValue("showiconlabels", b);
+        m_presentationChanged = true;
+    }
+    b = m_showExtraText->isChecked();
+    if (b != settings.value("showhelpfultext", true)) {
+        settings.setValue("showhelpfultext", b);
+        m_presentationChanged = true;
+    }
+    int i;
+#ifdef NOT_IMPLEMENTED_YET
+    i = m_workHistoryArrangement->currentIndex();
+    if (i != settings.value("workhistoryarrangement", 0)) {
+        settings.setValue("workhistoryarrangement", i);
+        m_presentationChanged = true;
+    }
+#endif
+    i = m_dateFormat->currentIndex();
+    if (i != settings.value("dateformat", 0)) {
+        settings.setValue("dateformat", i);
+        m_presentationChanged = true;
+    }
+    settings.endGroup();
+    settings.beginGroup("Locations");
+    settings.setValue("hgbinary", m_hgPathLabel->text());
+    settings.setValue("extdiffbinary", m_diffPathLabel->text());
+    settings.setValue("mergebinary", m_mergePathLabel->text());
+    settings.setValue("editorbinary", m_editPathLabel->text());
+    settings.setValue("extensionpath", m_extensionPathLabel->text());
+    settings.endGroup();
+    settings.beginGroup("General");
+    settings.setValue("useextension", m_useExtension->isChecked());
+    settings.endGroup();
+    QDialog::accept();
+}
+
+