private void StartAction(MouseEventArgs e) { switch (ActiveElementType) { case HoverType.Unknown when !e.CtrlKey && !e.ShiftKey: // panning starts, when you simply press the mouse down anywhere where there's nothing. ActionType = ActionType.Pan; break; case HoverType.Unknown when e.ShiftKey: ActionType = ActionType.SelectRegion; select_region.Origin = new Point(e.RelativeToOrigin(this)); select_region.Point = new Point(e.RelativeToOrigin(this)); break; case HoverType.Unknown when e.CtrlKey: // this isn't really a sensible thing to do. It's probably a misplaced select break; case HoverType.Border: // we create a new link if we simply press on the border of a node CreateNewLink(e); break; case HoverType.Node when !e.CtrlKey: StartMove(); break; case HoverType.Node when e.CtrlKey: // this is a selection/deselection, but the action type is not yet known. TriggerSelectionOfNode(); break; case HoverType.Anchor: ActionObject.Set(ActiveElement.Link, ActiveElement.Anchor); ActionType = ActionType.MoveAnchor; break; case HoverType.ControlPoint: ActionObject.Set(ActiveElement.Link, ActiveElement.ControlPoint); ActionType = ActionType.MoveControlPoint; break; case HoverType.Link: ActionObject.Set(ActiveElement.Link); ActiveElement.Link.Select(); ActionType = ActionType.ModifyLink; break; case HoverType.NewNode: CreateNewNode(); break; } }
private void FixNodeAnchor(MouseEventArgs e) { var(anchor, old_node, old_x, old_y) = (ActionObject.Anchor, ActionObject.Node, ActionObject.X, ActionObject.Y); var node = ActiveElement.Node; if (node == null && !ActionObject.Link.Links.AllowFreeFloatingLinks) { // free-floating links are not allowed and this action would not attach the link to a node return; } var(x, y) = (node != null) ? e.RelativeTo(node) : e.RelativeToOrigin(this); Changes.NewAndDo(new ChangeAction(() => { anchor.Node = node; anchor.RelativeX = x; anchor.RelativeY = y; }, () => { anchor.Node = old_node; anchor.RelativeX = old_x; anchor.RelativeY = old_y; })); Overview?.TriggerUpdate(); ActionObject.Link.Deselect(); ActionObject.Link.Links.OnModified?.Invoke(ActionObject.Link); ActionObject.Clear(); ActionType = ActionType.None; }
private void UpdateSelection(MouseEventArgs e) { (select_region.Point.X, select_region.Point.Y) = e.RelativeToOrigin(this); select_region.TriggerStateHasChanged(); var p1 = select_region.Point; var p2 = select_region.Origin; var(min_x, max_x) = (Math.Min(p1.X, p2.X), Math.Max(p1.X, p2.X)); var(min_y, max_y) = (Math.Min(p1.Y, p2.Y), Math.Max(p1.Y, p2.Y)); foreach (var node in Nodes.all_nodes) { if (min_x <= node.X && node.X <= max_x && min_y <= node.Y && node.Y <= max_y && !Group.Contains(node)) { node.Select(); node.TriggerStateHasChanged(); Group.Add(node); } } }