diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index bc36bd2..f1b68ea 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -6,7 +6,7 @@ variables: VS_DIR: "C:/Program Files (x86)/Microsoft Visual Studio/2022/BuildTools" VS_ENV: "C:/Program Files (x86)/Microsoft Visual Studio/2022/BuildTools/Common7/Tools/Microsoft.VisualStudio.DevShell.dll" CMAKE_BUILD_TYPE: Release - PROJECT_VERSION: "0.2.4" + PROJECT_VERSION: "0.2.5" CMAKE_GENERATOR: "Ninja" PROJECT_NAME: "frelay" ARCH_TYPE: x64 @@ -14,22 +14,10 @@ variables: QT_XP: "C:/Qt/Qt5.7.1" RELEASENAME: "$PROJECT_NAME-v$PROJECT_VERSION" DESCRIPTION: | - # BUG修正 - - - 上传方完成后,接收端未接收完毕不能退出的问题。 - - 主动中断检查等待后,软件崩溃。 - - # 优化 - - - 优化访问文件过多时,界面有卡顿情况。 - - 优化资源占用多的问题。 # 功能新增 - - 支持弹窗查看文件(夹)属性。 - - 支持删除、重命名、新建文件(夹)。 - - 文件管理器新增直接可以下载/上传功能。 - - Console端,断连或者连接失败自动退出。 + - 对照传输支持按照类型传输。 # 关于预构建包 diff --git a/CMakeLists.txt b/CMakeLists.txt index 4ae50af..ad256ac 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,6 +1,6 @@ cmake_minimum_required(VERSION 3.16) -project(frelay VERSION 0.2.4 LANGUAGES CXX) +project(frelay VERSION 0.2.5 LANGUAGES CXX) set(CMAKE_CXX_STANDARD 11) set(CMAKE_CXX_STANDARD_REQUIRED ON) diff --git a/Gui/Control/CompareControl.cpp b/Gui/Control/CompareControl.cpp index 35a4af7..05df7df 100644 --- a/Gui/Control/CompareControl.cpp +++ b/Gui/Control/CompareControl.cpp @@ -3,6 +3,7 @@ #include #include #include +#include #include #include #include @@ -80,8 +81,10 @@ void Compare::InitControl() connect(ui->btnSave, &QPushButton::clicked, this, &Compare::Save); connect(ui->btnLoad, &QPushButton::clicked, this, &Compare::Load); - connect(ui->btnLeft, &QPushButton::clicked, this, &Compare::TransToLeft); - connect(ui->btnRight, &QPushButton::clicked, this, &Compare::TransToRight); + // connect(ui->btnLeft, &QPushButton::clicked, this, &Compare::TransToLeft); + // connect(ui->btnRight, &QPushButton::clicked, this, &Compare::TransToRight); + connect(ui->btnTypeDown, &QPushButton::clicked, this, [this]() { FilterFiles(false); }); + connect(ui->btnTypeUpload, &QPushButton::clicked, this, [this]() { FilterFiles(true); }); connect(ui->btnSearch, &QPushButton::clicked, this, &Compare::Search); connect(ui->btnReset, &QPushButton::clicked, this, &Compare::Reset); @@ -185,7 +188,7 @@ void Compare::Save() auto baseName = (fileName ? fileName->text() : ""); auto localDir = (localItem ? localItem->text() : ""); auto remoteDir = (remoteItem ? remoteItem->text() : ""); - + CompareItem item; item.baseName = baseName; item.localDir = localDir; @@ -376,56 +379,144 @@ void Compare::SetResult(const QVector& items) } } -void Compare::TransToLeft() +void Compare::FilterFiles(bool isUpload) { - QVector tasks; - QModelIndexList indexList = ui->tableWidget->selectionModel()->selectedRows(); + QDialog dialog(this); + QString title = QString("筛选文件类型(%1)").arg(isUpload ? tr("上传") : tr("下载")); + dialog.setWindowTitle(title); + dialog.resize(400, 300); + QListWidget listWidget(&dialog); - if (indexList.size() < 1) { - QMessageBox::information(this, tr("提示"), tr("请选择要下载的文件。")); - return; + listWidget.setSelectionMode(QAbstractItemView::NoSelection); + QListWidgetItem* allItem = new QListWidgetItem("*(ALL)"); + allItem->setData(Qt::UserRole, "*"); + allItem->setCheckState(curSelectTypes_.contains("*") ? Qt::Checked : Qt::Unchecked); + listWidget.addItem(allItem); + + int rows = ui->tableWidget->rowCount(); + for (int i = 0; i < rows; ++i) { + QString ext = ui->tableWidget->item(i, 0)->text().split(".").last().toUpper(); + QListWidgetItem* item = new QListWidgetItem(ext); + item->setData(Qt::UserRole, ext); + item->setCheckState(curSelectTypes_.contains(ext) ? Qt::Checked : Qt::Unchecked); + listWidget.addItem(item); } - for (int i = 0; i < indexList.size(); ++i) { - const QTableWidgetItem* itemF = ui->tableWidget->item(indexList[i].row(), 2); - const QTableWidgetItem* itemT = ui->tableWidget->item(indexList[i].row(), 1); + QDialogButtonBox buttons(QDialogButtonBox::Ok | QDialogButtonBox::Cancel, &dialog); + connect(&buttons, &QDialogButtonBox::accepted, &dialog, &QDialog::accept); + connect(&buttons, &QDialogButtonBox::rejected, &dialog, &QDialog::reject); + + QVBoxLayout layout(&dialog); + layout.addWidget(&listWidget); + layout.addWidget(&buttons); + dialog.setLayout(&layout); + + if (dialog.exec() == QDialog::Accepted) { + QVector selectedTypes; + for (int i = 0; i < listWidget.count(); ++i) { + QListWidgetItem* item = listWidget.item(i); + if (item->checkState() == Qt::Checked) { + selectedTypes << item->data(Qt::UserRole).toString(); + } + } + curSelectTypes_.clear(); + for (int i = 0; i < selectedTypes.count(); ++i) { + curSelectTypes_.insert(selectedTypes[i]); + } + if (isUpload) { + TransToRight(true); + } else { + TransToLeft(true); + } + } +} + +void Compare::TransToLeft(bool useSelectTypes) +{ + QVector tasks; + + auto pushTask = [&](const QString& localPath, const QString& remotePath) { TransTask task; task.taskUUID = Util::UUID(); task.isUpload = false; task.localId = GlobalData::Ins()->GetLocalID(); - task.localPath = itemT->text(); + task.localPath = localPath; task.remoteId = GlobalData::Ins()->GetRemoteID(); - task.remotePath = Util::Join(itemF->text(), ui->tableWidget->item(indexList[i].row(), 0)->text()); + task.remotePath = remotePath; tasks.push_back(task); - } + }; - emit sigTasks(tasks); + if (useSelectTypes) { + for (int i = 0; i < ui->tableWidget->rowCount(); ++i) { + QString ext = ui->tableWidget->item(i, 0)->text().split(".").last().toUpper(); + if (curSelectTypes_.contains(ext)) { + const QTableWidgetItem* itemF = ui->tableWidget->item(i, 1); + const QTableWidgetItem* itemT = ui->tableWidget->item(i, 2); + pushTask(itemT->text(), Util::Join(itemF->text(), ui->tableWidget->item(i, 0)->text())); + } + } + if (tasks.size() > 0) { + emit sigTasks(tasks); + } + } else { + QModelIndexList indexList = ui->tableWidget->selectionModel()->selectedRows(); + if (indexList.size() < 1) { + QMessageBox::information(this, tr("提示"), tr("请选择要下载的文件。")); + return; + } + for (int i = 0; i < indexList.size(); ++i) { + const QTableWidgetItem* itemF = ui->tableWidget->item(indexList[i].row(), 2); + const QTableWidgetItem* itemT = ui->tableWidget->item(indexList[i].row(), 1); + pushTask(itemT->text(), Util::Join(itemF->text(), ui->tableWidget->item(indexList[i].row(), 0)->text())); + } + if (tasks.size() > 0) { + emit sigTasks(tasks); + } + } } -void Compare::TransToRight() +void Compare::TransToRight(bool useSelectTypes) { QVector tasks; - QModelIndexList indexList = ui->tableWidget->selectionModel()->selectedRows(); - if (indexList.size() < 1) { - QMessageBox::information(this, tr("提示"), tr("请选择要上传的文件。")); - return; - } - - for (int i = 0; i < indexList.size(); ++i) { - const QTableWidgetItem* itemF = ui->tableWidget->item(indexList[i].row(), 1); - const QTableWidgetItem* itemT = ui->tableWidget->item(indexList[i].row(), 2); + auto pushTask = [&](const QString& localPath, const QString& remotePath) { TransTask task; task.taskUUID = Util::UUID(); task.isUpload = true; task.localId = GlobalData::Ins()->GetLocalID(); - task.localPath = Util::Join(itemF->text(), ui->tableWidget->item(indexList[i].row(), 0)->text()); + task.localPath = localPath; task.remoteId = GlobalData::Ins()->GetRemoteID(); - task.remotePath = itemT->text(); + task.remotePath = remotePath; tasks.push_back(task); - } + }; - emit sigTasks(tasks); + if (useSelectTypes) { + for (int i = 0; i < ui->tableWidget->rowCount(); ++i) { + QString ext = ui->tableWidget->item(i, 0)->text().split(".").last().toUpper(); + if (curSelectTypes_.contains(ext)) { + const QTableWidgetItem* itemF = ui->tableWidget->item(i, 1); + const QTableWidgetItem* itemT = ui->tableWidget->item(i, 2); + pushTask(Util::Join(itemF->text(), ui->tableWidget->item(i, 0)->text()), itemT->text()); + } + } + if (tasks.size() > 0) { + emit sigTasks(tasks); + } + } else { + QModelIndexList indexList = ui->tableWidget->selectionModel()->selectedRows(); + if (indexList.size() < 1) { + QMessageBox::information(this, tr("提示"), tr("请选择要上传的文件。")); + return; + } + for (int i = 0; i < indexList.size(); ++i) { + const QTableWidgetItem* itemF = ui->tableWidget->item(indexList[i].row(), 1); + const QTableWidgetItem* itemT = ui->tableWidget->item(indexList[i].row(), 2); + pushTask(Util::Join(itemF->text(), ui->tableWidget->item(indexList[i].row(), 0)->text()), itemT->text()); + } + if (tasks.size() > 0) { + emit sigTasks(tasks); + } + } } void Compare::deleteSelectedRows() diff --git a/Gui/Control/CompareControl.h b/Gui/Control/CompareControl.h index 68ed168..85c2d1c 100644 --- a/Gui/Control/CompareControl.h +++ b/Gui/Control/CompareControl.h @@ -40,9 +40,10 @@ private: void Search(); void Reset(); void SetResult(const QVector& items); + void FilterFiles(bool isUpload); - void TransToLeft(); - void TransToRight(); + void TransToLeft(bool useSelectTypes); + void TransToRight(bool useSelectTypes); private slots: void deleteSelectedRows(); @@ -52,6 +53,7 @@ private: Ui::Compare* ui; // 现要求,保存、删除、拖入必须重置。 + QSet curSelectTypes_; bool isResource_{}; QVector items_; }; diff --git a/Gui/Control/CompareControl.ui b/Gui/Control/CompareControl.ui index 3d7acdf..4f06100 100644 --- a/Gui/Control/CompareControl.ui +++ b/Gui/Control/CompareControl.ui @@ -67,9 +67,9 @@ - + - 下载 + 按类型下载 @@ -117,9 +117,9 @@ - + - 上传 + 按类型上传