diff --git a/AicsKnowledgeBase/qml/MainWindow.qml b/AicsKnowledgeBase/qml/MainWindow.qml index be9e4dc..9763a23 100644 --- a/AicsKnowledgeBase/qml/MainWindow.qml +++ b/AicsKnowledgeBase/qml/MainWindow.qml @@ -102,6 +102,7 @@ FluWindow { target: SignalFileOperation function onOpen(file) { stack_view.clear() + UserData.viewHistory.push(file) stack_view.push(file_view, { "knowledgeFileId": file }) diff --git a/AicsKnowledgeBase/qml/component/TransferListPopup.qml b/AicsKnowledgeBase/qml/component/TransferListPopup.qml index 7c13c78..b5a990c 100644 --- a/AicsKnowledgeBase/qml/component/TransferListPopup.qml +++ b/AicsKnowledgeBase/qml/component/TransferListPopup.qml @@ -5,6 +5,7 @@ import QtQuick.Layouts import Qt5Compat.GraphicalEffects import FluentUI import AicsKB.FileTransferManager +import "qrc:///AicsKnowledgeBase/qml/global" Popup { id: transfer_popup @@ -18,6 +19,15 @@ Popup { FluShadow {} } + Connections { + target: FileTransferManager + onTransferComplete: (download, fileId, fileName) => { + console.log("onTransferComplete") + UserData.downloadedFiles.push(fileId) + console.log(UserData.downloadedFiles) + } + } + contentItem: FluScrollablePage { anchors.fill: parent anchors.topMargin: 10 @@ -30,42 +40,65 @@ Popup { Layout.fillWidth: true height: 50 - ColumnLayout { + Item { anchors.fill: parent - anchors.margins: 5 - spacing: 2 - Text { - text: name + anchors.topMargin: 5 + anchors.bottomMargin: 5 + anchors.leftMargin: 0 + Image { + id: icon + anchors.verticalCenter: parent.verticalCenter + width: 32 + height: 32 + source: download ? "qrc:/AicsKnowledgeBase/res/download.png" : "qrc:/AicsKnowledgeBase/res/upload.png" } - FluProgressBar { - Layout.fillWidth: true - progress: completedSize / totalSize - indeterminate: false - } + ColumnLayout { + anchors.left: icon.right + anchors.right: parent.right + anchors.leftMargin: 5 + spacing: 2 + Text { + text: name + } + Text { + visible: completedSize >= totalSize + text: "已完成" + color: FluColors.Grey130 + } + FluProgressBar { + Layout.fillWidth: true + progress: completedSize / totalSize + indeterminate: false + visible: completedSize < totalSize + } - Text { - color: FluColors.Grey130 - text: formatSize(speed) + "/s - " + formatSize( - completedSize) + "/" + formatSize( - totalSize) + Text { + visible: completedSize < totalSize + color: FluColors.Grey130 + text: formatSize(speed) + "/s - " + formatSize( + completedSize) + "/" + formatSize( + totalSize) - /** - * 格式化文件大小, 输出成带单位的字符串 - * @param {Number} size 文件大小 - * @param {Number} [pointLength=1] 精确到的小数点数。 - * @param {Array} [units=[ 'B', 'K', 'M', 'G', 'TB' ]] 单位数组。从字节,到千字节,一直往上指定。 - * 如果单位数组里面只指定了到了K(千字节),同时文件大小大于M, 此方法的输出将还是显示成多少K. - */ - function formatSize(size, pointLength, units) { - var unit - units = units || ['B', 'KB', 'MB', 'GB', 'TB'] - while ((unit = units.shift()) && size > 1024) { - size = size / 1024 + /** + * 格式化文件大小, 输出成带单位的字符串 + * @param {Number} size 文件大小 + * @param {Number} [pointLength=1] 精确到的小数点数。 + * @param {Array} [units=[ 'B', 'K', 'M', 'G', 'TB' ]] 单位数组。从字节,到千字节,一直往上指定。 + * 如果单位数组里面只指定了到了K(千字节),同时文件大小大于M, 此方法的输出将还是显示成多少K. + */ + function formatSize(size, pointLength, units) { + var unit + units = units + || ['B', 'KB', 'MB', 'GB', 'TB'] + while ((unit = units.shift()) + && size > 1024) { + size = size / 1024 + } + return (unit === 'B' ? size : size.toFixed( + pointLength === undefined ? 1 : pointLength)) + ' ' + unit } - return (unit === 'B' ? size : size.toFixed( - pointLength === undefined ? 1 : pointLength)) + ' ' + unit } } } @@ -73,7 +106,10 @@ Popup { MouseArea { anchors.fill: parent hoverEnabled: true - onEntered: file_buttons.visible = true + onEntered: { + if (completedSize < totalSize) + file_buttons.visible = true + } onExited: file_buttons.visible = false LinearGradient { diff --git a/AicsKnowledgeBase/qml/global/UserData.qml b/AicsKnowledgeBase/qml/global/UserData.qml index 771ac90..4d7845f 100644 --- a/AicsKnowledgeBase/qml/global/UserData.qml +++ b/AicsKnowledgeBase/qml/global/UserData.qml @@ -5,4 +5,6 @@ import QtQuick QtObject { property string username property string userId + property var viewHistory: [] + property var downloadedFiles: [] } diff --git a/AicsKnowledgeBase/res/download.png b/AicsKnowledgeBase/res/download.png new file mode 100644 index 0000000..3bd31e8 Binary files /dev/null and b/AicsKnowledgeBase/res/download.png differ diff --git a/AicsKnowledgeBase/res/upload.png b/AicsKnowledgeBase/res/upload.png new file mode 100644 index 0000000..136a60f Binary files /dev/null and b/AicsKnowledgeBase/res/upload.png differ diff --git a/AicsKnowledgeBase/src/FileTransferListModel.cpp b/AicsKnowledgeBase/src/FileTransferListModel.cpp index 6cb46eb..46644e4 100644 --- a/AicsKnowledgeBase/src/FileTransferListModel.cpp +++ b/AicsKnowledgeBase/src/FileTransferListModel.cpp @@ -10,6 +10,8 @@ FileTransferListModel::FileTransferListModel(QObject *parent) m_roleName.insert(kTotalSizeRole, "totalSize"); m_roleName.insert(kSpeedRole, "speed"); m_roleName.insert(kPausedRole, "paused"); + + m_data.append({true, "id", "name", 30, 100, 30}); } diff --git a/AicsKnowledgeBase/src/FileTransferManager.cpp b/AicsKnowledgeBase/src/FileTransferManager.cpp index 3344a42..df0d6ca 100644 --- a/AicsKnowledgeBase/src/FileTransferManager.cpp +++ b/AicsKnowledgeBase/src/FileTransferManager.cpp @@ -73,8 +73,8 @@ static int xferinfo(void *p, curl_off_t dltotal, curl_off_t dlnow, curl_off_t ul fileTrans->completedSize += dlnow; fileTrans->speed = speed; - qDebug() << std::format("Downloading: {} / {}, Speed: {}", fileTrans->completedSize, fileTrans->totalSize, - speed).c_str(); + //qDebug() << std::format("Downloading: {} / {}, Speed: {}", fileTrans->completedSize, fileTrans->totalSize, + // speed).c_str(); auto item = static_cast(*fileTrans); QTimer::singleShot(0, qApp, [item]() { @@ -96,8 +96,8 @@ static int uploadInfo(void *p, curl_off_t dltotal, curl_off_t dlnow, curl_off_t curl_easy_getinfo(fileTrans->curlHandle, CURLINFO_SPEED_UPLOAD_T, &speed); fileTrans->completedSize += ulnow; fileTrans->speed = speed; - qDebug() << std::format("Uploading: {} / {}, Speed: {}", fileTrans->completedSize, fileTrans->totalSize, - speed).c_str(); + //qDebug() << std::format("Uploading: {} / {}, Speed: {}", fileTrans->completedSize, fileTrans->totalSize, + // speed).c_str(); auto item = static_cast(*fileTrans); QTimer::singleShot(0, qApp, [item]() { @@ -359,6 +359,10 @@ void FileTransferManager::download(const QString &fileId, const QString &fileNam auto fileUrl = std::format("File/{}?rangeStart={}&rangeEnd={}", fileId.toStdString(), completedSize, size); auto res = httpDownload(fileUrl, savePath, item); + + if (QFileInfo(QString::fromLocal8Bit(savePath.c_str())).size() == size) + emit transferComplete(true, fileId, fileName); + qDebug() << "End Get" << res; }); } @@ -398,8 +402,6 @@ QString FileTransferManager::getFileName(const QUrl &fileUrl) } - - void FileTransferManager::getMarkdown(const QString &fileId) { QtConcurrent::run([fileId, this] { diff --git a/AicsKnowledgeBase/src/FileTransferManager.h b/AicsKnowledgeBase/src/FileTransferManager.h index 0e1c3ad..571e693 100644 --- a/AicsKnowledgeBase/src/FileTransferManager.h +++ b/AicsKnowledgeBase/src/FileTransferManager.h @@ -33,6 +33,7 @@ public: Q_INVOKABLE void getMarkdown(const QString &fileId); signals: + void transferComplete(bool download, QString fileId, QString fileName); void markdownData(QString data); private: