对照传输支持按照类型。

This commit is contained in:
2026-02-02 21:25:58 +08:00
parent e3e1292455
commit 5a659d4f01
5 changed files with 132 additions and 51 deletions

View File

@@ -6,7 +6,7 @@ variables:
VS_DIR: "C:/Program Files (x86)/Microsoft Visual Studio/2022/BuildTools" 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" VS_ENV: "C:/Program Files (x86)/Microsoft Visual Studio/2022/BuildTools/Common7/Tools/Microsoft.VisualStudio.DevShell.dll"
CMAKE_BUILD_TYPE: Release CMAKE_BUILD_TYPE: Release
PROJECT_VERSION: "0.2.4" PROJECT_VERSION: "0.2.5"
CMAKE_GENERATOR: "Ninja" CMAKE_GENERATOR: "Ninja"
PROJECT_NAME: "frelay" PROJECT_NAME: "frelay"
ARCH_TYPE: x64 ARCH_TYPE: x64
@@ -14,22 +14,10 @@ variables:
QT_XP: "C:/Qt/Qt5.7.1" QT_XP: "C:/Qt/Qt5.7.1"
RELEASENAME: "$PROJECT_NAME-v$PROJECT_VERSION" RELEASENAME: "$PROJECT_NAME-v$PROJECT_VERSION"
DESCRIPTION: | DESCRIPTION: |
# BUG修正
- 上传方完成后,接收端未接收完毕不能退出的问题。
- 主动中断检查等待后,软件崩溃。
# 优化
- 优化访问文件过多时,界面有卡顿情况。
- 优化资源占用多的问题。
# 功能新增 # 功能新增
- 支持弹窗查看文件(夹)属性。 - 对照传输支持按照类型传输。
- 支持删除、重命名、新建文件(夹)。
- 文件管理器新增直接可以下载/上传功能。
- Console端,断连或者连接失败自动退出。
# 关于预构建包 # 关于预构建包

View File

@@ -1,6 +1,6 @@
cmake_minimum_required(VERSION 3.16) 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 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_STANDARD_REQUIRED ON)

View File

@@ -3,6 +3,7 @@
#include <QDesktopServices> #include <QDesktopServices>
#include <QDir> #include <QDir>
#include <QFile> #include <QFile>
#include <QListWidget>
#include <QMessageBox> #include <QMessageBox>
#include <QXmlStreamReader> #include <QXmlStreamReader>
#include <QXmlStreamWriter> #include <QXmlStreamWriter>
@@ -80,8 +81,10 @@ void Compare::InitControl()
connect(ui->btnSave, &QPushButton::clicked, this, &Compare::Save); connect(ui->btnSave, &QPushButton::clicked, this, &Compare::Save);
connect(ui->btnLoad, &QPushButton::clicked, this, &Compare::Load); connect(ui->btnLoad, &QPushButton::clicked, this, &Compare::Load);
connect(ui->btnLeft, &QPushButton::clicked, this, &Compare::TransToLeft); // connect(ui->btnLeft, &QPushButton::clicked, this, &Compare::TransToLeft);
connect(ui->btnRight, &QPushButton::clicked, this, &Compare::TransToRight); // 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->btnSearch, &QPushButton::clicked, this, &Compare::Search);
connect(ui->btnReset, &QPushButton::clicked, this, &Compare::Reset); connect(ui->btnReset, &QPushButton::clicked, this, &Compare::Reset);
@@ -376,56 +379,144 @@ void Compare::SetResult(const QVector<CompareItem>& items)
} }
} }
void Compare::TransToLeft() void Compare::FilterFiles(bool isUpload)
{ {
QVector<TransTask> tasks; QDialog dialog(this);
QModelIndexList indexList = ui->tableWidget->selectionModel()->selectedRows(); QString title = QString("筛选文件类型(%1)").arg(isUpload ? tr("上传") : tr("下载"));
dialog.setWindowTitle(title);
dialog.resize(400, 300);
QListWidget listWidget(&dialog);
if (indexList.size() < 1) { listWidget.setSelectionMode(QAbstractItemView::NoSelection);
QMessageBox::information(this, tr("提示"), tr("请选择要下载的文件。")); QListWidgetItem* allItem = new QListWidgetItem("*(ALL)");
return; 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) { QDialogButtonBox buttons(QDialogButtonBox::Ok | QDialogButtonBox::Cancel, &dialog);
const QTableWidgetItem* itemF = ui->tableWidget->item(indexList[i].row(), 2); connect(&buttons, &QDialogButtonBox::accepted, &dialog, &QDialog::accept);
const QTableWidgetItem* itemT = ui->tableWidget->item(indexList[i].row(), 1); 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<QString> 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<TransTask> tasks;
auto pushTask = [&](const QString& localPath, const QString& remotePath) {
TransTask task; TransTask task;
task.taskUUID = Util::UUID(); task.taskUUID = Util::UUID();
task.isUpload = false; task.isUpload = false;
task.localId = GlobalData::Ins()->GetLocalID(); task.localId = GlobalData::Ins()->GetLocalID();
task.localPath = itemT->text(); task.localPath = localPath;
task.remoteId = GlobalData::Ins()->GetRemoteID(); 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); tasks.push_back(task);
};
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); emit sigTasks(tasks);
} }
} else {
void Compare::TransToRight()
{
QVector<TransTask> tasks;
QModelIndexList indexList = ui->tableWidget->selectionModel()->selectedRows(); QModelIndexList indexList = ui->tableWidget->selectionModel()->selectedRows();
if (indexList.size() < 1) { if (indexList.size() < 1) {
QMessageBox::information(this, tr("提示"), tr("请选择要上传的文件。")); QMessageBox::information(this, tr("提示"), tr("请选择要下载的文件。"));
return; return;
} }
for (int i = 0; i < indexList.size(); ++i) { for (int i = 0; i < indexList.size(); ++i) {
const QTableWidgetItem* itemF = ui->tableWidget->item(indexList[i].row(), 1); const QTableWidgetItem* itemF = ui->tableWidget->item(indexList[i].row(), 2);
const QTableWidgetItem* itemT = 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(bool useSelectTypes)
{
QVector<TransTask> tasks;
auto pushTask = [&](const QString& localPath, const QString& remotePath) {
TransTask task; TransTask task;
task.taskUUID = Util::UUID(); task.taskUUID = Util::UUID();
task.isUpload = true; task.isUpload = true;
task.localId = GlobalData::Ins()->GetLocalID(); 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.remoteId = GlobalData::Ins()->GetRemoteID();
task.remotePath = itemT->text(); task.remotePath = remotePath;
tasks.push_back(task); tasks.push_back(task);
} };
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); 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() void Compare::deleteSelectedRows()

View File

@@ -40,9 +40,10 @@ private:
void Search(); void Search();
void Reset(); void Reset();
void SetResult(const QVector<CompareItem>& items); void SetResult(const QVector<CompareItem>& items);
void FilterFiles(bool isUpload);
void TransToLeft(); void TransToLeft(bool useSelectTypes);
void TransToRight(); void TransToRight(bool useSelectTypes);
private slots: private slots:
void deleteSelectedRows(); void deleteSelectedRows();
@@ -52,6 +53,7 @@ private:
Ui::Compare* ui; Ui::Compare* ui;
// 现要求,保存、删除、拖入必须重置。 // 现要求,保存、删除、拖入必须重置。
QSet<QString> curSelectTypes_;
bool isResource_{}; bool isResource_{};
QVector<CompareItem> items_; QVector<CompareItem> items_;
}; };

View File

@@ -67,9 +67,9 @@
<item> <item>
<layout class="QHBoxLayout" name="horizontalLayout_2"> <layout class="QHBoxLayout" name="horizontalLayout_2">
<item> <item>
<widget class="QPushButton" name="btnLeft"> <widget class="QPushButton" name="btnTypeDown">
<property name="text"> <property name="text">
<string>下载</string> <string>按类型下载</string>
</property> </property>
</widget> </widget>
</item> </item>
@@ -117,9 +117,9 @@
</spacer> </spacer>
</item> </item>
<item> <item>
<widget class="QPushButton" name="btnRight"> <widget class="QPushButton" name="btnTypeUpload">
<property name="text"> <property name="text">
<string>上传</string> <string>按类型上传</string>
</property> </property>
</widget> </widget>
</item> </item>