diff --git a/mono/Assistance/Assistance.csproj b/mono/Assistance/Assistance.csproj index 24e324e..14c9bec 100644 --- a/mono/Assistance/Assistance.csproj +++ b/mono/Assistance/Assistance.csproj @@ -57,10 +57,10 @@ - + diff --git a/mono/Assistance/InputManager.cs b/mono/Assistance/InputManager.cs index 1c595ac..f210226 100644 --- a/mono/Assistance/InputManager.cs +++ b/mono/Assistance/InputManager.cs @@ -299,7 +299,6 @@ namespace Assistance { addTrackPoint(track, p.position, p.pressure, p.tilt, p.time, finish); } } - paintTracks(); } private void actualActivate() { @@ -325,8 +324,10 @@ namespace Assistance { { wantActive = true; actualActivate(); } public void deactivate() { wantActive = false; actualActivate(); } + public void processTracks() + { if (isActive()) paintTracks(); } public void finishTracks() - { if (isActive()) touchTracks(true); } + { if (isActive()) { touchTracks(true); processTracks(); } } public List getInputTracks() { return tracks[0]; } @@ -340,7 +341,6 @@ namespace Assistance { if (!track.isFinished()) { double time = (double)(ticks - track.keyHistory.ticks)*Timer.step - track.keyHistory.timeOffset; addTrackPoint(track, position, pressure, tilt, time, final); - paintTracks(); } } } @@ -348,16 +348,20 @@ namespace Assistance { public void keyEvent(bool press, Gdk.Key key, long ticks) { state.keyEvent(press, key, ticks); if (isActive()) { + processTracks(); tool.keyEvent(press, key, state); touchTracks(); + processTracks(); } } public void buttonEvent(bool press, Gdk.Device device, uint button, long ticks) { state.buttonEvent(press, device, button, ticks); if (isActive()) { + processTracks(); tool.buttonEvent(press, device, button, state); touchTracks(); + processTracks(); } } diff --git a/mono/Assistance/InputModifierAssistants.cs b/mono/Assistance/InputModifierAssistants.cs index c7273c6..25ad889 100644 --- a/mono/Assistance/InputModifierAssistants.cs +++ b/mono/Assistance/InputModifierAssistants.cs @@ -3,17 +3,14 @@ using System.Diagnostics; using System.Collections.Generic; namespace Assistance { - public class InputModifierAssistants: InputModifierTangents { + public class InputModifierAssistants: InputManager.Modifier { public readonly Workarea workarea; - public readonly bool defaultTangents; public readonly List shownGuidelines = new List(); - public InputModifierAssistants(Workarea workarea, bool defaultTangents = false) { - this.workarea = workarea; - this.defaultTangents = defaultTangents; - } + public InputModifierAssistants(Workarea workarea) + { this.workarea = workarea; } - public new class Modifier: Track.Modifier { + public class Modifier: Track.Modifier { public Modifier(Track.Handler handler): base(handler) { } @@ -34,13 +31,10 @@ namespace Assistance { if (track.points.Count == 0) return; - Track.Handler handler = new Track.Handler(this, track); - modifier = new Modifier(handler); + track.handler = new Track.Handler(this, track); + modifier = new Modifier(track.handler); workarea.getGuidelines(modifier.guidelines, track.points[0].position); - if (defaultTangents && modifier.guidelines.Count == 0) - { base.modify(track, keyPoint, outTracks); return; } - track.handler = handler; subTrack = new Track(modifier); track.handler.tracks.Add(subTrack); @@ -52,9 +46,6 @@ namespace Assistance { } subTrack = track.handler.tracks[0]; - if (!(subTrack.modifier is Modifier)) - { base.modify(track, keyPoint, outTracks); return; } - modifier = (Modifier)subTrack.modifier; outTracks.Add(subTrack); diff --git a/mono/Assistance/InputModifierInterpolation.cs b/mono/Assistance/InputModifierInterpolation.cs deleted file mode 100644 index da499c1..0000000 --- a/mono/Assistance/InputModifierInterpolation.cs +++ /dev/null @@ -1,65 +0,0 @@ -using System; -using System.Collections.Generic; - -namespace Assistance { - public class InputModifierInterpolation: InputManager.Modifier { - public static readonly int maxRecursion = 8; - - public readonly double precision; - public readonly double precisionSqr; - - public InputModifierInterpolation(double precision = 1.0) { - this.precision = Math.Max(precision, Geometry.precision); - this.precisionSqr = this.precision*this.precision; - } - - public void addSegment(Track track, Track.Point p0, Track.Point p1, int level = 0) { - if (level >= maxRecursion || (p1.position - p0.position).lenSqr() <= precisionSqr) - { track.points.Add(p1); return; } - Track.Point p = track.modifier.calcPoint(0.5*(p0.originalIndex + p1.originalIndex)); - addSegment(track, p0, p, level + 1); - addSegment(track, p, p1, level + 1); - } - - public override void modify(Track track, InputManager.KeyPoint keyPoint, List outTracks) { - if (track.handler == null) { - track.handler = new Track.Handler(this, track); - track.handler.tracks.Add(new Track( new Track.Modifier(track.handler) )); - } - - Track subTrack = track.handler.tracks[0]; - outTracks.Add(subTrack); - - if (!track.isChanged) - return; - - // remove points - int start = track.points.Count - track.wayPointsAdded; - if (start < 0) start = 0; - int subStart = subTrack.floorIndex(subTrack.indexByOriginalIndex(start)); - if (subStart < 0) subStart = 0; - if (subStart < subTrack.points.Count && subTrack.points[subStart].originalIndex + Geometry.precision < start) - ++subStart; - - while(subStart > 0 && subTrack.points[subStart-1].originalIndex + Geometry.precision >= start) - --subStart; - if (subStart < subTrack.points.Count) { - subTrack.wayPointsRemoved += subTrack.points.Count - subStart; - subTrack.points.RemoveRange(subStart, subTrack.points.Count - subStart); - } - - // add points - Track.Point p0 = subTrack.modifier.calcPoint(start - 1); - for(int i = start; i < track.points.Count; ++i) { - Track.Point p1 = subTrack.modifier.calcPoint(i); - addSegment(subTrack, p0, p1); - p0 = p1; - } - subTrack.wayPointsAdded += subTrack.points.Count - subStart; - - track.wayPointsRemoved = 0; - track.wayPointsAdded = 0; - } - } -} - diff --git a/mono/Assistance/InputModifierSegmentation.cs b/mono/Assistance/InputModifierSegmentation.cs new file mode 100644 index 0000000..3cb4fea --- /dev/null +++ b/mono/Assistance/InputModifierSegmentation.cs @@ -0,0 +1,65 @@ +using System; +using System.Collections.Generic; + +namespace Assistance { + public class InputModifierSegmentation: InputManager.Modifier { + public static readonly int maxRecursion = 8; + + public readonly double precision; + public readonly double precisionSqr; + + public InputModifierSegmentation(double precision = 1.0) { + this.precision = Math.Max(precision, Geometry.precision); + this.precisionSqr = this.precision*this.precision; + } + + public void addSegments(Track track, Track.Point p0, Track.Point p1, int level = 0) { + if (level >= maxRecursion || (p1.position - p0.position).lenSqr() <= precisionSqr) + { track.points.Add(p1); return; } + Track.Point p = track.modifier.calcPoint(0.5*(p0.originalIndex + p1.originalIndex)); + addSegments(track, p0, p, level + 1); + addSegments(track, p, p1, level + 1); + } + + public override void modify(Track track, InputManager.KeyPoint keyPoint, List outTracks) { + if (track.handler == null) { + track.handler = new Track.Handler(this, track); + track.handler.tracks.Add(new Track( new Track.Modifier(track.handler) )); + } + + Track subTrack = track.handler.tracks[0]; + outTracks.Add(subTrack); + + if (!track.isChanged) + return; + + // remove points + int start = track.points.Count - track.wayPointsAdded; + if (start < 0) start = 0; + int subStart = subTrack.floorIndex(subTrack.indexByOriginalIndex(start)); + if (subStart < 0) subStart = 0; + if (subStart < subTrack.points.Count && subTrack.points[subStart].originalIndex + Geometry.precision < start) + ++subStart; + + while(subStart > 0 && subTrack.points[subStart-1].originalIndex + Geometry.precision >= start) + --subStart; + if (subStart < subTrack.points.Count) { + subTrack.wayPointsRemoved += subTrack.points.Count - subStart; + subTrack.points.RemoveRange(subStart, subTrack.points.Count - subStart); + } + + // add points + Track.Point p0 = subTrack.modifier.calcPoint(start - 1); + for(int i = start; i < track.points.Count; ++i) { + Track.Point p1 = subTrack.modifier.calcPoint(i); + addSegments(subTrack, p0, p1); + p0 = p1; + } + subTrack.wayPointsAdded += subTrack.points.Count - subStart; + + track.wayPointsRemoved = 0; + track.wayPointsAdded = 0; + } + } +} + diff --git a/mono/Assistance/MainWindow.cs b/mono/Assistance/MainWindow.cs index 138d843..99b9a59 100644 --- a/mono/Assistance/MainWindow.cs +++ b/mono/Assistance/MainWindow.cs @@ -48,8 +48,9 @@ namespace Assistance { private bool refreshOnIdle() { QueueDraw(); return false; } - private void Refresh() - { GLib.Idle.Add(refreshOnIdle); } + private void Refresh() { + QueueDraw(); //GLib.Idle.Add(refreshOnIdle); + } protected override bool OnDeleteEvent(Gdk.Event e) { Gtk.Application.Quit(); @@ -57,6 +58,8 @@ namespace Assistance { } protected override bool OnExposeEvent(Gdk.EventExpose e) { + workarea.inputManager.processTracks(); + Cairo.Context context = Gdk.CairoHelper.Create(e.Window); context.Save(); @@ -75,13 +78,11 @@ namespace Assistance { return false; } - public Point windowToWorkarea(Point p) { - return new Point(p.x - Allocation.Width/2.0, p.y - Allocation.Height/2.0); - } + public Point windowToWorkarea(Point p) + { return new Point(p.x - Allocation.Width/2.0, p.y - Allocation.Height/2.0); } - public Point workareaToWindow(Point p) { - return new Point(p.x + Allocation.Width/2.0, p.y + Allocation.Height/2.0); - } + public Point workareaToWindow(Point p) + { return new Point(p.x + Allocation.Width/2.0, p.y + Allocation.Height/2.0); } private void beginDrag() { endDragAndTrack(); diff --git a/mono/Assistance/Tool.cs b/mono/Assistance/Tool.cs index 710faa0..c7ba50d 100644 --- a/mono/Assistance/Tool.cs +++ b/mono/Assistance/Tool.cs @@ -7,7 +7,7 @@ namespace Assistance { public enum ModifierTypes { None = 0, Tangents = 1, - Interpolation = 2, + Segmentation = 2, Guideline = 4, Multiline = 8, All = 15 diff --git a/mono/Assistance/Workarea.cs b/mono/Assistance/Workarea.cs index 9fbd20b..ad957b1 100644 --- a/mono/Assistance/Workarea.cs +++ b/mono/Assistance/Workarea.cs @@ -8,18 +8,16 @@ namespace Assistance { public readonly InputManager inputManager; private readonly InputModifierTangents modifierTangents; - private readonly InputModifierAssistants modifierAssistantsSimple; - private readonly InputModifierAssistants modifierAssistantsTangents; - private readonly InputModifierInterpolation modifierInterpolation; + private readonly InputModifierAssistants modifierAssistants; + private readonly InputModifierSegmentation modifierSegmentation; public Workarea() { document = new Document(this); inputManager = new InputManager(this); modifierTangents = new InputModifierTangents(); - modifierAssistantsSimple = new InputModifierAssistants(this, false); - modifierAssistantsTangents = new InputModifierAssistants(this, true); - modifierInterpolation = new InputModifierInterpolation(); + modifierAssistants = new InputModifierAssistants(this); + modifierSegmentation = new InputModifierSegmentation(); } public Tool getTool() @@ -31,17 +29,15 @@ namespace Assistance { inputManager.clearModifiers(); if (tool != null) { Tool.ModifierTypes types = tool.getAvailableModifierTypes(); - if ((Tool.ModifierTypes.Tangents & types) != 0 && (Tool.ModifierTypes.Guideline & types) == 0) + if ((Tool.ModifierTypes.Tangents & types) != 0) inputManager.addModifier(modifierTangents); - if ((Tool.ModifierTypes.Tangents & types) == 0 && (Tool.ModifierTypes.Guideline & types) != 0) - inputManager.addModifier(modifierAssistantsSimple); - if ((Tool.ModifierTypes.Tangents & types) != 0 && (Tool.ModifierTypes.Guideline & types) != 0) - inputManager.addModifier(modifierAssistantsTangents); + if ((Tool.ModifierTypes.Guideline & types) != 0) + inputManager.addModifier(modifierAssistants); if ((Tool.ModifierTypes.Multiline & types) != 0) foreach(Modifier modifier in document.modifiers) inputManager.addModifier(modifier); - if ((Tool.ModifierTypes.Interpolation & types) != 0) - inputManager.addModifier(modifierInterpolation); + if ((Tool.ModifierTypes.Segmentation & types) != 0) + inputManager.addModifier(modifierSegmentation); } inputManager.setTool(tool); inputManager.activate();