Providing numerical move entries also for partial (handle) image and ruler moves

This commit is contained in:
Matthias Koefferlein 2026-01-22 22:34:34 +01:00
parent 8300e2ee57
commit ccd9952d49
4 changed files with 108 additions and 79 deletions

View File

@ -1624,57 +1624,7 @@ Service::move (const db::DPoint &p, lay::angle_constraint_type ac)
auto ac_eff = ac == lay::AC_Global ? m_snap_mode : ac;
clear_mouse_cursors ();
bool indicate_ruler_as_message = true;
if (m_move_mode == MoveP1) {
m_current.seg_p1 (m_seg_index, snap2_visual (m_p1, p, &m_current, ac));
m_rulers [0]->redraw ();
} else if (m_move_mode == MoveP2) {
m_current.seg_p2 (m_seg_index, snap2_visual (m_p1, p, &m_current, ac));
m_rulers [0]->redraw ();
} else if (m_move_mode == MoveP12) {
db::DPoint p12 = snap2_visual (m_p1, p, &m_current, ac);
m_current.seg_p1 (m_seg_index, db::DPoint (m_current.seg_p1 (m_seg_index).x(), p12.y ()));
m_current.seg_p2 (m_seg_index, db::DPoint (p12.x (), m_current.seg_p2 (m_seg_index).y ()));
m_rulers [0]->redraw ();
} else if (m_move_mode == MoveP21) {
db::DPoint p21 = snap2_visual (m_p1, p, &m_current, ac);
m_current.seg_p1 (m_seg_index, db::DPoint (p21.x (), m_current.seg_p1 (m_seg_index).y ()));
m_current.seg_p2 (m_seg_index, db::DPoint (m_current.seg_p2 (m_seg_index).x(), p21.y ()));
m_rulers [0]->redraw ();
} else if (m_move_mode == MoveP1X) {
db::DPoint pc = snap2_visual (m_p1, p, &m_current, ac);
m_current.seg_p1 (m_seg_index, db::DPoint (pc.x (), m_current.seg_p1 (m_seg_index).y ()));
m_rulers [0]->redraw ();
} else if (m_move_mode == MoveP2X) {
db::DPoint pc = snap2_visual (m_p1, p, &m_current, ac);
m_current.seg_p2 (m_seg_index, db::DPoint (pc.x (), m_current.seg_p2 (m_seg_index).y ()));
m_rulers [0]->redraw ();
} else if (m_move_mode == MoveP1Y) {
db::DPoint pc = snap2_visual (m_p1, p, &m_current, ac);
m_current.seg_p1 (m_seg_index, db::DPoint (m_current.seg_p1 (m_seg_index).x (), pc.y ()));
m_rulers [0]->redraw ();
} else if (m_move_mode == MoveP2Y) {
db::DPoint pc = snap2_visual (m_p1, p, &m_current, ac);
m_current.seg_p2 (m_seg_index, db::DPoint (m_current.seg_p2 (m_seg_index).x (), pc.y ()));
m_rulers [0]->redraw ();
} else if (m_move_mode == MoveSelected) {
if (m_move_mode == MoveSelected) {
db::DVector dp = p - m_p1;
dp = lay::snap_angle (dp, ac_eff);
@ -1682,7 +1632,6 @@ Service::move (const db::DPoint &p, lay::angle_constraint_type ac)
m_trans = db::DTrans (dp + (m_p1 - db::DPoint ()) - m_trans.disp ()) * m_trans * db::DTrans (db::DPoint () - m_p1);
propose_move_transformation (m_trans, 1);
indicate_ruler_as_message = false;
snap_rulers (ac_eff);
@ -1690,11 +1639,69 @@ Service::move (const db::DPoint &p, lay::angle_constraint_type ac)
(*r)->transform_by (db::DCplxTrans (m_trans));
}
show_message ();
} else if (m_move_mode != MoveNone) {
db::DPoint ps = snap2_visual (m_p1, p, &m_current, ac);
m_trans = db::DTrans (ps - m_p1);
apply_partial_move (ps);
propose_move_transformation (db::DTrans (ps - m_p1), 1);
// display current move distance
std::string pos = std::string ("dx: ") + tl::micron_to_string (ps.x () - m_p1.x ()) + " "
+ "dy: " + tl::micron_to_string (ps.y () - m_p1.y ());
view ()->message (pos);
}
}
void
Service::apply_partial_move (db::DPoint &ps)
{
if (m_move_mode == MoveP1) {
m_current.seg_p1 (m_seg_index, ps);
} else if (m_move_mode == MoveP2) {
m_current.seg_p2 (m_seg_index, ps);
} else if (m_move_mode == MoveP12) {
m_current.seg_p1 (m_seg_index, db::DPoint (m_current.seg_p1 (m_seg_index).x(), ps.y ()));
m_current.seg_p2 (m_seg_index, db::DPoint (ps.x (), m_current.seg_p2 (m_seg_index).y ()));
} else if (m_move_mode == MoveP21) {
m_current.seg_p1 (m_seg_index, db::DPoint (ps.x (), m_current.seg_p1 (m_seg_index).y ()));
m_current.seg_p2 (m_seg_index, db::DPoint (m_current.seg_p2 (m_seg_index).x(), ps.y ()));
} else if (m_move_mode == MoveP1X) {
ps.set_y (m_p1.y ());
m_current.seg_p1 (m_seg_index, db::DPoint (ps.x (), m_current.seg_p1 (m_seg_index).y ()));
} else if (m_move_mode == MoveP2X) {
ps.set_y (m_p1.y ());
m_current.seg_p2 (m_seg_index, db::DPoint (ps.x (), m_current.seg_p2 (m_seg_index).y ()));
} else if (m_move_mode == MoveP1Y) {
ps.set_x (m_p1.x ());
m_current.seg_p1 (m_seg_index, db::DPoint (m_current.seg_p1 (m_seg_index).x (), ps.y ()));
} else if (m_move_mode == MoveP2Y) {
ps.set_x (m_p1.x ());
m_current.seg_p2 (m_seg_index, db::DPoint (m_current.seg_p2 (m_seg_index).x (), ps.y ()));
}
if (indicate_ruler_as_message) {
show_message ();
}
m_rulers [0]->redraw ();
}
void
@ -1743,6 +1750,9 @@ Service::end_move (const db::DPoint &, lay::angle_constraint_type)
} else if (m_move_mode != MoveNone) {
db::DPoint ps = m_trans * m_p1;
apply_partial_move (ps);
// replace the ruler that was moved
m_current.clean_points ();
mp_view->annotation_shapes ().replace (*m_selected.begin (), db::DUserObject (new ant::Object (m_current)));

View File

@ -633,6 +633,7 @@ private:
lay::EditorOptionsPage *toolbox_widget ();
void show_message ();
void apply_partial_move (db::DPoint &ps);
/**
* @brief A handler for the shape container's changed event

View File

@ -419,6 +419,7 @@ Service::Service (db::Manager *manager, lay::LayoutViewBase *view)
mp_transient_view (0),
m_move_mode (Service::move_none),
m_moved_landmark (0),
m_ac (lay::AC_Global),
m_keep_selection_for_move (false),
m_images_visible (true),
m_visibility_cache_valid (false)
@ -608,12 +609,14 @@ Service::begin_move (lay::Editable::MoveMode mode, const db::DPoint &p, lay::ang
double l = catch_distance ();
db::DBox search_dbox = db::DBox (p, p).enlarged (db::DVector (l, l));
m_plast = m_p1 = p;
m_trans = db::DTrans ();
m_ac = lay::AC_Global;
// choose move mode
if (mode == lay::Editable::Selected) {
m_move_mode = move_selected;
m_p1 = p;
m_trans = db::DTrans ();
selection_to_view ();
for (std::vector <img::View *>::iterator r = m_selected_image_views.begin (); r != m_selected_image_views.end (); ++r) {
@ -657,7 +660,6 @@ Service::begin_move (lay::Editable::MoveMode mode, const db::DPoint &p, lay::ang
} else if (mode == lay::Editable::Any) {
m_move_mode = move_none;
m_p1 = p;
double dmin = std::numeric_limits <double>::max ();
const db::DUserObject *robj = find_image (p, search_dbox, l, dmin);
@ -705,11 +707,14 @@ Service::move_transform (const db::DPoint &p, db::DFTrans tr, lay::angle_constra
return;
}
db::DTrans tr_new = db::DTrans (p - db::DPoint ()) * db::DTrans (tr) * db::DTrans (m_trans.fp_trans ()) * db::DTrans (db::DPoint () - m_p1);
if (m_move_mode == move_all) {
db::DVector dp = p - db::DPoint ();
db::DTrans dt = tr_new * m_trans.inverted ();
m_current.transform (db::DTrans (dp) * db::DTrans (tr) * db::DTrans (-dp));
m_current.transform (dt);
m_trans = dt * m_trans;
// display current images' parameters
show_message ();
@ -718,7 +723,7 @@ Service::move_transform (const db::DPoint &p, db::DFTrans tr, lay::angle_constra
} else if (m_move_mode == move_selected) {
m_trans *= db::DTrans (m_p1 - db::DPoint ()) * db::DTrans (tr) * db::DTrans (db::DPoint () - m_p1);
m_trans = tr_new;
for (std::vector<img::View *>::iterator r = m_selected_image_views.begin (); r != m_selected_image_views.end (); ++r) {
(*r)->transform_by (db::DCplxTrans (m_trans));
@ -734,13 +739,27 @@ Service::move (const db::DPoint &p, lay::angle_constraint_type ac)
return;
}
m_ac = ac;
do_move (p, ac);
if (m_move_mode != move_selected) {
m_selected_image_views [0]->redraw ();
show_message ();
}
propose_move_transformation (m_trans, 2);
}
void
Service::do_move (const db::DPoint &p, lay::angle_constraint_type ac)
{
if (m_move_mode == move_selected) {
db::DVector dp = p - m_p1;
m_p1 = p;
db::DVector dp = p - m_plast;
m_plast = p;
m_trans = db::DTrans (dp) * m_trans;
propose_move_transformation (m_trans, 2);
for (std::vector<img::View *>::iterator r = m_selected_image_views.begin (); r != m_selected_image_views.end (); ++r) {
(*r)->transform_by (db::DCplxTrans (m_trans));
@ -748,6 +767,8 @@ Service::move (const db::DPoint &p, lay::angle_constraint_type ac)
} else if (m_move_mode == move_landmark) {
m_trans = db::DTrans (p - m_p1);
std::vector <db::DPoint> li = m_initial.landmarks ();
for (std::vector <db::DPoint>::iterator l = li.begin (); l != li.end (); ++l) {
*l = m_initial.matrix ().trans (*l);
@ -771,20 +792,20 @@ Service::move (const db::DPoint &p, lay::angle_constraint_type ac)
db::adjust_matrix (m, li, lm, adjust, int (m_moved_landmark));
m_current.set_matrix (m * m_initial.matrix ());
m_selected_image_views [0]->redraw ();
} else {
if (m_move_mode == move_all) {
db::DVector dp = p - m_p1;
m_p1 = p;
db::DVector dp = p - m_plast;
m_plast = p;
m_trans = db::DTrans (dp) * m_trans;
m_current.transform (db::DTrans (dp));
} else {
m_current = m_initial;
m_trans = db::DTrans (p - m_p1);
db::DVector dx (0.5 * m_current.width (), 0.5 * m_current.height ());
db::Matrix3d it = (m_current.matrix () * db::Matrix3d::disp (-dx)).inverted ();
@ -848,15 +869,6 @@ Service::move (const db::DPoint &p, lay::angle_constraint_type ac)
}
// display current images' parameters
show_message ();
m_selected_image_views [0]->redraw ();
}
if (m_move_mode != move_selected) {
show_message ();
}
}
@ -875,7 +887,7 @@ Service::show_message ()
void
Service::end_move (const db::DVector &v)
{
m_trans = db::DTrans (v) * db::DTrans (m_trans.fp_trans ());
do_move (m_p1 + v, m_ac);
end_move (db::DPoint (), lay::AC_Any);
}

View File

@ -505,8 +505,10 @@ private:
std::set<obj_iterator> m_selected;
// The previous selection
std::set<obj_iterator> m_previous_selection;
// The reference point in move mode
// The starting point in move mode
db::DPoint m_p1;
// The last reference point in move mode
db::DPoint m_plast;
// The image object representing the image being moved as it was before it was moved
img::Object m_initial;
// The image object representing the image being moved
@ -519,6 +521,8 @@ private:
MoveMode m_move_mode;
// The index of the landmark being moved
size_t m_moved_landmark;
// The last "angle constraint" (button combination) used in move
lay::angle_constraint_type m_ac;
// Flag indicating that we want to keep the selection after the landmark was moved
bool m_keep_selection_for_move;
// Flag indicating whether images are visible
@ -528,6 +532,8 @@ private:
std::map<const img::Object *, bool> m_visibility_cache;
void show_message ();
void do_move (const db::DPoint &p, lay::angle_constraint_type ac);
/**
* @brief Select a certain image