|
|
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;
|
|
|
0f2bf8 |
public readonly List<guideline> shownGuidelines = new List<guideline>();</guideline></guideline>
|
|
|
0f2bf8 |
|
|
|
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>
|
|
|
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);
|
|
|
0f2bf8 |
modifier = new Modifier(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.wayPointsRemoved += subTrack.points.Count - start;
|
|
|
0f2bf8 |
subTrack.points.RemoveRange(start, subTrack.points.Count - start);
|
|
|
1d3aae |
}
|
|
|
1d3aae |
|
|
|
0f2bf8 |
bool trackIsLong = track.points.Count > 0 && (track.getLast().length >= Guideline.maxLenght || track.isFinished());
|
|
|
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);
|
|
|
0f2bf8 |
if (guideline != null && 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;
|
|
|
0f2bf8 |
|
|
|
0f2bf8 |
track.wayPointsRemoved = 0;
|
|
|
0f2bf8 |
track.wayPointsAdded = 0;
|
|
|
1d3aae |
}
|
|
|
0f2bf8 |
|
|
|
0f2bf8 |
public override void drawHover(Cairo.Context context, Point hover) {
|
|
|
0f2bf8 |
workarea.getGuidelines(shownGuidelines, hover);
|
|
|
0f2bf8 |
foreach(Guideline guideline in shownGuidelines)
|
|
|
0f2bf8 |
guideline.draw(context);
|
|
|
0f2bf8 |
shownGuidelines.Clear();
|
|
|
0f2bf8 |
}
|
|
|
0f2bf8 |
|
|
|
0f2bf8 |
public override void drawTrack(Cairo.Context context, Track track) {
|
|
|
b9e5e0 |
if (track.handler == null) return;
|
|
|
b9e5e0 |
Track subTrack = track.handler.tracks[0];
|
|
|
0f2bf8 |
if (subTrack.points.Count > 0)
|
|
|
0f2bf8 |
drawHover(context, subTrack.getLast().point.position);
|
|
|
b9e5e0 |
}
|
|
|
1d3aae |
}
|
|
|
1d3aae |
}
|
|
|
1d3aae |
|