svx/source/inc/StylesPreviewWindow.hxx      |    3 +++
 svx/source/tbxctrls/StylesPreviewWindow.cxx |   28 ++++++++++++++++++++++------
 2 files changed, 25 insertions(+), 6 deletions(-)

New commits:
commit a0a20a7e2ba19c1b6eedd9aaa5a41e7a6e93c95b
Author:     Szymon Kłos <szymon.k...@collabora.com>
AuthorDate: Fri Jun 2 14:07:03 2023 +0200
Commit:     Caolán McNamara <caolan.mcnam...@collabora.com>
CommitDate: Fri Jun 2 15:39:14 2023 +0200

    Styles preview widget should cache images
    
    Change-Id: I3ee370e5d3ef4227681c4a973ac6f24f9aa241e1
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/152556
    Tested-by: Caolán McNamara <caolan.mcnam...@collabora.com>
    Reviewed-by: Caolán McNamara <caolan.mcnam...@collabora.com>

diff --git a/svx/source/inc/StylesPreviewWindow.hxx 
b/svx/source/inc/StylesPreviewWindow.hxx
index 354b99673dbe..33aaf513f28d 100644
--- a/svx/source/inc/StylesPreviewWindow.hxx
+++ b/svx/source/inc/StylesPreviewWindow.hxx
@@ -121,11 +121,14 @@ public:
 
     void Select(const OUString& rStyleName);
     void RequestStylesListUpdate();
+    static VclPtr<VirtualDevice> GetCachedPreview(const std::pair<OUString, 
OUString>& rStyle);
 
 private:
     void UpdateStylesList();
     void UpdateSelection();
     bool Command(const CommandEvent& rEvent);
+
+    static std::map<OUString, VclPtr<VirtualDevice>> aPreviewCache;
 };
 
 class StylesPreviewWindow_Impl final : public InterimItemWindow, public 
StylesPreviewWindow_Base
diff --git a/svx/source/tbxctrls/StylesPreviewWindow.cxx 
b/svx/source/tbxctrls/StylesPreviewWindow.cxx
index 8f5dfea0b2c8..d5e6791cb412 100644
--- a/svx/source/tbxctrls/StylesPreviewWindow.cxx
+++ b/svx/source/tbxctrls/StylesPreviewWindow.cxx
@@ -60,6 +60,8 @@
 
 #include <vcl/commandevent.hxx>
 
+std::map<OUString, VclPtr<VirtualDevice>> 
StylesPreviewWindow_Base::aPreviewCache;
+
 StyleStatusListener::StyleStatusListener(
     StylesPreviewWindow_Base* pPreviewControl,
     const css::uno::Reference<css::frame::XDispatchProvider>& 
xDispatchProvider)
@@ -460,6 +462,25 @@ void StylesListUpdateTask::Invoke()
     m_rStylesList.UpdateSelection();
 }
 
+VclPtr<VirtualDevice>
+StylesPreviewWindow_Base::GetCachedPreview(const std::pair<OUString, 
OUString>& rStyle)
+{
+    if (aPreviewCache.find(rStyle.second) != aPreviewCache.end())
+        return aPreviewCache[rStyle.second];
+    else
+    {
+        VclPtr<VirtualDevice> pImg = VclPtr<VirtualDevice>::Create();
+        const Size aSize(100, 30);
+        pImg->SetOutputSizePixel(aSize);
+
+        StyleItemController aStyleController(rStyle);
+        aStyleController.Paint(*pImg);
+        aPreviewCache[rStyle.second] = pImg;
+
+        return pImg;
+    }
+}
+
 void StylesPreviewWindow_Base::UpdateStylesList()
 {
     m_aAllStyles = m_aDefaultStyles;
@@ -487,12 +508,7 @@ void StylesPreviewWindow_Base::UpdateStylesList()
     m_xStylesView->clear();
     for (const auto& rStyle : m_aAllStyles)
     {
-        ScopedVclPtr<VirtualDevice> pImg = VclPtr<VirtualDevice>::Create();
-        const Size aSize(100, 30);
-        pImg->SetOutputSizePixel(aSize);
-
-        StyleItemController aStyleController(rStyle);
-        aStyleController.Paint(*pImg);
+        VclPtr<VirtualDevice> pImg = GetCachedPreview(rStyle);
 
         m_xStylesView->append(rStyle.first, rStyle.second, pImg);
     }

Reply via email to