Compare commits

...

10 Commits

Author SHA1 Message Date
2f8b55be3b fix:按照类型传输时,类型重复的问题修正。 2026-02-03 23:43:09 +08:00
9f54ef60f9 fix:修正一个头文件包含问题。 2026-02-02 22:04:58 +08:00
4b6867bb76 Note更新。 2026-02-02 21:57:31 +08:00
2de857baeb 日志内容清空功能。 2026-02-02 21:46:02 +08:00
a0b3d4967b 选择上传下载移动到右键菜单中 2026-02-02 21:30:57 +08:00
e09cf859b8 删除新建成功时不提示。 2026-02-02 21:28:25 +08:00
5a659d4f01 对照传输支持按照类型。 2026-02-02 21:25:58 +08:00
e3e1292455 打包名称包含位数信息。 2026-01-29 21:21:23 +08:00
152e4984a7 流水线脚本。 2026-01-29 20:26:17 +08:00
55c4bf6a8f Zed环境修正 2025-12-29 21:43:51 +08:00
14 changed files with 333 additions and 93 deletions

120
.gitlab-ci.yml Normal file
View File

@@ -0,0 +1,120 @@
stages:
- build
- release
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.6"
CMAKE_GENERATOR: "Ninja"
PROJECT_NAME: "frelay"
ARCH_TYPE: x64
QT_PATH: "C:/Dev/qt6"
QT_XP: "C:/Qt/Qt5.7.1"
RELEASENAME: "$PROJECT_NAME-v$PROJECT_VERSION"
DESCRIPTION: |
# 优化
- 按照类型传输时,类型重复的问题修正。
# 关于预构建包
Windows XP系统请使用Windows-GNU-x86版本。
# Windows运行器配置
.win-template: &win
tags:
- win
before_script:
- echo "Running on Windows runner"
artifacts:
expire_in: 1 hour
# Windows构建 - 在win运行器上执行
build-xp:
<<: *win
stage: build
rules:
- if: $CI_COMMIT_TAG
before_script:
- $env:QT_DIR = "$env:QT_XP/5.7/mingw53_32"
- $env:COMPILE_DIR = "$env:QT_XP/Tools/mingw530_32"
- $env:PATH = "$env:COMPILE_DIR/bin;$env:PATH"
script:
- Write-Host "开始Windows XP构建..."
- Write-Host "$env:QT_DIR"
- Write-Host "$env:COMPILE_DIR"
- cmake -Bbuild-xp -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE="$CMAKE_BUILD_TYPE" -DCMAKE_PREFIX_PATH="$env:QT_DIR" -DQT_DEFAULT_MAJOR_VERSION=5 -DCOMPILE_GUI=ON -DRELEASE_MARK=ON
- cmake --build build-xp --config "$CMAKE_BUILD_TYPE"
- Write-Host "package windows start..."
- cd build-xp
- cpack
artifacts:
paths:
- build-xp/frelay-release-v$PROJECT_VERSION-Windows-GNU-x86.exe
- build-xp/frelay-release-v$PROJECT_VERSION-Windows-GNU-x86.zip
build-windows:
<<: *win
stage: build
rules:
- if: $CI_COMMIT_TAG
script:
- Import-Module $VS_ENV
- Enter-VsDevShell -VsInstallPath $VS_DIR -DevCmdArguments "-arch=$ARCH_TYPE"
- cmake -Bbuild -G "$CMAKE_GENERATOR" -DCMAKE_BUILD_TYPE="$CMAKE_BUILD_TYPE" -DCMAKE_PREFIX_PATH="$QT_PATH" -DQT_DEFAULT_MAJOR_VERSION=6 -DCOMPILE_GUI=ON -DRELEASE_MARK=ON
- cmake --build build --config "$CMAKE_BUILD_TYPE"
- Write-Host "package windows start..."
- cd build
- cpack
artifacts:
paths:
- build/frelay-release-v$PROJECT_VERSION-Windows-MSVC-x64.exe
- build/frelay-release-v$PROJECT_VERSION-Windows-MSVC-x64.zip
create-release:
stage: release
needs: ["build-windows", "build-xp"]
tags:
- pi
variables:
RELEASE_TAG: "v$PROJECT_VERSION"
RELEASE_NAME: "$RELEASENAME"
RELEASE_DESCRIPTION: "$DESCRIPTION"
rules:
- if: $CI_COMMIT_TAG
script:
- echo "start release"
- >
curl --fail --show-error --header "JOB-TOKEN: $CI_JOB_TOKEN" \
--upload-file "build/frelay-release-v$PROJECT_VERSION-Windows-MSVC-x64.exe" \
"${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/generic/releases/v$PROJECT_VERSION/frelay-release-v$PROJECT_VERSION-Windows-MSVC-x64.exe"
- >
curl --fail --show-error --header "JOB-TOKEN: $CI_JOB_TOKEN" \
--upload-file "build/frelay-release-v$PROJECT_VERSION-Windows-MSVC-x64.zip" \
"${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/generic/releases/v$PROJECT_VERSION/frelay-release-v$PROJECT_VERSION-Windows-MSVC-x64.zip"
- >
curl --fail --show-error --header "JOB-TOKEN: $CI_JOB_TOKEN" \
--upload-file "build-xp/frelay-release-v$PROJECT_VERSION-Windows-GNU-x86.exe" \
"${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/generic/releases/v$PROJECT_VERSION/frelay-release-v$PROJECT_VERSION-Windows-GNU-x86.exe"
- >
curl --fail --show-error --header "JOB-TOKEN: $CI_JOB_TOKEN" \
--upload-file "build-xp/frelay-release-v$PROJECT_VERSION-Windows-GNU-x86.zip" \
"${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/generic/releases/v$PROJECT_VERSION/frelay-release-v$PROJECT_VERSION-Windows-GNU-x86.zip"
release:
tag_name: $RELEASE_TAG
name: $RELEASE_NAME
description: $RELEASE_DESCRIPTION
assets:
links:
- name: "frelay-release-v$PROJECT_VERSION-Windows-MSVC-x64.exe"
url: "${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/generic/releases/v$PROJECT_VERSION/frelay-release-v$PROJECT_VERSION-Windows-MSVC-x64.exe"
- name: "frelay-release-v$PROJECT_VERSION-Windows-MSVC-x64.zip"
url: "${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/generic/releases/v$PROJECT_VERSION/frelay-release-v$PROJECT_VERSION-Windows-MSVC-x64.zip"
- name: "frelay-release-v$PROJECT_VERSION-Windows-GNU-x86.exe"
url: "${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/generic/releases/v$PROJECT_VERSION/frelay-release-v$PROJECT_VERSION-Windows-GNU-x86.exe"
- name: "frelay-release-v$PROJECT_VERSION-Windows-GNU-x86.zip"
url: "${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/generic/releases/v$PROJECT_VERSION/frelay-release-v$PROJECT_VERSION-Windows-GNU-x86.zip"

View File

@@ -13,6 +13,7 @@
"ignoreFailures": true "ignoreFailures": true
} }
], ],
"visualizerFile": "${workspaceRoot}/.vscode/qt6.natvis",
"args": [] "args": []
}, },
"cmake.configureSettings": { "cmake.configureSettings": {

View File

@@ -1,10 +1,3 @@
// Zed keymap
//
// For information on binding keys, see the Zed
// documentation: https://zed.dev/docs/key-bindings
//
// To see the default key bindings run `zed: open default keymap`
// from the command palette.
[ [
{ {
"context": "Editor", "context": "Editor",

View File

@@ -1,16 +1,3 @@
// Zed settings
//
// For information on how to configure Zed, see the Zed
// documentation: https://zed.dev/docs/configuring-zed
//
// To see all of Zed's default settings without changing your
// custom settings, run `zed: open default settings` from the
// command palette (cmd-shift-p / ctrl-shift-p)
//
// 需要安装的依赖有
// 1.Nodejs
// 2.jsonnet-language-server
// 3.clangd
{ {
"tab_size": 4, "tab_size": 4,
"vim_mode": false, "vim_mode": false,
@@ -22,9 +9,6 @@
"light": "One Light", "light": "One Light",
"dark": "One Dark", "dark": "One Dark",
}, },
"file_types": {
"Jsonnet": ["cfg"],
},
"lsp": { "lsp": {
"clangd": { "clangd": {
"binary": { "binary": {
@@ -42,12 +26,5 @@
], ],
}, },
}, },
"jsonnet-language-server": {
"settings": {
"formatting": {
"indent": 4,
},
},
},
}, },
} }

View File

@@ -1,13 +1,13 @@
[ [
{ {
"label": "CmakeConfig", "label": "Config",
"command": "cmd", "command": "cmd",
"env": { "env": {
"VS2026ENV": "\"C:\\Program Files\\Microsoft Visual Studio\\18\\Community\\VC\\Auxiliary\\Build\\vcvars64.bat\"", "BUILDTOOL": "\"C:\\Program Files (x86)\\Microsoft Visual Studio\\2022\\BuildTools\\VC\\Auxiliary\\Build\\vcvars64.bat\"",
}, },
"args": [ "args": [
"/c", "/c",
"$VS2026ENV && cmake -Bbuild -G Ninja -S . -DCOMPILE_GUI=ON -DCMAKE_BUILD_TYPE=Debug", "\"%BUILDTOOL% && cmake -Bbuild -G Ninja -S . -DCMAKE_PREFIX_PATH=C:\\Kit\\Qt6 -DCMAKE_EXPORT_COMPILE_COMMANDS=ON\"",
], ],
"cwd": "$ZED_WORKTREE_ROOT", "cwd": "$ZED_WORKTREE_ROOT",
"use_new_terminal": false, "use_new_terminal": false,
@@ -15,12 +15,12 @@
"show_summary": true, "show_summary": true,
}, },
{ {
"label": "CmakeBuild", "label": "Build",
"command": "cmd", "command": "cmd",
"env": { "env": {
"VS2026ENV": "\"C:\\Program Files\\Microsoft Visual Studio\\18\\Community\\VC\\Auxiliary\\Build\\vcvars64.bat\"", "BUILDTOOL": "\"C:\\Program Files (x86)\\Microsoft Visual Studio\\2022\\BuildTools\\VC\\Auxiliary\\Build\\vcvars64.bat\"",
}, },
"args": ["/c", "$VS2026ENV && cmake --build build --config Debug"], "args": ["/c", "\"%BUILDTOOL% && cmake --build build --config Debug\""],
"cwd": "$ZED_WORKTREE_ROOT", "cwd": "$ZED_WORKTREE_ROOT",
"use_new_terminal": false, "use_new_terminal": false,
"show_command": true, "show_command": true,

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.6 LANGUAGES CXX)
set(CMAKE_CXX_STANDARD 11) set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_STANDARD_REQUIRED ON)
@@ -169,5 +169,12 @@ set(CPACK_NSIS_DELETE_ICONS_EXTRA "
else() else()
set(CPACK_GENERATOR "TGZ") set(CPACK_GENERATOR "TGZ")
endif() endif()
set(CPACK_PACKAGE_FILE_NAME "${CPACK_PACKAGE_NAME}-${DEVELOP_MARK}-v${CPACK_PACKAGE_VERSION}-${CMAKE_SYSTEM_NAME}-${CMAKE_CXX_COMPILER_ID}") if(CMAKE_SIZEOF_VOID_P EQUAL 8)
set(ARCH_BIT "x64")
elseif(CMAKE_SIZEOF_VOID_P EQUAL 4)
set(ARCH_BIT "x86")
else()
message(FATAL_ERROR "Unknown target architecture")
endif()
set(CPACK_PACKAGE_FILE_NAME "${CPACK_PACKAGE_NAME}-${DEVELOP_MARK}-v${CPACK_PACKAGE_VERSION}-${CMAKE_SYSTEM_NAME}-${CMAKE_CXX_COMPILER_ID}-${ARCH_BIT}")
include(CPack) include(CPack)

View File

@@ -1,8 +1,10 @@
#include "CompareControl.h" #include "CompareControl.h"
#include <QDesktopServices> #include <QDesktopServices>
#include <QDialogButtonBox>
#include <QDir> #include <QDir>
#include <QFile> #include <QFile>
#include <QListWidget>
#include <QMessageBox> #include <QMessageBox>
#include <QXmlStreamReader> #include <QXmlStreamReader>
#include <QXmlStreamWriter> #include <QXmlStreamWriter>
@@ -44,17 +46,6 @@ void Compare::InitMenu()
auto path = item->text(); auto path = item->text();
emit sigTryVisit(false, path); emit sigTryVisit(false, path);
}); });
menu_->addAction(tr("添加新行"), this, [this]() {
int cnt = ui->tableWidget->rowCount();
ui->tableWidget->insertRow(cnt);
auto item1 = new QTableWidgetItem("");
auto item2 = new QTableWidgetItem("");
auto item3 = new QTableWidgetItem("");
ui->tableWidget->setItem(cnt, 0, item1);
ui->tableWidget->setItem(cnt, 1, item2);
ui->tableWidget->setItem(cnt, 2, item3);
});
menu_->addAction(tr("删除"), this, [this]() { deleteSelectedRows(); });
menu_->addAction(tr("尝试打开本地路径"), this, [this]() { menu_->addAction(tr("尝试打开本地路径"), this, [this]() {
auto selected = ui->tableWidget->selectedItems(); auto selected = ui->tableWidget->selectedItems();
if (selected.size() != 3) { if (selected.size() != 3) {
@@ -69,6 +60,19 @@ void Compare::InitMenu()
} }
QDesktopServices::openUrl(QUrl::fromLocalFile(path)); QDesktopServices::openUrl(QUrl::fromLocalFile(path));
}); });
menu_->addAction(tr("添加新行"), this, [this]() {
int cnt = ui->tableWidget->rowCount();
ui->tableWidget->insertRow(cnt);
auto item1 = new QTableWidgetItem("");
auto item2 = new QTableWidgetItem("");
auto item3 = new QTableWidgetItem("");
ui->tableWidget->setItem(cnt, 0, item1);
ui->tableWidget->setItem(cnt, 1, item2);
ui->tableWidget->setItem(cnt, 2, item3);
});
menu_->addAction(tr("删除"), this, [this]() { deleteSelectedRows(); });
menu_->addAction(tr("上传"), this, [this]() { TransToRight(false); });
menu_->addAction(tr("下载"), this, [this]() { TransToLeft(false); });
menu_->addSeparator(); menu_->addSeparator();
connect(ui->tableWidget, &QTableWidget::customContextMenuRequested, this, connect(ui->tableWidget, &QTableWidget::customContextMenuRequested, this,
[this](const QPoint& pos) { menu_->exec(QCursor::pos()); }); [this](const QPoint& pos) { menu_->exec(QCursor::pos()); });
@@ -80,8 +84,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,57 +382,149 @@ 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, "*ALL");
allItem->setCheckState(curSelectTypes_.contains("*") ? Qt::Checked : Qt::Unchecked);
listWidget.addItem(allItem);
std::map<QString, int> typeCounts;
int rows = ui->tableWidget->rowCount();
for (int i = 0; i < rows; ++i) {
QString ext = ui->tableWidget->item(i, 0)->text().split(".").last().toLower();
if (typeCounts.count(ext) < 1) {
QListWidgetItem* item = new QListWidgetItem(ext);
item->setData(Qt::UserRole, ext);
item->setCheckState(curSelectTypes_.contains(ext) ? Qt::Checked : Qt::Unchecked);
listWidget.addItem(item);
typeCounts[ext] = 1;
}
} }
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().toLower();
if (curSelectTypes_.contains(ext) || curSelectTypes_.contains("*ALL")) {
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().toLower();
if (curSelectTypes_.contains(ext) || curSelectTypes_.contains("*ALL")) {
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>

View File

@@ -569,7 +569,7 @@ void FileManager::OperNewFolder()
if (!isRemote_) { if (!isRemote_) {
QString ret = Util::NewDir(folder); QString ret = Util::NewDir(folder);
if (ret.isEmpty()) { if (ret.isEmpty()) {
QMessageBox::information(this, tr("提示"), tr("创建%1成功").arg(folder)); //QMessageBox::information(this, tr("提示"), tr("创建%1成功").arg(folder));
DirFileInfo nf; DirFileInfo nf;
nf.size = 0; nf.size = 0;
nf.type = Dir; nf.type = Dir;
@@ -609,7 +609,7 @@ void FileManager::OperNewFolder()
if (msg.msg == STR_NONE || !msg.msg.isEmpty()) { if (msg.msg == STR_NONE || !msg.msg.isEmpty()) {
QMessageBox::information(this, tr("提示"), QString(tr("新建失败=>%1")).arg(msg.msg)); QMessageBox::information(this, tr("提示"), QString(tr("新建失败=>%1")).arg(msg.msg));
} else { } else {
QMessageBox::information(this, tr("提示"), QString(tr("新建%1成功。")).arg(folder)); //QMessageBox::information(this, tr("提示"), QString(tr("新建%1成功。")).arg(folder));
DirFileInfo nf; DirFileInfo nf;
nf.size = 0; nf.size = 0;
nf.type = Dir; nf.type = Dir;
@@ -642,7 +642,7 @@ void FileManager::OperDelete()
if (!isRemote_) { if (!isRemote_) {
QString ret = Util::Delete(name); QString ret = Util::Delete(name);
if (ret.isEmpty()) { if (ret.isEmpty()) {
QMessageBox::information(this, tr("提示"), tr("删除成功")); //QMessageBox::information(this, tr("提示"), tr("删除成功"));
int row = datas[0]->row(); int row = datas[0]->row();
ui->tableWidget->removeRow(row); ui->tableWidget->removeRow(row);
} else { } else {
@@ -676,7 +676,7 @@ void FileManager::OperDelete()
if (msg.msg == STR_NONE || !msg.msg.isEmpty()) { if (msg.msg == STR_NONE || !msg.msg.isEmpty()) {
QMessageBox::information(this, tr("提示"), QString(tr("删除失败=>%1")).arg(msg.msg)); QMessageBox::information(this, tr("提示"), QString(tr("删除失败=>%1")).arg(msg.msg));
} else { } else {
QMessageBox::information(this, tr("提示"), QString(tr("删除成功。"))); //QMessageBox::information(this, tr("提示"), QString(tr("删除成功。")));
ui->tableWidget->removeRow(datas[0]->row()); ui->tableWidget->removeRow(datas[0]->row());
} }
} }

View File

@@ -2,6 +2,7 @@
#include <QDateTime> #include <QDateTime>
#include <QListWidgetItem> #include <QListWidgetItem>
#include <QMessageBox>
#include <QStandardItem> #include <QStandardItem>
#include <chrono> #include <chrono>
#include <ctime> #include <ctime>
@@ -25,6 +26,15 @@ void LogPrint::InitControl()
connect(styleHints_, &QStyleHints::colorSchemeChanged, this, &LogPrint::ColorChange); connect(styleHints_, &QStyleHints::colorSchemeChanged, this, &LogPrint::ColorChange);
#endif #endif
ui->pedText->setReadOnly(true); ui->pedText->setReadOnly(true);
connect(ui->btnClear, &QPushButton::clicked, [this]() {
QMessageBox::StandardButton reply = QMessageBox::question(this, tr("确认清空"), tr("确定要清空所有内容吗?"),
QMessageBox::Yes | QMessageBox::No, QMessageBox::No);
if (reply == QMessageBox::Yes) {
ui->pedText->clear();
}
});
} }
std::string LogPrint::now_str() std::string LogPrint::now_str()

View File

@@ -6,8 +6,8 @@
<rect> <rect>
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>767</width> <width>831</width>
<height>291</height> <height>396</height>
</rect> </rect>
</property> </property>
<property name="windowTitle"> <property name="windowTitle">
@@ -17,6 +17,33 @@
<item> <item>
<widget class="QPlainTextEdit" name="pedText"/> <widget class="QPlainTextEdit" name="pedText"/>
</item> </item>
<item>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Orientation::Vertical</enum>
</property>
<property name="sizeType">
<enum>QSizePolicy::Policy::Expanding</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>60</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QPushButton" name="btnClear">
<property name="text">
<string>清空</string>
</property>
</widget>
</item>
</layout>
</item>
</layout> </layout>
</widget> </widget>
<resources/> <resources/>

View File

@@ -8,6 +8,11 @@
| 序号 | 类型 | 内容 | 说明 | 基于版本 | 完成版本 | | 序号 | 类型 | 内容 | 说明 | 基于版本 | 完成版本 |
| :--: | :--: | ------------------------------------------------------------ | :----: | :------: | :------: | | :--: | :--: | ------------------------------------------------------------ | :----: | :------: | :------: |
| 51 | 问题 | 按照类型传输时,类型重复的问题修正 | | 0.2.5 | 0.2.6 |
| 50 | 功能 | 添加日志内容清空按钮。 | | 0.2.4 | 0.2.5 |
| 49 | 功能 | 对照传输支持按照类型传输。 | | 0.2.4 | 0.2.5 |
| 48 | 优化 | 选择上传下载移动到右键菜单中。 | | 0.2.4 | 0.2.5 |
| 47 | 优化 | 删除新建文件(夹)成功时不提示。 | | 0.2.4 | 0.2.5 |
| 46 | 功能 | 需要一个压缩传输功能。 | | 0.2.4 | | | 46 | 功能 | 需要一个压缩传输功能。 | | 0.2.4 | |
| 45 | 问题 | 出现过重连后无法刷新客户端列表问题。 | 偶发 | 0.2.4 | | | 45 | 问题 | 出现过重连后无法刷新客户端列表问题。 | 偶发 | 0.2.4 | |
| 44 | 问题 | 出现过多选下载显示远程文件不存在问题,但是单个下没问题。 | 偶发 | 0.2.4 | | | 44 | 问题 | 出现过多选下载显示远程文件不存在问题,但是单个下没问题。 | 偶发 | 0.2.4 | |

View File

@@ -19,9 +19,9 @@
## 示例图 ## 示例图
![示例图片](https://github.com/taynpg/frelay/raw/main/img/10.png) ![示例图片](img/10.png)
![示例图片](https://github.com/taynpg/frelay/raw/main/img/xp.png) ![示例图片](img/xp.png)
## 注意事项 ## 注意事项