comparison filestatuswidget.cpp @ 329:ef977e7482cd

Merge from branch "filelist_right_button_menu"
author Chris Cannam
date Fri, 11 Mar 2011 18:08:35 +0000
parents ea62eb083ed4
children acfe9390d5c6
comparison
equal deleted inserted replaced
322:913d213dd427 329:ef977e7482cd
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
121 FileStates::Activities activities = m_fileStates.activitiesSupportedBy(s);
122 int prevGroup = -1;
123 foreach (FileStates::Activity a, activities) {
124 // Skip activities which are not yet implemented
125 if (a == FileStates::Annotate ||
126 a == FileStates::Ignore ||
127 a == FileStates::UnIgnore) {
128 continue;
129 }
130 int group = FileStates::activityGroup(a);
131 if (group != prevGroup && prevGroup != -1) {
132 QAction *sep = new QAction("", w);
133 sep->setSeparator(true);
134 w->insertAction(0, sep);
135 }
136 prevGroup = group;
137 QAction *act = new QAction(m_actionLabels[a], w);
138 act->setProperty("state", s);
139 act->setProperty("activity", a);
140 connect(act, SIGNAL(triggered()), this, SLOT(menuActionActivated()));
141 w->insertAction(0, act);
142 }
143 w->setContextMenuPolicy(Qt::ActionsContextMenu);
108 144
109 boxlayout->addItem(new QSpacerItem(2, 2), 3, 0); 145 boxlayout->addItem(new QSpacerItem(2, 2), 3, 0);
110 146
111 boxesLayout->addWidget(box, ++boxRow, 0); 147 boxesLayout->addWidget(box, ++boxRow, 0);
112 m_boxes.push_back(box); 148 m_boxes.push_back(box);
171 m_noModificationsLabel->setText 207 m_noModificationsLabel->setText
172 (tr("<qt>You have no uncommitted changes.</qt>")); 208 (tr("<qt>You have no uncommitted changes.</qt>"));
173 } 209 }
174 } 210 }
175 211
212
213 void FileStatusWidget::menuActionActivated()
214 {
215 QAction *act = qobject_cast<QAction *>(sender());
216 if (!act) return;
217
218 FileStates::State state = (FileStates::State)
219 act->property("state").toUInt();
220 FileStates::Activity activity = (FileStates::Activity)
221 act->property("activity").toUInt();
222
223 DEBUG << "menuActionActivated: state = " << state << ", activity = "
224 << activity << endl;
225
226 if (!FileStates::supportsActivity(state, activity)) {
227 std::cerr << "WARNING: FileStatusWidget::menuActionActivated: "
228 << "Action state " << state << " does not support activity "
229 << activity << std::endl;
230 return;
231 }
232
233 QStringList files = getSelectedFilesInState(state);
234
235 switch (activity) {
236 case FileStates::Annotate: emit annotateFiles(files); break;
237 case FileStates::Diff: emit diffFiles(files); break;
238 case FileStates::Commit: emit commitFiles(files); break;
239 case FileStates::Revert: emit revertFiles(files); break;
240 case FileStates::Add: emit addFiles(files); break;
241 case FileStates::Remove: emit removeFiles(files); break;
242 case FileStates::RedoMerge: emit redoFileMerges(files); break;
243 case FileStates::MarkResolved: emit markFilesResolved(files); break;
244 case FileStates::Ignore: emit ignoreFiles(files); break;
245 case FileStates::UnIgnore: emit unIgnoreFiles(files); break;
246 }
247 }
248
249
176 void FileStatusWidget::itemSelectionChanged() 250 void FileStatusWidget::itemSelectionChanged()
177 { 251 {
178 DEBUG << "FileStatusWidget::itemSelectionChanged" << endl; 252 DEBUG << "FileStatusWidget::itemSelectionChanged" << endl;
179 253
180 QListWidget *list = qobject_cast<QListWidget *>(sender()); 254 QListWidget *list = qobject_cast<QListWidget *>(sender());
210 } 284 }
211 } 285 }
212 286
213 bool FileStatusWidget::haveChangesToCommit() const 287 bool FileStatusWidget::haveChangesToCommit() const
214 { 288 {
215 return !m_fileStates.added().empty() || 289 return !getAllCommittableFiles().empty();
216 !m_fileStates.removed().empty() ||
217 !m_fileStates.modified().empty();
218 } 290 }
219 291
220 bool FileStatusWidget::haveSelection() const 292 bool FileStatusWidget::haveSelection() const
221 { 293 {
222 return !m_selectedFiles.empty(); 294 return !m_selectedFiles.empty();
223 } 295 }
224 296
225 QStringList FileStatusWidget::getAllSelectedFiles() const 297 QStringList FileStatusWidget::getSelectedFilesInState(FileStates::State s) const
226 {
227 return m_selectedFiles;
228 }
229
230 QStringList FileStatusWidget::getSelectedCommittableFiles() const
231 { 298 {
232 QStringList files; 299 QStringList files;
233 foreach (QString f, m_selectedFiles) { 300 foreach (QString f, m_selectedFiles) {
234 switch (m_fileStates.getStateOfFile(f)) { 301 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 } 302 }
243 return files; 303 return files;
244 } 304 }
245 305
246 QStringList FileStatusWidget::getAllCommittableFiles() const 306 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 { 307 {
257 QStringList files; 308 QStringList files;
258 foreach (QString f, m_selectedFiles) { 309 foreach (QString f, m_selectedFiles) {
259 switch (m_fileStates.getStateOfFile(f)) { 310 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 } 311 }
270 return files; 312 return files;
313 }
314
315 QStringList FileStatusWidget::getAllCommittableFiles() const
316 {
317 return m_fileStates.filesSupportingActivity(FileStates::Commit);
271 } 318 }
272 319
273 QStringList FileStatusWidget::getAllRevertableFiles() const 320 QStringList FileStatusWidget::getAllRevertableFiles() const
274 { 321 {
275 QStringList files; 322 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 } 323 }
297 324
298 QStringList FileStatusWidget::getAllUnresolvedFiles() const 325 QStringList FileStatusWidget::getAllUnresolvedFiles() const
299 { 326 {
300 QStringList files; 327 return m_fileStates.filesInState(FileStates::InConflict);
301 files << m_fileStates.getFilesInState(FileStates::InConflict);
302 return files;
303 } 328 }
304 329
305 QStringList FileStatusWidget::getSelectedAddableFiles() const 330 QStringList FileStatusWidget::getSelectedAddableFiles() const
306 { 331 {
307 QStringList files; 332 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 } 333 }
327 334
328 QStringList FileStatusWidget::getSelectedRemovableFiles() const 335 QStringList FileStatusWidget::getSelectedRemovableFiles() const
329 { 336 {
330 QStringList files; 337 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 } 338 }
356 339
357 QString 340 QString
358 FileStatusWidget::localPath() const 341 FileStatusWidget::localPath() const
359 { 342 {
401 384
402 foreach (FileStates::State s, m_stateListMap.keys()) { 385 foreach (FileStates::State s, m_stateListMap.keys()) {
403 386
404 QListWidget *w = m_stateListMap[s]; 387 QListWidget *w = m_stateListMap[s];
405 w->clear(); 388 w->clear();
406 QStringList files = m_fileStates.getFilesInState(s); 389 QStringList files = m_fileStates.filesInState(s);
407 390
408 QStringList highPriority, lowPriority; 391 QStringList highPriority, lowPriority;
409 392
410 foreach (QString file, files) { 393 foreach (QString file, files) {
411 394
432 } 415 }
433 416
434 foreach (QString file, highPriority) { 417 foreach (QString file, highPriority) {
435 QListWidgetItem *item = new QListWidgetItem(file); 418 QListWidgetItem *item = new QListWidgetItem(file);
436 w->addItem(item); 419 w->addItem(item);
437 item->setForeground(QColor("#d40000")); //!!! and a nice gold star 420 item->setForeground(QColor("#d40000"));
438 item->setSelected(selectedFiles.contains(file)); 421 item->setSelected(selectedFiles.contains(file));
439 } 422 }
440 423
441 foreach (QString file, lowPriority) { 424 foreach (QString file, lowPriority) {
442 QListWidgetItem *item = new QListWidgetItem(file); 425 QListWidgetItem *item = new QListWidgetItem(file);