Commit 0f067ab
show all control point handles
Changed files (4)
addedicons/show_all_line_handles.pngmodifiedlibbirdfont/DrawingTools.valamodifiedlibbirdfont/Path.valamodifiedlibbirdfont/PenTool.vala
Diff
new file mode 100644Binary files /dev/null and b/icons/show_all_line_handles.png differ@@ -532,6 +532,7 @@ public class DrawingTools : ToolCollection { MainWindow.get_toolbox ().redraw ((int) stroke_width.x, (int) stroke_width.y, 70, 70); }); style_tools.add_tool (stroke_width);+ stroke_width.set_max (4); ColorTool handle_color = new ColorTool (_("Handle color")); handle_color.color_updated.connect (() => {@@ -581,6 +582,14 @@ public class DrawingTools : ToolCollection { style_tools.add_tool (precision); + Tool show_all_line_handles = new Tool ("show_all_line_handles", _("Show all control point handles or only handles for the selected points."));+ show_all_line_handles.select_action.connect((self) => {+ Path.show_all_line_handles = !Path.show_all_line_handles;+ Glyph g = MainWindow.get_current_glyph ();+ g.redraw_area (0, 0, g.allocation.width, g.allocation.height); + });+ style_tools.add_tool (show_all_line_handles);+ draw_tools.set_open (true); draw_tool_modifiers.set_open (true); edit_point_modifiers.set_open (true);@@ -74,6 +74,7 @@ public class Path { public static double handle_color_a = 1; public static double stroke_width = 1;+ public static bool show_all_line_handles = true; public Path () { string width;@@ -156,8 +157,9 @@ public class Path { if (is_editable ()) { // control points for curvature foreach (EditPoint e in ep) {- if (e.selected || e.selected_handle > 0)+ if (show_all_line_handles || e.selected || e.selected_handle > 0) { draw_edit_point_handles (e, cr);+ } } // control points@@ -1023,58 +1023,82 @@ public class PenTool : Tool { begin_new_point_on_path = true; } - private bool is_over_handle (double event_x, double event_y) {+ private bool is_over_handle (double event_x, double event_y) { + Glyph g;+ + if (!Path.show_all_line_handles) {+ foreach (EditPoint selected_corner in selected_points) {+ if (is_close_to_handle (selected_corner, event_x, event_y)) {+ return true;+ }+ }+ } else {+ g = MainWindow.get_current_glyph (); + foreach (Path p in g.path_list) {+ foreach (EditPoint ep in p.points) {+ if (is_close_to_handle (ep, event_x, event_y)) {+ return true;+ }+ }+ }+ }+ + return false;+ }++ private bool is_close_to_handle (EditPoint selected_corner, double event_x, double event_y) { double x = Glyph.path_coordinate_x (event_x); double y = Glyph.path_coordinate_y (event_y); Glyph g = MainWindow.get_current_glyph (); double d_point = g.view_zoom * get_distance_to_closest_edit_point (event_x, event_y);- double dl, dr;- - foreach (EditPoint selected_corner in selected_points) {- dl = g.view_zoom * selected_corner.get_left_handle ().get_point ().get_distance (x, y);- dr = g.view_zoom * selected_corner.get_right_handle ().get_point ().get_distance (x, y); - if (dl < CONTACT_SURFACE && dl < d_point) {- return true;- }+ dl = g.view_zoom * selected_corner.get_left_handle ().get_point ().get_distance (x, y);+ dr = g.view_zoom * selected_corner.get_right_handle ().get_point ().get_distance (x, y);+ + if (dl < CONTACT_SURFACE && dl < d_point) {+ return true;+ } - if (dr < CONTACT_SURFACE && dr < d_point) {- return true;- }+ if (dr < CONTACT_SURFACE && dr < d_point) {+ return true; }- + return false;- }+ } EditPointHandle get_closest_handle (double event_x, double event_y) { EditPointHandle left, right; double x = Glyph.path_coordinate_x (event_x); double y = Glyph.path_coordinate_y (event_y); EditPointHandle eh = new EditPointHandle.empty();+ Glyph g = MainWindow.get_current_glyph (); double d = double.MAX; double dn;- - foreach (EditPoint selected_corner in selected_points) {- left = selected_corner.get_left_handle ();- right = selected_corner.get_right_handle (); - dn = left.get_point ().get_distance (x, y);- - if (dn < d) {- eh = left;- d = dn;- }-- dn = right.get_point ().get_distance (x, y);- - if (dn < d) {- eh = right;- d = dn;+ foreach (Path p in g.path_list) {+ foreach (EditPoint ep in p.points) {+ if (ep.is_selected () || Path.show_all_line_handles) {+ left = ep.get_left_handle ();+ right = ep.get_right_handle ();++ dn = left.get_point ().get_distance (x, y);+ + if (dn < d) {+ eh = left;+ d = dn;+ }++ dn = right.get_point ().get_distance (x, y);+ + if (dn < d) {+ eh = right;+ d = dn;+ }+ } } }- return eh; }