diff options
author | Caolán McNamara <caolanm@redhat.com> | 2020-02-11 15:53:17 +0000 |
---|---|---|
committer | Caolán McNamara <caolanm@redhat.com> | 2020-02-12 17:28:50 +0100 |
commit | d81489fe40f93925296d8cf5b49e74607ab833cf (patch) | |
tree | 96811ced53fac71e48c67291e28500995b5a1d48 | |
parent | 5b1a757993862042b673954735ecd4379b3f1c32 (diff) |
only freeze/thaw if we have to
because gtk will relayout and things jump around confusingly
and unnecessarily
Change-Id: I817e803f8ad7e523e5855326fc097f8798ddb679
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/88526
Tested-by: Jenkins
Reviewed-by: Caolán McNamara <caolanm@redhat.com>
-rw-r--r-- | basctl/source/basicide/bastype2.cxx | 14 | ||||
-rw-r--r-- | basctl/source/basicide/bastype3.cxx | 9 | ||||
-rw-r--r-- | basctl/source/inc/bastype2.hxx | 1 |
3 files changed, 22 insertions, 2 deletions
diff --git a/basctl/source/basicide/bastype2.cxx b/basctl/source/basicide/bastype2.cxx index 378700bb5325..642b5c7adaea 100644 --- a/basctl/source/basicide/bastype2.cxx +++ b/basctl/source/basicide/bastype2.cxx @@ -851,6 +851,7 @@ SbTreeListBox::SbTreeListBox(std::unique_ptr<weld::TreeView> xControl, weld::Win : m_xControl(std::move(xControl)) , m_xIter(m_xControl->make_iterator()) , m_pTopLevel(pTopLevel) + , m_bFreezeOnFirstAddRemove(false) , m_aNotifier(*this) { m_xControl->connect_row_activated(LINK(this, SbTreeListBox, OpenCurrentHdl)); @@ -880,7 +881,6 @@ void SbTreeListBox::ScanEntry( const ScriptDocument& rDocument, LibraryLocation // can be called multiple times for updating! // actually test if basic's in the tree already?! - m_xControl->freeze(); // level 1: BasicManager (application, document, ...) bool bDocumentRootEntry = FindRootEntry(rDocument, eLocation, *m_xIter); if (bDocumentRootEntry && m_xControl->get_row_expanded(*m_xIter)) @@ -891,7 +891,6 @@ void SbTreeListBox::ScanEntry( const ScriptDocument& rDocument, LibraryLocation OUString aImage(GetRootEntryBitmaps(rDocument)); AddEntry(aRootName, aImage, nullptr, true, std::make_unique<DocumentEntry>(rDocument, eLocation)); } - m_xControl->thaw(); } void SbTreeListBox::ImpCreateLibEntries(const weld::TreeIter& rIter, const ScriptDocument& rDocument, LibraryLocation eLocation) @@ -1259,6 +1258,12 @@ void SbTreeListBox::UpdateEntries() // Removes the entry from the tree. void SbTreeListBox::RemoveEntry(const weld::TreeIter& rIter) { + if (m_bFreezeOnFirstAddRemove) + { + m_xControl->freeze(); + m_bFreezeOnFirstAddRemove = false; + } + // removing the associated user data Entry* pBasicEntry = reinterpret_cast<Entry*>(m_xControl->get_id(rIter).toInt64()); delete pBasicEntry; @@ -1329,6 +1334,11 @@ void SbTreeListBox::AddEntry( std::unique_ptr<Entry>&& rUserData, weld::TreeIter* pRet) { + if (m_bFreezeOnFirstAddRemove) + { + m_xControl->freeze(); + m_bFreezeOnFirstAddRemove= false; + } OUString sId(OUString::number(reinterpret_cast<sal_uInt64>(rUserData.release()))); m_xControl->insert(pParent, -1, &rText, &sId, nullptr, nullptr, &rImage, bChildrenOnDemand, pRet); } diff --git a/basctl/source/basicide/bastype3.cxx b/basctl/source/basicide/bastype3.cxx index fec708b6f7f0..93fb1525d473 100644 --- a/basctl/source/basicide/bastype3.cxx +++ b/basctl/source/basicide/bastype3.cxx @@ -246,6 +246,10 @@ void TreeListBox::ScanAllEntries() void SbTreeListBox::ScanAllEntries() { + // instead of always freezing, freeze on the first add/remove, which keeps gtk + // from relayouting the tree if its not necessary + m_bFreezeOnFirstAddRemove = true; + ScanEntry( ScriptDocument::getApplicationScriptDocument(), LIBRARY_LOCATION_USER ); ScanEntry( ScriptDocument::getApplicationScriptDocument(), LIBRARY_LOCATION_SHARE ); @@ -255,6 +259,11 @@ void SbTreeListBox::ScanAllEntries() if ( doc.isAlive() ) ScanEntry(doc, LIBRARY_LOCATION_DOCUMENT); } + + if (!m_bFreezeOnFirstAddRemove) + m_xControl->thaw(); // m_bFreezeOnFirstAddRemove was changed, so control was frozen + else + m_bFreezeOnFirstAddRemove = false; } SbxVariable* SbTreeListBox::FindVariable(const weld::TreeIter* pEntry) diff --git a/basctl/source/inc/bastype2.hxx b/basctl/source/inc/bastype2.hxx index 720d3156ac00..5e22375bd0e9 100644 --- a/basctl/source/inc/bastype2.hxx +++ b/basctl/source/inc/bastype2.hxx @@ -245,6 +245,7 @@ private: std::unique_ptr<weld::TreeView> m_xControl; std::unique_ptr<weld::TreeIter> m_xIter; weld::Window* m_pTopLevel; + bool m_bFreezeOnFirstAddRemove; BrowseMode nMode; DocumentEventNotifier m_aNotifier; void SetEntryBitmaps(const weld::TreeIter& rIter, const OUString& rImage); |