From 9b35fb4b9748827a428d4d6d8be6b1f5b6cf9bbe Mon Sep 17 00:00:00 2001 From: airprofly Date: Wed, 15 Jul 2026 11:14:22 +0800 Subject: [PATCH 01/23] feat(gui): add all 6 filter dimensions and remove settings tab GUI filter: - Add name glob filter (include/exclude) to FilterDialog - Add all 6 filter dimensions as inline controls in BackupTab: path (text), type (text), name (text), time (datetime picker), size (spin+unit), owner (text) - FilterDialog now syncs to/from all inline controls bidirectionally - collectOptions() forwards all 6 dimensions to BackupOptions Settings tab removed: settings_tab.cpp/.h deleted, references removed from main_window, CMakeLists.txt, qrc, and settings icon. Only backup, restore, and schedule tabs remain. Co-Authored-By: Claude --- CMakeLists.txt | 2 - src/gui/backup_tab.cpp | 176 +++++++++++++++++++++- src/gui/backup_tab.h | 14 ++ src/gui/filter_dialog.cpp | 117 ++++++++++++++- src/gui/filter_dialog.h | 10 ++ src/gui/main_window.cpp | 4 - src/gui/main_window.h | 4 +- src/gui/resources/app.qrc | 1 - src/gui/resources/icons/settings.png | Bin 193008 -> 0 bytes src/gui/settings_tab.cpp | 214 --------------------------- src/gui/settings_tab.h | 40 ----- 11 files changed, 311 insertions(+), 271 deletions(-) delete mode 100644 src/gui/resources/icons/settings.png delete mode 100644 src/gui/settings_tab.cpp delete mode 100644 src/gui/settings_tab.h diff --git a/CMakeLists.txt b/CMakeLists.txt index c7474db..cae9e10 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -216,7 +216,6 @@ if(BUILD_GUI AND HAVE_QT6) src/gui/backup_tab.cpp src/gui/restore_tab.cpp src/gui/schedule_tab.cpp - src/gui/settings_tab.cpp src/gui/backup_worker.cpp src/gui/progress_widget.cpp src/gui/log_widget.cpp @@ -228,7 +227,6 @@ if(BUILD_GUI AND HAVE_QT6) src/gui/backup_tab.h src/gui/restore_tab.h src/gui/schedule_tab.h - src/gui/settings_tab.h src/gui/backup_worker.h src/gui/progress_widget.h src/gui/log_widget.h diff --git a/src/gui/backup_tab.cpp b/src/gui/backup_tab.cpp index 82b9b0d..a6b05a4 100644 --- a/src/gui/backup_tab.cpp +++ b/src/gui/backup_tab.cpp @@ -7,6 +7,7 @@ #include #include +#include #include #include #include @@ -110,18 +111,88 @@ void BackupTab::setupUi() // ── Filter detail group ─────────────────────────────────── filterGroup_ = new QGroupBox(QStringLiteral("文件筛选")); auto* filterForm = new QFormLayout(filterGroup_); + + // Row 1-2: Path includePaths_ = new QLineEdit(); - includePaths_->setPlaceholderText(QStringLiteral("用逗号分隔的包含路径")); + includePaths_->setPlaceholderText(QStringLiteral("用逗号分隔的包含路径 (glob)")); excludePaths_ = new QLineEdit(); - excludePaths_->setPlaceholderText(QStringLiteral("用逗号分隔的排除路径")); - includeTypes_ = new QLineEdit(); - includeTypes_->setPlaceholderText(QStringLiteral("file, dir, symlink, fifo, block, char")); - excludeTypes_ = new QLineEdit(); - excludeTypes_->setPlaceholderText(QStringLiteral("file, dir, symlink, fifo, block, char")); + excludePaths_->setPlaceholderText(QStringLiteral("用逗号分隔的排除路径 (glob)")); filterForm->addRow(QStringLiteral("包含路径:"), includePaths_); filterForm->addRow(QStringLiteral("排除路径:"), excludePaths_); + + // Row 3-4: Type + includeTypes_ = new QLineEdit(); + includeTypes_->setPlaceholderText(QStringLiteral("file, dir, symlink, fifo, block, char, socket")); + excludeTypes_ = new QLineEdit(); + excludeTypes_->setPlaceholderText(QStringLiteral("file, dir, symlink, fifo, block, char, socket")); filterForm->addRow(QStringLiteral("包含类型:"), includeTypes_); filterForm->addRow(QStringLiteral("排除类型:"), excludeTypes_); + + // Row 5-6: Name + includeNames_ = new QLineEdit(); + includeNames_->setPlaceholderText(QStringLiteral("用逗号分隔的包含名称 (如 *.txt, *.cpp)")); + excludeNames_ = new QLineEdit(); + excludeNames_->setPlaceholderText(QStringLiteral("用逗号分隔的排除名称 (如 *.tmp, *.log)")); + filterForm->addRow(QStringLiteral("包含名称:"), includeNames_); + filterForm->addRow(QStringLiteral("排除名称:"), excludeNames_); + + // Row 7: Time + auto* timeRow = new QHBoxLayout(); + enableTimeFilter_ = new QCheckBox(QStringLiteral("启用")); + mtimeAfter_ = new QDateTimeEdit(); + mtimeAfter_->setCalendarPopup(true); + mtimeAfter_->setDisplayFormat(QStringLiteral("yyyy-MM-dd HH:mm")); + mtimeAfter_->setDateTime(QDateTime::currentDateTime().addDays(-7)); + mtimeAfter_->setEnabled(false); + mtimeBefore_ = new QDateTimeEdit(); + mtimeBefore_->setCalendarPopup(true); + mtimeBefore_->setDisplayFormat(QStringLiteral("yyyy-MM-dd HH:mm")); + mtimeBefore_->setDateTime(QDateTime::currentDateTime()); + mtimeBefore_->setEnabled(false); + timeRow->addWidget(enableTimeFilter_); + timeRow->addWidget(new QLabel(QStringLiteral("修改时间:"))); + timeRow->addWidget(mtimeAfter_); + timeRow->addWidget(new QLabel(QStringLiteral("→"))); + timeRow->addWidget(mtimeBefore_); + timeRow->addStretch(); + filterForm->addRow(QStringLiteral("时间筛选:"), timeRow); + + // Row 8: Size + auto* sizeRow = new QHBoxLayout(); + enableSizeFilter_ = new QCheckBox(QStringLiteral("启用")); + sizeMin_ = new QSpinBox(); + sizeMin_->setRange(0, 999999999); + sizeMin_->setValue(0); + sizeMin_->setEnabled(false); + sizeMax_ = new QSpinBox(); + sizeMax_->setRange(0, 999999999); + sizeMax_->setValue(0); + sizeMax_->setSpecialValueText(QStringLiteral("不限")); + sizeMax_->setEnabled(false); + sizeUnitMin_ = new QComboBox(); + sizeUnitMin_->addItems({QStringLiteral("B"), QStringLiteral("KB"), + QStringLiteral("MB"), QStringLiteral("GB")}); + sizeUnitMin_->setEnabled(false); + sizeUnitMax_ = new QComboBox(); + sizeUnitMax_->addItems({QStringLiteral("B"), QStringLiteral("KB"), + QStringLiteral("MB"), QStringLiteral("GB")}); + sizeUnitMax_->setEnabled(false); + sizeRow->addWidget(enableSizeFilter_); + sizeRow->addWidget(new QLabel(QStringLiteral("最小:"))); + sizeRow->addWidget(sizeMin_); + sizeRow->addWidget(sizeUnitMin_); + sizeRow->addSpacing(6); + sizeRow->addWidget(new QLabel(QStringLiteral("最大:"))); + sizeRow->addWidget(sizeMax_); + sizeRow->addWidget(sizeUnitMax_); + sizeRow->addStretch(); + filterForm->addRow(QStringLiteral("大小筛选:"), sizeRow); + + // Row 9: Owner + ownerFilter_ = new QLineEdit(); + ownerFilter_->setPlaceholderText(QStringLiteral("用户名或 UID")); + filterForm->addRow(QStringLiteral("所有者:"), ownerFilter_); + filterGroup_->setVisible(false); mainLayout->addWidget(filterGroup_); @@ -169,6 +240,18 @@ void BackupTab::setupConnections() filterGroup_, &QGroupBox::setVisible); connect(enableFilter_, &QCheckBox::toggled, editFilterBtn_, &QPushButton::setEnabled); + connect(enableTimeFilter_, &QCheckBox::toggled, + mtimeAfter_, &QWidget::setEnabled); + connect(enableTimeFilter_, &QCheckBox::toggled, + mtimeBefore_, &QWidget::setEnabled); + connect(enableSizeFilter_, &QCheckBox::toggled, + sizeMin_, &QWidget::setEnabled); + connect(enableSizeFilter_, &QCheckBox::toggled, + sizeMax_, &QWidget::setEnabled); + connect(enableSizeFilter_, &QCheckBox::toggled, + sizeUnitMin_, &QWidget::setEnabled); + connect(enableSizeFilter_, &QCheckBox::toggled, + sizeUnitMax_, &QWidget::setEnabled); } void BackupTab::onBrowseSource() @@ -205,12 +288,71 @@ void BackupTab::onEncryptToggled(bool checked) confirmPassword_->setEnabled(checked); } +namespace { +/// Byte multiplier for size-unit combobox index. +qint64 unitMult(int index) noexcept +{ + static constexpr qint64 kUnits[] = {1LL, 1024LL, 1024LL * 1024, 1024LL * 1024 * 1024}; + return (index >= 0 && index < 4) ? kUnits[index] : 1; +} +} // anonymous namespace + void BackupTab::onEditFilter() { FilterDialog dlg(this); + + // Pre-fill from current inline values + dlg.setIncludePaths(includePaths_->text().split( + QRegularExpression(QStringLiteral("[,\\s;]+")), Qt::SkipEmptyParts)); + dlg.setExcludePaths(excludePaths_->text().split( + QRegularExpression(QStringLiteral("[,\\s;]+")), Qt::SkipEmptyParts)); + dlg.setIncludeNames(includeNames_->text().split( + QRegularExpression(QStringLiteral("[,\\s;]+")), Qt::SkipEmptyParts)); + dlg.setExcludeNames(excludeNames_->text().split( + QRegularExpression(QStringLiteral("[,\\s;]+")), Qt::SkipEmptyParts)); + if (dlg.exec() == QDialog::Accepted) { + // Sync path/name text fields includePaths_->setText(dlg.includePaths().join(QStringLiteral(", "))); excludePaths_->setText(dlg.excludePaths().join(QStringLiteral(", "))); + includeNames_->setText(dlg.includeNames().join(QStringLiteral(", "))); + excludeNames_->setText(dlg.excludeNames().join(QStringLiteral(", "))); + + // Sync type checkboxes → text field + includeTypes_->setText(dlg.includeTypes().join(QStringLiteral(", "))); + + // Sync time inline controls + enableTimeFilter_->setChecked(dlg.hasTimeFilter()); + mtimeAfter_->setDateTime(dlg.mtimeAfter()); + mtimeBefore_->setDateTime(dlg.mtimeBefore()); + + // Sync size inline controls + enableSizeFilter_->setChecked(dlg.hasSizeFilter()); + qint64 szMin = dlg.sizeMin(); + qint64 szMax = dlg.sizeMax(); + // Find best unit (auto-scale to largest unit >= 1) + int unitIdx = 0; + for (int i = 3; i > 0; --i) { + if (szMin > 0 && szMin % unitMult(i) == 0) { unitIdx = i; break; } + if (szMax > 0 && szMax % unitMult(i) == 0) { unitIdx = i; break; } + } + if (szMin > 0 && szMin % unitMult(unitIdx) == 0) { + sizeMin_->setValue(static_cast(szMin / unitMult(unitIdx))); + sizeUnitMin_->setCurrentIndex(unitIdx); + } else { + sizeMin_->setValue(0); + sizeUnitMin_->setCurrentIndex(0); + } + if (szMax > 0 && szMax % unitMult(unitIdx) == 0) { + sizeMax_->setValue(static_cast(szMax / unitMult(unitIdx))); + sizeUnitMax_->setCurrentIndex(unitIdx); + } else { + sizeMax_->setValue(0); + sizeUnitMax_->setCurrentIndex(0); + } + + // Sync owner + ownerFilter_->setText(dlg.owner()); } } @@ -242,6 +384,28 @@ backer::cli::BackupOptions BackupTab::collectOptions() const opts.includeTypes.push_back(s.toStdString()); for (auto const& s : split(excludeTypes_->text())) opts.excludeTypes.push_back(s.toStdString()); + for (auto const& s : split(includeNames_->text())) + opts.includeNames.push_back(s.toStdString()); + for (auto const& s : split(excludeNames_->text())) + opts.excludeNames.push_back(s.toStdString()); + + // Time filter (inline controls) + if (enableTimeFilter_->isChecked()) { + opts.mtimeAfter = mtimeAfter_->dateTime().toString(QStringLiteral("yyyy-MM-dd HH:mm")).toStdString(); + opts.mtimeBefore = mtimeBefore_->dateTime().toString(QStringLiteral("yyyy-MM-dd HH:mm")).toStdString(); + } + + // Size filter (inline controls) + if (enableSizeFilter_->isChecked()) { + qint64 minBytes = sizeMin_->value() * unitMult(sizeUnitMin_->currentIndex()); + qint64 maxBytes = sizeMax_->value() * unitMult(sizeUnitMax_->currentIndex()); + if (minBytes > 0) { opts.hasSizeMin = true; opts.sizeMin = static_cast(minBytes); } + if (maxBytes > 0) { opts.hasSizeMax = true; opts.sizeMax = static_cast(maxBytes); } + } + + // Owner filter + if (!ownerFilter_->text().trimmed().isEmpty()) + opts.owner = ownerFilter_->text().trimmed().toStdString(); } return opts; diff --git a/src/gui/backup_tab.h b/src/gui/backup_tab.h index 5b25667..82c1b24 100644 --- a/src/gui/backup_tab.h +++ b/src/gui/backup_tab.h @@ -8,6 +8,7 @@ class QCheckBox; class QComboBox; +class QDateTimeEdit; class QGroupBox; class QLineEdit; class QPushButton; @@ -57,10 +58,23 @@ private slots: QCheckBox* enableFilter_{nullptr}; QPushButton* editFilterBtn_{nullptr}; QGroupBox* filterGroup_{nullptr}; + + // ── Filter inline controls (all 6 dimensions) ──────────── QLineEdit* includePaths_{nullptr}; QLineEdit* excludePaths_{nullptr}; QLineEdit* includeTypes_{nullptr}; QLineEdit* excludeTypes_{nullptr}; + QLineEdit* includeNames_{nullptr}; + QLineEdit* excludeNames_{nullptr}; + QCheckBox* enableTimeFilter_{nullptr}; + QDateTimeEdit* mtimeAfter_{nullptr}; + QDateTimeEdit* mtimeBefore_{nullptr}; + QCheckBox* enableSizeFilter_{nullptr}; + QSpinBox* sizeMin_{nullptr}; + QComboBox* sizeUnitMin_{nullptr}; + QSpinBox* sizeMax_{nullptr}; + QComboBox* sizeUnitMax_{nullptr}; + QLineEdit* ownerFilter_{nullptr}; // ── Pack / compress / encrypt ───────────────────────────── QCheckBox* enablePack_{nullptr}; diff --git a/src/gui/filter_dialog.cpp b/src/gui/filter_dialog.cpp index 6624a31..1d5cb78 100644 --- a/src/gui/filter_dialog.cpp +++ b/src/gui/filter_dialog.cpp @@ -22,7 +22,7 @@ FilterDialog::FilterDialog(QWidget* parent) : QDialog(parent) { setWindowTitle(QStringLiteral("筛选条件编辑器")); - setMinimumSize(500, 450); + setMinimumSize(560, 600); setupUi(); } @@ -79,6 +79,55 @@ void FilterDialog::setupUi() connect(excludeRemoveBtn, &QPushButton::clicked, this, &FilterDialog::onRemoveExcludePath); + // ── Name filters ────────────────────────────────────────── + auto* nameGroup = new QGroupBox(QStringLiteral("名称筛选")); + auto* nameLayout = new QVBoxLayout(nameGroup); + + // Include names + auto* includeNameLabel = new QLabel(QStringLiteral("包含名称:")); + auto* includeNameRow = new QHBoxLayout(); + includeNameList_ = new QListWidget(); + auto* includeNameAddBtn = new QPushButton(QStringLiteral("+")); + auto* includeNameRemoveBtn = new QPushButton(QStringLiteral("-")); + includeNameAddBtn->setFixedWidth(32); + includeNameRemoveBtn->setFixedWidth(32); + includeNameRow->addWidget(includeNameList_, 1); + auto* includeNameBtnLayout = new QVBoxLayout(); + includeNameBtnLayout->addWidget(includeNameAddBtn); + includeNameBtnLayout->addWidget(includeNameRemoveBtn); + includeNameBtnLayout->addStretch(); + includeNameRow->addLayout(includeNameBtnLayout); + nameLayout->addWidget(includeNameLabel); + nameLayout->addLayout(includeNameRow); + + // Exclude names + auto* excludeNameLabel = new QLabel(QStringLiteral("排除名称:")); + auto* excludeNameRow = new QHBoxLayout(); + excludeNameList_ = new QListWidget(); + auto* excludeNameAddBtn = new QPushButton(QStringLiteral("+")); + auto* excludeNameRemoveBtn = new QPushButton(QStringLiteral("-")); + excludeNameAddBtn->setFixedWidth(32); + excludeNameRemoveBtn->setFixedWidth(32); + excludeNameRow->addWidget(excludeNameList_, 1); + auto* excludeNameBtnLayout = new QVBoxLayout(); + excludeNameBtnLayout->addWidget(excludeNameAddBtn); + excludeNameBtnLayout->addWidget(excludeNameRemoveBtn); + excludeNameBtnLayout->addStretch(); + excludeNameRow->addLayout(excludeNameBtnLayout); + nameLayout->addWidget(excludeNameLabel); + nameLayout->addLayout(excludeNameRow); + + layout->addWidget(nameGroup); + + connect(includeNameAddBtn, &QPushButton::clicked, + this, &FilterDialog::onAddIncludeName); + connect(includeNameRemoveBtn, &QPushButton::clicked, + this, &FilterDialog::onRemoveIncludeName); + connect(excludeNameAddBtn, &QPushButton::clicked, + this, &FilterDialog::onAddExcludeName); + connect(excludeNameRemoveBtn, &QPushButton::clicked, + this, &FilterDialog::onRemoveExcludeName); + // ── Type filters ───────────────────────────────────────── auto* typeGroup = new QGroupBox(QStringLiteral("类型筛选")); auto* typeLayout = new QHBoxLayout(typeGroup); @@ -206,6 +255,20 @@ void FilterDialog::setExcludePaths(QStringList const& paths) excludePathList_->addItem(p); } +void FilterDialog::setIncludeNames(QStringList const& names) +{ + includeNameList_->clear(); + for (auto const& n : names) + includeNameList_->addItem(n); +} + +void FilterDialog::setExcludeNames(QStringList const& names) +{ + excludeNameList_->clear(); + for (auto const& n : names) + excludeNameList_->addItem(n); +} + // ── Getters ────────────────────────────────────────────────────── QStringList FilterDialog::includePaths() const @@ -224,6 +287,22 @@ QStringList FilterDialog::excludePaths() const return result; } +QStringList FilterDialog::includeNames() const +{ + QStringList result; + for (int i = 0; i < includeNameList_->count(); ++i) + result << includeNameList_->item(i)->text(); + return result; +} + +QStringList FilterDialog::excludeNames() const +{ + QStringList result; + for (int i = 0; i < excludeNameList_->count(); ++i) + result << excludeNameList_->item(i)->text(); + return result; +} + QStringList FilterDialog::includeTypes() const { QStringList result; @@ -324,4 +403,40 @@ void FilterDialog::onRemoveExcludePath() delete excludePathList_->takeItem(excludePathList_->row(item)); } +void FilterDialog::onAddIncludeName() +{ + bool ok = false; + QString text = QInputDialog::getText(this, + QStringLiteral("添加包含名称"), + QStringLiteral("文件名模式 (支持 glob, 如 *.txt):"), + QLineEdit::Normal, {}, &ok); + if (ok && !text.isEmpty()) + includeNameList_->addItem(text); +} + +void FilterDialog::onRemoveIncludeName() +{ + auto items = includeNameList_->selectedItems(); + for (auto* item : items) + delete includeNameList_->takeItem(includeNameList_->row(item)); +} + +void FilterDialog::onAddExcludeName() +{ + bool ok = false; + QString text = QInputDialog::getText(this, + QStringLiteral("添加排除名称"), + QStringLiteral("文件名模式 (支持 glob, 如 *.tmp):"), + QLineEdit::Normal, {}, &ok); + if (ok && !text.isEmpty()) + excludeNameList_->addItem(text); +} + +void FilterDialog::onRemoveExcludeName() +{ + auto items = excludeNameList_->selectedItems(); + for (auto* item : items) + delete excludeNameList_->takeItem(excludeNameList_->row(item)); +} + } // namespace backer::gui diff --git a/src/gui/filter_dialog.h b/src/gui/filter_dialog.h index 53e2c77..4353fab 100644 --- a/src/gui/filter_dialog.h +++ b/src/gui/filter_dialog.h @@ -24,10 +24,14 @@ class FilterDialog : public QDialog { // ── Setters (pre-fill from existing config) ───────────── void setIncludePaths(QStringList const& paths); void setExcludePaths(QStringList const& paths); + void setIncludeNames(QStringList const& names); + void setExcludeNames(QStringList const& names); // ── Getters ───────────────────────────────────────────── QStringList includePaths() const; QStringList excludePaths() const; + QStringList includeNames() const; + QStringList excludeNames() const; QStringList includeTypes() const; QStringList excludeTypes() const; @@ -46,6 +50,10 @@ private slots: void onRemoveIncludePath(); void onAddExcludePath(); void onRemoveExcludePath(); + void onAddIncludeName(); + void onRemoveIncludeName(); + void onAddExcludeName(); + void onRemoveExcludeName(); private: void setupUi(); @@ -53,6 +61,8 @@ private slots: // ── Path filters ──────────────────────────────────────── QListWidget* includePathList_{nullptr}; QListWidget* excludePathList_{nullptr}; + QListWidget* includeNameList_{nullptr}; + QListWidget* excludeNameList_{nullptr}; // ── Type checkboxes ───────────────────────────────────── QCheckBox* typeFile_{nullptr}; diff --git a/src/gui/main_window.cpp b/src/gui/main_window.cpp index af29922..9484727 100644 --- a/src/gui/main_window.cpp +++ b/src/gui/main_window.cpp @@ -2,8 +2,6 @@ #include "gui/backup_tab.h" // backupTab_ type #include "gui/restore_tab.h" // restoreTab_ type #include "gui/schedule_tab.h" // scheduleTab_ type -#include "gui/settings_tab.h" // settingsTab_ type - #include #include #include @@ -35,14 +33,12 @@ void MainWindow::setupUi() backupTab_ = new BackupTab(); restoreTab_ = new RestoreTab(); scheduleTab_ = new ScheduleTab(); - settingsTab_ = new SettingsTab(); setWindowIcon(QIcon(QStringLiteral(":/icons/app"))); tabWidget_->addTab(backupTab_, QIcon(QStringLiteral(":/icons/backup")), QStringLiteral("备份")); tabWidget_->addTab(restoreTab_, QIcon(QStringLiteral(":/icons/restore")), QStringLiteral("还原")); tabWidget_->addTab(scheduleTab_, QIcon(QStringLiteral(":/icons/schedule")), QStringLiteral("定时任务")); - tabWidget_->addTab(settingsTab_, QIcon(QStringLiteral(":/icons/settings")), QStringLiteral("设置")); setCentralWidget(tabWidget_); diff --git a/src/gui/main_window.h b/src/gui/main_window.h index 6fae585..9f1a25a 100644 --- a/src/gui/main_window.h +++ b/src/gui/main_window.h @@ -10,10 +10,9 @@ namespace backer::gui { class BackupTab; class RestoreTab; class ScheduleTab; -class SettingsTab; /// Main application window with tabbed interface for backup, restore, -/// scheduled tasks, and settings. +/// and scheduled tasks. class MainWindow : public QMainWindow { Q_OBJECT public: @@ -32,7 +31,6 @@ private slots: BackupTab* backupTab_{nullptr}; RestoreTab* restoreTab_{nullptr}; ScheduleTab* scheduleTab_{nullptr}; - SettingsTab* settingsTab_{nullptr}; }; } // namespace backer::gui diff --git a/src/gui/resources/app.qrc b/src/gui/resources/app.qrc index b3a73f3..d1d29df 100644 --- a/src/gui/resources/app.qrc +++ b/src/gui/resources/app.qrc @@ -4,7 +4,6 @@ icons/app.png icons/backup.png icons/restore.png - icons/settings.png icons/schedule.png icons/splash.png icons/empty-state.png diff --git a/src/gui/resources/icons/settings.png b/src/gui/resources/icons/settings.png deleted file mode 100644 index 880e74f85393805d0e91f3e1bcf498207ba38a70..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 193008 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


pS(W-4FSkBr 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 tkpDjb00960B|Gy}00006Nkl -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -namespace backer::gui { - -SettingsTab::SettingsTab(QWidget* parent) - : QWidget(parent) -{ - setupUi(); - loadSettings(); -} - -void SettingsTab::setupUi() -{ - auto* layout = new QVBoxLayout(this); - layout->setSpacing(10); - - // ── Default paths ───────────────────────────────────────── - auto* pathGroup = new QGroupBox(QStringLiteral("默认路径")); - auto* pathForm = new QFormLayout(pathGroup); - - auto* srcRow = new QHBoxLayout(); - defaultSource_ = new QLineEdit(); - defaultSource_->setPlaceholderText(QStringLiteral("默认源目录")); - auto* browseSrcBtn = new QPushButton(QStringLiteral("浏览")); - srcRow->addWidget(defaultSource_, 1); - srcRow->addWidget(browseSrcBtn); - pathForm->addRow(QStringLiteral("默认源目录:"), srcRow); - - auto* destRow = new QHBoxLayout(); - defaultDest_ = new QLineEdit(); - defaultDest_->setPlaceholderText(QStringLiteral("默认目标目录")); - auto* browseDestBtn = new QPushButton(QStringLiteral("浏览")); - destRow->addWidget(defaultDest_, 1); - destRow->addWidget(browseDestBtn); - pathForm->addRow(QStringLiteral("默认目标目录:"), destRow); - - layout->addWidget(pathGroup); - - connect(browseSrcBtn, &QPushButton::clicked, - this, &SettingsTab::onBrowseDefaultSource); - connect(browseDestBtn, &QPushButton::clicked, - this, &SettingsTab::onBrowseDefaultDest); - - // ── Default options ─────────────────────────────────────── - auto* optGroup = new QGroupBox(QStringLiteral("默认选项")); - auto* optForm = new QFormLayout(optGroup); - - defaultPack_ = new QComboBox(); - defaultPack_->addItems({QStringLiteral("无"), QStringLiteral("Tar"), QStringLiteral("Zip")}); - defaultCompress_ = new QComboBox(); - defaultCompress_->addItems({QStringLiteral("无"), QStringLiteral("gzip"), - QStringLiteral("zstd"), QStringLiteral("lzma")}); - defaultCompressLevel_ = new QSpinBox(); - defaultCompressLevel_->setRange(0, 22); - defaultCompressLevel_->setValue(3); - defaultCompressLevel_->setToolTip(QStringLiteral("0=默认, 1=最快, 22=最佳")); - defaultEncrypt_ = new QComboBox(); - defaultEncrypt_->addItems({QStringLiteral("无"), QStringLiteral("AES-256"), - QStringLiteral("SM4")}); - - optForm->addRow(QStringLiteral("默认打包格式:"), defaultPack_); - optForm->addRow(QStringLiteral("默认压缩算法:"), defaultCompress_); - optForm->addRow(QStringLiteral("压缩级别:"), defaultCompressLevel_); - optForm->addRow(QStringLiteral("默认加密算法:"), defaultEncrypt_); - - layout->addWidget(optGroup); - - // ── Advanced ────────────────────────────────────────────── - auto* advGroup = new QGroupBox(QStringLiteral("高级")); - auto* advForm = new QFormLayout(advGroup); - - logLevel_ = new QComboBox(); - logLevel_->addItems({QStringLiteral("trace"), QStringLiteral("debug"), - QStringLiteral("info"), QStringLiteral("warn"), - QStringLiteral("error")}); - logLevel_->setCurrentIndex(2); // info - threadCount_ = new QSpinBox(); - threadCount_->setRange(1, 16); - threadCount_->setValue(4); - - advForm->addRow(QStringLiteral("日志级别:"), logLevel_); - advForm->addRow(QStringLiteral("并发线程数:"), threadCount_); - - layout->addWidget(advGroup); - - // ── About ───────────────────────────────────────────────── - auto* aboutGroup = new QGroupBox(QStringLiteral("关于")); - auto* aboutLayout = new QVBoxLayout(aboutGroup); - auto* aboutLabel = new QLabel( - QStringLiteral("数据备份软件 v%1\n\n" - "基于 C++17 / Qt 6\n\n" - "计算机组成与体系结构 / 软件工程 课程项目") - .arg(QStringLiteral(BACKER_VERSION))); - aboutLabel->setWordWrap(true); - aboutLabel->setAlignment(Qt::AlignCenter); - aboutLayout->addWidget(aboutLabel); - layout->addWidget(aboutGroup); - - // ── Action buttons ──────────────────────────────────────── - auto* btnLayout = new QHBoxLayout(); - auto* restoreBtn = new QPushButton(QStringLiteral("恢复默认")); - auto* saveBtn = new QPushButton(QStringLiteral("保存设置")); - style::styleButton(saveBtn, QColor(style::kAccentGreen)); - btnLayout->addStretch(); - btnLayout->addWidget(restoreBtn); - btnLayout->addWidget(saveBtn); - layout->addLayout(btnLayout); - layout->addStretch(); - - connect(restoreBtn, &QPushButton::clicked, - this, &SettingsTab::onRestoreDefaults); - connect(saveBtn, &QPushButton::clicked, - this, &SettingsTab::onSave); -} - -void SettingsTab::loadSettings() -{ - QSettings settings(QStringLiteral("backer"), QStringLiteral("backer-gui")); - settings.beginGroup(QStringLiteral("defaults")); - - defaultSource_->setText( - settings.value(QStringLiteral("sourcePath")).toString()); - defaultDest_->setText( - settings.value(QStringLiteral("destPath")).toString()); - - auto pack = settings.value(QStringLiteral("packFormat"), QStringLiteral("无")).toString(); - defaultPack_->setCurrentText(pack); - auto comp = settings.value(QStringLiteral("compressAlgo"), QStringLiteral("无")).toString(); - defaultCompress_->setCurrentText(comp); - defaultCompressLevel_->setValue( - settings.value(QStringLiteral("compressLevel"), 3).toInt()); - auto enc = settings.value(QStringLiteral("encryptAlgo"), QStringLiteral("无")).toString(); - defaultEncrypt_->setCurrentText(enc); - - settings.endGroup(); - - settings.beginGroup(QStringLiteral("advanced")); - auto log = settings.value(QStringLiteral("logLevel"), QStringLiteral("info")).toString(); - logLevel_->setCurrentText(log); - threadCount_->setValue( - settings.value(QStringLiteral("threadCount"), 4).toInt()); - settings.endGroup(); -} - -void SettingsTab::saveSettings() -{ - QSettings settings(QStringLiteral("backer"), QStringLiteral("backer-gui")); - settings.beginGroup(QStringLiteral("defaults")); - settings.setValue(QStringLiteral("sourcePath"), defaultSource_->text()); - settings.setValue(QStringLiteral("destPath"), defaultDest_->text()); - settings.setValue(QStringLiteral("packFormat"), defaultPack_->currentText()); - settings.setValue(QStringLiteral("compressAlgo"), defaultCompress_->currentText()); - settings.setValue(QStringLiteral("compressLevel"), defaultCompressLevel_->value()); - settings.setValue(QStringLiteral("encryptAlgo"), defaultEncrypt_->currentText()); - settings.endGroup(); - - settings.beginGroup(QStringLiteral("advanced")); - settings.setValue(QStringLiteral("logLevel"), logLevel_->currentText()); - settings.setValue(QStringLiteral("threadCount"), threadCount_->value()); - settings.endGroup(); - - settings.sync(); -} - -void SettingsTab::onBrowseDefaultSource() -{ - QString dir = QFileDialog::getExistingDirectory(this, - QStringLiteral("选择默认源目录"), defaultSource_->text()); - if (!dir.isEmpty()) - defaultSource_->setText(dir); -} - -void SettingsTab::onBrowseDefaultDest() -{ - QString dir = QFileDialog::getExistingDirectory(this, - QStringLiteral("选择默认目标目录"), defaultDest_->text()); - if (!dir.isEmpty()) - defaultDest_->setText(dir); -} - -void SettingsTab::onSave() -{ - saveSettings(); - QMessageBox::information(this, QStringLiteral("设置"), - QStringLiteral("设置已保存")); -} - -void SettingsTab::onRestoreDefaults() -{ - defaultSource_->clear(); - defaultDest_->clear(); - defaultPack_->setCurrentIndex(0); - defaultCompress_->setCurrentIndex(0); - defaultCompressLevel_->setValue(3); - defaultEncrypt_->setCurrentIndex(0); - logLevel_->setCurrentIndex(2); - threadCount_->setValue(4); -} - -} // namespace backer::gui diff --git a/src/gui/settings_tab.h b/src/gui/settings_tab.h deleted file mode 100644 index 289332f..0000000 --- a/src/gui/settings_tab.h +++ /dev/null @@ -1,40 +0,0 @@ -#pragma once - -#include - -class QComboBox; -class QLineEdit; -class QPushButton; -class QSpinBox; - -namespace backer::gui { - -/// Settings tab — default paths, compression preferences, log level, etc. -/// Persists settings via QSettings. -class SettingsTab : public QWidget { - Q_OBJECT -public: - explicit SettingsTab(QWidget* parent = nullptr); - -private slots: - void onBrowseDefaultSource(); - void onBrowseDefaultDest(); - void onSave(); - void onRestoreDefaults(); - -private: - void setupUi(); - void loadSettings(); - void saveSettings(); - - QLineEdit* defaultSource_{nullptr}; - QLineEdit* defaultDest_{nullptr}; - QComboBox* defaultPack_{nullptr}; - QComboBox* defaultCompress_{nullptr}; - QSpinBox* defaultCompressLevel_{nullptr}; - QComboBox* defaultEncrypt_{nullptr}; - QComboBox* logLevel_{nullptr}; - QSpinBox* threadCount_{nullptr}; -}; - -} // namespace backer::gui From 0c18d5f3bfb018c1446a71cf7f8c77f4c6f8f8cf Mon Sep 17 00:00:00 2001 From: airprofly Date: Wed, 15 Jul 2026 20:28:20 +0800 Subject: [PATCH 02/23] fix(gui): add decrypt option to restore tab Restore tab was missing decryption algorithm selector and password field. Add enableDecrypt checkbox, decryptAlgo combobox (AES-256/SM4), and password line edit, matching the backup tab layout. Forward decrypt options to RestoreOptions in onStartRestore(). Co-Authored-By: Claude --- src/gui/restore_tab.cpp | 28 ++++++++++++++++++++++++++-- src/gui/restore_tab.h | 3 +++ 2 files changed, 29 insertions(+), 2 deletions(-) diff --git a/src/gui/restore_tab.cpp b/src/gui/restore_tab.cpp index 96aaf39..4a7492e 100644 --- a/src/gui/restore_tab.cpp +++ b/src/gui/restore_tab.cpp @@ -51,19 +51,35 @@ void RestoreTab::setupUi() connect(browseSrcBtn, &QPushButton::clicked, this, &RestoreTab::onBrowseSource); connect(browseDestBtn, &QPushButton::clicked, this, &RestoreTab::onBrowseDest); - // ── Decompress / Pack options ───────────────────────────── + // ── Decompress / Decrypt / Pack options ─────────────────── auto* optionsLayout = new QHBoxLayout(); + enableDecompress_ = new QCheckBox(QStringLiteral("解压缩")); decompressAlgo_ = new QComboBox(); decompressAlgo_->addItems({QStringLiteral("gzip"), QStringLiteral("zstd"), QStringLiteral("lzma")}); decompressAlgo_->setEnabled(false); + + enableDecrypt_ = new QCheckBox(QStringLiteral("解密")); + decryptAlgo_ = new QComboBox(); + decryptAlgo_->addItems({QStringLiteral("AES-256"), QStringLiteral("SM4")}); + decryptAlgo_->setEnabled(false); + password_ = new QLineEdit(); + password_->setEchoMode(QLineEdit::Password); + password_->setPlaceholderText(QStringLiteral("密码")); + password_->setEnabled(false); + enablePack_ = new QCheckBox(QStringLiteral("打包格式")); packFormat_ = new QComboBox(); packFormat_->addItems({QStringLiteral("Tar"), QStringLiteral("Zip")}); packFormat_->setEnabled(false); + optionsLayout->addWidget(enableDecompress_); optionsLayout->addWidget(decompressAlgo_); - optionsLayout->addSpacing(12); + optionsLayout->addSpacing(8); + optionsLayout->addWidget(enableDecrypt_); + optionsLayout->addWidget(decryptAlgo_); + optionsLayout->addWidget(password_); + optionsLayout->addSpacing(8); optionsLayout->addWidget(enablePack_); optionsLayout->addWidget(packFormat_); optionsLayout->addStretch(); @@ -71,6 +87,10 @@ void RestoreTab::setupUi() connect(enableDecompress_, &QCheckBox::toggled, decompressAlgo_, &QComboBox::setEnabled); + connect(enableDecrypt_, &QCheckBox::toggled, + decryptAlgo_, &QComboBox::setEnabled); + connect(enableDecrypt_, &QCheckBox::toggled, + password_, &QWidget::setEnabled); connect(enablePack_, &QCheckBox::toggled, packFormat_, &QComboBox::setEnabled); @@ -160,6 +180,10 @@ void RestoreTab::onStartRestore() opts.handleSpecial = handleSpecial_->isChecked(); if (enableDecompress_->isChecked()) opts.decompressAlgo = decompressAlgo_->currentText().toStdString(); + if (enableDecrypt_->isChecked()) { + opts.decryptAlgo = decryptAlgo_->currentText().toStdString(); + opts.password = password_->text().toStdString(); + } if (enablePack_->isChecked()) opts.packFormat = packFormat_->currentText().toLower().toStdString(); diff --git a/src/gui/restore_tab.h b/src/gui/restore_tab.h index 8e67a31..3b2c37c 100644 --- a/src/gui/restore_tab.h +++ b/src/gui/restore_tab.h @@ -41,6 +41,9 @@ private slots: QLineEdit* destPath_{nullptr}; QCheckBox* enableDecompress_{nullptr}; QComboBox* decompressAlgo_{nullptr}; + QCheckBox* enableDecrypt_{nullptr}; + QComboBox* decryptAlgo_{nullptr}; + QLineEdit* password_{nullptr}; QCheckBox* enablePack_{nullptr}; QComboBox* packFormat_{nullptr}; QCheckBox* preserveMetadata_{nullptr}; From 7e1df45e7e6a79afc397c0121dc8b4b4add7d1ce Mon Sep 17 00:00:00 2001 From: airprofly Date: Wed, 15 Jul 2026 20:41:58 +0800 Subject: [PATCH 03/23] fix(gui): create timestamped subdir for backup/restore destinations MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit When user picks a destination dir (e.g. 'data'), the GUI now automatically creates a timestamped subdirectory inside it: data/source_20260715_143000/ (backup) data/source_R20260715_143000/ (restore) This matches the behavior that was removed from CLI by the revert of #28. GUI-only fix — no CLI changes. Co-Authored-By: Claude --- CMakeLists.txt | 1 + src/gui/backup_tab.cpp | 15 +++++++- src/gui/gui_utils.h | 81 +++++++++++++++++++++++++++++++++++++++++ src/gui/restore_tab.cpp | 15 +++++++- 4 files changed, 110 insertions(+), 2 deletions(-) create mode 100644 src/gui/gui_utils.h diff --git a/CMakeLists.txt b/CMakeLists.txt index cae9e10..eacef53 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -231,6 +231,7 @@ if(BUILD_GUI AND HAVE_QT6) src/gui/progress_widget.h src/gui/log_widget.h src/gui/filter_dialog.h + src/gui/gui_utils.h ) set(GUI_RESOURCES src/gui/resources/app.qrc diff --git a/src/gui/backup_tab.cpp b/src/gui/backup_tab.cpp index a6b05a4..f2dfc7c 100644 --- a/src/gui/backup_tab.cpp +++ b/src/gui/backup_tab.cpp @@ -2,6 +2,7 @@ #include "gui/backup_worker.h" #include "gui/filter_dialog.h" #include "gui/gui_style.h" +#include "gui/gui_utils.h" #include "gui/log_widget.h" #include "gui/progress_widget.h" @@ -448,7 +449,19 @@ void BackupTab::onStartBackup() auto src = std::filesystem::path(sourcePath_->text().toStdString()); auto dst = std::filesystem::path(destPath_->text().toStdString()); - worker_ = new BackupWorker(BackupWorker::Backup, src, dst, opts, this); + // Create timestamped subdirectory inside chosen destination: + // data/source_20260715_143000/ + auto backupPath = makeBackupSubPath(dst, src); + std::error_code ec; + std::filesystem::create_directories(backupPath, ec); + if (ec) { + QMessageBox::warning(this, QStringLiteral("错误"), + QStringLiteral("无法创建备份目录: %1").arg( + QString::fromStdString(backupPath.string()))); + return; + } + + worker_ = new BackupWorker(BackupWorker::Backup, src, backupPath, opts, this); connect(worker_, &BackupWorker::progressUpdated, this, [this](int pct, QString const& file, int done, int total, diff --git a/src/gui/gui_utils.h b/src/gui/gui_utils.h new file mode 100644 index 0000000..14fa80a --- /dev/null +++ b/src/gui/gui_utils.h @@ -0,0 +1,81 @@ +#pragma once + +#include +#include +#include +#include +#include +#include +#include +#include + +namespace backer::gui { + +/// Current local time as YYYYMMDD_HHMMSS string. +inline std::string currentTimestamp() +{ + auto now = std::chrono::system_clock::now(); + auto tt = std::chrono::system_clock::to_time_t(now); + std::tm tm{}; +#if BACKER_PLATFORM_POSIX + localtime_r(&tt, &tm); +#else + localtime_s(&tm, &tt); +#endif + std::ostringstream os; + os << std::put_time(&tm, "%Y%m%d_%H%M%S"); + return os.str(); +} + +/// Strip known archive/compress/encrypt extensions from a filename. +/// "data_20260714.tar.gz.enc" → "data_20260714" +inline std::string stripExtensions(std::filesystem::path const& path) +{ + static std::unordered_set const kKnownExts = { + ".enc", ".gz", ".zst", ".lzma", ".xz", ".tar", ".zip" + }; + auto s = path.string(); + while (s.size() > 1 && (s.back() == '/' || s.back() == '\\')) + s.pop_back(); + auto filename = std::filesystem::path(s).filename().string(); + auto p = std::filesystem::path(filename); + while (true) { + auto ext = p.extension().string(); + if (!ext.empty() && kKnownExts.count(ext)) { + p = p.stem(); + } else { + break; + } + } + return p.string(); +} + +/// Build a subdirectory name for a backup inside the user-chosen dest dir. +/// makeBackupSubPath("data", "home/user/docs", "tar") +/// → "data/docs_20260715_143000" +inline std::filesystem::path makeBackupSubPath( + std::filesystem::path const& destDir, + std::filesystem::path const& source) +{ + auto srcName = source.filename().string(); + if (srcName.empty() || srcName == "." || srcName == "..") + srcName = "backup"; + auto ts = currentTimestamp(); + return destDir / (srcName + "_" + ts); +} + +/// Build a subdirectory name for a restore inside the user-chosen dest dir. +/// makeRestoreSubPath("data", "backups/docs_20260715_143000.tar.gz") +/// → "data/docs_R20260715_143000" +inline std::filesystem::path makeRestoreSubPath( + std::filesystem::path const& destDir, + std::filesystem::path const& source) +{ + auto baseName = stripExtensions(source); + if (baseName.empty() || baseName == "." || baseName == "..") + baseName = "restore"; + auto ts = currentTimestamp(); + return destDir / (baseName + "_R" + ts); +} + +} // namespace backer::gui diff --git a/src/gui/restore_tab.cpp b/src/gui/restore_tab.cpp index 4a7492e..258b7c2 100644 --- a/src/gui/restore_tab.cpp +++ b/src/gui/restore_tab.cpp @@ -1,6 +1,7 @@ #include "gui/restore_tab.h" #include "gui/backup_worker.h" #include "gui/gui_style.h" +#include "gui/gui_utils.h" #include "gui/log_widget.h" #include "gui/progress_widget.h" @@ -190,7 +191,19 @@ void RestoreTab::onStartRestore() auto src = std::filesystem::path(sourcePath_->text().toStdString()); auto dst = std::filesystem::path(destPath_->text().toStdString()); - worker_ = new BackupWorker(BackupWorker::Restore, src, dst, opts, this); + // Create timestamped subdirectory inside chosen destination: + // data/source_R20260715_143000/ + auto restorePath = makeRestoreSubPath(dst, src); + std::error_code ec; + std::filesystem::create_directories(restorePath, ec); + if (ec) { + QMessageBox::warning(this, QStringLiteral("错误"), + QStringLiteral("无法创建还原目录: %1").arg( + QString::fromStdString(restorePath.string()))); + return; + } + + worker_ = new BackupWorker(BackupWorker::Restore, src, restorePath, opts, this); connect(worker_, &BackupWorker::progressUpdated, this, [this](int pct, QString const& file, int done, int total, From 70649fbb1c29df6509a3616399906eab97eae718 Mon Sep 17 00:00:00 2001 From: airprofly Date: Wed, 15 Jul 2026 20:45:58 +0800 Subject: [PATCH 04/23] fix(gui): remove premature create_directories in backup/restore The engine handles directory creation for both mirror mode (fs_->mkdir) and archive mode (fs_->write). Pre-creating the directory in GUI caused an empty directory to remain alongside the .tar file when pack mode was enabled. Co-Authored-By: Claude --- src/gui/backup_tab.cpp | 13 +++---------- src/gui/restore_tab.cpp | 12 ++---------- 2 files changed, 5 insertions(+), 20 deletions(-) diff --git a/src/gui/backup_tab.cpp b/src/gui/backup_tab.cpp index f2dfc7c..ad9e5cd 100644 --- a/src/gui/backup_tab.cpp +++ b/src/gui/backup_tab.cpp @@ -449,17 +449,10 @@ void BackupTab::onStartBackup() auto src = std::filesystem::path(sourcePath_->text().toStdString()); auto dst = std::filesystem::path(destPath_->text().toStdString()); - // Create timestamped subdirectory inside chosen destination: - // data/source_20260715_143000/ + // Create timestamped subdirectory inside chosen destination. + // The backup engine will create the actual dir (mirror mode) or + // write the archive file (pack mode) inside this subpath. auto backupPath = makeBackupSubPath(dst, src); - std::error_code ec; - std::filesystem::create_directories(backupPath, ec); - if (ec) { - QMessageBox::warning(this, QStringLiteral("错误"), - QStringLiteral("无法创建备份目录: %1").arg( - QString::fromStdString(backupPath.string()))); - return; - } worker_ = new BackupWorker(BackupWorker::Backup, src, backupPath, opts, this); diff --git a/src/gui/restore_tab.cpp b/src/gui/restore_tab.cpp index 258b7c2..ea97c56 100644 --- a/src/gui/restore_tab.cpp +++ b/src/gui/restore_tab.cpp @@ -191,17 +191,9 @@ void RestoreTab::onStartRestore() auto src = std::filesystem::path(sourcePath_->text().toStdString()); auto dst = std::filesystem::path(destPath_->text().toStdString()); - // Create timestamped subdirectory inside chosen destination: - // data/source_R20260715_143000/ + // Create timestamped subdirectory inside chosen destination. + // The restore engine will create the actual dir inside this subpath. auto restorePath = makeRestoreSubPath(dst, src); - std::error_code ec; - std::filesystem::create_directories(restorePath, ec); - if (ec) { - QMessageBox::warning(this, QStringLiteral("错误"), - QStringLiteral("无法创建还原目录: %1").arg( - QString::fromStdString(restorePath.string()))); - return; - } worker_ = new BackupWorker(BackupWorker::Restore, src, restorePath, opts, this); From 6d36a524d7e1a9e2e3cba3189fc11143203ff06a Mon Sep 17 00:00:00 2001 From: airprofly Date: Wed, 15 Jul 2026 20:47:44 +0800 Subject: [PATCH 05/23] fix(gui): encrypt/decrypt algorithm name mapping and missing encrypt collect MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Two bugs fixed: 1. collectOptions() was missing the encrypt block entirely — opts.encryptAlgo and opts.password were never set. 2. GUI display names 'AES-256' and 'SM4' didn't match buildEncryptor expectations ('aes256', 'sm4'). Same fix applied to restore tab's decryptAlgo mapping. Co-Authored-By: Claude --- src/gui/backup_tab.cpp | 9 +++++++++ src/gui/restore_tab.cpp | 6 +++++- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/src/gui/backup_tab.cpp b/src/gui/backup_tab.cpp index ad9e5cd..ad5e78a 100644 --- a/src/gui/backup_tab.cpp +++ b/src/gui/backup_tab.cpp @@ -371,6 +371,15 @@ backer::cli::BackupOptions BackupTab::collectOptions() const opts.compressLevel = compressLevel_->value(); } + if (enableEncrypt_->isChecked()) { + auto algo = encryptAlgo_->currentText(); + if (algo == QStringLiteral("AES-256")) + opts.encryptAlgo = "aes256"; + else if (algo == QStringLiteral("SM4")) + opts.encryptAlgo = "sm4"; + opts.password = password_->text().toStdString(); + } + // Parse filter fields if (enableFilter_->isChecked()) { auto split = [](QString const& text) { diff --git a/src/gui/restore_tab.cpp b/src/gui/restore_tab.cpp index ea97c56..c0907b0 100644 --- a/src/gui/restore_tab.cpp +++ b/src/gui/restore_tab.cpp @@ -182,7 +182,11 @@ void RestoreTab::onStartRestore() if (enableDecompress_->isChecked()) opts.decompressAlgo = decompressAlgo_->currentText().toStdString(); if (enableDecrypt_->isChecked()) { - opts.decryptAlgo = decryptAlgo_->currentText().toStdString(); + auto algo = decryptAlgo_->currentText(); + if (algo == QStringLiteral("AES-256")) + opts.decryptAlgo = "aes256"; + else if (algo == QStringLiteral("SM4")) + opts.decryptAlgo = "sm4"; opts.password = password_->text().toStdString(); } if (enablePack_->isChecked()) From 42d493113725112399b9e73d61e2be61da346a52 Mon Sep 17 00:00:00 2001 From: airprofly Date: Wed, 15 Jul 2026 20:48:16 +0800 Subject: [PATCH 06/23] fix(gui): add password validation to restore tab Mirror the backup tab's encrypt-password validation: require non-empty password when decrypt is enabled. Co-Authored-By: Claude --- src/gui/restore_tab.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/gui/restore_tab.cpp b/src/gui/restore_tab.cpp index c0907b0..ebb3bb6 100644 --- a/src/gui/restore_tab.cpp +++ b/src/gui/restore_tab.cpp @@ -171,6 +171,12 @@ void RestoreTab::onStartRestore() return; } + if (enableDecrypt_->isChecked() && password_->text().isEmpty()) { + QMessageBox::warning(this, QStringLiteral("提示"), + QStringLiteral("请输入解密密码")); + return; + } + startBtn_->setEnabled(false); cancelBtn_->setEnabled(true); progressWidget_->setRunning(true); From 6d620a564c55c88166489fee038f703868d18a23 Mon Sep 17 00:00:00 2001 From: airprofly Date: Wed, 15 Jul 2026 20:55:26 +0800 Subject: [PATCH 07/23] refactor(gui): auto-detect decrypt algorithm in restore tab MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Remove decrypt algorithm combobox and enableDecrypt checkbox - Only show password field (always visible) - Auto-detect encryption from .enc filename suffix - Encrypted file without password → prompt user - BackupWorker auto-tries AES-256 first, falls back to SM4 - No need for user to select encryption algorithm manually Co-Authored-By: Claude --- src/gui/backup_worker.cpp | 14 ++++++++++++-- src/gui/restore_tab.cpp | 35 +++++++++++++---------------------- src/gui/restore_tab.h | 4 ++-- 3 files changed, 27 insertions(+), 26 deletions(-) diff --git a/src/gui/backup_worker.cpp b/src/gui/backup_worker.cpp index 6983d25..388dfd1 100644 --- a/src/gui/backup_worker.cpp +++ b/src/gui/backup_worker.cpp @@ -117,8 +117,18 @@ void BackupWorker::run() auto const& opts = std::get(options_); resultCode = backer::cli::handleBackup(source_, destination_, opts); } else { - auto const& opts = std::get(options_); - resultCode = backer::cli::handleRestore(source_, destination_, opts); + auto opts = std::get(options_); + if (!opts.password.empty() && opts.decryptAlgo.empty()) { + // Auto-detect: try AES first, fall back to SM4 + opts.decryptAlgo = "aes256"; + resultCode = backer::cli::handleRestore(source_, destination_, opts); + if (resultCode != 0) { + opts.decryptAlgo = "sm4"; + resultCode = backer::cli::handleRestore(source_, destination_, opts); + } + } else { + resultCode = backer::cli::handleRestore(source_, destination_, opts); + } } } catch (std::exception const& e) { errorMsg = e.what(); diff --git a/src/gui/restore_tab.cpp b/src/gui/restore_tab.cpp index ebb3bb6..ff46513 100644 --- a/src/gui/restore_tab.cpp +++ b/src/gui/restore_tab.cpp @@ -60,14 +60,10 @@ void RestoreTab::setupUi() decompressAlgo_->addItems({QStringLiteral("gzip"), QStringLiteral("zstd"), QStringLiteral("lzma")}); decompressAlgo_->setEnabled(false); - enableDecrypt_ = new QCheckBox(QStringLiteral("解密")); - decryptAlgo_ = new QComboBox(); - decryptAlgo_->addItems({QStringLiteral("AES-256"), QStringLiteral("SM4")}); - decryptAlgo_->setEnabled(false); + passwordLabel_ = new QLabel(QStringLiteral("解密密码:")); password_ = new QLineEdit(); password_->setEchoMode(QLineEdit::Password); - password_->setPlaceholderText(QStringLiteral("密码")); - password_->setEnabled(false); + password_->setPlaceholderText(QStringLiteral("加密备份时设置的密码(可选)")); enablePack_ = new QCheckBox(QStringLiteral("打包格式")); packFormat_ = new QComboBox(); @@ -77,9 +73,8 @@ void RestoreTab::setupUi() optionsLayout->addWidget(enableDecompress_); optionsLayout->addWidget(decompressAlgo_); optionsLayout->addSpacing(8); - optionsLayout->addWidget(enableDecrypt_); - optionsLayout->addWidget(decryptAlgo_); - optionsLayout->addWidget(password_); + optionsLayout->addWidget(passwordLabel_); + optionsLayout->addWidget(password_, 1); optionsLayout->addSpacing(8); optionsLayout->addWidget(enablePack_); optionsLayout->addWidget(packFormat_); @@ -88,10 +83,6 @@ void RestoreTab::setupUi() connect(enableDecompress_, &QCheckBox::toggled, decompressAlgo_, &QComboBox::setEnabled); - connect(enableDecrypt_, &QCheckBox::toggled, - decryptAlgo_, &QComboBox::setEnabled); - connect(enableDecrypt_, &QCheckBox::toggled, - password_, &QWidget::setEnabled); connect(enablePack_, &QCheckBox::toggled, packFormat_, &QComboBox::setEnabled); @@ -165,15 +156,19 @@ void RestoreTab::onStartRestore() QStringLiteral("请选择备份源和还原目标目录")); return; } - if (!std::filesystem::exists(sourcePath_->text().toStdString())) { + auto srcStr = sourcePath_->text().toStdString(); + if (!std::filesystem::exists(srcStr)) { QMessageBox::warning(this, QStringLiteral("提示"), QStringLiteral("备份源路径不存在")); return; } - if (enableDecrypt_->isChecked() && password_->text().isEmpty()) { + // Auto-detect encryption: check if source ends with .enc + bool isEncrypted = (srcStr.size() >= 4 && + srcStr.compare(srcStr.size() - 4, 4, ".enc") == 0); + if (isEncrypted && password_->text().isEmpty()) { QMessageBox::warning(this, QStringLiteral("提示"), - QStringLiteral("请输入解密密码")); + QStringLiteral("备份文件已加密,请输入解密密码")); return; } @@ -187,12 +182,8 @@ void RestoreTab::onStartRestore() opts.handleSpecial = handleSpecial_->isChecked(); if (enableDecompress_->isChecked()) opts.decompressAlgo = decompressAlgo_->currentText().toStdString(); - if (enableDecrypt_->isChecked()) { - auto algo = decryptAlgo_->currentText(); - if (algo == QStringLiteral("AES-256")) - opts.decryptAlgo = "aes256"; - else if (algo == QStringLiteral("SM4")) - opts.decryptAlgo = "sm4"; + if (isEncrypted) { + // Leave decryptAlgo empty — BackupWorker will auto-try AES then SM4 opts.password = password_->text().toStdString(); } if (enablePack_->isChecked()) diff --git a/src/gui/restore_tab.h b/src/gui/restore_tab.h index 3b2c37c..ebf6ae3 100644 --- a/src/gui/restore_tab.h +++ b/src/gui/restore_tab.h @@ -8,6 +8,7 @@ class QCheckBox; class QComboBox; +class QLabel; class QLineEdit; class QPushButton; @@ -41,9 +42,8 @@ private slots: QLineEdit* destPath_{nullptr}; QCheckBox* enableDecompress_{nullptr}; QComboBox* decompressAlgo_{nullptr}; - QCheckBox* enableDecrypt_{nullptr}; - QComboBox* decryptAlgo_{nullptr}; QLineEdit* password_{nullptr}; + QLabel* passwordLabel_{nullptr}; QCheckBox* enablePack_{nullptr}; QComboBox* packFormat_{nullptr}; QCheckBox* preserveMetadata_{nullptr}; From 9845dd79e81183b9ef12d196fd989dc8c07f11b3 Mon Sep 17 00:00:00 2001 From: airprofly Date: Wed, 15 Jul 2026 20:57:18 +0800 Subject: [PATCH 08/23] refactor(gui): fully auto-detect restore options from filename MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Restore tab now only shows source, destination, and password. All format/algorithm detection is automatic: - Parse filename extension chain right-to-left .enc → decrypt (auto-try AES→SM4) .gz → decompress gzip .zst → decompress zstd .xz → decompress lzma .tar → unpack tar .zip → unpack zip Example: docs_20260715.tar.xz.enc → decrypt→lzma→tar No manual algo selection needed anymore. Co-Authored-By: Claude --- src/gui/gui_utils.h | 46 +++++++++++++++++++++++++++++++++ src/gui/restore_tab.cpp | 57 ++++++++++------------------------------- src/gui/restore_tab.h | 11 ++------ 3 files changed, 62 insertions(+), 52 deletions(-) diff --git a/src/gui/gui_utils.h b/src/gui/gui_utils.h index 14fa80a..22ba00a 100644 --- a/src/gui/gui_utils.h +++ b/src/gui/gui_utils.h @@ -78,4 +78,50 @@ inline std::filesystem::path makeRestoreSubPath( return destDir / (baseName + "_R" + ts); } +/// Detected restore parameters inferred from a backup filename's extension chain. +struct DetectedRestore { + bool isEncrypted = false; + std::string decompressAlgo; ///< "gzip", "zstd", "lzma", or empty + std::string packFormat; ///< "tar", "zip", or empty +}; + +/// Parse a backup filename's extension chain to auto-detect restore options. +/// +/// Strips known extensions right-to-left and maps each to a restore parameter: +/// "docs_20260715.tar.gz" → pack=tar, decompress=gzip +/// "docs_20260715.tar.xz.enc" → pack=tar, decompress=lzma, encrypt +/// "docs_20260715.zip" → pack=zip +inline DetectedRestore detectRestoreOptions(std::filesystem::path const& source) +{ + DetectedRestore result; + auto s = source.string(); + // Strip trailing separators + while (s.size() > 1 && (s.back() == '/' || s.back() == '\\')) + s.pop_back(); + auto filename = std::filesystem::path(s).filename().string(); + auto p = std::filesystem::path(filename); + bool done = false; + while (!done && !p.extension().string().empty()) { + auto ext = p.extension().string(); + // Order matters: process right-to-left + if (ext == ".enc") { + result.isEncrypted = true; + } else if (ext == ".gz") { + result.decompressAlgo = "gzip"; + } else if (ext == ".zst") { + result.decompressAlgo = "zstd"; + } else if (ext == ".xz" || ext == ".lzma") { + result.decompressAlgo = "lzma"; + } else if (ext == ".tar") { + result.packFormat = "tar"; + } else if (ext == ".zip") { + result.packFormat = "zip"; + } else { + break; // unknown extension → stop + } + p = p.stem(); + } + return result; +} + } // namespace backer::gui diff --git a/src/gui/restore_tab.cpp b/src/gui/restore_tab.cpp index ff46513..e0eb1a7 100644 --- a/src/gui/restore_tab.cpp +++ b/src/gui/restore_tab.cpp @@ -52,39 +52,14 @@ void RestoreTab::setupUi() connect(browseSrcBtn, &QPushButton::clicked, this, &RestoreTab::onBrowseSource); connect(browseDestBtn, &QPushButton::clicked, this, &RestoreTab::onBrowseDest); - // ── Decompress / Decrypt / Pack options ─────────────────── - auto* optionsLayout = new QHBoxLayout(); - - enableDecompress_ = new QCheckBox(QStringLiteral("解压缩")); - decompressAlgo_ = new QComboBox(); - decompressAlgo_->addItems({QStringLiteral("gzip"), QStringLiteral("zstd"), QStringLiteral("lzma")}); - decompressAlgo_->setEnabled(false); - - passwordLabel_ = new QLabel(QStringLiteral("解密密码:")); + // ── Password (only needed for encrypted backups) ────────── + auto* pwdRow = new QHBoxLayout(); + pwdRow->addWidget(new QLabel(QStringLiteral("解密密码:"))); password_ = new QLineEdit(); password_->setEchoMode(QLineEdit::Password); password_->setPlaceholderText(QStringLiteral("加密备份时设置的密码(可选)")); - - enablePack_ = new QCheckBox(QStringLiteral("打包格式")); - packFormat_ = new QComboBox(); - packFormat_->addItems({QStringLiteral("Tar"), QStringLiteral("Zip")}); - packFormat_->setEnabled(false); - - optionsLayout->addWidget(enableDecompress_); - optionsLayout->addWidget(decompressAlgo_); - optionsLayout->addSpacing(8); - optionsLayout->addWidget(passwordLabel_); - optionsLayout->addWidget(password_, 1); - optionsLayout->addSpacing(8); - optionsLayout->addWidget(enablePack_); - optionsLayout->addWidget(packFormat_); - optionsLayout->addStretch(); - mainLayout->addLayout(optionsLayout); - - connect(enableDecompress_, &QCheckBox::toggled, - decompressAlgo_, &QComboBox::setEnabled); - connect(enablePack_, &QCheckBox::toggled, - packFormat_, &QComboBox::setEnabled); + pwdRow->addWidget(password_, 1); + mainLayout->addLayout(pwdRow); // ── Restore flags ───────────────────────────────────────── auto* flagLayout = new QHBoxLayout(); @@ -163,10 +138,12 @@ void RestoreTab::onStartRestore() return; } - // Auto-detect encryption: check if source ends with .enc - bool isEncrypted = (srcStr.size() >= 4 && - srcStr.compare(srcStr.size() - 4, 4, ".enc") == 0); - if (isEncrypted && password_->text().isEmpty()) { + auto src = std::filesystem::path(srcStr); + auto dst = std::filesystem::path(destPath_->text().toStdString()); + + // Auto-detect all options from the backup filename + auto detected = detectRestoreOptions(src); + if (detected.isEncrypted && password_->text().isEmpty()) { QMessageBox::warning(this, QStringLiteral("提示"), QStringLiteral("备份文件已加密,请输入解密密码")); return; @@ -180,20 +157,14 @@ void RestoreTab::onStartRestore() cli::RestoreOptions opts; opts.preserveMetadata = preserveMetadata_->isChecked(); opts.handleSpecial = handleSpecial_->isChecked(); - if (enableDecompress_->isChecked()) - opts.decompressAlgo = decompressAlgo_->currentText().toStdString(); - if (isEncrypted) { + opts.decompressAlgo = detected.decompressAlgo; + opts.packFormat = detected.packFormat; + if (detected.isEncrypted) { // Leave decryptAlgo empty — BackupWorker will auto-try AES then SM4 opts.password = password_->text().toStdString(); } - if (enablePack_->isChecked()) - opts.packFormat = packFormat_->currentText().toLower().toStdString(); - - auto src = std::filesystem::path(sourcePath_->text().toStdString()); - auto dst = std::filesystem::path(destPath_->text().toStdString()); // Create timestamped subdirectory inside chosen destination. - // The restore engine will create the actual dir inside this subpath. auto restorePath = makeRestoreSubPath(dst, src); worker_ = new BackupWorker(BackupWorker::Restore, src, restorePath, opts, this); diff --git a/src/gui/restore_tab.h b/src/gui/restore_tab.h index ebf6ae3..6c7c2e2 100644 --- a/src/gui/restore_tab.h +++ b/src/gui/restore_tab.h @@ -7,8 +7,6 @@ #include class QCheckBox; -class QComboBox; -class QLabel; class QLineEdit; class QPushButton; @@ -18,8 +16,8 @@ class BackupWorker; class LogWidget; class ProgressWidget; -/// Restore configuration tab — select backup source, target directory, -/// decompression/pack options, and run restore. +/// Restore configuration tab — select backup source and target directory. +/// All format/algorithm detection is automatic from filename. class RestoreTab : public QWidget { Q_OBJECT public: @@ -40,12 +38,7 @@ private slots: QLineEdit* sourcePath_{nullptr}; QLineEdit* destPath_{nullptr}; - QCheckBox* enableDecompress_{nullptr}; - QComboBox* decompressAlgo_{nullptr}; QLineEdit* password_{nullptr}; - QLabel* passwordLabel_{nullptr}; - QCheckBox* enablePack_{nullptr}; - QComboBox* packFormat_{nullptr}; QCheckBox* preserveMetadata_{nullptr}; QCheckBox* handleSpecial_{nullptr}; QPushButton* startBtn_{nullptr}; From 744a934a100216b0e86f2f309f0081b621e98b59 Mon Sep 17 00:00:00 2001 From: airprofly Date: Wed, 15 Jul 2026 20:57:33 +0800 Subject: [PATCH 09/23] chore: add Zone.Identifier to gitignore --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 79a0053..e4c2ce5 100644 --- a/.gitignore +++ b/.gitignore @@ -149,4 +149,4 @@ temp/ # =============== 其他 =============== HELP.md .mvn/wrapper/maven-wrapper.jar - \ No newline at end of file + *Zone.Identifier From 8629f0b370af7c8928f31db97c99439136bb91f5 Mon Sep 17 00:00:00 2001 From: airprofly Date: Wed, 15 Jul 2026 21:07:47 +0800 Subject: [PATCH 10/23] fix(gui): restore tab now properly reports decryption failure MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit onCancel was connected to finished() but ignored the success parameter — always showed '还原完成' and emitted success=true. Renamed to onRestoreFinished(bool success, QString const& msg) that handles errors correctly: wrong password now shows '还原失败: ✗ Decryption failed — wrong password or corrupted data' without progress bar animation. Co-Authored-By: Claude --- src/gui/restore_tab.cpp | 21 +++++++++++++-------- src/gui/restore_tab.h | 1 + 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/src/gui/restore_tab.cpp b/src/gui/restore_tab.cpp index e0eb1a7..f86a054 100644 --- a/src/gui/restore_tab.cpp +++ b/src/gui/restore_tab.cpp @@ -179,7 +179,7 @@ void RestoreTab::onStartRestore() connect(worker_, &BackupWorker::logMessage, logWidget_, &LogWidget::appendMessage); connect(worker_, &BackupWorker::finished, - this, &RestoreTab::onCancel); // re-use onCancel to clean up + this, &RestoreTab::onRestoreFinished); worker_->start(); logWidget_->appendMessage(QStringLiteral("还原任务已启动"), 0); @@ -191,23 +191,28 @@ void RestoreTab::onCancel() worker_->cancel(); cancelBtn_->setEnabled(false); logWidget_->appendMessage(QStringLiteral("正在取消还原..."), 1); - return; } +} - // Cleanup after completion +void RestoreTab::onRestoreFinished(bool success, QString const& msg) +{ startBtn_->setEnabled(true); cancelBtn_->setEnabled(false); progressWidget_->setRunning(false); - QString msg; + if (success) { + progressWidget_->setValue(100); + logWidget_->appendMessage(QStringLiteral("还原完成"), 0); + } else { + logWidget_->appendMessage(QStringLiteral("还原失败: ") + msg, 2); + } + + emit restoreFinished(success, msg); + if (worker_) { - // Use last log line as result hint - msg = QStringLiteral("还原任务已完成"); worker_->deleteLater(); worker_ = nullptr; } - - emit restoreFinished(true, msg); } } // namespace backer::gui diff --git a/src/gui/restore_tab.h b/src/gui/restore_tab.h index 6c7c2e2..a291704 100644 --- a/src/gui/restore_tab.h +++ b/src/gui/restore_tab.h @@ -31,6 +31,7 @@ private slots: void onBrowseDest(); void onStartRestore(); void onCancel(); + void onRestoreFinished(bool success, QString const& msg); private: void setupUi(); From 77b81f69fabab5d7f6dc5f0c069392ec2bfc8069 Mon Sep 17 00:00:00 2001 From: airprofly Date: Wed, 15 Jul 2026 21:10:52 +0800 Subject: [PATCH 11/23] fix(gui): restore failure stays on restore tab for retry Only switch to backup tab on restore success. On failure, stay on restore tab so user can fix password and retry. Co-Authored-By: Claude --- src/gui/main_window.cpp | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/gui/main_window.cpp b/src/gui/main_window.cpp index 9484727..855902a 100644 --- a/src/gui/main_window.cpp +++ b/src/gui/main_window.cpp @@ -45,7 +45,17 @@ void MainWindow::setupUi() connect(backupTab_, &BackupTab::backupFinished, this, &MainWindow::onBackupFinished); connect(restoreTab_, &RestoreTab::restoreFinished, - this, &MainWindow::onBackupFinished); + this, [this](bool success, QString const& message) { + if (success) { + QMessageBox::information(this, + QStringLiteral("还原完成"), message); + tabWidget_->setCurrentWidget(backupTab_); + } else { + QMessageBox::critical(this, + QStringLiteral("还原失败"), message); + // Stay on restore tab for retry + } + }); } void MainWindow::setupMenuBar() From 91f058de7e26baaa8d3e17ef24ab54cbb2918256 Mon Sep 17 00:00:00 2001 From: airprofly Date: Wed, 15 Jul 2026 21:18:55 +0800 Subject: [PATCH 12/23] fix(gui): auto-enable tar pack when encrypt is enabled Encryption operates on a single file, not a directory. When user enables encryption without pack, auto-enable Tar packing to produce a valid .tar.enc file. Co-Authored-By: Claude --- src/gui/backup_tab.cpp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/gui/backup_tab.cpp b/src/gui/backup_tab.cpp index ad5e78a..cd6bb2b 100644 --- a/src/gui/backup_tab.cpp +++ b/src/gui/backup_tab.cpp @@ -446,6 +446,13 @@ void BackupTab::onStartBackup() QStringLiteral("两次输入的密码不一致")); return; } + // Encryption requires a pack format (encrypts a single file, not a directory) + if (!enablePack_->isChecked()) { + enablePack_->setChecked(true); + packFormat_->setCurrentIndex(0); // Tar + logWidget_->appendMessage( + QStringLiteral("加密备份需要打包,已自动启用 Tar 打包"), 1); + } } // Disable UI during backup From 8298857289c537fd81ee10ce6d6ee2f432503615 Mon Sep 17 00:00:00 2001 From: airprofly Date: Wed, 15 Jul 2026 21:34:24 +0800 Subject: [PATCH 13/23] fix(gui): remove non-functional metadata/special file checkboxes MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit RestoreOptions::preserveMetadata and handleSpecial are dead fields — handleRestore and RestoreEngine never use them. Removed the misleading checkboxes from restore tab. Co-Authored-By: Claude --- src/gui/restore_tab.cpp | 15 --------------- src/gui/restore_tab.h | 3 --- 2 files changed, 18 deletions(-) diff --git a/src/gui/restore_tab.cpp b/src/gui/restore_tab.cpp index f86a054..50c8213 100644 --- a/src/gui/restore_tab.cpp +++ b/src/gui/restore_tab.cpp @@ -5,8 +5,6 @@ #include "gui/log_widget.h" #include "gui/progress_widget.h" -#include -#include #include #include #include @@ -61,17 +59,6 @@ void RestoreTab::setupUi() pwdRow->addWidget(password_, 1); mainLayout->addLayout(pwdRow); - // ── Restore flags ───────────────────────────────────────── - auto* flagLayout = new QHBoxLayout(); - preserveMetadata_ = new QCheckBox(QStringLiteral("保留元数据")); - preserveMetadata_->setChecked(true); - handleSpecial_ = new QCheckBox(QStringLiteral("处理特殊文件")); - handleSpecial_->setChecked(true); - flagLayout->addWidget(preserveMetadata_); - flagLayout->addWidget(handleSpecial_); - flagLayout->addStretch(); - mainLayout->addLayout(flagLayout); - // ── Action buttons ──────────────────────────────────────── auto* btnLayout = new QHBoxLayout(); startBtn_ = new QPushButton(QStringLiteral("开始还原")); @@ -155,8 +142,6 @@ void RestoreTab::onStartRestore() logWidget_->clear(); cli::RestoreOptions opts; - opts.preserveMetadata = preserveMetadata_->isChecked(); - opts.handleSpecial = handleSpecial_->isChecked(); opts.decompressAlgo = detected.decompressAlgo; opts.packFormat = detected.packFormat; if (detected.isEncrypted) { diff --git a/src/gui/restore_tab.h b/src/gui/restore_tab.h index a291704..49fde3a 100644 --- a/src/gui/restore_tab.h +++ b/src/gui/restore_tab.h @@ -6,7 +6,6 @@ #include -class QCheckBox; class QLineEdit; class QPushButton; @@ -40,8 +39,6 @@ private slots: QLineEdit* sourcePath_{nullptr}; QLineEdit* destPath_{nullptr}; QLineEdit* password_{nullptr}; - QCheckBox* preserveMetadata_{nullptr}; - QCheckBox* handleSpecial_{nullptr}; QPushButton* startBtn_{nullptr}; QPushButton* cancelBtn_{nullptr}; ProgressWidget* progressWidget_{nullptr}; From cafd414c1ca25d1029bd1b7c50ea5dbea0131521 Mon Sep 17 00:00:00 2001 From: airprofly Date: Wed, 15 Jul 2026 21:38:38 +0800 Subject: [PATCH 14/23] fix(gui): auto-enable tar pack when compress is enabled Compression also operates on a single file, not a directory. Auto-enable Tar packing when user enables compression without pack, same as encryption. Co-Authored-By: Claude --- src/gui/backup_tab.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/gui/backup_tab.cpp b/src/gui/backup_tab.cpp index cd6bb2b..3ee5717 100644 --- a/src/gui/backup_tab.cpp +++ b/src/gui/backup_tab.cpp @@ -455,6 +455,14 @@ void BackupTab::onStartBackup() } } + // Compression also requires a pack format (compresses a single file) + if (enableCompress_->isChecked() && !enablePack_->isChecked()) { + enablePack_->setChecked(true); + packFormat_->setCurrentIndex(0); // Tar + logWidget_->appendMessage( + QStringLiteral("压缩备份需要打包,已自动启用 Tar 打包"), 1); + } + // Disable UI during backup startBtn_->setEnabled(false); cancelBtn_->setEnabled(true); From 4406c510db1c971fe69fb379448853ab89071356 Mon Sep 17 00:00:00 2001 From: airprofly Date: Wed, 15 Jul 2026 21:39:07 +0800 Subject: [PATCH 15/23] fix(gui): auto-pack fires on checkbox toggle, not on start Compress/Encrypt auto-enable Tar packing immediately when the user checks the box, via onCompressToggled/onEncryptToggled slots, rather than validating at start time. Co-Authored-By: Claude --- src/gui/backup_tab.cpp | 27 ++++++++++++--------------- 1 file changed, 12 insertions(+), 15 deletions(-) diff --git a/src/gui/backup_tab.cpp b/src/gui/backup_tab.cpp index 3ee5717..559243f 100644 --- a/src/gui/backup_tab.cpp +++ b/src/gui/backup_tab.cpp @@ -280,6 +280,12 @@ void BackupTab::onCompressToggled(bool checked) { compressAlgo_->setEnabled(checked); compressLevel_->setEnabled(checked); + if (checked && !enablePack_->isChecked()) { + enablePack_->setChecked(true); + packFormat_->setCurrentIndex(0); // Tar + logWidget_->appendMessage( + QStringLiteral("压缩需要打包,已自动启用 Tar 打包"), 1); + } } void BackupTab::onEncryptToggled(bool checked) @@ -287,6 +293,12 @@ void BackupTab::onEncryptToggled(bool checked) encryptAlgo_->setEnabled(checked); password_->setEnabled(checked); confirmPassword_->setEnabled(checked); + if (checked && !enablePack_->isChecked()) { + enablePack_->setChecked(true); + packFormat_->setCurrentIndex(0); // Tar + logWidget_->appendMessage( + QStringLiteral("加密需要打包,已自动启用 Tar 打包"), 1); + } } namespace { @@ -446,21 +458,6 @@ void BackupTab::onStartBackup() QStringLiteral("两次输入的密码不一致")); return; } - // Encryption requires a pack format (encrypts a single file, not a directory) - if (!enablePack_->isChecked()) { - enablePack_->setChecked(true); - packFormat_->setCurrentIndex(0); // Tar - logWidget_->appendMessage( - QStringLiteral("加密备份需要打包,已自动启用 Tar 打包"), 1); - } - } - - // Compression also requires a pack format (compresses a single file) - if (enableCompress_->isChecked() && !enablePack_->isChecked()) { - enablePack_->setChecked(true); - packFormat_->setCurrentIndex(0); // Tar - logWidget_->appendMessage( - QStringLiteral("压缩备份需要打包,已自动启用 Tar 打包"), 1); } // Disable UI during backup From f741da7d8ab0a487d3b683025d4064a856cf2a26 Mon Sep 17 00:00:00 2001 From: airprofly Date: Wed, 15 Jul 2026 21:41:30 +0800 Subject: [PATCH 16/23] fix(gui): force Tar pack when compress/encrypt toggled, even if Zip was selected Compress and encrypt now force the pack format to Tar, switching away from Zip if previously selected. Co-Authored-By: Claude --- src/gui/backup_tab.cpp | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/src/gui/backup_tab.cpp b/src/gui/backup_tab.cpp index 559243f..3055f18 100644 --- a/src/gui/backup_tab.cpp +++ b/src/gui/backup_tab.cpp @@ -280,11 +280,13 @@ void BackupTab::onCompressToggled(bool checked) { compressAlgo_->setEnabled(checked); compressLevel_->setEnabled(checked); - if (checked && !enablePack_->isChecked()) { + if (checked) { enablePack_->setChecked(true); - packFormat_->setCurrentIndex(0); // Tar - logWidget_->appendMessage( - QStringLiteral("压缩需要打包,已自动启用 Tar 打包"), 1); + if (packFormat_->currentIndex() != 0) { + packFormat_->setCurrentIndex(0); // Tar + logWidget_->appendMessage( + QStringLiteral("压缩需要 Tar 打包,已切换至 Tar"), 1); + } } } @@ -293,11 +295,13 @@ void BackupTab::onEncryptToggled(bool checked) encryptAlgo_->setEnabled(checked); password_->setEnabled(checked); confirmPassword_->setEnabled(checked); - if (checked && !enablePack_->isChecked()) { + if (checked) { enablePack_->setChecked(true); - packFormat_->setCurrentIndex(0); // Tar - logWidget_->appendMessage( - QStringLiteral("加密需要打包,已自动启用 Tar 打包"), 1); + if (packFormat_->currentIndex() != 0) { + packFormat_->setCurrentIndex(0); // Tar + logWidget_->appendMessage( + QStringLiteral("加密需要 Tar 打包,已切换至 Tar"), 1); + } } } From b128559fd8511673e60374021c3e03a34e9365cf Mon Sep 17 00:00:00 2001 From: airprofly Date: Wed, 15 Jul 2026 21:43:30 +0800 Subject: [PATCH 17/23] chore(gui): simplify auto-Tar log message --- src/gui/backup_tab.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/gui/backup_tab.cpp b/src/gui/backup_tab.cpp index 3055f18..cc5df73 100644 --- a/src/gui/backup_tab.cpp +++ b/src/gui/backup_tab.cpp @@ -285,7 +285,7 @@ void BackupTab::onCompressToggled(bool checked) if (packFormat_->currentIndex() != 0) { packFormat_->setCurrentIndex(0); // Tar logWidget_->appendMessage( - QStringLiteral("压缩需要 Tar 打包,已切换至 Tar"), 1); + QStringLiteral("已切换至 Tar 打包"), 1); } } } @@ -300,7 +300,7 @@ void BackupTab::onEncryptToggled(bool checked) if (packFormat_->currentIndex() != 0) { packFormat_->setCurrentIndex(0); // Tar logWidget_->appendMessage( - QStringLiteral("加密需要 Tar 打包,已切换至 Tar"), 1); + QStringLiteral("已切换至 Tar 打包"), 1); } } } From 2daf9d7add60da765788a9faf2b55cbcabef90f0 Mon Sep 17 00:00:00 2001 From: airprofly Date: Wed, 15 Jul 2026 21:47:26 +0800 Subject: [PATCH 18/23] fix(gui): prevent backup start when compress/encrypt checked without pack Guard against edge case where user manually unchecks pack after auto-toggle. Shows clear error message instead of running a mirror backup and then failing at compress/encrypt step. Co-Authored-By: Claude --- src/gui/backup_tab.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/gui/backup_tab.cpp b/src/gui/backup_tab.cpp index cc5df73..d7ef7d0 100644 --- a/src/gui/backup_tab.cpp +++ b/src/gui/backup_tab.cpp @@ -464,6 +464,14 @@ void BackupTab::onStartBackup() } } + // Compression/encryption require packing (operate on single file, not directory) + if (!enablePack_->isChecked() && + (enableCompress_->isChecked() || enableEncrypt_->isChecked())) { + QMessageBox::warning(this, QStringLiteral("提示"), + QStringLiteral("压缩和加密需要打包功能,请勾选「打包」")); + return; + } + // Disable UI during backup startBtn_->setEnabled(false); cancelBtn_->setEnabled(true); From c4dedee29bad023cf7763cd96748017eb190ad6c Mon Sep 17 00:00:00 2001 From: airprofly Date: Wed, 15 Jul 2026 21:53:04 +0800 Subject: [PATCH 19/23] fix(gui): FilterDialog now pre-fills all 6 dimensions from inline controls Added setters to FilterDialog for types, time, size, and owner. onEditFilter() pre-fills them before showing dialog, so user's inline settings are not lost when opening the dialog. Co-Authored-By: Claude --- src/gui/backup_tab.cpp | 27 ++++++++++++++++-------- src/gui/filter_dialog.cpp | 43 +++++++++++++++++++++++++++++++++++++++ src/gui/filter_dialog.h | 4 ++++ 3 files changed, 65 insertions(+), 9 deletions(-) diff --git a/src/gui/backup_tab.cpp b/src/gui/backup_tab.cpp index d7ef7d0..e6281c8 100644 --- a/src/gui/backup_tab.cpp +++ b/src/gui/backup_tab.cpp @@ -318,15 +318,24 @@ void BackupTab::onEditFilter() { FilterDialog dlg(this); - // Pre-fill from current inline values - dlg.setIncludePaths(includePaths_->text().split( - QRegularExpression(QStringLiteral("[,\\s;]+")), Qt::SkipEmptyParts)); - dlg.setExcludePaths(excludePaths_->text().split( - QRegularExpression(QStringLiteral("[,\\s;]+")), Qt::SkipEmptyParts)); - dlg.setIncludeNames(includeNames_->text().split( - QRegularExpression(QStringLiteral("[,\\s;]+")), Qt::SkipEmptyParts)); - dlg.setExcludeNames(excludeNames_->text().split( - QRegularExpression(QStringLiteral("[,\\s;]+")), Qt::SkipEmptyParts)); + // Pre-fill ALL dimensions from current inline values + auto split = [](QString const& text) { + return text.split(QRegularExpression(QStringLiteral("[,\\s;]+")), + Qt::SkipEmptyParts); + }; + dlg.setIncludePaths(split(includePaths_->text())); + dlg.setExcludePaths(split(excludePaths_->text())); + dlg.setIncludeNames(split(includeNames_->text())); + dlg.setExcludeNames(split(excludeNames_->text())); + dlg.setIncludeTypes(split(includeTypes_->text())); + dlg.setTimeFilter(enableTimeFilter_->isChecked(), + mtimeAfter_->dateTime(), mtimeBefore_->dateTime()); + { + qint64 minBytes = sizeMin_->value() * unitMult(sizeUnitMin_->currentIndex()); + qint64 maxBytes = sizeMax_->value() * unitMult(sizeUnitMax_->currentIndex()); + dlg.setSizeFilter(enableSizeFilter_->isChecked(), minBytes, maxBytes); + } + dlg.setOwner(ownerFilter_->text()); if (dlg.exec() == QDialog::Accepted) { // Sync path/name text fields diff --git a/src/gui/filter_dialog.cpp b/src/gui/filter_dialog.cpp index 1d5cb78..9129fb7 100644 --- a/src/gui/filter_dialog.cpp +++ b/src/gui/filter_dialog.cpp @@ -269,6 +269,49 @@ void FilterDialog::setExcludeNames(QStringList const& names) excludeNameList_->addItem(n); } +void FilterDialog::setIncludeTypes(QStringList const& types) +{ + typeFile_->setChecked(types.contains(QStringLiteral("file"))); + typeDir_->setChecked(types.contains(QStringLiteral("dir"))); + typeSymlink_->setChecked(types.contains(QStringLiteral("symlink"))); + typeFifo_->setChecked(types.contains(QStringLiteral("fifo"))); + typeBlock_->setChecked(types.contains(QStringLiteral("block"))); + typeChar_->setChecked(types.contains(QStringLiteral("char"))); + typeSocket_->setChecked(types.contains(QStringLiteral("socket"))); +} + +void FilterDialog::setTimeFilter(bool enabled, QDateTime const& after, QDateTime const& before) +{ + enableTimeFilter_->setChecked(enabled); + mtimeAfter_->setDateTime(after); + mtimeBefore_->setDateTime(before); +} + +void FilterDialog::setSizeFilter(bool enabled, qint64 minBytes, qint64 maxBytes) +{ + enableSizeFilter_->setChecked(enabled); + // Convert bytes back to best-fit unit + auto guessUnit = [](qint64 bytes) { + if (bytes == 0) return 0; + for (int i = 3; i > 0; --i) { + qint64 mult = unitMultiplier(i); + if (bytes >= mult && bytes % mult == 0) return i; + } + return 0; + }; + int ui = guessUnit(minBytes > 0 ? minBytes : maxBytes); + qint64 mult = unitMultiplier(ui); + sizeMin_->setValue(minBytes > 0 ? static_cast(minBytes / mult) : 0); + sizeUnitMin_->setCurrentIndex(minBytes > 0 ? ui : 0); + sizeMax_->setValue(maxBytes > 0 ? static_cast(maxBytes / mult) : 0); + sizeUnitMax_->setCurrentIndex(maxBytes > 0 ? ui : 0); +} + +void FilterDialog::setOwner(QString const& owner) +{ + owner_->setText(owner); +} + // ── Getters ────────────────────────────────────────────────────── QStringList FilterDialog::includePaths() const diff --git a/src/gui/filter_dialog.h b/src/gui/filter_dialog.h index 4353fab..3ac6f3e 100644 --- a/src/gui/filter_dialog.h +++ b/src/gui/filter_dialog.h @@ -26,6 +26,10 @@ class FilterDialog : public QDialog { void setExcludePaths(QStringList const& paths); void setIncludeNames(QStringList const& names); void setExcludeNames(QStringList const& names); + void setIncludeTypes(QStringList const& types); + void setTimeFilter(bool enabled, QDateTime const& after, QDateTime const& before); + void setSizeFilter(bool enabled, qint64 minBytes, qint64 maxBytes); + void setOwner(QString const& owner); // ── Getters ───────────────────────────────────────────── QStringList includePaths() const; From 6a1b5e40c79e0d1ccc6bf6b612b5e50eb9127a50 Mon Sep 17 00:00:00 2001 From: airprofly Date: Wed, 15 Jul 2026 21:57:22 +0800 Subject: [PATCH 20/23] docs(gui): add tooltip explaining path glob semantics in filter Path matching uses FNM_PATHNAME where * doesn't match / Explains common patterns: core, core/*, core/**/*, *.cpp Co-Authored-By: Claude --- src/gui/backup_tab.cpp | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/gui/backup_tab.cpp b/src/gui/backup_tab.cpp index e6281c8..80fc858 100644 --- a/src/gui/backup_tab.cpp +++ b/src/gui/backup_tab.cpp @@ -115,9 +115,17 @@ void BackupTab::setupUi() // Row 1-2: Path includePaths_ = new QLineEdit(); - includePaths_->setPlaceholderText(QStringLiteral("用逗号分隔的包含路径 (glob)")); + includePaths_->setPlaceholderText(QStringLiteral("如 core/* 匹配 core 下所有文件")); + includePaths_->setToolTip(QStringLiteral( + "路径模式使用 glob 语法,* 不匹配 /(子目录)\n" + "例:\n" + " core → 只匹配 core 目录本身\n" + " core/* → 匹配 core 下所有直接子项\n" + " core/**/* → 匹配 core 下所有文件(多级)\n" + " *.cpp → 只匹配根目录的 .cpp 文件")); excludePaths_ = new QLineEdit(); - excludePaths_->setPlaceholderText(QStringLiteral("用逗号分隔的排除路径 (glob)")); + excludePaths_->setPlaceholderText(QStringLiteral("如 *.tmp 排除所有 .tmp 文件")); + excludePaths_->setToolTip(includePaths_->toolTip()); filterForm->addRow(QStringLiteral("包含路径:"), includePaths_); filterForm->addRow(QStringLiteral("排除路径:"), excludePaths_); From a1a2295847be1a0ef767e841bc8f16966b5671b9 Mon Sep 17 00:00:00 2001 From: airprofly Date: Wed, 15 Jul 2026 21:59:09 +0800 Subject: [PATCH 21/23] fix(gui): auto-expand plain path filters to include all children When user enters a path without glob chars (e.g. 'core'), GUI now generates recursive patterns: core, core/*, core/*/*, ... up to 15 levels deep. This matches user expectation that including a directory includes everything inside it. Co-Authored-By: Claude --- src/gui/backup_tab.cpp | 33 +++++++++++++++++++++++---------- src/gui/filter_dialog.cpp | 2 +- 2 files changed, 24 insertions(+), 11 deletions(-) diff --git a/src/gui/backup_tab.cpp b/src/gui/backup_tab.cpp index 80fc858..7628e9d 100644 --- a/src/gui/backup_tab.cpp +++ b/src/gui/backup_tab.cpp @@ -115,16 +115,15 @@ void BackupTab::setupUi() // Row 1-2: Path includePaths_ = new QLineEdit(); - includePaths_->setPlaceholderText(QStringLiteral("如 core/* 匹配 core 下所有文件")); + includePaths_->setPlaceholderText(QStringLiteral("用逗号分隔的包含路径, 如 core, src/*.cpp")); includePaths_->setToolTip(QStringLiteral( - "路径模式使用 glob 语法,* 不匹配 /(子目录)\n" - "例:\n" - " core → 只匹配 core 目录本身\n" - " core/* → 匹配 core 下所有直接子项\n" - " core/**/* → 匹配 core 下所有文件(多级)\n" - " *.cpp → 只匹配根目录的 .cpp 文件")); + "路径过滤语法:\n" + " core → 包含 core 目录下所有文件(自动递归)\n" + " *.cpp → 只匹配根目录下的 .cpp 文件\n" + " 多个用逗号分隔 → core, src/*.h\n" + "支持 glob: *, ?, [...]")); excludePaths_ = new QLineEdit(); - excludePaths_->setPlaceholderText(QStringLiteral("如 *.tmp 排除所有 .tmp 文件")); + excludePaths_->setPlaceholderText(QStringLiteral("用逗号分隔的排除路径, 如 *.tmp, build/")); excludePaths_->setToolTip(includePaths_->toolTip()); filterForm->addRow(QStringLiteral("包含路径:"), includePaths_); filterForm->addRow(QStringLiteral("排除路径:"), excludePaths_); @@ -419,10 +418,24 @@ backer::cli::BackupOptions BackupTab::collectOptions() const return text.split(QRegularExpression(QStringLiteral("[,\\s;]+")), Qt::SkipEmptyParts); }; + auto expandPath = [](QString const& pattern, auto const& addFn) { + if (pattern.contains('*') || pattern.contains('?') || pattern.contains('[')) { + addFn(pattern.toStdString()); + return; + } + // Plain path (no glob) → add patterns for recursive matching + // fnmatch FNM_PATHNAME: * doesn't match /, so generate */ */* */*/* ... + addFn(pattern.toStdString()); // dir itself + for (int depth = 1; depth <= 15; ++depth) { + QString p = pattern; + for (int d = 0; d < depth; ++d) p += QStringLiteral("/*"); + addFn(p.toStdString()); + } + }; for (auto const& s : split(includePaths_->text())) - opts.includePaths.push_back(s.toStdString()); + expandPath(s, [&](auto const& p) { opts.includePaths.push_back(p); }); for (auto const& s : split(excludePaths_->text())) - opts.excludePaths.push_back(s.toStdString()); + expandPath(s, [&](auto const& p) { opts.excludePaths.push_back(p); }); for (auto const& s : split(includeTypes_->text())) opts.includeTypes.push_back(s.toStdString()); for (auto const& s : split(excludeTypes_->text())) diff --git a/src/gui/filter_dialog.cpp b/src/gui/filter_dialog.cpp index 9129fb7..3891adb 100644 --- a/src/gui/filter_dialog.cpp +++ b/src/gui/filter_dialog.cpp @@ -415,7 +415,7 @@ void FilterDialog::onAddIncludePath() bool ok = false; QString text = QInputDialog::getText(this, QStringLiteral("添加包含路径"), - QStringLiteral("路径模式 (支持 glob):"), + QStringLiteral("路径 (支持 glob, 纯路径自动递归):"), QLineEdit::Normal, {}, &ok); if (ok && !text.isEmpty()) includePathList_->addItem(text); From 6dac2c2715087b37a86478a0dab8b00c094b644f Mon Sep 17 00:00:00 2001 From: airprofly Date: Wed, 15 Jul 2026 22:04:49 +0800 Subject: [PATCH 22/23] docs(gui): clarify type filter placeholders, distinguish from name filter Type filter is for OS file types (file/dir/symlink), not file extensions (.txt, .cpp). Updated placeholder and tooltip to guide users to the name filter for suffix-based filtering. Co-Authored-By: Claude --- src/gui/backup_tab.cpp | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/gui/backup_tab.cpp b/src/gui/backup_tab.cpp index 7628e9d..264d797 100644 --- a/src/gui/backup_tab.cpp +++ b/src/gui/backup_tab.cpp @@ -130,9 +130,16 @@ void BackupTab::setupUi() // Row 3-4: Type includeTypes_ = new QLineEdit(); - includeTypes_->setPlaceholderText(QStringLiteral("file, dir, symlink, fifo, block, char, socket")); + includeTypes_->setPlaceholderText(QStringLiteral("file, dir, symlink, fifo, block, char, socket — 不是后缀!")); + includeTypes_->setToolTip(QStringLiteral( + "按文件类型过滤(不是后缀名)\n" + "可选值: file, dir, symlink, fifo, block, char, socket\n" + "例: 只备份普通文件 → file\n" + "例: 排除符号链接 → symlink\n\n" + "提示: 按后缀名筛选请用「名称」字段,如 *.txt")); excludeTypes_ = new QLineEdit(); - excludeTypes_->setPlaceholderText(QStringLiteral("file, dir, symlink, fifo, block, char, socket")); + excludeTypes_->setPlaceholderText(QStringLiteral("file, dir, symlink, fifo, block, char, socket — 不是后缀!")); + excludeTypes_->setToolTip(includeTypes_->toolTip()); filterForm->addRow(QStringLiteral("包含类型:"), includeTypes_); filterForm->addRow(QStringLiteral("排除类型:"), excludeTypes_); From 77d51002fa7f80781a61cc1bc005405e57b4ff71 Mon Sep 17 00:00:00 2001 From: airprofly Date: Thu, 16 Jul 2026 20:32:33 +0800 Subject: [PATCH 23/23] fix all gui filters --- .gitignore | 3 + cppcheck-report.txt | 245 ++++++++++++++++++++++++++++++++++++++ cppcheck-suppressions.txt | 41 +++++++ 3 files changed, 289 insertions(+) create mode 100644 cppcheck-report.txt create mode 100644 cppcheck-suppressions.txt diff --git a/.gitignore b/.gitignore index e4c2ce5..438ee00 100644 --- a/.gitignore +++ b/.gitignore @@ -54,6 +54,9 @@ ENV/ .env.bak/ .conda-env/ +# =============== 静态分析缓存 =============== +.cppcheck-cache/ + # =============== 日志文件 =============== logs/ **/logs/ diff --git a/cppcheck-report.txt b/cppcheck-report.txt new file mode 100644 index 0000000..f68fdbc --- /dev/null +++ b/cppcheck-report.txt @@ -0,0 +1,245 @@ +src/core/backup_engine.cpp:146:19: style: Variable 'content' can be declared as reference to const [constVariableReference] + auto& content = readResult.value(); + ^ +src/core/restore_engine.cpp:148:19: style: Variable 'content' can be declared as reference to const [constVariableReference] + auto& content = readResult.value(); + ^ +tests/core/backup_engine_test.cpp:68:1: error: syntax error [syntaxError] +TEST_F(BackupEngineTest, BackupBasic) { +^ +tests/fs/metadata_test.cpp:44:1: error: syntax error [syntaxError] +TEST_F(MetadataTest, ReadMetadataRegular) { +^ +tests/core/restore_engine_test.cpp:77:1: error: syntax error [syntaxError] +TEST_F(RestoreEngineTest, RestoreBasic) { +^ +tests/fs/special_file_test.cpp:43:1: error: syntax error [syntaxError] +TEST_F(SpecialFileTest, DetectRegularFile) { +^ +tests/pack/tar_packer_test.cpp:149:1: error: syntax error [syntaxError] +TEST_F(TarPackerTest, PackSingleRegularFile) { +^ +tests/filter/criteria_filter_test.cpp:35:1: error: syntax error [syntaxError] +TEST(CriteriaFilterTest, IncludePathGlob) +^ +tests/compress/compressor_test.cpp:17:1: error: syntax error [syntaxError] +TEST_P(CompressorTest, RoundTripEmpty) { +^ +tests/compress/compressor_factory_test.cpp:19:1: error: syntax error [syntaxError] +TEST(BuildCompressorTest, CreateZstd) { +^ +tests/pack/zip_packer_test.cpp:151:1: error: syntax error [syntaxError] +TEST_F(ZipPackerTest, FormatName) { +^ +tests/crypto/openssl_encryptor_test.cpp:16:1: error: syntax error [syntaxError] +TEST_P(EncryptorTest, RoundTripEmpty) { +^ +tests/crypto/encryptor_factory_test.cpp:16:1: error: syntax error [syntaxError] +TEST(BuildEncryptorTest, CreateAes256FullName) { +^ +tests/scheduler/ccronexpr_test.cpp:30:1: error: syntax error [syntaxError] +TEST(CcronexprTest, DailyAt2am) { +^ +tests/scheduler/retention_policy_test.cpp:31:1: error: syntax error [syntaxError] +TEST(RetentionTest, ParseTimestampInvalidFormat) { +^ +build/backer-gui_autogen/MXUWEOXILK/moc_backup_tab.cpp:22:0: error: #error "The header file 'backup_tab.h' doesn't include ." [preprocessorErrorDirective] +#error "The header file 'backup_tab.h' doesn't include ." +^ +src/gui/main_window.h:21:9: error: There is an unknown macro here somewhere. Configuration is required. If slots is a macro then please configure it. [unknownMacro] +private slots: + ^ +tests/scheduler/backup_scheduler_test.cpp:21:1: error: syntax error [syntaxError] +TEST(SchedulerTest, AddAndListJobs) { +^ +src/gui/schedule_tab.h:19:9: error: There is an unknown macro here somewhere. Configuration is required. If slots is a macro then please configure it. [unknownMacro] +private slots: + ^ +src/gui/progress_widget.h:17:8: error: There is an unknown macro here somewhere. Configuration is required. If slots is a macro then please configure it. [unknownMacro] +public slots: + ^ +src/gui/backup_tab.h:35:9: error: There is an unknown macro here somewhere. Configuration is required. If slots is a macro then please configure it. [unknownMacro] +private slots: + ^ +src/gui/log_widget.h:17:8: error: There is an unknown macro here somewhere. Configuration is required. If slots is a macro then please configure it. [unknownMacro] +public slots: + ^ +src/gui/restore_tab.h:28:9: error: There is an unknown macro here somewhere. Configuration is required. If slots is a macro then please configure it. [unknownMacro] +private slots: + ^ +src/gui/backup_worker.h:60:8: error: There is an unknown macro here somewhere. Configuration is required. If slots is a macro then please configure it. [unknownMacro] +public slots: + ^ +src/pack/tar_packer.cpp:67:22: warning: Opposite inner 'if' condition leads to a dead code block. [oppositeInnerCondition] + if (slashPos == 0) break; + ^ +src/pack/tar_packer.cpp:56:54: note: outer condition: slashPos>0 + while (slashPos != std::string::npos && slashPos > 0) { + ^ +src/pack/tar_packer.cpp:67:22: note: opposite inner condition: slashPos==0 + if (slashPos == 0) break; + ^ +src/gui/filter_dialog.h:52:9: error: There is an unknown macro here somewhere. Configuration is required. If slots is a macro then please configure it. [unknownMacro] +private slots: + ^ +src/pack/tar_packer.cpp:255:14: style: Variable 'pad' can be declared as const array [constVariable] + char pad[kBlockSize] = {}; + ^ +src/pack/tar_packer.cpp:345:10: style: Variable 'end' can be declared as const array [constVariable] + char end[kBlockSize * 2] = {}; + ^ +src/crypto/openssl_encryptor.cpp:26:27: style: The scope of the variable 'buf' can be reduced. [variableScope] + std::array buf{}; + ^ +src/filters/criteria_filter.cpp:202:74: style: Consider using std::any_of algorithm instead of a raw loop. [useStlAlgorithm] + && matchGlob(pathStr, c.pathGlob.value(), true)) { + ^ +src/filters/criteria_filter.cpp:214:62: style: Consider using std::any_of algorithm instead of a raw loop. [useStlAlgorithm] + && entry.type == c.fileType.value()) { + ^ +src/filters/criteria_filter.cpp:227:75: style: Consider using std::any_of algorithm instead of a raw loop. [useStlAlgorithm] + && matchGlob(nameStr, c.nameGlob.value(), false)) { + ^ +src/filters/criteria_filter.cpp:275:73: style: Consider using std::any_of algorithm instead of a raw loop. [useStlAlgorithm] + && entry.metadata.ownerId == c.ownerId.value()) { + ^ +src/scheduler/backup_scheduler.cpp:58:45: style: Consider using std::count_if algorithm instead of a raw loop. [useStlAlgorithm] + for (char c : cronExpr) { if (c == ' ') fieldCount++; } + ^ +src/main.cpp:30:0: style: Consider using std::any_of algorithm instead of a raw loop. [useStlAlgorithm] + if (v == val) return std::string{}; +^ +src/cli/commands.cpp:226:24: style: Condition 'resolveUser(options.owner,uid)' is always false [knownConditionTrueFalse] + if (resolveUser(options.owner, uid)) { + ^ +src/cli/commands.cpp:226:24: note: Calling function 'resolveUser' returns 0 + if (resolveUser(options.owner, uid)) { + ^ +src/cli/commands.cpp:226:24: note: Condition 'resolveUser(options.owner,uid)' is always false + if (resolveUser(options.owner, uid)) { + ^ +src/cli/commands.cpp:108:57: style: Parameter 'uid' can be declared as reference to const [constParameterReference] +bool resolveUser(std::string const& userName, uint32_t& uid) { + ^ +src/cli/commands.cpp:728:34: warning: Either the condition 'args.size()<4' is redundant or size of 'args' can be 4. Expression 'args[4]' causes access out of bounds. [containerOutOfBounds] + job.destination = args[4]; + ^ +src/cli/commands.cpp:717:25: note: Assuming that condition 'args.size()<4' is not redundant + if (args.size() < 4) { + ^ +src/cli/commands.cpp:728:34: note: Access out of bounds + job.destination = args[4]; + ^ +src/cli/commands.cpp:770:29: style: Consider using std::replace_if algorithm instead of a raw loop. [useStlAlgorithm] + if (c == ' ') c = '_'; + ^ +src/cli/commands.cpp:776:13: style: Consider using std::any_of algorithm instead of a raw loop. [useStlAlgorithm] + for (auto const& j : jobs) if (j.id == id) return true; + ^ +src/cli/commands.cpp:838:34: style: Consider using std::find_if algorithm instead of a raw loop. [useStlAlgorithm] + if (j.id == args[1]) { + ^ +src/scheduler/backup_scheduler.cpp:118:0: style: The function 'addJob' is never used. [unusedFunction] +BackupScheduler::addJob(ScheduleJob const& job) { +^ +src/core/backup_engine.cpp:20:0: style: The function 'backup' is never used. [unusedFunction] +BackupResult BackupEngine::backup( +^ +src/fs/path_mapper.cpp:22:0: style: The function 'backupToRelative' is never used. [unusedFunction] +std::filesystem::path PathMapper::backupToRelative( +^ +src/compress/build_compressor.cpp:8:0: style: The function 'buildCompressor' is never used. [unusedFunction] +std::unique_ptr buildCompressor(std::string_view name, int level) { +^ +src/crypto/build_encryptor.cpp:6:0: style: The function 'buildEncryptor' is never used. [unusedFunction] +std::unique_ptr buildEncryptor(std::string_view name) { +^ +src/compress/lzma_compressor.cpp:13:0: style: The function 'compress' is never used. [unusedFunction] +Expected LzmaCompressor::compress( +^ +src/compress/lzma_compressor.cpp:56:0: style: The function 'decompress' is never used. [unusedFunction] +Expected LzmaCompressor::decompress( +^ +src/crypto/openssl_encryptor.cpp:217:0: style: The function 'decrypt' is never used. [unusedFunction] +Expected OpenSslEncryptor::decrypt( +^ +src/compress/lzma_compressor.cpp:19:0: style: The function 'defaultLevel' is never used. [unusedFunction] + +^ +src/fs/special_file.cpp:21:0: style: The function 'detectFileType' is never used. [unusedFunction] +Expected detectFileType(std::filesystem::path const& path) +^ +src/scheduler/backup_scheduler.cpp:163:0: style: The function 'enableJob' is never used. [unusedFunction] +BackupScheduler::enableJob(std::string_view jobId, bool enabled) { +^ +src/crypto/openssl_encryptor.cpp:109:0: style: The function 'encrypt' is never used. [unusedFunction] +Expected OpenSslEncryptor::encrypt( +^ +src/scheduler/schedule_store.cpp:32:0: style: The function 'filePath' is never used. [unusedFunction] + default: out += c; +^ +src/storage/local_storage.cpp:159:0: style: The function 'fileSize' is never used. [unusedFunction] +LocalStorage::fileSize(std::filesystem::path const& path) +^ +src/scheduler/backup_scheduler.cpp:190:0: style: The function 'findJob' is never used. [unusedFunction] +ScheduleJob const* BackupScheduler::findJob(std::string_view jobId) const { +^ +src/storage/local_storage.cpp:42:0: style: The function 'isDirectory' is never used. [unusedFunction] +Expected LocalStorage::isDirectory( +^ +src/main.cpp:104:0: style: The function 'isRunning' is never used. [unusedFunction] + ->check([&](std::string const& /*val*/) { backupHasSizeMin = true; return std::string{}; }); +^ +src/compress/lzma_compressor.cpp:9:0: style: The function 'isValidLevel' is never used. [unusedFunction] +bool LzmaCompressor::isValidLevel(int level) const { +^ +src/storage/local_storage.cpp:71:0: style: The function 'listDirectory' is never used. [unusedFunction] +LocalStorage::listDirectory(std::filesystem::path const& path) +^ +src/scheduler/backup_scheduler.cpp:200:0: style: The function 'listJobs' is never used. [unusedFunction] +std::vector BackupScheduler::listJobs() const { +^ +src/scheduler/backup_scheduler.cpp:86:0: style: The function 'makeSnapshotPath' is never used. [unusedFunction] +BackupScheduler::makeSnapshotPath(std::filesystem::path const& base) { +^ +src/fs/metadata.cpp:192:0: style: The function 'metadataFromJson' is never used. [unusedFunction] +std::optional metadataFromJson(std::string const& json) +^ +src/fs/metadata.cpp:176:0: style: The function 'metadataToJson' is never used. [unusedFunction] +std::string metadataToJson(Metadata const& meta) +^ +src/crypto/key_derivation.cpp:56:0: style: The function 'randomBytes' is never used. [unusedFunction] +Expected, ErrorCode> KeyDerivation::randomBytes(size_t length) { +^ +src/storage/local_storage.cpp:96:0: style: The function 'readFile' is never used. [unusedFunction] +LocalStorage::readFile(std::filesystem::path const& path) +^ +src/fs/special_file.cpp:61:0: style: The function 'readSymlink' is never used. [unusedFunction] +Expected readSymlink(std::filesystem::path const& path) +^ +src/scheduler/backup_scheduler.cpp:146:0: style: The function 'removeJob' is never used. [unusedFunction] +BackupScheduler::removeJob(std::string_view jobId) { +^ +src/core/restore_engine.cpp:19:0: style: The function 'restore' is never used. [unusedFunction] +BackupResult RestoreEngine::restore( +^ +src/scheduler/backup_scheduler.cpp:290:0: style: The function 'run' is never used. [unusedFunction] +void BackupScheduler::run() { +^ +src/scheduler/schedule_store.cpp:290:0: style: The function 'save' is never used. [unusedFunction] +ScheduleStore::save(std::vector const& jobs) { +^ +src/scheduler/retention_policy.cpp:61:0: style: The function 'scanSnapshots' is never used. [unusedFunction] +RetentionPolicy::scanSnapshots(std::filesystem::path const& directory) { +^ +src/scheduler/retention_policy.cpp:90:0: style: The function 'selectForRemoval' is never used. [unusedFunction] +RetentionPolicy::selectForRemoval( +^ +src/crypto/build_encryptor.cpp:34:0: style: The function 'suffix' is never used. [unusedFunction] + +^ +src/storage/local_storage.cpp:126:0: style: The function 'writeFile' is never used. [unusedFunction] +LocalStorage::writeFile( +^ +nofile:0:0: information: Active checkers: There was critical errors (use --checkers-report= to see details) [checkersReport] + diff --git a/cppcheck-suppressions.txt b/cppcheck-suppressions.txt new file mode 100644 index 0000000..09e7a98 --- /dev/null +++ b/cppcheck-suppressions.txt @@ -0,0 +1,41 @@ +# ========== Backer Project cppcheck Suppressions ========== +# 格式:[error-id]:[file-pattern]:[line] +# file-pattern 中 * 通配任意字符 + +# ========== 第三方依赖(FetchContent 拉取),__deps 目录全部跳过 ========== +*:build/_deps/* + +# ========== 第三方库已知风格问题 ========== +# ccronexpr — C 代码库,不动 +*:src/scheduler/ccronexpr.c +*:src/scheduler/ccronexpr.h + +# ========== GUI 相关 ========== +# Qt moc 生成的调用 cppcheck 看不见 +unusedFunction:src/gui/* +# Qt 信号/槽参数风格 +constParameter:src/gui/* +constVariable:src/gui/* +constParameterReference:src/gui/* +# Qt 元对象系统 +noOperatorEq:src/gui/* +noCopyConstructor:src/gui/* +noDestructor:src/gui/* +uninitMemberVar:src/gui/* + +# ========== 自研基础设施(设计意图明确) ========== +# Expected 的隐式构造函数是故意设计,用于便捷返回 T 或 E +noExplicitConstructor:src/core/expected.h +# span 的隐式构造遵循 std::span 惯例 +noExplicitConstructor:src/core/span.h + +# ========== 已知误报 ========== +# criteria_filter.cpp: queryDims() 在初始化赋值后通过 FilterQuery 填充这些变量 +# cppcheck 静态分析看不到过滤查询的运行时效果 +knownConditionTrueFalse:src/filters/criteria_filter.cpp + +# ========== informational(非告警,--enable=all 默认包含) ========== +normalCheckLevelMaxBranches:* + +# ========== 系统头 ========== +missingIncludeSystem