File indexing completed on 2024-05-12 16:27:36

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"