1313#include < QDebug>
1414#include < QDir>
1515#include < QScreen>
16+ #include < DConfig>
1617
1718#include " utils.hpp"
1819#include < qpa/qplatformnativeinterface.h>
3839
3940Q_LOGGING_CATEGORY (DdcPersonnalizationTreelandWorker, " dcc-personalization-treeland-woker" )
4041
42+ namespace {
43+ constexpr char DccAppId[] = " org.deepin.dde.control-center" ;
44+ constexpr char PersonalizationConfig[] = " org.deepin.dde.control-center.personalization" ;
45+ constexpr char TreelandDesktopWallpaperCustomizedKey[] = " treelandDesktopWallpaperCustomized" ;
46+
47+ QString globalThemeBaseId (QString themeId)
48+ {
49+ if (themeId.endsWith (" .light" )) {
50+ themeId.chop (6 );
51+ } else if (themeId.endsWith (" .dark" )) {
52+ themeId.chop (5 );
53+ }
54+ return themeId;
55+ }
56+ }
57+
4158TreeLandWorker::TreeLandWorker (PersonalizationModel *model, QObject *parent)
4259: PersonalizationWorker(model, parent)
4360{
44-
61+ #ifdef Enable_Treeland
62+ initDConfig ();
63+ #endif
4564}
4665
4766TreeLandWorker::~TreeLandWorker ()
@@ -60,6 +79,29 @@ TreeLandWorker::~TreeLandWorker()
6079
6180#ifdef Enable_Treeland
6281
82+ void TreeLandWorker::initDConfig ()
83+ {
84+ m_dconfig = Dtk::Core::DConfig::create (DccAppId, PersonalizationConfig, QString (), this );
85+ if (!m_dconfig || !m_dconfig->isValid ()) {
86+ qCWarning (DdcPersonnalizationTreelandWorker) << " Failed to create personalization DConfig" ;
87+ return ;
88+ }
89+
90+ m_desktopWallpaperCustomized = m_dconfig->value (TreelandDesktopWallpaperCustomizedKey, false ).toBool ();
91+ }
92+
93+ void TreeLandWorker::setDesktopWallpaperCustomized (bool customized)
94+ {
95+ if (m_desktopWallpaperCustomized == customized) {
96+ return ;
97+ }
98+
99+ m_desktopWallpaperCustomized = customized;
100+ if (m_dconfig && m_dconfig->isValid ()) {
101+ m_dconfig->setValue (TreelandDesktopWallpaperCustomizedKey, customized);
102+ }
103+ }
104+
63105void TreeLandWorker::setWallpaperForMonitor (const QString &screen, const QString &url, PersonalizationExport::WallpaperSetOption option, PersonalizationExport::WallpaperSetType type)
64106{
65107 if (checkWallpaperLockStatus ()) {
@@ -79,7 +121,9 @@ void TreeLandWorker::setWallpaperForMonitor(const QString &screen, const QString
79121void TreeLandWorker::setBackgroundForMonitor (const QString &monitorName, const QString &url, PersonalizationExport::WallpaperSetType type)
80122{
81123 m_wallpaperWorker->setWantToSetWallpaper (nullptr );
82- setWallpaper (monitorName, url, WallpaperContext::wallpaper_role_desktop, type);
124+ if (setWallpaper (monitorName, url, WallpaperContext::wallpaper_role_desktop, type)) {
125+ setDesktopWallpaperCustomized (true );
126+ }
83127}
84128
85129QString TreeLandWorker::getBackgroundForMonitor (const QString &monitorName)
@@ -118,7 +162,9 @@ void TreeLandWorker::setDefault(const QJsonObject &value)
118162void TreeLandWorker::setAppearanceTheme (const QString &id, bool keepAuto)
119163{
120164 qCDebug (DdcPersonnalizationTreelandWorker) << " setAppearanceTheme:" << id;
121- if (!keepAuto) {
165+
166+ if (!keepAuto) { // 如果是控制中心设置,keepAuto = false
167+ // 控制中心ui显示的深浅色由 dde-appearance 提供,而不是treeland。如果设置为自动,不要把真实的外观显示到 dde-appearance,否则UI就会显示错误
122168 PersonalizationWorker::setAppearanceTheme (id);
123169 }
124170 if (id == " .light" && m_appearanceTheme != PersonalizationAppearanceContext::theme_type::theme_type_light) {
@@ -131,7 +177,13 @@ void TreeLandWorker::setAppearanceTheme(const QString &id, bool keepAuto)
131177 m_appearanceTheme = PersonalizationAppearanceContext::theme_type::theme_type_auto;
132178 m_appearanceContext->set_window_theme_type (PersonalizationAppearanceContext::theme_type::theme_type_auto);
133179 } else {
134- qWarning () << " error id" << id;
180+ qWarning () << " error id" << id << m_appearanceTheme;
181+ return ;
182+ }
183+
184+ if (!keepAuto) {
185+ // 刷新对应外观下的主题
186+ handleGlobalTheme (m_globalTheme);
135187 }
136188}
137189
@@ -239,6 +291,12 @@ void TreeLandWorker::setGlobalTheme(const QString &themeId)
239291 if (m_globalTheme == themeId) {
240292 return ;
241293 }
294+
295+ bool globalThemeChanged = globalThemeBaseId (themeId) != globalThemeBaseId (m_globalTheme);
296+ if (globalThemeChanged) {
297+ setDesktopWallpaperCustomized (false );
298+ }
299+
242300 m_globalTheme = themeId;
243301 handleGlobalTheme (themeId);
244302 PersonalizationWorker::setGlobalTheme (themeId);
@@ -337,12 +395,12 @@ WallpaperContext *TreeLandWorker::getOrCreateWallpaperContext(const QString &mon
337395 return nullptr ;
338396}
339397
340- void TreeLandWorker::setWallpaper (const QString &monitorName, const QString &url, uint32_t role, uint32_t type)
398+ bool TreeLandWorker::setWallpaper (const QString &monitorName, const QString &url, uint32_t role, uint32_t type)
341399{
342400 qCDebug (DdcPersonnalizationTreelandWorker) << " setWallpaper:" << monitorName << " url:" << url << " role:" << role << " type:" << type;
343401
344402 if (checkWallpaperLockStatus ()) {
345- return ;
403+ return false ;
346404 }
347405
348406 QString dest;
@@ -354,7 +412,7 @@ void TreeLandWorker::setWallpaper(const QString &monitorName, const QString &url
354412 }
355413
356414 if (dest.isEmpty ())
357- return ;
415+ return false ;
358416
359417 auto updateWallpaperMetaData = [monitorName, url](QMap<QString, WallpaperMetaData *> &wallpapers) {
360418 if (!wallpapers.contains (monitorName)) {
@@ -388,18 +446,22 @@ void TreeLandWorker::setWallpaper(const QString &monitorName, const QString &url
388446 }
389447 } else {
390448 qCWarning (DdcPersonnalizationTreelandWorker) << " Failed to get wallpaper context for:" << monitorName;
449+ return false ;
391450 }
392451 }
452+
453+ return true ;
393454}
394455
395456void TreeLandWorker::handleGlobalTheme (const QString &themeId)
396457{
397458 uint8_t mode = m_appearanceTheme;
398459 ThemeModel *globalTheme = m_model->getGlobalThemeModel ();
460+ const QString &baseThemeId = globalThemeBaseId (themeId);
399461
400462 const QMap<QString, QJsonObject> &itemList = globalTheme->getList ();
401- if (itemList.contains (themeId )) {
402- const QString &themePath = itemList.value (themeId ).value (" Path" ).toString ();
463+ if (itemList.contains (baseThemeId )) {
464+ const QString &themePath = itemList.value (baseThemeId ).value (" Path" ).toString ();
403465 KeyFile theme (' ,' );
404466 theme.loadFile (themePath + QDir::separator () + QStringLiteral (" index.theme" ));
405467 QString defaultTheme = theme.getStr (" Deepin Theme" , " DefaultTheme" );
@@ -424,6 +486,8 @@ void TreeLandWorker::handleGlobalTheme(const QString &themeId)
424486 applyGlobalTheme (theme, defaultTheme, defaultTheme, themePath);
425487 break ;
426488 }
489+ default :
490+ qWarning () << " theme mode invalid: " << mode;
427491 }
428492 }
429493}
@@ -467,7 +531,9 @@ void TreeLandWorker::applyGlobalTheme(KeyFile &theme, const QString &themeName,
467531 return setGlobalItem (" AppTheme" , TYPEGTK );
468532 }
469533
470- setGlobalFile (" Wallpaper" , TYPEWALLPAPER );
534+ if (!m_desktopWallpaperCustomized) {
535+ setGlobalFile (" Wallpaper" , TYPEWALLPAPER );
536+ }
471537 setGlobalFile (" LockBackground" , TYPEGREETERBACKGROUND );
472538 setGlobalItem (" IconTheme" , TYPEICON );
473539 setGlobalItem (" CursorTheme" , TYPECURSOR );
@@ -552,6 +618,8 @@ void TreeLandWorker::active()
552618 });
553619
554620 PersonalizationWorker::active ();
621+
622+ m_globalTheme = m_model->getGlobalThemeModel ()->getDefault ();
555623}
556624
557625PersonalizationManager::PersonalizationManager (QObject *parent)
0 commit comments