Blame mono/Assistance/InputModifierAssistants.cs

1d3aae
using System;
1d3aae
using System.Diagnostics;
1d3aae
using System.Collections.Generic;
1d3aae
1d3aae
namespace Assistance {
1d3aae
	public class InputModifierAssistants: InputModifierTangents {
1d3aae
		public readonly Workarea workarea;
b9e5e0
		public readonly bool defaultTangents;
1d3aae
		
b9e5e0
		public InputModifierAssistants(Workarea workarea, bool defaultTangents = false) {
1d3aae
			this.workarea = workarea;
b9e5e0
			this.defaultTangents = defaultTangents;
1d3aae
		}
1d3aae
		
589f9a
		public new class Modifier: Track.Modifier {
1d3aae
			public Modifier(Track.Handler handler):
1d3aae
				base(handler) { }
1d3aae
			
1d3aae
			public InputManager.KeyPoint.Holder holder = null;
1d3aae
			public List<guideline> guidelines = new List<guideline>();</guideline></guideline>
b9e5e0
			public List<guideline> hintGuidelines = new List<guideline>();</guideline></guideline>
1d3aae
			
1d3aae
			public override Track.WayPoint calcWayPoint(double originalIndex) {
1d3aae
				Track.WayPoint p = original.calcWayPoint(originalIndex);
1d3aae
				return guidelines.Count > 0 ? guidelines[0].transformPoint(p) : p;
1d3aae
			}
1d3aae
		}
1d3aae
589f9a
		public override void modify(Track track, InputManager.KeyPoint keyPoint, List<track> outTracks) {
1d3aae
			Track subTrack;
1d3aae
			Modifier modifier;
1d3aae
			
1d3aae
			if (track.handler == null) {
1d3aae
				if (track.points.Count == 0)
1d3aae
					return;
1d3aae
1d3aae
				Track.Handler handler = new Track.Handler(this, track);
589f9a
				modifier = new Modifier(track.handler);
1d3aae
				workarea.getGuidelines(modifier.guidelines, track.points[0].point.position);
b9e5e0
				if (defaultTangents && modifier.guidelines.Count == 0)
1d3aae
					{ base.modify(track, keyPoint, outTracks); return; }
1d3aae
				
1d3aae
				track.handler = handler;
1d3aae
				subTrack = new Track(modifier);
1d3aae
				track.handler.tracks.Add(subTrack);
1d3aae
				
1d3aae
				if (modifier.guidelines.Count > 1) {
1d3aae
					modifier.holder = keyPoint.hold();
1d3aae
					outTracks.Add(subTrack);
1d3aae
					return;
1d3aae
				}
1d3aae
			}
1d3aae
			
1d3aae
			subTrack = track.handler.tracks[0];
b9e5e0
			if (!(subTrack.modifier is Modifier))
1d3aae
				{ base.modify(track, keyPoint, outTracks); return; }
1d3aae
			
1d3aae
			modifier = (Modifier)subTrack.modifier;
1d3aae
			outTracks.Add(subTrack);
1d3aae
			
1d3aae
			if (!track.isChanged)
1d3aae
				return;
1d3aae
			
1d3aae
			// remove points
1d3aae
			int start = track.points.Count - track.wayPointsAdded;
1d3aae
			if (start < 0) start = 0;
1d3aae
			if (subTrack.points.Count < start) {
1d3aae
				subTrack.points.RemoveRange(start, subTrack.points.Count - start);
1d3aae
				subTrack.wayPointsRemoved += subTrack.points.Count - start;
1d3aae
			}
1d3aae
			
589f9a
			bool trackIsLong = track.points.Count > 0 && track.getLast().length >= Guideline.maxLenght;
1d3aae
			if (!trackIsLong && modifier.holder != null && !modifier.holder.isHolded && modifier.holder.available)
1d3aae
				modifier.holder.reuse();
1d3aae
			
1d3aae
			// select guideline
1d3aae
			if (modifier.holder != null && modifier.holder.isHolded) {
1d3aae
				Guideline guideline = Guideline.findBest(modifier.guidelines, track);
1d3aae
				if (guideline != modifier.guidelines[0]) {
1d3aae
					modifier.guidelines[ modifier.guidelines.IndexOf(guideline) ] = modifier.guidelines[0];
1d3aae
					modifier.guidelines[0] = guideline;
1d3aae
					start = 0;
1d3aae
					subTrack.wayPointsRemoved += subTrack.points.Count;
589f9a
					subTrack.points.Clear();
1d3aae
				}
1d3aae
				if (trackIsLong)
1d3aae
					modifier.holder.release();
1d3aae
			}
1d3aae
			
1d3aae
			// add points
1d3aae
			for(int i = start; i < track.points.Count; ++i)
1d3aae
				subTrack.points.Add(modifier.calcWayPoint(i));
1d3aae
			subTrack.wayPointsAdded = subTrack.points.Count - start;
1d3aae
		}
b9e5e0
		
b9e5e0
		public override void draw(Cairo.Context context, Track track) {
b9e5e0
			if (track.handler == null) return;
b9e5e0
			Track subTrack = track.handler.tracks[0];
b9e5e0
			if (!(subTrack.modifier is Modifier))
b9e5e0
				{ base.draw(context, track); return; }
b9e5e0
			Modifier modifier = (Modifier)subTrack.modifier;
b9e5e0
			if (modifier.guidelines.Count > 0 && subTrack.points.Count > 0) {
b9e5e0
				workarea.getGuidelines(modifier.hintGuidelines, subTrack.points[0].point.position);
b9e5e0
				foreach(Guideline gl in modifier.hintGuidelines)
b9e5e0
					gl.draw(context);
b9e5e0
				modifier.hintGuidelines.Clear();
b9e5e0
			}
b9e5e0
		}
1d3aae
	}
1d3aae
}
1d3aae