using System; using System.Collections.Generic; using System.Linq; namespace Assistance { public class Workarea { public readonly Document document; public readonly InputManager inputManager; private readonly InputModifierTangents modifierTangents; private readonly InputModifierAssistants modifierAssistants; private readonly InputModifierSegmentation modifierSegmentation; public Workarea() { document = new Document(this); inputManager = new InputManager(this); modifierTangents = new InputModifierTangents(); modifierAssistants = new InputModifierAssistants(this); modifierSegmentation = new InputModifierSegmentation(); } public Tool getTool() { return inputManager.getTool(); } public void setTool(Tool tool, bool force = false) { if (getTool() != tool || force) { inputManager.deactivate(); inputManager.clearModifiers(); if (tool != null) { Tool.ModifierTypes types = tool.getAvailableModifierTypes(); if ((Tool.ModifierTypes.Tangents & types) != 0) inputManager.addModifier(modifierTangents); 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.Segmentation & types) != 0) inputManager.addModifier(modifierSegmentation); } inputManager.setTool(tool); inputManager.activate(); } } public void updateModifiers() { setTool(getTool(), true); } public ActivePoint findPoint(Point position) { foreach(ActivePoint point in document.points.Reverse()) if (point.isInside(position)) return point; return null; } public void getGuidelines(List outGuidelines, Point target) { foreach(Assistant assistant in document.assistants) assistant.getGuidelines(outGuidelines, target); } public void draw(Cairo.Context context, List hovers, ActivePoint activePoint) { // canvas document.canvas.draw(context); // input manager inputManager.draw(context, hovers); // modifiers foreach(Modifier modifier in document.modifiers) modifier.draw(context); // assistants foreach(Assistant assistant in document.assistants) assistant.draw(context); // active points foreach(ActivePoint point in document.points) point.draw(context, activePoint == point); } } }