sfx2/source/sidebar/Deck.cxx | 1 + sfx2/source/sidebar/DeckLayouter.cxx | 35 +++++++++++++++++++++++++++++++---- 2 files changed, 32 insertions(+), 4 deletions(-)
New commits: commit 182f0e95dbbdc64f7340b0fbb7af7720536a1140 Author: Michael Meeks <michael.me...@collabora.com> AuthorDate: Sat Jan 4 22:37:31 2020 +0000 Commit: Michael Meeks <michael.me...@collabora.com> CommitDate: Mon Jan 6 19:17:33 2020 +0100 sidebar: improve invalidation tracking for Panels. Only emit an invalidation on panels that change position. Ensure we invalidate the ScrollContainerWindow for updated separators. Emit a single vcl::Region for an invalidation rather than per panel. Change-Id: I5452791ac9a7d1a9b8604c7704d24641160c275b Reviewed-on: https://gerrit.libreoffice.org/c/core/+/86234 Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoff...@gmail.com> Reviewed-by: Michael Meeks <michael.me...@collabora.com> Reviewed-on: https://gerrit.libreoffice.org/c/core/+/86288 Tested-by: Jenkins diff --git a/sfx2/source/sidebar/Deck.cxx b/sfx2/source/sidebar/Deck.cxx index 26723738b7ee..a015b0db2bd6 100644 --- a/sfx2/source/sidebar/Deck.cxx +++ b/sfx2/source/sidebar/Deck.cxx @@ -394,6 +394,7 @@ void Deck::ScrollContainerWindow::Paint(vcl::RenderContext& rRenderContext, cons void Deck::ScrollContainerWindow::SetSeparators (const ::std::vector<sal_Int32>& rSeparators) { maSeparators = rSeparators; + Invalidate(); } } } // end of namespace sfx2::sidebar diff --git a/sfx2/source/sidebar/DeckLayouter.cxx b/sfx2/source/sidebar/DeckLayouter.cxx index c83ced15b334..bc1bf6e93986 100644 --- a/sfx2/source/sidebar/DeckLayouter.cxx +++ b/sfx2/source/sidebar/DeckLayouter.cxx @@ -86,6 +86,8 @@ namespace { const sal_Int32 nHeightToDistribute, const sal_Int32 nContainerHeight, const bool bMinimumHeightIsBase); + bool MoveResizePixel(const VclPtr<vcl::Window> &pWindow, + const Point &rNewPos, const Size &rNewSize); sal_Int32 PlacePanels ( ::std::vector<LayoutItem>& rLayoutItems, const sal_Int32 nWidth, @@ -254,6 +256,17 @@ tools::Rectangle LayoutPanels ( return aBox; } +bool MoveResizePixel(const VclPtr<vcl::Window> &pWindow, + const Point &rNewPos, const Size &rNewSize) +{ + Point aCurPos = pWindow->GetPosPixel(); + Size aCurSize = pWindow->GetSizePixel(); + if (rNewPos == aCurPos && aCurSize == rNewSize) + return false; + pWindow->setPosSizePixel(rNewPos.X(), rNewPos.Y(), rNewSize.Width(), rNewSize.Height()); + return true; +} + sal_Int32 PlacePanels ( ::std::vector<LayoutItem>& rLayoutItems, const sal_Int32 nWidth, @@ -264,6 +277,8 @@ sal_Int32 PlacePanels ( const sal_Int32 nDeckSeparatorHeight (Theme::GetInteger(Theme::Int_DeckSeparatorHeight)); sal_Int32 nY (0); + vcl::Region aInvalidRegions; + // Assign heights and places. for(::std::vector<LayoutItem>::const_iterator iItem(rLayoutItems.begin()), iEnd(rLayoutItems.end()); @@ -276,8 +291,11 @@ sal_Int32 PlacePanels ( Panel& rPanel (*iItem->mpPanel); // Separator above the panel title bar. - aSeparators.push_back(nY); - nY += nDeckSeparatorHeight; + if (!rPanel.IsLurking()) + { + aSeparators.push_back(nY); + nY += nDeckSeparatorHeight; + } // Place the title bar. VclPtr<PanelTitleBar> pTitleBar = rPanel.GetTitleBar(); @@ -321,8 +339,15 @@ sal_Int32 PlacePanels ( } // Place the panel. - rPanel.setPosSizePixel(0, nY, nWidth, nPanelHeight); - rPanel.Invalidate(); + Point aNewPos(0, nY); + Size aNewSize(nWidth, nPanelHeight); + + // Only invalidate if we moved + if (MoveResizePixel(&rPanel, aNewPos, aNewSize)) + { + tools::Rectangle aRect(aNewPos, aNewSize); + aInvalidRegions.Union(rPanel.PixelToLogic(aRect)); + } nY += nPanelHeight; } @@ -346,6 +371,8 @@ sal_Int32 PlacePanels ( if (pScrollContainerWindow != nullptr) pScrollContainerWindow->SetSeparators(aSeparators); + rScrollContainer.Invalidate(aInvalidRegions); + return nY; } _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits