changeset 72:121cb1032717

* Bit more work on Open dialog
author Chris Cannam
date Thu, 18 Nov 2010 17:36:53 +0000
parents eaabc54de103
children a773c6e7b301
files mainwindow.cpp multichoicedialog.cpp multichoicedialog.h selectablelabel.cpp startupdialog.cpp
diffstat 5 files changed, 118 insertions(+), 59 deletions(-) [+]
line wrap: on
line diff
--- a/mainwindow.cpp	Thu Nov 18 15:29:48 2010 +0000
+++ b/mainwindow.cpp	Thu Nov 18 17:36:53 2010 +0000
@@ -79,6 +79,10 @@
     cs->addDefaultName("");
     cs->addDefaultName(getUserInfo());
 
+    if (workFolderPath == "") {
+        open();
+    }
+
     hgStat();
 }
 
@@ -699,13 +703,13 @@
 {
     MultiChoiceDialog *d = new MultiChoiceDialog
         (tr("Open Repository"),
-         tr("What would you like to open?"),
+         tr("<qt><big>What would you like to open?</big></qt>"),
          this);
 
     d->addChoice("remote",
                  tr("<qt><center><img src=\":images/browser-64.png\"><br>Remote repository</center></qt>"),
-                 tr("Open an existing remote repository, by cloning a Mercurial repository URL into a local folder."),
-                 MultiChoiceDialog::UrlArg);
+                 tr("Open a remote Mercurial repository, by cloning from its URL into a local folder."),
+                 MultiChoiceDialog::UrlToDirectoryArg);
 
     d->addChoice("local",
                  tr("<qt><center><img src=\":images/hglogo-64.png\"><br>Local repository</center></qt>"),
@@ -726,7 +730,8 @@
     
         if (choice == "local") {
             workFolderPath = arg;
-        } else {
+        } else if (choice == "remote") {
+            DEBUG << "clone " << arg << " to " << d->getAdditionalArgument().trimmed() << endl;
             //!!!
         }
         
@@ -1029,6 +1034,7 @@
                     case ACT_CLONEFROMREMOTE:
                         MultiChoiceDialog::addRecentArgument("local", workFolderPath);
                         MultiChoiceDialog::addRecentArgument("remote", remoteRepoPath);
+                        MultiChoiceDialog::addRecentArgument("remote", workFolderPath, true);
                         QMessageBox::information(this, "Clone", runner -> getStdOut());
                         enableDisableActions();
                         shouldHgStat = true;
--- a/multichoicedialog.cpp	Thu Nov 18 15:29:48 2010 +0000
+++ b/multichoicedialog.cpp	Thu Nov 18 17:36:53 2010 +0000
@@ -27,6 +27,7 @@
 #include <QFont>
 #include <QDir>
 #include <QFileDialog>
+#include <QUrl>
 
 MultiChoiceDialog::MultiChoiceDialog(QString title, QString heading, QWidget *parent) :
     QDialog(parent)
@@ -51,23 +52,32 @@
     f.setPointSize(f.pointSize() * 0.9);
     m_descriptionLabel->setFont(f);
 
-    m_argLabel = new QLabel();
-    outer->addWidget(m_argLabel, 3, 0);
+    m_urlLabel = new QLabel(tr("URL:"));
+    outer->addWidget(m_urlLabel, 3, 0);
 
-    m_argEdit = new QComboBox();
-    m_argEdit->setEditable(true);
-    outer->addWidget(m_argEdit, 3, 1);
+    m_urlCombo = new QComboBox();
+    m_urlCombo->setEditable(true);
+    connect(m_urlCombo, SIGNAL(editTextChanged(const QString &)),
+            this, SLOT(urlChanged(const QString &)));
+    outer->addWidget(m_urlCombo, 3, 1, 1, 2);
+
+    m_fileLabel = new QLabel(tr("File:"));
+    outer->addWidget(m_fileLabel, 4, 0);
+
+    m_fileCombo = new QComboBox();
+    m_fileCombo->setEditable(true);
+    outer->addWidget(m_fileCombo, 4, 1);
     outer->setColumnStretch(1, 20);
 
     m_browseButton = new QPushButton(tr("Browse..."));
-    outer->addWidget(m_browseButton, 3, 2);
+    outer->addWidget(m_browseButton, 4, 2);
     connect(m_browseButton, SIGNAL(clicked()), this, SLOT(browse()));
 
     QDialogButtonBox *bbox = new QDialogButtonBox(QDialogButtonBox::Ok |
                                                   QDialogButtonBox::Cancel);
     connect(bbox, SIGNAL(accepted()), this, SLOT(accept()));
     connect(bbox, SIGNAL(rejected()), this, SLOT(reject()));
-    outer->addWidget(bbox, 4, 0, 1, 3);
+    outer->addWidget(bbox, 5, 0, 1, 3);
     
     setMinimumWidth(480);
 }
@@ -88,13 +98,33 @@
 QString
 MultiChoiceDialog::getArgument()
 {
-    return m_argEdit->currentText();
+    if (m_argTypes[m_currentChoice] == UrlArg ||
+        m_argTypes[m_currentChoice] == UrlToDirectoryArg) {
+        return m_urlCombo->currentText();
+    } else {
+        return m_fileCombo->currentText();
+    }
+}
+
+QString
+MultiChoiceDialog::getAdditionalArgument()
+{
+    if (m_argTypes[m_currentChoice] == UrlToDirectoryArg) {
+        return m_fileCombo->currentText();
+    } else {
+        return "";
+    }
 }
 
 void
-MultiChoiceDialog::addRecentArgument(QString id, QString arg)
+MultiChoiceDialog::addRecentArgument(QString id, QString arg,
+                                     bool additionalArgument)
 {
-    RecentFiles(QString("Recent-%1").arg(id)).addFile(arg);
+    if (additionalArgument) {
+        RecentFiles(QString("Recent-%1-add").arg(id)).addFile(arg);
+    } else {
+        RecentFiles(QString("Recent-%1").arg(id)).addFile(arg);
+    }
 }
 
 void
@@ -142,13 +172,14 @@
 
     QString path = origin;
 
-    if (m_argTypes[m_currentChoice] == DirectoryArg) {
+    if (m_argTypes[m_currentChoice] == DirectoryArg ||
+        m_argTypes[m_currentChoice] == UrlToDirectoryArg) {
 
         path = QFileDialog::getExistingDirectory
             (this, tr("Open Directory"), origin,
              QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks);
         if (path != QString()) {
-            m_argEdit->lineEdit()->setText(path + QDir::separator());
+            m_fileCombo->lineEdit()->setText(path + QDir::separator());
         }
 
     } else {
@@ -156,12 +187,34 @@
         path = QFileDialog::getOpenFileName
             (this, tr("Open File"), origin);
         if (path != QString()) {
-            m_argEdit->lineEdit()->setText(path);
+            m_fileCombo->lineEdit()->setText(path);
         }
     }
 }
 
 void
+MultiChoiceDialog::urlChanged(const QString &s)
+{
+    if (m_argTypes[m_currentChoice] != UrlToDirectoryArg) {
+        return;
+    }
+    QDir dirPath(m_fileCombo->currentText());
+    if (!dirPath.exists()) {
+        if (!dirPath.cdUp()) return;
+    }
+    QString url = m_urlCombo->currentText();
+    if (QRegExp("^\\w+://").indexIn(url) < 0) {
+        return;
+    }
+    QString urlDirName = url;
+    urlDirName.replace(QRegExp("^.*//.*/"), "");
+    if (urlDirName == "" || urlDirName == url) {
+        return;
+    }
+    m_fileCombo->lineEdit()->setText(dirPath.filePath(urlDirName));
+}
+
+void
 MultiChoiceDialog::choiceChanged()
 {
     DEBUG << "choiceChanged" << endl;
@@ -194,49 +247,54 @@
 
     m_descriptionLabel->setText(m_descriptions[id]);
 
+    m_fileLabel->hide();
+    m_fileCombo->hide();
+    m_browseButton->hide();
+    m_urlLabel->hide();
+    m_urlCombo->hide();
+
+    QSharedPointer<RecentFiles> rf = m_recentFiles[id];
+    m_fileCombo->clear();
+    m_urlCombo->clear();
+
     switch (m_argTypes[id]) {
         
     case NoArg:
-        m_argLabel->hide();
-        m_argEdit->hide();
-        m_browseButton->hide();
         break;
 
     case FileArg:
-        m_argLabel->setText(tr("File:"));
-        m_argLabel->show();
-        m_argEdit->show();
+        m_fileLabel->setText(tr("File:"));
+        m_fileLabel->show();
+        m_fileCombo->show();
+        m_fileCombo->addItems(rf->getRecent());
         m_browseButton->show();
         break;
 
     case DirectoryArg:
-        m_argLabel->setText(tr("Folder:"));
-        m_argLabel->show();
-        m_argEdit->show();
+        m_fileLabel->setText(tr("Folder:"));
+        m_fileLabel->show();
+        m_fileCombo->show();
+        m_fileCombo->addItems(rf->getRecent());
         m_browseButton->show();
         break;
 
     case UrlArg:
-        m_argLabel->setText(tr("URL:"));
-        m_argLabel->show();
-        m_argEdit->show();
-        m_browseButton->hide();
+        m_urlLabel->show();
+        m_urlCombo->show();
         break;
 
-    case FileOrUrlArg:
-        m_argLabel->setText(tr("File or URL:"));
-        m_argLabel->show();
-        m_argEdit->show();
+    case UrlToDirectoryArg:
+        m_urlLabel->show();
+        m_urlCombo->show();
+        m_urlCombo->addItems(rf->getRecent());
+        m_fileLabel->setText(tr("Folder:"));
+        m_fileLabel->show();
+        m_fileCombo->show();
+        m_fileCombo->lineEdit()->setText(QDir::homePath());
         m_browseButton->show();
         break;
     }
 
-    if (m_argTypes[id] != NoArg) {
-        QSharedPointer<RecentFiles> rf = m_recentFiles[id];
-        m_argEdit->clear();
-        m_argEdit->addItems(rf->getRecent());
-    }
-
     adjustSize();
 }
 
--- a/multichoicedialog.h	Thu Nov 18 15:29:48 2010 +0000
+++ b/multichoicedialog.h	Thu Nov 18 17:36:53 2010 +0000
@@ -44,7 +44,7 @@
         FileArg,
         DirectoryArg,
         UrlArg,
-        FileOrUrlArg
+        UrlToDirectoryArg
     };
 
     void addChoice(QString identifier, QString text,
@@ -53,11 +53,14 @@
     void setCurrentChoice(QString);
     QString getCurrentChoice();
     QString getArgument();
+    QString getAdditionalArgument();
 
-    static void addRecentArgument(QString identifier, QString name);
+    static void addRecentArgument(QString identifier, QString name,
+                                  bool additionalArgument = false);
 
 private slots:
     void choiceChanged();
+    void urlChanged(const QString &);
     void browse();
 
 private:
@@ -71,9 +74,11 @@
 
     QHBoxLayout *m_choiceLayout;
     QLabel *m_descriptionLabel;
-    QLabel *m_argLabel;
-    QComboBox *m_argEdit;
+    QLabel *m_fileLabel;
+    QComboBox *m_fileCombo;
     QAbstractButton *m_browseButton;
+    QLabel *m_urlLabel;
+    QComboBox *m_urlCombo;
 };
 
 #endif // MULTICHOICEDIALOG_H
--- a/selectablelabel.cpp	Thu Nov 18 15:29:48 2010 +0000
+++ b/selectablelabel.cpp	Thu Nov 18 17:36:53 2010 +0000
@@ -27,8 +27,6 @@
     m_selected(false)
 {
     setTextFormat(Qt::RichText);
-//    setLineWidth(2);
-//    setFixedWidth(480);
     setupStyle();
     setOpenExternalLinks(true);
 }
@@ -70,20 +68,12 @@
 
     if (m_selected) {
         setStyleSheet
-            (QString("QLabel:hover { background: %1; color: %3; } "
-                     "QLabel:!hover { background: %2; color: %3 } "
-                     "QLabel { padding: 7px }")
-             .arg(palette.highlight().color().name())
-             .arg(palette.highlight().color().name())
-             .arg(palette.text().color().name()));
+            (QString("QLabel { background: %1; border: 1px solid %2; padding: 7px } ")
+             .arg(palette.light().color().name())
+             .arg(palette.dark().color().name()));
     } else {
         setStyleSheet
-            (QString("QLabel:hover { background: %1; color: %3; } "
-                     "QLabel:!hover { background: %2; color: %3 } "
-                     "QLabel { padding: 7px }")
-             .arg(palette.button().color().name())
-             .arg(palette.light().color().name())
-             .arg(palette.text().color().name()));
+            (QString("QLabel { border: 0; padding: 7px } "));
     }
 }    
 
--- a/startupdialog.cpp	Thu Nov 18 15:29:48 2010 +0000
+++ b/startupdialog.cpp	Thu Nov 18 17:36:53 2010 +0000
@@ -36,7 +36,7 @@
     QGridLayout *layout = new QGridLayout;
     int row = 0;
 
-    layout->addWidget(new QLabel(tr("<qt><big><bold>Welcome to EasyMercurial!</qt></bold></big><br>How would you like to be identified in commit messages?")),
+    layout->addWidget(new QLabel(tr("<qt><big>Welcome to EasyMercurial!</qt></big><br>How would you like to be identified in commit messages?")),
 		      row++, 0, 1, 2);
 
     layout->addWidget(new QLabel(tr("Name:")), row, 0);