diff --git a/mono/Assistance/Assistance.csproj b/mono/Assistance/Assistance.csproj
index fd7d1c5..c23bc66 100644
--- a/mono/Assistance/Assistance.csproj
+++ b/mono/Assistance/Assistance.csproj
@@ -58,6 +58,8 @@
+
+
diff --git a/mono/Assistance/Canvas.cs b/mono/Assistance/Canvas.cs
index 9ee910d..cf2360a 100644
--- a/mono/Assistance/Canvas.cs
+++ b/mono/Assistance/Canvas.cs
@@ -2,73 +2,7 @@ using System;
using System.Collections.Generic;
namespace Assistance {
- public class Canvas {
- public static readonly int initialSize = 100;
- public static readonly double incrementScale = 1.2;
-
- private int offsetX = -initialSize/2;
- private int offsetY = -initialSize/2;
- private Cairo.ImageSurface surface = new Cairo.ImageSurface(Cairo.Format.ARGB32, initialSize, initialSize);
-
- public void draw(Cairo.Context context) {
- context.Save();
- context.Translate(offsetX, offsetY);
- context.SetSource(surface);
- context.Paint();
- context.Restore();
- }
-
- public void expand(Rectangle rect) {
- int l = offsetX;
- int t = offsetY;
- int r = l + surface.Width;
- int b = t + surface.Height;
-
- int rl = (int)Math.Floor(rect.x0);
- int rt = (int)Math.Floor(rect.y0);
- int rr = Math.Max(rl, (int)Math.Ceiling(rect.x1));
- int rb = Math.Max(rt, (int)Math.Ceiling(rect.y1));
-
- int incX = (int)Math.Ceiling(surface.Width*incrementScale);
- int incY = (int)Math.Ceiling(surface.Height*incrementScale);
-
- if (rl < l) l = rl - incX;
- if (rt < t) t = rt - incY;
- if (rr > r) r = rr + incX;
- if (rb > b) b = rb + incY;
-
- int w = r - l;
- int h = b - t;
- if (l != offsetX || t != offsetY || w != surface.Width || h != surface.Height) {
- Cairo.ImageSurface newSurface = new Cairo.ImageSurface(Cairo.Format.ARGB32, w, h);
- Cairo.Context context = new Cairo.Context(newSurface);
- context.Translate(offsetX - l, offsetY - t);
- context.SetSource(surface);
- context.Paint();
- context.GetTarget().Flush();
- context.Dispose();
- surface.Dispose();
-
- offsetX = l;
- offsetY = t;
- surface = newSurface;
- }
- }
-
- private Cairo.Context getContext() {
- Cairo.Context context = new Cairo.Context(surface);
- context.Antialias = Cairo.Antialias.Gray;
- context.Translate(-offsetX, -offsetY);
- return context;
- }
-
- public void paintTrack(Track track) {
- expand(track.getBounds());
- Cairo.Context context = getContext();
- track.draw(context);
- context.GetTarget().Flush();
- context.Dispose();
- }
+ public class Canvas: DynamicSurface {
}
}
diff --git a/mono/Assistance/InputManager.cs b/mono/Assistance/InputManager.cs
index ddd1903..2023aff 100644
--- a/mono/Assistance/InputManager.cs
+++ b/mono/Assistance/InputManager.cs
@@ -4,6 +4,7 @@ using System.Collections.Generic;
namespace Assistance {
public class InputManager: Track.IOwner {
public static readonly Drawing.Pen penPreview = new Drawing.Pen("Dark Green", 1.0, 0.25);
+ public static readonly double levelAlpha = 0.8;
public class TrackHandler: Track.Handler {
public readonly List keys = new List();
@@ -116,7 +117,9 @@ namespace Assistance {
if (level < keyPointsSent) {
// apply
- keyPointsSent -= tool.paintApply(keyPointsSent - level);
+ int applied = tool.paintApply(keyPointsSent - level);
+ applied = Math.Max(0, Math.Min(keyPointsSent - level, applied));
+ keyPointsSent -= applied;
foreach(Track track in subTracks) {
TrackHandler handler = (TrackHandler)track.handler;
handler.keys.RemoveRange(keyPointsSent, handler.keys.Count - keyPointsSent);
@@ -185,7 +188,7 @@ namespace Assistance {
}
// send to tool
- if (keyPointsSent == keyPoints.Count)
+ if (keyPointsSent == keyPoints.Count && subTracks.Count > 0)
tool.paintTracks(subTracks);
// is paint finished?
@@ -365,9 +368,21 @@ namespace Assistance {
TrackHandler handler = (TrackHandler)track.handler;
int start = handler.keys[keyPointsSent];
if (start < track.points.Count) {
+ Drawing.Color color = penPreview.color;
+ int level = keyPointsSent;
+
+ color.apply(context);
context.MoveTo(track.points[start].point.position.x, track.points[start].point.position.y);
- for(int i = start + 1; i < track.points.Count; ++i)
- context.MoveTo(track.points[i].point.position.x, track.points[i].point.position.y);
+ for(int i = start + 1; i < track.points.Count; ++i) {
+ while(level < handler.keys.Count && handler.keys[level] <= i) {
+ context.Stroke();
+ context.MoveTo(track.points[i-1].point.position.x, track.points[i-1].point.position.y);
+ color.a *= levelAlpha;
+ color.apply(context);
+ ++level;
+ }
+ context.LineTo(track.points[i].point.position.x, track.points[i].point.position.y);
+ }
}
}
context.Stroke();
diff --git a/mono/Assistance/Tool.cs b/mono/Assistance/Tool.cs
index 2740d17..710faa0 100644
--- a/mono/Assistance/Tool.cs
+++ b/mono/Assistance/Tool.cs
@@ -9,8 +9,16 @@ namespace Assistance {
Tangents = 1,
Interpolation = 2,
Guideline = 4,
- Multiline = 8
+ Multiline = 8,
+ All = 15
};
+
+
+ public readonly Workarea workarea;
+
+
+ public Tool(Workarea workarea)
+ { this.workarea = workarea; }
public virtual ModifierTypes getAvailableModifierTypes()
{ return ModifierTypes.None; }
@@ -30,7 +38,7 @@ namespace Assistance {
// become: ------O-------O------------
public virtual void paintTracks(List