mirror of https://github.com/KLayout/klayout.git
WIP: Ruler now has a mouse snapping indicator too.
This commit is contained in:
parent
df1583b5db
commit
316cf77175
|
|
@ -706,9 +706,7 @@ View::render (const lay::Viewport &vp, lay::ViewObjectCanvas &canvas)
|
||||||
// ant::Service implementation
|
// ant::Service implementation
|
||||||
|
|
||||||
Service::Service (db::Manager *manager, lay::LayoutView *view)
|
Service::Service (db::Manager *manager, lay::LayoutView *view)
|
||||||
: lay::ViewService (view->view_object_widget ()),
|
: lay::EditorServiceBase (view),
|
||||||
lay::Editable (view),
|
|
||||||
lay::Plugin (view),
|
|
||||||
lay::Drawing (1/*number of planes*/, view->drawings ()),
|
lay::Drawing (1/*number of planes*/, view->drawings ()),
|
||||||
db::Object (manager),
|
db::Object (manager),
|
||||||
m_halo (true),
|
m_halo (true),
|
||||||
|
|
@ -801,7 +799,7 @@ Service::configure (const std::string &name, const std::string &value)
|
||||||
m_current_template = n;
|
m_current_template = n;
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
taken = false;
|
lay::EditorServiceBase::configure (name, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
return taken;
|
return taken;
|
||||||
|
|
@ -1516,6 +1514,20 @@ 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)
|
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) {
|
if (m_drawing && prio) {
|
||||||
|
|
||||||
set_cursor (lay::Cursor::cross);
|
set_cursor (lay::Cursor::cross);
|
||||||
|
|
@ -1532,12 +1544,14 @@ Service::mouse_move_event (const db::DPoint &p, unsigned int buttons, bool prio)
|
||||||
void
|
void
|
||||||
Service::deactivated ()
|
Service::deactivated ()
|
||||||
{
|
{
|
||||||
|
lay::EditorServiceBase::deactivated ();
|
||||||
|
|
||||||
drag_cancel ();
|
drag_cancel ();
|
||||||
clear_transient_selection ();
|
clear_transient_selection ();
|
||||||
}
|
}
|
||||||
|
|
||||||
std::pair<bool, db::DPoint>
|
lay::PointSnapToObjectResult
|
||||||
Service::snap1 (const db::DPoint &p, bool obj_snap)
|
Service::snap1_details (const db::DPoint &p, bool obj_snap)
|
||||||
{
|
{
|
||||||
db::DVector g;
|
db::DVector g;
|
||||||
if (m_grid_snap) {
|
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);
|
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);
|
return std::make_pair (res.object_snap != lay::PointSnapToObjectResult::NoObject, res.snapped_point);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
std::pair <bool, db::DPoint>
|
lay::PointSnapToObjectResult
|
||||||
Service::snap2 (const db::DPoint &p1, const db::DPoint &p2, const ant::Object *obj, lay::angle_constraint_type ac)
|
Service::snap2_details (const db::DPoint &p1, const db::DPoint &p2, const ant::Object *obj, lay::angle_constraint_type ac)
|
||||||
{
|
{
|
||||||
db::DVector g;
|
db::DVector g;
|
||||||
if (m_grid_snap) {
|
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);
|
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::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);
|
return std::make_pair (res.object_snap != lay::PointSnapToObjectResult::NoObject, res.snapped_point);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -27,9 +27,7 @@
|
||||||
|
|
||||||
#include "antCommon.h"
|
#include "antCommon.h"
|
||||||
|
|
||||||
#include "layViewObject.h"
|
#include "layEditorServiceBase.h"
|
||||||
#include "layEditable.h"
|
|
||||||
#include "layPlugin.h"
|
|
||||||
#include "layDrawing.h"
|
#include "layDrawing.h"
|
||||||
#include "laySnap.h"
|
#include "laySnap.h"
|
||||||
#include "layAnnotationShapes.h"
|
#include "layAnnotationShapes.h"
|
||||||
|
|
@ -180,9 +178,7 @@ private:
|
||||||
// -------------------------------------------------------------
|
// -------------------------------------------------------------
|
||||||
|
|
||||||
class ANT_PUBLIC Service
|
class ANT_PUBLIC Service
|
||||||
: public lay::ViewService,
|
: public lay::EditorServiceBase,
|
||||||
public lay::Editable,
|
|
||||||
public lay::Plugin,
|
|
||||||
public lay::Drawing,
|
public lay::Drawing,
|
||||||
public db::Object
|
public db::Object
|
||||||
{
|
{
|
||||||
|
|
@ -529,7 +525,9 @@ private:
|
||||||
unsigned int m_current_template;
|
unsigned int m_current_template;
|
||||||
|
|
||||||
std::pair<bool, db::DPoint> snap1 (const db::DPoint &p, bool obj_snap);
|
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);
|
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 ¤t_template () const;
|
const ant::Template ¤t_template () const;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -417,17 +417,7 @@ void
|
||||||
PolygonService::do_mouse_move_inactive (const db::DPoint &p)
|
PolygonService::do_mouse_move_inactive (const db::DPoint &p)
|
||||||
{
|
{
|
||||||
lay::PointSnapToObjectResult snap_details = snap2_details (p);
|
lay::PointSnapToObjectResult snap_details = snap2_details (p);
|
||||||
|
mouse_cursor_from_snap_details (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);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
|
||||||
|
|
@ -237,6 +237,21 @@ EditorServiceBase::clear_mouse_cursors ()
|
||||||
m_mouse_cursor_markers.clear ();
|
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
|
bool
|
||||||
EditorServiceBase::configure (const std::string &name, const std::string &value)
|
EditorServiceBase::configure (const std::string &name, const std::string &value)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -84,6 +84,11 @@ public:
|
||||||
*/
|
*/
|
||||||
void clear_mouse_cursors ();
|
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
|
* @brief Gets the tracking cursor color
|
||||||
*/
|
*/
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue