diff --git a/src/widgets/centertopwidget.cpp b/src/widgets/centertopwidget.cpp index f5c5e982..d6ff6b36 100644 --- a/src/widgets/centertopwidget.cpp +++ b/src/widgets/centertopwidget.cpp @@ -17,6 +17,12 @@ using namespace DDESESSIONCC; const int TOP_TIP_MAX_LENGTH = 60; const int TOP_TIP_SPACING = 10; +#ifdef ENABLE_DSS_SNIPE +static const QString localeNameKey = "localeName"; +static const QString longDateFormatKey = "longDateFormat"; +static const QString shortTimeFormatKey = "shortTimeFormat"; +#endif // ENABLE_DSS_SNIPE + CenterTopWidget::CenterTopWidget(QWidget *parent) : QWidget(parent) , m_currentUser(nullptr) @@ -64,6 +70,9 @@ void CenterTopWidget::setCurrentUser(User *user) return; } +#ifdef ENABLE_DSS_SNIPE + updateRegionFormatConnection(user); +#endif // ENABLE_DSS_SNIPE m_currentUser = QPointer(user); if (!m_currentUser.isNull()) { for (auto connect : m_currentUserConnects) { @@ -86,6 +95,10 @@ void CenterTopWidget::setCurrentUser(User *user) QTimer::singleShot(0, this, [this, user] { updateTimeFormat(user->isUse24HourFormat()); }); + +#ifdef ENABLE_DSS_SNIPE + updateUserDateTimeFormat(); +#endif // ENABLE_DSS_SNIPE } @@ -157,3 +170,89 @@ void CenterTopWidget::onDConfigPropertyChanged(const QString &key, const QVarian } } +#ifdef ENABLE_DSS_SNIPE +void CenterTopWidget::onUserRegionFormatValueChanged(const QDBusMessage &dbusMessage) +{ + QList arguments = dbusMessage.arguments(); + if (1 != arguments.count()) + return; + + QString key = dbusMessage.arguments().at(0).toString(); + if (key == localeNameKey || key == shortTimeFormatKey || key == longDateFormatKey) { + updateUserDateTimeFormat(); + } +} + +QString CenterTopWidget::getRegionFormatConfigPath(const User *user) const +{ + if (!user) + return QString(); + + QDBusInterface configInter("org.desktopspec.ConfigManager", "/", "org.desktopspec.ConfigManager", QDBusConnection::systemBus()); + if (!configInter.isValid()) { + qWarning("Can't acquire config manager. error:\"%s\"", + qPrintable(QDBusConnection::systemBus().lastError().message())); + return QString(); + } + QDBusReply dbusReply = configInter.call("acquireManagerV2", + (uint)user->uid(), + QString(QCoreApplication::applicationName()), + QString("org.deepin.region-format"), + QString("")); + if (configInter.lastError().isValid() ) { + qWarning("Call failed: %s", qPrintable(configInter.lastError().message())); + return QString(); + } + return dbusReply.value().path(); +} + +QString CenterTopWidget::getRegionFormatValue(const QString &userConfigDbusPath, const QString &key) const +{ + if (userConfigDbusPath.isEmpty()) + return QString(); + QDBusInterface managerInter("org.desktopspec.ConfigManager", userConfigDbusPath, "org.desktopspec.ConfigManager.Manager", QDBusConnection::systemBus()); + QDBusReply reply = managerInter.call("value", key); + if (managerInter.lastError().isValid() ) { + qWarning("Call failed: %s", qPrintable(managerInter.lastError().message())); + return QString(); + } + return reply.value().toString(); +} + +void CenterTopWidget::updateRegionFormatConnection(const User *user) +{ + if (!user) { + return; + } + + // disconnect old user + if (m_currentUser) { + QString dbusPath = getRegionFormatConfigPath(m_currentUser); + if (dbusPath.isEmpty()) + return; + QDBusConnection::systemBus().disconnect("org.desktopspec.ConfigManager", dbusPath, "org.desktopspec.ConfigManager.Manager", + "valueChanged", "s", this, + SLOT(onUserRegionFormatValueChanged(const QDBusMessage&))); + } + + // connect new user + QString dbusPath = getRegionFormatConfigPath(user); + if (dbusPath.isEmpty()) + return; + + QDBusConnection::systemBus().connect("org.desktopspec.ConfigManager", dbusPath, "org.desktopspec.ConfigManager.Manager", + "valueChanged", "s", this, + SLOT(onUserRegionFormatValueChanged(const QDBusMessage&))); +} + +void CenterTopWidget::updateUserDateTimeFormat() +{ + QString userConfigDbusPath = getRegionFormatConfigPath(m_currentUser); + + QString localeName = qApp->applicationName() == "dde-lock" ? QLocale::system().name() : getRegionFormatValue(userConfigDbusPath, localeNameKey); + QString shortTimeFormat = getRegionFormatValue(userConfigDbusPath, shortTimeFormatKey); + QString longDateFormat = getRegionFormatValue(userConfigDbusPath, longDateFormatKey); + + m_timeWidget->updateLocale(localeName, shortTimeFormat, longDateFormat); +} +#endif // ENABLE_DSS_SNIPE diff --git a/src/widgets/centertopwidget.h b/src/widgets/centertopwidget.h index bda892c9..5354ee75 100644 --- a/src/widgets/centertopwidget.h +++ b/src/widgets/centertopwidget.h @@ -34,6 +34,17 @@ public slots: void setTopTipText(const QString &text); void updateTopTipWidget(); +#ifdef ENABLE_DSS_SNIPE +private slots: + void onUserRegionFormatValueChanged(const QDBusMessage &dbusMessage); + +private: + QString getRegionFormatConfigPath(const User *user) const; + QString getRegionFormatValue(const QString &userConfigDbusPath, const QString& key) const; + void updateRegionFormatConnection(const User *user); + void updateUserDateTimeFormat(); +#endif // ENABLE_DSS_SNIPE + private: QPointer m_currentUser; TimeWidget *m_timeWidget; diff --git a/src/widgets/timewidget.cpp b/src/widgets/timewidget.cpp index 7b1d9446..e9af307c 100644 --- a/src/widgets/timewidget.cpp +++ b/src/widgets/timewidget.cpp @@ -80,6 +80,13 @@ void TimeWidget::refreshTime() QString date_format = shortDateFormat.at(m_shortDateIndex) + " " + weekdayFormat.at(m_weekdayIndex); m_dateLabel->setText(m_locale.toString(QDateTime::currentDateTime(), date_format)); + +#ifdef ENABLE_DSS_SNIPE + if (!m_shortTimeFormat.isEmpty() && !m_longDateFormat.isEmpty()) { + m_timeLabel->setText(m_locale.toString(QTime::currentTime(), m_shortTimeFormat)); + m_dateLabel->setText(m_locale.toString(QDate::currentDate(), m_longDateFormat)); + } +#endif // ENABLE_DSS_SNIPE } /** @@ -122,3 +129,16 @@ QSize TimeWidget::sizeHint() const { return QSize(QWidget::sizeHint().width(), m_dateLabel->fontMetrics().height() + m_timeLabel->fontMetrics().height()); } + +#ifdef ENABLE_DSS_SNIPE +void TimeWidget::updateLocale(const QString &locale, const QString &shortTimeFormat, const QString &longDateFormat) +{ + m_locale = QLocale(locale); + if (!shortTimeFormat.isEmpty()) + m_shortTimeFormat = shortTimeFormat; + if (!longDateFormat.isEmpty()) + m_longDateFormat = longDateFormat; + + refreshTime(); +} +#endif // ENABLE_DSS_SNIPE diff --git a/src/widgets/timewidget.h b/src/widgets/timewidget.h index 4705fea8..bc5eff25 100644 --- a/src/widgets/timewidget.h +++ b/src/widgets/timewidget.h @@ -23,6 +23,10 @@ class TimeWidget : public QWidget void updateLocale(const QLocale &locale); QSize sizeHint() const override; +#ifdef ENABLE_DSS_SNIPE + void updateLocale(const QString &locale, const QString &shortTimeFormat = "", const QString &longDateFormat = ""); +#endif // ENABLE_DSS_SNIPE + public Q_SLOTS: void setWeekdayFormatType(int type); void setShortDateFormat(int type); @@ -42,6 +46,11 @@ public Q_SLOTS: int m_weekdayIndex = 0; int m_shortDateIndex = 0; int m_shortTimeIndex = 0; + +#ifdef ENABLE_DSS_SNIPE + QString m_shortTimeFormat; + QString m_longDateFormat; +#endif // ENABLE_DSS_SNIPE }; #endif // TIMEWIDGET_H