annotate src/filestatuswidget.cpp @ 425:ad106f5fe75f

Add "Ignore Files" and "Edit Ignored List" to Work menu (latter is subsumed from Advanced menu formerly). Also subsume Serve via HTTP into File menu as Share Repository, and add a more helpful description of it. Remove Advanced menu
author Chris Cannam
date Thu, 23 Jun 2011 10:58:32 +0100
parents 653e9694a694
children c6ea3eb00635
rev   line source
Chris@88 1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
Chris@88 2
Chris@88 3 /*
Chris@88 4 EasyMercurial
Chris@88 5
Chris@88 6 Based on HgExplorer by Jari Korhonen
Chris@88 7 Copyright (c) 2010 Jari Korhonen
Chris@244 8 Copyright (c) 2011 Chris Cannam
Chris@244 9 Copyright (c) 2011 Queen Mary, University of London
Chris@88 10
Chris@88 11 This program is free software; you can redistribute it and/or
Chris@88 12 modify it under the terms of the GNU General Public License as
Chris@88 13 published by the Free Software Foundation; either version 2 of the
Chris@88 14 License, or (at your option) any later version. See the file
Chris@88 15 COPYING included with this distribution for more information.
Chris@88 16 */
Chris@88 17
Chris@88 18 #include "filestatuswidget.h"
Chris@115 19 #include "debug.h"
Chris@115 20 #include "multichoicedialog.h"
Chris@88 21
Chris@88 22 #include <QLabel>
Chris@88 23 #include <QListWidget>
Chris@88 24 #include <QGridLayout>
Chris@93 25 #include <QFileInfo>
Chris@93 26 #include <QApplication>
Chris@93 27 #include <QDateTime>
Chris@115 28 #include <QPushButton>
Chris@186 29 #include <QToolButton>
Chris@186 30 #include <QDir>
Chris@186 31 #include <QProcess>
Chris@199 32 #include <QCheckBox>
Chris@230 33 #include <QSettings>
Chris@323 34 #include <QAction>
Chris@88 35
Chris@88 36 FileStatusWidget::FileStatusWidget(QWidget *parent) :
Chris@93 37 QWidget(parent),
Chris@93 38 m_dateReference(0)
Chris@88 39 {
Chris@88 40 QGridLayout *layout = new QGridLayout;
Chris@215 41 layout->setMargin(10);
Chris@88 42 setLayout(layout);
Chris@88 43
Chris@88 44 int row = 0;
Chris@211 45
Chris@230 46 m_noModificationsLabel = new QLabel;
Chris@230 47 setNoModificationsLabelText();
Chris@297 48 layout->addWidget(m_noModificationsLabel, row, 0);
Chris@202 49 m_noModificationsLabel->hide();
Chris@106 50
Chris@100 51 m_simpleLabels[FileStates::Clean] = tr("Unmodified:");
Chris@100 52 m_simpleLabels[FileStates::Modified] = tr("Modified:");
Chris@100 53 m_simpleLabels[FileStates::Added] = tr("Added:");
Chris@100 54 m_simpleLabels[FileStates::Removed] = tr("Removed:");
Chris@100 55 m_simpleLabels[FileStates::Missing] = tr("Missing:");
Chris@163 56 m_simpleLabels[FileStates::InConflict] = tr("In Conflict:");
Chris@100 57 m_simpleLabels[FileStates::Unknown] = tr("Untracked:");
Chris@199 58 m_simpleLabels[FileStates::Ignored] = tr("Ignored:");
Chris@99 59
Chris@326 60 m_actionLabels[FileStates::Annotate] = tr("Show annotated version");
Chris@326 61 m_actionLabels[FileStates::Diff] = tr("Diff to parent");
Chris@325 62 m_actionLabels[FileStates::Commit] = tr("Commit...");
Chris@328 63 m_actionLabels[FileStates::Revert] = tr("Revert to last committed state");
Chris@361 64 m_actionLabels[FileStates::Rename] = tr("Rename...");
Chris@361 65 m_actionLabels[FileStates::Copy] = tr("Copy...");
Chris@326 66 m_actionLabels[FileStates::Add] = tr("Add to version control");
Chris@326 67 m_actionLabels[FileStates::Remove] = tr("Remove from version control");
Chris@326 68 m_actionLabels[FileStates::RedoMerge] = tr("Redo merge");
Chris@328 69 m_actionLabels[FileStates::MarkResolved] = tr("Mark conflict as resolved");
Chris@413 70 m_actionLabels[FileStates::Ignore] = tr("Ignore...");
Chris@421 71 // Unignore is too difficult in fact, so we just offer to edit the hgignore
Chris@421 72 m_actionLabels[FileStates::UnIgnore] = tr("Edit .hgignore File");
Chris@325 73
Chris@100 74 m_descriptions[FileStates::Clean] = tr("You have not changed these files.");
Chris@100 75 m_descriptions[FileStates::Modified] = tr("You have changed these files since you last committed them.");
Chris@225 76 m_descriptions[FileStates::Added] = tr("These files will be added to version control next time you commit them.");
Chris@225 77 m_descriptions[FileStates::Removed] = tr("These files will be removed from version control next time you commit them.<br>"
Chris@100 78 "They will not be deleted from the local folder.");
Chris@109 79 m_descriptions[FileStates::Missing] = tr("These files are recorded in the version control, but absent from your working folder.<br>"
Chris@153 80 "If you intended to delete them, select them and use Remove to tell the version control system about it.<br>"
Chris@153 81 "If you deleted them by accident, select them and use Revert to restore their previous contents.");
Chris@163 82 m_descriptions[FileStates::InConflict] = tr("These files are unresolved following an incomplete merge.<br>Select a file and use Merge to try to resolve the merge again.");
Chris@100 83 m_descriptions[FileStates::Unknown] = tr("These files are in your working folder but are not under version control.<br>"
Chris@186 84 // "Select a file and use Add to place it under version control or Ignore to remove it from this list.");
Chris@186 85 "Select a file and use Add to place it under version control.");
Chris@199 86 m_descriptions[FileStates::Ignored] = tr("These files have names that match entries in the working folder's .hgignore file,<br>"
Chris@199 87 "and so will be ignored by the version control system.");
Chris@100 88
Chris@118 89 m_highlightExplanation = tr("Files highlighted <font color=#d40000>in red</font> "
Chris@100 90 "have appeared since your most recent commit or update.");
Chris@89 91
Chris@230 92 m_boxesParent = new QWidget(this);
Chris@297 93 layout->addWidget(m_boxesParent, ++row, 0);
Chris@230 94
Chris@230 95 QGridLayout *boxesLayout = new QGridLayout;
Chris@230 96 boxesLayout->setMargin(0);
Chris@230 97 m_boxesParent->setLayout(boxesLayout);
Chris@230 98 int boxRow = 0;
Chris@230 99
Chris@94 100 for (int i = int(FileStates::FirstState);
Chris@163 101 i <= int(FileStates::LastState); ++i) {
Chris@89 102
Chris@94 103 FileStates::State s = FileStates::State(i);
Chris@89 104
Chris@230 105 QWidget *box = new QWidget(m_boxesParent);
Chris@89 106 QGridLayout *boxlayout = new QGridLayout;
Chris@99 107 boxlayout->setMargin(0);
Chris@89 108 box->setLayout(boxlayout);
Chris@89 109
Chris@211 110 boxlayout->addItem(new QSpacerItem(3, 3), 0, 0);
Chris@101 111
Chris@230 112 QLabel *label = new QLabel(labelFor(s));
Chris@230 113 label->setWordWrap(true);
Chris@230 114 boxlayout->addWidget(label, 1, 0);
Chris@89 115
Chris@94 116 QListWidget *w = new QListWidget;
Chris@94 117 m_stateListMap[s] = w;
Chris@94 118 w->setSelectionMode(QListWidget::ExtendedSelection);
Chris@101 119 boxlayout->addWidget(w, 2, 0);
Chris@89 120
Chris@95 121 connect(w, SIGNAL(itemSelectionChanged()),
Chris@95 122 this, SLOT(itemSelectionChanged()));
Chris@331 123 connect(w, SIGNAL(itemDoubleClicked(QListWidgetItem *)),
Chris@331 124 this, SLOT(itemDoubleClicked(QListWidgetItem *)));
Chris@95 125
Chris@325 126 FileStates::Activities activities = m_fileStates.activitiesSupportedBy(s);
Chris@325 127 int prevGroup = -1;
Chris@325 128 foreach (FileStates::Activity a, activities) {
Chris@325 129 int group = FileStates::activityGroup(a);
Chris@325 130 if (group != prevGroup && prevGroup != -1) {
Chris@325 131 QAction *sep = new QAction("", w);
Chris@325 132 sep->setSeparator(true);
Chris@325 133 w->insertAction(0, sep);
Chris@325 134 }
Chris@325 135 prevGroup = group;
Chris@325 136 QAction *act = new QAction(m_actionLabels[a], w);
Chris@326 137 act->setProperty("state", s);
Chris@326 138 act->setProperty("activity", a);
Chris@326 139 connect(act, SIGNAL(triggered()), this, SLOT(menuActionActivated()));
Chris@325 140 w->insertAction(0, act);
Chris@325 141 }
Chris@323 142 w->setContextMenuPolicy(Qt::ActionsContextMenu);
Chris@323 143
Chris@211 144 boxlayout->addItem(new QSpacerItem(2, 2), 3, 0);
Chris@211 145
Chris@230 146 boxesLayout->addWidget(box, ++boxRow, 0);
Chris@230 147 m_boxes.push_back(box);
Chris@89 148 box->hide();
Chris@89 149 }
Chris@89 150
Chris@230 151 m_gridlyLayout = false;
Chris@230 152
Chris@89 153 layout->setRowStretch(++row, 20);
Chris@186 154
Chris@211 155 layout->addItem(new QSpacerItem(8, 8), ++row, 0);
Chris@199 156
Chris@199 157 m_showAllFiles = new QCheckBox(tr("Show all files"), this);
Chris@340 158 m_showAllFiles->setEnabled(false);
Chris@297 159 layout->addWidget(m_showAllFiles, ++row, 0, Qt::AlignLeft);
Chris@199 160 connect(m_showAllFiles, SIGNAL(toggled(bool)),
Chris@199 161 this, SIGNAL(showAllChanged(bool)));
Chris@88 162 }
Chris@88 163
Chris@93 164 FileStatusWidget::~FileStatusWidget()
Chris@93 165 {
Chris@93 166 delete m_dateReference;
Chris@93 167 }
Chris@93 168
Chris@100 169 QString FileStatusWidget::labelFor(FileStates::State s, bool addHighlightExplanation)
Chris@100 170 {
Chris@230 171 QSettings settings;
Chris@230 172 settings.beginGroup("Presentation");
Chris@230 173 if (settings.value("showhelpfultext", true).toBool()) {
Chris@230 174 if (addHighlightExplanation) {
Chris@230 175 return QString("<qt><b>%1</b><br>%2<br>%3</qt>")
Chris@230 176 .arg(m_simpleLabels[s])
Chris@230 177 .arg(m_descriptions[s])
Chris@230 178 .arg(m_highlightExplanation);
Chris@230 179 } else {
Chris@230 180 return QString("<qt><b>%1</b><br>%2</qt>")
Chris@230 181 .arg(m_simpleLabels[s])
Chris@230 182 .arg(m_descriptions[s]);
Chris@230 183 }
Chris@100 184 } else {
Chris@230 185 return QString("<qt><b>%1</b></qt>")
Chris@230 186 .arg(m_simpleLabels[s]);
Chris@230 187 }
Chris@230 188 settings.endGroup();
Chris@230 189 }
Chris@230 190
Chris@230 191 void FileStatusWidget::setNoModificationsLabelText()
Chris@230 192 {
Chris@230 193 QSettings settings;
Chris@230 194 settings.beginGroup("Presentation");
Chris@230 195 if (settings.value("showhelpfultext", true).toBool()) {
Chris@230 196 m_noModificationsLabel->setText
Chris@230 197 (tr("<qt>This area will list files in your working folder that you have changed.<br><br>At the moment you have no uncommitted changes.<br><br>To see changes previously made to the repository,<br>switch to the History tab.<br><br>%1</qt>")
Chris@230 198 #if defined Q_OS_MAC
Chris@230 199 .arg(tr("To open the working folder in Finder,<br>click on the &ldquo;Local&rdquo; folder path shown above."))
Chris@230 200 #elif defined Q_OS_WIN32
Chris@230 201 .arg(tr("To open the working folder in Windows Explorer,<br>click on the &ldquo;Local&rdquo; folder path shown above."))
Chris@230 202 #else
Chris@230 203 .arg(tr("To open the working folder in your system file manager,<br>click the &ldquo;Local&rdquo; folder path shown above."))
Chris@230 204 #endif
Chris@230 205 );
Chris@230 206 } else {
Chris@230 207 m_noModificationsLabel->setText
Chris@230 208 (tr("<qt>You have no uncommitted changes.</qt>"));
Chris@100 209 }
Chris@100 210 }
Chris@100 211
Chris@319 212
Chris@326 213 void FileStatusWidget::menuActionActivated()
Chris@326 214 {
Chris@326 215 QAction *act = qobject_cast<QAction *>(sender());
Chris@326 216 if (!act) return;
Chris@326 217
Chris@326 218 FileStates::State state = (FileStates::State)
Chris@326 219 act->property("state").toUInt();
Chris@326 220 FileStates::Activity activity = (FileStates::Activity)
Chris@326 221 act->property("activity").toUInt();
Chris@319 222
Chris@326 223 DEBUG << "menuActionActivated: state = " << state << ", activity = "
Chris@326 224 << activity << endl;
Chris@319 225
Chris@326 226 if (!FileStates::supportsActivity(state, activity)) {
Chris@326 227 std::cerr << "WARNING: FileStatusWidget::menuActionActivated: "
Chris@326 228 << "Action state " << state << " does not support activity "
Chris@326 229 << activity << std::endl;
Chris@326 230 return;
Chris@326 231 }
Chris@326 232
Chris@326 233 QStringList files = getSelectedFilesInState(state);
Chris@326 234
Chris@326 235 switch (activity) {
Chris@326 236 case FileStates::Annotate: emit annotateFiles(files); break;
Chris@326 237 case FileStates::Diff: emit diffFiles(files); break;
Chris@326 238 case FileStates::Commit: emit commitFiles(files); break;
Chris@326 239 case FileStates::Revert: emit revertFiles(files); break;
Chris@361 240 case FileStates::Rename: emit renameFiles(files); break;
Chris@361 241 case FileStates::Copy: emit copyFiles(files); break;
Chris@326 242 case FileStates::Add: emit addFiles(files); break;
Chris@326 243 case FileStates::Remove: emit removeFiles(files); break;
Chris@326 244 case FileStates::RedoMerge: emit redoFileMerges(files); break;
Chris@326 245 case FileStates::MarkResolved: emit markFilesResolved(files); break;
Chris@326 246 case FileStates::Ignore: emit ignoreFiles(files); break;
Chris@326 247 case FileStates::UnIgnore: emit unIgnoreFiles(files); break;
Chris@326 248 }
Chris@326 249 }
Chris@319 250
Chris@331 251 void FileStatusWidget::itemDoubleClicked(QListWidgetItem *item)
Chris@331 252 {
Chris@331 253 QStringList files;
Chris@350 254 QString file = item->text();
Chris@350 255 files << file;
Chris@350 256
Chris@350 257 switch (m_fileStates.stateOf(file)) {
Chris@350 258
Chris@350 259 case FileStates::Modified:
Chris@350 260 case FileStates::InConflict:
Chris@350 261 emit diffFiles(files);
Chris@350 262 break;
Chris@350 263
Chris@350 264 case FileStates::Clean:
Chris@350 265 case FileStates::Missing:
Chris@350 266 emit annotateFiles(files);
Chris@350 267 break;
Chris@373 268
Chris@373 269 default:
Chris@373 270 break;
Chris@350 271 }
Chris@331 272 }
Chris@319 273
Chris@95 274 void FileStatusWidget::itemSelectionChanged()
Chris@95 275 {
Chris@135 276 DEBUG << "FileStatusWidget::itemSelectionChanged" << endl;
Chris@135 277
Chris@135 278 QListWidget *list = qobject_cast<QListWidget *>(sender());
Chris@135 279
Chris@135 280 if (list) {
Chris@135 281 foreach (QListWidget *w, m_stateListMap) {
Chris@135 282 if (w != list) {
Chris@135 283 w->blockSignals(true);
Chris@135 284 w->clearSelection();
Chris@135 285 w->blockSignals(false);
Chris@135 286 }
Chris@135 287 }
Chris@135 288 }
Chris@135 289
Chris@95 290 m_selectedFiles.clear();
Chris@95 291
Chris@95 292 foreach (QListWidget *w, m_stateListMap) {
Chris@95 293 QList<QListWidgetItem *> sel = w->selectedItems();
Chris@95 294 foreach (QListWidgetItem *i, sel) {
Chris@95 295 m_selectedFiles.push_back(i->text());
Chris@95 296 DEBUG << "file " << i->text() << " is selected" << endl;
Chris@95 297 }
Chris@95 298 }
Chris@95 299
Chris@95 300 emit selectionChanged();
Chris@95 301 }
Chris@95 302
Chris@94 303 void FileStatusWidget::clearSelections()
Chris@94 304 {
Chris@95 305 m_selectedFiles.clear();
Chris@94 306 foreach (QListWidget *w, m_stateListMap) {
Chris@94 307 w->clearSelection();
Chris@94 308 }
Chris@94 309 }
Chris@94 310
Chris@95 311 bool FileStatusWidget::haveChangesToCommit() const
Chris@95 312 {
Chris@326 313 return !getAllCommittableFiles().empty();
Chris@95 314 }
Chris@95 315
Chris@95 316 bool FileStatusWidget::haveSelection() const
Chris@95 317 {
Chris@95 318 return !m_selectedFiles.empty();
Chris@95 319 }
Chris@95 320
Chris@326 321 QStringList FileStatusWidget::getSelectedFilesInState(FileStates::State s) const
Chris@95 322 {
Chris@95 323 QStringList files;
Chris@95 324 foreach (QString f, m_selectedFiles) {
Chris@326 325 if (m_fileStates.stateOf(f) == s) files.push_back(f);
Chris@95 326 }
Chris@95 327 return files;
Chris@326 328 }
Chris@326 329
Chris@326 330 QStringList FileStatusWidget::getSelectedFilesSupportingActivity(FileStates::Activity a) const
Chris@326 331 {
Chris@326 332 QStringList files;
Chris@326 333 foreach (QString f, m_selectedFiles) {
Chris@326 334 if (m_fileStates.supportsActivity(f, a)) files.push_back(f);
Chris@326 335 }
Chris@326 336 return files;
Chris@326 337 }
Chris@95 338
Chris@103 339 QStringList FileStatusWidget::getAllCommittableFiles() const
Chris@103 340 {
Chris@326 341 return m_fileStates.filesSupportingActivity(FileStates::Commit);
Chris@109 342 }
Chris@109 343
Chris@109 344 QStringList FileStatusWidget::getAllRevertableFiles() const
Chris@109 345 {
Chris@326 346 return m_fileStates.filesSupportingActivity(FileStates::Revert);
Chris@163 347 }
Chris@163 348
Chris@163 349 QStringList FileStatusWidget::getAllUnresolvedFiles() const
Chris@163 350 {
Chris@326 351 return m_fileStates.filesInState(FileStates::InConflict);
Chris@109 352 }
Chris@109 353
Chris@95 354 QStringList FileStatusWidget::getSelectedAddableFiles() const
Chris@95 355 {
Chris@326 356 return getSelectedFilesSupportingActivity(FileStates::Add);
Chris@103 357 }
Chris@103 358
Chris@95 359 QStringList FileStatusWidget::getSelectedRemovableFiles() const
Chris@95 360 {
Chris@326 361 return getSelectedFilesSupportingActivity(FileStates::Remove);
Chris@103 362 }
Chris@103 363
Chris@283 364 QString
Chris@283 365 FileStatusWidget::localPath() const
Chris@283 366 {
Chris@287 367 return m_localPath;
Chris@283 368 }
Chris@283 369
Chris@88 370 void
Chris@88 371 FileStatusWidget::setLocalPath(QString p)
Chris@88 372 {
Chris@287 373 m_localPath = p;
Chris@93 374 delete m_dateReference;
Chris@93 375 m_dateReference = new QFileInfo(p + "/.hg/dirstate");
Chris@93 376 if (!m_dateReference->exists() ||
Chris@93 377 !m_dateReference->isFile() ||
Chris@93 378 !m_dateReference->isReadable()) {
Chris@93 379 DEBUG << "FileStatusWidget::setLocalPath: date reference file "
Chris@93 380 << m_dateReference->absoluteFilePath()
Chris@93 381 << " does not exist, is not a file, or cannot be read"
Chris@93 382 << endl;
Chris@93 383 delete m_dateReference;
Chris@93 384 m_dateReference = 0;
Chris@340 385 m_showAllFiles->setEnabled(false);
Chris@340 386 } else {
Chris@340 387 m_showAllFiles->setEnabled(true);
Chris@93 388 }
Chris@283 389 }
Chris@283 390
Chris@88 391 void
Chris@92 392 FileStatusWidget::setFileStates(FileStates p)
Chris@88 393 {
Chris@92 394 m_fileStates = p;
Chris@88 395 updateWidgets();
Chris@88 396 }
Chris@88 397
Chris@88 398 void
Chris@88 399 FileStatusWidget::updateWidgets()
Chris@88 400 {
Chris@95 401 QDateTime lastInteractionTime;
Chris@95 402 if (m_dateReference) {
Chris@95 403 lastInteractionTime = m_dateReference->lastModified();
Chris@95 404 DEBUG << "reference time: " << lastInteractionTime << endl;
Chris@95 405 }
Chris@95 406
Chris@95 407 QSet<QString> selectedFiles;
Chris@95 408 foreach (QString f, m_selectedFiles) selectedFiles.insert(f);
Chris@95 409
Chris@230 410 int visibleCount = 0;
Chris@115 411
Chris@94 412 foreach (FileStates::State s, m_stateListMap.keys()) {
Chris@95 413
Chris@94 414 QListWidget *w = m_stateListMap[s];
Chris@94 415 w->clear();
Chris@324 416 QStringList files = m_fileStates.filesInState(s);
Chris@93 417
Chris@95 418 QStringList highPriority, lowPriority;
Chris@95 419
Chris@95 420 foreach (QString file, files) {
Chris@95 421
Chris@95 422 bool highlighted = false;
Chris@95 423
Chris@95 424 if (s == FileStates::Unknown) {
Chris@95 425 // We want to highlight untracked files that have appeared
Chris@95 426 // since the last interaction with the repo
Chris@287 427 QString fn(m_localPath + "/" + file);
Chris@95 428 DEBUG << "comparing with " << fn << endl;
Chris@95 429 QFileInfo fi(fn);
Chris@100 430 if (fi.exists() && fi.created() > lastInteractionTime) {
Chris@95 431 DEBUG << "file " << fn << " is newer (" << fi.lastModified()
Chris@95 432 << ") than reference" << endl;
Chris@95 433 highlighted = true;
Chris@95 434 }
Chris@95 435 }
Chris@95 436
Chris@95 437 if (highlighted) {
Chris@95 438 highPriority.push_back(file);
Chris@95 439 } else {
Chris@95 440 lowPriority.push_back(file);
Chris@93 441 }
Chris@93 442 }
Chris@95 443
Chris@95 444 foreach (QString file, highPriority) {
Chris@95 445 QListWidgetItem *item = new QListWidgetItem(file);
Chris@95 446 w->addItem(item);
Chris@326 447 item->setForeground(QColor("#d40000"));
Chris@95 448 item->setSelected(selectedFiles.contains(file));
Chris@95 449 }
Chris@95 450
Chris@95 451 foreach (QString file, lowPriority) {
Chris@95 452 QListWidgetItem *item = new QListWidgetItem(file);
Chris@95 453 w->addItem(item);
Chris@95 454 item->setSelected(selectedFiles.contains(file));
Chris@95 455 }
Chris@95 456
Chris@100 457 setLabelFor(w, s, !highPriority.empty());
Chris@100 458
Chris@115 459 if (files.empty()) {
Chris@115 460 w->parentWidget()->hide();
Chris@115 461 } else {
Chris@115 462 w->parentWidget()->show();
Chris@230 463 ++visibleCount;
Chris@115 464 }
Chris@93 465 }
Chris@115 466
Chris@230 467 m_noModificationsLabel->setVisible(visibleCount == 0);
Chris@230 468
Chris@230 469 if (visibleCount > 3) {
Chris@230 470 layoutBoxesGridly(visibleCount);
Chris@230 471 } else {
Chris@230 472 layoutBoxesLinearly();
Chris@230 473 }
Chris@115 474
Chris@230 475 setNoModificationsLabelText();
Chris@230 476 }
Chris@230 477
Chris@230 478 void FileStatusWidget::layoutBoxesGridly(int visibleCount)
Chris@230 479 {
Chris@230 480 if (m_gridlyLayout && m_lastGridlyCount == visibleCount) return;
Chris@230 481
Chris@230 482 delete m_boxesParent->layout();
Chris@230 483
Chris@230 484 QGridLayout *layout = new QGridLayout;
Chris@230 485 layout->setMargin(0);
Chris@230 486 m_boxesParent->setLayout(layout);
Chris@230 487
Chris@230 488 int row = 0;
Chris@230 489 int col = 0;
Chris@230 490
Chris@230 491 DEBUG << "FileStatusWidget::layoutBoxesGridly: visibleCount = "
Chris@230 492 << visibleCount << endl;
Chris@230 493
Chris@230 494 for (int i = 0; i < m_boxes.size(); ++i) {
Chris@230 495
Chris@230 496 if (!m_boxes[i]->isVisible()) continue;
Chris@230 497
Chris@230 498 if (col == 0 && row >= (visibleCount+1)/2) {
Chris@230 499 layout->addItem(new QSpacerItem(10, 5), 0, 1);
Chris@230 500 col = 2;
Chris@230 501 row = 0;
Chris@230 502 }
Chris@230 503
Chris@230 504 layout->addWidget(m_boxes[i], row, col);
Chris@230 505
Chris@230 506 ++row;
Chris@230 507 }
Chris@230 508
Chris@230 509 m_gridlyLayout = true;
Chris@230 510 m_lastGridlyCount = visibleCount;
Chris@230 511 }
Chris@230 512
Chris@230 513 void FileStatusWidget::layoutBoxesLinearly()
Chris@230 514 {
Chris@230 515 if (!m_gridlyLayout) return;
Chris@230 516
Chris@230 517 delete m_boxesParent->layout();
Chris@230 518
Chris@230 519 QGridLayout *layout = new QGridLayout;
Chris@230 520 layout->setMargin(0);
Chris@230 521 m_boxesParent->setLayout(layout);
Chris@230 522
Chris@230 523 for (int i = 0; i < m_boxes.size(); ++i) {
Chris@230 524 layout->addWidget(m_boxes[i], i, 0);
Chris@230 525 }
Chris@230 526
Chris@230 527 m_gridlyLayout = false;
Chris@88 528 }
Chris@88 529
Chris@100 530 void FileStatusWidget::setLabelFor(QWidget *w, FileStates::State s, bool addHighlight)
Chris@100 531 {
Chris@100 532 QString text = labelFor(s, addHighlight);
Chris@100 533 QWidget *p = w->parentWidget();
Chris@100 534 QList<QLabel *> ql = p->findChildren<QLabel *>();
Chris@100 535 if (!ql.empty()) ql[0]->setText(text);
Chris@100 536 }
Chris@115 537