Skip to content

Commit

Permalink
Merge pull request #27 from hozuki/sd-note-preview-fix
Browse files Browse the repository at this point in the history
SD note preview fix
  • Loading branch information
hozuki committed Mar 1, 2017
2 parents 7c07353 + 2f3d5f2 commit f675c25
Show file tree
Hide file tree
Showing 12 changed files with 150 additions and 17 deletions.
6 changes: 5 additions & 1 deletion DereTore.Applications.ScoreViewer/Controls/RenderHelper.cs
Original file line number Diff line number Diff line change
Expand Up @@ -97,7 +97,11 @@ public static void DrawNotes(RenderParams renderParams, IList<Note> notes, int s
switch (note.Type) {
case NoteType.TapOrFlick:
if (note.FlickType == NoteStatus.Tap) {
DrawTapNote(renderParams, note);
if (note.IsHoldRelease) {
DrawHoldNote(renderParams, note);
} else {
DrawTapNote(renderParams, note);
}
} else {
DrawFlickNote(renderParams, note);
}
Expand Down
2 changes: 1 addition & 1 deletion DereTore.Applications.ScoreViewer/Model/Note.cs
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@ public sealed class Note : ICloneable {
[Browsable(false)]
public bool IsHoldPress => Type == NoteType.Hold && HasNextHold;
[Browsable(false)]
public bool IsHoldRelease => Type == NoteType.Hold && HasPrevHold;
public bool IsHoldRelease => (Type == NoteType.TapOrFlick || Type == NoteType.Slide) && HasPrevHold;
[Browsable(false)]
public bool IsSlide => Type == NoteType.Slide;
[Browsable(false)]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,4 +32,4 @@
// 方法是按如下所示使用“*”: :
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("0.7.0.0")]
[assembly: AssemblyFileVersion("0.7.1.0")]
8 changes: 6 additions & 2 deletions StarlightDirector.Entities/Note.cs
Original file line number Diff line number Diff line change
Expand Up @@ -173,7 +173,7 @@ public bool IsSlide {

public bool IsSlideStart => Type == NoteType.Slide && !HasPrevFlickOrSlide && HasNextFlickOrSlide;

public bool IsSlideContinuation => Type == NoteType.Slide && HasPrevFlickOrSlide && HasNextFlickOrSlide;
public bool IsSlideContinuation => Type == NoteType.Slide && HasPrevFlickOrSlide && HasNextFlickOrSlide && PrevFlickOrSlideNote.IsSlide && NextFlickOrSlideNote.IsSlide;

public bool IsSlideEnd => Type == NoteType.Slide && !HasNextFlickOrSlide && HasPrevFlickOrSlide;

Expand Down Expand Up @@ -429,13 +429,15 @@ private static void OnTypeChanged(DependencyObject obj, DependencyPropertyChange
note.IsTap = note.IsTapInternal();
note.IsSlide = note.IsSlideInternal();
note.UpdateFlickTypeStep2();
note.DecideRenderingAsFlickOrSlide();
}

private static void OnFlickTypeChanged(DependencyObject obj, DependencyPropertyChangedEventArgs e) {
var note = (Note)obj;
note.IsFlick = note.IsFlickInternal();
note.IsTap = note.IsTapInternal();
note.IsSlide = note.IsSlideInternal();
note.DecideRenderingAsFlickOrSlide();
}

private static void OnExtraParamsChanged(DependencyObject obj, DependencyPropertyChangedEventArgs e) {
Expand Down Expand Up @@ -487,10 +489,12 @@ private void UpdateFlickTypeStep2() {
}
}
}
}

private void DecideRenderingAsFlickOrSlide() {
if (IsFlick || IsSlide) {
if (IsSlide) {
ShouldBeRenderedAsSlide = HasNextFlickOrSlide && !NextFlickOrSlideNote.IsFlick;
ShouldBeRenderedAsSlide = !HasNextFlickOrSlide || !NextFlickOrSlideNote.IsFlick;
} else {
ShouldBeRenderedAsSlide = false;
}
Expand Down
2 changes: 1 addition & 1 deletion StarlightDirector/Properties/AssemblyInfo.cs
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,6 @@
// 方法是按如下所示使用“*”: :
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.4.0.0")]
[assembly: AssemblyFileVersion("0.7.0.0")]
[assembly: AssemblyFileVersion("0.7.1.0")]
[assembly: Guid("de69897a-be1b-410a-a159-814b5f4033b4")]

Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
using StarlightDirector.Entities;

Expand All @@ -15,12 +16,20 @@ public Project Project {
set { SetValue(ProjectProperty, value); }
}

public TextBlock NoteInfoBlock {
get { return (TextBlock)GetValue(NoteInfoBlockProperty); }
set { SetValue(NoteInfoBlockProperty, value); }
}

public static readonly DependencyProperty EditModeProperty = DependencyProperty.Register(nameof(EditMode), typeof(EditMode), typeof(ScoreEditor),
new PropertyMetadata(EditMode.Select));

public static readonly DependencyProperty ProjectProperty = DependencyProperty.Register(nameof(Project), typeof(Project), typeof(ScoreEditor),
new PropertyMetadata(null, OnProjectChanged));

public static readonly DependencyProperty NoteInfoBlockProperty = DependencyProperty.Register(nameof(NoteInfoBlock), typeof(TextBlock), typeof(ScoreEditor),
new PropertyMetadata(null));

private static void OnProjectChanged(DependencyObject obj, DependencyPropertyChangedEventArgs e) {
var editor = (ScoreEditor)obj;
var oldproject = (Project)e.OldValue;
Expand Down
4 changes: 4 additions & 0 deletions StarlightDirector/UI/Controls/ScoreEditor.Editing.cs
Original file line number Diff line number Diff line change
Expand Up @@ -114,6 +114,8 @@ private ScoreNote AddScoreNote(ScoreBar scoreBar, int row, int column, Note data
scoreNote.MouseDown += ScoreNote_MouseDown;
scoreNote.MouseUp += ScoreNote_MouseUp;
scoreNote.MouseDoubleClick += ScoreNote_MouseDoubleClick;
scoreNote.MouseEnter += ScoreNote_MouseEnter;
scoreNote.MouseLeave += ScoreNote_MouseLeave;
if (dataTemplate == null) {
Project.IsChanged = true;
}
Expand Down Expand Up @@ -142,6 +144,8 @@ private void RemoveScoreNote(ScoreNote scoreNote, bool modifiesModel, bool repos
scoreNote.MouseDown -= ScoreNote_MouseDown;
scoreNote.MouseUp -= ScoreNote_MouseUp;
scoreNote.MouseDoubleClick -= ScoreNote_MouseDoubleClick;
scoreNote.MouseEnter -= ScoreNote_MouseEnter;
scoreNote.MouseLeave -= ScoreNote_MouseLeave;
scoreNote.ContextMenu = null;
EditableScoreNotes.Remove(scoreNote);
LineLayer.NoteRelations.RemoveAll(scoreNote);
Expand Down
76 changes: 73 additions & 3 deletions StarlightDirector/UI/Controls/ScoreEditor.EventHandlers.cs
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
using System;
using System.Diagnostics;
using System.Linq;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using StarlightDirector.Entities;
Expand Down Expand Up @@ -137,22 +139,22 @@ private void ScoreNote_MouseUp(object sender, MouseButtonEventArgs e) {
throw new ArgumentOutOfRangeException(nameof(mode));
}
var first = ns < ne ? ns : ne;
var second = first.Equals(ns) ? ne : ns;
if (ns.Bar == ne.Bar && ns.IndexInGrid == ne.IndexInGrid && !ns.IsSync && !ne.IsSync) {
// sync
Note.ConnectSync(ns, ne);
LineLayer.NoteRelations.Add(start, end, NoteRelation.Sync);
LineLayer.InvalidateVisual();
} else if (ns.FinishPosition != ne.FinishPosition && (ns.Bar != ne.Bar || ns.IndexInGrid != ne.IndexInGrid) && (!ns.IsHoldStart && !ne.IsHoldStart)) {
} else if (ns.FinishPosition != ne.FinishPosition && (ns.Bar != ne.Bar || ns.IndexInGrid != ne.IndexInGrid) && (!ns.IsHoldStart && !ne.IsHoldStart) && !second.IsFlick) {
// flick
var second = first.Equals(ns) ? ne : ns;
if (first.HasNextFlickOrSlide || second.HasPrevFlickOrSlide) {
MessageBox.Show(Application.Current.FindResource<string>(App.ResourceKeys.FlickRelationIsFullPrompt), App.Title, MessageBoxButton.OK, MessageBoxImage.Exclamation);
return;
}
Note.ConnectFlick(first, second);
LineLayer.NoteRelations.Add(start, end, NoteRelation.FlickOrSlide);
LineLayer.InvalidateVisual();
} else if (ns.FinishPosition == ne.FinishPosition && !ns.IsHold && !ne.IsHold && !first.IsFlick) {
} else if (ns.FinishPosition == ne.FinishPosition && !ns.IsHold && !ne.IsHold && !first.IsFlick && !first.IsSlide && !second.IsSlide) {
// hold
var anyObstacles = Score.Notes.AnyNoteBetween(ns, ne);
if (anyObstacles) {
Expand Down Expand Up @@ -206,6 +208,74 @@ private void ScoreNote_MouseDoubleClick(object sender, MouseButtonEventArgs e) {
e.Handled = true;
}

private void ScoreNote_MouseEnter(object sender, MouseEventArgs e) {
var block = NoteInfoBlock;
if (block == null) {
return;
}
var scoreNote = (ScoreNote)sender;
var note = scoreNote.Note;

block.Inlines.Add($"ID: {note.ID}");
block.Inlines.Add(new LineBreak());
block.Inlines.Add($"Timing: {note.HitTiming:0.000000}s");

string noteTypeString;
if (note.IsTap) {
noteTypeString = "Tap";
} else if (note.IsFlick) {
noteTypeString = "Flick";
} else if (note.IsHold) {
noteTypeString = "Hold";
} else if (note.IsSlide) {
noteTypeString = "Slide";
if (note.IsSlideStart) {
noteTypeString += " (start)";
} else if (note.IsSlideContinuation) {
noteTypeString += " (continued)";
} else if (note.IsSlideEnd) {
noteTypeString += " (end)";
}
} else {
noteTypeString = "#ERR";
}
string noteExtra = null;
if (note.IsSync || note.IsHoldEnd) {
var syncStr = note.IsSync ? "sync" : null;
var holdEndStr = note.IsHoldEnd ? "hold-end" : null;
var extras = new[] { syncStr, holdEndStr };
noteExtra = extras.Aggregate((prev, val) => {
if (string.IsNullOrEmpty(prev)) {
return val;
}
if (string.IsNullOrEmpty(val)) {
return prev;
}
return prev + ", " + val;
});
}
var flickStr = note.FlickType != NoteFlickType.Tap ? (note.FlickType == NoteFlickType.FlickLeft ? "left" : "right") : null;
block.Inlines.Add(new LineBreak());
block.Inlines.Add($"Type: {noteTypeString}");
if (!string.IsNullOrEmpty(noteExtra)) {
block.Inlines.Add(new LineBreak());
block.Inlines.Add(noteExtra);
}
if (!string.IsNullOrEmpty(flickStr)) {
block.Inlines.Add(new LineBreak());
block.Inlines.Add($"Flick: {flickStr}");
}

block.Inlines.Add(new LineBreak());
block.Inlines.Add($"Start: {(int)note.StartPosition}");
block.Inlines.Add(new LineBreak());
block.Inlines.Add($"Finish: {(int)note.FinishPosition}");
}

private void ScoreNote_MouseLeave(object sender, MouseEventArgs e) {
NoteInfoBlock?.Inlines.Clear();
}

private void ScoreEditor_OnMouseDown(object sender, MouseButtonEventArgs e) {
UnselectAllScoreNotes();
UnselectAllScoreBars();
Expand Down
2 changes: 1 addition & 1 deletion StarlightDirector/UI/Controls/ScorePreviewer.xaml.cs
Original file line number Diff line number Diff line change
Expand Up @@ -88,7 +88,7 @@ public void BeginPreview(Score score, double targetFps, int startTime, double ap
continue;

NoteDrawType drawType;
if (note.IsHoldStart) {
if (note.IsHoldStart || (note.IsHoldEnd && note.IsTap)) {
drawType = NoteDrawType.Hold;
} else if (note.ShouldBeRenderedAsFlick) {
drawType = (NoteDrawType)note.FlickType;
Expand Down
31 changes: 29 additions & 2 deletions StarlightDirector/UI/Windows/MainWindow.Commands.Edit.Note.cs
Original file line number Diff line number Diff line change
Expand Up @@ -127,8 +127,35 @@ private void CmdEditNoteSetSlideTypeToFlick_Executed(object sender, ExecutedRout

private void CmdEditNoteSetSlideTypeToSlide_CanExecute(object sender, CanExecuteRoutedEventArgs e) {
var notes = Editor.GetSelectedScoreNotes();
var scoreNotes = notes as ScoreNote[] ?? notes.Reverse().ToArray();
e.CanExecute = scoreNotes.Any() && scoreNotes.All(t => (t.Note.IsFlick && !t.Note.IsHoldEnd) || t.Note.IsSlide);
var scoreNotes = notes as List<ScoreNote> ?? notes.ToList();
if (scoreNotes.Count == 0) {
e.CanExecute = false;
return;
}
if (scoreNotes.Count == 1) {
var note = scoreNotes[0].Note;
if (note.HasPrevFlickOrSlide || note.HasNextFlickOrSlide) {
e.CanExecute = false;
return;
}
}

Note groupPrevNote = null;
scoreNotes.Sort((c1, c2) => Note.TimingThenPositionComparison(c1.Note, c2.Note));
foreach (var scoreNote in scoreNotes) {
var note = scoreNote.Note;
if (!note.IsFlick && !note.IsSlide || note.IsHoldEnd) {
e.CanExecute = false;
return;
}
var prevNote = note.PrevFlickOrSlideNote;
if (prevNote != null && prevNote != groupPrevNote) {
e.CanExecute = false;
return;
}
groupPrevNote = note;
}
e.CanExecute = true;
}

private void CmdEditNoteSetSlideTypeToSlide_Executed(object sender, ExecutedRoutedEventArgs e) {
Expand Down
23 changes: 19 additions & 4 deletions StarlightDirector/UI/Windows/MainWindow.xaml
Original file line number Diff line number Diff line change
Expand Up @@ -217,12 +217,26 @@
</fluent:RibbonTabItem>
</fluent:Ribbon>
<Grid Grid.Row="2" Background="#FF181818" x:Name="EditorGrid" Visibility="{Binding ElementName=ScorePreviewer, Path=IsPreviewing, Converter={StaticResource NullableBooleanToVisibilityConverter}, ConverterParameter={StaticResource True}}">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<TextBlock Grid.Row="2" Grid.Column="2" x:Name="NoteInfo" Foreground="White" Margin="30 10"/>
<!-- CustomScroll.ScrollSpeed is still needed because when the ComboBox item is selected, the ScrollViewer has not been set yet. -->
<ScrollViewer Name="ScrollViewer" ui:CustomScroll.ScrollSpeed="5" PreviewMouseWheel="ScrollViewer_OnPreviewMouseWheel"
<ScrollViewer Grid.Column="0" Grid.Row="0" Grid.RowSpan="3" Grid.ColumnSpan="3"
x:Name="ScrollViewer" ui:CustomScroll.ScrollSpeed="5" PreviewMouseWheel="ScrollViewer_OnPreviewMouseWheel"
VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Auto">
<Grid>
<controls:ScoreEditor x:Name="Editor" MinHeight="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=ScrollViewer}, Path=ViewportHeight, Mode=OneWay}"
HorizontalAlignment="Center" ScrollViewer="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=ScrollViewer}, Mode=OneWay}">
<controls:ScoreEditor x:Name="Editor"
MinHeight="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=ScrollViewer}, Path=ViewportHeight, Mode=OneWay}"
HorizontalAlignment="Center" ScrollViewer="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=ScrollViewer}, Mode=OneWay}"
NoteInfoBlock="{Binding ElementName=NoteInfo, Mode=OneTime}">
<controls:ScoreEditor.ContextMenu>
<fluent:ContextMenu>
<fluent:MenuItem Header="Add s_pecial note">
Expand All @@ -233,7 +247,8 @@
</controls:ScoreEditor>
</Grid>
</ScrollViewer>
<primitives:ScrollViewerThumbnail ScrollViewer="{Binding ElementName=ScrollViewer, Mode=OneTime}"
<primitives:ScrollViewerThumbnail Grid.Column="0" Grid.Row="0" Grid.RowSpan="3" Grid.ColumnSpan="3"
ScrollViewer="{Binding ElementName=ScrollViewer, Mode=OneTime}"
Width="150" HorizontalAlignment="Left" VerticalAlignment="Stretch" Margin="10"/>
</Grid>
<Grid Grid.Row="2" Background="#FF181818" Visibility="{Binding ElementName=ScorePreviewer, Path=IsPreviewing, Converter={StaticResource NullableBooleanToVisibilityConverter}}">
Expand Down
2 changes: 1 addition & 1 deletion appveyor.yml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# https://www.appveyor.com/docs/appveyor-yml/

version: 0.7.0.{build}
version: 0.7.1.{build}
branches:
only:
- master
Expand Down

0 comments on commit f675c25

Please sign in to comment.