Example #1
0
        private static void SetEventToDrawPreviewNote(
            MadcaDisplay display, IReadOnlyList <IReadOnlyScore> scores, IReadOnlyEditorStatus status)
        {
            var box        = display.PictureBox;
            var laneEnv    = display.EditorLaneEnvironment;
            var previewEnv = display.PreviewDisplayEnvironment;
            var holder     = display.KeyTokenHolder;

            var  note    = new PreviewNote(new LanePotision(0), new TimingPosition(1, 0), new NoteSize(status.NoteSize));
            bool visible = false;

            box.MouseMove += (s, e) =>
            {
                if (holder.Locked || status.EditorMode != EditorMode.Add)
                {
                    visible = false;
                    return;
                }
                var area = laneEnv.GetEditorLaneRegion(e.Location);
                if (area == EditorLaneRegion.Lane)
                {
                    visible = true;
                    var res = PositionConverter.ConvertRealToVirtual(laneEnv, e.Location, status.BeatStride, scores, out Position position);
                    if (res)
                    {
                        note.ReLocate(position.Lane, position.Timing);
                    }
                }
                else
                {
                    visible = false;
                }
            };
            box.Paint += (s, e) =>
            {
                if (visible)
                {
                    note.ReSize(new NoteSize(status.NoteSize));
                    note.SelectedNote = status.NoteMode.ToNoteType();
                    NoteDrawer.DrawToLane(e.Graphics, laneEnv, note);
                    NoteDrawer.DrawToPreview(e.Graphics, previewEnv, note);
                }
            };
        }
Example #2
0
        private static void SetEventToDeleteNote(MadcaDisplay display, NoteBook noteBook, OperationManager opManager, IReadOnlyEditorStatus status)
        {
            display.PictureBox.MouseDown += (s, e) =>
            {
                var env = display.EditorLaneEnvironment;
                if (status.EditorMode != EditorMode.Delete)
                {
                    return;
                }
                var area = env.GetEditorLaneRegion(e.Location);
                if (area == EditorLaneRegion.Lane && e.Button == MouseButtons.Left)
                {
                    var note = noteBook.Notes.FindLast(x => x.GetRectangle(env).ContainsEx(e.Location, env));
                    if (note != null)
                    {
                        opManager.AddAndInvokeOperation(new DeleteShortNoteOperation(noteBook, note));
                        return;
                    }

                    foreach (var hold in noteBook.Holds.Reverse())
                    {
                        if (hold.HoldBegin.GetRectangle(env).ContainsEx(e.Location, env))
                        {
                            opManager.AddAndInvokeOperation(new DeleteHoldOperation(noteBook, hold));
                            return;
                        }
                        foreach (var step in hold.StepNotes)
                        {
                            if (step.GetRectangle(env).ContainsEx(e.Location, env))
                            {
                                opManager.AddAndInvokeOperation(new DeleteHoldStepOperation(hold, step));
                                return;
                            }
                        }
                    }
                }
            };
        }
Example #3
0
        private static void SetEventToSetCursor(MadcaDisplay display, NoteBook noteBook, IReadOnlyEditorStatus status)
        {
            var box = display.PictureBox;
            var env = display.EditorLaneEnvironment;

            box.MouseMove += (s, e) =>
            {
                if (status.EditorMode != EditorMode.Edit)
                {
                    box.Cursor = Cursors.Default;
                    return;
                }
                if (!GetSelectedNote(e.Location, display, noteBook, out var note))
                {
                    box.Cursor = Cursors.Default;
                    return;
                }
                var area = note.SelectedNoteArea(e.Location, env);
                if (area == SelectedNoteArea.Left || area == SelectedNoteArea.Right)
                {
                    box.Cursor = Cursors.SizeWE;
                    return;
                }
                if (area == SelectedNoteArea.Center)
                {
                    box.Cursor = Cursors.SizeAll;
                    return;
                }
                box.Cursor = Cursors.Default;
            };
        }
Example #4
0
        private static void SetEventToReSizeNote(
            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();
            NoteBase         note       = null;
            Position         prevPos    = null;
            NoteSize         prevSize   = null;
            Position         mouseBegin = null;
            SelectedNoteArea noteArea   = SelectedNoteArea.None;

            box.MouseDown += (s, e) =>
            {
                if (holder.Locked || status.EditorMode != EditorMode.Edit)
                {
                    return;
                }
                var area = env.GetEditorLaneRegion(e.Location);
                if (area == EditorLaneRegion.Lane && e.Button == MouseButtons.Left)
                {
                    if (!GetSelectedNote(e.Location, display, noteBook, out note))
                    {
                        return;
                    }
                    noteArea = note.SelectedNoteArea(e.Location, env);
                    if (!(noteArea == SelectedNoteArea.Left || noteArea == SelectedNoteArea.Right))
                    {
                        return;
                    }
                    prevPos  = new Position(note.Lane, note.Timing);
                    prevSize = new NoteSize(note.NoteSize);
                    var res = PositionConverter.ConvertRealToVirtual(env, e.Location, status.BeatStride, scores, out mouseBegin);
                    if (!res)
                    {
                        return;
                    }
                    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;
                }
                var lane = position.Lane.RawLane - mouseBegin.Lane.RawLane;
                switch (noteArea)
                {
                case SelectedNoteArea.Left:
                {
                    var diff = prevSize.Size - lane;
                    if (1 <= diff && diff <= MadcaEnv.LaneCount)
                    {
                        note.ReLocate(new LanePotision(prevPos.Lane.RawLane + lane), note.Timing);
                    }
                    note.ReSize(new NoteSize(prevSize.Size - lane));
                    return;
                }

                case SelectedNoteArea.Right:
                {
                    note.ReSize(new NoteSize(prevSize.Size + lane));
                    return;
                }

                default: return;
                }
            };

            box.MouseUp += (s, e) =>
            {
                if (!holder.UnLock(key))
                {
                    return;
                }
                var ops = new List <Operation>();
                // TODO: 条件式要検討
                if (prevPos.Lane.RawLane != note.Lane.RawLane || prevPos.Timing != note.Timing)
                {
                    ops.Add(new ReLocateNoteOperation(note, prevPos, new Position(note.Lane, note.Timing)));
                }
                if (prevSize != note.NoteSize)
                {
                    ops.Add(new ReSizeNoteOperation(note, prevSize, note.NoteSize));
                }
                if (ops.Any())
                {
                    opManager.AddOperation(new CompositeOperation(ops.ToArray()));
                }
                note = null;
            };
        }
Example #5
0
        private static void SetEventToReLocateNote(
            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();
            NoteBase note       = null;
            Position prev       = null;
            Position mouseBegin = null;

            box.MouseDown += (s, e) =>
            {
                if (holder.Locked || status.EditorMode != EditorMode.Edit)
                {
                    return;
                }
                var area = env.GetEditorLaneRegion(e.Location);
                if (area == EditorLaneRegion.Lane && e.Button == MouseButtons.Left)
                {
                    if (!GetSelectedNote(e.Location, display, noteBook, out note))
                    {
                        return;
                    }
                    if (note.SelectedNoteArea(e.Location, env) != SelectedNoteArea.Center)
                    {
                        return;
                    }
                    prev = new Position(note.Lane, note.Timing);
                    var res = PositionConverter.ConvertRealToVirtual(env, e.Location, status.BeatStride, scores, out mouseBegin);
                    if (!res)
                    {
                        return;
                    }
                    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;
                }
                var lane   = position.Lane.RawLane - mouseBegin.Lane.RawLane;
                var timing = position.Timing - mouseBegin.Timing;
                note.ReLocate(new LanePotision(prev.Lane.RawLane + lane), prev.Timing + timing);
            };

            box.MouseUp += (s, e) =>
            {
                if (!holder.UnLock(key))
                {
                    return;
                }
                // TODO: 条件式要検討
                if (prev.Lane.RawLane != note.Lane.RawLane || prev.Timing != note.Timing)
                {
                    opManager.AddOperation(new ReLocateNoteOperation(note, prev, new Position(note.Lane, note.Timing)));
                }
                note = null;
            };
        }
Example #6
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;
            };
        }
Example #7
0
        private static void SetEventToPutNote(
            MadcaDisplay display, NoteBook noteBook, IReadOnlyList <IReadOnlyScore> scores, OperationManager opManager, IReadOnlyEditorStatus status)
        {
            var box     = display.PictureBox;
            var laneEnv = display.EditorLaneEnvironment;

            box.MouseDown += (s, e) =>
            {
                if (status.EditorMode != EditorMode.Add || status.NoteMode == NoteMode.Hold || status.NoteMode == NoteMode.Field)
                {
                    return;
                }
                var area = laneEnv.GetEditorLaneRegion(e.Location);
                if (area == EditorLaneRegion.Lane && e.Button == MouseButtons.Left)
                {
                    var res = PositionConverter.ConvertRealToVirtual(laneEnv, e.Location, status.BeatStride, scores, out Position position);
                    if (!res)
                    {
                        return;
                    }
                    var note = MyUtil.NoteFactory(position.Lane, position.Timing, new NoteSize(status.NoteSize), status.NoteMode);
                    if (note is null)
                    {
                        return;
                    }                             // HACK: この辺の処理どうしようかな
                    opManager.AddAndInvokeOperation(new AddShortNoteOperation(noteBook, note));
                }
            };
        }