annotate filestatuswidget.cpp @ 211:290a95b5ceae

* Report error if hg incoming does authentically fail (e.g. because remote repo is unavailable or unrelated) * Change target executable name from easyhg to EasyMercurial * Some (probably invisible) layout tweaks
author Chris Cannam
date Wed, 05 Jan 2011 15:05:45 +0000
parents c5fceb3fe5b4
children 43ecb0dcc44e
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@88 8 Copyright (c) 2010 Chris Cannam
Chris@88 9 Copyright (c) 2010 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@186 21 #include "clickablelabel.h"
Chris@88 22
Chris@88 23 #include <QLabel>
Chris@88 24 #include <QListWidget>
Chris@88 25 #include <QGridLayout>
Chris@93 26 #include <QFileInfo>
Chris@93 27 #include <QApplication>
Chris@93 28 #include <QDateTime>
Chris@115 29 #include <QPushButton>
Chris@186 30 #include <QToolButton>
Chris@186 31 #include <QDir>
Chris@186 32 #include <QProcess>
Chris@199 33 #include <QCheckBox>
Chris@88 34
Chris@88 35 FileStatusWidget::FileStatusWidget(QWidget *parent) :
Chris@93 36 QWidget(parent),
Chris@93 37 m_dateReference(0)
Chris@88 38 {
Chris@88 39 QGridLayout *layout = new QGridLayout;
Chris@88 40 setLayout(layout);
Chris@88 41
Chris@88 42 int row = 0;
Chris@211 43
Chris@211 44 #ifndef Q_OS_MAC
Chris@115 45 layout->addItem(new QSpacerItem(1, 1), row, 0);
Chris@211 46 ++row;
Chris@211 47 #endif
Chris@115 48
Chris@88 49 layout->addWidget(new QLabel(tr("Local:")), row, 0);
Chris@186 50
Chris@186 51 m_openButton = new ClickableLabel;
Chris@186 52 QFont f(m_openButton->font());
Chris@89 53 f.setBold(true);
Chris@186 54 m_openButton->setFont(f);
Chris@186 55 m_openButton->setMouseUnderline(true);
Chris@186 56 connect(m_openButton, SIGNAL(clicked()), this, SLOT(openButtonClicked()));
Chris@187 57 layout->addWidget(m_openButton, row, 1, 1, 2, Qt::AlignLeft);
Chris@88 58
Chris@88 59 ++row;
Chris@88 60 layout->addWidget(new QLabel(tr("Remote:")), row, 0);
Chris@88 61 m_remoteURLLabel = new QLabel;
Chris@186 62 layout->addWidget(m_remoteURLLabel, row, 1, 1, 2);
Chris@88 63
Chris@106 64 ++row;
Chris@115 65 layout->addWidget(new QLabel(tr("State:")), row, 0);
Chris@115 66 m_stateLabel = new QLabel;
Chris@115 67 layout->addWidget(m_stateLabel, row, 1, 1, 2);
Chris@106 68
Chris@89 69 layout->setColumnStretch(1, 20);
Chris@88 70
Chris@115 71 layout->addWidget(new QLabel("<qt><hr></qt>"), ++row, 0, 1, 3);
Chris@115 72
Chris@115 73 ++row;
Chris@210 74 //!!! option to be less verbose -> shorten this
Chris@115 75 m_noModificationsLabel = new QLabel
Chris@210 76 (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@202 77 #if defined Q_OS_MAC
Chris@202 78 .arg(tr("To open the working folder in Finder,<br>click on the &ldquo;Local&rdquo; folder path shown above."))
Chris@202 79 #elif defined Q_OS_WIN32
Chris@202 80 .arg(tr("To open the working folder in Windows Explorer,<br>click on the &ldquo;Local&rdquo; folder path shown above."))
Chris@202 81 #else
Chris@202 82 .arg(tr("To open the working folder in your system file manager,<br>click the &ldquo;Local&rdquo; folder path shown above."))
Chris@202 83 #endif
Chris@202 84 );
Chris@115 85 layout->addWidget(m_noModificationsLabel, row, 1, 1, 2);
Chris@202 86 m_noModificationsLabel->hide();
Chris@106 87
Chris@100 88 m_simpleLabels[FileStates::Clean] = tr("Unmodified:");
Chris@100 89 m_simpleLabels[FileStates::Modified] = tr("Modified:");
Chris@100 90 m_simpleLabels[FileStates::Added] = tr("Added:");
Chris@100 91 m_simpleLabels[FileStates::Removed] = tr("Removed:");
Chris@100 92 m_simpleLabels[FileStates::Missing] = tr("Missing:");
Chris@163 93 m_simpleLabels[FileStates::InConflict] = tr("In Conflict:");
Chris@100 94 m_simpleLabels[FileStates::Unknown] = tr("Untracked:");
Chris@199 95 m_simpleLabels[FileStates::Ignored] = tr("Ignored:");
Chris@99 96
Chris@100 97 m_descriptions[FileStates::Clean] = tr("You have not changed these files.");
Chris@100 98 m_descriptions[FileStates::Modified] = tr("You have changed these files since you last committed them.");
Chris@100 99 m_descriptions[FileStates::Added] = tr("These files will be added to version control next time you commit.");
Chris@100 100 m_descriptions[FileStates::Removed] = tr("These files will be removed from version control next time you commit.<br>"
Chris@100 101 "They will not be deleted from the local folder.");
Chris@109 102 m_descriptions[FileStates::Missing] = tr("These files are recorded in the version control, but absent from your working folder.<br>"
Chris@153 103 "If you intended to delete them, select them and use Remove to tell the version control system about it.<br>"
Chris@153 104 "If you deleted them by accident, select them and use Revert to restore their previous contents.");
Chris@163 105 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 106 m_descriptions[FileStates::Unknown] = tr("These files are in your working folder but are not under version control.<br>"
Chris@186 107 // "Select a file and use Add to place it under version control or Ignore to remove it from this list.");
Chris@186 108 "Select a file and use Add to place it under version control.");
Chris@199 109 m_descriptions[FileStates::Ignored] = tr("These files have names that match entries in the working folder's .hgignore file,<br>"
Chris@199 110 "and so will be ignored by the version control system.");
Chris@100 111
Chris@118 112 m_highlightExplanation = tr("Files highlighted <font color=#d40000>in red</font> "
Chris@100 113 "have appeared since your most recent commit or update.");
Chris@89 114
Chris@94 115 for (int i = int(FileStates::FirstState);
Chris@163 116 i <= int(FileStates::LastState); ++i) {
Chris@89 117
Chris@94 118 FileStates::State s = FileStates::State(i);
Chris@89 119
Chris@89 120 QWidget *box = new QWidget;
Chris@89 121 QGridLayout *boxlayout = new QGridLayout;
Chris@99 122 boxlayout->setMargin(0);
Chris@89 123 box->setLayout(boxlayout);
Chris@89 124
Chris@211 125 boxlayout->addItem(new QSpacerItem(3, 3), 0, 0);
Chris@101 126
Chris@101 127 boxlayout->addWidget(new QLabel(labelFor(s)), 1, 0);
Chris@89 128
Chris@94 129 QListWidget *w = new QListWidget;
Chris@94 130 m_stateListMap[s] = w;
Chris@94 131 w->setSelectionMode(QListWidget::ExtendedSelection);
Chris@101 132 boxlayout->addWidget(w, 2, 0);
Chris@89 133
Chris@95 134 connect(w, SIGNAL(itemSelectionChanged()),
Chris@95 135 this, SLOT(itemSelectionChanged()));
Chris@95 136
Chris@211 137 boxlayout->addItem(new QSpacerItem(2, 2), 3, 0);
Chris@211 138
Chris@115 139 layout->addWidget(box, ++row, 0, 1, 3);
Chris@89 140 box->hide();
Chris@89 141 }
Chris@89 142
Chris@89 143 layout->setRowStretch(++row, 20);
Chris@186 144
Chris@211 145 layout->addItem(new QSpacerItem(8, 8), ++row, 0);
Chris@199 146
Chris@199 147 m_showAllFiles = new QCheckBox(tr("Show all files"), this);
Chris@199 148 layout->addWidget(m_showAllFiles, ++row, 0, 1, 3, Qt::AlignLeft);
Chris@199 149 connect(m_showAllFiles, SIGNAL(toggled(bool)),
Chris@199 150 this, SIGNAL(showAllChanged(bool)));
Chris@88 151 }
Chris@88 152
Chris@93 153 FileStatusWidget::~FileStatusWidget()
Chris@93 154 {
Chris@93 155 delete m_dateReference;
Chris@93 156 }
Chris@93 157
Chris@186 158 void FileStatusWidget::openButtonClicked()
Chris@186 159 {
Chris@186 160 QDir d(m_localPath);
Chris@186 161 if (d.exists()) {
Chris@186 162 QStringList args;
Chris@201 163 QString path = d.canonicalPath();
Chris@201 164 #if defined Q_OS_WIN32
Chris@201 165 // Although the Win32 API is quite happy to have
Chris@201 166 // forward slashes as directory separators, Windows
Chris@201 167 // Explorer is not
Chris@201 168 path = path.replace('/', '\\');
Chris@201 169 args << path;
Chris@201 170 QProcess::execute("c:/windows/explorer.exe", args);
Chris@201 171 #else
Chris@201 172 args << path;
Chris@186 173 QProcess::execute(
Chris@201 174 #if defined Q_OS_MAC
Chris@186 175 "/usr/bin/open",
Chris@186 176 #else
Chris@186 177 "/usr/bin/xdg-open",
Chris@186 178 #endif
Chris@186 179 args);
Chris@201 180 #endif
Chris@186 181 }
Chris@186 182 }
Chris@186 183
Chris@100 184 QString FileStatusWidget::labelFor(FileStates::State s, bool addHighlightExplanation)
Chris@100 185 {
Chris@100 186 if (addHighlightExplanation) {
Chris@100 187 return QString("<qt><b>%1</b><br>%2<br>%3</qt>")
Chris@100 188 .arg(m_simpleLabels[s])
Chris@100 189 .arg(m_descriptions[s])
Chris@100 190 .arg(m_highlightExplanation);
Chris@100 191 } else {
Chris@100 192 return QString("<qt><b>%1</b><br>%2</qt>")
Chris@100 193 .arg(m_simpleLabels[s])
Chris@100 194 .arg(m_descriptions[s]);
Chris@100 195 }
Chris@100 196 }
Chris@100 197
Chris@95 198 void FileStatusWidget::itemSelectionChanged()
Chris@95 199 {
Chris@135 200 DEBUG << "FileStatusWidget::itemSelectionChanged" << endl;
Chris@135 201
Chris@135 202 QListWidget *list = qobject_cast<QListWidget *>(sender());
Chris@135 203
Chris@135 204 if (list) {
Chris@135 205 foreach (QListWidget *w, m_stateListMap) {
Chris@135 206 if (w != list) {
Chris@135 207 w->blockSignals(true);
Chris@135 208 w->clearSelection();
Chris@135 209 w->blockSignals(false);
Chris@135 210 }
Chris@135 211 }
Chris@135 212 }
Chris@135 213
Chris@95 214 m_selectedFiles.clear();
Chris@95 215
Chris@95 216 foreach (QListWidget *w, m_stateListMap) {
Chris@95 217 QList<QListWidgetItem *> sel = w->selectedItems();
Chris@95 218 foreach (QListWidgetItem *i, sel) {
Chris@95 219 m_selectedFiles.push_back(i->text());
Chris@95 220 DEBUG << "file " << i->text() << " is selected" << endl;
Chris@95 221 }
Chris@95 222 }
Chris@95 223
Chris@95 224 emit selectionChanged();
Chris@95 225 }
Chris@95 226
Chris@94 227 void FileStatusWidget::clearSelections()
Chris@94 228 {
Chris@95 229 m_selectedFiles.clear();
Chris@94 230 foreach (QListWidget *w, m_stateListMap) {
Chris@94 231 w->clearSelection();
Chris@94 232 }
Chris@94 233 }
Chris@94 234
Chris@95 235 bool FileStatusWidget::haveChangesToCommit() const
Chris@95 236 {
Chris@95 237 return !m_fileStates.added().empty() ||
Chris@95 238 !m_fileStates.removed().empty() ||
Chris@95 239 !m_fileStates.modified().empty();
Chris@95 240 }
Chris@95 241
Chris@95 242 bool FileStatusWidget::haveSelection() const
Chris@95 243 {
Chris@95 244 return !m_selectedFiles.empty();
Chris@95 245 }
Chris@95 246
Chris@95 247 QStringList FileStatusWidget::getAllSelectedFiles() const
Chris@95 248 {
Chris@95 249 return m_selectedFiles;
Chris@95 250 }
Chris@95 251
Chris@95 252 QStringList FileStatusWidget::getSelectedCommittableFiles() const
Chris@95 253 {
Chris@95 254 QStringList files;
Chris@95 255 foreach (QString f, m_selectedFiles) {
Chris@95 256 switch (m_fileStates.getStateOfFile(f)) {
Chris@95 257 case FileStates::Added:
Chris@95 258 case FileStates::Modified:
Chris@95 259 case FileStates::Removed:
Chris@95 260 files.push_back(f);
Chris@95 261 break;
Chris@95 262 default: break;
Chris@95 263 }
Chris@95 264 }
Chris@95 265 return files;
Chris@95 266 }
Chris@95 267
Chris@103 268 QStringList FileStatusWidget::getAllCommittableFiles() const
Chris@103 269 {
Chris@103 270 QStringList files;
Chris@103 271 files << m_fileStates.getFilesInState(FileStates::Modified);
Chris@103 272 files << m_fileStates.getFilesInState(FileStates::Added);
Chris@103 273 files << m_fileStates.getFilesInState(FileStates::Removed);
Chris@103 274 return files;
Chris@103 275 }
Chris@103 276
Chris@109 277 QStringList FileStatusWidget::getSelectedRevertableFiles() const
Chris@109 278 {
Chris@109 279 QStringList files;
Chris@109 280 foreach (QString f, m_selectedFiles) {
Chris@109 281 switch (m_fileStates.getStateOfFile(f)) {
Chris@109 282 case FileStates::Added:
Chris@109 283 case FileStates::Modified:
Chris@109 284 case FileStates::Removed:
Chris@109 285 case FileStates::Missing:
Chris@163 286 case FileStates::InConflict:
Chris@109 287 files.push_back(f);
Chris@109 288 break;
Chris@109 289 default: break;
Chris@109 290 }
Chris@109 291 }
Chris@109 292 return files;
Chris@109 293 }
Chris@109 294
Chris@109 295 QStringList FileStatusWidget::getAllRevertableFiles() const
Chris@109 296 {
Chris@109 297 QStringList files;
Chris@109 298 files << m_fileStates.getFilesInState(FileStates::Modified);
Chris@109 299 files << m_fileStates.getFilesInState(FileStates::Added);
Chris@109 300 files << m_fileStates.getFilesInState(FileStates::Removed);
Chris@109 301 files << m_fileStates.getFilesInState(FileStates::Missing);
Chris@163 302 files << m_fileStates.getFilesInState(FileStates::InConflict);
Chris@163 303 return files;
Chris@163 304 }
Chris@163 305
Chris@163 306 QStringList FileStatusWidget::getSelectedUnresolvedFiles() const
Chris@163 307 {
Chris@163 308 QStringList files;
Chris@163 309 foreach (QString f, m_selectedFiles) {
Chris@163 310 switch (m_fileStates.getStateOfFile(f)) {
Chris@163 311 case FileStates::InConflict:
Chris@163 312 files.push_back(f);
Chris@163 313 break;
Chris@163 314 default: break;
Chris@163 315 }
Chris@163 316 }
Chris@163 317 return files;
Chris@163 318 }
Chris@163 319
Chris@163 320 QStringList FileStatusWidget::getAllUnresolvedFiles() const
Chris@163 321 {
Chris@163 322 QStringList files;
Chris@163 323 files << m_fileStates.getFilesInState(FileStates::InConflict);
Chris@109 324 return files;
Chris@109 325 }
Chris@109 326
Chris@95 327 QStringList FileStatusWidget::getSelectedAddableFiles() const
Chris@95 328 {
Chris@95 329 QStringList files;
Chris@95 330 foreach (QString f, m_selectedFiles) {
Chris@95 331 switch (m_fileStates.getStateOfFile(f)) {
Chris@95 332 case FileStates::Unknown:
Chris@95 333 case FileStates::Removed:
Chris@95 334 files.push_back(f);
Chris@95 335 break;
Chris@95 336 default: break;
Chris@95 337 }
Chris@95 338 }
Chris@95 339 return files;
Chris@95 340 }
Chris@95 341
Chris@103 342 QStringList FileStatusWidget::getAllAddableFiles() const
Chris@103 343 {
Chris@103 344 QStringList files;
Chris@103 345 files << m_fileStates.getFilesInState(FileStates::Removed);
Chris@103 346 files << m_fileStates.getFilesInState(FileStates::Unknown);
Chris@103 347 return files;
Chris@103 348 }
Chris@103 349
Chris@95 350 QStringList FileStatusWidget::getSelectedRemovableFiles() const
Chris@95 351 {
Chris@95 352 QStringList files;
Chris@95 353 foreach (QString f, m_selectedFiles) {
Chris@95 354 switch (m_fileStates.getStateOfFile(f)) {
Chris@95 355 case FileStates::Clean:
Chris@95 356 case FileStates::Added:
Chris@95 357 case FileStates::Modified:
Chris@95 358 case FileStates::Missing:
Chris@163 359 case FileStates::InConflict:
Chris@95 360 files.push_back(f);
Chris@95 361 break;
Chris@95 362 default: break;
Chris@95 363 }
Chris@95 364 }
Chris@95 365 return files;
Chris@95 366 }
Chris@95 367
Chris@103 368 QStringList FileStatusWidget::getAllRemovableFiles() const
Chris@103 369 {
Chris@103 370 QStringList files;
Chris@103 371 files << m_fileStates.getFilesInState(FileStates::Clean);
Chris@103 372 files << m_fileStates.getFilesInState(FileStates::Added);
Chris@103 373 files << m_fileStates.getFilesInState(FileStates::Modified);
Chris@103 374 files << m_fileStates.getFilesInState(FileStates::Missing);
Chris@163 375 files << m_fileStates.getFilesInState(FileStates::InConflict);
Chris@103 376 return files;
Chris@103 377 }
Chris@103 378
Chris@88 379 void
Chris@88 380 FileStatusWidget::setLocalPath(QString p)
Chris@88 381 {
Chris@88 382 m_localPath = p;
Chris@186 383 m_openButton->setText(p);
Chris@93 384 delete m_dateReference;
Chris@93 385 m_dateReference = new QFileInfo(p + "/.hg/dirstate");
Chris@93 386 if (!m_dateReference->exists() ||
Chris@93 387 !m_dateReference->isFile() ||
Chris@93 388 !m_dateReference->isReadable()) {
Chris@93 389 DEBUG << "FileStatusWidget::setLocalPath: date reference file "
Chris@93 390 << m_dateReference->absoluteFilePath()
Chris@93 391 << " does not exist, is not a file, or cannot be read"
Chris@93 392 << endl;
Chris@93 393 delete m_dateReference;
Chris@93 394 m_dateReference = 0;
Chris@93 395 }
Chris@186 396 m_openButton->setEnabled(QDir(m_localPath).exists());
Chris@88 397 }
Chris@88 398
Chris@88 399 void
Chris@88 400 FileStatusWidget::setRemoteURL(QString r)
Chris@88 401 {
Chris@88 402 m_remoteURL = r;
Chris@88 403 m_remoteURLLabel->setText(r);
Chris@88 404 }
Chris@88 405
Chris@88 406 void
Chris@92 407 FileStatusWidget::setFileStates(FileStates p)
Chris@88 408 {
Chris@92 409 m_fileStates = p;
Chris@88 410 updateWidgets();
Chris@88 411 }
Chris@88 412
Chris@88 413 void
Chris@115 414 FileStatusWidget::setState(QString b)
Chris@106 415 {
Chris@115 416 m_state = b;
Chris@115 417 updateStateLabel();
Chris@106 418 }
Chris@106 419
Chris@106 420 void
Chris@88 421 FileStatusWidget::updateWidgets()
Chris@88 422 {
Chris@95 423 QDateTime lastInteractionTime;
Chris@95 424 if (m_dateReference) {
Chris@95 425 lastInteractionTime = m_dateReference->lastModified();
Chris@95 426 DEBUG << "reference time: " << lastInteractionTime << endl;
Chris@95 427 }
Chris@95 428
Chris@95 429 QSet<QString> selectedFiles;
Chris@95 430 foreach (QString f, m_selectedFiles) selectedFiles.insert(f);
Chris@95 431
Chris@115 432 bool haveAnything = false;
Chris@115 433
Chris@94 434 foreach (FileStates::State s, m_stateListMap.keys()) {
Chris@95 435
Chris@94 436 QListWidget *w = m_stateListMap[s];
Chris@94 437 w->clear();
Chris@95 438 QStringList files = m_fileStates.getFilesInState(s);
Chris@93 439
Chris@95 440 QStringList highPriority, lowPriority;
Chris@95 441
Chris@95 442 foreach (QString file, files) {
Chris@95 443
Chris@95 444 bool highlighted = false;
Chris@95 445
Chris@95 446 if (s == FileStates::Unknown) {
Chris@95 447 // We want to highlight untracked files that have appeared
Chris@95 448 // since the last interaction with the repo
Chris@95 449 QString fn(m_localPath + "/" + file);
Chris@95 450 DEBUG << "comparing with " << fn << endl;
Chris@95 451 QFileInfo fi(fn);
Chris@100 452 if (fi.exists() && fi.created() > lastInteractionTime) {
Chris@95 453 DEBUG << "file " << fn << " is newer (" << fi.lastModified()
Chris@95 454 << ") than reference" << endl;
Chris@95 455 highlighted = true;
Chris@95 456 }
Chris@95 457 }
Chris@95 458
Chris@95 459 if (highlighted) {
Chris@95 460 highPriority.push_back(file);
Chris@95 461 } else {
Chris@95 462 lowPriority.push_back(file);
Chris@93 463 }
Chris@93 464 }
Chris@95 465
Chris@95 466 foreach (QString file, highPriority) {
Chris@95 467 QListWidgetItem *item = new QListWidgetItem(file);
Chris@95 468 w->addItem(item);
Chris@118 469 item->setForeground(QColor("#d40000")); //!!! and a nice gold star
Chris@95 470 item->setSelected(selectedFiles.contains(file));
Chris@95 471 }
Chris@95 472
Chris@95 473 foreach (QString file, lowPriority) {
Chris@95 474 QListWidgetItem *item = new QListWidgetItem(file);
Chris@95 475 w->addItem(item);
Chris@95 476 item->setSelected(selectedFiles.contains(file));
Chris@95 477 }
Chris@95 478
Chris@100 479 setLabelFor(w, s, !highPriority.empty());
Chris@100 480
Chris@115 481 if (files.empty()) {
Chris@115 482 w->parentWidget()->hide();
Chris@115 483 } else {
Chris@115 484 w->parentWidget()->show();
Chris@115 485 haveAnything = true;
Chris@115 486 }
Chris@93 487 }
Chris@115 488
Chris@115 489 m_noModificationsLabel->setVisible(!haveAnything);
Chris@115 490
Chris@115 491 updateStateLabel();
Chris@88 492 }
Chris@88 493
Chris@100 494 void FileStatusWidget::setLabelFor(QWidget *w, FileStates::State s, bool addHighlight)
Chris@100 495 {
Chris@100 496 QString text = labelFor(s, addHighlight);
Chris@100 497 QWidget *p = w->parentWidget();
Chris@100 498 QList<QLabel *> ql = p->findChildren<QLabel *>();
Chris@100 499 if (!ql.empty()) ql[0]->setText(text);
Chris@100 500 }
Chris@115 501
Chris@115 502 void FileStatusWidget::updateStateLabel()
Chris@115 503 {
Chris@115 504 m_stateLabel->setText(m_state);
Chris@115 505 }