Skip to content

Commit

Permalink
Merge pull request #38 from statementreply/variant_bpm_crash
Browse files Browse the repository at this point in the history
Fix crash when setting variant BPM
  • Loading branch information
hozuki authored Apr 18, 2017
2 parents fb007e6 + 11c959a commit 8456049
Show file tree
Hide file tree
Showing 4 changed files with 37 additions and 22 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -29,21 +29,23 @@ public ScoreBarHitTestInfo HitTest(Point pointRelativeToScoreBar) {
const int columnCount = 5;
double unitWidth = width / (columnCount - 1), unitHeight = height / Bar.TotalGridCount;
var column = (int)Math.Round(destPoint.X / unitWidth);
var row = (int)Math.Round(destPoint.Y / unitHeight);
var rawRow = destPoint.Y / unitHeight;
var zoomMod = GetBestFitZoomMod();
row = (int)Math.Round((double)row / zoomMod) * zoomMod;
var row = (int)Math.Round(rawRow / zoomMod) * zoomMod;
var gridCrossingPosition = new Point(column * unitWidth, row * unitHeight);
var distance = Point.Subtract(gridCrossingPosition, destPoint);
bool isValid = true;
if (distance.Length > HitTestRadiusScale * NoteRadius) {
return new ScoreBarHitTestInfo(this, Bar, new Point(), column, row, false, false);
isValid = false;
}
if (column < 0 || column > columnCount - 1) {
return new ScoreBarHitTestInfo(this, Bar, new Point(), column, row, false, false);
isValid = false;
}
if (row < 0 || row >= Bar.TotalGridCount) {
return new ScoreBarHitTestInfo(this, Bar, pointRelativeToScoreBar, column, row, true, false);
if (row < 0) {
isValid = false;
}
return new ScoreBarHitTestInfo(this, Bar, pointRelativeToScoreBar, column, row, false, true);
bool isInNextBar = (row >= Bar.TotalGridCount);
return new ScoreBarHitTestInfo(this, Bar, pointRelativeToScoreBar, column, row, isInNextBar, isValid);
}

public void UpdateBarTimeText() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -56,16 +56,23 @@ public void RemoveScoreNotes(IEnumerable<ScoreNote> scoreNotes) {
RemoveScoreNotes(scoreNotes, true, true);
}

public SpecialNotePointer AddSpecialNote(ScoreBar scoreBar, ScoreBarHitTestInfo info, NoteType type) {
public SpecialNotePointer AddSpecialNote(ScoreBar scoreBar, ScoreBarHitTestInfo info, bool isFromPrevBar, NoteType type) {
if (!info.IsInNextBar) {
return AddSpecialNote(scoreBar, info.Row, type);
var row = info.Row;
if (isFromPrevBar && row < 0) {
row = 0;
}
return AddSpecialNote(scoreBar, row, type);
}
if (isFromPrevBar) {
return null;
}
var nextBar = ScoreBars.FirstOrDefault(b => b.Bar.Index > scoreBar.Bar.Index);
if (nextBar == null) {
return null;
}
var point = scoreBar.TranslatePoint(info.HitPoint, nextBar);
return AddSpecialNote(nextBar, nextBar.HitTest(point), type);
return AddSpecialNote(nextBar, nextBar.HitTest(point), true, type);
}

public SpecialNotePointer AddSpecialNote(ScoreBar scoreBar, int row, NoteType type) {
Expand Down Expand Up @@ -122,19 +129,26 @@ private ScoreNote AddScoreNote(ScoreBar scoreBar, int row, int column, Note data
return scoreNote;
}

private ScoreNote AddScoreNote(ScoreBar scoreBar, ScoreBarHitTestInfo info, Note dataTemplate) {
if (!info.IsValid || info.Row < 0 || info.Column < 0) {
if (!info.IsInNextBar) {
private ScoreNote AddScoreNote(ScoreBar scoreBar, ScoreBarHitTestInfo info, bool isFromPrevBar, Note dataTemplate) {
if (info.IsInNextBar) {
if (isFromPrevBar) {
return null;
}
var nextBar = ScoreBars.FirstOrDefault(b => b.Bar.Index > scoreBar.Bar.Index);
if (nextBar == null) {
return null;
}
var point = scoreBar.TranslatePoint(info.HitPoint, nextBar);
return AddScoreNote(nextBar, nextBar.HitTest(point), dataTemplate);
return AddScoreNote(nextBar, nextBar.HitTest(point), true, dataTemplate);
}
var row = info.Row;
if (isFromPrevBar && row < 0) {
row = 0;
}
if (!info.IsValid || row < 0 || info.Column < 0) {
return null;
}
return AddScoreNote(scoreBar, info.Row, info.Column, dataTemplate);
return AddScoreNote(scoreBar, row, info.Column, dataTemplate);
}

private void RemoveScoreNote(ScoreNote scoreNote, bool modifiesModel, bool repositionLines) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ private void ScoreBar_MouseUp(object sender, MouseButtonEventArgs e) {
var hitTestInfo = scoreBar.HitTest(e.GetPosition(scoreBar));
if (e.ChangedButton == MouseButton.Left) {
if (hitTestInfo.IsValid) {
var scoreNote = AddScoreNote(scoreBar, hitTestInfo, null);
var scoreNote = AddScoreNote(scoreBar, hitTestInfo, false, null);
if (scoreNote != null) {
var note = scoreNote.Note;
if (note.IsSync) {
Expand Down Expand Up @@ -296,11 +296,10 @@ private void ScoreEditor_OnMouseUp(object sender, MouseButtonEventArgs e) {
LastHitTestInfo = hitTestInfo;
} else {
var s = (from scoreBar in ScoreBars
let top = Canvas.GetTop(scoreBar)
let bottom = top + scoreBar.ActualHeight
where top <= myPosition.Y && myPosition.Y < bottom
select scoreBar)
.FirstOrDefault();
let pos = e.GetPosition(scoreBar)
where pos.Y >= 0 && pos.Y < scoreBar.ActualHeight
select scoreBar)
.FirstOrDefault();
if (s != null) {
var hitTestInfo = s.HitTest(e.GetPosition(s));
LastHitTestInfo = hitTestInfo;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ private void CmdContextAddSpecialNoteVariantBpm_Executed(object sender, Executed
if (hitTestInfo == null) {
return;
}
Editor.AddSpecialNote(hitTestInfo.ScoreBar, hitTestInfo, NoteType.VariantBpm);
Editor.AddSpecialNote(hitTestInfo.ScoreBar, hitTestInfo, false, NoteType.VariantBpm);
}

}
Expand Down

0 comments on commit 8456049

Please sign in to comment.