Clone in a terminal:
Commit 0f067ab
Johan Mattsson - 2013-08-25T16:18:55+00:00
0f067abadfa3a83bffd1c253f7c4fc0658a0c393johan.mattsson.m@gmail.com

show all control point handles

Changed files (4)

Diff

diff --git a/icons/show_all_line_handles.png b/icons/show_all_line_handles.pngnew file mode 100644index 0000000..0ed151dBinary files /dev/null and b/icons/show_all_line_handles.png differdiff --git a/libbirdfont/DrawingTools.vala b/libbirdfont/DrawingTools.valaindex 2fbd75f..13339ff 100644--- a/libbirdfont/DrawingTools.vala+++ b/libbirdfont/DrawingTools.vala@@ -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);diff --git a/libbirdfont/Path.vala b/libbirdfont/Path.valaindex d003e67..6fa71fa 100644--- a/libbirdfont/Path.vala+++ b/libbirdfont/Path.vala@@ -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 pointsdiff --git a/libbirdfont/PenTool.vala b/libbirdfont/PenTool.valaindex 219a6c9..c128cb8 100644--- a/libbirdfont/PenTool.vala+++ b/libbirdfont/PenTool.vala@@ -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; 	} 

Contact

Email: johan.mattsson.m@gmail.com
Mastodon: typo.social/@birdfont
GitHub: johanmattssonm
LinkedIn: johan-mattsson-2ab324112