From f108f349cc0cfe1e8ba21ab98886a1e7df62e092 Mon Sep 17 00:00:00 2001 From: taynpg Date: Sun, 29 Jun 2025 11:09:27 +0800 Subject: [PATCH] add: support reverse compare trans file. --- Gui/Control/CompareControl.cpp | 56 +++++++++++++++++++++------------- Gui/Control/cpTableWidget.cpp | 46 +++++++++++++++++----------- Gui/main.cpp | 2 +- Note/version.md | 4 +-- 4 files changed, 65 insertions(+), 43 deletions(-) diff --git a/Gui/Control/CompareControl.cpp b/Gui/Control/CompareControl.cpp index 80ea1be..0eb0aa4 100644 --- a/Gui/Control/CompareControl.cpp +++ b/Gui/Control/CompareControl.cpp @@ -33,19 +33,20 @@ void Compare::InitControl() void Compare::InitTabWidget() { QStringList headers; - headers << tr("") << tr("LocalPath") << tr("RemotePath"); + headers << tr("FileName") << tr("LocalDir") << tr("RemoteDir"); ui->tableWidget->setColumnCount(headers.size()); ui->tableWidget->setHorizontalHeaderLabels(headers); ui->tableWidget->setSelectionBehavior(QAbstractItemView::SelectRows); ui->comboBox->setEditable(true); // ui->tableWidget->setColumnWidth(0, 50); - ui->tableWidget->setColumnWidth(1, 500); - ui->tableWidget->setColumnWidth(2, 500); + ui->tableWidget->setColumnWidth(0, 400); + /// ui->tableWidget->setColumnWidth(1, 300); + ui->tableWidget->setColumnWidth(2, 300); ui->tableWidget->setSelectionBehavior(QAbstractItemView::SelectRows); - ui->tableWidget->verticalHeader()->setSectionResizeMode(QHeaderView::Fixed); - ui->tableWidget->horizontalHeader()->setSectionResizeMode(0, QHeaderView::Fixed); + // ui->tableWidget->verticalHeader()->setSectionResizeMode(QHeaderView::Stretch); + // ui->tableWidget->horizontalHeader()->setSectionResizeMode(0, QHeaderView::Stretch); ui->tableWidget->horizontalHeader()->setSectionResizeMode(1, QHeaderView::Stretch); ui->tableWidget->horizontalHeader()->setSectionResizeMode(2, QHeaderView::Stretch); @@ -84,10 +85,13 @@ void Compare::Save() QStringList paths; while (!(reader.isEndElement() && reader.name() == "Entry")) { reader.readNext(); - if (reader.isStartElement() && reader.name() == "LocalPath") { + if (reader.isStartElement() && reader.name() == "FileName") { paths << reader.readElementText(); } - if (reader.isStartElement() && reader.name() == "RemotePath") { + if (reader.isStartElement() && reader.name() == "LocalDir") { + paths << reader.readElementText(); + } + if (reader.isStartElement() && reader.name() == "RemoteDir") { paths << reader.readElementText(); } } @@ -99,8 +103,10 @@ void Compare::Save() QStringList paths; for (int row = 0; row < ui->tableWidget->rowCount(); ++row) { + QTableWidgetItem* fileName = ui->tableWidget->item(row, 0); QTableWidgetItem* localItem = ui->tableWidget->item(row, 1); QTableWidgetItem* remoteItem = ui->tableWidget->item(row, 2); + paths << (fileName ? fileName->text() : ""); paths << (localItem ? localItem->text() : ""); paths << (remoteItem ? remoteItem->text() : ""); } @@ -118,9 +124,10 @@ void Compare::Save() writer.writeAttribute("title", it.key()); const QStringList& pathList = it.value(); - for (int i = 0; i < pathList.size(); i += 2) { - writer.writeTextElement("LocalPath", pathList[i]); - writer.writeTextElement("RemotePath", pathList[i + 1]); + for (int i = 0; i < pathList.size(); i += 3) { + writer.writeTextElement("FileName", pathList[i]); + writer.writeTextElement("LocalDir", pathList[i + 1]); + writer.writeTextElement("RemoteDir", pathList[i + 2]); } writer.writeEndElement(); @@ -163,20 +170,25 @@ void Compare::Load() while (!(reader.isEndElement() && reader.name() == "Entry")) { reader.readNext(); - if (reader.isStartElement() && reader.name() == "LocalPath") { + if (reader.isStartElement() && reader.name() == "FileName") { paths << reader.readElementText(); } - if (reader.isStartElement() && reader.name() == "RemotePath") { + if (reader.isStartElement() && reader.name() == "LocalDir") { + paths << reader.readElementText(); + } + if (reader.isStartElement() && reader.name() == "RemoteDir") { paths << reader.readElementText(); } } - for (int i = 0; i < paths.size(); i += 2) { + for (int i = 0; i < paths.size(); i += 3) { int row = ui->tableWidget->rowCount(); ui->tableWidget->insertRow(row); - QTableWidgetItem* localItem = new QTableWidgetItem(paths[i]); - QTableWidgetItem* remoteItem = new QTableWidgetItem(paths[i + 1]); + QTableWidgetItem* fileName = new QTableWidgetItem(paths[i]); + QTableWidgetItem* localItem = new QTableWidgetItem(paths[i + 1]); + QTableWidgetItem* remoteItem = new QTableWidgetItem(paths[i + 2]); + ui->tableWidget->setItem(row, 0, fileName); ui->tableWidget->setItem(row, 1, localItem); ui->tableWidget->setItem(row, 2, remoteItem); } @@ -189,7 +201,7 @@ void Compare::Load() if (!found) { FTCommon::msg(this, tr("No data found for the selected title.")); } else { - //FTCommon::msg(this, tr("Data loaded successfully.")); + // FTCommon::msg(this, tr("Data loaded successfully.")); } } @@ -233,14 +245,14 @@ void Compare::TransToLeft() QModelIndexList indexList = ui->tableWidget->selectionModel()->selectedRows(); 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); + const QTableWidgetItem* itemF = ui->tableWidget->item(indexList[i].row(), 2); + const QTableWidgetItem* itemT = ui->tableWidget->item(indexList[i].row(), 1); TransTask task; task.isUpload = false; task.localId = GlobalData::Ins()->GetLocalID(); - task.localPath = itemF->text(); + task.localPath = itemT->text(); task.remoteId = GlobalData::Ins()->GetRemoteID(); - task.remotePath = itemT->text(); + task.remotePath = Util::Join(itemF->text(), ui->tableWidget->item(indexList[i].row(), 0)->text()); tasks.push_back(task); } @@ -258,11 +270,11 @@ void Compare::TransToRight() TransTask task; task.isUpload = true; task.localId = GlobalData::Ins()->GetLocalID(); - task.localPath = itemF->text(); + task.localPath = Util::Join(itemF->text(), ui->tableWidget->item(indexList[i].row(), 0)->text()); task.remoteId = GlobalData::Ins()->GetRemoteID(); task.remotePath = itemT->text(); tasks.push_back(task); - } + } emit sigTasks(tasks); } diff --git a/Gui/Control/cpTableWidget.cpp b/Gui/Control/cpTableWidget.cpp index e4c3ed1..ad15c73 100644 --- a/Gui/Control/cpTableWidget.cpp +++ b/Gui/Control/cpTableWidget.cpp @@ -45,18 +45,14 @@ void CpTableWidget::dropEvent(QDropEvent* event) return; } - QStringList draggedData; + QStringList parseData; while (!stream.atEnd()) { int row, col; QMap roleData; stream >> row >> col >> roleData; - if (col != 1) { - continue; - } - draggedData.append(roleData[Qt::DisplayRole].toString()); + parseData.append(roleData[Qt::DisplayRole].toString()); } - - if (draggedData.isEmpty()) { + if (parseData.isEmpty()) { event->ignore(); return; } @@ -65,22 +61,36 @@ void CpTableWidget::dropEvent(QDropEvent* event) if (currentRow == -1) { currentRow = rowCount(); } - for (const QString& text : draggedData) { + + auto setItemData = [this](int row, int col, const QString& data) { + QTableWidgetItem* item = this->item(row, col); + if (!item) { + item = new QTableWidgetItem(data); + setItem(row, col, item); + } else { + item->setText(data); + } + }; + + for (int i = 0; i < (parseData.size() / 5); ++i, ++currentRow) { if (currentRow >= rowCount()) { insertRow(rowCount()); } - QString cur = startCol == 1 ? Util::Join(GlobalData::Ins()->GetLocalRoot(), text) - : Util::Join(GlobalData::Ins()->GetRemoteRoot(), text); - QTableWidgetItem* item = this->item(currentRow, startCol); - if (!item) { - item = new QTableWidgetItem(cur); - setItem(currentRow, startCol, item); - } else { - item->setText(cur); + if (parseData[i * 5 + 3] == "Dir") { + if (startCol == 1) { + setItemData(currentRow, startCol, Util::Join(GlobalData::Ins()->GetLocalRoot(), parseData[i * 5 + 1])); + } else { + setItemData(currentRow, startCol, Util::Join(GlobalData::Ins()->GetRemoteRoot(), parseData[i * 5 + 1])); + } + continue; + } + setItemData(currentRow, 0, parseData[i * 5 + 1]); + if (startCol == 1) { + setItemData(currentRow, 1, GlobalData::Ins()->GetLocalRoot()); + } else { + setItemData(currentRow, 2, GlobalData::Ins()->GetRemoteRoot()); } - currentRow++; } - event->acceptProposedAction(); } diff --git a/Gui/main.cpp b/Gui/main.cpp index 0e6c712..ca409a9 100644 --- a/Gui/main.cpp +++ b/Gui/main.cpp @@ -32,7 +32,7 @@ int main(int argc, char* argv[]) #ifdef _WIN32 QFont font("Microsoft YaHei", 9); a.setFont(font); - // a.setStyle("fusion"); + //a.setStyle("fusion"); a.setStyle("windows"); #endif diff --git a/Note/version.md b/Note/version.md index 6adb683..364eb35 100644 --- a/Note/version.md +++ b/Note/version.md @@ -19,13 +19,13 @@ | 13 | 功能 | IP端口部分要添加可选择历史。 | | 0.1 | 0.2 | | 12 | 功能 | 对照传输前要先校验文件存在性。 | | 0.1 | | | 11 | 问题 | 断连后当前远端ID要清除。 | | 0.1 | 0.2 | -| 10 | 功能 | 对照传输可以支持反向下载。 | | 0.1 | | +| 10 | 功能 | 对照传输可以支持反向下载。 | | 0.1 | 0.2 | | 9 | 优化 | 输入路径后可以直接回车访问。 | | 0.1 | 0.2 | | 8 | 功能 | 文件浏览页面要支持按照类型排序,时间排序,和文件后缀筛选。 | | 0.1 | 0.2 | | 7 | 优化 | IP和Port宽度要合理一些,IP过小,Port宽度过大。 | | 0.1 | 0.2 | | 6 | 功能 | 比对控件添加可尝试目录浏览控件跳转到指定目录。 | | 0.1 | | | 5 | 问题 | 未设置心跳包,导致超时被Server端踢出。 | 必改 | 0.1 | 0.2 | -| 4 | 问题 | 重复链接Server会崩溃。 | | 0.1 | | +| 4 | 问题 | 重复链接Server会崩溃。 | | 0.1 | 0.2 | | 3 | 优化 | 首次启动时应当按照当前分辨率进行初始化大小,而不是指定大小。 | | 0.1 | 0.2 | | 2 | 问题 | 当某个文件传输失败的时候,关闭传输窗口,再次传输显示已经在传输中。 | | 0.1 | | | 1 | 问题 | Console端显示未注册QSharedPointer\类型 | | 0.1 | 0.2 |