Mercurial > hg > easyhg
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); |