对照传输支持按照类型。

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

@@ -3,6 +3,7 @@
#include <QDesktopServices>
#include <QDir>
#include <QFile>
#include <QListWidget>
#include <QMessageBox>
#include <QXmlStreamReader>
#include <QXmlStreamWriter>
@@ -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<CompareItem>& items)
}
}
void Compare::TransToLeft()
void Compare::FilterFiles(bool isUpload)
{
QVector<TransTask> 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<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;
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<TransTask> 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()

View File

@@ -40,9 +40,10 @@ private:
void Search();
void Reset();
void SetResult(const QVector<CompareItem>& 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<QString> curSelectTypes_;
bool isResource_{};
QVector<CompareItem> items_;
};

View File

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