diff --git a/src/laybasic/laybasic/layLayoutViewBase.cc b/src/laybasic/laybasic/layLayoutViewBase.cc index 0a3a226db..27ffa530b 100644 --- a/src/laybasic/laybasic/layLayoutViewBase.cc +++ b/src/laybasic/laybasic/layLayoutViewBase.cc @@ -5308,7 +5308,7 @@ LayoutViewBase::paste () } void -LayoutViewBase::paste_interactive () +LayoutViewBase::paste_interactive (bool transient_mode) { clear_selection (); @@ -5320,7 +5320,7 @@ LayoutViewBase::paste_interactive () // operations. trans->close (); - if (mp_move_service->begin_move (trans.release (), false)) { + if (mp_move_service->begin_move (trans.release (), transient_mode)) { switch_mode (-1); // move mode } } diff --git a/src/laybasic/laybasic/layLayoutViewBase.h b/src/laybasic/laybasic/layLayoutViewBase.h index c86d7c771..5faf144a8 100644 --- a/src/laybasic/laybasic/layLayoutViewBase.h +++ b/src/laybasic/laybasic/layLayoutViewBase.h @@ -254,7 +254,7 @@ public: /** * @brief Pastes from clipboard and initiates a move */ - void paste_interactive (); + void paste_interactive (bool transient_mode = false); /** * @brief Copies to clipboard diff --git a/src/laybasic/laybasic/layMove.cc b/src/laybasic/laybasic/layMove.cc index c80dbb0e0..fb8dd5e9b 100644 --- a/src/laybasic/laybasic/layMove.cc +++ b/src/laybasic/laybasic/layMove.cc @@ -240,7 +240,7 @@ MoveService::mouse_press_event (const db::DPoint &p, unsigned int buttons, bool } bool -MoveService::begin_move (db::Transaction *transaction, bool selected_after_move) +MoveService::begin_move (db::Transaction *transaction, bool transient_selection) { if (m_dragging) { return false; @@ -248,16 +248,28 @@ MoveService::begin_move (db::Transaction *transaction, bool selected_after_move) std::unique_ptr trans_holder (transaction); - bool drag_transient = ! selected_after_move; - if (! mp_editables->has_selection ()) { - // try to use the transient selection for the real one - mp_editables->transient_to_selection (); - drag_transient = true; - } + bool drag_transient = false; + + if (! transaction) { + + // unless in "continue with move" use case try to establish a selection + + if (! mp_editables->has_selection ()) { + // try to use the transient selection for the real one + mp_editables->transient_to_selection (); + drag_transient = true; + } + + if (! mp_editables->has_selection ()) { + // still nothing selected + return false; + } + + } else { + + // inherit transient selection mode from previous operation + drag_transient = transient_selection; - if (! mp_editables->has_selection ()) { - // still nothing selected - return false; } db::DBox bbox = mp_editables->selection_bbox (); diff --git a/src/laybasic/laybasic/layMove.h b/src/laybasic/laybasic/layMove.h index 1aa8bd52c..a51884d6c 100644 --- a/src/laybasic/laybasic/layMove.h +++ b/src/laybasic/laybasic/layMove.h @@ -42,7 +42,7 @@ public: ~MoveService (); virtual bool configure (const std::string &name, const std::string &value); - bool begin_move (db::Transaction *transaction = 0, bool selected_after_move = true); + bool begin_move (db::Transaction *transaction = 0, bool transient_selection = false); private: virtual bool mouse_press_event (const db::DPoint &p, unsigned int buttons, bool prio); diff --git a/src/layui/layui/layLayoutViewFunctions.cc b/src/layui/layui/layLayoutViewFunctions.cc index e2c917a89..ac988ae0e 100644 --- a/src/layui/layui/layLayoutViewFunctions.cc +++ b/src/layui/layui/layLayoutViewFunctions.cc @@ -1177,11 +1177,12 @@ LayoutViewFunctions::do_cm_duplicate (bool interactive) db::Clipboard::instance ().swap (saved_clipboard); try { + bool transient_mode = ! view ()->has_selection (); view ()->copy_view_objects (); view ()->clear_selection (); view ()->cancel (); if (interactive) { - view ()->paste_interactive (); + view ()->paste_interactive (transient_mode); } else { view ()->paste (); }