对照传输支持按照类型。
This commit is contained in:
@@ -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端,断连或者连接失败自动退出。
|
|
||||||
|
|
||||||
# 关于预构建包
|
# 关于预构建包
|
||||||
|
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|
||||||
|
|||||||
@@ -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()
|
||||||
|
|||||||
@@ -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_;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
Reference in New Issue
Block a user