From 7ec8ecdf4f37f912aa9621cd431cb2260807ff4a Mon Sep 17 00:00:00 2001 From: zhaominyong Date: Wed, 1 Dec 2021 15:12:38 +0800 Subject: [PATCH] =?UTF-8?q?=E9=98=B6=E6=AE=B5=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 0 backup-daemon/myprocess/mksquashfsprocess.cpp | 0 backup-daemon/myprocess/mksquashfsprocess.h | 0 backup-daemon/mythread.cpp | 0 backup-daemon/mythread.h | 0 backup-daemon/udisksystembackupproxy.cpp | 16 ++ backup-daemon/udisksystembackupproxy.h | 0 kybackup/app.qrc | 2 + kybackup/backup_manager_interface.cpp | 0 kybackup/backup_manager_interface.h | 0 kybackup/backuppointlistdialog.cpp | 100 +++++++ kybackup/backuppointlistdialog.h | 33 +++ kybackup/backuppointlistdialog.ui | 19 ++ kybackup/component/circlelabel.cpp | 0 kybackup/component/circlelabel.h | 0 kybackup/component/clicklabel.cpp | 0 kybackup/component/clicklabel.h | 0 kybackup/component/hoverwidget.cpp | 0 kybackup/component/hoverwidget.h | 0 kybackup/component/imageutil.cpp | 0 kybackup/component/imageutil.h | 0 kybackup/component/linelabel.cpp | 0 kybackup/component/linelabel.h | 0 kybackup/component/mycheckbox.cpp | 18 ++ kybackup/component/mycheckbox.h | 16 ++ kybackup/component/myiconbutton.cpp | 0 kybackup/component/myiconbutton.h | 0 kybackup/component/myiconlabel.cpp | 0 kybackup/component/myiconlabel.h | 0 kybackup/component/mylabel.cpp | 6 +- kybackup/component/mylabel.h | 2 + kybackup/component/mylineedit.cpp | 0 kybackup/component/mylineedit.h | 0 kybackup/component/mypushbutton.cpp | 11 + kybackup/component/mypushbutton.h | 2 + kybackup/component/ringsprogressbar.cpp | 0 kybackup/component/ringsprogressbar.h | 0 kybackup/functypeconverter.cpp | 0 kybackup/functypeconverter.h | 0 kybackup/globalbackupinfo.h | 0 kybackup/globalsignals.h | 0 kybackup/gsettingswrapper.cpp | 0 kybackup/gsettingswrapper.h | 0 kybackup/kybackup.pro | 7 + kybackup/leftsiderbarwidget.cpp | 0 kybackup/leftsiderbarwidget.h | 0 kybackup/main.cpp | 0 kybackup/maindialog.cpp | 6 +- kybackup/maindialog.h | 0 kybackup/maindialog.ui | 0 kybackup/messageboxutils.cpp | 57 ++++ kybackup/messageboxutils.h | 16 ++ kybackup/module/systembackup.cpp | 245 ++++++++++++++---- kybackup/module/systembackup.h | 0 kybackup/module/systemrestore.cpp | 71 ++++- kybackup/module/systemrestore.h | 11 +- kybackup/module/udiskdetector.cpp | 0 kybackup/module/udiskdetector.h | 0 kybackup/qtsingleapplication/qtlocalpeer.cpp | 0 kybackup/qtsingleapplication/qtlocalpeer.h | 0 kybackup/qtsingleapplication/qtlockedfile.cpp | 0 kybackup/qtsingleapplication/qtlockedfile.h | 0 .../qtsingleapplication/qtlockedfile_unix.cpp | 0 .../qtsingleapplication.cpp | 0 .../qtsingleapplication/qtsingleapplication.h | 0 kybackup/resource/images/data_backup.svg | 0 kybackup/resource/images/data_backup_dark.svg | 0 kybackup/resource/images/data_restore.svg | 0 .../resource/images/data_restore_dark.svg | 0 kybackup/resource/images/empty.png | Bin 0 -> 6139 bytes kybackup/resource/images/empty_dark.png | Bin 0 -> 11344 bytes kybackup/resource/images/folder.png | Bin kybackup/resource/images/ghost_image.svg | 0 kybackup/resource/images/ghost_image_dark.svg | 0 kybackup/resource/images/loading.gif | Bin kybackup/resource/images/sysem_restore.svg | 0 .../resource/images/sysem_restore_dark.svg | 0 kybackup/resource/images/system_backup.svg | 0 .../resource/images/system_backup_dark.svg | 0 kybackup/resource/symbos/dialog-error.png | Bin .../symbos/document-properties-symbolic.png | Bin .../resource/symbos/list-add-symbolic.png | Bin .../symbos/object-rotate-left-symbolic.png | Bin .../symbos/ukui-bf-damage-symbolic.png | Bin .../symbos/ukui-bf-data-backup-symbolic.png | Bin .../symbos/ukui-bf-data-restore-symbolic.png | Bin .../symbos/ukui-bf-dataloss-symbolic.png | Bin .../resource/symbos/ukui-bf-fast-symbolic.png | Bin .../symbos/ukui-bf-ghost-mirror-symbolic.png | Bin .../symbos/ukui-bf-many-spot-symbolic.png | Bin .../symbos/ukui-bf-operation-log-symbolic.png | Bin .../symbos/ukui-bf-security-symbolic.png | Bin .../symbos/ukui-bf-simple-symbolic.png | Bin .../symbos/ukui-bf-system-backup-symbolic.png | Bin .../ukui-bf-system-restore-symbolic.png | Bin .../symbos/ukui-bf-volume-symbolic.png | Bin .../resource/symbos/ukui-dialog-success.png | Bin kybackup/xatom-helper.cpp | 0 kybackup/xatom-helper.h | 0 yhkylin-backup-tool.pro | 0 100 files changed, 571 insertions(+), 67 deletions(-) mode change 100644 => 100755 README.md mode change 100644 => 100755 backup-daemon/myprocess/mksquashfsprocess.cpp mode change 100644 => 100755 backup-daemon/myprocess/mksquashfsprocess.h mode change 100644 => 100755 backup-daemon/mythread.cpp mode change 100644 => 100755 backup-daemon/mythread.h mode change 100644 => 100755 backup-daemon/udisksystembackupproxy.cpp mode change 100644 => 100755 backup-daemon/udisksystembackupproxy.h mode change 100644 => 100755 kybackup/app.qrc mode change 100644 => 100755 kybackup/backup_manager_interface.cpp mode change 100644 => 100755 kybackup/backup_manager_interface.h create mode 100755 kybackup/backuppointlistdialog.cpp create mode 100755 kybackup/backuppointlistdialog.h create mode 100755 kybackup/backuppointlistdialog.ui mode change 100644 => 100755 kybackup/component/circlelabel.cpp mode change 100644 => 100755 kybackup/component/circlelabel.h mode change 100644 => 100755 kybackup/component/clicklabel.cpp mode change 100644 => 100755 kybackup/component/clicklabel.h mode change 100644 => 100755 kybackup/component/hoverwidget.cpp mode change 100644 => 100755 kybackup/component/hoverwidget.h mode change 100644 => 100755 kybackup/component/imageutil.cpp mode change 100644 => 100755 kybackup/component/imageutil.h mode change 100644 => 100755 kybackup/component/linelabel.cpp mode change 100644 => 100755 kybackup/component/linelabel.h create mode 100755 kybackup/component/mycheckbox.cpp create mode 100755 kybackup/component/mycheckbox.h mode change 100644 => 100755 kybackup/component/myiconbutton.cpp mode change 100644 => 100755 kybackup/component/myiconbutton.h mode change 100644 => 100755 kybackup/component/myiconlabel.cpp mode change 100644 => 100755 kybackup/component/myiconlabel.h mode change 100644 => 100755 kybackup/component/mylabel.cpp mode change 100644 => 100755 kybackup/component/mylabel.h mode change 100644 => 100755 kybackup/component/mylineedit.cpp mode change 100644 => 100755 kybackup/component/mylineedit.h mode change 100644 => 100755 kybackup/component/mypushbutton.cpp mode change 100644 => 100755 kybackup/component/mypushbutton.h mode change 100644 => 100755 kybackup/component/ringsprogressbar.cpp mode change 100644 => 100755 kybackup/component/ringsprogressbar.h mode change 100644 => 100755 kybackup/functypeconverter.cpp mode change 100644 => 100755 kybackup/functypeconverter.h mode change 100644 => 100755 kybackup/globalbackupinfo.h mode change 100644 => 100755 kybackup/globalsignals.h mode change 100644 => 100755 kybackup/gsettingswrapper.cpp mode change 100644 => 100755 kybackup/gsettingswrapper.h mode change 100644 => 100755 kybackup/kybackup.pro mode change 100644 => 100755 kybackup/leftsiderbarwidget.cpp mode change 100644 => 100755 kybackup/leftsiderbarwidget.h mode change 100644 => 100755 kybackup/main.cpp mode change 100644 => 100755 kybackup/maindialog.cpp mode change 100644 => 100755 kybackup/maindialog.h mode change 100644 => 100755 kybackup/maindialog.ui create mode 100755 kybackup/messageboxutils.cpp create mode 100755 kybackup/messageboxutils.h mode change 100644 => 100755 kybackup/module/systembackup.cpp mode change 100644 => 100755 kybackup/module/systembackup.h mode change 100644 => 100755 kybackup/module/systemrestore.cpp mode change 100644 => 100755 kybackup/module/systemrestore.h mode change 100644 => 100755 kybackup/module/udiskdetector.cpp mode change 100644 => 100755 kybackup/module/udiskdetector.h mode change 100644 => 100755 kybackup/qtsingleapplication/qtlocalpeer.cpp mode change 100644 => 100755 kybackup/qtsingleapplication/qtlocalpeer.h mode change 100644 => 100755 kybackup/qtsingleapplication/qtlockedfile.cpp mode change 100644 => 100755 kybackup/qtsingleapplication/qtlockedfile.h mode change 100644 => 100755 kybackup/qtsingleapplication/qtlockedfile_unix.cpp mode change 100644 => 100755 kybackup/qtsingleapplication/qtsingleapplication.cpp mode change 100644 => 100755 kybackup/qtsingleapplication/qtsingleapplication.h mode change 100644 => 100755 kybackup/resource/images/data_backup.svg mode change 100644 => 100755 kybackup/resource/images/data_backup_dark.svg mode change 100644 => 100755 kybackup/resource/images/data_restore.svg mode change 100644 => 100755 kybackup/resource/images/data_restore_dark.svg create mode 100755 kybackup/resource/images/empty.png create mode 100755 kybackup/resource/images/empty_dark.png mode change 100644 => 100755 kybackup/resource/images/folder.png mode change 100644 => 100755 kybackup/resource/images/ghost_image.svg mode change 100644 => 100755 kybackup/resource/images/ghost_image_dark.svg mode change 100644 => 100755 kybackup/resource/images/loading.gif mode change 100644 => 100755 kybackup/resource/images/sysem_restore.svg mode change 100644 => 100755 kybackup/resource/images/sysem_restore_dark.svg mode change 100644 => 100755 kybackup/resource/images/system_backup.svg mode change 100644 => 100755 kybackup/resource/images/system_backup_dark.svg mode change 100644 => 100755 kybackup/resource/symbos/dialog-error.png mode change 100644 => 100755 kybackup/resource/symbos/document-properties-symbolic.png mode change 100644 => 100755 kybackup/resource/symbos/list-add-symbolic.png mode change 100644 => 100755 kybackup/resource/symbos/object-rotate-left-symbolic.png mode change 100644 => 100755 kybackup/resource/symbos/ukui-bf-damage-symbolic.png mode change 100644 => 100755 kybackup/resource/symbos/ukui-bf-data-backup-symbolic.png mode change 100644 => 100755 kybackup/resource/symbos/ukui-bf-data-restore-symbolic.png mode change 100644 => 100755 kybackup/resource/symbos/ukui-bf-dataloss-symbolic.png mode change 100644 => 100755 kybackup/resource/symbos/ukui-bf-fast-symbolic.png mode change 100644 => 100755 kybackup/resource/symbos/ukui-bf-ghost-mirror-symbolic.png mode change 100644 => 100755 kybackup/resource/symbos/ukui-bf-many-spot-symbolic.png mode change 100644 => 100755 kybackup/resource/symbos/ukui-bf-operation-log-symbolic.png mode change 100644 => 100755 kybackup/resource/symbos/ukui-bf-security-symbolic.png mode change 100644 => 100755 kybackup/resource/symbos/ukui-bf-simple-symbolic.png mode change 100644 => 100755 kybackup/resource/symbos/ukui-bf-system-backup-symbolic.png mode change 100644 => 100755 kybackup/resource/symbos/ukui-bf-system-restore-symbolic.png mode change 100644 => 100755 kybackup/resource/symbos/ukui-bf-volume-symbolic.png mode change 100644 => 100755 kybackup/resource/symbos/ukui-dialog-success.png mode change 100644 => 100755 kybackup/xatom-helper.cpp mode change 100644 => 100755 kybackup/xatom-helper.h mode change 100644 => 100755 yhkylin-backup-tool.pro diff --git a/README.md b/README.md old mode 100644 new mode 100755 diff --git a/backup-daemon/myprocess/mksquashfsprocess.cpp b/backup-daemon/myprocess/mksquashfsprocess.cpp old mode 100644 new mode 100755 diff --git a/backup-daemon/myprocess/mksquashfsprocess.h b/backup-daemon/myprocess/mksquashfsprocess.h old mode 100644 new mode 100755 diff --git a/backup-daemon/mythread.cpp b/backup-daemon/mythread.cpp old mode 100644 new mode 100755 diff --git a/backup-daemon/mythread.h b/backup-daemon/mythread.h old mode 100644 new mode 100755 diff --git a/backup-daemon/udisksystembackupproxy.cpp b/backup-daemon/udisksystembackupproxy.cpp old mode 100644 new mode 100755 index 2092168..1d08e92 --- a/backup-daemon/udisksystembackupproxy.cpp +++ b/backup-daemon/udisksystembackupproxy.cpp @@ -53,6 +53,22 @@ bool UDiskSystemBackupProxy::checkEnvEx() return false; } + QString backupPath(m_backupWrapper.m_prefixDestPath); + backupPath.replace("//", "/"); + QStorageInfo udisk(backupPath); + QString udisk_type = udisk.fileSystemType(); + if (udisk_type == "vfat") { + qCritical() << m_backupWrapper.m_prefixDestPath + " udisk's filesystemtype is vfat"; + emit checkResult(int(BackupResult::UDISK_FILESYSTEM_TYPE_IS_VFAT)); + return false; + } + if (udisk.isReadOnly()) { + // 只读挂载的U盘 + qCritical() << QString("udisk(%s) is readonly filesystem").arg(m_backupWrapper.m_prefixDestPath); + emit checkResult(int(BackupResult::UDISK_FILESYSTEM_IS_READONLY)); + return false; + } + QTimer::singleShot(1*1000, this, &UDiskSystemBackupProxy::checkDestDirExists); // 2、计算备份大小 calcSizeForBackup(); diff --git a/backup-daemon/udisksystembackupproxy.h b/backup-daemon/udisksystembackupproxy.h old mode 100644 new mode 100755 diff --git a/kybackup/app.qrc b/kybackup/app.qrc old mode 100644 new mode 100755 index 5590f9a..08f0159 --- a/kybackup/app.qrc +++ b/kybackup/app.qrc @@ -30,5 +30,7 @@ resource/symbos/ukui-bf-system-restore-symbolic.png resource/symbos/ukui-bf-volume-symbolic.png resource/symbos/ukui-dialog-success.png + resource/images/empty.png + resource/images/empty_dark.png diff --git a/kybackup/backup_manager_interface.cpp b/kybackup/backup_manager_interface.cpp old mode 100644 new mode 100755 diff --git a/kybackup/backup_manager_interface.h b/kybackup/backup_manager_interface.h old mode 100644 new mode 100755 diff --git a/kybackup/backuppointlistdialog.cpp b/kybackup/backuppointlistdialog.cpp new file mode 100755 index 0000000..79ae573 --- /dev/null +++ b/kybackup/backuppointlistdialog.cpp @@ -0,0 +1,100 @@ +#include "backuppointlistdialog.h" +#include "ui_backuppointlistdialog.h" +#include +#include "component/mylabel.h" +#include "component/mypushbutton.h" + +BackupPointListDialog::BackupPointListDialog(QWidget *parent) : + QDialog(parent), + ui(new Ui::BackupPointListDialog) +{ + ui->setupUi(this); + // 到各个子类中去设置 + // this->setWindowTitle(tr("Backup Points")); + // 去掉最大化、最小化按钮,保留关闭按钮,但是设置后窗口不显示了,实验了几种方式均不可以 + // this->setWindowFlags(Qt::WindowCloseButtonHint); + // this->setWindowFlags(this->windowFlags() & ~Qt::WindowMinMaxButtonsHint); + + // 设置背景色 + this->setAutoFillBackground(true); + QPalette palette = this->palette(); + palette.setColor(QPalette::Background, palette.color(QPalette::Base)); + this->setPalette(palette); + + // 纵向布局 + QVBoxLayout *vlayout = new QVBoxLayout; + vlayout->setContentsMargins(20, 0, 20, 10); + + QStringList headerList; + headerList << tr("Backup Name") << tr("UUID") << tr("Backup Time") << tr("Backup Device") << QObject::tr("Backup State") << QObject::tr("PrefixPath"); + m_tableWidget = new QTableWidget; + m_tableWidget->setColumnCount(headerList.size()); + m_tableWidget->setHorizontalHeaderLabels(headerList); + m_tableWidget->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch); + m_tableWidget->setShowGrid(false); + m_tableWidget->setSelectionBehavior(QAbstractItemView::SelectRows); + // m_tableWidget->resizeColumnsToContents(); + m_tableWidget->hideColumn(5); + vlayout->addWidget(m_tableWidget); + + MyLabel *note = new MyLabel; + // 您可以删除不需要的备份,更多细节请参考“操作日志” + note->setDeplayText(tr("You can delete backup point")); + + MyPushButton * buttonDelete = new MyPushButton; + buttonDelete->setText(tr("Delete")); + + m_bottomLayout = new QHBoxLayout; + m_bottomLayout->addWidget(note); + m_bottomLayout->addStretch(); + m_bottomLayout->addWidget(buttonDelete); + + vlayout->addLayout(m_bottomLayout); + this->setLayout(vlayout); +} + +BackupPointListDialog::~BackupPointListDialog() +{ + delete ui; + delete m_tableWidget; +} + +/** + * @brief 获取本地和移动设备中的备份点 + * @return + */ +QList BackupPointListDialog::getBackupPointList(const QStringList& pathList) +{ + QList list; + for (QString backupPath : pathList) { + backupPath += BACKUP_XML_PATH; + + QFile xmlFile(backupPath); + if (!xmlFile.exists() || 0 == xmlFile.size()) { + continue; + } + + parseBackupList parse(backupPath); + list.append(parse.getBackupPointList()); + } + + return list; +} + +void BackupPointListDialog::updateTargetList() +{ + m_hasUsefulBackup = false; //是否存在有效备份 + m_hasOneBackup = false; //是否存在一个备份(包括有效和失败的备份) + m_tableWidget->clear(); + + QStringList allPaths; + allPaths << ""; //"" is / +// if (!m_onlyshowlocal) { +// QStringList udiskPaths = m_proxy->getAllUdiskPaths(); +// for (auto& path : udiskPaths) { +// allPaths << path; +// } +// } +// // readEveryPathBackupStorage(allPaths); +// insertLines(getBackupPointList(allPaths)); +} diff --git a/kybackup/backuppointlistdialog.h b/kybackup/backuppointlistdialog.h new file mode 100755 index 0000000..6ba34eb --- /dev/null +++ b/kybackup/backuppointlistdialog.h @@ -0,0 +1,33 @@ +#ifndef BackupPointListDialog_H +#define BackupPointListDialog_H + +#include +#include +#include +#include + +namespace Ui { +class BackupPointListDialog; +} + +class BackupPointListDialog : public QDialog +{ + Q_OBJECT + +public: + explicit BackupPointListDialog(QWidget *parent = nullptr); + ~BackupPointListDialog(); + + void updateTargetList(); + +protected: + QHBoxLayout *m_bottomLayout = nullptr; +private: + Ui::BackupPointListDialog *ui; + + QTableWidget * m_tableWidget; + bool m_hasUsefulBackup = false; //是否存在有效备份 + bool m_hasOneBackup = false; //是否存在一个备份(包括有效和失败的备份) +}; + +#endif // BackupPointListDialog_H diff --git a/kybackup/backuppointlistdialog.ui b/kybackup/backuppointlistdialog.ui new file mode 100755 index 0000000..eab8da4 --- /dev/null +++ b/kybackup/backuppointlistdialog.ui @@ -0,0 +1,19 @@ + + + BackupPointListDialog + + + + 0 + 0 + 686 + 371 + + + + Dialog + + + + + diff --git a/kybackup/component/circlelabel.cpp b/kybackup/component/circlelabel.cpp old mode 100644 new mode 100755 diff --git a/kybackup/component/circlelabel.h b/kybackup/component/circlelabel.h old mode 100644 new mode 100755 diff --git a/kybackup/component/clicklabel.cpp b/kybackup/component/clicklabel.cpp old mode 100644 new mode 100755 diff --git a/kybackup/component/clicklabel.h b/kybackup/component/clicklabel.h old mode 100644 new mode 100755 diff --git a/kybackup/component/hoverwidget.cpp b/kybackup/component/hoverwidget.cpp old mode 100644 new mode 100755 diff --git a/kybackup/component/hoverwidget.h b/kybackup/component/hoverwidget.h old mode 100644 new mode 100755 diff --git a/kybackup/component/imageutil.cpp b/kybackup/component/imageutil.cpp old mode 100644 new mode 100755 diff --git a/kybackup/component/imageutil.h b/kybackup/component/imageutil.h old mode 100644 new mode 100755 diff --git a/kybackup/component/linelabel.cpp b/kybackup/component/linelabel.cpp old mode 100644 new mode 100755 diff --git a/kybackup/component/linelabel.h b/kybackup/component/linelabel.h old mode 100644 new mode 100755 diff --git a/kybackup/component/mycheckbox.cpp b/kybackup/component/mycheckbox.cpp new file mode 100755 index 0000000..306b19c --- /dev/null +++ b/kybackup/component/mycheckbox.cpp @@ -0,0 +1,18 @@ +#include "mycheckbox.h" + +MyCheckBox::MyCheckBox(const QString &text, QWidget *parent) : + QCheckBox(text, parent) +{} + +MyCheckBox::~MyCheckBox() +{} + +void MyCheckBox::setFontSize(int size) +{ + QFont font = this->font(); + font.setPixelSize(size); + // 默认为大字体粗体显示 + if (size > 20) + font.setBold(true); + this->setFont(font); +} diff --git a/kybackup/component/mycheckbox.h b/kybackup/component/mycheckbox.h new file mode 100755 index 0000000..209a42b --- /dev/null +++ b/kybackup/component/mycheckbox.h @@ -0,0 +1,16 @@ +#ifndef MYCHECKBOX_H +#define MYCHECKBOX_H + +#include + +class MyCheckBox : public QCheckBox +{ + Q_OBJECT +public: + explicit MyCheckBox(const QString &text, QWidget *parent = nullptr); + virtual ~MyCheckBox(); + + void setFontSize(int size); +}; + +#endif // MYCHECKBOX_H diff --git a/kybackup/component/myiconbutton.cpp b/kybackup/component/myiconbutton.cpp old mode 100644 new mode 100755 diff --git a/kybackup/component/myiconbutton.h b/kybackup/component/myiconbutton.h old mode 100644 new mode 100755 diff --git a/kybackup/component/myiconlabel.cpp b/kybackup/component/myiconlabel.cpp old mode 100644 new mode 100755 diff --git a/kybackup/component/myiconlabel.h b/kybackup/component/myiconlabel.h old mode 100644 new mode 100755 diff --git a/kybackup/component/mylabel.cpp b/kybackup/component/mylabel.cpp old mode 100644 new mode 100755 index 35b1eba..0e0fb4b --- a/kybackup/component/mylabel.cpp +++ b/kybackup/component/mylabel.cpp @@ -21,7 +21,6 @@ MyLabel::MyLabel(QWidget* parent) : { } - MyLabel::~MyLabel() {} @@ -55,6 +54,11 @@ void MyLabel::setFontWordWrap(bool on) void MyLabel::paintEvent(QPaintEvent *event) { + if (m_isOriginal) { + QLabel::paintEvent(event); + return ; + } + QFontMetrics fontMetrics(this->font()); int fontSize = fontMetrics.width(m_text); if (m_bWordWrap && m_width > 0) { diff --git a/kybackup/component/mylabel.h b/kybackup/component/mylabel.h old mode 100644 new mode 100755 index 55f7371..df8486f --- a/kybackup/component/mylabel.h +++ b/kybackup/component/mylabel.h @@ -16,6 +16,7 @@ public: void setFontColor(QColor color); void setFontSize(int size); void setFontWordWrap(bool on); + void setIsOriginal(bool isOriginal) { m_isOriginal = isOriginal; } protected: void paintEvent(QPaintEvent *event); @@ -25,6 +26,7 @@ private: bool m_bWordWrap = false; int m_width = 0; int m_height = 0; + bool m_isOriginal = false; QRect m_rect; }; diff --git a/kybackup/component/mylineedit.cpp b/kybackup/component/mylineedit.cpp old mode 100644 new mode 100755 diff --git a/kybackup/component/mylineedit.h b/kybackup/component/mylineedit.h old mode 100644 new mode 100755 diff --git a/kybackup/component/mypushbutton.cpp b/kybackup/component/mypushbutton.cpp old mode 100644 new mode 100755 index 2b89aec..5f24787 --- a/kybackup/component/mypushbutton.cpp +++ b/kybackup/component/mypushbutton.cpp @@ -6,3 +6,14 @@ MyPushButton::MyPushButton(QWidget *parent) : MyPushButton::~MyPushButton() {} + +void MyPushButton::setFontSize(int size) +{ + QFont font = this->font(); + font.setPixelSize(size); + // 默认为大字体粗体显示 + if (size > 20) + font.setBold(true); + this->setFont(font); +} + diff --git a/kybackup/component/mypushbutton.h b/kybackup/component/mypushbutton.h old mode 100644 new mode 100755 index d4432dc..2bee445 --- a/kybackup/component/mypushbutton.h +++ b/kybackup/component/mypushbutton.h @@ -9,6 +9,8 @@ class MyPushButton : public QPushButton public: MyPushButton(QWidget* parent = nullptr); virtual ~MyPushButton(); + + void setFontSize(int size); }; #endif // MYPUSHBUTTON_H diff --git a/kybackup/component/ringsprogressbar.cpp b/kybackup/component/ringsprogressbar.cpp old mode 100644 new mode 100755 diff --git a/kybackup/component/ringsprogressbar.h b/kybackup/component/ringsprogressbar.h old mode 100644 new mode 100755 diff --git a/kybackup/functypeconverter.cpp b/kybackup/functypeconverter.cpp old mode 100644 new mode 100755 diff --git a/kybackup/functypeconverter.h b/kybackup/functypeconverter.h old mode 100644 new mode 100755 diff --git a/kybackup/globalbackupinfo.h b/kybackup/globalbackupinfo.h old mode 100644 new mode 100755 diff --git a/kybackup/globalsignals.h b/kybackup/globalsignals.h old mode 100644 new mode 100755 diff --git a/kybackup/gsettingswrapper.cpp b/kybackup/gsettingswrapper.cpp old mode 100644 new mode 100755 diff --git a/kybackup/gsettingswrapper.h b/kybackup/gsettingswrapper.h old mode 100644 new mode 100755 diff --git a/kybackup/kybackup.pro b/kybackup/kybackup.pro old mode 100644 new mode 100755 index 83c19d5..1aed805 --- a/kybackup/kybackup.pro +++ b/kybackup/kybackup.pro @@ -36,11 +36,13 @@ HEADERS += \ ../common/spinlock_mutex.h \ ../common/utils.h \ backup_manager_interface.h \ + backuppointlistdialog.h \ component/circlelabel.h \ component/clicklabel.h \ component/hoverwidget.h \ component/imageutil.h \ component/linelabel.h \ + component/mycheckbox.h \ component/myiconbutton.h \ component/myiconlabel.h \ component/mylabel.h \ @@ -53,6 +55,7 @@ HEADERS += \ gsettingswrapper.h \ leftsiderbarwidget.h \ maindialog.h \ + messageboxutils.h \ module/systembackup.h \ module/systemrestore.h \ module/udiskdetector.h \ @@ -67,11 +70,13 @@ SOURCES += \ ../common/mylittleparse.cpp \ ../common/utils.cpp \ backup_manager_interface.cpp \ + backuppointlistdialog.cpp \ component/circlelabel.cpp \ component/clicklabel.cpp \ component/hoverwidget.cpp \ component/imageutil.cpp \ component/linelabel.cpp \ + component/mycheckbox.cpp \ component/myiconbutton.cpp \ component/myiconlabel.cpp \ component/mylabel.cpp \ @@ -83,6 +88,7 @@ SOURCES += \ leftsiderbarwidget.cpp \ main.cpp \ maindialog.cpp \ + messageboxutils.cpp \ module/systembackup.cpp \ module/systemrestore.cpp \ module/udiskdetector.cpp \ @@ -93,6 +99,7 @@ SOURCES += \ xatom-helper.cpp FORMS += \ + backuppointlistdialog.ui \ maindialog.ui TRANSLATIONS += qt_zh_CN.ts diff --git a/kybackup/leftsiderbarwidget.cpp b/kybackup/leftsiderbarwidget.cpp old mode 100644 new mode 100755 diff --git a/kybackup/leftsiderbarwidget.h b/kybackup/leftsiderbarwidget.h old mode 100644 new mode 100755 diff --git a/kybackup/main.cpp b/kybackup/main.cpp old mode 100644 new mode 100755 diff --git a/kybackup/maindialog.cpp b/kybackup/maindialog.cpp old mode 100644 new mode 100755 index f115cf2..fef6c97 --- a/kybackup/maindialog.cpp +++ b/kybackup/maindialog.cpp @@ -91,11 +91,11 @@ void MainDialog::initTileBar() QMenu* selectTheme = new QMenu(this); selectTheme->setObjectName("selectTheme"); backupTheme->setMenu(selectTheme); - QAction* defaultTheme = new QAction(tr("DefaultTheme"),this); + QAction* defaultTheme = new QAction(tr("Auto"),this); selectTheme->addAction(defaultTheme); - QAction* darkTheme = new QAction(tr("DarkTheme"),this); + QAction* darkTheme = new QAction(tr("Dark"),this); selectTheme->addAction(darkTheme); - QAction* lightTheme = new QAction(tr("LightTheme"),this); + QAction* lightTheme = new QAction(tr("Light"),this); selectTheme->addAction(lightTheme); m_backupHelp = new QAction(tr("Help"),this); diff --git a/kybackup/maindialog.h b/kybackup/maindialog.h old mode 100644 new mode 100755 diff --git a/kybackup/maindialog.ui b/kybackup/maindialog.ui old mode 100644 new mode 100755 diff --git a/kybackup/messageboxutils.cpp b/kybackup/messageboxutils.cpp new file mode 100755 index 0000000..92f7f6f --- /dev/null +++ b/kybackup/messageboxutils.cpp @@ -0,0 +1,57 @@ +#include "messageboxutils.h" +#include "gsettingswrapper.h" +#include +#include + +void MessageBoxUtils::QMESSAGE_BOX_WARNING(QWidget* q_parent, const QString& typelabel, const QString& message, const QString& label) +{ + QMessageBox box(q_parent); + + box.setIcon(QMessageBox::Warning); + box.setWindowTitle(typelabel); + box.setText(message); + + box.setStandardButtons(QMessageBox::Ok); + box.setButtonText(QMessageBox::Ok, label); + //add title icon + QIcon titleIcon = QIcon::fromTheme("yhkylin-backup-tools"); + box.setWindowIcon(titleIcon); + GSettingsWrapper::connectUkuiStyleSchema(&box); + box.exec(); +} + +bool MessageBoxUtils::QMESSAGE_BOX_WARNING_CANCEL(QWidget *q_parent, const QString &typelabel, const QString &message, const QString &label_yes, const QString &label_no) +{ + QMessageBox box(q_parent); + + box.setIcon(QMessageBox::Warning); + box.setWindowTitle(typelabel); + box.setText(message); + + box.setStandardButtons(QMessageBox::Ok | QMessageBox::Cancel); + box.setButtonText(QMessageBox::Ok, label_yes); + box.setButtonText(QMessageBox::Cancel, label_no); + //add title icon + QIcon titleIcon = QIcon::fromTheme("yhkylin-backup-tools"); + box.setWindowIcon(titleIcon); + GSettingsWrapper::connectUkuiStyleSchema(&box); + if (box.exec() != QMessageBox::Ok) + return false; + return true; +} + +void MessageBoxUtils::QMESSAGE_BOX_CRITICAL(QWidget* q_parent, const QString& typelabel, const QString& message, const QString& label) +{ + QMessageBox box(q_parent); + box.setIcon(QMessageBox::Critical); + box.setWindowTitle(typelabel); + box.setText(message); + + box.setStandardButtons(QMessageBox::Ok); + box.setButtonText(QMessageBox::Ok, label); + //add title icon + QIcon titleIcon = QIcon::fromTheme("yhkylin-backup-tools"); + box.setWindowIcon(titleIcon); + GSettingsWrapper::connectUkuiStyleSchema(&box); + box.exec(); +} diff --git a/kybackup/messageboxutils.h b/kybackup/messageboxutils.h new file mode 100755 index 0000000..50f197a --- /dev/null +++ b/kybackup/messageboxutils.h @@ -0,0 +1,16 @@ +#ifndef MESSAGEBOXUTILS_H +#define MESSAGEBOXUTILS_H + +#include +#include + +class MessageBoxUtils +{ +public: + static void QMESSAGE_BOX_WARNING(QWidget* q_parent, const QString& typelabel, const QString& message, const QString& label); + static void QMESSAGE_BOX_CRITICAL(QWidget* q_parent, const QString& typelabel, const QString& message, const QString& label); + static bool QMESSAGE_BOX_WARNING_CANCEL(QWidget* q_parent, const QString& typelabel, const QString& message, + const QString& label_yes, const QString& label_no); +}; + +#endif // MESSAGEBOXUTILS_H diff --git a/kybackup/module/systembackup.cpp b/kybackup/module/systembackup.cpp old mode 100644 new mode 100755 index b54af4d..a308238 --- a/kybackup/module/systembackup.cpp +++ b/kybackup/module/systembackup.cpp @@ -3,6 +3,8 @@ #include #include #include +#include +#include #include #include "../component/clicklabel.h" @@ -20,7 +22,8 @@ SystemBackup::SystemBackup(QWidget *parent /*= nullptr*/) : QStackedWidget(parent), m_udector(new UdiskDetector()), m_isLocal(true), - m_systemBackupState(SystemBackupState::IDEL) + m_systemBackupState(SystemBackupState::IDEL), + m_pInterface(nullptr) { // 界面手写代码创建,作为练手 initFirstWidget(); @@ -34,6 +37,10 @@ SystemBackup::SystemBackup(QWidget *parent /*= nullptr*/) : SystemBackup::~SystemBackup() { delete m_udector; + m_udector = nullptr; + + delete m_pInterface; + m_pInterface = nullptr; } /** @@ -117,13 +124,23 @@ void SystemBackup::initFirstWidget() beginBackup->setFont(font); connect(beginBackup, &MyPushButton::clicked, this, &SystemBackup::on_next_clicked); + // 底部控件布局 + QVBoxLayout *bottomVBoxLayout = new QVBoxLayout(first); + bottomVBoxLayout->addStretch(); + QHBoxLayout *bottomHBoxLayout = new QHBoxLayout(first); + bottomVBoxLayout->addLayout(bottomHBoxLayout); + bottomVBoxLayout->addSpacing(20); + bottomHBoxLayout->addStretch(); // 备份管理 ClickLabel * backupPointManage = new ClickLabel(tr("Backup Management >>"), first); - backupPointManage->setGeometry(551, 551, 200, 30); QPalette pal(backupPointManage->palette()); pal.setColor(QPalette::WindowText, QColor(Qt::blue)); backupPointManage->setPalette(pal); backupPointManage->setToolTip(tr("Backup Management >>")); + + bottomHBoxLayout->addWidget(backupPointManage); + bottomHBoxLayout->addSpacing(20); + connect(backupPointManage, &ClickLabel::clicked, this, &SystemBackup::on_systemBackupManage_clicked); addWidget(first); @@ -267,54 +284,98 @@ void SystemBackup::initThirdWidget() MyLabel *label4 = new MyLabel(tr("finished"), third); label4->setGeometry(551, 72, 164, 30); + //------------ 中部布局begin------------- + QVBoxLayout *vlayout = new QVBoxLayout(third); + vlayout->addSpacing(180); + QHBoxLayout *hlayout = new QHBoxLayout; + hlayout->addStretch(); + + QWidget *centerFont = new QWidget(third); + QVBoxLayout *vlayoutCenterFont = new QVBoxLayout; + + // 第一行 + QHBoxLayout *hlayoutCenterFont1 = new QHBoxLayout; // 检测等待图标 - QLabel *loadingGif = new QLabel(third); + QLabel *loadingGif = new QLabel(centerFont); + loadingGif->setFixedSize(20,20); // 环境检测等待动画 - QMovie *movie = new QMovie(":/images/loading.gif", QByteArray(), third); + QMovie *movie = new QMovie(":/images/loading.gif", QByteArray(), centerFont); loadingGif->setMovie(movie); - loadingGif->setGeometry(180, 180, 20, 20); - + hlayoutCenterFont1->addWidget(loadingGif); // 检测结果对错图标 - QLabel *resultLogo = new QLabel(third); - resultLogo->setGeometry(180, 180, 20, 20); - + QLabel *resultLogo = new QLabel(centerFont); + resultLogo->setFixedSize(20,20); + hlayoutCenterFont1->addWidget(resultLogo); // 检测中大标题 - MyLabel *bigTitle = new MyLabel(third); + MyLabel *bigTitle = new MyLabel(centerFont); bigTitle->setFontSize(24); - bigTitle->setGeometry(210, 170, 500, 36); + bigTitle->setMaximumWidth(700); + hlayoutCenterFont1->addWidget(bigTitle); + hlayoutCenterFont1->addStretch(); + vlayoutCenterFont->addLayout(hlayoutCenterFont1); - // 检测中的记录:黑点和文字 - CircleLable *dot1 = new CircleLable(QString(""), third, 6, Qt::black); - dot1->setGeometry(190, 235, 6, 6); - MyLabel *labelCheck1 = new MyLabel(third); - labelCheck1->setGeometry(210, 220, 500, 30); + // 第二行 + QHBoxLayout *hlayoutCenterFont2 = new QHBoxLayout; + hlayoutCenterFont2->addSpacing(10); + // 检测中的记录:黑点1和文字1 + CircleLable *dot1 = new CircleLable(QString(""), centerFont, 6, Qt::black); + hlayoutCenterFont2->addWidget(dot1); + hlayoutCenterFont2->addSpacing(5); + MyLabel *labelCheck1 = new MyLabel(centerFont); + labelCheck1->setMinimumWidth(400); + labelCheck1->setMaximumWidth(600); + labelCheck1->setIsOriginal(true); + labelCheck1->setWordWrap(true); + labelCheck1->adjustSize(); + hlayoutCenterFont2->addWidget(labelCheck1); + hlayoutCenterFont2->addStretch(); + vlayoutCenterFont->addLayout(hlayoutCenterFont2); - CircleLable *dot2 = new CircleLable(QString(""), third, 6, Qt::black); - dot2->setGeometry(190, 265, 6, 6); - MyLabel *labelCheck2 = new MyLabel(third); - labelCheck2->setGeometry(210, 250, 450, 30); + // 第三行 + QHBoxLayout *hlayoutCenterFont3 = new QHBoxLayout; + hlayoutCenterFont3->addSpacing(10); + // 检测中的记录:黑点2和文字2 + CircleLable *dot2 = new CircleLable(QString(""), centerFont, 6, Qt::black); + hlayoutCenterFont3->addWidget(dot2); + hlayoutCenterFont3->addSpacing(5); + MyLabel *labelCheck2 = new MyLabel(centerFont); + labelCheck2->setMinimumWidth(400); + labelCheck2->setMaximumWidth(600); + labelCheck2->setIsOriginal(true); + labelCheck2->setWordWrap(true); + labelCheck2->adjustSize(); + hlayoutCenterFont3->addWidget(labelCheck2); + hlayoutCenterFont3->addStretch(); + vlayoutCenterFont->addLayout(hlayoutCenterFont3); + // 第四行 + vlayoutCenterFont->addSpacing(30); + + // 第五行 + QHBoxLayout *hlayoutCenterFont5 = new QHBoxLayout; + hlayoutCenterFont5->addStretch(); // 上一步按钮 - MyPushButton *preStep = new MyPushButton(third); - preStep->setGeometry(221, 330, 97, 36); + MyPushButton *preStep = new MyPushButton(centerFont); + preStep->setFixedSize(97, 36); preStep->setText(tr("back")); preStep->setEnabled(true); preStep->setAutoRepeat(true); connect(preStep, &MyPushButton::clicked, this, &SystemBackup::on_pre_clicked); - + hlayoutCenterFont5->addWidget(preStep); + hlayoutCenterFont5->addSpacing(20); // 下一步按钮 - MyPushButton *nextStep = new MyPushButton(third); - nextStep->setGeometry(339, 330, 97, 36); + MyPushButton *nextStep = new MyPushButton(centerFont); + nextStep->setFixedSize(97, 36); nextStep->setText(tr("next")); nextStep->setEnabled(true); nextStep->setAutoRepeat(true); connect(nextStep, &MyPushButton::clicked, this, [=](bool checked) { this->on_next_clicked(checked); }); - + hlayoutCenterFont5->addWidget(nextStep); // 重新检测按钮 - MyPushButton *recheck = new MyPushButton(third); - recheck->setGeometry(339, 330, 97, 36); + MyPushButton *recheck = new MyPushButton(centerFont); + recheck->setFixedSize(97, 36); recheck->setText(tr("recheck")); recheck->setEnabled(true); recheck->setAutoRepeat(true); @@ -322,6 +383,18 @@ void SystemBackup::initThirdWidget() Q_UNUSED(checked) emit this->startCheckEnv(); }); + hlayoutCenterFont5->addWidget(recheck); + hlayoutCenterFont5->addStretch(); + vlayoutCenterFont->addLayout(hlayoutCenterFont5); + + + centerFont->setLayout(vlayoutCenterFont); + hlayout->addWidget(centerFont); + hlayout->addStretch(); + vlayout->addLayout(hlayout); + vlayout->addStretch(); + third->setLayout(vlayout); + //------------ 中部布局end------------- // 开始检测 connect(this, &SystemBackup::startCheckEnv, this, [=]() { @@ -333,9 +406,8 @@ void SystemBackup::initThirdWidget() bigTitle->setDeplayText(tr("Being checked, wait a moment ...")); dot1->setBackgroundColor(Qt::black); dot2->setBackgroundColor(Qt::black); - // 环境检测中 - labelCheck1->setDeplayText(tr("The environment is being checked ...")); - labelCheck2->setFontWordWrap(true); + // 备份过程中不要做其它操作,以防数据丢失 + labelCheck1->setDeplayText(tr("Do not perform other operations during backup to avoid data loss")); if (this->m_isLocal) { // 检测备份分区空间是否充足··· labelCheck2->setDeplayText(tr("Check whether the remaining capacity of the backup partition is sufficient")); @@ -466,9 +538,21 @@ void SystemBackup::on_checkEnv_end(int result) // 检查是否有备份分区 errTip = tr("Check whether there is a backup partition"); break; + case int(BackupResult::UDISK_FILESYSTEM_TYPE_IS_VFAT): + // 移动设备的文件系统是vfat格式 + errMsg = tr("The filesystem of device is vfat format"); + // 请换成ext4、ntfs等格式 + errTip = tr("Please change filesystem format to ext3、ext4 or ntfs"); + break; + case int(BackupResult::UDISK_FILESYSTEM_IS_READONLY): + // 移动设备是只读的 + errMsg = tr("The device is read only"); + // 请修改为可读写权限的 + errTip = tr("Please chmod to rw"); + break; case int(BackupResult::BACKUP_CAPACITY_IS_NOT_ENOUGH): // 备份空间不足 - errMsg = tr("The storage for backup is not enough."); + errMsg = tr("The storage for backup is not enough"); // 建议释放空间后重试 errTip = tr("Retry after release space"); break; @@ -686,6 +770,7 @@ void SystemBackup::initFifthWidget() MyLabel *labelTip = new MyLabel(fifth); labelTip->setGeometry(101, 261, 520, 30); labelTip->setAlignment(Qt::AlignCenter); + labelTip->setFontWordWrap(true); labelTip->setDeplayText(tr("Do not use computers in case of data loss")); connect(this, &SystemBackup::backupWarnning, labelTip, [=](const QString& msg) { labelTip->setDeplayText(msg); @@ -806,7 +891,7 @@ void SystemBackup::on_checkBackup_end(int result) break; case int(BackupResult::MKSQUASHFS_START_SUCCESS): // 正压缩系统到本地磁盘,请耐心等待。。。 - errTip = tr("The system is being compressed to the local disk, Please wait patiently..."); + errTip = tr("The system is being compressed to the local disk, please wait patiently..."); emit this->backupWarnning(errTip); return; case int(BackupResult::BACKUP_START_SUCCESS): @@ -894,41 +979,95 @@ void SystemBackup::initLastWidget() label4->setFontColor(QColor(COLOR_BLUE)); label4->setGeometry(551, 72, 164, 30); - // --------------失败界面-------------- + //------------ 中部布局begin------------- + QVBoxLayout *vlayout = new QVBoxLayout(last); + vlayout->addSpacing(180); + QHBoxLayout *hlayout = new QHBoxLayout; + hlayout->addStretch(); + + QWidget *centerFont = new QWidget(last); + QVBoxLayout *vlayoutCenterFont = new QVBoxLayout; + + // 第一行 + QHBoxLayout *hlayoutCenterFont1 = new QHBoxLayout; // 备份结果对错图标 - QLabel *resultLogo = new QLabel(last); - resultLogo->setGeometry(220, 180, 20, 20); - - // 备份结果大标题 - MyLabel *bigTitle = new MyLabel(last); + QLabel *resultLogo = new QLabel(centerFont); + resultLogo->setFixedSize(20,20); + hlayoutCenterFont1->addWidget(resultLogo); + // 检测中大标题 + MyLabel *bigTitle = new MyLabel(centerFont); bigTitle->setFontSize(24); - bigTitle->setGeometry(251, 170, 500, 36); + bigTitle->setMaximumWidth(700); + hlayoutCenterFont1->addWidget(bigTitle); + hlayoutCenterFont1->addStretch(); + vlayoutCenterFont->addLayout(hlayoutCenterFont1); + // 第二行 + QHBoxLayout *hlayoutCenterFont2 = new QHBoxLayout; + hlayoutCenterFont2->addSpacing(10); // 备份结果错误提示:黑点和文字 - CircleLable *dot1 = new CircleLable(QString(""), last, 6, Qt::black); - dot1->setGeometry(231, 235, 6, 6); - MyLabel *labelError1 = new MyLabel(last); - labelError1->setGeometry(251, 220, 300, 30); + CircleLable *dot1 = new CircleLable(QString(""), centerFont, 6, Qt::black); + hlayoutCenterFont2->addWidget(dot1); + hlayoutCenterFont2->addSpacing(5); + MyLabel *labelError1 = new MyLabel(centerFont); + labelError1->setMinimumWidth(400); + labelError1->setMaximumWidth(600); + labelError1->setIsOriginal(true); + labelError1->setWordWrap(true); + labelError1->adjustSize(); + hlayoutCenterFont2->addWidget(labelError1); + hlayoutCenterFont2->addStretch(); + vlayoutCenterFont->addLayout(hlayoutCenterFont2); - CircleLable *dot2 = new CircleLable(QString(""), last, 6, Qt::black); - dot2->setGeometry(231, 265, 6, 6); - MyLabel *labelError2 = new MyLabel(last); - labelError2->setGeometry(251, 250, 300, 30); + // 第三行 + QHBoxLayout *hlayoutCenterFont3 = new QHBoxLayout; + hlayoutCenterFont3->addSpacing(10); + // 检测中的记录:黑点2和文字2 + CircleLable *dot2 = new CircleLable(QString(""), centerFont, 6, Qt::black); + hlayoutCenterFont3->addWidget(dot2); + hlayoutCenterFont3->addSpacing(5); + MyLabel *labelError2 = new MyLabel(centerFont); + labelError2->setMinimumWidth(400); + labelError2->setMaximumWidth(600); + labelError2->setIsOriginal(true); + labelError2->setWordWrap(true); + labelError2->adjustSize(); + hlayoutCenterFont3->addWidget(labelError2); + hlayoutCenterFont3->addStretch(); + vlayoutCenterFont->addLayout(hlayoutCenterFont3); + // 第四行 + vlayoutCenterFont->addSpacing(30); + + // 第五行 + QHBoxLayout *hlayoutCenterFont5 = new QHBoxLayout; + hlayoutCenterFont5->addStretch(); // 再试一次 - MyPushButton *retry = new MyPushButton(last); - retry->setGeometry(310, 330, 97, 36); + MyPushButton *retry = new MyPushButton(centerFont); + retry->setFixedSize(97, 36); retry->setText(tr("retry")); retry->setEnabled(true); retry->setAutoRepeat(true); - - // --------------成功界面-------------- + hlayoutCenterFont5->addWidget(retry); + hlayoutCenterFont5->addSpacing(20); // 返回首页 MyPushButton *homePage = new MyPushButton(last); - homePage->setGeometry(310, 240, 97, 36); + homePage->setFixedSize(97, 36); homePage->setText(tr("home page")); homePage->setEnabled(true); homePage->setAutoRepeat(true); + hlayoutCenterFont5->addWidget(homePage); + hlayoutCenterFont5->addStretch(); + vlayoutCenterFont->addLayout(hlayoutCenterFont5); + + + centerFont->setLayout(vlayoutCenterFont); + hlayout->addWidget(centerFont); + hlayout->addStretch(); + vlayout->addLayout(hlayout); + vlayout->addStretch(); + last->setLayout(vlayout); + //------------ 中部布局end------------- // 备份检测结果 connect(this, &SystemBackup::checkBackupResult, this, [=](bool result, const QString &errMsg, const QString &errTip) { diff --git a/kybackup/module/systembackup.h b/kybackup/module/systembackup.h old mode 100644 new mode 100755 diff --git a/kybackup/module/systemrestore.cpp b/kybackup/module/systemrestore.cpp old mode 100644 new mode 100755 index bfa909c..668841f --- a/kybackup/module/systemrestore.cpp +++ b/kybackup/module/systemrestore.cpp @@ -4,10 +4,13 @@ #include #include #include +#include +#include #include #include "../component/clicklabel.h" #include "../component/circlelabel.h" +#include "../component/mycheckbox.h" #include "../component/myiconlabel.h" #include "../component/mylabel.h" #include "../component/mylineedit.h" @@ -16,17 +19,24 @@ #include "../component/ringsprogressbar.h" #include "../../common/utils.h" #include "../globalbackupinfo.h" +#include "messageboxutils.h" +#include "backuppointlistdialog.h" SystemRestore::SystemRestore(QWidget *parent) : QStackedWidget(parent) { m_isRetainUserData = false; + m_isFactoryRestore = false; + m_pInterface = nullptr; // 界面手写代码创建,作为练手 initFirstWidget(); } SystemRestore::~SystemRestore() -{} +{ + delete m_pInterface; + m_pInterface = nullptr; +} /** * @brief 初始化第一个页面 @@ -108,12 +118,38 @@ void SystemRestore::initFirstWidget() beginRestore->setAutoRepeat(true); font.setPixelSize(24); beginRestore->setFont(font); - connect(beginRestore, &MyPushButton::clicked, this, &SystemRestore::on_next_clicked); + connect(beginRestore, &MyPushButton::clicked, this, &SystemRestore::on_button_beginRestore_clicked); + // 底部控件布局 + QVBoxLayout *bottomVBoxLayout = new QVBoxLayout(first); + bottomVBoxLayout->addStretch(); + QHBoxLayout *bottomHBoxLayout = new QHBoxLayout(first); + bottomVBoxLayout->addLayout(bottomHBoxLayout); + bottomVBoxLayout->addSpacing(20); + bottomHBoxLayout->addStretch(); + // 恢复出厂复选框 + MyCheckBox * checkFactoryRestore = new MyCheckBox(tr("Factory Restore"), first); +// if (!Utils::isHuawei990()) +// checkFactoryRestore->setVisible(false); // 保留用户数据复选框 - QCheckBox * retainUserData = new QCheckBox(tr("Retaining User Data"), first); - retainUserData->setGeometry(551, 551, 200, 30); - connect(retainUserData, &QCheckBox::stateChanged, this, &SystemRestore::on_retainUserData_checked); + MyCheckBox * retainUserData = new MyCheckBox(tr("Retaining User Data"), first); + bottomHBoxLayout->addWidget(checkFactoryRestore); + bottomHBoxLayout->addSpacing(10); + bottomHBoxLayout->addWidget(retainUserData); + bottomHBoxLayout->addSpacing(20); + + connect(checkFactoryRestore, &MyCheckBox::stateChanged, this, [=](int state) { + this->m_isFactoryRestore = Qt::Unchecked == state ? false : true; + if (this->m_isFactoryRestore) { + retainUserData->setChecked(false); + } + }); + connect(retainUserData, &MyCheckBox::stateChanged, this, [=](int state) { + this->m_isRetainUserData = Qt::Unchecked == state ? false : true; + if (this->m_isRetainUserData) { + checkFactoryRestore->setChecked(false); + } + }); addWidget(first); } @@ -132,7 +168,7 @@ void SystemRestore::on_pre_clicked(bool checked) } /** - * @brief “开始备份”“下一步”按钮响应槽 + * @brief “下一步”按钮响应槽 * @param checked */ void SystemRestore::on_next_clicked(bool checked) @@ -145,10 +181,27 @@ void SystemRestore::on_next_clicked(bool checked) } /** - * @brief 保留用户数据复选框响应槽 + * @brief “开始还原”按钮响应槽 + * @param checked */ -void SystemRestore::on_retainUserData_checked(bool checked) +void SystemRestore::on_button_beginRestore_clicked(bool checked) { - m_isRetainUserData = checked; + Q_UNUSED(checked) + + // 出厂还原,不用去选择备份点 + if (m_isFactoryRestore) { + if (!MessageBoxUtils::QMESSAGE_BOX_WARNING_CANCEL(this, QObject::tr("Warning"), + QObject::tr("Restore factory settings, your system user data will not be retained"), + QObject::tr("Continue"), QObject::tr("Cancel"))) { + return; + } + + //出厂还原 + m_uuid = FACTORY_BACKUP_UUID; + } else { + // 系统备份点列表中选择备份点 + BackupPointListDialog *backupPointListDialog = new BackupPointListDialog(this); + backupPointListDialog->exec(); + } } diff --git a/kybackup/module/systemrestore.h b/kybackup/module/systemrestore.h old mode 100644 new mode 100755 index 2f5e841..666f12a --- a/kybackup/module/systemrestore.h +++ b/kybackup/module/systemrestore.h @@ -2,6 +2,8 @@ #define SYSTEMRESTORE_H #include +#include "../backup_manager_interface.h" +#include "../backup-daemon/parsebackuplist.h" class SystemRestore : public QStackedWidget { @@ -34,11 +36,18 @@ private: public slots: void on_pre_clicked(bool checked = false); void on_next_clicked(bool checked = false); - void on_retainUserData_checked(bool checked = false); + void on_button_beginRestore_clicked(bool checked = false); private: // 是否保留用户数据 bool m_isRetainUserData; + // 是否出厂还原 + bool m_isFactoryRestore; + + // dbus接口 + ComKylinBackupManagerInterface *m_pInterface; + + QString m_uuid; // 还原点的UUID }; #endif // SYSTEMRESTORE_H diff --git a/kybackup/module/udiskdetector.cpp b/kybackup/module/udiskdetector.cpp old mode 100644 new mode 100755 diff --git a/kybackup/module/udiskdetector.h b/kybackup/module/udiskdetector.h old mode 100644 new mode 100755 diff --git a/kybackup/qtsingleapplication/qtlocalpeer.cpp b/kybackup/qtsingleapplication/qtlocalpeer.cpp old mode 100644 new mode 100755 diff --git a/kybackup/qtsingleapplication/qtlocalpeer.h b/kybackup/qtsingleapplication/qtlocalpeer.h old mode 100644 new mode 100755 diff --git a/kybackup/qtsingleapplication/qtlockedfile.cpp b/kybackup/qtsingleapplication/qtlockedfile.cpp old mode 100644 new mode 100755 diff --git a/kybackup/qtsingleapplication/qtlockedfile.h b/kybackup/qtsingleapplication/qtlockedfile.h old mode 100644 new mode 100755 diff --git a/kybackup/qtsingleapplication/qtlockedfile_unix.cpp b/kybackup/qtsingleapplication/qtlockedfile_unix.cpp old mode 100644 new mode 100755 diff --git a/kybackup/qtsingleapplication/qtsingleapplication.cpp b/kybackup/qtsingleapplication/qtsingleapplication.cpp old mode 100644 new mode 100755 diff --git a/kybackup/qtsingleapplication/qtsingleapplication.h b/kybackup/qtsingleapplication/qtsingleapplication.h old mode 100644 new mode 100755 diff --git a/kybackup/resource/images/data_backup.svg b/kybackup/resource/images/data_backup.svg old mode 100644 new mode 100755 diff --git a/kybackup/resource/images/data_backup_dark.svg b/kybackup/resource/images/data_backup_dark.svg old mode 100644 new mode 100755 diff --git a/kybackup/resource/images/data_restore.svg b/kybackup/resource/images/data_restore.svg old mode 100644 new mode 100755 diff --git a/kybackup/resource/images/data_restore_dark.svg b/kybackup/resource/images/data_restore_dark.svg old mode 100644 new mode 100755 diff --git a/kybackup/resource/images/empty.png b/kybackup/resource/images/empty.png new file mode 100755 index 0000000000000000000000000000000000000000..60076532657982f7326eb5f0f2d644be95425997 GIT binary patch literal 6139 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 literal 0 HcmV?d00001 diff --git a/kybackup/resource/images/empty_dark.png b/kybackup/resource/images/empty_dark.png new file mode 100755 index 0000000000000000000000000000000000000000..28ca918723cf578876f2968961cc3e6bfb770822 GIT binary patch literal 11344 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 literal 0 HcmV?d00001 diff --git a/kybackup/resource/images/folder.png b/kybackup/resource/images/folder.png old mode 100644 new mode 100755 diff --git a/kybackup/resource/images/ghost_image.svg b/kybackup/resource/images/ghost_image.svg old mode 100644 new mode 100755 diff --git a/kybackup/resource/images/ghost_image_dark.svg b/kybackup/resource/images/ghost_image_dark.svg old mode 100644 new mode 100755 diff --git a/kybackup/resource/images/loading.gif b/kybackup/resource/images/loading.gif old mode 100644 new mode 100755 diff --git a/kybackup/resource/images/sysem_restore.svg b/kybackup/resource/images/sysem_restore.svg old mode 100644 new mode 100755 diff --git a/kybackup/resource/images/sysem_restore_dark.svg b/kybackup/resource/images/sysem_restore_dark.svg old mode 100644 new mode 100755 diff --git a/kybackup/resource/images/system_backup.svg b/kybackup/resource/images/system_backup.svg old mode 100644 new mode 100755 diff --git a/kybackup/resource/images/system_backup_dark.svg b/kybackup/resource/images/system_backup_dark.svg old mode 100644 new mode 100755 diff --git a/kybackup/resource/symbos/dialog-error.png b/kybackup/resource/symbos/dialog-error.png old mode 100644 new mode 100755 diff --git a/kybackup/resource/symbos/document-properties-symbolic.png b/kybackup/resource/symbos/document-properties-symbolic.png old mode 100644 new mode 100755 diff --git a/kybackup/resource/symbos/list-add-symbolic.png b/kybackup/resource/symbos/list-add-symbolic.png old mode 100644 new mode 100755 diff --git a/kybackup/resource/symbos/object-rotate-left-symbolic.png b/kybackup/resource/symbos/object-rotate-left-symbolic.png old mode 100644 new mode 100755 diff --git a/kybackup/resource/symbos/ukui-bf-damage-symbolic.png b/kybackup/resource/symbos/ukui-bf-damage-symbolic.png old mode 100644 new mode 100755 diff --git a/kybackup/resource/symbos/ukui-bf-data-backup-symbolic.png b/kybackup/resource/symbos/ukui-bf-data-backup-symbolic.png old mode 100644 new mode 100755 diff --git a/kybackup/resource/symbos/ukui-bf-data-restore-symbolic.png b/kybackup/resource/symbos/ukui-bf-data-restore-symbolic.png old mode 100644 new mode 100755 diff --git a/kybackup/resource/symbos/ukui-bf-dataloss-symbolic.png b/kybackup/resource/symbos/ukui-bf-dataloss-symbolic.png old mode 100644 new mode 100755 diff --git a/kybackup/resource/symbos/ukui-bf-fast-symbolic.png b/kybackup/resource/symbos/ukui-bf-fast-symbolic.png old mode 100644 new mode 100755 diff --git a/kybackup/resource/symbos/ukui-bf-ghost-mirror-symbolic.png b/kybackup/resource/symbos/ukui-bf-ghost-mirror-symbolic.png old mode 100644 new mode 100755 diff --git a/kybackup/resource/symbos/ukui-bf-many-spot-symbolic.png b/kybackup/resource/symbos/ukui-bf-many-spot-symbolic.png old mode 100644 new mode 100755 diff --git a/kybackup/resource/symbos/ukui-bf-operation-log-symbolic.png b/kybackup/resource/symbos/ukui-bf-operation-log-symbolic.png old mode 100644 new mode 100755 diff --git a/kybackup/resource/symbos/ukui-bf-security-symbolic.png b/kybackup/resource/symbos/ukui-bf-security-symbolic.png old mode 100644 new mode 100755 diff --git a/kybackup/resource/symbos/ukui-bf-simple-symbolic.png b/kybackup/resource/symbos/ukui-bf-simple-symbolic.png old mode 100644 new mode 100755 diff --git a/kybackup/resource/symbos/ukui-bf-system-backup-symbolic.png b/kybackup/resource/symbos/ukui-bf-system-backup-symbolic.png old mode 100644 new mode 100755 diff --git a/kybackup/resource/symbos/ukui-bf-system-restore-symbolic.png b/kybackup/resource/symbos/ukui-bf-system-restore-symbolic.png old mode 100644 new mode 100755 diff --git a/kybackup/resource/symbos/ukui-bf-volume-symbolic.png b/kybackup/resource/symbos/ukui-bf-volume-symbolic.png old mode 100644 new mode 100755 diff --git a/kybackup/resource/symbos/ukui-dialog-success.png b/kybackup/resource/symbos/ukui-dialog-success.png old mode 100644 new mode 100755 diff --git a/kybackup/xatom-helper.cpp b/kybackup/xatom-helper.cpp old mode 100644 new mode 100755 diff --git a/kybackup/xatom-helper.h b/kybackup/xatom-helper.h old mode 100644 new mode 100755 diff --git a/yhkylin-backup-tool.pro b/yhkylin-backup-tool.pro old mode 100644 new mode 100755