sd/source/ui/dlg/LayerTabBar.cxx | 95 ++++++++++++++++++++++++++++++++++++++- sd/source/ui/inc/LayerTabBar.hxx | 9 +++ 2 files changed, 103 insertions(+), 1 deletion(-)
New commits: commit d6a94c51130f62b17b29060fab6befe576e8c078 Author: Jim Raykowski <[email protected]> AuthorDate: Sun Nov 12 17:52:09 2023 -0900 Commit: Jim Raykowski <[email protected]> CommitDate: Sat Dec 23 20:10:25 2023 +0100 tdf#157244 Enhancement to identify objects in a layer Show an invert overlay on objects of a layer after a 1/2 second delay when the mouse pointer is on a layer tab. Change-Id: Ifcb2d82d73b8745ad9aecddd18b22193525ed756 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/159358 Tested-by: Jenkins Reviewed-by: Jim Raykowski <[email protected]> diff --git a/sd/source/ui/dlg/LayerTabBar.cxx b/sd/source/ui/dlg/LayerTabBar.cxx index 96b96068f331..ece1e0884bcf 100644 --- a/sd/source/ui/dlg/LayerTabBar.cxx +++ b/sd/source/ui/dlg/LayerTabBar.cxx @@ -39,6 +39,12 @@ #include <drawview.hxx> #include <undolayer.hxx> +#include <svx/sdr/overlay/overlaymanager.hxx> +#include <svx/sdr/overlay/overlayselection.hxx> +#include <svx/svditer.hxx> +#include <sdpage.hxx> +#include <svx/sdrpaintwindow.hxx> + namespace sd { /** @@ -47,12 +53,17 @@ namespace sd { LayerTabBar::LayerTabBar(DrawViewShell* pViewSh, vcl::Window* pParent) : TabBar( pParent, WinBits( WB_BORDER | WB_3DLOOK | WB_SCROLL ) ), DropTargetHelper( this ), - pDrViewSh(pViewSh) + pDrViewSh(pViewSh), + m_aBringLayerObjectsToAttentionDelayTimer("LayerTabBar m_aBringLayerObjectsToAttentionDelayTimer") { EnableEditMode(); SetSizePixel(Size(0, 0)); SetMaxPageWidth( 150 ); SetHelpId( HID_SD_TABBAR_LAYERS ); + + m_aBringLayerObjectsToAttentionDelayTimer.SetInvokeHandler( + LINK(this, LayerTabBar, BringLayerObjectsToAttentionDelayTimerHdl)); + m_aBringLayerObjectsToAttentionDelayTimer.SetTimeout(500); } LayerTabBar::~LayerTabBar() @@ -137,6 +148,87 @@ void LayerTabBar::Select() pDispatcher->Execute(SID_SWITCHLAYER, SfxCallMode::SYNCHRON); } +void LayerTabBar::MouseMove(const MouseEvent &rMEvt) +{ + sal_uInt16 nPageId = 0; + if (!rMEvt.IsLeaveWindow()) + nPageId = GetPageId(rMEvt.GetPosPixel()); + BringLayerObjectsToAttention(nPageId); + return; +} + +void LayerTabBar::BringLayerObjectsToAttention(const sal_uInt16 nPageId) +{ + if (nPageId == m_nBringLayerObjectsToAttentionLastPageId) + return; + + m_aBringLayerObjectsToAttentionDelayTimer.Stop(); + + m_nBringLayerObjectsToAttentionLastPageId = nPageId; + + std::vector<basegfx::B2DRange> aRanges; + + if (nPageId != 0) + { + OUString aLayerName(GetLayerName(nPageId)); + if (pDrViewSh->GetView()->GetSdrPageView()->IsLayerVisible(aLayerName)) + { + SdrLayerAdmin& rLayerAdmin = pDrViewSh->GetDoc()->GetLayerAdmin(); + SdrObjListIter aIter(pDrViewSh->GetActualPage(), SdrIterMode::DeepWithGroups); + while (aIter.IsMore()) + { + SdrObject* pObj = aIter.Next(); + assert(pObj != nullptr); + if (pObj && (aLayerName == rLayerAdmin.GetLayerPerID(pObj->GetLayer())->GetName())) + { + ::tools::Rectangle aRect(pObj->GetLogicRect()); + if (!aRect.IsEmpty()) + aRanges.emplace_back(aRect.Left(), aRect.Top(), aRect.Right(), aRect.Bottom()); + // skip over objects in groups + if (pObj->IsGroupObject()) + { + SdrObjListIter aSubListIter(pObj->GetSubList(), SdrIterMode::DeepWithGroups); + while (aSubListIter.IsMore()) + { + aIter.Next(); + aSubListIter.Next(); + } + } + } + } + } + } + + if (m_xOverlayObject && m_xOverlayObject->getOverlayManager()) + m_xOverlayObject->getOverlayManager()->remove(*m_xOverlayObject); + if (aRanges.empty()) + m_xOverlayObject.reset(); + else + { + m_xOverlayObject.reset(new sdr::overlay::OverlaySelection( + sdr::overlay::OverlayType::Invert, + Color(), std::move(aRanges), true/*unused for Invert type*/)); + m_aBringLayerObjectsToAttentionDelayTimer.Start(); + } +} + +IMPL_LINK_NOARG(LayerTabBar, BringLayerObjectsToAttentionDelayTimerHdl, Timer *, void) +{ + m_aBringLayerObjectsToAttentionDelayTimer.Stop(); + if (m_xOverlayObject) + { + if (SdrView* pView = pDrViewSh->GetDrawView()) + { + if (SdrPaintWindow* pPaintWindow = pView->GetPaintWindow(0)) + { + const rtl::Reference<sdr::overlay::OverlayManager>& xOverlayManager = + pPaintWindow->GetOverlayManager(); + xOverlayManager->add(*m_xOverlayObject); + } + } + } +} + void LayerTabBar::MouseButtonDown(const MouseEvent& rMEvt) { bool bSetPageID=false; @@ -302,6 +394,7 @@ void LayerTabBar::Command(const CommandEvent& rCEvt) { if ( rCEvt.GetCommand() == CommandEventId::ContextMenu ) { + BringLayerObjectsToAttention(); SfxDispatcher* pDispatcher = pDrViewSh->GetViewFrame()->GetDispatcher(); pDispatcher->ExecutePopup("layertab"); } diff --git a/sd/source/ui/inc/LayerTabBar.hxx b/sd/source/ui/inc/LayerTabBar.hxx index 297a9302d5d9..c9a49f050b71 100644 --- a/sd/source/ui/inc/LayerTabBar.hxx +++ b/sd/source/ui/inc/LayerTabBar.hxx @@ -27,6 +27,8 @@ #include <vcl/transfer.hxx> #include <sddllapi.h> +#include <svx/sdr/overlay/overlayobject.hxx> + namespace sd { /** @@ -82,6 +84,7 @@ public: virtual void Select() override; virtual void DoubleClick() override; + SD_DLLPUBLIC virtual void MouseMove(const MouseEvent& rMEvt) override; SD_DLLPUBLIC virtual void MouseButtonDown(const MouseEvent& rMEvt) override; // export for unit test virtual void Command(const CommandEvent& rCEvt) override; @@ -99,6 +102,12 @@ public: private: DrawViewShell* pDrViewSh; + AutoTimer m_aBringLayerObjectsToAttentionDelayTimer; + sal_uInt16 m_nBringLayerObjectsToAttentionLastPageId = 0; + std::unique_ptr<sdr::overlay::OverlayObject> m_xOverlayObject; + void BringLayerObjectsToAttention(const sal_uInt16 nPageId = 0); + DECL_LINK(BringLayerObjectsToAttentionDelayTimerHdl, Timer *, void); + // Expects not-localized, real layer name in rText and writes it to maAuxiliaryText. void SetLayerName( sal_uInt16 nPageId, const OUString& rText ); };
