yhkylin-backup-tools/kybackup/maindialog.cpp

323 lines
12 KiB
C++
Raw Normal View History

2021-08-06 10:20:03 +08:00
#include "maindialog.h"
#include "ui_maindialog.h"
2021-09-16 16:05:46 +08:00
#include <QMenu>
#include <QProcess>
2021-10-26 09:24:05 +08:00
#include <QMessageBox>
2021-09-16 16:05:46 +08:00
#include <KWindowSystem>
#include <unistd.h>
#include "../common/mydefine.h"
#include "module/systembackup.h"
2021-11-17 13:23:38 +08:00
#include "module/systemrestore.h"
2021-12-26 18:15:21 +08:00
#include "module/databackup.h"
2021-12-28 16:51:35 +08:00
#include "module/datarestore.h"
2021-12-30 10:27:03 +08:00
#include "module/operationlog.h"
2022-01-13 14:06:40 +08:00
#include "module/ghostimage.h"
2021-10-26 09:24:05 +08:00
#include "backup_manager_interface.h"
#include "globalbackupinfo.h"
2021-12-28 16:51:35 +08:00
#include "messageboxutils.h"
2021-09-16 16:05:46 +08:00
2021-08-06 10:20:03 +08:00
MainDialog::MainDialog(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainDialog)
{
ui->setupUi(this);
2021-09-16 16:05:46 +08:00
initUI();
initConnect();
2021-10-26 09:24:05 +08:00
// 注册BackupWrapper类型之后qdbus接口才能使用
BackupWrapper::registerMetaType();
mountBackupPartition();
2021-08-06 10:20:03 +08:00
}
MainDialog::~MainDialog()
{
delete ui;
}
2021-09-16 16:05:46 +08:00
void MainDialog::initUI()
{
2021-09-23 11:21:58 +08:00
m_totalHLayout = new QHBoxLayout(ui->centralwidget);
2021-09-16 16:05:46 +08:00
m_totalHLayout->setSpacing(0);
m_totalHLayout->setObjectName(QString::fromUtf8("m_totalHLayout"));
m_totalHLayout->setContentsMargins(0, 0, 0, 0);
2021-09-23 11:21:58 +08:00
ui->centralwidget->setLayout(m_totalHLayout);
2021-09-16 16:05:46 +08:00
2021-12-26 18:15:21 +08:00
if (GlobelBackupInfo::inst().isManager())
m_leftSiderBarWidget = new LeftsiderbarWidget(ui->centralwidget);
else
m_leftSiderBarWidget = new LeftsiderbarWidget(ui->centralwidget, LeftsiderbarWidget::StartMode::std_user);
2021-09-16 16:05:46 +08:00
m_leftSiderBarWidget->setObjectName(QString::fromUtf8("m_leftSiderBarWidget"));
m_leftSiderBarWidget->setGeometry(QRect(0, 0, 200, 640));
2021-09-23 11:21:58 +08:00
m_leftSiderBarWidget->setFixedSize(QSize(200, 640));
2021-09-16 16:05:46 +08:00
m_totalHLayout->addWidget(m_leftSiderBarWidget);
m_rightVLayout = new QVBoxLayout();
m_rightVLayout->setObjectName(QString::fromUtf8("m_rightVLayout"));
m_rightVLayout->setContentsMargins(0, 0, 0, 0);
m_titleWidget = new QWidget(ui->centralwidget);
m_titleWidget->setObjectName(QString::fromUtf8("m_titleWidget"));
m_titleWidget->setGeometry(QRect(201, 0, 760, 40));
m_rightVLayout->addWidget(m_titleWidget);
2021-12-26 18:15:21 +08:00
if (!GlobelBackupInfo::inst().isManager())
selected(FuncTypeConverter::FunType::BACKUP_DATA);
else if (GlobelBackupInfo::inst().hasArgRestore())
selected(FuncTypeConverter::FunType::RESTORE_SYSTEM);
else
selected(FuncTypeConverter::FunType::BACKUP_SYSTEM);
2021-09-16 16:05:46 +08:00
m_totalHLayout->addLayout(m_rightVLayout);
initTileBar();
initStyleSheet();
}
void MainDialog::initTileBar()
{
m_titleLayout = new QHBoxLayout;
m_titleWidget->setLayout(m_titleLayout);
m_titleLayout->setContentsMargins(8, 4, 4, 0);
m_titleLayout->setSpacing(0);
m_menuOptionBtn = new QToolButton(m_titleWidget);
m_minBtn = new QPushButton(m_titleWidget);
m_closeBtn = new QPushButton(m_titleWidget);
m_menuOptionBtn->setToolTip(tr("Main menu"));
m_minBtn->setToolTip(tr("Minimize"));
m_closeBtn->setToolTip(tr("Close"));
m_menuOptionBtn->setFixedSize(30, 30);
m_minBtn->setFixedSize(30, 30);
m_closeBtn->setFixedSize(30, 30);
QMenu* backupMain = new QMenu(this);
backupMain->setObjectName("mainMenu");
m_menuOptionBtn->setMenu(backupMain);
QAction* backupTheme = new QAction(tr("Theme"),this);
backupMain->addAction(backupTheme);
QMenu* selectTheme = new QMenu(this);
selectTheme->setObjectName("selectTheme");
backupTheme->setMenu(selectTheme);
2021-12-01 15:12:38 +08:00
QAction* defaultTheme = new QAction(tr("Auto"),this);
2021-09-16 16:05:46 +08:00
selectTheme->addAction(defaultTheme);
2021-12-01 15:12:38 +08:00
QAction* darkTheme = new QAction(tr("Dark"),this);
2021-09-16 16:05:46 +08:00
selectTheme->addAction(darkTheme);
2021-12-01 15:12:38 +08:00
QAction* lightTheme = new QAction(tr("Light"),this);
2021-09-16 16:05:46 +08:00
selectTheme->addAction(lightTheme);
m_backupHelp = new QAction(tr("Help"),this);
backupMain->addAction(m_backupHelp);
m_backupAbout = new QAction(tr("About"),this);
backupMain->addAction(m_backupAbout);
m_backupExit = new QAction(tr("Exit"),this);
backupMain->addAction(m_backupExit);
m_titleLayout->addStretch();
m_titleLayout->addWidget(m_menuOptionBtn);
m_titleLayout->addSpacing(4);
m_titleLayout->addWidget(m_minBtn);
m_titleLayout->addSpacing(4);
m_titleLayout->addWidget(m_closeBtn);
}
void MainDialog::initStyleSheet()
{
// 主窗口
// qApp->setWindowIcon(QIcon::fromTheme(THEME_YHKYLIN_BACKUP_TOOLS));
2021-11-17 13:23:38 +08:00
this->setWindowTitle(tr("Backup & Restore"));
2021-09-16 16:05:46 +08:00
// 工作区(此处代码加不加一个样,注释掉,留着学习,知道有这么回事)
//ui->centralwidget->setStyleSheet("QWidget#centralWidget{background: palette(base); border-radius: 6px;}");
//ui->centralwidget->setAttribute(Qt::WA_TranslucentBackground);
// 右侧title
// setStyleSheet方式設置樣式不能跟隨主題
// m_titleWidget->setStyleSheet("QWidget#m_titleWidget{background-color:palette(base)}");
m_titleWidget->setAutoFillBackground(true);
QPalette palette = m_titleWidget->palette();
palette.setColor(QPalette::Background, palette.color(QPalette::Base));
m_titleWidget->setPalette(palette);
// m_menuOptionBtn->setStyleSheet("background-color: palette(base);");
m_menuOptionBtn->setProperty("isWindowButton", 0x1);
m_menuOptionBtn->setProperty("useIconHighlightEffect", 0x2);
m_menuOptionBtn->setIcon(QIcon::fromTheme("open-menu-symbolic"));
m_menuOptionBtn->setAutoRaise(true);
m_menuOptionBtn->setPopupMode(QToolButton::InstantPopup);
// m_menuOptionBtn->setProperty("setIconHighlightEffectDefaultColor", m_closeBtn->palette().color(QPalette::Active, QPalette::Base));
m_minBtn->setProperty("isWindowButton", 0x1);
m_minBtn->setProperty("useIconHighlightEffect", 0x2);
m_minBtn->setFlat(true);
m_minBtn->setIcon(QIcon::fromTheme("window-minimize-symbolic"));
// m_minBtn->setProperty("setIconHighlightEffectDefaultColor", m_closeBtn->palette().color(QPalette::Active, QPalette::Base));
m_closeBtn->setProperty("isWindowButton", 0x2);
m_closeBtn->setProperty("useIconHighlightEffect", 0x8);
m_closeBtn->setFlat(true);
m_closeBtn->setIcon(QIcon::fromTheme("window-close-symbolic"));
// m_closeBtn->setProperty("setIconHighlightEffectDefaultColor", m_closeBtn->palette().color(QPalette::Active, QPalette::Base));
}
void MainDialog::initConnect()
{
2021-11-17 13:23:38 +08:00
// 左侧功能选择栏
connect(m_leftSiderBarWidget, &LeftsiderbarWidget::selected, this, &MainDialog::selected);
2021-09-16 16:05:46 +08:00
// 标题栏右侧按钮区域
// 退出
connect(m_backupExit, &QAction::triggered, this, &MainDialog::closeBtn);
// 关于
connect(m_backupAbout, &QAction::triggered, this, [=] {
// UkccAbout *ukcc = new UkccAbout(this);
// ukcc->exec();
});
connect(m_backupHelp, &QAction::triggered, this, [=] {
QProcess process(this);
process.startDetached("kylin-user-guide -A kybackup");
});
//最小化按钮
connect(m_minBtn, &QPushButton::clicked, this, &MainDialog::showMinimized);
//关闭按钮
connect(m_closeBtn, &QPushButton::clicked, this, &MainDialog::closeBtn);
}
2021-11-17 13:23:38 +08:00
/**
* @brief
* @param func_type
*/
void MainDialog::selected(int func_type)
{
if (GlobelBackupInfo::inst().getFuncType() == func_type)
return ;
if (m_stackedWidget) {
m_rightVLayout->removeWidget(m_stackedWidget);
delete m_stackedWidget;
}
switch (func_type) {
case FuncTypeConverter::FunType::BACKUP_SYSTEM:
m_stackedWidget = new SystemBackup(ui->centralwidget);
GlobelBackupInfo::inst().setFuncType(FuncTypeConverter::FunType::BACKUP_SYSTEM);
break;
case FuncTypeConverter::FunType::RESTORE_SYSTEM:
m_stackedWidget = new SystemRestore(ui->centralwidget);
GlobelBackupInfo::inst().setFuncType(FuncTypeConverter::FunType::RESTORE_SYSTEM);
break;
2021-12-26 18:15:21 +08:00
case FuncTypeConverter::FunType::BACKUP_DATA:
m_stackedWidget = new DataBackup(ui->centralwidget);
GlobelBackupInfo::inst().setFuncType(FuncTypeConverter::FunType::BACKUP_DATA);
break;
2021-12-28 16:51:35 +08:00
case FuncTypeConverter::FunType::RESTORE_DATA:
m_stackedWidget = new DataRestore(ui->centralwidget);
GlobelBackupInfo::inst().setFuncType(FuncTypeConverter::FunType::RESTORE_DATA);
break;
2021-12-30 10:27:03 +08:00
case FuncTypeConverter::FunType::OPERATION_LOG:
m_stackedWidget = new OperationLog(ui->centralwidget);
GlobelBackupInfo::inst().setFuncType(FuncTypeConverter::FunType::OPERATION_LOG);
break;
2022-01-13 14:06:40 +08:00
case FuncTypeConverter::FunType::GHOST_IMAGE:
m_stackedWidget = new GhostImage(ui->centralwidget);
GlobelBackupInfo::inst().setFuncType(FuncTypeConverter::FunType::GHOST_IMAGE);
break;
2021-11-17 13:23:38 +08:00
default:
m_stackedWidget = new SystemBackup(ui->centralwidget);
GlobelBackupInfo::inst().setFuncType(FuncTypeConverter::FunType::BACKUP_SYSTEM);
break;
}
m_stackedWidget->setObjectName(QString::fromUtf8("m_stackedWidget"));
m_stackedWidget->setGeometry(QRect(201, 40, 760, 600));
m_rightVLayout->addWidget(m_stackedWidget);
// 右侧内容区域
// m_stackedWidget->setStyleSheet("QStackedWidget#m_stackedWidget{background: palette(base); border-bottom-left-radius: 6px; border-bottom-right-radius: 6px;}");
m_stackedWidget->setAutoFillBackground(true);
QPalette palette = m_stackedWidget->palette();
palette.setColor(QPalette::Background, palette.color(QPalette::Base));
m_stackedWidget->setPalette(palette);
}
2021-09-16 16:05:46 +08:00
/**
* @brief
* @param msg id
*/
void MainDialog::sltMessageReceived(const QString &msg)
{
QString user = QString::number(getuid());
if (msg == user) {
// this->setWindowFlag(Qt::WindowStaysOnTopHint,true);
// this->setWindowFlag(Qt::WindowStaysOnTopHint,false);
KWindowSystem::forceActiveWindow(this->winId());
this->show();
}
}
2021-10-26 09:24:05 +08:00
void MainDialog::mountBackupPartition()
{
// 挂载/backup分区
ComKylinBackupManagerInterface intf("com.kylin.backup", "/", QDBusConnection::systemBus());
QDBusPendingReply<int> reply = intf.Mount_backup_partition();
reply.waitForFinished();
if (reply.isError()) {
// 挂载分区时出现异常
2021-12-28 16:51:35 +08:00
MessageBoxUtils::QMESSAGE_BOX_WARNING(this, QObject::tr("Warning"),
QObject::tr("An exception occurred when mounting backup partition."),
QObject::tr("Ok"));
2021-10-26 09:24:05 +08:00
closeBtn();
} else if (int(MountResult::CANNOT_GET_BACKUPUUID) == reply.value()) {
// 没有找到备份分区,只能备份到移动设备中
2021-12-28 16:51:35 +08:00
MessageBoxUtils::QMESSAGE_BOX_WARNING(this, QObject::tr("Warning"),
QObject::tr("There's no backup partition, can only backup to removable device."),
QObject::tr("Ok"));
2021-10-26 09:24:05 +08:00
GlobelBackupInfo::inst().setHasBackupPartition(false);
} else if (int(MountResult::MOUNTED) != reply.value()) {
// 挂载备份分区失败
2021-12-28 16:51:35 +08:00
MessageBoxUtils::QMESSAGE_BOX_WARNING(this, QObject::tr("Warning"),
QObject::tr("Failed to mount backup partition."),
QObject::tr("Ok"));
2021-10-26 09:24:05 +08:00
closeBtn();
}
}
void MainDialog::umountBackupPartition()
{
// 卸载/backup分区
ComKylinBackupManagerInterface intf("com.kylin.backup", "/", QDBusConnection::systemBus());
intf.umountBackupPartition();
}
2021-09-16 16:05:46 +08:00
void MainDialog::closeBtn()
{
2021-10-26 09:24:05 +08:00
if (GlobelBackupInfo::inst().isBusy()) {
2021-12-28 16:51:35 +08:00
// 系统正忙,请稍等
MessageBoxUtils::QMESSAGE_BOX_WARNING(this, QObject::tr("Warning"),
QObject::tr("It's busy, please wait"),
QObject::tr("Ok"));
2021-10-26 09:24:05 +08:00
return;
}
if (GlobelBackupInfo::inst().hasBackupPartition())
umountBackupPartition();
2021-09-16 16:05:46 +08:00
this->close();
qApp->quit();
}