From 37f5d18a009065b68667ba2ebd5543cbd1262da7 Mon Sep 17 00:00:00 2001 From: liujinchang Date: Fri, 30 Oct 2026 04:21:42 +0800 Subject: [PATCH] fix: show filename during file transfer progress MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. Root cause: IPC FileStatus struct already carries filename in param.name (full filepath from daemon), but three frontend handlers (TransferHelper, CooperationProxy, MainController) parsed progress data and ignored param.name, leaving UI with no filename display 2. Fix: extract filename via QFileInfo(param.name.c_str()).fileName() in all three onFileTransStatusChanged handlers, pass through updateProgress chain to TransferDialog, CooperationTransDialog and system notification respectively 3. Impact: all updateProgress/setProgress/updateProgressData signatures gain filename param with default QString(), existing callers unaffected; new fileNameLabel added to TransferDialog and ProgressWidget UI Log: Show current transferring filename in progress dialog and notification Influence: 1. Test file transfer from UOS to Windows, verify filename shown 2. Test file transfer from Windows to UOS, verify filename shown 3. Test batch transfer, verify filename updates per file 4. Verify notification shows filename when receiving files 5. Verify empty filename falls back to original progress display fix: 文件传输过程中显示当前传输文件名 1. 根因:IPC FileStatus 结构体已通过 param.name 携带文件名(daemon 填充 完整路径),但三个前端处理函数(TransferHelper、CooperationProxy、 MainController)解析进度数据时忽略了 param.name,导致界面不显示文件名 2. 方案:在三个 onFileTransStatusChanged 处理函数中通过 QFileInfo(param.name.c_str()).fileName() 提取文件名,经 updateProgress 调用链传递至 TransferDialog、CooperationTransDialog 和系统通知 3. 影响:所有 updateProgress/setProgress/updateProgressData 签名新增 filename 参数并使用默认值 QString(),现有调用者不受影响; TransferDialog 和 ProgressWidget 界面新增 fileNameLabel 控件 Log: 传输进度界面和通知中显示当前传输的文件名 Influence: 1. 测试 UOS 向 Windows 传输文件,验证进度界面显示文件名 2. 测试 Windows 向 UOS 传输文件,验证进度界面显示文件名 3. 测试批量传输,验证文件名随当前传输文件动态更新 4. 验证接收文件时系统通知显示文件名 5. 验证文件名为空时退化为原有进度显示 Bug: 357375 --- .../core/gui/dialogs/transferdialog.cpp | 14 ++++++++++++-- .../core/gui/dialogs/transferdialog.h | 5 +++-- .../core/proxy/cooperationdialog.cpp | 19 +++++++++++++++---- .../core/proxy/cooperationdialog.h | 7 ++++--- .../core/proxy/cooperationproxy.cpp | 10 ++++++---- .../cooperation/core/proxy/cooperationproxy.h | 4 ++-- .../core/transfer/transferhelper.cpp | 10 ++++++---- .../core/transfer/transferhelper_p.h | 4 ++-- .../daemon/maincontroller/maincontroller.cpp | 10 +++++++--- .../daemon/maincontroller/maincontroller.h | 4 ++-- 10 files changed, 59 insertions(+), 28 deletions(-) diff --git a/src/plugins/cooperation/core/gui/dialogs/transferdialog.cpp b/src/plugins/cooperation/core/gui/dialogs/transferdialog.cpp index 3787a6072..f54381e9e 100644 --- a/src/plugins/cooperation/core/gui/dialogs/transferdialog.cpp +++ b/src/plugins/cooperation/core/gui/dialogs/transferdialog.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. +// SPDX-FileCopyrightText: 2023-2026 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: GPL-3.0-or-later @@ -7,6 +7,7 @@ #include #include +#include "common/commonutils.h" using namespace cooperation_core; #ifdef linux @@ -118,6 +119,10 @@ void TransferDialog::createProgressPage() font.setPixelSize(14); titleLabel->setFont(font); + fileNameLabel = new CooperationLabel(this); + fileNameLabel->setAlignment(Qt::AlignHCenter); + fileNameLabel->setFont(font); + progressBar = new QProgressBar(this); progressBar->setRange(0, 100); progressBar->setValue(1); @@ -130,6 +135,8 @@ void TransferDialog::createProgressPage() progressMsgLael->setFont(font); vLayout->addWidget(titleLabel); + vLayout->addSpacing(8); + vLayout->addWidget(fileNameLabel); vLayout->addSpacing(20); vLayout->addWidget(progressBar); vLayout->addSpacing(18); @@ -192,11 +199,14 @@ void TransferDialog::switchProgressPage(const QString &title) okBtn->setVisible(true); } -void TransferDialog::updateProgress(int value, const QString &remainTime) +void TransferDialog::updateProgress(int value, const QString &remainTime, const QString &filename) { if (progressBar->value() < value) progressBar->setValue(value); + if (!filename.isEmpty()) + fileNameLabel->setText(CommonUitls::elidedText(filename, Qt::ElideMiddle, 30)); + QString remainTimeMsg(tr("Remaining time %1 | %2%").arg(remainTime, QString::number(value))); progressMsgLael->setText(remainTimeMsg); } diff --git a/src/plugins/cooperation/core/gui/dialogs/transferdialog.h b/src/plugins/cooperation/core/gui/dialogs/transferdialog.h index eecc31bb9..a6a4f70e3 100644 --- a/src/plugins/cooperation/core/gui/dialogs/transferdialog.h +++ b/src/plugins/cooperation/core/gui/dialogs/transferdialog.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. +// SPDX-FileCopyrightText: 2023-2026 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: GPL-3.0-or-later @@ -27,7 +27,7 @@ class TransferDialog : public CooperationDialog bool isInProgress() const; public Q_SLOTS: - void updateProgress(int value, const QString &remainTime); + void updateProgress(int value, const QString &remainTime, const QString &filename = QString()); Q_SIGNALS: void cancel(); @@ -49,6 +49,7 @@ public Q_SLOTS: CooperationLabel *iconLabel { nullptr }; CooperationLabel *msgLabel { nullptr }; CooperationLabel *titleLabel { nullptr }; + CooperationLabel *fileNameLabel { nullptr }; CooperationLabel *progressMsgLael { nullptr }; QProgressBar *progressBar { nullptr }; bool result { false }; diff --git a/src/plugins/cooperation/core/proxy/cooperationdialog.cpp b/src/plugins/cooperation/core/proxy/cooperationdialog.cpp index 777bb2901..46f6d23d2 100644 --- a/src/plugins/cooperation/core/proxy/cooperationdialog.cpp +++ b/src/plugins/cooperation/core/proxy/cooperationdialog.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. +// SPDX-FileCopyrightText: 2023-2026 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: GPL-3.0-or-later @@ -6,6 +6,8 @@ #include #include +#include +#include "common/commonutils.h" using namespace cooperation_core; @@ -50,8 +52,10 @@ void ProgressWidget::setTitle(const QString &title) titleLabel->setText(title); } -void ProgressWidget::setProgress(int value, const QString &msg) +void ProgressWidget::setProgress(int value, const QString &msg, const QString &filename) { + if (!filename.isEmpty()) + fileNameLabel->setText(CommonUitls::elidedText(filename, Qt::ElideMiddle, 30)); progressBar->setValue(value); QString remainTimeMsg(tr("Remaining time %1 | %2%").arg(msg, QString::number(value))); msgLabel->setText(remainTimeMsg); @@ -60,8 +64,14 @@ void ProgressWidget::setProgress(int value, const QString &msg) void ProgressWidget::init() { titleLabel = new CooperationLabel(this); + fileNameLabel = new CooperationLabel(this); msgLabel = new CooperationLabel(this); + QFont font; + font.setWeight(QFont::DemiBold); + font.setPixelSize(14); + fileNameLabel->setFont(font); + progressBar = new QProgressBar(this); progressBar->setRange(0, 100); progressBar->setTextVisible(false); @@ -72,6 +82,7 @@ void ProgressWidget::init() QVBoxLayout *mainLayout = new QVBoxLayout(this); mainLayout->addWidget(titleLabel, 1, Qt::AlignHCenter); + mainLayout->addWidget(fileNameLabel, 1, Qt::AlignHCenter); mainLayout->addWidget(progressBar, 1); mainLayout->addWidget(msgLabel, 1, Qt::AlignHCenter); mainLayout->addWidget(cancelBtn, 1); @@ -151,9 +162,9 @@ void CooperationTransDialog::showProgressDialog(const QString &title) setHidden(false); } -void CooperationTransDialog::updateProgressData(int value, const QString &msg) +void CooperationTransDialog::updateProgressData(int value, const QString &msg, const QString &filename) { - progressWidget->setProgress(value, msg); + progressWidget->setProgress(value, msg, filename); } void CooperationTransDialog::closeEvent(QCloseEvent *e) diff --git a/src/plugins/cooperation/core/proxy/cooperationdialog.h b/src/plugins/cooperation/core/proxy/cooperationdialog.h index fa0991e5a..9cc4b1e64 100644 --- a/src/plugins/cooperation/core/proxy/cooperationdialog.h +++ b/src/plugins/cooperation/core/proxy/cooperationdialog.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. +// SPDX-FileCopyrightText: 2023-2026 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: GPL-3.0-or-later @@ -41,7 +41,7 @@ class ProgressWidget : public QWidget explicit ProgressWidget(QWidget *parent = nullptr); void setTitle(const QString &title); - void setProgress(int value, const QString &msg); + void setProgress(int value, const QString &msg, const QString &filename = QString()); Q_SIGNALS: void canceled(); @@ -50,6 +50,7 @@ class ProgressWidget : public QWidget void init(); CooperationLabel *titleLabel { nullptr }; + CooperationLabel *fileNameLabel { nullptr }; CooperationLabel *msgLabel { nullptr }; QProgressBar *progressBar { nullptr }; QPushButton *cancelBtn { nullptr }; @@ -85,7 +86,7 @@ class CooperationTransDialog : public QDialog void showConfirmDialog(const QString &name); void showResultDialog(bool success, const QString &msg); void showProgressDialog(const QString &title); - void updateProgressData(int value, const QString &msg); + void updateProgressData(int value, const QString &msg, const QString &filename = QString()); protected: void closeEvent(QCloseEvent *e) override; diff --git a/src/plugins/cooperation/core/proxy/cooperationproxy.cpp b/src/plugins/cooperation/core/proxy/cooperationproxy.cpp index 75568d6e1..bda66e3f7 100644 --- a/src/plugins/cooperation/core/proxy/cooperationproxy.cpp +++ b/src/plugins/cooperation/core/proxy/cooperationproxy.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. +// SPDX-FileCopyrightText: 2023-2026 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: GPL-3.0-or-later @@ -17,6 +17,7 @@ #include "ipc/proto/backend.h" #include +#include #include #include #include @@ -148,7 +149,8 @@ void CooperationProxy::onFileTransStatusChanged(const QString &status) LOG_IF(FLG_log_detail) << "progressbar: " << progressValue << " remain_time=" << remain_time; LOG_IF(FLG_log_detail) << "totalSize: " << transferInfo.totalSize << " transferSize=" << transferInfo.transferSize; - updateProgress(progressValue, time.toString("hh:mm:ss")); + QString fileName = QFileInfo(QString(param.name.c_str())).fileName(); + updateProgress(progressValue, time.toString("hh:mm:ss"), fileName); } void CooperationProxy::onConfirmTimeout() @@ -347,9 +349,9 @@ void CooperationProxy::showTransResult(bool success, const QString &msg) cooperationDialog()->showResultDialog(success, msg); } -void CooperationProxy::updateProgress(int value, const QString &msg) +void CooperationProxy::updateProgress(int value, const QString &msg, const QString &filename) { static QString title(tr("Receiving files from \"%1\"")); cooperationDialog()->showProgressDialog(title.arg(CommonUitls::elidedText(fromWho, Qt::ElideMiddle, 15))); - cooperationDialog()->updateProgressData(value, msg); + cooperationDialog()->updateProgressData(value, msg, filename); } diff --git a/src/plugins/cooperation/core/proxy/cooperationproxy.h b/src/plugins/cooperation/core/proxy/cooperationproxy.h index 9276b2929..5c02a9cf4 100644 --- a/src/plugins/cooperation/core/proxy/cooperationproxy.h +++ b/src/plugins/cooperation/core/proxy/cooperationproxy.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. +// SPDX-FileCopyrightText: 2023-2026 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: GPL-3.0-or-later @@ -57,7 +57,7 @@ public Q_SLOTS: CooperationTransDialog *cooperationDialog(); void showTransResult(bool success, const QString &msg); - void updateProgress(int value, const QString &msg); + void updateProgress(int value, const QString &msg, const QString &filename = QString()); private: FrontendService *frontendIpcSer { nullptr }; diff --git a/src/plugins/cooperation/core/transfer/transferhelper.cpp b/src/plugins/cooperation/core/transfer/transferhelper.cpp index 014150edf..6417cae7d 100644 --- a/src/plugins/cooperation/core/transfer/transferhelper.cpp +++ b/src/plugins/cooperation/core/transfer/transferhelper.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. +// SPDX-FileCopyrightText: 2023-2026 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: GPL-3.0-or-later @@ -19,6 +19,7 @@ #include #include #include +#include #include #include #include @@ -199,11 +200,11 @@ void TransferHelperPrivate::transferResult(bool result, const QString &msg) reportTransferResult(result); } -void TransferHelperPrivate::updateProgress(int value, const QString &remainTime) +void TransferHelperPrivate::updateProgress(int value, const QString &remainTime, const QString &filename) { QString title = tr("Sending files to \"%1\"").arg(CommonUitls::elidedText(sendToWho, Qt::ElideMiddle, 15)); transDialog()->switchProgressPage(title); - transDialog()->updateProgress(value, remainTime); + transDialog()->updateProgress(value, remainTime, filename); } void TransferHelperPrivate::reportTransferResult(bool result) @@ -439,7 +440,8 @@ void TransferHelper::onFileTransStatusChanged(const QString &status) LOG_IF(FLG_log_detail) << "progressbar: " << progressValue << " remain_time=" << remain_time; LOG_IF(FLG_log_detail) << "totalSize: " << d->transferInfo.totalSize << " transferSize=" << d->transferInfo.transferSize; - d->updateProgress(progressValue, time.toString("hh:mm:ss")); + QString fileName = QFileInfo(QString(param.name.c_str())).fileName(); + d->updateProgress(progressValue, time.toString("hh:mm:ss"), fileName); } void TransferHelper::waitForConfirm() diff --git a/src/plugins/cooperation/core/transfer/transferhelper_p.h b/src/plugins/cooperation/core/transfer/transferhelper_p.h index c752966fc..1e26e41ad 100644 --- a/src/plugins/cooperation/core/transfer/transferhelper_p.h +++ b/src/plugins/cooperation/core/transfer/transferhelper_p.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. +// SPDX-FileCopyrightText: 2023-2026 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: GPL-3.0-or-later @@ -51,7 +51,7 @@ class TransferHelperPrivate : public QObject void handleSearchDevice(const QString &ip); void transferResult(bool result, const QString &msg); - void updateProgress(int value, const QString &remainTime); + void updateProgress(int value, const QString &remainTime, const QString &filename = QString()); void reportTransferResult(bool result); diff --git a/src/plugins/cooperation/daemon/maincontroller/maincontroller.cpp b/src/plugins/cooperation/daemon/maincontroller/maincontroller.cpp index b7ebb6ee1..c26a01cf1 100644 --- a/src/plugins/cooperation/daemon/maincontroller/maincontroller.cpp +++ b/src/plugins/cooperation/daemon/maincontroller/maincontroller.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. +// SPDX-FileCopyrightText: 2023-2026 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: GPL-3.0-or-later @@ -23,6 +23,7 @@ #include #include #include +#include #include #include @@ -88,13 +89,15 @@ void MainController::transferResult(bool result, const QString &msg) recvNotifyId = notifyMessage(recvNotifyId, msg, actions, {}, 3 * 1000); } -void MainController::updateProgress(int value, const QString &remainTime) +void MainController::updateProgress(int value, const QString &remainTime, const QString &filename) { // 在通知中心中,如果通知内容包含“%”且actions中存在“cancel”,则不会在通知中心显示 QStringList actions { NotifyCancelAction, tr("Cancel") }; // dde-session-ui 5.7.2.2 版本后,支持设置该属性使消息不进通知中心 QVariantMap hitMap { { "x-deepin-ShowInNotifyCenter", false } }; QString msg(tr("File receiving %1% | Remaining time %2").arg(QString::number(value), remainTime)); + if (!filename.isEmpty()) + msg = tr("%1 | File receiving %2% | Remaining time %3").arg(filename, QString::number(value), remainTime); recvNotifyId = notifyMessage(recvNotifyId, msg, actions, hitMap, 15 * 1000); } @@ -283,7 +286,8 @@ void MainController::onFileTransStatusChanged(const QString &status) LOG_IF(FLG_log_detail) << "progressbar: " << progressValue << " remain_time=" << remain_time; LOG_IF(FLG_log_detail) << "totalSize: " << transferInfo.totalSize << " transferSize=" << transferInfo.transferSize; - updateProgress(progressValue, time.toString("hh:mm:ss")); + QString fileName = QFileInfo(QString(param.name.c_str())).fileName(); + updateProgress(progressValue, time.toString("hh:mm:ss"), fileName); } void MainController::onConfirmTimeout() diff --git a/src/plugins/cooperation/daemon/maincontroller/maincontroller.h b/src/plugins/cooperation/daemon/maincontroller/maincontroller.h index 6ffdbb8ef..eaac089c0 100644 --- a/src/plugins/cooperation/daemon/maincontroller/maincontroller.h +++ b/src/plugins/cooperation/daemon/maincontroller/maincontroller.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. +// SPDX-FileCopyrightText: 2023-2026 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: GPL-3.0-or-later @@ -51,7 +51,7 @@ public Q_SLOTS: uint notifyMessage(uint replacesId, const QString &body, const QStringList &actions, QVariantMap hitMap, int expireTimeout); void transferResult(bool result, const QString &msg); - void updateProgress(int value, const QString &remainTime); + void updateProgress(int value, const QString &remainTime, const QString &filename = QString()); void openFileLocation(const QString &path); private: