include/sfx2/thumbnailview.hxx              |    9 +++++++--
 sfx2/inc/recentdocsview.hxx                 |    3 +++
 sfx2/inc/templatedefaultview.hxx            |    3 +++
 sfx2/source/control/recentdocsview.cxx      |   20 ++++++++++++--------
 sfx2/source/control/templatedefaultview.cxx |   14 +++++++++-----
 sfx2/source/control/thumbnailview.cxx       |   26 ++++++++++++++++----------
 6 files changed, 50 insertions(+), 25 deletions(-)

New commits:
commit 5b025a8fdc7e2e905aefa017aa05b02b5568fe66
Author:     Dan Williams <[email protected]>
AuthorDate: Wed Dec 10 11:05:47 2025 -0600
Commit:     Ilmari Lauhakangas <[email protected]>
CommitDate: Sat Dec 13 16:04:06 2025 +0100

    tdf#169727 update ThumbnailView colors for system theme changes
    
    The ThumbnailView never updated cached colors after creation, leading to
    wrong background colors when the system theme changed while LO was
    running (eg between Dark/Light mode). Since subclasses need to override
    the parent class colors, we must first let subclasses update internal
    cached colors then copy those to the item attributes. Then during
    Paint() requery style settings to ensure our colors are up to date.
    
    Change-Id: I19bbfb296ba213cf7ad53eff8bd24fe291679184
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/195402
    Tested-by: Hossein <[email protected]>
    Tested-by: Jenkins
    Reviewed-by: Hossein <[email protected]>
    (cherry picked from commit 92b013bdb4d567b98bfcf42a0831abe42117691c)
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/195599
    Reviewed-by: Ilmari Lauhakangas <[email protected]>
    (cherry picked from commit ded39ec772e6fc0c4d943e6ca0673a89d89493cc)
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/195600

diff --git a/include/sfx2/thumbnailview.hxx b/include/sfx2/thumbnailview.hxx
index bfc566860939..a85d07c76401 100644
--- a/include/sfx2/thumbnailview.hxx
+++ b/include/sfx2/thumbnailview.hxx
@@ -17,6 +17,7 @@
 #include <vector>
 
 #include <vcl/customweld.hxx>
+#include <vcl/settings.hxx>
 
 class BitmapEx;
 class ThumbnailViewItem;
@@ -260,8 +261,8 @@ protected:
 
     virtual void OnItemDblClicked (ThumbnailViewItem *pItem);
 
-    // Set Item colors from the ThumbnailView colors
-    SAL_DLLPRIVATE void UpdateColors();
+    // Update internal colors from system color scheme or other sources
+    SAL_DLLPRIVATE void UpdateColors(const StyleSettings& rSettings);
 
 protected:
 
@@ -282,6 +283,10 @@ protected:
     SAL_DLLPRIVATE bool ImplHasAccessibleListeners() const;
     DECL_DLLPRIVATE_LINK( ImplScrollHdl, weld::ScrolledWindow&, void );
 
+private:
+    // Update Item colors from internal colors
+    void updateItemAttrsFromColors();
+
 protected:
 
     std::vector< std::unique_ptr<ThumbnailViewItem> > mItemList;
diff --git a/sfx2/inc/recentdocsview.hxx b/sfx2/inc/recentdocsview.hxx
index 38199818a34e..13beacc0db1e 100644
--- a/sfx2/inc/recentdocsview.hxx
+++ b/sfx2/inc/recentdocsview.hxx
@@ -85,6 +85,9 @@ public:
 
     void setFilter(ApplicationType aFilter);
 
+protected:
+    void UpdateColors(const StyleSettings& rSettings);
+
 private:
     virtual bool MouseButtonDown( const MouseEvent& rMEvt ) override;
 
diff --git a/sfx2/inc/templatedefaultview.hxx b/sfx2/inc/templatedefaultview.hxx
index 1771ad3d8759..0bfd88c2c07e 100644
--- a/sfx2/inc/templatedefaultview.hxx
+++ b/sfx2/inc/templatedefaultview.hxx
@@ -24,6 +24,9 @@ public:
     virtual bool MouseButtonDown(const MouseEvent& rMEvt) override;
 
     void createContextMenu();
+
+protected:
+    void UpdateColors(const StyleSettings& rSettings);
 };
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sfx2/source/control/recentdocsview.cxx 
b/sfx2/source/control/recentdocsview.cxx
index ac1b89984f5b..190a76f084be 100644
--- a/sfx2/source/control/recentdocsview.cxx
+++ b/sfx2/source/control/recentdocsview.cxx
@@ -73,16 +73,9 @@ 
RecentDocsView::RecentDocsView(std::unique_ptr<weld::ScrolledWindow> xWindow, st
     setItemMaxTextLength( 30 );
     setItemDimensions( mnItemMaxSize, mnItemMaxSize, gnTextHeight, 
gnItemPadding );
 
-    maFillColor = Color(ColorTransparency, 
officecfg::Office::Common::Help::StartCenter::StartCenterThumbnailsBackgroundColor::get());
-    maTextColor = Color(ColorTransparency, 
officecfg::Office::Common::Help::StartCenter::StartCenterThumbnailsTextColor::get());
-
-    const StyleSettings& rSettings = 
Application::GetSettings().GetStyleSettings();
-    maHighlightColor = rSettings.GetHighlightColor();
-    maHighlightTextColor = rSettings.GetHighlightTextColor();
-
     mfHighlightTransparence = 0.75;
 
-    UpdateColors();
+    UpdateColors(Application::GetSettings().GetStyleSettings());
 }
 
 RecentDocsView::~RecentDocsView()
@@ -96,6 +89,17 @@ RecentDocsView::~RecentDocsView()
     }
 }
 
+void RecentDocsView::UpdateColors(const StyleSettings& rSettings)
+{
+    ThumbnailView::UpdateColors(rSettings);
+
+    maFillColor = Color(ColorTransparency, 
officecfg::Office::Common::Help::StartCenter::StartCenterThumbnailsBackgroundColor::get());
+    maTextColor = Color(ColorTransparency, 
officecfg::Office::Common::Help::StartCenter::StartCenterThumbnailsTextColor::get());
+
+    maHighlightColor = rSettings.GetHighlightColor();
+    maHighlightTextColor = rSettings.GetHighlightTextColor();
+}
+
 bool RecentDocsView::typeMatchesExtension(ApplicationType type, 
std::u16string_view rExt)
 {
     bool bRet = false;
diff --git a/sfx2/source/control/templatedefaultview.cxx 
b/sfx2/source/control/templatedefaultview.cxx
index ad7a935e72a0..656625d23e19 100644
--- a/sfx2/source/control/templatedefaultview.cxx
+++ b/sfx2/source/control/templatedefaultview.cxx
@@ -31,17 +31,21 @@ 
TemplateDefaultView::TemplateDefaultView(std::unique_ptr<weld::ScrolledWindow> x
     ThumbnailView::setItemDimensions( nItemMaxSize, nItemMaxSize, 
gnTextHeight, gnItemPadding );
     updateThumbnailDimensions(nItemMaxSize);
 
+    mfHighlightTransparence = 0.75;
+
+    UpdateColors(Application::GetSettings().GetStyleSettings());
+}
+
+void TemplateDefaultView::UpdateColors(const StyleSettings& rSettings)
+{
+    TemplateLocalView::UpdateColors(rSettings);
+
     // startcenter specific settings
     maFillColor = Color(ColorTransparency, 
officecfg::Office::Common::Help::StartCenter::StartCenterThumbnailsBackgroundColor::get());
     maTextColor = Color(ColorTransparency, 
officecfg::Office::Common::Help::StartCenter::StartCenterThumbnailsTextColor::get());
 
-    const StyleSettings& rSettings = 
Application::GetSettings().GetStyleSettings();
     maHighlightColor = rSettings.GetHighlightColor();
     maHighlightTextColor = rSettings.GetHighlightTextColor();
-
-    mfHighlightTransparence = 0.75;
-
-    UpdateColors();
 }
 
 void TemplateDefaultView::showAllTemplates()
diff --git a/sfx2/source/control/thumbnailview.cxx 
b/sfx2/source/control/thumbnailview.cxx
index 606999e2ad2d..ae94fe37fe1c 100644
--- a/sfx2/source/control/thumbnailview.cxx
+++ b/sfx2/source/control/thumbnailview.cxx
@@ -288,22 +288,24 @@ void ThumbnailView::ImplInit()
     mbAllowMultiSelection = true;
     maFilterFunc = ViewFilterAll();
 
-    const StyleSettings& rSettings = 
Application::GetSettings().GetStyleSettings();
-    maFillColor = rSettings.GetFieldColor();
-    maTextColor = rSettings.GetWindowTextColor();
-    maHighlightColor = rSettings.GetHighlightColor();
-    maHighlightTextColor = rSettings.GetHighlightTextColor();
+    mpStartSelRange = mFilteredItemList.end();
 
     mfHighlightTransparence = 
SvtOptionsDrawinglayer::GetTransparentSelectionPercent() * 0.01;
+    mpItemAttrs->nMaxTextLength = 0;
 
-    mpStartSelRange = mFilteredItemList.end();
-
-    UpdateColors();
+    UpdateColors(Application::GetSettings().GetStyleSettings());
+    updateItemAttrsFromColors();
+}
 
-    mpItemAttrs->nMaxTextLength = 0;
+void ThumbnailView::UpdateColors(const StyleSettings& rSettings)
+{
+    maFillColor = rSettings.GetFieldColor();
+    maTextColor = rSettings.GetWindowTextColor();
+    maHighlightColor = rSettings.GetHighlightColor();
+    maHighlightTextColor = rSettings.GetHighlightTextColor();
 }
 
-void ThumbnailView::UpdateColors()
+void ThumbnailView::updateItemAttrsFromColors()
 {
     mpItemAttrs->aFillColor = maFillColor.getBColor();
     mpItemAttrs->aTextColor = maTextColor.getBColor();
@@ -952,6 +954,10 @@ void ThumbnailView::Paint(vcl::RenderContext& 
rRenderContext, const ::tools::Rec
 {
     rRenderContext.Push(vcl::PushFlags::ALL);
 
+    // Re-read settings colors to handle system theme changes on-the-fly
+    UpdateColors(rRenderContext.GetSettings().GetStyleSettings());
+    updateItemAttrsFromColors();
+
     rRenderContext.SetTextFillColor();
     rRenderContext.SetBackground(maFillColor);
 

Reply via email to