From cde6b9d95f24c84ac9892361f2ba12199e38bdb3 Mon Sep 17 00:00:00 2001 From: zhaominyong Date: Fri, 18 Mar 2022 14:45:23 +0800 Subject: [PATCH] =?UTF-8?q?QLineEdit=E7=BB=84=E5=90=88=E6=B8=85=E9=99=A4?= =?UTF-8?q?=E3=80=81=E6=B7=BB=E5=8A=A0=E6=8C=89=E9=92=AE=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- kybackup/app.qrc | 2 + kybackup/component/backuplistwidget.cpp | 26 +- kybackup/component/clicklabel.cpp | 2 +- kybackup/component/myiconbutton.cpp | 99 ++-- kybackup/component/mylabel.cpp | 63 +-- kybackup/component/pixmapbutton.cpp | 79 ++++ kybackup/component/pixmapbutton.h | 31 ++ kybackup/globalsignals.h | 2 +- kybackup/gsettingswrapper.cpp | 3 +- kybackup/kybackup.pro | 2 + kybackup/module/databackup.cpp | 102 +++-- kybackup/module/systembackup.cpp | 20 +- kybackup/qt_zh_CN.ts | 428 +++++++++--------- kybackup/resource/language/qt_zh_CN.qm | Bin 29305 -> 29353 bytes .../symbos/object-select-symbolic.png | Bin 0 -> 263 bytes .../resource/symbos/window-close-symbolic.png | Bin 0 -> 202 bytes 16 files changed, 526 insertions(+), 333 deletions(-) create mode 100644 kybackup/component/pixmapbutton.cpp create mode 100644 kybackup/component/pixmapbutton.h create mode 100644 kybackup/resource/symbos/object-select-symbolic.png create mode 100644 kybackup/resource/symbos/window-close-symbolic.png diff --git a/kybackup/app.qrc b/kybackup/app.qrc index 43af793..a3c947b 100755 --- a/kybackup/app.qrc +++ b/kybackup/app.qrc @@ -34,5 +34,7 @@ resource/images/empty_dark.png resource/symbos/document-open-recent-symbolic.png resource/language/qt_zh_CN.qm + resource/symbos/window-close-symbolic.png + resource/symbos/object-select-symbolic.png diff --git a/kybackup/component/backuplistwidget.cpp b/kybackup/component/backuplistwidget.cpp index cf3ecb4..3f14bc4 100755 --- a/kybackup/component/backuplistwidget.cpp +++ b/kybackup/component/backuplistwidget.cpp @@ -27,7 +27,7 @@ BackupListWidget::BackupListWidget(QWidget *parent /*= nullptr*/) : m_plusLogo = new QLabel; m_plusLogo->setFixedHeight(36); QIcon icon = QIcon::fromTheme("list-add-symbolic", QIcon(":/symbos/list-add-symbolic.png")); - m_plusLogo->setPixmap(icon.pixmap(icon.actualSize(QSize(24, 24)))); + m_plusLogo->setPixmap(icon.pixmap(icon.actualSize(QSize(16, 16)))); m_plusLogo->setEnabled(false); // 文件拖放区域 m_plusText = new QLabel; @@ -85,23 +85,22 @@ bool BackupListWidget::appendItem(const QString &text) if (count > 0) ++count; - int width = this->width(); - QListWidgetItem *item = new QListWidgetItem(this, m_type); - item->setSizeHint(QSize(width - 10, 36)); - MyItemWidget *widget = new MyItemWidget; + item->setSizeHint(QSize(this->width() - 5, 36)); + MyItemWidget *widget = new MyItemWidget(this); + widget->setMaximumWidth(this->width() - 5); + widget->setFixedHeight(36); + widget->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); QHBoxLayout *hlayout = new QHBoxLayout; - hlayout->setContentsMargins(0,5,0,5); + hlayout->setContentsMargins(5, 2, 2, 2); MyLabel *label = new MyLabel; label->setDeplayText(text); label->setToolTip(text); label->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); - // label->setMinimumWidth(width - 60); - label->setMaximumWidth(width - 10); label->setIsOriginal(true); hlayout->addWidget(label); - hlayout->addStretch(); + hlayout->setAlignment(label, Qt::AlignLeft); m_List << text; QPushButton *buttonDelete = new QPushButton; @@ -112,17 +111,20 @@ bool BackupListWidget::appendItem(const QString &text) buttonDelete->setIcon(QIcon::fromTheme("window-close-symbolic")); buttonDelete->setVisible(false); hlayout->addWidget(buttonDelete); + hlayout->setSpacing(5); + hlayout->setAlignment(buttonDelete, Qt::AlignRight); widget->setLayout(hlayout); this->setItemWidget(item, widget); - // this->setCurrentItem(item); + this->setCurrentRow(-1); connect(widget, &MyItemWidget::selected, buttonDelete, [=](bool checked) { - if (checked) + if (checked) { buttonDelete->setVisible(true); - else + } else { buttonDelete->setVisible(false); + } }); connect(buttonDelete, &QPushButton::clicked, this, [=]() { diff --git a/kybackup/component/clicklabel.cpp b/kybackup/component/clicklabel.cpp index 88adb30..9a0d388 100755 --- a/kybackup/component/clicklabel.cpp +++ b/kybackup/component/clicklabel.cpp @@ -33,5 +33,5 @@ ClickLabel::~ClickLabel() void ClickLabel::mousePressEvent(QMouseEvent *event){ if (event->button() == Qt::LeftButton) emit clicked(); -// QLabel::mousePressEvent(event); + // QLabel::mousePressEvent(event); } diff --git a/kybackup/component/myiconbutton.cpp b/kybackup/component/myiconbutton.cpp index 9debaf2..90f3709 100755 --- a/kybackup/component/myiconbutton.cpp +++ b/kybackup/component/myiconbutton.cpp @@ -31,15 +31,16 @@ MyIconButton::MyIconButton(QWidget *parent) : m_textLabel = new MyLabel(this); QSizePolicy textLabelPolicy = m_textLabel->sizePolicy(); - textLabelPolicy.setHorizontalPolicy(QSizePolicy::Fixed); - textLabelPolicy.setVerticalPolicy(QSizePolicy::Fixed); + textLabelPolicy.setHorizontalPolicy(QSizePolicy::Expanding); + textLabelPolicy.setVerticalPolicy(QSizePolicy::Expanding); m_textLabel->setSizePolicy(textLabelPolicy); - QHBoxLayout *hLayout = new QHBoxLayout(); - hLayout->setContentsMargins(8, 0, 0, 0); - hLayout->addWidget(m_iconButton, Qt::AlignCenter); + QHBoxLayout *hLayout = new QHBoxLayout(this); + hLayout->setContentsMargins(5, 0, 5, 0); + hLayout->setSpacing(5); + hLayout->addWidget(m_iconButton); hLayout->addWidget(m_textLabel); - hLayout->addStretch(); + hLayout->setAlignment(Qt::AlignLeft); setLayout(hLayout); connect(m_iconButton, &QPushButton::clicked, this, [=]() { @@ -49,9 +50,9 @@ MyIconButton::MyIconButton(QWidget *parent) : connect(m_iconButton, &QPushButton::toggled, this, [=] (bool checked) { if (checked || g_GSettingWrapper.isDarkTheme()) - m_iconButton->setIcon(ImageUtil::loadTheme(m_themeIconName, m_defaultIconName, "white", m_pixSize)); + m_iconButton->setIcon(ImageUtil::loadTheme(this->m_themeIconName, this->m_defaultIconName, "white", this->m_pixSize)); else - m_iconButton->setIcon(ImageUtil::loadTheme(m_themeIconName, m_defaultIconName, "default", m_pixSize)); + m_iconButton->setIcon(ImageUtil::loadTheme(this->m_themeIconName, this->m_defaultIconName, "default", this->m_pixSize)); }); connect(this, &MyIconButton::toggled, this, [=](bool checked) { @@ -61,25 +62,33 @@ MyIconButton::MyIconButton(QWidget *parent) : m_textLabel->setStyleSheet("color:white"); } else { this->setStyleSheet(QString("QPushButton:hover{background-color:%1;border-radius: 6px;}" - "QPushButton:pressed{background-color:%2;border-radius: 6px;}").arg(m_hoverColor).arg(m_clickColor)); + "QPushButton:pressed{background-color:%2;border-radius: 6px;}").arg(this->m_hoverColor).arg(this->m_clickColor)); m_textLabel->setStyleSheet("color:palette(windowText)"); } }); connect(GlobelBackupInfo::inst().getGlobalSignals(), &GlobalSignals::styleNameChanged, this, [=](bool isDark) { - Q_UNUSED(isDark) // 深浅主题切换时,因为调色板已经更换,高亮等颜色已经改变,所以要重新加载图标。 if (this->isChecked() || isDark) - m_iconButton->setIcon(ImageUtil::loadTheme(m_themeIconName, m_defaultIconName, "white", m_pixSize)); + this->m_iconButton->setIcon(ImageUtil::loadTheme(this->m_themeIconName, this->m_defaultIconName, "white", this->m_pixSize)); else - m_iconButton->setIcon(ImageUtil::loadTheme(m_themeIconName, m_defaultIconName, "default", m_pixSize)); + this->m_iconButton->setIcon(ImageUtil::loadTheme(this->m_themeIconName, this->m_defaultIconName, "default", this->m_pixSize)); - m_hoverColor = pluginBtnHoverColor(true); - m_clickColor = pluginBtnHoverColor(false); + this->m_hoverColor = pluginBtnHoverColor(true); + this->m_clickColor = pluginBtnHoverColor(false); if (!this->isChecked()) this->setStyleSheet(QString("QPushButton:hover{background-color:%1;border-radius: 6px;}" - "QPushButton:pressed{background-color:%2;border-radius: 6px;}").arg(m_hoverColor).arg(m_clickColor)); + "QPushButton:pressed{background-color:%2;border-radius: 6px;}").arg(this->m_hoverColor).arg(this->m_clickColor)); }); + + connect(GlobelBackupInfo::inst().getGlobalSignals(), &GlobalSignals::fontChanged, this, [=](int fontSize) { + QFont font = this->m_textLabel->font(); + font.setPointSize(fontSize); + this->m_textLabel->setFont(font); + // 字体家族、大小变化需重绘,并且字体大小变化也可能会造成显示不全问题 + this->setDesplayText(m_originalText); + }); + } MyIconButton::~MyIconButton() @@ -94,34 +103,27 @@ void MyIconButton::setThemeIcon(const QString &themeIconName, const QString &def m_iconButton->setIcon(ImageUtil::loadTheme(m_themeIconName, m_defaultIconName, "default", m_pixSize)); } +/** + * @brief 设置显示文字 + * @param text + * @note 先设置button大小,然后再调用此函数设置显示文字,因为显示文字label宽度要根据button宽度计算 + */ void MyIconButton::setDesplayText(const QString &text) { m_originalText = text; - m_textLabel->setDeplayText(text); -} - -/** - * 废弃,改为使用qss了 - */ -void MyIconButton::changePalette(bool checked) -{ - m_iconButton->setChecked(checked); - QPalette pal = m_textLabel->palette(); - // png格式的图标会自动跟随主题,不需再手动设置像素颜色 - if (g_GSettingWrapper.isDarkTheme()) { - if (checked) { - pal.setColor(QPalette::ButtonText, this->palette().highlightedText().color()); - } else { - pal.setColor(QPalette::ButtonText, this->palette().windowText().color()); - } + // m_textLabel->setFixedWidth(this->width() - 40); + m_textLabel->setMinimumWidth(this->width() - 40); + if (m_textLabel->wordWrap()) { + m_textLabel->setDeplayText(m_originalText); } else { - if (checked) { - pal.setColor(QPalette::ButtonText, this->palette().highlightedText().color()); + QFontMetrics fontMetrics(m_textLabel->font()); + int fontSize = fontMetrics.width(m_originalText); + if (fontSize > m_textLabel->width()) { + m_textLabel->setDeplayText(fontMetrics.elidedText(m_originalText, Qt::ElideRight, m_textLabel->width())); } else { - pal.setColor(QPalette::ButtonText, this->palette().windowText().color()); + m_textLabel->setDeplayText(m_originalText); } } - m_textLabel->setPalette(pal); } QString MyIconButton::pluginBtnHoverColor(bool hoverFlag) @@ -157,3 +159,28 @@ QString MyIconButton::pluginBtnHoverColor(bool hoverFlag) .arg(color.alpha()); return hoverColor; } + +/** + * 废弃,改为使用qss了 + */ +void MyIconButton::changePalette(bool checked) +{ + m_iconButton->setChecked(checked); + QPalette pal = m_textLabel->palette(); + // png格式的图标会自动跟随主题,不需再手动设置像素颜色 + if (g_GSettingWrapper.isDarkTheme()) { + if (checked) { + pal.setColor(QPalette::ButtonText, this->palette().highlightedText().color()); + } else { + pal.setColor(QPalette::ButtonText, this->palette().windowText().color()); + } + } else { + if (checked) { + pal.setColor(QPalette::ButtonText, this->palette().highlightedText().color()); + } else { + pal.setColor(QPalette::ButtonText, this->palette().windowText().color()); + } + } + m_textLabel->setPalette(pal); +} + diff --git a/kybackup/component/mylabel.cpp b/kybackup/component/mylabel.cpp index 9a7fdd1..ce0bd48 100755 --- a/kybackup/component/mylabel.cpp +++ b/kybackup/component/mylabel.cpp @@ -25,20 +25,21 @@ MyLabel::MyLabel(QWidget* parent) : } }); - connect(GlobelBackupInfo::inst().getGlobalSignals(), &GlobalSignals::fontChanged, this, [=]() { - // 字体家族、大小变化需重绘,并且字体大小变化也可能会造成显示不全问题 - if (this->wordWrap()) { - this->setText(m_text); - } else { - QFontMetrics fontMetrics(this->font()); - int fontSize = fontMetrics.width(m_text); - if (fontSize > this->width()) { - this->setText(fontMetrics.elidedText(m_text, Qt::ElideRight, this->width())); - } else { - this->setText(m_text); - } - } - }); + // 主题模块已经将QLabel改为了跟随主题设置,这里暂时去掉 +// connect(GlobelBackupInfo::inst().getGlobalSignals(), &GlobalSignals::fontChanged, this, [=]() { +// // 字体家族、大小变化需重绘,并且字体大小变化也可能会造成显示不全问题 +// if (this->wordWrap()) { +// this->setText(m_text); +// } else { +// QFontMetrics fontMetrics(this->font()); +// int fontSize = fontMetrics.width(m_text); +// if (fontSize > this->width()) { +// this->setText(fontMetrics.elidedText(m_text, Qt::ElideRight, this->width())); +// } else { +// this->setText(m_text); +// } +// } +// }); } /** @@ -53,11 +54,12 @@ MyLabel::MyLabel(const QString& text, QWidget* parent /*= nullptr*/, Qt::Alignme m_bAutoTheme(true) { this->setAlignment(align); - this->setText(text); + this->setDeplayText(text); + this->setScaledContents(true); connect(GlobelBackupInfo::inst().getGlobalSignals(), &GlobalSignals::styleNameChanged, this, [=](bool isDark) { // 只有黑白两色手动跟随主题,其它颜色不需要程序员手动设置(自动即可) - if (!m_bAutoTheme) { + if (!this->m_bAutoTheme) { if (isDark) { this->setFontColor(Qt::white); } else { @@ -66,20 +68,21 @@ MyLabel::MyLabel(const QString& text, QWidget* parent /*= nullptr*/, Qt::Alignme } }); - connect(GlobelBackupInfo::inst().getGlobalSignals(), &GlobalSignals::fontChanged, this, [=]() { - // 字体家族、大小变化需重绘,并且字体大小变化也可能会造成显示不全问题 - if (this->wordWrap()) { - this->setText(m_text); - } else { - QFontMetrics fontMetrics(this->font()); - int fontSize = fontMetrics.width(m_text); - if (fontSize > this->width()) { - this->setText(fontMetrics.elidedText(m_text, Qt::ElideRight, this->width())); - } else { - this->setText(m_text); - } - } - }); + // 主题模块已经将QLabel改为了跟随主题设置,这里暂时去掉 +// connect(GlobelBackupInfo::inst().getGlobalSignals(), &GlobalSignals::fontChanged, this, [=]() { +// // 字体家族、大小变化需重绘,并且字体大小变化也可能会造成显示不全问题 +// if (this->wordWrap()) { +// this->setText(m_text); +// } else { +// QFontMetrics fontMetrics(this->font()); +// int fontSize = fontMetrics.width(m_text); +// if (fontSize > this->width()) { +// this->setText(fontMetrics.elidedText(m_text, Qt::ElideRight, this->width())); +// } else { +// this->setText(m_text); +// } +// } +// }); } MyLabel::~MyLabel() diff --git a/kybackup/component/pixmapbutton.cpp b/kybackup/component/pixmapbutton.cpp new file mode 100644 index 0000000..53e6c1a --- /dev/null +++ b/kybackup/component/pixmapbutton.cpp @@ -0,0 +1,79 @@ +#include "pixmapbutton.h" +#include "imageutil.h" +#include "../gsettingswrapper.h" +#include "../globalbackupinfo.h" + +PixmapButton::PixmapButton(QWidget *parent) : + QPushButton(parent) +{ + this->setCheckable(false); + this->setProperty("useButtonPalette", true); + m_hoverColor = pluginBtnHoverColor(true); + m_clickColor = pluginBtnHoverColor(false); + this->setStyleSheet(QString("QPushButton:!hover:!pressed{background-color:palette(base);border-radius: 6px;}" + "QPushButton:hover{background-color:%1;border-radius: 6px;}" + "QPushButton:pressed{background-color:%2;border-radius: 6px;}").arg(m_hoverColor).arg(m_clickColor)); + + m_iconSize = 16; + + connect(GlobelBackupInfo::inst().getGlobalSignals(), &GlobalSignals::styleNameChanged, this, [=](bool isDark) { + // 深浅主题切换时,因为调色板已经更换,高亮等颜色已经改变,所以要重新加载图标。 + if (isDark) + this->setIcon(ImageUtil::loadTheme(this->m_iconTheme, this->m_defaultIconName, "white", this->m_iconSize)); + else + this->setIcon(ImageUtil::loadTheme(this->m_iconTheme, this->m_defaultIconName, "default", this->m_iconSize)); + + this->m_hoverColor = pluginBtnHoverColor(true); + this->m_clickColor = pluginBtnHoverColor(false); + this->setStyleSheet(QString("QPushButton:!hover:!pressed{background-color:palette(base);border-radius: 6px;}" + "QPushButton:hover{background-color:%1;border-radius: 6px;}" + "QPushButton:pressed{background-color:%2;border-radius: 6px;}").arg(m_hoverColor).arg(m_clickColor)); + }); +} + +void PixmapButton::setThemeIcon(const QString &themeIconName, const QString &defaultIconName, int size) +{ + m_iconTheme = themeIconName; + m_defaultIconName = defaultIconName; + m_iconSize = size; + + this->setIcon(ImageUtil::loadTheme(m_iconTheme, m_defaultIconName, "default", m_iconSize)); +} + +PixmapButton::~PixmapButton() +{} + +QString PixmapButton::pluginBtnHoverColor(bool hoverFlag) +{ + QColor color1, color2; + if (this->parent()) { + QWidget * parent = qobject_cast(this->parent()); + color1 = parent->palette().color(QPalette::Active, QPalette::Button); + color2 = parent->palette().color(QPalette::Active, QPalette::BrightText); + } else { + color1 = palette().color(QPalette::Active, QPalette::Button); + color2 = palette().color(QPalette::Active, QPalette::BrightText); + } + QColor color; + qreal r,g,b,a; + QString hoverColor; + if ((g_GSettingWrapper.isDarkTheme() && hoverFlag) || + (!g_GSettingWrapper.isDarkTheme() && !hoverFlag)) { + r = color1.redF() * 0.8 + color2.redF() * 0.2; + g = color1.greenF() * 0.8 + color2.greenF() * 0.2; + b = color1.blueF() * 0.8 + color2.blueF() * 0.2; + a = color1.alphaF() * 0.8 + color2.alphaF() * 0.2; + } else { + r = color1.redF() * 0.95 + color2.redF() * 0.05; + g = color1.greenF() * 0.95 + color2.greenF() * 0.05; + b = color1.blueF() * 0.95 + color2.blueF() * 0.05; + a = color1.alphaF() * 0.95 + color2.alphaF() * 0.05; + } + color = QColor::fromRgbF(r, g, b, a); + hoverColor = QString("rgba(%1, %2, %3, %4)").arg(color.red()) + .arg(color.green()) + .arg(color.blue()) + .arg(color.alpha()); + return hoverColor; +} + diff --git a/kybackup/component/pixmapbutton.h b/kybackup/component/pixmapbutton.h new file mode 100644 index 0000000..4c8a85a --- /dev/null +++ b/kybackup/component/pixmapbutton.h @@ -0,0 +1,31 @@ +#ifndef PIXMAPBUTTON_H +#define PIXMAPBUTTON_H + +#include + +class PixmapButton : public QPushButton +{ + Q_OBJECT + +public: + explicit PixmapButton(QWidget *parent = nullptr); + ~PixmapButton(); + + // 设置跟随主题图标 + void setThemeIcon(const QString &themeIconName, const QString &defaultIconName = "", int size = 16); + + QString pluginBtnHoverColor(bool hoverFlag); + +private: + // 主题图标 + QString m_iconTheme; + // 默认本地图标文件 + QString m_defaultIconName; + // 主题图标大小 + int m_iconSize; + + QString m_hoverColor; + QString m_clickColor; +}; + +#endif // PIXMAPBUTTON_H diff --git a/kybackup/globalsignals.h b/kybackup/globalsignals.h index 7b265e6..a23368c 100755 --- a/kybackup/globalsignals.h +++ b/kybackup/globalsignals.h @@ -24,7 +24,7 @@ signals: void backgroundColorChanged(); // 字体(家族或大小)变化 - void fontChanged(); + void fontChanged(int fontSize); }; #endif // GLOBALSIGNALS_H diff --git a/kybackup/gsettingswrapper.cpp b/kybackup/gsettingswrapper.cpp index d3f818a..2894280 100755 --- a/kybackup/gsettingswrapper.cpp +++ b/kybackup/gsettingswrapper.cpp @@ -41,7 +41,8 @@ GSettingsWrapper::GSettingsWrapper(token) emit GlobelBackupInfo::inst().getGlobalSignals()->themeIconChanged(); } else if ("systemFont" == key || "systemFontSize" == key) { // 字体大小或字体类型发生变化 - emit GlobelBackupInfo::inst().getGlobalSignals()->fontChanged(); + int fontSize = m_pGsettingThemeData->get("system-font-size").toInt(); + emit GlobelBackupInfo::inst().getGlobalSignals()->fontChanged(fontSize); } }); } diff --git a/kybackup/kybackup.pro b/kybackup/kybackup.pro index 953c62e..f040f01 100755 --- a/kybackup/kybackup.pro +++ b/kybackup/kybackup.pro @@ -52,6 +52,7 @@ HEADERS += \ component/mylineedit.h \ component/mypushbutton.h \ component/mywidget.h \ + component/pixmapbutton.h \ component/pixmaplabel.h \ component/ringsprogressbar.h \ deletebackupdialog.h \ @@ -98,6 +99,7 @@ SOURCES += \ component/mylineedit.cpp \ component/mypushbutton.cpp \ component/mywidget.cpp \ + component/pixmapbutton.cpp \ component/pixmaplabel.cpp \ component/ringsprogressbar.cpp \ deletebackupdialog.cpp \ diff --git a/kybackup/module/databackup.cpp b/kybackup/module/databackup.cpp index 4f8999d..f369b2e 100755 --- a/kybackup/module/databackup.cpp +++ b/kybackup/module/databackup.cpp @@ -18,6 +18,7 @@ #include "../component/ringsprogressbar.h" #include "../component/myfileselect.h" #include "../component/pixmaplabel.h" +#include "../component/pixmapbutton.h" #include "../../common/utils.h" #include "../globalbackupinfo.h" #include "managebackuppointlist.h" @@ -185,11 +186,14 @@ void DataBackup::initFirstWidget() QHBoxLayout *bottomHBoxLayout = new QHBoxLayout; bottomHBoxLayout->addStretch(); // 备份管理 - ClickLabel * backupPointManage = new ClickLabel(tr("Backup Management >>")); + MyPushButton *backupPointManage = new MyPushButton; + backupPointManage->setText(tr("Backup Management >>")); + backupPointManage->setFlat(true); + backupPointManage->setProperty("useButtonPalette", true); QPalette pal(backupPointManage->palette()); - pal.setColor(QPalette::WindowText, QColor(Qt::blue)); + pal.setColor(QPalette::ButtonText, QColor(COLOR_BLUE)); + pal.setColor(QPalette::Button, this->palette().base().color()); backupPointManage->setPalette(pal); - backupPointManage->setToolTip(tr("Backup Management >>")); bottomHBoxLayout->addWidget(backupPointManage); bottomHBoxLayout->addSpacing(20); @@ -199,10 +203,17 @@ void DataBackup::initFirstWidget() bottomVBoxLayout->addSpacing(20); first->setLayout(bottomVBoxLayout); - connect(backupPointManage, &ClickLabel::clicked, this, [=]() { + connect(backupPointManage, &MyPushButton::clicked, this, [=]() { ManageBackupPointList backupManager(first, ManageBackupPointList::DATA); backupManager.exec(); }); + connect(GlobelBackupInfo::inst().getGlobalSignals(), &GlobalSignals::styleNameChanged, this, [=](bool isDark) { + Q_UNUSED(isDark) + // 深浅主题切换时,因为调色板已经更换,高亮等颜色已经改变,所以要重新加载图标。 + QPalette pal(backupPointManage->palette()); + pal.setColor(QPalette::Button, this->palette().base().color()); + backupPointManage->setPalette(pal); + }); addWidget(first); } @@ -316,28 +327,46 @@ void DataBackup::initSecondWidget() editSelect->setMinimumWidth(460); editSelect->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); editSelect->setMaxLength(255); + editSelect->setTextMargins(0, 0, 62, 0); + QHBoxLayout *searchLayout = new QHBoxLayout(editSelect); + searchLayout->setMargin(2); // 删除按钮 - QPushButton *buttonDelete = new QPushButton; - buttonDelete->setFixedSize(36, 36); - buttonDelete->setProperty("isWindowButton", 0x2); - buttonDelete->setProperty("useIconHighlightEffect", 0x8); + PixmapButton *buttonDelete = new PixmapButton; + buttonDelete->setFixedSize(30, 30); + buttonDelete->setThemeIcon("window-close-symbolic", ":/symbos/window-close-symbolic.png"); + buttonDelete->setToolTip(tr("Clear")); buttonDelete->setFlat(true); - buttonDelete->setIcon(QIcon::fromTheme("window-close-symbolic")); connect(buttonDelete, &QPushButton::clicked, this, [=]() { editSelect->setText(""); }); // 添加按钮 - MyPushButton *buttonAdd = new MyPushButton; - buttonAdd->setFixedWidth(70); - buttonAdd->setText(tr("Add")); + PixmapButton *buttonAdd = new PixmapButton; + buttonAdd->setFixedSize(30, 30); + buttonAdd->setThemeIcon("object-select-symbolic", ":/symbos/object-select-symbolic.png"); + buttonAdd->setToolTip(tr("Add")); + buttonAdd->setFlat(true); + searchLayout->addWidget(buttonDelete); + searchLayout->addWidget(buttonAdd); + searchLayout->setSpacing(0); + searchLayout->setAlignment(Qt::AlignRight); + buttonDelete->setVisible(false); + buttonAdd->setVisible(false); + connect(editSelect, &QLineEdit::textChanged, this, [=](const QString& text) { + if (!text.isEmpty()) { + buttonDelete->setVisible(true); + buttonAdd->setVisible(true); + } else { + buttonDelete->setVisible(false); + buttonAdd->setVisible(false); + } + }); + // 选择按钮 MyPushButton *buttonSelect = new MyPushButton; buttonSelect->setText(tr("Select")); hlayoutLine4->addWidget(editSelect); - hlayoutLine4->addWidget(buttonDelete); - hlayoutLine4->addWidget(buttonAdd); hlayoutLine4->addWidget(buttonSelect); - hlayoutLine4->addStretch(); + hlayoutLine4->addSpacing(35); vlayout->addLayout(hlayoutLine4); // 第五行 @@ -417,6 +446,7 @@ void DataBackup::initSecondWidget() if (!selectFiles.isEmpty()) { QString fileName = selectFiles.at(0); editSelect->setText(fileName); + editSelect->setFocus(); } } @@ -539,28 +569,45 @@ void DataBackup::initSecondWidget_inc() editSelect->setMinimumWidth(460); editSelect->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); editSelect->setMaxLength(255); + editSelect->setTextMargins(0, 0, 62, 0); + QHBoxLayout *searchLayout = new QHBoxLayout(editSelect); + searchLayout->setMargin(2); // 删除按钮 - QPushButton *buttonDelete = new QPushButton; - buttonDelete->setFixedSize(36, 36); - buttonDelete->setProperty("isWindowButton", 0x2); - buttonDelete->setProperty("useIconHighlightEffect", 0x8); - buttonDelete->setFlat(true); - buttonDelete->setIcon(QIcon::fromTheme("window-close-symbolic")); + PixmapButton *buttonDelete = new PixmapButton; + buttonDelete->setFixedSize(30, 30); + buttonDelete->setThemeIcon("window-close-symbolic", ":/symbos/window-close-symbolic.png"); + buttonDelete->setToolTip(tr("Clear")); connect(buttonDelete, &QPushButton::clicked, this, [=]() { editSelect->setText(""); }); // 添加按钮 - MyPushButton *buttonAdd = new MyPushButton; - buttonAdd->setFixedSize(70, 36); - buttonAdd->setText(tr("Add")); + PixmapButton *buttonAdd = new PixmapButton; + buttonAdd->setFixedSize(30, 30); + buttonAdd->setThemeIcon("object-select-symbolic", ":/symbos/object-select-symbolic.png"); + buttonAdd->setToolTip(tr("Add")); + searchLayout->addWidget(buttonDelete); + searchLayout->addWidget(buttonAdd); + searchLayout->setSpacing(0); + searchLayout->setAlignment(Qt::AlignRight); + buttonDelete->setVisible(false); + buttonAdd->setVisible(false); + connect(editSelect, &QLineEdit::textChanged, this, [=](const QString& text) { + if (!text.isEmpty()) { + buttonDelete->setVisible(true); + buttonAdd->setVisible(true); + } else { + buttonDelete->setVisible(false); + buttonAdd->setVisible(false); + } + }); + // 选择按钮 MyPushButton *buttonSelect = new MyPushButton; buttonSelect->setText(tr("Select")); hlayoutLine4->addWidget(editSelect); - hlayoutLine4->addWidget(buttonDelete); - hlayoutLine4->addWidget(buttonAdd); hlayoutLine4->addWidget(buttonSelect); - hlayoutLine4->addStretch(); + // hlayoutLine4->addStretch(); + hlayoutLine4->addSpacing(35); vlayout->addLayout(hlayoutLine4); // 第五行 @@ -631,6 +678,7 @@ void DataBackup::initSecondWidget_inc() if (!selectFiles.isEmpty()) { QString fileName = selectFiles.at(0); editSelect->setText(fileName); + editSelect->setFocus(); } } diff --git a/kybackup/module/systembackup.cpp b/kybackup/module/systembackup.cpp index 8467cb0..8039ab0 100755 --- a/kybackup/module/systembackup.cpp +++ b/kybackup/module/systembackup.cpp @@ -136,11 +136,14 @@ void SystemBackup::initFirstWidget() QHBoxLayout *bottomHBoxLayout = new QHBoxLayout; bottomHBoxLayout->addStretch(); // 备份管理 - ClickLabel * backupPointManage = new ClickLabel(tr("Backup Management >>")); + MyPushButton *backupPointManage = new MyPushButton; + backupPointManage->setText(tr("Backup Management >>")); + backupPointManage->setFlat(true); + backupPointManage->setProperty("useButtonPalette", true); QPalette pal(backupPointManage->palette()); - pal.setColor(QPalette::WindowText, QColor(Qt::blue)); + pal.setColor(QPalette::ButtonText, QColor(COLOR_BLUE)); + pal.setColor(QPalette::Button, this->palette().base().color()); backupPointManage->setPalette(pal); - backupPointManage->setToolTip(tr("Backup Management >>")); bottomHBoxLayout->addWidget(backupPointManage); bottomHBoxLayout->addSpacing(20); @@ -150,10 +153,17 @@ void SystemBackup::initFirstWidget() bottomVBoxLayout->addSpacing(20); first->setLayout(bottomVBoxLayout); - connect(backupPointManage, &ClickLabel::clicked, this, [=]() { - ManageBackupPointList backupManager(first); + connect(backupPointManage, &MyPushButton::clicked, this, [=]() { + ManageBackupPointList backupManager(first, ManageBackupPointList::DATA); backupManager.exec(); }); + connect(GlobelBackupInfo::inst().getGlobalSignals(), &GlobalSignals::styleNameChanged, this, [=](bool isDark) { + Q_UNUSED(isDark) + // 深浅主题切换时,因为调色板已经更换,高亮等颜色已经改变,所以要重新加载图标。 + QPalette pal(backupPointManage->palette()); + pal.setColor(QPalette::Button, this->palette().base().color()); + backupPointManage->setPalette(pal); + }); addWidget(first); } diff --git a/kybackup/qt_zh_CN.ts b/kybackup/qt_zh_CN.ts index b3a657d..dcbd119 100755 --- a/kybackup/qt_zh_CN.ts +++ b/kybackup/qt_zh_CN.ts @@ -83,343 +83,348 @@ DataBackup - + Data Backup 数据备份 - + Only files in the /home, /root, and /data directories can be backed up 仅支持备份/home、/root、/data目录下的文件 - + Only files in the /home, /root, and /data/usershare directories can be backed up 仅支持备份/home、/root、/data/usershare目录下的文件 - + Multi-Spot 多点还原 - + Security 安全可靠 - + Protect Data 防止数据丢失 - + Convenient 便捷快速 - + Start Backup 开始备份 - + Update Backup 备份更新 - - + Backup Management >> 备份管理 >> - + Please select backup position 请选择备份位置 - - + + local default path : 本地默认路径: - - + + removable devices path : 移动设备: - - + + Select backup data 选择备份数据 - - + + Add 添加 - - + + Select 选择 - - + + Please select file to backup 请选择备份文件 - - - - + + + + Back 上一步 - - - - + + + Clear + 清除 + + + + + + Next 下一步 - + Default backup location 默认备份位置 - - - - + + + + checking 环境检测 - - - - + + + + preparing 备份准备 - - - - + + + + backuping 备份中 - - - - + + + + finished 备份完成 - + Recheck 重新检测 - + Checking, wait a moment ... 正在检测,请稍等... - + Do not perform other operations during backup to avoid data loss 备份过程中不要做其它操作,以防数据丢失 - + Check whether the remaining capacity of the backup partition is sufficient 检测备份分区空间是否充足··· - + Check whether the remaining capacity of the removable device is sufficient 检测移动设备空间是否充足··· - + Check success 检测成功 - + The storage for backup is enough 备份空间充足 - + Make sure the computer is plugged in or the battery level is above 60% 请确保电脑已连接电源或电量超过60% - + Check failure 检测失败 - - + + Program lock failed, please retry 程序锁定失败,请重试 - - + + There may be other backups or restores being performed 可能有其它备份/还原等任务在执行 - - + + Unsupported task type 不支持的任务类型 - - + + No processing logic was found in the service 没有找到相应的处理逻辑 - - + + Failed to mount the backup partition 备份分区挂载失败 - - + + Check whether there is a backup partition 检查是否有备份分区 - + The filesystem of device is vfat format 移动设备的文件系统是vfat格式 - + Please change filesystem format to ext3、ext4 or ntfs 请换成ext3、ext4、ntfs等文件系统格式 - + The device is read only 移动设备是只读挂载的 - + Please chmod to rw 请修改为读写模式 - - + + The storage for backup is not enough 备份空间不足 - - + + Retry after release space 建议释放空间后重试 - - + + Other backup or restore task is being performed 其它备份还原等操作正在执行 - - + + Please try again later 请稍后重试 - + Backup Name 备份名称 - - + + Name already exists 名称已存在 - + Cancel 取消 - + Do not use computer in case of data loss 请勿使用电脑,以防数据丢失 - + Failed to create the backup point directory 创建备份目录失败 - + Please check backup partition permissions 请检查备份分区权限 - + The backup had been canceled 备份已取消 - + Re-initiate the backup if necessary 如需要可重新进行备份 - + An error occurred during backup 备份期间发生错误 - + Error messages refer to log file : /var/log/backup.log 错误信息请参考日志文件:/var/log/backup.log - + Home Page 返回首页 - + Retry 再试一次 - + The backup is successful 备份成功 - + The backup is failed 备份失败 @@ -1049,22 +1054,6 @@ Close 关闭 - - Theme - 主题 - - - Auto - 跟随主题 - - - Light - 浅色主题 - - - Dark - 深色主题 - Help @@ -1215,14 +1204,14 @@ - - - + + + - - + + @@ -1231,38 +1220,38 @@ 警告 - + Path already exists : 路径已经存在: - - - + + + - - - + + + - + Ok 确定 - + The file or directory does not exist : 文件或目录不存在 - + Only data that exists in the follow directorys can be selected: %1. Path:%2 is not in them. 只有后面目录中的数据可以选择:%1。 @@ -1271,12 +1260,12 @@ - + - + Information 提示 @@ -1316,25 +1305,25 @@ 系统正忙,请稍等 - - + + Please select a backup file or directory 请选择一个备份文件或目录 - + - + Are you sure to cancel the operation? 确定取消当前操作? - + - + Cancel 取消 @@ -1451,286 +1440,285 @@ 开始备份 - - + Backup Management >> 备份管理 >> - + Please select backup position 请选择备份位置 - + local default path : 本地默认路径: - + removable devices path : 移动设备: - - - + + + Back 上一步 - - - + + + Next 下一步 - - - - + + + + checking 环境检测 - - - - + + + + preparing 备份准备 - - - - + + + + backuping 备份中 - - - - + + + + finished 备份完成 - + Recheck 重新检测 - + Checking, wait a moment ... 正在检测,请稍等... - + Do not perform other operations during backup to avoid data loss 备份期间不要做其它操作,以防数据丢失 - + Check whether the remaining capacity of the backup partition is sufficient 检测备份分区空间是否充足··· - + Check whether the remaining capacity of the removable device is sufficient 检测移动设备空间是否充足··· - + Check success 检测成功 - + The storage for backup is enough 备份空间充足 - + Make sure the computer is plugged in or the battery level is above 60% 请确保电脑已连接电源或电量超过60% - + Check failure 检测失败 - - + + Program lock failed, please retry 程序锁定失败,请重试 - - + + There may be other backups or restores being performed 可能有其它备份/还原等任务在执行 - - + + Unsupported task type 不支持的任务类型 - - + + No processing logic was found in the service 没有找到相应的处理逻辑 - - + + Failed to mount the backup partition 备份分区挂载失败 - - + + Check whether there is a backup partition 检查是否有备份分区 - - + + The filesystem of device is vfat format 移动设备的文件系统是vfat格式 - - + + Please change filesystem format to ext3、ext4 or ntfs 请换成ext3、ext4、ntfs等文件系统格式 - - + + The device is read only 移动设备是只读挂载的 - - + + Please chmod to rw 请修改为读写模式 - - + + The storage for backup is not enough 备份空间不足 - - + + Retry after release space 建议释放空间后重试 - - + + Other backup or restore task is being performed 其它备份还原等操作正在执行 - - + + Please try again later 请稍后重试 - + Backup Name 备份名称 - - + + Name already exists 名称已存在 - + factory backup 出厂备份 - + Cancel 取消 - + Do not use computer in case of data loss 请勿使用电脑,以防数据丢失 - + Failed to create the backup point directory 创建备份目录失败 - + Please check backup partition permissions 请检查备份分区权限 - + The system is being compressed to the local disk, please wait patiently... 正压缩系统到本地磁盘,请耐心等待... - + Transferring image file to mobile device, about to be completed... 正在传输image文件到移动设备,即将完成... - + The backup had been canceled 已取消备份 - + Re-initiate the backup if necessary 如需要可重新进行备份 - - + + An error occurred during backup 备份时发生错误 - - + + Error messages refer to log file : /var/log/backup.log 错误信息请参考日志文件:/var/log/backup.log - + Home Page 返回首页 - + Retry 再试一次 - + The backup is successful 备份成功 - + The backup is failed 备份失败 diff --git a/kybackup/resource/language/qt_zh_CN.qm b/kybackup/resource/language/qt_zh_CN.qm index 1b049a650b66a5bcb6b37fd0ca2b790167204151..8101d2cf0ca897d5bcd66492fe25da0b296e92cb 100644 GIT binary patch delta 2737 zcmXZec~lf<5&-b(>FzmuXt^9f4h1wEGYBH5awsY=oWg(($bCwXT?2-w#3rtJ;2IP~ zh*=eJ6E+%+_#$kSdLbEvaALq?v_;k;QhLr?*6{7zN+dOd&nFd zVj6Aij{@+S0PY!NR5=+lce_C+r2$vB8^EK3j13_(dVxFt34neGxXTFXSyBVbdp`oOY$9C_k$&HisedN(k3;=ma2Rm{ zS|6VPn6_h539^sEg<2fY@+9f^luSJiHwTXZL~Ui*dn$m%YZ>{iB7iV6V`ZoSP+unX zJIKThjCKDleDOcY92MiZGytIZDx)7W1I%h*3|icZ=z7v@W(?kK5`b0f>jMB&Gn0^S z5Aeo%rlt_58tp^Ie9p8b)B^-4nf-gu0%%f5#~Y;2@7I%fI?p-B9I#0Ruy-a`7?>V~ zKW>>oCVj_T4}1!+P-LF{BJBk5Tq$$xx`!7enSa$Q0LA;HR|*;TLY8Ho0WdvGmNkkK z6|TziBj3k!C0P(FEBC{_UN|PJOgjw_9w)1LuN@$}TK3IF%oW`;GUJ8prWFnxxkYw= z5k7A!ls%I6Wn*S)Wse^^11!_Yo^Mm4y7@@mpJ#5Vl{ zXX+8herj?Bn6jAk-ASgr$sP!G15mw3I_x36Tge13GV5LTeAYJr%5Jt_C;$i@;ann3 z0Q2tpa&Z}U05*|i`dTi3{W8qb)ugYIT-wjQ`*<#fQfeAvUF`d~U9n#SEU+MriQHj5 z20XN^$%)fRx4Dxgp8(A1;ZB#~Ak#OIg$k~x3b!%8n)_h}R^0rP+z%ela8mW;EE6|$ z5YNLe@!aTE0Ox)(uZ+)Ke*p_bBvWO4-jhUth(x|79PeAy$!{+80q~9GKPZ)9N#~98 z&HHgWa*?zPCp{U`xR%U}=J$BxM6H7Pw&T(Y2)Yn(j$C$tEVh=jr`KR9o+k}fa$Pn?bxyN<#=r!CVVm6h6y`;Q zDA%w1H^9s;xql)DVBtl&*O9ZQk;&WSnT##&!y|dkk9gm_J@SS(N3o=>Z@)eO@PA6C zTguxGVTib5`CWApR=_>^=)g_@$G?&}+vP7m!$JscC1dgwvR+HJJ7nc1a0G2DxLTSPj4PWm;IsTpKmh;rC(5POqCIpT32z_v-{bEXr(rA(D| zEdnDjS5-O~jum@JwMBY@Js@a-sx1r`AiJRYScf5Yf1&zYBkr+n66xAS&Qg+rzmdzo zAd9!C4qd#4q2EEy{u7xzrs@vGNGg6N?RSt~hspRe%n=uv*g9#*|j9%rD3k7j>!k z8El?c)MddX*a8MfhgT9Ec>j+~Xdts5s4J&nwp&jn)1uWa4>2;achq}>u{X>(uKxS4 zIFMTgS#m_(GmI0{+#!=1)z70o!smb2zn#w0&T9B~@IBMV$Ud0~TklBbU}{8gu`M-R~?JTux>LY4)`U07cE3!_A&pmMYSvkDL=inm985k><+A zew@%!GHsJ)AgB=QU;c^?;wm(wTTcM^y&*7fcVgr55iDCr@x@ojG!Pb-{)k^xHzChs z1e3H@$hXCMw;vQr$9iyr&142ItP006VI`#Y6isJ^k&(E;oOS*aR8hE`HUEkqmVrqo0UZU*gxrDo-4#@x_&d x?GeY>*S`j)Vth+}Zt95gJ~pCODs8w5zNHYG6@DP_kB=%Z%6seB1FKy*{|9_i@HGGc delta 2732 zcmXZec~Dem5&-ai$Go}T@Hhnwh=34|8RUpu0un%AxbOSE!QgH!M7I=cSfha?lCT<4 z<8qk914$w!kQBIynrNXh9vC1?3I!FTD~q}tqAOb2ZD{}ceQ##oy#D&@?wRhp%(EG$ z)!h0RfGihal{Xn4K}L&z)ma*Jz&9NPaA_j-CS=Yhz+dIcDS9ySdIN<-~iPnKE zZXQ5fN!t369@S*x1X<(;vhGm;zKaaH0`lrHy#FJJYC8wue;#6d_W~HepB4eDASrS^ ze&7Nm?JoncctJX{q~8%TyNaw#gRDyj08BQJc5jhh2g%eDvZNK7KLP-06gut?0=!Z~ z7Bs`f#`XAolYL7I@ERslTVedp7XaZE40lrrus)d)CdvVVy%hNWH4rv z6Zpkv$%0#qP4XImisOv-SvG)kIiu6`0z?&&*noyj^G-z}f*mHpdFU z+{%R(8OeOf)=aEYJ-K?COz!8m-G2>JnYm|{E4^l zZYU}kiXX1WgDpwqFWX}i2JPc7yFA7)i%4fJf43X2 zLypM!`S$@<^pl3-Fj>*oizri`A^5?FU9xwoJODiHWxJ|ajOV&+ z?;#9OkVva#q{{>ulT7B?$^Pb!ftni2x}uyg;7~G6LzetocCK#>n^n{=Ex@*z^w>=% z@nlhkY<6KD6MK?$uq4-XkeQ8S`K-X5eG{9ri_|_4EDJEt-nD}L?H2&LO2PdMR!Yb{ zLA&K4fK!X$lfYxM8nKHD9Hxb&$FF2krI5>5U~`=o8m{5{YwLxU4H$^oNz!MSO#i3Q z)q@%0D})=Way-f}h56eb0@!RJ3#*0a$FVm8H<8f+a`uu59&L+U+ik#cVq-2Zo!E#I zypGfd$+!36lrS$PGdko=oeJ!wX8GYs+(BfY!gKfvHe0cxNQ)0FJ*ucUREQ5YQq=A@ z!fDY+=C&vXXD{JA4JKFYB)w|MRBy$gVetdSCW=|FJD9pD#hlAD4(bg`k8}Mv6~dJH zKd!?Jh{~!vA=t!6li_lhT3B`YxILR8{4E z4hL$ts>Z((r@|1qe4KRuiHt8N^9NOR#*5YdkW9Bzwas8=^nI#!f1DQft*S5oi_dZN zCM(}o4bNg=YC|6_601~C!Vh3^z0_wLU8lFJWq-ymS~)_NWvE{{ACFc12X#yxrhJXF zddn>iQ~8KY&QiA){ShfRe!eE6>H)aX|U_1g|`WrI!TtCR*!6- z#DHAM^gQ)#zcTFm-^tiW_5AyTI2ZmWGMoBw@Cc$w$2?}Bn@szMxW4KdX7;&Q>@tT% znkAN4i~(4m604pKV}P|w8X)_ISQ~#+t zs9O9WdKISDgDe{m+Z#6n_?n5Q`msCKeITAG;Bf-37VlV8V`apX@eAV2!cF`W@VUnI zhZgMr6-k;uo%tCjot36;;~6wg^G=c_{%8kiPK;pc%dItE)#FYyQJMt^#eWUGM$41% zM?KukC~-3uD~uZrE&mCN>oVzZo%GvGW&>I2AlZJ4eQ(@LuCS6;a|WzJ>qodi^R7q% zfp|8?d8F-kq>~rv*+Zu6Ad7~iNV@{uaRiz9RH`|?58HE0synF0e;=(<)8T2{$Zn}c zUxe3IWZK74TO)3Se<8KSE-s?KlX?zem3lvx1{{4bWus)=HtEzQOl81tWYo9P_2>8_ nV;UgMHF#ns>ZJt^=Rxp8%x~pad#1wO`+id?6n#!+I|}~~^3?5* diff --git a/kybackup/resource/symbos/object-select-symbolic.png b/kybackup/resource/symbos/object-select-symbolic.png new file mode 100644 index 0000000000000000000000000000000000000000..c8aab27a6aa681040c17b48f4d92daa7d70c060a GIT binary patch literal 263 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9GGLLkg|>2BR0px{nV z7sn8b-m8<(@-{gLwA%NwUTBReez_PA*F^hG?=969%95@~( z%t_h2`Q}XX{C{SOEZ0tyP5tiAa7M>?a~W^5R7I`a?$(Ri4;Y?wGoE?FG^cU$?s83m z+ZN?2PbW1kDayF5IVsEY=mm!$wUxd9lN*1z<}|d=oXY&|e2IAS%39x~Q=jK)$$sT1 zWA1x*?+la5ggw_+*%p+3&sw!(@os^3)kc$dax;BS?bjFnz@`~cCqC2BR0pkR%s zi(`mI@6ljJt^*1jd)^xUTKjF&x3zJP4aB%Fx|-Z*6sanodPz+w;^4j||L!!*Y@HeG za&1=8y}Sa36Z1~aJ#GHH(QG5Xl9!9hu5Ej!XFv2iXu0;Cx90MvZOLzZ1UmQ1`5ZPi y@aK?@-gxWC!itd1D&aZ4ZOL;Eo}bTofc4p(?WJ?HmI(sg!QkoY=d#Wzp$PyE7*3r4 literal 0 HcmV?d00001