sd/source/ui/dlg/navigatr.cxx             |    9 ++++++++
 sd/source/ui/dlg/sdtreelb.cxx             |   12 +++++++++-
 sd/source/ui/inc/sdtreelb.hxx             |   13 ++++++++++-
 sd/uiconfig/simpress/ui/navigatorpanel.ui |   33 ++++++++++++++++++++++++++++++
 4 files changed, 64 insertions(+), 3 deletions(-)

New commits:
commit a8493ee3d7dac611286a75516f24dd6e451f9718
Author:     Jim Raykowski <rayk...@gmail.com>
AuthorDate: Sat Apr 22 11:23:48 2023 -0800
Commit:     Jim Raykowski <rayk...@gmail.com>
CommitDate: Tue Apr 25 19:50:06 2023 +0200

    tdf#154604 SdNavigator: Support listing in front-to-back z order
    
    Enhancement patch to provide the option to list objects in front-to-
    back or back-to-front z order
    
    Change-Id: I2194cace08736d948002548887661314834cef89
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/150893
    Tested-by: Jenkins
    Reviewed-by: Jim Raykowski <rayk...@gmail.com>

diff --git a/sd/source/ui/dlg/navigatr.cxx b/sd/source/ui/dlg/navigatr.cxx
index ff0bc85d9b85..be0f5919afa9 100644
--- a/sd/source/ui/dlg/navigatr.cxx
+++ b/sd/source/ui/dlg/navigatr.cxx
@@ -309,6 +309,9 @@ IMPL_LINK(SdNavigatorWin, DropdownClickToolBoxHdl, const 
OUString&, rCommand, vo
         bool bAll = mxTlbObjects->GetShowAllShapes();
         mxShapeMenu->set_active("named", !bAll);
         mxShapeMenu->set_active("all", bAll);
+        bool bOrderFrontToBack = mxTlbObjects->GetOrderFrontToBack();
+        mxShapeMenu->set_active("fronttoback", bOrderFrontToBack);
+        mxShapeMenu->set_active("backtofront", !bOrderFrontToBack);
     }
 }
 
@@ -501,13 +504,19 @@ IMPL_LINK(SdNavigatorWin, MenuSelectHdl, const OUString&, 
rIdent, void)
 IMPL_LINK( SdNavigatorWin, ShapeFilterCallback, const OUString&, rIdent, void )
 {
     bool bShowAllShapes(mxTlbObjects->GetShowAllShapes());
+    bool bOrderFrontToBack(mxTlbObjects->GetOrderFrontToBack());
     if (rIdent == "named")
         bShowAllShapes = false;
     else if (rIdent == "all")
         bShowAllShapes = true;
+    else if (rIdent == "fronttoback")
+        bOrderFrontToBack = true;
+    else if (rIdent == "backtofront")
+        bOrderFrontToBack = false;
     else
         OSL_FAIL("SdNavigatorWin::ShapeFilterCallback called for unknown menu 
entry");
 
+    mxTlbObjects->SetOrderFrontToBack(bOrderFrontToBack);
     mxTlbObjects->SetShowAllShapes(bShowAllShapes, true);
 
     // Remember the selection in the FrameView.
diff --git a/sd/source/ui/dlg/sdtreelb.cxx b/sd/source/ui/dlg/sdtreelb.cxx
index efb027c2119c..68e794c21d5d 100644
--- a/sd/source/ui/dlg/sdtreelb.cxx
+++ b/sd/source/ui/dlg/sdtreelb.cxx
@@ -182,6 +182,11 @@ void SdPageObjsTLV::SetShowAllShapes (
     }
 }
 
+void SdPageObjsTLV::SetOrderFrontToBack(const bool bOrderFrontToBack)
+{
+    m_bOrderFrontToBack = bOrderFrontToBack;
+}
+
 bool SdPageObjsTLV::IsEqualToShapeList(std::unique_ptr<weld::TreeIter>& 
rEntry, const SdrObjList& rList,
                                        std::u16string_view rListName)
 {
@@ -416,6 +421,7 @@ bool SdPageObjsTLV::DoDrag()
     }
 
     m_xDropTargetHelper->SetDrawView(pViewShell->GetDrawView());
+    m_xDropTargetHelper->SetOrderFrontToBack(m_bOrderFrontToBack);
     bIsInDrag = true;
 
     std::unique_ptr<weld::TreeIter> xEntry = m_xTreeView->make_iterator();
@@ -562,7 +568,7 @@ sal_Int8 SdPageObjsTLVDropTarget::ExecuteDrop( const 
ExecuteDropEvent& rEvt )
         m_rTreeView.iter_previous_sibling(*xTarget);
         m_rTreeView.set_cursor(*xTarget);
 
-        // Remove and insert are required for moving objects in to and out of 
groups.
+        // Remove and insert are required for moving objects into and out of 
groups.
         // PutMarked... by itself would suffice if this wasn't allowed.
 
         // Remove the source object from source parent list and insert it in 
the target parent list.
@@ -595,7 +601,8 @@ sal_Int8 SdPageObjsTLVDropTarget::ExecuteDrop( const 
ExecuteDropEvent& rEvt )
             pList->NbcInsertObject(rSourceObject.get());
         }
 
-        m_pSdrView->PutMarkedBehindObj(pTargetObject);
+        m_bOrderFrontToBack ? m_pSdrView->PutMarkedInFrontOfObj(pTargetObject) 
:
+                              m_pSdrView->PutMarkedBehindObj(pTargetObject);
     }
 
     return DND_ACTION_NONE;
@@ -710,6 +717,7 @@ 
SdPageObjsTLV::SdPageObjsTLV(std::unique_ptr<weld::TreeView> xTreeView)
     , m_pOwnMedium(nullptr)
     , m_bLinkableSelected(false)
     , m_bShowAllShapes(false)
+    , m_bOrderFrontToBack(false)
     , m_bShowAllPages(false)
     , m_bSelectionHandlerNavigates(false)
     , m_bNavigationGrabsFocus(true)
diff --git a/sd/source/ui/inc/sdtreelb.hxx b/sd/source/ui/inc/sdtreelb.hxx
index 07e79c566df9..38255a66e16f 100644
--- a/sd/source/ui/inc/sdtreelb.hxx
+++ b/sd/source/ui/inc/sdtreelb.hxx
@@ -56,6 +56,7 @@ class SdPageObjsTLVDropTarget final : public DropTargetHelper
 private:
     weld::TreeView& m_rTreeView;
     SdrView* m_pSdrView;
+    bool m_bOrderFrontToBack = false;
 
     virtual sal_Int8 AcceptDrop( const AcceptDropEvent& rEvt ) override;
     virtual sal_Int8 ExecuteDrop( const ExecuteDropEvent& rEvt ) override;
@@ -64,6 +65,7 @@ public:
     SdPageObjsTLVDropTarget(weld::TreeView& rTreeView);
 
     void SetDrawView(SdrView* pSdrView) { m_pSdrView = pSdrView; }
+    void SetOrderFrontToBack(bool bSet) { m_bOrderFrontToBack = bSet; }
 };
 
 class SD_DLLPUBLIC SdPageObjsTLV
@@ -82,6 +84,7 @@ private:
     SfxMedium* m_pOwnMedium;
     bool m_bLinkableSelected;
     bool m_bShowAllShapes;
+    bool m_bOrderFrontToBack;
 
     /** This flag controls whether to show all pages.
     */
@@ -330,6 +333,9 @@ public:
     void SetShowAllShapes (const bool bShowAllShapes, const bool bFill);
     bool GetShowAllShapes() const { return m_bShowAllShapes; }
 
+    void SetOrderFrontToBack (const bool bOrderFrontToBack);
+    bool GetOrderFrontToBack() const { return m_bOrderFrontToBack; }
+
     bool IsNavigationGrabsFocus() const { return m_bNavigationGrabsFocus; }
     bool IsEqualToDoc(const SdDrawDocument* pInDoc);
     /// Visits rList recursively and tries to advance rEntry accordingly.
@@ -395,7 +401,12 @@ public:
 
     void InsertEntry(const weld::TreeIter* pParent, const OUString& rId, const 
OUString &rName, const OUString &rExpander, weld::TreeIter* pEntry = nullptr)
     {
-        m_xTreeView->insert(pParent, -1, &rName, &rId, nullptr, nullptr, 
false, m_xScratchIter.get());
+        if (pParent)
+            m_xTreeView->insert(pParent, m_bOrderFrontToBack ? 0 : -1, &rName, 
&rId, nullptr,
+                                nullptr, false, m_xScratchIter.get());
+        else
+            // always append page/slide entry
+            m_xTreeView->insert(nullptr, -1, &rName, &rId, nullptr, nullptr, 
false, m_xScratchIter.get());
         m_xTreeView->set_image(*m_xScratchIter, rExpander);
         if (pEntry)
             m_xTreeView->copy_iterator(*m_xScratchIter, *pEntry);
diff --git a/sd/uiconfig/simpress/ui/navigatorpanel.ui 
b/sd/uiconfig/simpress/ui/navigatorpanel.ui
index 08ddbfae2155..2994219b21b7 100644
--- a/sd/uiconfig/simpress/ui/navigatorpanel.ui
+++ b/sd/uiconfig/simpress/ui/navigatorpanel.ui
@@ -138,6 +138,7 @@
             <child>
               <object class="GtkToolButton" id="first">
                 <property name="visible">True</property>
+                <property name="can-focus">False</property>
                 <property name="tooltip-text" translatable="yes" 
context="navigatorpanel|first|tooltip_text">First Slide</property>
                 <property name="icon-name">sd/res/nv03.png</property>
                 <child internal-child="accessible">
@@ -154,6 +155,7 @@
             <child>
               <object class="GtkToolButton" id="previous">
                 <property name="visible">True</property>
+                <property name="can-focus">False</property>
                 <property name="tooltip-text" translatable="yes" 
context="navigatorpanel|previous|tooltip_text">Previous Slide</property>
                 <property name="icon-name">sd/res/nv04.png</property>
                 <child internal-child="accessible">
@@ -170,6 +172,7 @@
             <child>
               <object class="GtkToolButton" id="next">
                 <property name="visible">True</property>
+                <property name="can-focus">False</property>
                 <property name="tooltip-text" translatable="yes" 
context="navigatorpanel|next|tooltip_text">Next Slide</property>
                 <property name="icon-name">sd/res/nv05.png</property>
                 <child internal-child="accessible">
@@ -186,6 +189,7 @@
             <child>
               <object class="GtkToolButton" id="last">
                 <property name="visible">True</property>
+                <property name="can-focus">False</property>
                 <property name="tooltip-text" translatable="yes" 
context="navigatorpanel|last|tooltip_text">Last Slide</property>
                 <property name="icon-name">sd/res/nv06.png</property>
                 <child internal-child="accessible">
@@ -214,6 +218,7 @@
             <child>
               <object class="GtkMenuToolButton" id="dragmode">
                 <property name="visible">True</property>
+                <property name="can-focus">False</property>
                 <property name="tooltip-text" translatable="yes" 
context="navigatorpanel|dragmode|tooltip_text">Drag Mode</property>
                 <property name="icon-name">sd/res/nv09.png</property>
                 <child internal-child="accessible">
@@ -230,6 +235,7 @@
             <child>
               <object class="GtkMenuToolButton" id="shapes">
                 <property name="visible">True</property>
+                <property name="can-focus">False</property>
                 <property name="tooltip-text" translatable="yes" 
context="navigatorpanel|shapes|tooltip_text">Show Shapes</property>
                 <property name="icon-name">sd/res/graphic.png</property>
                 <child internal-child="accessible">
@@ -271,6 +277,7 @@
         <property name="label" translatable="yes" 
context="navigatorpanel|STR_NAVIGATOR_SHOW_NAMED_SHAPES">Named shapes</property>
         <property name="use-underline">True</property>
         <property name="draw-as-radio">True</property>
+        <property name="group">all</property>
       </object>
     </child>
     <child>
@@ -283,5 +290,31 @@
         <property name="group">named</property>
       </object>
     </child>
+    <child>
+      <object class="GtkSeparatorMenuItem">
+        <property name="visible">True</property>
+        <property name="can-focus">False</property>
+      </object>
+    </child>
+    <child>
+      <object class="GtkRadioMenuItem" id="fronttoback">
+        <property name="visible">True</property>
+        <property name="can-focus">False</property>
+        <property name="label" translatable="yes" 
context="navigatorpanel|STR_NAVIGATOR_FRONT_TO_BACK">Front to back</property>
+        <property name="use-underline">True</property>
+        <property name="draw-as-radio">True</property>
+        <property name="group">backtofront</property>
+      </object>
+    </child>
+    <child>
+      <object class="GtkRadioMenuItem" id="backtofront">
+        <property name="visible">True</property>
+        <property name="can-focus">False</property>
+        <property name="label" translatable="yes" 
context="navigatorpanel|STR_NAVIGATOR_BACK_TO_FRONT">Back to front</property>
+        <property name="use-underline">True</property>
+        <property name="draw-as-radio">True</property>
+        <property name="group">fronttoback</property>
+      </object>
+    </child>
   </object>
 </interface>

Reply via email to