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
|