annotate multichoicedialog.cpp @ 69:6d5a5571caec

* Basic working "Open Repository" dialog
author Chris Cannam
date Thu, 18 Nov 2010 15:14:39 +0000
parents b918e57c7bea
children 121cb1032717
rev   line source
Chris@67 1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
Chris@67 2
Chris@67 3 /*
Chris@67 4 EasyMercurial
Chris@67 5
Chris@67 6 Based on HgExplorer by Jari Korhonen
Chris@67 7 Copyright (c) 2010 Jari Korhonen
Chris@67 8 Copyright (c) 2010 Chris Cannam
Chris@67 9 Copyright (c) 2010 Queen Mary, University of London
Chris@67 10
Chris@67 11 This program is free software; you can redistribute it and/or
Chris@67 12 modify it under the terms of the GNU General Public License as
Chris@67 13 published by the Free Software Foundation; either version 2 of the
Chris@67 14 License, or (at your option) any later version. See the file
Chris@67 15 COPYING included with this distribution for more information.
Chris@67 16 */
Chris@67 17
Chris@67 18 #include "multichoicedialog.h"
Chris@67 19
Chris@69 20 #include "selectablelabel.h"
Chris@69 21
Chris@69 22 #include "debug.h"
Chris@69 23
Chris@68 24 #include <QDialogButtonBox>
Chris@69 25 #include <QToolButton>
Chris@69 26 #include <QPushButton>
Chris@69 27 #include <QFont>
Chris@69 28 #include <QDir>
Chris@69 29 #include <QFileDialog>
Chris@68 30
Chris@68 31 MultiChoiceDialog::MultiChoiceDialog(QString title, QString heading, QWidget *parent) :
Chris@67 32 QDialog(parent)
Chris@67 33 {
Chris@68 34 setModal(true);
Chris@68 35 setWindowTitle(title);
Chris@68 36
Chris@68 37 QGridLayout *outer = new QGridLayout;
Chris@68 38 setLayout(outer);
Chris@68 39
Chris@68 40 outer->addWidget(new QLabel(heading), 0, 0, 1, 3);
Chris@68 41
Chris@68 42 QWidget *innerWidget = new QWidget;
Chris@69 43 outer->addWidget(innerWidget, 1, 0, 1, 3);
Chris@69 44 m_choiceLayout = new QHBoxLayout;
Chris@68 45 innerWidget->setLayout(m_choiceLayout);
Chris@68 46
Chris@68 47 m_descriptionLabel = new QLabel;
Chris@68 48 outer->addWidget(m_descriptionLabel, 2, 0, 1, 3);
Chris@68 49
Chris@69 50 QFont f = m_descriptionLabel->font();
Chris@69 51 f.setPointSize(f.pointSize() * 0.9);
Chris@69 52 m_descriptionLabel->setFont(f);
Chris@69 53
Chris@68 54 m_argLabel = new QLabel();
Chris@68 55 outer->addWidget(m_argLabel, 3, 0);
Chris@68 56
Chris@69 57 m_argEdit = new QComboBox();
Chris@69 58 m_argEdit->setEditable(true);
Chris@68 59 outer->addWidget(m_argEdit, 3, 1);
Chris@69 60 outer->setColumnStretch(1, 20);
Chris@68 61
Chris@68 62 m_browseButton = new QPushButton(tr("Browse..."));
Chris@68 63 outer->addWidget(m_browseButton, 3, 2);
Chris@69 64 connect(m_browseButton, SIGNAL(clicked()), this, SLOT(browse()));
Chris@68 65
Chris@68 66 QDialogButtonBox *bbox = new QDialogButtonBox(QDialogButtonBox::Ok |
Chris@68 67 QDialogButtonBox::Cancel);
Chris@68 68 connect(bbox, SIGNAL(accepted()), this, SLOT(accept()));
Chris@68 69 connect(bbox, SIGNAL(rejected()), this, SLOT(reject()));
Chris@68 70 outer->addWidget(bbox, 4, 0, 1, 3);
Chris@69 71
Chris@69 72 setMinimumWidth(480);
Chris@67 73 }
Chris@68 74
Chris@69 75 QString
Chris@69 76 MultiChoiceDialog::getCurrentChoice()
Chris@69 77 {
Chris@69 78 return m_currentChoice;
Chris@69 79 }
Chris@69 80
Chris@69 81 void
Chris@69 82 MultiChoiceDialog::setCurrentChoice(QString c)
Chris@69 83 {
Chris@69 84 m_currentChoice = c;
Chris@69 85 choiceChanged();
Chris@69 86 }
Chris@69 87
Chris@69 88 QString
Chris@69 89 MultiChoiceDialog::getArgument()
Chris@69 90 {
Chris@69 91 return m_argEdit->currentText();
Chris@69 92 }
Chris@69 93
Chris@69 94 void
Chris@69 95 MultiChoiceDialog::addRecentArgument(QString id, QString arg)
Chris@69 96 {
Chris@69 97 RecentFiles(QString("Recent-%1").arg(id)).addFile(arg);
Chris@69 98 }
Chris@69 99
Chris@69 100 void
Chris@69 101 MultiChoiceDialog::addChoice(QString id, QString text,
Chris@69 102 QString description, ArgType arg)
Chris@69 103 {
Chris@69 104 bool first = (m_texts.empty());
Chris@69 105
Chris@69 106 m_texts[id] = text;
Chris@69 107 m_descriptions[id] = description;
Chris@69 108 m_argTypes[id] = arg;
Chris@69 109
Chris@69 110 if (arg != NoArg) {
Chris@69 111 m_recentFiles[id] = QSharedPointer<RecentFiles>
Chris@69 112 (new RecentFiles(QString("Recent-%1").arg(id)));
Chris@69 113 }
Chris@69 114
Chris@69 115 SelectableLabel *cb = new SelectableLabel;
Chris@69 116 cb->setSelectedText(text);
Chris@69 117 cb->setUnselectedText(text);
Chris@69 118
Chris@69 119 m_choiceLayout->addWidget(cb);
Chris@69 120 m_choiceButtons[cb] = id;
Chris@69 121
Chris@69 122 connect(cb, SIGNAL(selectionChanged()), this, SLOT(choiceChanged()));
Chris@69 123
Chris@69 124 if (first) {
Chris@69 125 m_currentChoice = id;
Chris@69 126 choiceChanged();
Chris@69 127 }
Chris@69 128 }
Chris@69 129
Chris@69 130 void
Chris@69 131 MultiChoiceDialog::browse()
Chris@69 132 {
Chris@69 133 QString origin = getArgument();
Chris@69 134
Chris@69 135 if (origin == "") {
Chris@69 136 #ifdef Q_OS_WIN32
Chris@69 137 origin = "c:";
Chris@69 138 #else
Chris@69 139 origin = QDir::homePath();
Chris@69 140 #endif
Chris@69 141 }
Chris@69 142
Chris@69 143 QString path = origin;
Chris@69 144
Chris@69 145 if (m_argTypes[m_currentChoice] == DirectoryArg) {
Chris@69 146
Chris@69 147 path = QFileDialog::getExistingDirectory
Chris@69 148 (this, tr("Open Directory"), origin,
Chris@69 149 QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks);
Chris@69 150 if (path != QString()) {
Chris@69 151 m_argEdit->lineEdit()->setText(path + QDir::separator());
Chris@69 152 }
Chris@69 153
Chris@69 154 } else {
Chris@69 155
Chris@69 156 path = QFileDialog::getOpenFileName
Chris@69 157 (this, tr("Open File"), origin);
Chris@69 158 if (path != QString()) {
Chris@69 159 m_argEdit->lineEdit()->setText(path);
Chris@69 160 }
Chris@69 161 }
Chris@69 162 }
Chris@69 163
Chris@69 164 void
Chris@69 165 MultiChoiceDialog::choiceChanged()
Chris@69 166 {
Chris@69 167 DEBUG << "choiceChanged" << endl;
Chris@69 168
Chris@69 169 if (m_choiceButtons.empty()) return;
Chris@69 170
Chris@69 171 QString id = "";
Chris@69 172
Chris@69 173 QObject *s = sender();
Chris@69 174 QWidget *w = qobject_cast<QWidget *>(s);
Chris@69 175 if (w) id = m_choiceButtons[w];
Chris@69 176
Chris@69 177 if (id == m_currentChoice) return;
Chris@69 178 if (id == "") {
Chris@69 179 // Happens when this is called for the very first time, when
Chris@69 180 // m_currentChoice has been set to the intended ID but no
Chris@69 181 // button has actually been pressed -- then we need to
Chris@69 182 // initialise
Chris@69 183 id = m_currentChoice;
Chris@69 184 }
Chris@69 185
Chris@69 186 m_currentChoice = id;
Chris@69 187
Chris@69 188 foreach (QWidget *cw, m_choiceButtons.keys()) {
Chris@69 189 SelectableLabel *sl = qobject_cast<SelectableLabel *>(cw);
Chris@69 190 if (sl) {
Chris@69 191 sl->setSelected(m_choiceButtons[cw] == id);
Chris@69 192 }
Chris@69 193 }
Chris@69 194
Chris@69 195 m_descriptionLabel->setText(m_descriptions[id]);
Chris@69 196
Chris@69 197 switch (m_argTypes[id]) {
Chris@69 198
Chris@69 199 case NoArg:
Chris@69 200 m_argLabel->hide();
Chris@69 201 m_argEdit->hide();
Chris@69 202 m_browseButton->hide();
Chris@69 203 break;
Chris@69 204
Chris@69 205 case FileArg:
Chris@69 206 m_argLabel->setText(tr("File:"));
Chris@69 207 m_argLabel->show();
Chris@69 208 m_argEdit->show();
Chris@69 209 m_browseButton->show();
Chris@69 210 break;
Chris@69 211
Chris@69 212 case DirectoryArg:
Chris@69 213 m_argLabel->setText(tr("Folder:"));
Chris@69 214 m_argLabel->show();
Chris@69 215 m_argEdit->show();
Chris@69 216 m_browseButton->show();
Chris@69 217 break;
Chris@69 218
Chris@69 219 case UrlArg:
Chris@69 220 m_argLabel->setText(tr("URL:"));
Chris@69 221 m_argLabel->show();
Chris@69 222 m_argEdit->show();
Chris@69 223 m_browseButton->hide();
Chris@69 224 break;
Chris@69 225
Chris@69 226 case FileOrUrlArg:
Chris@69 227 m_argLabel->setText(tr("File or URL:"));
Chris@69 228 m_argLabel->show();
Chris@69 229 m_argEdit->show();
Chris@69 230 m_browseButton->show();
Chris@69 231 break;
Chris@69 232 }
Chris@69 233
Chris@69 234 if (m_argTypes[id] != NoArg) {
Chris@69 235 QSharedPointer<RecentFiles> rf = m_recentFiles[id];
Chris@69 236 m_argEdit->clear();
Chris@69 237 m_argEdit->addItems(rf->getRecent());
Chris@69 238 }
Chris@69 239
Chris@69 240 adjustSize();
Chris@69 241 }
Chris@69 242
Chris@69 243