From 316cf771751091687f38ff381b66c658b3f56bf3 Mon Sep 17 00:00:00 2001 From: Matthias Koefferlein Date: Mon, 7 Sep 2020 23:49:42 +0200 Subject: [PATCH] WIP: Ruler now has a mouse snapping indicator too. --- src/ant/ant/antService.cc | 48 ++++++++++++++----- src/ant/ant/antService.h | 12 ++--- src/edt/edt/edtServiceImpl.cc | 12 +---- src/laybasic/laybasic/layEditorServiceBase.cc | 15 ++++++ src/laybasic/laybasic/layEditorServiceBase.h | 5 ++ 5 files changed, 63 insertions(+), 29 deletions(-) diff --git a/src/ant/ant/antService.cc b/src/ant/ant/antService.cc index 282386c6a..62f1dcc36 100644 --- a/src/ant/ant/antService.cc +++ b/src/ant/ant/antService.cc @@ -706,9 +706,7 @@ View::render (const lay::Viewport &vp, lay::ViewObjectCanvas &canvas) // ant::Service implementation Service::Service (db::Manager *manager, lay::LayoutView *view) - : lay::ViewService (view->view_object_widget ()), - lay::Editable (view), - lay::Plugin (view), + : lay::EditorServiceBase (view), lay::Drawing (1/*number of planes*/, view->drawings ()), db::Object (manager), m_halo (true), @@ -801,7 +799,7 @@ Service::configure (const std::string &name, const std::string &value) m_current_template = n; } else { - taken = false; + lay::EditorServiceBase::configure (name, value); } return taken; @@ -1513,9 +1511,23 @@ Service::create_measure_ruler (const db::DPoint &pt, lay::angle_constraint_type } } -bool +bool Service::mouse_move_event (const db::DPoint &p, unsigned int buttons, bool prio) { + if (prio) { + + lay::PointSnapToObjectResult snap_details; + if (m_drawing) { + snap_details = snap2_details (m_p1, p, mp_active_ruler->ruler (), ac_from_buttons (buttons)); + } else { + const ant::Template &tpl = current_template (); + snap_details = snap1_details (p, m_obj_snap && tpl.snap ()); + } + + mouse_cursor_from_snap_details (snap_details); + + } + if (m_drawing && prio) { set_cursor (lay::Cursor::cross); @@ -1532,12 +1544,14 @@ Service::mouse_move_event (const db::DPoint &p, unsigned int buttons, bool prio) void Service::deactivated () { + lay::EditorServiceBase::deactivated (); + drag_cancel (); clear_transient_selection (); } -std::pair -Service::snap1 (const db::DPoint &p, bool obj_snap) +lay::PointSnapToObjectResult +Service::snap1_details (const db::DPoint &p, bool obj_snap) { db::DVector g; if (m_grid_snap) { @@ -1545,13 +1559,19 @@ Service::snap1 (const db::DPoint &p, bool obj_snap) } double snap_range = widget ()->mouse_event_trans ().inverted ().ctrans (m_snap_range); - lay::PointSnapToObjectResult res = lay::obj_snap (obj_snap ? mp_view : 0, p, g, snap_range); + return lay::obj_snap (obj_snap ? mp_view : 0, p, g, snap_range); +} + +std::pair +Service::snap1 (const db::DPoint &p, bool obj_snap) +{ + lay::PointSnapToObjectResult res = snap1_details (p, obj_snap); return std::make_pair (res.object_snap != lay::PointSnapToObjectResult::NoObject, res.snapped_point); } -std::pair -Service::snap2 (const db::DPoint &p1, const db::DPoint &p2, const ant::Object *obj, lay::angle_constraint_type ac) +lay::PointSnapToObjectResult +Service::snap2_details (const db::DPoint &p1, const db::DPoint &p2, const ant::Object *obj, lay::angle_constraint_type ac) { db::DVector g; if (m_grid_snap) { @@ -1561,7 +1581,13 @@ Service::snap2 (const db::DPoint &p1, const db::DPoint &p2, const ant::Object *o double snap_range = widget ()->mouse_event_trans ().inverted ().ctrans (m_snap_range); lay::angle_constraint_type snap_mode = ac == lay::AC_Global ? (obj->angle_constraint () == lay::AC_Global ? m_snap_mode : obj->angle_constraint ()) : ac; - lay::PointSnapToObjectResult res = lay::obj_snap (m_obj_snap && obj->snap () ? mp_view : 0, p1, p2, g, snap_mode, snap_range); + return lay::obj_snap (m_obj_snap && obj->snap () ? mp_view : 0, p1, p2, g, snap_mode, snap_range); +} + +std::pair +Service::snap2 (const db::DPoint &p1, const db::DPoint &p2, const ant::Object *obj, lay::angle_constraint_type ac) +{ + lay::PointSnapToObjectResult res = snap2_details (p1, p2, obj, ac); return std::make_pair (res.object_snap != lay::PointSnapToObjectResult::NoObject, res.snapped_point); } diff --git a/src/ant/ant/antService.h b/src/ant/ant/antService.h index ad7a0eaa8..0f6d3b05b 100644 --- a/src/ant/ant/antService.h +++ b/src/ant/ant/antService.h @@ -27,9 +27,7 @@ #include "antCommon.h" -#include "layViewObject.h" -#include "layEditable.h" -#include "layPlugin.h" +#include "layEditorServiceBase.h" #include "layDrawing.h" #include "laySnap.h" #include "layAnnotationShapes.h" @@ -180,9 +178,7 @@ private: // ------------------------------------------------------------- class ANT_PUBLIC Service - : public lay::ViewService, - public lay::Editable, - public lay::Plugin, + : public lay::EditorServiceBase, public lay::Drawing, public db::Object { @@ -529,8 +525,10 @@ private: unsigned int m_current_template; std::pair snap1 (const db::DPoint &p, bool obj_snap); + lay::PointSnapToObjectResult snap1_details (const db::DPoint &p, bool obj_snap); std::pair snap2 (const db::DPoint &p1, const db::DPoint &p2, const ant::Object *obj, lay::angle_constraint_type ac); - + lay::PointSnapToObjectResult snap2_details (const db::DPoint &p1, const db::DPoint &p2, const ant::Object *obj, lay::angle_constraint_type ac); + const ant::Template ¤t_template () const; void show_message (); diff --git a/src/edt/edt/edtServiceImpl.cc b/src/edt/edt/edtServiceImpl.cc index b34ce269b..95bb95c07 100644 --- a/src/edt/edt/edtServiceImpl.cc +++ b/src/edt/edt/edtServiceImpl.cc @@ -417,17 +417,7 @@ void PolygonService::do_mouse_move_inactive (const db::DPoint &p) { lay::PointSnapToObjectResult snap_details = snap2_details (p); - - clear_mouse_cursors (); - - add_mouse_cursor (snap_details.snapped_point, - snap_details.object_snap == lay::PointSnapToObjectResult::ObjectVertex || - (snap_details.object_snap == lay::PointSnapToObjectResult::ObjectUnspecific && snap_details.object_ref.is_degenerate ())); - - if (snap_details.object_snap == lay::PointSnapToObjectResult::ObjectEdge || - (snap_details.object_snap == lay::PointSnapToObjectResult::ObjectUnspecific && ! snap_details.object_ref.is_degenerate ())) { - add_edge_marker (snap_details.object_ref, false); - } + mouse_cursor_from_snap_details (snap_details); } void diff --git a/src/laybasic/laybasic/layEditorServiceBase.cc b/src/laybasic/laybasic/layEditorServiceBase.cc index 1d8aad213..51f93429d 100644 --- a/src/laybasic/laybasic/layEditorServiceBase.cc +++ b/src/laybasic/laybasic/layEditorServiceBase.cc @@ -237,6 +237,21 @@ EditorServiceBase::clear_mouse_cursors () m_mouse_cursor_markers.clear (); } +void +EditorServiceBase::mouse_cursor_from_snap_details (const lay::PointSnapToObjectResult &snap_details) +{ + clear_mouse_cursors (); + + add_mouse_cursor (snap_details.snapped_point, + snap_details.object_snap == lay::PointSnapToObjectResult::ObjectVertex || + (snap_details.object_snap == lay::PointSnapToObjectResult::ObjectUnspecific && snap_details.object_ref.is_degenerate ())); + + if (snap_details.object_snap == lay::PointSnapToObjectResult::ObjectEdge || + (snap_details.object_snap == lay::PointSnapToObjectResult::ObjectUnspecific && ! snap_details.object_ref.is_degenerate ())) { + add_edge_marker (snap_details.object_ref, false); + } +} + bool EditorServiceBase::configure (const std::string &name, const std::string &value) { diff --git a/src/laybasic/laybasic/layEditorServiceBase.h b/src/laybasic/laybasic/layEditorServiceBase.h index 962388e15..7735b9deb 100644 --- a/src/laybasic/laybasic/layEditorServiceBase.h +++ b/src/laybasic/laybasic/layEditorServiceBase.h @@ -84,6 +84,11 @@ public: */ void clear_mouse_cursors (); + /** + * @brief Provides a nice mouse tracking cursor from the given snap details + */ + void mouse_cursor_from_snap_details (const lay::PointSnapToObjectResult &snap_details); + /** * @brief Gets the tracking cursor color */