Mercurial > hg > easyhg
diff src/multichoicedialog.cpp @ 370:b9c153e00e84
Move source files to src/
author | Chris Cannam |
---|---|
date | Thu, 24 Mar 2011 10:27:51 +0000 |
parents | multichoicedialog.cpp@3824e8bb91eb |
children | a582c6417004 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/multichoicedialog.cpp Thu Mar 24 10:27:51 2011 +0000 @@ -0,0 +1,345 @@ +/* -*- 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 "multichoicedialog.h" + +#include "selectablelabel.h" + +#include "debug.h" + +#include <QDialogButtonBox> +#include <QToolButton> +#include <QPushButton> +#include <QFont> +#include <QDir> +#include <QFileDialog> +#include <QUrl> + +MultiChoiceDialog::MultiChoiceDialog(QString title, QString heading, QWidget *parent) : + QDialog(parent) +{ + setModal(true); + setWindowTitle(title); + + QGridLayout *outer = new QGridLayout; + setLayout(outer); + + outer->addWidget(new QLabel(heading), 0, 0, 1, 3); + + QWidget *innerWidget = new QWidget; + outer->addWidget(innerWidget, 1, 0, 1, 3); + m_choiceLayout = new QHBoxLayout; + innerWidget->setLayout(m_choiceLayout); + + m_descriptionLabel = new QLabel; + outer->addWidget(m_descriptionLabel, 2, 0, 1, 3); + + QFont f = m_descriptionLabel->font(); + f.setPointSize(f.pointSize() * 0.95); + m_descriptionLabel->setFont(f); + + m_urlLabel = new QLabel(tr("&URL:")); + outer->addWidget(m_urlLabel, 3, 0); + + m_urlCombo = new QComboBox(); + m_urlCombo->setEditable(true); + m_urlLabel->setBuddy(m_urlCombo); + 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); + m_fileLabel->setBuddy(m_fileCombo); + connect(m_fileCombo, SIGNAL(editTextChanged(const QString &)), + this, SLOT(fileChanged(const QString &))); + outer->addWidget(m_fileCombo, 4, 1); + outer->setColumnStretch(1, 20); + + m_browseButton = new QPushButton(tr("Browse...")); + 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, 5, 0, 1, 3); + + m_okButton = bbox->button(QDialogButtonBox::Ok); + updateOkButton(); + + setMinimumWidth(480); +} + +QString +MultiChoiceDialog::getCurrentChoice() +{ + return m_currentChoice; +} + +void +MultiChoiceDialog::setCurrentChoice(QString c) +{ + m_currentChoice = c; + choiceChanged(); +} + +QString +MultiChoiceDialog::getArgument() +{ + 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, + bool additionalArgument) +{ + if (additionalArgument) { + RecentFiles(QString("Recent-%1-add").arg(id)).addFile(arg); + } else { + RecentFiles(QString("Recent-%1").arg(id)).addFile(arg); + } +} + +void +MultiChoiceDialog::addChoice(QString id, QString text, + QString description, ArgType arg) +{ + bool first = (m_texts.empty()); + + m_texts[id] = text; + m_descriptions[id] = description; + m_argTypes[id] = arg; + + if (arg != NoArg) { + m_recentFiles[id] = QSharedPointer<RecentFiles> + (new RecentFiles(QString("Recent-%1").arg(id))); + } + + SelectableLabel *cb = new SelectableLabel; + cb->setSelectedText(text); + cb->setUnselectedText(text); + cb->setMaximumWidth(270); + + m_choiceLayout->addWidget(cb); + m_choiceButtons[cb] = id; + + connect(cb, SIGNAL(selectionChanged()), this, SLOT(choiceChanged())); + + if (first) { + m_currentChoice = id; + choiceChanged(); + } +} + +QString +MultiChoiceDialog::getDefaultPath() const +{ + QDir home(QDir::home()); + QDir dflt; + + dflt = QDir(home.filePath(tr("My Documents"))); + DEBUG << "testing " << dflt << endl; + if (dflt.exists()) return dflt.canonicalPath(); + + dflt = QDir(home.filePath(tr("Documents"))); + DEBUG << "testing " << dflt << endl; + if (dflt.exists()) return dflt.canonicalPath(); + + DEBUG << "all failed, returning " << home << endl; + return home.canonicalPath(); +} + +void +MultiChoiceDialog::browse() +{ + QString origin = getArgument(); + + if (origin == "") { + origin = getDefaultPath(); + } + + QString path = origin; + + 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_fileCombo->lineEdit()->setText(path + QDir::separator()); + } + + } else { + + path = QFileDialog::getOpenFileName + (this, tr("Open File"), origin); + if (path != QString()) { + m_fileCombo->lineEdit()->setText(path); + } + } +} + +void +MultiChoiceDialog::urlChanged(const QString &s) +{ + updateOkButton(); +} + +void +MultiChoiceDialog::fileChanged(const QString &s) +{ + updateOkButton(); +} + +void +MultiChoiceDialog::updateOkButton() +{ +/* This doesn't work well + 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)); +*/ + if (m_argTypes[m_currentChoice] == UrlToDirectoryArg) { + m_okButton->setEnabled(getArgument() != "" && + getAdditionalArgument() != ""); + } else { + m_okButton->setEnabled(getArgument() != ""); + } +} + +void +MultiChoiceDialog::choiceChanged() +{ + DEBUG << "choiceChanged" << endl; + + if (m_choiceButtons.empty()) return; + + QString id = ""; + + QObject *s = sender(); + QWidget *w = qobject_cast<QWidget *>(s); + if (w) id = m_choiceButtons[w]; + + if (id == m_currentChoice) return; + if (id == "") { + // Happens when this is called for the very first time, when + // m_currentChoice has been set to the intended ID but no + // button has actually been pressed -- then we need to + // initialise + id = m_currentChoice; + } + + m_currentChoice = id; + + foreach (QWidget *cw, m_choiceButtons.keys()) { + SelectableLabel *sl = qobject_cast<SelectableLabel *>(cw); + if (sl) { + sl->setSelected(m_choiceButtons[cw] == id); + } + } + + 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: + break; + + case FileArg: + m_fileLabel->setText(tr("&File:")); + m_fileLabel->show(); + m_fileCombo->show(); + m_fileCombo->addItems(rf->getRecent()); + m_browseButton->show(); + break; + + case DirectoryArg: + m_fileLabel->setText(tr("&Folder:")); + m_fileLabel->show(); + m_fileCombo->show(); + m_fileCombo->addItems(rf->getRecent()); + m_browseButton->show(); + break; + + case UrlArg: + m_urlLabel->show(); + m_urlCombo->show(); + m_urlCombo->addItems(rf->getRecent()); + break; + + 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(getDefaultPath()); + m_browseButton->show(); + break; + } + + updateOkButton(); + adjustSize(); +} + +