Files
frelay/Gui/frelayGUI.cpp

250 lines
8.2 KiB
C++
Raw Normal View History

2025-06-18 08:49:29 +08:00
#include "frelayGUI.h"
2025-06-15 14:31:54 +08:00
#include <Form/Loading.h>
2025-06-18 08:49:29 +08:00
#include <QLabel>
#include <QMessageBox>
#include <QScreen>
2025-06-18 14:53:56 +08:00
#include <QSplitter>
2025-10-20 15:17:31 +08:00
#include <QVBoxLayout>
2025-06-18 14:53:56 +08:00
#include <fversion.h>
2025-06-15 14:31:54 +08:00
#include "./ui_frelayGUI.h"
#include "Control/Common.h"
#include "Control/LogControl.h"
2025-06-15 14:31:54 +08:00
static LogPrint* logPrint = nullptr;
2025-10-20 15:17:31 +08:00
frelayGUI::frelayGUI(QWidget* parent) : QDialog(parent), ui(new Ui::frelayGUI)
2025-06-15 14:31:54 +08:00
{
2025-06-27 22:13:52 +08:00
config_ = std::make_shared<FrelayConfig>();
2025-06-15 14:31:54 +08:00
ui->setupUi(this);
2025-06-27 22:13:52 +08:00
QString configRoot = Util::GetCurConfigPath("frelay");
GlobalData::Ins()->SetConfigPath(configRoot.toStdString() + "/frelayConfig.json");
2025-06-15 14:31:54 +08:00
InitControl();
ControlSignal();
ControlLayout();
QRect availableGeometry = QGuiApplication::primaryScreen()->availableGeometry();
int width = static_cast<int>(availableGeometry.width() * 0.8);
int height = static_cast<int>(availableGeometry.height() * 0.6);
resize(width, height);
2025-06-18 08:49:29 +08:00
2025-10-23 09:46:54 +08:00
setWindowTitle(Util::GetVersion());
2025-11-08 18:35:46 +08:00
setWindowFlags(windowFlags() | Qt::WindowMinMaxButtonsHint);
2025-06-18 08:49:29 +08:00
2025-10-20 15:17:31 +08:00
// QLabel* permanent = new QLabel(this);
// permanent->setFrameStyle(QFrame::Box | QFrame::Sunken);
// permanent->setText(QString("%1 on %2").arg(VERSION_GIT_COMMIT, VERSION_GIT_BRANCH));
// this->statusBar()->addPermanentWidget(permanent);
2025-06-15 14:31:54 +08:00
}
frelayGUI::~frelayGUI()
{
delete ui;
}
void frelayGUI::InitControl()
{
logPrint = new LogPrint(this);
clientCore_ = new ClientCore();
2025-06-15 14:31:54 +08:00
2025-06-18 10:36:19 +08:00
compare_ = new Compare(this);
2025-06-18 11:11:08 +08:00
transform_ = new TransForm(this);
2025-06-18 17:22:15 +08:00
transform_->SetClientCore(clientCore_);
2025-06-18 10:36:19 +08:00
2025-06-15 14:31:54 +08:00
connecter_ = new Connecter(this);
connecter_->RunWorker(clientCore_);
2025-06-15 14:31:54 +08:00
connecter_->SetRemoteCall([this](const QString& id) { clientCore_->SetRemoteID(id); });
2025-06-27 22:13:52 +08:00
connecter_->SetConfigPtr(config_);
2025-06-15 14:31:54 +08:00
localFile_ = new FileManager(this);
remoteFile_ = new FileManager(this);
2025-11-04 14:52:27 +08:00
localFile_->SetModeStr(tr("本地:"), 0, clientCore_);
remoteFile_->SetModeStr(tr("远端:"), 1, clientCore_);
2025-06-15 14:31:54 +08:00
tabWidget_ = new QTabWidget(this);
connect(localFile_, &FileManager::sigSendTasks, this, &frelayGUI::HandleTask);
connect(remoteFile_, &FileManager::sigSendTasks, this, &frelayGUI::HandleTask);
connect(compare_, &Compare::sigTasks, this, &frelayGUI::HandleTask);
2025-06-30 01:05:28 +08:00
connect(compare_, &Compare::sigTryVisit, this, [this](bool local, const QString& path) {
if (local) {
localFile_->SetUiCurrentPath(path);
localFile_->evtFile();
} else {
remoteFile_->SetUiCurrentPath(path);
remoteFile_->evtFile();
}
});
connect(connecter_, &Connecter::sigConfirmUse, remoteFile_, &FileManager::evtHome);
2025-06-15 14:31:54 +08:00
}
void frelayGUI::ControlSignal()
{
}
void frelayGUI::ControlLayout()
{
auto* splitter = new QSplitter(Qt::Vertical);
splitter->setHandleWidth(1);
auto* sTop = new QSplitter(Qt::Horizontal);
auto* sConnect = new QSplitter(Qt::Vertical);
auto* sFile = new QSplitter(Qt::Horizontal);
sTop->setHandleWidth(1);
sConnect->setHandleWidth(1);
sFile->setHandleWidth(1);
sTop->addWidget(tabWidget_);
sTop->addWidget(connecter_);
2025-11-04 14:52:27 +08:00
tabWidget_->addTab(logPrint, tr("日志"));
tabWidget_->addTab(compare_, tr("文件对照"));
2025-06-15 14:31:54 +08:00
sFile->addWidget(localFile_);
sFile->addWidget(remoteFile_);
splitter->addWidget(sTop);
splitter->addWidget(sFile);
2025-06-20 14:58:47 +08:00
QList<int> sizes;
sizes << height() * 2 / 5 << height() * 3 / 5;
splitter->setSizes(sizes);
2025-10-20 15:17:31 +08:00
QVBoxLayout* layout = new QVBoxLayout();
layout->addWidget(splitter);
setLayout(layout);
// setCentralWidget(splitter);
2025-06-15 14:31:54 +08:00
}
void frelayGUI::ControlMsgHander(QtMsgType type, const QMessageLogContext& context, const QString& msg)
{
switch (type) {
case QtDebugMsg:
QMetaObject::invokeMethod(logPrint, "Debug", Qt::QueuedConnection, Q_ARG(QString, msg));
break;
case QtInfoMsg:
QMetaObject::invokeMethod(logPrint, "Info", Qt::QueuedConnection, Q_ARG(QString, msg));
break;
case QtWarningMsg:
QMetaObject::invokeMethod(logPrint, "Warn", Qt::QueuedConnection, Q_ARG(QString, msg));
break;
default:
QMetaObject::invokeMethod(logPrint, "Error", Qt::QueuedConnection, Q_ARG(QString, msg));
break;
}
}
void frelayGUI::HandleTask(const QVector<TransTask>& tasks)
{
if (!clientCore_->IsConnect()) {
2025-11-04 14:52:27 +08:00
qCritical() << QString(tr("未连接到服务器。。。"));
return;
}
// 检查文件
2025-11-06 23:36:55 +08:00
CheckCondition cond(this);
cond.SetTasks(tasks);
cond.SetClientCore(clientCore_);
LoadingDialog checking(this);
checking.setTipsText("正在检查文件...");
2025-11-06 23:36:55 +08:00
connect(&cond, &CheckCondition::sigCheckOver, &checking, &LoadingDialog::cancelBtnClicked);
connect(&checking, &LoadingDialog::cancelWaiting, &cond, &CheckCondition::interrupCheck);
connect(clientCore_, &ClientCore::sigMsgAnswer, &cond, &CheckCondition::recvFrame);
2025-11-06 23:36:55 +08:00
cond.start();
checking.exec();
// 检查结果
auto reTasks = cond.GetTasks();
if (!CheckTaskResult(reTasks)) {
return;
}
transform_->SetTasks(reTasks);
transform_->exec();
}
bool frelayGUI::CheckTaskResult(QVector<TransTask>& tasks)
{
bool isAutoCreateDirR = false;
bool isAutoRecoverR = false;
bool isAutoCreateDirL = false;
bool isAutoRecoverL = false;
for (auto& task : tasks) {
if (task.localCheckState == FCS_NORMAL && task.remoteCheckState == FCS_NORMAL) {
2025-11-06 23:36:55 +08:00
continue;
}
if (task.isUpload) {
if (task.localCheckState == FCS_FILE_NOT_EXIST) {
QMessageBox::information(this, tr("文件校验"), tr("本地文件校验失败,请检查文件是否存在:") + task.localPath);
return false;
}
if (task.remoteCheckState == FCS_DIR_NOT_EXIST && !isAutoCreateDirR) {
auto msg = tr("远端不存在文件夹") + task.remotePath + ",需要自动创建吗?";
auto ret = Common::GetAcceptThree(this, "操作确认", msg);
if (ret == 0) {
continue;
} else if (ret == 1) {
isAutoCreateDirR = true;
continue;
} else {
return false;
}
}
if (task.remoteCheckState == FCS_FILE_EXIST && !isAutoRecoverR) {
auto msg = tr("远端已存在文件") + Util::Get2FilePath(task.localPath, task.remotePath) + ",需要覆盖吗?";
auto ret = Common::GetAcceptThree(this, "操作警告", msg);
if (ret == 0) {
continue;
} else if (ret == 1) {
isAutoRecoverR = true;
continue;
} else {
return false;
}
}
} else {
if (task.localCheckState == FCS_DIR_NOT_EXIST && !isAutoCreateDirL) {
auto msg = tr("本地不存在文件夹") + task.localPath + ",需要自动创建吗?";
auto ret = Common::GetAcceptThree(this, "操作确认", msg);
if (ret == 0) {
continue;
} else if (ret == 1) {
isAutoCreateDirL = true;
continue;
} else {
return false;
}
}
if (task.localCheckState == FCS_FILE_EXIST && !isAutoRecoverL) {
auto msg = tr("本地已经存在文件") + Util::Get2FilePath(task.remotePath, task.localPath) + ",需要覆盖吗?";
auto ret = Common::GetAcceptThree(this, "操作警告", msg);
if (ret == 0) {
continue;
} else if (ret == 1) {
isAutoRecoverL = true;
continue;
} else {
return false;
}
}
if (task.remoteCheckState != FCS_FILE_EXIST) {
QMessageBox::information(this, tr("文件校验"), tr("远端文件校验失败,请检查文件是否存在:") + task.remotePath);
return false;
}
}
2025-11-06 23:36:55 +08:00
}
return true;
}
2025-06-15 14:31:54 +08:00
void frelayGUI::closeEvent(QCloseEvent* event)
{
2025-10-20 15:17:31 +08:00
QDialog::closeEvent(event);
2025-06-15 14:31:54 +08:00
}