WIP: Ruler now has a mouse snapping indicator too.

This commit is contained in:
Matthias Koefferlein 2020-09-07 23:49:42 +02:00
parent df1583b5db
commit 316cf77175
5 changed files with 63 additions and 29 deletions

View File

@ -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<bool, db::DPoint>
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<bool, db::DPoint>
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 <bool, db::DPoint>
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 <bool, db::DPoint>
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);
}

View File

@ -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<bool, db::DPoint> snap1 (const db::DPoint &p, bool obj_snap);
lay::PointSnapToObjectResult snap1_details (const db::DPoint &p, bool obj_snap);
std::pair<bool, db::DPoint> 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 &current_template () const;
void show_message ();

View File

@ -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

View File

@ -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)
{

View File

@ -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
*/