public AddHoldRelayOperation(Hold hold, HoldRelay relay) { Invoke += () => { hold.Put(relay); }; Undo += () => { hold.UnPut(relay); }; }
private static void SetEventToPutHoldRelay( MadcaDisplay display, NoteBook noteBook, IReadOnlyList <IReadOnlyScore> scores, OperationManager opManager, IReadOnlyEditorStatus status) { var box = display.PictureBox; var env = display.EditorLaneEnvironment; var holder = display.KeyTokenHolder; var key = new KeyToken(); HoldRelay relay = null; box.MouseDown += (s, e) => { if (holder.Locked) { return; } if (status.EditorMode != EditorMode.Add || status.NoteMode != NoteMode.HoldRelay) { return; } var area = env.GetEditorLaneRegion(e.Location); if (area == EditorLaneRegion.Lane && e.Button == MouseButtons.Left) { Hold hold = null; foreach (var h in noteBook.Holds.Reverse()) { if (h.Contains(e.Location, env)) { hold = h; break; } } if (hold == null) { return; } var res = PositionConverter.ConvertRealToVirtual(env, e.Location, status.BeatStride, scores, out Position position); if (!res) { return; } relay = new HoldRelay(position.Lane, position.Timing, new NoteSize(status.NoteSize)); opManager.AddAndInvokeOperation(new AddHoldRelayOperation(hold, relay)); holder.Lock(key); } }; box.MouseMove += (s, e) => { if (!holder.CanUnLock(key)) { return; } var res = PositionConverter.ConvertRealToVirtual(env, e.Location, status.BeatStride, scores, out Position position); if (!res) { return; } relay.ReLocate(position.Lane, position.Timing); }; box.MouseUp += (s, e) => { if (!holder.UnLock(key)) { return; } relay = null; }; }