From 68e8785fb0752176dfe1a8fb9df81c6c099ca566 Mon Sep 17 00:00:00 2001 From: indigo-san Date: Thu, 18 Jan 2024 21:36:22 +0900 Subject: [PATCH] =?UTF-8?q?=E8=A6=81=E7=B4=A0=E3=81=AE=E4=BD=8D=E7=BD=AE?= =?UTF-8?q?=E8=A3=9C=E6=AD=A3=E3=82=92=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ProjectSystem/Element.cs | 6 +-- .../ProjectSystem/Scene.cs | 41 +++++++++++-------- 2 files changed, 28 insertions(+), 19 deletions(-) diff --git a/src/Beutl.ProjectSystem/ProjectSystem/Element.cs b/src/Beutl.ProjectSystem/ProjectSystem/Element.cs index 9dbd4455a..b79a30fe6 100644 --- a/src/Beutl.ProjectSystem/ProjectSystem/Element.cs +++ b/src/Beutl.ProjectSystem/ProjectSystem/Element.cs @@ -327,7 +327,7 @@ TimeRange GetOldRange() Element? beforeTmp = null; Element? afterTmp = null; Element? coverTmp = null; - var range = new TimeRange(start, end - start); + var range = TimeRange.FromRange(start, end); foreach (Element? item in scene.Children.GetMarshal().Value) { @@ -345,7 +345,7 @@ TimeRange GetOldRange() afterTmp = item; } - if (range.Contains(item.Range)) + if (range.Contains(item.Range) || range == item.Range) { coverTmp = item; } @@ -382,7 +382,7 @@ TimeRange GetOldRange() afterTmp = item; } - if (range.Contains(item.Range)) + if (range.Contains(item.Range) || range == item.Range) { coverTmp = item; } diff --git a/src/Beutl.ProjectSystem/ProjectSystem/Scene.cs b/src/Beutl.ProjectSystem/ProjectSystem/Scene.cs index 93447a60f..d28357df2 100644 --- a/src/Beutl.ProjectSystem/ProjectSystem/Scene.cs +++ b/src/Beutl.ProjectSystem/ProjectSystem/Scene.cs @@ -570,10 +570,7 @@ private void Children_CollectionChanged(object? sender, NotifyCollectionChangedE private int NearestLayerNumber(Element element) { - if (Children.Any(i => !(i.ZIndex != element.ZIndex - || i.Range.Intersects(element.Range) - || i.Range.Contains(element.Range) - || element.Range.Contains(i.Range)))) + if (IsOverlapping(element.Range, element.ZIndex)) { int layerMax = Children.Max(i => i.ZIndex); @@ -665,19 +662,31 @@ private int NearestLayerNumber(Element element) return (beforeTmp, afterTmp, coverTmp); } - private (TimeRange Range, int ZIndex) GetCorrectPosition(Element element, ElementOverlapHandling handling) + private bool IsOverlapping(TimeRange timeRange, int zindex) { - bool IsOverlapping(TimeRange timeRange, int zindex) + return Children.Any(i => { - return !Children.Any(i => !(i.ZIndex != zindex - || i.Range.Intersects(timeRange) - || i.Range.Contains(timeRange) - || timeRange.Contains(i.Range))); - } + if (i.ZIndex == zindex) + { + if (i.Range == timeRange + || i.Range.Intersects(timeRange) + || i.Range.Contains(timeRange) + || timeRange.Contains(i.Range)) + { + return true; + } + } + + return false; + }); + } + private (TimeRange Range, int ZIndex) GetCorrectPosition(Element element, ElementOverlapHandling handling) + { bool overlapping = IsOverlapping(element.Range, element.ZIndex); - if (!overlapping || handling.HasFlag(ElementOverlapHandling.Allow)) return (element.Range, element.ZIndex); + if (!overlapping || handling.HasFlag(ElementOverlapHandling.Allow)) + return (element.Range, element.ZIndex); if (handling == ElementOverlapHandling.ThrowException) throw new InvalidOperationException("要素の位置が無効です"); @@ -701,7 +710,7 @@ bool IsOverlapping(TimeRange timeRange, int zindex) foreach (TimeSpan cEnd in candidateEnd) { TimeRange range = TimeRange.FromRange(start, cEnd); - if (range.Duration > TimeSpan.Zero && IsOverlapping(range, element.ZIndex)) + if (range.Duration > TimeSpan.Zero && !IsOverlapping(range, element.ZIndex)) { return (range, element.ZIndex); } @@ -709,7 +718,7 @@ bool IsOverlapping(TimeRange timeRange, int zindex) foreach (TimeSpan cStart in candidateStart) { range = TimeRange.FromRange(cStart, cEnd); - if (range.Duration > TimeSpan.Zero && IsOverlapping(range, element.ZIndex)) + if (range.Duration > TimeSpan.Zero && !IsOverlapping(range, element.ZIndex)) { return (range, element.ZIndex); } @@ -722,7 +731,7 @@ bool IsOverlapping(TimeRange timeRange, int zindex) foreach (TimeSpan item in candidateEnd) { TimeRange range = TimeRange.FromRange(start, item); - if (range.Duration > TimeSpan.Zero && IsOverlapping(range, element.ZIndex)) + if (range.Duration > TimeSpan.Zero && !IsOverlapping(range, element.ZIndex)) { return (range, element.ZIndex); } @@ -734,7 +743,7 @@ bool IsOverlapping(TimeRange timeRange, int zindex) foreach (TimeSpan item in candidateStart) { TimeRange range = TimeRange.FromRange(item, end); - if (range.Duration > TimeSpan.Zero && IsOverlapping(range, element.ZIndex)) + if (range.Duration > TimeSpan.Zero && !IsOverlapping(range, element.ZIndex)) { return (range, element.ZIndex); }