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 );
 };

Reply via email to