diff options
author | Caolán McNamara <caolanm@redhat.com> | 2021-11-02 11:30:16 +0000 |
---|---|---|
committer | Caolán McNamara <caolanm@redhat.com> | 2021-11-02 17:13:14 +0100 |
commit | 2aed402cf922479813ac1ce048c8ed276407401c (patch) | |
tree | 34dc9421ebb44ae76d83ba320d7dc839aadcf953 /sd | |
parent | 60d51a43d4fb047ae814ef5296ffb8031080262a (diff) |
Resolves: tdf#136945 fix custom slide show dnd to reorder pages
Change-Id: Ib28d6779e772fd8ad30899354cde2c281085b328
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/124593
Tested-by: Caolán McNamara <caolanm@redhat.com>
Reviewed-by: Caolán McNamara <caolanm@redhat.com>
Diffstat (limited to 'sd')
-rw-r--r-- | sd/source/ui/dlg/custsdlg.cxx | 34 | ||||
-rw-r--r-- | sd/source/ui/inc/custsdlg.hxx | 14 |
2 files changed, 48 insertions, 0 deletions
diff --git a/sd/source/ui/dlg/custsdlg.cxx b/sd/source/ui/dlg/custsdlg.cxx index f776a6a7e2ba..bd629f87bfaa 100644 --- a/sd/source/ui/dlg/custsdlg.cxx +++ b/sd/source/ui/dlg/custsdlg.cxx @@ -250,6 +250,7 @@ SdDefineCustomShowDlg::SdDefineCustomShowDlg(weld::Window* pWindow, SdDrawDocume , m_xBtnAdd(m_xBuilder->weld_button("add")) , m_xBtnRemove(m_xBuilder->weld_button("remove")) , m_xLbCustomPages(m_xBuilder->weld_tree_view("custompages")) + , m_xDropTargetHelper(new CustomPagesDropTarget(*m_xLbCustomPages)) , m_xBtnOK(m_xBuilder->weld_button("ok")) , m_xBtnCancel(m_xBuilder->weld_button("cancel")) , m_xBtnHelp(m_xBuilder->weld_button("help")) @@ -474,4 +475,37 @@ IMPL_LINK_NOARG(SdDefineCustomShowDlg, OKHdl, weld::Button&, void) } } +CustomPagesDropTarget::CustomPagesDropTarget(weld::TreeView& rTreeView) + : DropTargetHelper(rTreeView.get_drop_target()) + , m_rTreeView(rTreeView) +{ +} + +sal_Int8 CustomPagesDropTarget::AcceptDrop(const AcceptDropEvent& rEvt) +{ + // to enable the autoscroll when we're close to the edges + m_rTreeView.get_dest_row_at_pos(rEvt.maPosPixel, nullptr, true); + return DND_ACTION_MOVE; +} + +sal_Int8 CustomPagesDropTarget::ExecuteDrop( const ExecuteDropEvent& rEvt ) +{ + weld::TreeView* pSource = m_rTreeView.get_drag_source(); + // only dragging within the same widget allowed + if (!pSource || pSource != &m_rTreeView) + return DND_ACTION_NONE; + + std::unique_ptr<weld::TreeIter> xSource(m_rTreeView.make_iterator()); + if (!m_rTreeView.get_selected(xSource.get())) + return DND_ACTION_NONE; + + std::unique_ptr<weld::TreeIter> xTarget(m_rTreeView.make_iterator()); + int nTargetPos = -1; + if (m_rTreeView.get_dest_row_at_pos(rEvt.maPosPixel, xTarget.get(), true)) + nTargetPos = m_rTreeView.get_iter_index_in_parent(*xTarget); + m_rTreeView.move_subtree(*xSource, nullptr, nTargetPos); + + return DND_ACTION_NONE; +} + /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/custsdlg.hxx b/sd/source/ui/inc/custsdlg.hxx index 519361aff69e..70df26a065fc 100644 --- a/sd/source/ui/inc/custsdlg.hxx +++ b/sd/source/ui/inc/custsdlg.hxx @@ -19,6 +19,7 @@ #pragma once +#include <vcl/transfer.hxx> #include <vcl/weld.hxx> class SdDrawDocument; @@ -53,6 +54,18 @@ public: bool IsCustomShow() const; }; +class CustomPagesDropTarget : public DropTargetHelper +{ +private: + weld::TreeView& m_rTreeView; + + virtual sal_Int8 AcceptDrop( const AcceptDropEvent& rEvt ) override; + virtual sal_Int8 ExecuteDrop( const ExecuteDropEvent& rEvt ) override; + +public: + CustomPagesDropTarget(weld::TreeView& rTreeView); +}; + class SdDefineCustomShowDlg : public weld::GenericDialogController { private: @@ -66,6 +79,7 @@ private: std::unique_ptr<weld::Button> m_xBtnAdd; std::unique_ptr<weld::Button> m_xBtnRemove; std::unique_ptr<weld::TreeView> m_xLbCustomPages; + std::unique_ptr<CustomPagesDropTarget> m_xDropTargetHelper; std::unique_ptr<weld::Button> m_xBtnOK; std::unique_ptr<weld::Button> m_xBtnCancel; std::unique_ptr<weld::Button> m_xBtnHelp; |