comparison filestatuswidget.cpp @ 336:4229b6a8e9c6

Merge
author Chris Cannam
date Mon, 14 Mar 2011 10:00:29 +0000
parents acfe9390d5c6
children bb189827f6d1
comparison
equal deleted inserted replaced
335:aa852b477e4d 336:4229b6a8e9c6
29 #include <QToolButton> 29 #include <QToolButton>
30 #include <QDir> 30 #include <QDir>
31 #include <QProcess> 31 #include <QProcess>
32 #include <QCheckBox> 32 #include <QCheckBox>
33 #include <QSettings> 33 #include <QSettings>
34 #include <QAction>
34 35
35 FileStatusWidget::FileStatusWidget(QWidget *parent) : 36 FileStatusWidget::FileStatusWidget(QWidget *parent) :
36 QWidget(parent), 37 QWidget(parent),
37 m_dateReference(0) 38 m_dateReference(0)
38 { 39 {
53 m_simpleLabels[FileStates::Removed] = tr("Removed:"); 54 m_simpleLabels[FileStates::Removed] = tr("Removed:");
54 m_simpleLabels[FileStates::Missing] = tr("Missing:"); 55 m_simpleLabels[FileStates::Missing] = tr("Missing:");
55 m_simpleLabels[FileStates::InConflict] = tr("In Conflict:"); 56 m_simpleLabels[FileStates::InConflict] = tr("In Conflict:");
56 m_simpleLabels[FileStates::Unknown] = tr("Untracked:"); 57 m_simpleLabels[FileStates::Unknown] = tr("Untracked:");
57 m_simpleLabels[FileStates::Ignored] = tr("Ignored:"); 58 m_simpleLabels[FileStates::Ignored] = tr("Ignored:");
59
60 m_actionLabels[FileStates::Annotate] = tr("Show annotated version");
61 m_actionLabels[FileStates::Diff] = tr("Diff to parent");
62 m_actionLabels[FileStates::Commit] = tr("Commit...");
63 m_actionLabels[FileStates::Revert] = tr("Revert to last committed state");
64 m_actionLabels[FileStates::Add] = tr("Add to version control");
65 m_actionLabels[FileStates::Remove] = tr("Remove from version control");
66 m_actionLabels[FileStates::RedoMerge] = tr("Redo merge");
67 m_actionLabels[FileStates::MarkResolved] = tr("Mark conflict as resolved");
68 m_actionLabels[FileStates::Ignore] = tr("Ignore");
69 m_actionLabels[FileStates::UnIgnore] = tr("Stop ignoring");
58 70
59 m_descriptions[FileStates::Clean] = tr("You have not changed these files."); 71 m_descriptions[FileStates::Clean] = tr("You have not changed these files.");
60 m_descriptions[FileStates::Modified] = tr("You have changed these files since you last committed them."); 72 m_descriptions[FileStates::Modified] = tr("You have changed these files since you last committed them.");
61 m_descriptions[FileStates::Added] = tr("These files will be added to version control next time you commit them."); 73 m_descriptions[FileStates::Added] = tr("These files will be added to version control next time you commit them.");
62 m_descriptions[FileStates::Removed] = tr("These files will be removed from version control next time you commit them.<br>" 74 m_descriptions[FileStates::Removed] = tr("These files will be removed from version control next time you commit them.<br>"
103 w->setSelectionMode(QListWidget::ExtendedSelection); 115 w->setSelectionMode(QListWidget::ExtendedSelection);
104 boxlayout->addWidget(w, 2, 0); 116 boxlayout->addWidget(w, 2, 0);
105 117
106 connect(w, SIGNAL(itemSelectionChanged()), 118 connect(w, SIGNAL(itemSelectionChanged()),
107 this, SLOT(itemSelectionChanged())); 119 this, SLOT(itemSelectionChanged()));
120 connect(w, SIGNAL(itemDoubleClicked(QListWidgetItem *)),
121 this, SLOT(itemDoubleClicked(QListWidgetItem *)));
122
123 FileStates::Activities activities = m_fileStates.activitiesSupportedBy(s);
124 int prevGroup = -1;
125 foreach (FileStates::Activity a, activities) {
126 // Skip activities which are not yet implemented
127 if (a == FileStates::Ignore ||
128 a == FileStates::UnIgnore) {
129 continue;
130 }
131 int group = FileStates::activityGroup(a);
132 if (group != prevGroup && prevGroup != -1) {
133 QAction *sep = new QAction("", w);
134 sep->setSeparator(true);
135 w->insertAction(0, sep);
136 }
137 prevGroup = group;
138 QAction *act = new QAction(m_actionLabels[a], w);
139 act->setProperty("state", s);
140 act->setProperty("activity", a);
141 connect(act, SIGNAL(triggered()), this, SLOT(menuActionActivated()));
142 w->insertAction(0, act);
143 }
144 w->setContextMenuPolicy(Qt::ActionsContextMenu);
108 145
109 boxlayout->addItem(new QSpacerItem(2, 2), 3, 0); 146 boxlayout->addItem(new QSpacerItem(2, 2), 3, 0);
110 147
111 boxesLayout->addWidget(box, ++boxRow, 0); 148 boxesLayout->addWidget(box, ++boxRow, 0);
112 m_boxes.push_back(box); 149 m_boxes.push_back(box);
171 m_noModificationsLabel->setText 208 m_noModificationsLabel->setText
172 (tr("<qt>You have no uncommitted changes.</qt>")); 209 (tr("<qt>You have no uncommitted changes.</qt>"));
173 } 210 }
174 } 211 }
175 212
213
214 void FileStatusWidget::menuActionActivated()
215 {
216 QAction *act = qobject_cast<QAction *>(sender());
217 if (!act) return;
218
219 FileStates::State state = (FileStates::State)
220 act->property("state").toUInt();
221 FileStates::Activity activity = (FileStates::Activity)
222 act->property("activity").toUInt();
223
224 DEBUG << "menuActionActivated: state = " << state << ", activity = "
225 << activity << endl;
226
227 if (!FileStates::supportsActivity(state, activity)) {
228 std::cerr << "WARNING: FileStatusWidget::menuActionActivated: "
229 << "Action state " << state << " does not support activity "
230 << activity << std::endl;
231 return;
232 }
233
234 QStringList files = getSelectedFilesInState(state);
235
236 switch (activity) {
237 case FileStates::Annotate: emit annotateFiles(files); break;
238 case FileStates::Diff: emit diffFiles(files); break;
239 case FileStates::Commit: emit commitFiles(files); break;
240 case FileStates::Revert: emit revertFiles(files); break;
241 case FileStates::Add: emit addFiles(files); break;
242 case FileStates::Remove: emit removeFiles(files); break;
243 case FileStates::RedoMerge: emit redoFileMerges(files); break;
244 case FileStates::MarkResolved: emit markFilesResolved(files); break;
245 case FileStates::Ignore: emit ignoreFiles(files); break;
246 case FileStates::UnIgnore: emit unIgnoreFiles(files); break;
247 }
248 }
249
250 void FileStatusWidget::itemDoubleClicked(QListWidgetItem *item)
251 {
252 QStringList files;
253 files << item->text();
254 emit annotateFiles(files);
255 }
256
176 void FileStatusWidget::itemSelectionChanged() 257 void FileStatusWidget::itemSelectionChanged()
177 { 258 {
178 DEBUG << "FileStatusWidget::itemSelectionChanged" << endl; 259 DEBUG << "FileStatusWidget::itemSelectionChanged" << endl;
179 260
180 QListWidget *list = qobject_cast<QListWidget *>(sender()); 261 QListWidget *list = qobject_cast<QListWidget *>(sender());
210 } 291 }
211 } 292 }
212 293
213 bool FileStatusWidget::haveChangesToCommit() const 294 bool FileStatusWidget::haveChangesToCommit() const
214 { 295 {
215 return !m_fileStates.added().empty() || 296 return !getAllCommittableFiles().empty();
216 !m_fileStates.removed().empty() ||
217 !m_fileStates.modified().empty();
218 } 297 }
219 298
220 bool FileStatusWidget::haveSelection() const 299 bool FileStatusWidget::haveSelection() const
221 { 300 {
222 return !m_selectedFiles.empty(); 301 return !m_selectedFiles.empty();
223 } 302 }
224 303
225 QStringList FileStatusWidget::getAllSelectedFiles() const 304 QStringList FileStatusWidget::getSelectedFilesInState(FileStates::State s) const
226 {
227 return m_selectedFiles;
228 }
229
230 QStringList FileStatusWidget::getSelectedCommittableFiles() const
231 { 305 {
232 QStringList files; 306 QStringList files;
233 foreach (QString f, m_selectedFiles) { 307 foreach (QString f, m_selectedFiles) {
234 switch (m_fileStates.getStateOfFile(f)) { 308 if (m_fileStates.stateOf(f) == s) files.push_back(f);
235 case FileStates::Added:
236 case FileStates::Modified:
237 case FileStates::Removed:
238 files.push_back(f);
239 break;
240 default: break;
241 }
242 } 309 }
243 return files; 310 return files;
244 } 311 }
245 312
246 QStringList FileStatusWidget::getAllCommittableFiles() const 313 QStringList FileStatusWidget::getSelectedFilesSupportingActivity(FileStates::Activity a) const
247 {
248 QStringList files;
249 files << m_fileStates.getFilesInState(FileStates::Modified);
250 files << m_fileStates.getFilesInState(FileStates::Added);
251 files << m_fileStates.getFilesInState(FileStates::Removed);
252 return files;
253 }
254
255 QStringList FileStatusWidget::getSelectedRevertableFiles() const
256 { 314 {
257 QStringList files; 315 QStringList files;
258 foreach (QString f, m_selectedFiles) { 316 foreach (QString f, m_selectedFiles) {
259 switch (m_fileStates.getStateOfFile(f)) { 317 if (m_fileStates.supportsActivity(f, a)) files.push_back(f);
260 case FileStates::Added:
261 case FileStates::Modified:
262 case FileStates::Removed:
263 case FileStates::Missing:
264 case FileStates::InConflict:
265 files.push_back(f);
266 break;
267 default: break;
268 }
269 } 318 }
270 return files; 319 return files;
320 }
321
322 QStringList FileStatusWidget::getAllCommittableFiles() const
323 {
324 return m_fileStates.filesSupportingActivity(FileStates::Commit);
271 } 325 }
272 326
273 QStringList FileStatusWidget::getAllRevertableFiles() const 327 QStringList FileStatusWidget::getAllRevertableFiles() const
274 { 328 {
275 QStringList files; 329 return m_fileStates.filesSupportingActivity(FileStates::Revert);
276 files << m_fileStates.getFilesInState(FileStates::Modified);
277 files << m_fileStates.getFilesInState(FileStates::Added);
278 files << m_fileStates.getFilesInState(FileStates::Removed);
279 files << m_fileStates.getFilesInState(FileStates::Missing);
280 files << m_fileStates.getFilesInState(FileStates::InConflict);
281 return files;
282 }
283
284 QStringList FileStatusWidget::getSelectedUnresolvedFiles() const
285 {
286 QStringList files;
287 foreach (QString f, m_selectedFiles) {
288 switch (m_fileStates.getStateOfFile(f)) {
289 case FileStates::InConflict:
290 files.push_back(f);
291 break;
292 default: break;
293 }
294 }
295 return files;
296 } 330 }
297 331
298 QStringList FileStatusWidget::getAllUnresolvedFiles() const 332 QStringList FileStatusWidget::getAllUnresolvedFiles() const
299 { 333 {
300 QStringList files; 334 return m_fileStates.filesInState(FileStates::InConflict);
301 files << m_fileStates.getFilesInState(FileStates::InConflict);
302 return files;
303 } 335 }
304 336
305 QStringList FileStatusWidget::getSelectedAddableFiles() const 337 QStringList FileStatusWidget::getSelectedAddableFiles() const
306 { 338 {
307 QStringList files; 339 return getSelectedFilesSupportingActivity(FileStates::Add);
308 foreach (QString f, m_selectedFiles) {
309 switch (m_fileStates.getStateOfFile(f)) {
310 case FileStates::Unknown:
311 case FileStates::Removed:
312 files.push_back(f);
313 break;
314 default: break;
315 }
316 }
317 return files;
318 }
319
320 QStringList FileStatusWidget::getAllAddableFiles() const
321 {
322 QStringList files;
323 files << m_fileStates.getFilesInState(FileStates::Removed);
324 files << m_fileStates.getFilesInState(FileStates::Unknown);
325 return files;
326 } 340 }
327 341
328 QStringList FileStatusWidget::getSelectedRemovableFiles() const 342 QStringList FileStatusWidget::getSelectedRemovableFiles() const
329 { 343 {
330 QStringList files; 344 return getSelectedFilesSupportingActivity(FileStates::Remove);
331 foreach (QString f, m_selectedFiles) {
332 switch (m_fileStates.getStateOfFile(f)) {
333 case FileStates::Clean:
334 case FileStates::Added:
335 case FileStates::Modified:
336 case FileStates::Missing:
337 case FileStates::InConflict:
338 files.push_back(f);
339 break;
340 default: break;
341 }
342 }
343 return files;
344 }
345
346 QStringList FileStatusWidget::getAllRemovableFiles() const
347 {
348 QStringList files;
349 files << m_fileStates.getFilesInState(FileStates::Clean);
350 files << m_fileStates.getFilesInState(FileStates::Added);
351 files << m_fileStates.getFilesInState(FileStates::Modified);
352 files << m_fileStates.getFilesInState(FileStates::Missing);
353 files << m_fileStates.getFilesInState(FileStates::InConflict);
354 return files;
355 } 345 }
356 346
357 QString 347 QString
358 FileStatusWidget::localPath() const 348 FileStatusWidget::localPath() const
359 { 349 {
401 391
402 foreach (FileStates::State s, m_stateListMap.keys()) { 392 foreach (FileStates::State s, m_stateListMap.keys()) {
403 393
404 QListWidget *w = m_stateListMap[s]; 394 QListWidget *w = m_stateListMap[s];
405 w->clear(); 395 w->clear();
406 QStringList files = m_fileStates.getFilesInState(s); 396 QStringList files = m_fileStates.filesInState(s);
407 397
408 QStringList highPriority, lowPriority; 398 QStringList highPriority, lowPriority;
409 399
410 foreach (QString file, files) { 400 foreach (QString file, files) {
411 401
432 } 422 }
433 423
434 foreach (QString file, highPriority) { 424 foreach (QString file, highPriority) {
435 QListWidgetItem *item = new QListWidgetItem(file); 425 QListWidgetItem *item = new QListWidgetItem(file);
436 w->addItem(item); 426 w->addItem(item);
437 item->setForeground(QColor("#d40000")); //!!! and a nice gold star 427 item->setForeground(QColor("#d40000"));
438 item->setSelected(selectedFiles.contains(file)); 428 item->setSelected(selectedFiles.contains(file));
439 } 429 }
440 430
441 foreach (QString file, lowPriority) { 431 foreach (QString file, lowPriority) {
442 QListWidgetItem *item = new QListWidgetItem(file); 432 QListWidgetItem *item = new QListWidgetItem(file);