[Libreoffice-commits] core.git: Branch 'distro/collabora/cp-6.2' - 2 commits - include/sfx2 sfx2/source
Michael Meeks (via logerrit)
logerrit at kemper.freedesktop.org
Mon Jan 6 13:28:02 UTC 2020
include/sfx2/sidebar/Panel.hxx | 5 +
sfx2/source/sidebar/Deck.cxx | 13 ++-
sfx2/source/sidebar/DeckLayouter.cxx | 112 +++++++++++++++++++-----------
sfx2/source/sidebar/Panel.cxx | 18 ++++
sfx2/source/sidebar/SidebarController.cxx | 1
5 files changed, 104 insertions(+), 45 deletions(-)
New commits:
commit 39055f5e32fc0314353e95252ed54ae591881445
Author: Michael Meeks <michael.meeks at collabora.com>
AuthorDate: Sat Jan 4 22:37:31 2020 +0000
Commit: Michael Meeks <michael.meeks at collabora.com>
CommitDate: Mon Jan 6 14:27:36 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 <jenkinscollaboraoffice at gmail.com>
Reviewed-by: Michael Meeks <michael.meeks at collabora.com>
diff --git a/sfx2/source/sidebar/Deck.cxx b/sfx2/source/sidebar/Deck.cxx
index 074334c2e415..60ea6b71ebba 100644
--- a/sfx2/source/sidebar/Deck.cxx
+++ b/sfx2/source/sidebar/Deck.cxx
@@ -385,6 +385,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 33d6dc62f4b9..66f60f2ef03e 100644
--- a/sfx2/source/sidebar/DeckLayouter.cxx
+++ b/sfx2/source/sidebar/DeckLayouter.cxx
@@ -78,6 +78,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,
@@ -246,6 +248,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,
@@ -256,6 +269,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());
@@ -268,8 +283,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();
@@ -313,8 +331,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;
}
@@ -338,6 +363,8 @@ sal_Int32 PlacePanels (
if (pScrollContainerWindow != nullptr)
pScrollContainerWindow->SetSeparators(aSeparators);
+ rScrollContainer.Invalidate(aInvalidRegions);
+
return nY;
}
commit aacc5ed083b53a99719034ff3b87105741982609
Author: Michael Meeks <michael.meeks at collabora.com>
AuthorDate: Sat Jan 4 18:09:20 2020 +0000
Commit: Michael Meeks <michael.meeks at collabora.com>
CommitDate: Mon Jan 6 14:27:28 2020 +0100
sidebar: allow panels to lurk around instead of being disposed.
Creating and destroying sidebar panels is done remarkably often - on
changes of context eg. The process is remarkably expensive - loading
UI XML files, processing them etc. and is un-necessary.
Instead let panels lurk around for future use - particularly in the
Properties deck which gets the most thrash. This gives a big speedup
particularly noticable on mobile where it could take several seconds
to load switch between panels for eg. shape vs. slide properties when
tapping to edit text.
Change-Id: I497e77432c11bbd1e35a8a8716519cabc3730e61
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/86233
Tested-by: Michael Meeks <michael.meeks at collabora.com>
Reviewed-by: Michael Meeks <michael.meeks at collabora.com>
diff --git a/include/sfx2/sidebar/Panel.hxx b/include/sfx2/sidebar/Panel.hxx
index 2beec47dfea6..7bcdfdcd8d4b 100644
--- a/include/sfx2/sidebar/Panel.hxx
+++ b/include/sfx2/sidebar/Panel.hxx
@@ -58,6 +58,10 @@ public:
const OUString& GetId() const { return msPanelId;}
void TriggerDeckLayouting() { maDeckLayoutTrigger(); }
+ /// Set whether a panel should be present but invisible / inactive
+ void SetLurkMode(bool bLurk);
+ bool IsLurking() const { return mbLurking; }
+
virtual void Resize() override;
virtual void DataChanged (const DataChangedEvent& rEvent) override;
virtual void ApplySettings(vcl::RenderContext& rRenderContext) override;
@@ -70,6 +74,7 @@ private:
css::uno::Reference<css::ui::XUIElement> mxElement;
css::uno::Reference<css::ui::XSidebarPanel> mxPanelComponent;
bool mbIsExpanded;
+ bool mbLurking;
const std::function<void()> maDeckLayoutTrigger;
const std::function<Context()> maContextAccess;
diff --git a/sfx2/source/sidebar/Deck.cxx b/sfx2/source/sidebar/Deck.cxx
index fba9f1330833..074334c2e415 100644
--- a/sfx2/source/sidebar/Deck.cxx
+++ b/sfx2/source/sidebar/Deck.cxx
@@ -209,17 +209,25 @@ bool Deck::ProcessWheelEvent(CommandEvent const * pCommandEvent)
*/
void Deck::ResetPanels(const SharedPanelContainer& rPanelContainer)
{
- // First dispose old panels we no longer need.
+ SharedPanelContainer aHiddens;
+
+ // First hide old panels we don't need just now.
for (VclPtr<Panel> & rpPanel : maPanels)
{
bool bFound = false;
for (const auto & i : rPanelContainer)
bFound = bFound || (rpPanel.get() == i.get());
if (!bFound) // this one didn't survive.
- rpPanel.disposeAndClear();
+ {
+ rpPanel->SetLurkMode(true);
+ aHiddens.push_back(rpPanel);
+ }
}
maPanels = rPanelContainer;
+ // Hidden ones always at the end
+ maPanels.insert(std::end(maPanels), std::begin(aHiddens), std::end(aHiddens));
+
RequestLayoutInternal();
}
diff --git a/sfx2/source/sidebar/DeckLayouter.cxx b/sfx2/source/sidebar/DeckLayouter.cxx
index 0337c7cc46d6..33d6dc62f4b9 100644
--- a/sfx2/source/sidebar/DeckLayouter.cxx
+++ b/sfx2/source/sidebar/DeckLayouter.cxx
@@ -289,7 +289,7 @@ sal_Int32 PlacePanels (
}
}
- if (rPanel.IsExpanded())
+ if (rPanel.IsExpanded() && !rPanel.IsLurking())
{
rPanel.Show();
@@ -353,46 +353,51 @@ void GetRequestedSizes (
for (LayoutItem& item : rLayoutItems)
{
- ui::LayoutSize aLayoutSize (ui::LayoutSize(0,0,0));
- if (item.mpPanel != nullptr)
+ item.maLayoutSize = ui::LayoutSize(0,0,0);
+
+ if (item.mpPanel == nullptr)
+ continue;
+
+ if (item.mpPanel->IsLurking())
{
- if (rLayoutItems.size() == 1
- && item.mpPanel->IsTitleBarOptional())
- {
- // There is only one panel and its title bar is
- // optional => hide it.
- rAvailableHeight -= nDeckSeparatorHeight;
- item.mbShowTitleBar = false;
- }
- else
- {
- // Show the title bar and a separator above and below
- // the title bar.
- const sal_Int32 nPanelTitleBarHeight(
- Theme::GetInteger(Theme::Int_PanelTitleBarHeight)
- * item.mpPanel->GetDPIScaleFactor());
-
- rAvailableHeight -= nPanelTitleBarHeight;
- rAvailableHeight -= nDeckSeparatorHeight;
- }
+ item.mbShowTitleBar = false;
+ continue;
+ }
- if (item.mpPanel->IsExpanded())
+ if (rLayoutItems.size() == 1
+ && item.mpPanel->IsTitleBarOptional())
+ {
+ // There is only one panel and its title bar is
+ // optional => hide it.
+ rAvailableHeight -= nDeckSeparatorHeight;
+ item.mbShowTitleBar = false;
+ }
+ else
+ {
+ // Show the title bar and a separator above and below
+ // the title bar.
+ const sal_Int32 nPanelTitleBarHeight(
+ Theme::GetInteger(Theme::Int_PanelTitleBarHeight)
+ * item.mpPanel->GetDPIScaleFactor());
+
+ rAvailableHeight -= nPanelTitleBarHeight;
+ rAvailableHeight -= nDeckSeparatorHeight;
+ }
+
+ if (item.mpPanel->IsExpanded())
+ {
+ Reference<ui::XSidebarPanel> xPanel(item.mpPanel->GetPanelComponent());
+ if (xPanel.is())
{
- Reference<ui::XSidebarPanel> xPanel(item.mpPanel->GetPanelComponent());
- if (xPanel.is())
- {
- aLayoutSize = xPanel->getHeightForWidth(rContentBox.GetWidth());
-
- const sal_Int32 nWidth = xPanel->getMinimalWidth();
- if (nWidth > rMinimalWidth)
- rMinimalWidth = nWidth;
- }
- else
- aLayoutSize = ui::LayoutSize(MinimalPanelHeight, -1, 0);
+ item.maLayoutSize = xPanel->getHeightForWidth(rContentBox.GetWidth());
+
+ const sal_Int32 nWidth = xPanel->getMinimalWidth();
+ if (nWidth > rMinimalWidth)
+ rMinimalWidth = nWidth;
}
+ else
+ item.maLayoutSize = ui::LayoutSize(MinimalPanelHeight, -1, 0);
}
-
- item.maLayoutSize = aLayoutSize;
}
}
diff --git a/sfx2/source/sidebar/Panel.cxx b/sfx2/source/sidebar/Panel.cxx
index 7968f667b92d..dc4ea895d26d 100644
--- a/sfx2/source/sidebar/Panel.cxx
+++ b/sfx2/source/sidebar/Panel.cxx
@@ -57,6 +57,7 @@ Panel::Panel(const PanelDescriptor& rPanelDescriptor,
, mxElement()
, mxPanelComponent()
, mbIsExpanded(bIsInitiallyExpanded)
+ , mbLurking(false)
, maDeckLayoutTrigger(rDeckLayoutTrigger)
, maContextAccess(rContextAccess)
, mxFrame(rxFrame)
@@ -70,6 +71,12 @@ Panel::~Panel()
assert(!mpTitleBar);
}
+void Panel::SetLurkMode(bool bLurk)
+{
+ // cf. DeckLayouter
+ mbLurking = bLurk;
+}
+
void Panel::ApplySettings(vcl::RenderContext& rRenderContext)
{
rRenderContext.SetBackground(Theme::GetPaint(Theme::Paint_PanelBackground).GetWallpaper());
@@ -77,9 +84,14 @@ void Panel::ApplySettings(vcl::RenderContext& rRenderContext)
boost::property_tree::ptree Panel::DumpAsPropertyTree()
{
- boost::property_tree::ptree aTree(vcl::Window::DumpAsPropertyTree());
- aTree.put("type", "panel");
- return aTree;
+ if (!IsLurking())
+ {
+ boost::property_tree::ptree aTree(vcl::Window::DumpAsPropertyTree());
+ aTree.put("type", "panel");
+ return aTree;
+ }
+ else
+ return boost::property_tree::ptree();
}
void Panel::dispose()
diff --git a/sfx2/source/sidebar/SidebarController.cxx b/sfx2/source/sidebar/SidebarController.cxx
index 91405791c727..f11ce95e7213 100644
--- a/sfx2/source/sidebar/SidebarController.cxx
+++ b/sfx2/source/sidebar/SidebarController.cxx
@@ -716,6 +716,7 @@ void SidebarController::CreatePanels(const OUString& rDeckId, const Context& rCo
Panel *const pPanel(pDeck->GetPanel(rPanelContexDescriptor.msId));
if (pPanel != nullptr)
{
+ pPanel->SetLurkMode(false);
aNewPanels[nWriteIndex] = pPanel;
pPanel->SetExpanded( rPanelContexDescriptor.mbIsInitiallyVisible );
++nWriteIndex;
More information about the Libreoffice-commits
mailing list