예제 #1
0
        public AddHoldRelayOperation(Hold hold, HoldRelay relay)
        {
            Invoke += () =>
            {
                hold.Put(relay);
            };

            Undo += () =>
            {
                hold.UnPut(relay);
            };
        }
예제 #2
0
        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;
            };
        }