sw/inc/format.hxx                       |    5 ++-
 sw/qa/uitest/writer_tests4/tdf167956.py |    2 -
 sw/source/core/attr/format.cxx          |   45 ++++++++++++++++++--------------
 3 files changed, 31 insertions(+), 21 deletions(-)

New commits:
commit 236a12a1cf151869fc1a3b357d63f6486364f308
Author:     Szymon Kłos <[email protected]>
AuthorDate: Mon Nov 24 13:01:55 2025 +0000
Commit:     Szymon Kłos <[email protected]>
CommitDate: Tue Dec 16 09:55:30 2025 +0100

    sw: setup favourite style once
    
    - the GrabBag values don't change after import much
    - better to parse qFormat once and setup favourite value
      we can cache and return quickly when requested
    - it is more efficient than checking grab bag every time we do
      iteration over styles
    
    Change-Id: I7b54831a84cd6528a40cf853f0d4f5061f05af82
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/194442
    (cherry picked from commit 9fc06b81e954d91a63f80a54953d636139426ee2)
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/194803
    Reviewed-by: Szymon Kłos <[email protected]>
    Tested-by: Jenkins

diff --git a/sw/inc/format.hxx b/sw/inc/format.hxx
index 9933a98926c8..bc1ddda6b3ca 100644
--- a/sw/inc/format.hxx
+++ b/sw/inc/format.hxx
@@ -63,6 +63,7 @@ class SW_DLLPUBLIC SwFormat : public sw::BorderCacheOwner, 
public sw::Broadcasti
     bool   m_bAutoUpdateOnDirectFormat : 1;/**< TRUE: Set attributes of a 
whole paragraph
                                        at format (UI-side!). */
     bool m_bHidden : 1;
+    bool m_bIsFavourite : 1;        ///< Show in the basic UI
     std::shared_ptr<SfxGrabBagItem> m_pGrabBagItem; ///< Style InteropGrabBag.
     virtual void InvalidateInSwFntCache(sal_uInt16) {};
     virtual void InvalidateInSwFntCache() {};
@@ -73,6 +74,7 @@ protected:
     SwFormat( const SwFormat& rFormat );
     virtual void SwClientNotify(const SwModify&, const SfxHint&) override;
     void Destr();
+    void ParseFavourites();
 
 public:
 
@@ -179,7 +181,8 @@ public:
     bool IsAuto() const                 { return m_bAutoFormat; }
     void SetAuto( bool bNew )           { m_bAutoFormat = bNew; }
 
-    bool IsFavourite() const;
+    bool IsFavourite() const            { return m_bIsFavourite; }
+    void SetFavourite(bool bValue)      { m_bIsFavourite = bValue; }
 
     bool IsHidden() const               { return m_bHidden; }
     void SetHidden( bool bValue )       { m_bHidden = bValue; }
diff --git a/sw/qa/uitest/writer_tests4/tdf167956.py 
b/sw/qa/uitest/writer_tests4/tdf167956.py
index 731808135ac9..ddf182ddc183 100644
--- a/sw/qa/uitest/writer_tests4/tdf167956.py
+++ b/sw/qa/uitest/writer_tests4/tdf167956.py
@@ -27,7 +27,7 @@ class tdf167956(UITestCase):
             xWriterDoc = self.xUITest.getTopFocusWindow()
             xStylesView = xWriterDoc.getChild("stylesview")
             self.wait_until_styles_are_displayed(xStylesView)
-            self.assertEqual("10", get_state_as_dict(xStylesView)["Children"])
+            self.assertLessEqual("10", 
get_state_as_dict(xStylesView)["Children"])
             self.assertEqual("Default Paragraph Style", 
get_state_as_dict(xStylesView)["SelectEntryText"])
 
         with self.ui_test.load_file(get_url_for_data_file("tdf167956.docx")):
diff --git a/sw/source/core/attr/format.cxx b/sw/source/core/attr/format.cxx
index e985b0822a0f..58e0680d86da 100644
--- a/sw/source/core/attr/format.cxx
+++ b/sw/source/core/attr/format.cxx
@@ -49,6 +49,7 @@ SwFormat::SwFormat( SwAttrPool& rPool, const UIName& 
rFormatNm,
     m_bAutoUpdateOnDirectFormat = false; // LAYER_IMPL
     m_bAutoFormat = true;
     m_bFormatInDTOR = m_bHidden = false;
+    m_bIsFavourite = true;
 
     if( pDrvdFrame )
     {
@@ -69,6 +70,7 @@ SwFormat::SwFormat( const SwFormat& rFormat ) :
     m_bFormatInDTOR = false; // LAYER_IMPL
     m_bAutoFormat = rFormat.m_bAutoFormat;
     m_bHidden = rFormat.m_bHidden;
+    m_bIsFavourite = rFormat.m_bIsFavourite;
     m_bAutoUpdateOnDirectFormat = rFormat.m_bAutoUpdateOnDirectFormat;
 
     if( auto pDerived = rFormat.DerivedFrom() )
@@ -117,6 +119,7 @@ SwFormat &SwFormat::operator=(const SwFormat& rFormat)
 
     m_bAutoFormat = rFormat.m_bAutoFormat;
     m_bHidden = rFormat.m_bHidden;
+    m_bIsFavourite = rFormat.m_bIsFavourite;
     m_bAutoUpdateOnDirectFormat = rFormat.m_bAutoUpdateOnDirectFormat;
     return *this;
 }
@@ -727,6 +730,29 @@ void SwFormat::SetGrabBagItem(const uno::Any& rVal)
         m_pGrabBagItem = std::make_shared<SfxGrabBagItem>();
 
     m_pGrabBagItem->PutValue(rVal, 0);
+
+    ParseFavourites();
+}
+
+void SwFormat::ParseFavourites()
+{
+    const auto& rItems = m_pGrabBagItem->GetGrabBag();
+    const auto aIt = rItems.find(u"qFormat"_ustr);
+    if (aIt != rItems.end())
+    {
+        sal_Int32 nVal = 0;
+        if (aIt->second >>= nVal)
+        {
+            if (nVal == 0)
+                SetFavourite(false);
+            else
+                SetFavourite(true);
+        }
+    }
+    else
+    {
+        SetFavourite(false);
+    }
 }
 
 std::unique_ptr<SvxBrushItem> SwFormat::makeBackgroundBrushItem(bool bInP) 
const
@@ -756,25 +782,6 @@ void SwFormat::RemoveAllUnos()
     SwClientNotify(*this, aMsgHint);
 }
 
-bool SwFormat::IsFavourite() const
-{
-    if (!m_pGrabBagItem) return false;
-
-    const auto& rItems = m_pGrabBagItem->GetGrabBag();
-    const auto aIt = rItems.find(u"qFormat"_ustr);
-    if (aIt != rItems.end())
-    {
-        sal_Int32 nVal = 0;
-        if (aIt->second >>= nVal)
-        {
-            if (nVal == 1)
-                return true;
-        }
-    }
-
-    return false;
-}
-
 bool SwFormat::IsUsed() const
 {
     bool isUsed = false;

Reply via email to