From e38af4791579bcced605081111cf63269bab4264 Mon Sep 17 00:00:00 2001 From: Bill Somerville Date: Thu, 18 Feb 2021 11:56:06 +0000 Subject: [PATCH] Temporary text only progress display for macOS sample downloads A Qt defect is breaking the display of progress bar item delegates, this change replaces them with simple text item delegate. --- SampleDownloader/DirectoryDelegate.cpp | 42 +++++++++++++++++--------- 1 file changed, 28 insertions(+), 14 deletions(-) diff --git a/SampleDownloader/DirectoryDelegate.cpp b/SampleDownloader/DirectoryDelegate.cpp index f64e98703..c5a765401 100644 --- a/SampleDownloader/DirectoryDelegate.cpp +++ b/SampleDownloader/DirectoryDelegate.cpp @@ -14,28 +14,42 @@ void DirectoryDelegate::paint (QPainter * painter, QStyleOptionViewItem const& o { if (1 == index.column ()) { - QStyleOptionProgressBar progress_bar_option; - progress_bar_option.rect = option.rect; - progress_bar_option.state = QStyle::State_Enabled; - progress_bar_option.direction = QApplication::layoutDirection (); - progress_bar_option.fontMetrics = QApplication::fontMetrics (); - progress_bar_option.minimum = 0; - progress_bar_option.maximum = 100; auto progress = index.data ().toLongLong (); + qint64 percent; if (progress > 0) { - auto percent = int (progress * 100 / index.data (Qt::UserRole).toLongLong ()); - progress_bar_option.progress = percent; - progress_bar_option.text = QString::number (percent) + '%'; - progress_bar_option.textVisible = true; - progress_bar_option.textAlignment = Qt::AlignCenter; + percent = int (progress * 100 / index.data (Qt::UserRole).toLongLong ()); + } +#if !defined (Q_OS_DARWIN) + QStyleOptionProgressBar progress_option; + auto control_element = QStyle::CE_ProgressBar; + progress_option.minimum = 0; + progress_option.maximum = 100; + progress_option.textAlignment = Qt::AlignCenter; + if (progress > 0) + { + progress_option.progress = percent; + progress_option.textVisible = true; } else { // not started - progress_bar_option.progress = -1; + progress_option.progress = -1; } - QApplication::style ()->drawControl (QStyle::CE_ProgressBar, &progress_bar_option, painter); +#else + // workaround for broken QProgressBar item delegates on macOS + QStyleOptionViewItem progress_option; + auto control_element = QStyle::CE_ItemViewItem; + progress_option.displayAlignment = Qt::AlignLeft; + progress_option.index = index; + progress_option.features = QStyleOptionViewItem::HasDisplay; +#endif + progress_option.rect = option.rect; + progress_option.state = QStyle::State_Enabled; + progress_option.direction = QApplication::layoutDirection (); + progress_option.fontMetrics = QApplication::fontMetrics (); + progress_option.text = QString::number (progress > 0 ? percent : 0) + '%'; + QApplication::style ()->drawControl (control_element, &progress_option, painter); } else {