sfx2/source/control/thumbnailview.cxx |  139 +++++++++++++++++-----------------
 1 file changed, 72 insertions(+), 67 deletions(-)

New commits:
commit 100743f8ad5a2328810af8b2ee19e535850ec901
Author:     Andreas Heinisch <andreas.heini...@yahoo.de>
AuthorDate: Sat Oct 26 16:56:28 2024 +0200
Commit:     Andreas Heinisch <andreas.heini...@yahoo.de>
CommitDate: Mon Oct 28 19:31:16 2024 +0100

    tdf#162510 - Consider pinned items for the scroll bar in the start center
    
    Change-Id: If753ab1ea0df0bc7938532f6e614b94252fa3f9b
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/175681
    Tested-by: Jenkins
    Reviewed-by: Andreas Heinisch <andreas.heini...@yahoo.de>

diff --git a/sfx2/source/control/thumbnailview.cxx 
b/sfx2/source/control/thumbnailview.cxx
index a54fb990e91a..8156d841d10f 100644
--- a/sfx2/source/control/thumbnailview.cxx
+++ b/sfx2/source/control/thumbnailview.cxx
@@ -371,9 +371,28 @@ void ThumbnailView::CalculateItemPositions(bool 
bScrollBarUsed)
     if (nVItemSpace == -1) // auto, split up extra space to use as vertical 
spacing
         nVItemSpace = nVSpace / (mnVisLines+1);
 
+    // tdf#162510 - calculate maximum number of rows
+    size_t nItemCountPinned = 0;
+#if !ENABLE_WASM_STRIP_RECENT
+    bool bPinnedItems = true;
+    for (size_t i = 0; bPinnedItems && i < nItemCount; ++i)
+    {
+        ThumbnailViewItem& rItem = *mFilteredItemList[i];
+        if (auto const pRecentDocsItem = 
dynamic_cast<RecentDocsViewItem*>(&rItem))
+        {
+            if (pRecentDocsItem->isPinned())
+                ++nItemCountPinned;
+            else
+                bPinnedItems = false;
+        }
+    }
+#endif
+
     // calculate maximum number of rows
     // Floor( (M+N-1)/N )==Ceiling( M/N )
-    mnLines = (static_cast<tools::Long>(nItemCount)+mnCols-1) / mnCols;
+    mnLines = (static_cast<tools::Long>(nItemCount - nItemCountPinned) + 
mnCols - 1) / mnCols;
+    // tdf#162510 - add pinned items to number of lines
+    mnLines += (static_cast<tools::Long>(nItemCountPinned) + mnCols - 1) / 
mnCols;
 
     if ( !mnLines )
         mnLines = 1;
@@ -407,87 +426,73 @@ void ThumbnailView::CalculateItemPositions(bool 
bScrollBarUsed)
     size_t nFirstItem = (bScrollBarUsed ? nHiddenLines : mnFirstLine) * mnCols;
     size_t nLastItem = nFirstItem + (mnVisLines + 1) * mnCols;
 
-    // If want also draw parts of items in the last line,
-    // then we add one more line if parts of this line are visible
-
-#if !ENABLE_WASM_STRIP_RECENT
-    bool bPinnedItems = true;
-#endif
-    size_t nCurCount = 0;
-    for ( size_t i = 0; i < nItemCount; i++ )
+    // tdf#162510 - helper for in order to handle accessibility events
+    auto handleAccessibleEvent = [&](ThumbnailViewItem& rItem, bool bIsVisible)
     {
-        ThumbnailViewItem& rItem = *mFilteredItemList[i];
-
-#if !ENABLE_WASM_STRIP_RECENT
-        // tdf#38742 - show pinned items in a separate line
-        if (auto const pRecentDocsItem = 
dynamic_cast<RecentDocsViewItem*>(&rItem))
+        if (ImplHasAccessibleListeners())
         {
-            if (bPinnedItems && !pRecentDocsItem->isPinned())
-            {
-                bPinnedItems = false;
-                // Start a new line only if the entire line is not filled
-                if (nCurCount % mnCols && nCurCount > nFirstItem)
-                {
-                    x = nStartX;
-                    y += mnItemHeight + nVItemSpace;
-                }
-                nCurCount = 0;
-            }
+            css::uno::Any aOldAny, aNewAny;
+            if (bIsVisible)
+                aNewAny <<= 
css::uno::Reference<css::accessibility::XAccessible>(
+                    rItem.GetAccessible(false));
+            else
+                aOldAny <<= 
css::uno::Reference<css::accessibility::XAccessible>(
+                    rItem.GetAccessible(false));
+            
ImplFireAccessibleEvent(css::accessibility::AccessibleEventId::CHILD, aOldAny, 
aNewAny);
         }
-#endif
+    };
 
-        if ((nCurCount >= nFirstItem) && (nCurCount < nLastItem))
+    // tdf#162510 - helper to set visibility and update layout
+    auto updateItemLayout = [&](ThumbnailViewItem& rItem, bool bIsVisible, 
size_t& nVisibleCount)
+    {
+        if (bIsVisible != rItem.isVisible())
         {
-            if( !rItem.isVisible())
-            {
-                if ( ImplHasAccessibleListeners() )
-                {
-                    css::uno::Any aOldAny, aNewAny;
-
-                    aNewAny <<= 
css::uno::Reference<css::accessibility::XAccessible>(rItem.GetAccessible( false 
));
-                    ImplFireAccessibleEvent( 
css::accessibility::AccessibleEventId::CHILD, aOldAny, aNewAny );
-                }
-
-                rItem.show(true);
-
-                maItemStateHdl.Call(&rItem);
-            }
+            handleAccessibleEvent(rItem, bIsVisible);
+            rItem.show(bIsVisible);
+            maItemStateHdl.Call(&rItem);
+        }
 
-            rItem.setDrawArea(::tools::Rectangle( Point(x,y), 
Size(mnItemWidth, mnItemHeight) ));
-            
rItem.calculateItemsPosition(mnThumbnailHeight,mnItemPadding,mpItemAttrs->nMaxTextLength,mpItemAttrs.get());
+        if (bIsVisible)
+        {
+            rItem.setDrawArea(::tools::Rectangle(Point(x, y), 
Size(mnItemWidth, mnItemHeight)));
+            rItem.calculateItemsPosition(mnThumbnailHeight, mnItemPadding,
+                                         mpItemAttrs->nMaxTextLength, 
mpItemAttrs.get());
 
-            if ( !((nCurCount+1) % mnCols) )
+            if ((nVisibleCount + 1) % mnCols)
+                x += mnItemWidth + nHItemSpace;
+            else
             {
                 x = nStartX;
-                y += mnItemHeight+nVItemSpace;
+                y += mnItemHeight + nVItemSpace;
             }
-            else
-                x += mnItemWidth+nHItemSpace;
+            ++nVisibleCount;
         }
-        else
-        {
-            if( rItem.isVisible())
-            {
-                if ( ImplHasAccessibleListeners() )
-                {
-                    css::uno::Any aOldAny, aNewAny;
-
-                    aOldAny <<= 
css::uno::Reference<css::accessibility::XAccessible>(rItem.GetAccessible( false 
));
-                    ImplFireAccessibleEvent( 
css::accessibility::AccessibleEventId::CHILD, aOldAny, aNewAny );
-                }
-
-                rItem.show(false);
-
-                maItemStateHdl.Call(&rItem);
-            }
+    };
 
-        }
+    size_t nCurCountVisible = 0;
+#if !ENABLE_WASM_STRIP_RECENT
+    // tdf#162510 - process pinned items
+    for (size_t i = 0; i < nItemCountPinned; i++)
+        updateItemLayout(*mFilteredItemList[i], nFirstItem <= i && i < 
nLastItem, nCurCountVisible);
 
-        ++nCurCount;
+    // tdf#162510 - start a new line only if the entire line is not filled 
with pinned items
+    if (nCurCountVisible && nCurCountVisible % mnCols)
+    {
+        x = nStartX;
+        y += mnItemHeight + nVItemSpace;
     }
 
-    // arrange ScrollBar, set values and show it
-    mnLines = (nCurCount+mnCols-1)/mnCols;
+    // tdf#162510 - adjust first item to take into account the new line after 
pinned items
+    auto nFirstItemAdjustment = mnCols - nItemCountPinned % mnCols;
+    if (nFirstItemAdjustment <= nFirstItem)
+        nFirstItem -= nFirstItemAdjustment;
+#endif
+
+    // If want also draw parts of items in the last line,
+    // then we add one more line if parts of this line are visible
+    nCurCountVisible = 0;
+    for (size_t i = nItemCountPinned; i < nItemCount; i++)
+        updateItemLayout(*mFilteredItemList[i], nFirstItem <= i && i < 
nLastItem, nCurCountVisible);
 
     // check if scroll is needed
     mbScroll = mnLines > mnVisLines;

Reply via email to