Clone in a terminal:
Commit 767b306
Johan Mattsson - 2015-05-03T18:56:09+00:00
767b3065af226e5365e242f10a66d9f9fafe6efajohan.mattsson.m@gmail.com

Keep end points asymmetrical

Changed files (4)

Diff

diff --git a/libbirdfont/DrawingTools.vala b/libbirdfont/DrawingTools.valaindex d790626..ef5aaad 100644--- a/libbirdfont/DrawingTools.vala+++ b/libbirdfont/DrawingTools.vala@@ -491,13 +491,22 @@ public class DrawingTools : ToolCollection  { 		// tie edit point handles 		tie_handles = new Tool ("tie_point", t_("Tie curve handles for the selected edit point")); 		tie_handles.select_action.connect ((self) => {-			bool tie;+			bool tie, end_point; 			EditPoint p; 			 			if (PenTool.move_selected_handle) { 				p = PenTool.active_handle.parent; 				tie = !p.tie_handles; 				+				// don't tie end points+				foreach (Path path in MainWindow.get_current_glyph ().active_paths) {+					if (path.is_open ()) {+						if (p == path.get_first_point () || p == path.get_last_point ()) {+							tie = false;+						}+					}+				}+				 				if (tie) { 					p.process_tied_handle (); 					p.set_reflective_handles (false);@@ -510,13 +519,18 @@ public class DrawingTools : ToolCollection  { 				foreach (PointSelection ep in PenTool.selected_points) { 					tie = !ep.point.tie_handles; 					-					if (tie) {-						ep.point.process_tied_handle ();-						ep.point.set_reflective_handles (false);+					end_point = ep.point == ep.path.get_first_point () +						|| ep.point == ep.path.get_last_point ();+					+					if (!ep.path.is_open () || !end_point) {+						if (tie) {+							ep.point.process_tied_handle ();+							ep.point.set_reflective_handles (false);+						}+					+						ep.point.set_tie_handle (tie);+						ep.path.update_region_boundaries (); 					}-				-					ep.point.set_tie_handle (tie);-					ep.path.update_region_boundaries (); 				} 			} 			@@ -528,20 +542,26 @@ public class DrawingTools : ToolCollection  { 		// symmetrical handles 		reflect_handle = new Tool ("symmetric", t_("Symmetrical handles")); 		reflect_handle.select_action.connect ((self) => {-			bool symmetrical;+			bool symmetrical, end_point; 			PointSelection ep; 			if (PenTool.selected_points.size > 0) { 				ep = PenTool.selected_points.get (0); 				symmetrical = ep.point.reflective_point;-				foreach (PointSelection p in PenTool.selected_points) {-					p.point.set_reflective_handles (!symmetrical);-					p.point.process_symmetrical_handles ();+				+				foreach (PointSelection p in PenTool.selected_points) {					+					end_point = p.point == p.path.get_first_point () +						|| p.point == p.path.get_last_point (); 					-					if (symmetrical) {-						ep.point.set_tie_handle (false);+					if (!p.path.is_open () || !end_point) {+						p.point.set_reflective_handles (!symmetrical);+						p.point.process_symmetrical_handles ();+						+						if (symmetrical) {+							ep.point.set_tie_handle (false);+						}+						+						p.path.update_region_boundaries (); 					}-					-					p.path.update_region_boundaries (); 				} 				MainWindow.get_current_glyph ().update_view (); 			}diff --git a/libbirdfont/EditPointHandle.vala b/libbirdfont/EditPointHandle.valaindex e700be2..4198800 100644--- a/libbirdfont/EditPointHandle.vala+++ b/libbirdfont/EditPointHandle.vala@@ -107,7 +107,7 @@ public class EditPointHandle : GLib.Object { 		return n; 	} -	public unowned EditPoint get_parent () {+	public EditPoint get_parent () { 		return parent; 	} diff --git a/libbirdfont/ForesightTool.vala b/libbirdfont/ForesightTool.valaindex d1b7e75..2b3f020 100644--- a/libbirdfont/ForesightTool.vala+++ b/libbirdfont/ForesightTool.vala@@ -198,10 +198,17 @@ public class ForesightTool : Tool { 			PointSelection last; 			bool lh; 			EditPointHandle h;-+			Path a;+			 			last_move_x = x; 			last_move_y = y;-			++			a = get_active_path ();+			if (a.is_open ()) {+				a.get_first_point ().set_reflective_handles (false);+				a.get_first_point ().set_tie_handle (false);+			}+							 			if (MainWindow.dialog.visible && state != NONE) { 				state = NONE; 				p.release_action (p, 1, last_move_x, last_move_y);@@ -325,12 +332,14 @@ public class ForesightTool : Tool { 	 	public void stop_drawing () { 		PenTool p = (PenTool) PointTool.pen ();+		Path a; 		 		p.release_action (p, 1, 0, 0); 		 		if (state != NONE) {-			if (get_active_path ().is_open () && state != NONE) {-				get_active_path ().delete_last_point ();+			a = get_active_path ();+			if (a.is_open () && state != NONE) {+				a.delete_last_point (); 			} 		} 	diff --git a/libbirdfont/PenTool.vala b/libbirdfont/PenTool.valaindex d2c8e0e..19b3eea 100644--- a/libbirdfont/PenTool.vala+++ b/libbirdfont/PenTool.vala@@ -194,6 +194,15 @@ public class PenTool : Tool { 			point_selection_image = false; 			BirdFont.get_current_font ().touch (); 			reset_stroke ();+			+			foreach (Path p in g.active_paths) {+				if (p.is_open ()) {+					p.get_first_point ().set_tie_handle (false);+					p.get_first_point ().set_reflective_handles (false);+					p.get_last_point ().set_tie_handle (false);+					p.get_last_point ().set_reflective_handles (false);+				}+			} 		});  		move_action.connect ((self, x, y) => {@@ -798,6 +807,7 @@ public class PenTool : Tool { 	public void press (int button, int x, int y, bool double_click) { 		Glyph? g = MainWindow.get_current_glyph (); 		Glyph glyph = (!) g;+		bool reflective; 		 		return_if_fail (g != null); @@ -832,9 +842,22 @@ public class PenTool : Tool { 			if ((KeyBindings.has_alt () || KeyBindings.has_ctrl ()) 				&& is_over_handle (x, y)) { 				-				selected_handle.parent.set_reflective_handles (false);-				selected_handle.parent.set_tie_handle (false);-				GlyphCanvas.redraw ();+				// don't use set point to reflective to on open ends+				reflective = true;+				foreach (Path path in MainWindow.get_current_glyph ().active_paths) {+					if (path.is_open ()) {+						if (selected_handle.parent == path.get_first_point ()	+							|| selected_handle.parent == path.get_last_point ()) {+							reflective = false;+						}+					}+				}+				+				if (reflective) {+					selected_handle.parent.set_reflective_handles (false);+					selected_handle.parent.set_tie_handle (false);+					GlyphCanvas.redraw ();+				} 			} 			 			return;@@ -1750,7 +1773,8 @@ public class PenTool : Tool { 	}  	private void curve_corner_event (double event_x, double event_y) {-		MainWindow.get_current_glyph ().open_path ();+		Glyph g = MainWindow.get_current_glyph ();+		g.open_path (); 		PointSelection p;  		if (!is_over_handle (event_x, event_y)) {@@ -1764,6 +1788,9 @@ public class PenTool : Tool { 		selected_handle = p.handle; 		handle_selection = p; 		selected_handle.selected = true;+		+		active_path = p.path;+		g.add_active_path (active_path); 	}  	public static void add_selected_point (EditPoint p, Path path) {

Contact

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