File indexing completed on 2024-05-19 05:04:26
0001 /* 0002 SPDX-FileCopyrightText: 2022-2024 Laurent Montel <montel@kde.org> 0003 0004 SPDX-License-Identifier: LGPL-2.0-or-later 0005 */ 0006 0007 #include "uploadfileprogressstatuslistwidget.h" 0008 #include "ruqolawidgets_debug.h" 0009 #include "uploadfileprogressstatuswidget.h" 0010 #include <QScrollBar> 0011 #include <QVBoxLayout> 0012 0013 UploadFileProgressStatusListWidget::UploadFileProgressStatusListWidget(QWidget *parent) 0014 : QScrollArea{parent} 0015 , mBigBox(new QWidget(this)) 0016 { 0017 setFrameStyle(NoFrame); 0018 auto mBigBoxVBoxLayout = new QVBoxLayout(mBigBox); 0019 mBigBoxVBoxLayout->setContentsMargins({}); 0020 setWidget(mBigBox); 0021 setWidgetResizable(true); 0022 setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed); 0023 } 0024 0025 UploadFileProgressStatusListWidget::~UploadFileProgressStatusListWidget() = default; 0026 0027 void UploadFileProgressStatusListWidget::resizeEvent(QResizeEvent *event) 0028 { 0029 // Tell the layout in the parent (progressdialog) that our size changed 0030 updateGeometry(); 0031 QScrollArea::resizeEvent(event); 0032 } 0033 0034 QSize UploadFileProgressStatusListWidget::sizeHint() const 0035 { 0036 return minimumSizeHint(); 0037 } 0038 0039 QSize UploadFileProgressStatusListWidget::minimumSizeHint() const 0040 { 0041 const int f = 2 * frameWidth(); 0042 // Make room for a vertical scrollbar in all cases, to avoid a horizontal one 0043 const int vsbExt = verticalScrollBar()->sizeHint().width(); 0044 const int minw = topLevelWidget()->width() / 3; 0045 const int maxh = topLevelWidget()->height() / 2; 0046 QSize sz(mBigBox->minimumSizeHint()); 0047 sz.setWidth(qMax(sz.width(), minw) + f + vsbExt); 0048 sz.setHeight(qMin(sz.height(), maxh) + f); 0049 return sz; 0050 } 0051 0052 void UploadFileProgressStatusListWidget::slotLayoutFirstItem() 0053 { 0054 updateGeometry(); 0055 } 0056 0057 void UploadFileProgressStatusListWidget::addProgressStatusWidget(int identifier) 0058 { 0059 auto ti = new UploadFileProgressStatusWidget(mBigBox); 0060 ti->setIdentifier(identifier); 0061 mBigBox->layout()->addWidget(ti); 0062 0063 resize(mBigBox->width(), mBigBox->height()); 0064 0065 mUploadItems.insert(identifier, ti); 0066 connect(ti, &UploadFileProgressStatusWidget::cancelUpload, this, &UploadFileProgressStatusListWidget::cancelUpload); 0067 } 0068 0069 void UploadFileProgressStatusListWidget::removeUploadFileProgressStatusWidget(int identifier) 0070 { 0071 UploadFileProgressStatusWidget *item = mUploadItems.take(identifier); 0072 if (item) { 0073 item->deleteLater(); 0074 } 0075 } 0076 0077 void UploadFileProgressStatusListWidget::uploadProgress(const RocketChatRestApi::UploadFileJob::UploadStatusInfo &info, 0078 int identifier, 0079 const QString &accountName) 0080 { 0081 UploadFileProgressStatusWidget *item = mUploadItems.value(identifier); 0082 if (item) { 0083 if (info.bytesSent > 0 && info.bytesTotal > 0) { 0084 item->setVisible(true); 0085 item->setUploadFileName(info.fileName + QStringLiteral(" (%1)").arg(accountName)); 0086 item->setValue(static_cast<int>((info.bytesSent * 100) / info.bytesTotal)); 0087 setVisible(true); 0088 } else { 0089 connect(item, &QObject::destroyed, this, &UploadFileProgressStatusListWidget::slotLayoutFirstItem); 0090 item->setVisible(false); 0091 mUploadItems.remove(identifier); 0092 item->deleteLater(); 0093 if (mUploadItems.isEmpty()) { 0094 setVisible(false); 0095 } 0096 } 0097 } else { 0098 qCWarning(RUQOLAWIDGETS_LOG) << "identifier " << identifier << " not found."; 0099 } 0100 } 0101 0102 #include "moc_uploadfileprogressstatuslistwidget.cpp"