yhkylin-backup-tools/kybackup/maindialog.cpp

317 lines
11 KiB
C++
Executable File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "maindialog.h"
#include "ui_maindialog.h"
#include <QMenu>
#include <QProcess>
#include <QMessageBox>
#include <KWindowSystem>
#include <unistd.h>
#include "../common/mydefine.h"
#include "module/systembackup.h"
#include "module/systemrestore.h"
#include "module/databackup.h"
#include "module/datarestore.h"
#include "module/operationlog.h"
#include "module/ghostimage.h"
#include "backup_manager_interface.h"
#include "globalbackupinfo.h"
#include "messageboxutils.h"
#include "aboutdialog.h"
MainDialog::MainDialog(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainDialog)
{
ui->setupUi(this);
initUI();
initConnect();
// 注册BackupWrapper类型之后qdbus接口才能使用
BackupWrapper::registerMetaType();
mountBackupPartition();
}
MainDialog::~MainDialog()
{
delete ui;
}
void MainDialog::initUI()
{
// 总体布局为横向布局,分为左侧和右侧
m_totalHLayout = new QHBoxLayout;
m_totalHLayout->setSpacing(0);
m_totalHLayout->setObjectName(QString::fromUtf8("m_totalHLayout"));
m_totalHLayout->setContentsMargins(0, 0, 0, 0);
m_totalHLayout->setSpacing(0);
ui->centralwidget->setLayout(m_totalHLayout);
if (GlobelBackupInfo::inst().isManager())
m_leftSiderBarWidget = new LeftsiderbarWidget(ui->centralwidget);
else
m_leftSiderBarWidget = new LeftsiderbarWidget(ui->centralwidget, LeftsiderbarWidget::StartMode::std_user);
m_leftSiderBarWidget->setObjectName(QString::fromUtf8("m_leftSiderBarWidget"));
m_leftSiderBarWidget->setFixedSize(200, 640);
m_totalHLayout->addWidget(m_leftSiderBarWidget);
m_rightWidget = new QWidget;
m_rightWidget->setFixedSize(760, 640);
m_rightVLayout = new QVBoxLayout;
m_rightVLayout->setObjectName(QString::fromUtf8("m_rightVLayout"));
m_rightVLayout->setContentsMargins(0, 0, 0, 0);
m_rightVLayout->setSpacing(0);
m_titleWidget = new QWidget;
m_titleWidget->setObjectName(QString::fromUtf8("m_titleWidget"));
m_titleWidget->setFixedSize(760, 40);
m_rightVLayout->addWidget(m_titleWidget);
m_rightVLayout->addStretch();
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);
m_rightWidget->setLayout(m_rightVLayout);
m_totalHLayout->addWidget(m_rightWidget);
m_totalHLayout->addStretch();
initTileBar();
initStyleSheet();
}
void MainDialog::initTileBar()
{
m_titleLayout = new QHBoxLayout;
m_titleLayout->setContentsMargins(8, 4, 4, 0);
m_titleLayout->setSpacing(0);
m_menuOptionBtn = new QToolButton;
m_minBtn = new QPushButton;
m_closeBtn = new QPushButton;
m_menuOptionBtn->setToolTip(tr("Main menu"));
m_minBtn->setToolTip(tr("Minimize"));
m_closeBtn->setToolTip(tr("Close"));
m_menuOptionBtn->setProperty("isWindowButton", 0x1);
m_menuOptionBtn->setProperty("useIconHighlightEffect", 0x2);
m_menuOptionBtn->setIcon(QIcon::fromTheme("open-menu-symbolic"));
m_menuOptionBtn->setFixedSize(30, 30);
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->setFixedSize(30, 30);
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->setFixedSize(30, 30);
m_closeBtn->setFlat(true);
m_closeBtn->setIcon(QIcon::fromTheme("window-close-symbolic"));
// m_closeBtn->setProperty("setIconHighlightEffectDefaultColor", m_closeBtn->palette().color(QPalette::Active, QPalette::Base));
QMenu* backupMain = new QMenu(m_titleWidget);
backupMain->setObjectName("mainMenu");
m_menuOptionBtn->setMenu(backupMain);
QAction* backupTheme = new QAction(tr("Theme"), m_titleWidget);
backupMain->addAction(backupTheme);
QMenu* selectTheme = new QMenu( m_titleWidget);
selectTheme->setObjectName("selectTheme");
backupTheme->setMenu(selectTheme);
QAction* defaultTheme = new QAction(tr("Auto"), m_titleWidget);
selectTheme->addAction(defaultTheme);
QAction* lightTheme = new QAction(tr("Light"), m_titleWidget);
selectTheme->addAction(lightTheme);
QAction* darkTheme = new QAction(tr("Dark"), m_titleWidget);
selectTheme->addAction(darkTheme);
m_backupHelp = new QAction(tr("Help"), m_titleWidget);
backupMain->addAction(m_backupHelp);
m_backupAbout = new QAction(tr("About"), m_titleWidget);
backupMain->addAction(m_backupAbout);
m_backupExit = new QAction(tr("Exit"), m_titleWidget);
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);
m_titleWidget->setLayout(m_titleLayout);
}
void MainDialog::initStyleSheet()
{
// 主窗口
this->setWindowTitle(tr("Backup & Restore"));
// 右侧窗口背景色设置
m_rightWidget->setAutoFillBackground(true);
QPalette palette = m_rightWidget->palette();
palette.setColor(QPalette::Background, palette.color(QPalette::Base));
m_rightWidget->setPalette(palette);
}
void MainDialog::initConnect()
{
// 左侧功能选择栏
connect(m_leftSiderBarWidget, &LeftsiderbarWidget::selected, this, &MainDialog::selected);
// 标题栏右侧按钮区域
// 退出
connect(m_backupExit, &QAction::triggered, this, &MainDialog::closeBtn);
// 关于
connect(m_backupAbout, &QAction::triggered, this, [=] {
AboutDialog *about = new AboutDialog(this);
about->exec();
about->deleteLater();
});
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);
}
/**
* @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;
GlobelBackupInfo::inst().setFuncType(FuncTypeConverter::FunType::BACKUP_SYSTEM);
break;
case FuncTypeConverter::FunType::RESTORE_SYSTEM:
m_stackedWidget = new SystemRestore;
GlobelBackupInfo::inst().setFuncType(FuncTypeConverter::FunType::RESTORE_SYSTEM);
break;
case FuncTypeConverter::FunType::BACKUP_DATA:
m_stackedWidget = new DataBackup;
GlobelBackupInfo::inst().setFuncType(FuncTypeConverter::FunType::BACKUP_DATA);
break;
case FuncTypeConverter::FunType::RESTORE_DATA:
m_stackedWidget = new DataRestore;
GlobelBackupInfo::inst().setFuncType(FuncTypeConverter::FunType::RESTORE_DATA);
break;
case FuncTypeConverter::FunType::OPERATION_LOG:
m_stackedWidget = new OperationLog;
GlobelBackupInfo::inst().setFuncType(FuncTypeConverter::FunType::OPERATION_LOG);
break;
case FuncTypeConverter::FunType::GHOST_IMAGE:
m_stackedWidget = new GhostImage;
GlobelBackupInfo::inst().setFuncType(FuncTypeConverter::FunType::GHOST_IMAGE);
break;
default:
m_stackedWidget = new SystemBackup;
GlobelBackupInfo::inst().setFuncType(FuncTypeConverter::FunType::BACKUP_SYSTEM);
break;
}
m_stackedWidget->setObjectName(QString::fromUtf8("m_stackedWidget"));
m_stackedWidget->setFixedSize(760, 600);
m_rightVLayout->addWidget(m_stackedWidget);
}
/**
* @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();
}
}
void MainDialog::mountBackupPartition()
{
// 挂载/backup分区
ComKylinBackupManagerInterface intf("com.kylin.backup", "/", QDBusConnection::systemBus());
QDBusPendingReply<int> reply = intf.Mount_backup_partition();
reply.waitForFinished();
if (reply.isError()) {
// 挂载分区时出现异常
MessageBoxUtils::QMESSAGE_BOX_WARNING(this, QObject::tr("Warning"),
QObject::tr("An exception occurred when mounting backup partition."),
QObject::tr("Ok"));
closeBtn();
} else if (int(MountResult::CANNOT_GET_BACKUPUUID) == reply.value()) {
// 没有找到备份分区,只能备份到移动设备中
MessageBoxUtils::QMESSAGE_BOX_WARNING(this, QObject::tr("Warning"),
QObject::tr("There's no backup partition, can only backup to removable device."),
QObject::tr("Ok"));
// GlobelBackupInfo::inst().setHasBackupPartition(false);
closeBtn();
} else if (int(MountResult::MOUNTED) != reply.value()) {
// 挂载备份分区失败
MessageBoxUtils::QMESSAGE_BOX_WARNING(this, QObject::tr("Warning"),
QObject::tr("Failed to mount backup partition."),
QObject::tr("Ok"));
closeBtn();
}
}
void MainDialog::umountBackupPartition()
{
// 卸载/backup分区
ComKylinBackupManagerInterface intf("com.kylin.backup", "/", QDBusConnection::systemBus());
intf.umountBackupPartition();
}
void MainDialog::closeBtn()
{
if (GlobelBackupInfo::inst().isBusy()) {
// 系统正忙,请稍等
MessageBoxUtils::QMESSAGE_BOX_WARNING(this, QObject::tr("Warning"),
QObject::tr("It's busy, please wait"),
QObject::tr("Ok"));
return;
}
if (GlobelBackupInfo::inst().hasBackupPartition())
umountBackupPartition();
this->close();
qApp->quit();
}