diff --git a/src/SerialLoops/Models/SKAvaloniaImage.cs b/src/SerialLoops/Models/SKAvaloniaImage.cs index 15603c1e..b99b0375 100644 --- a/src/SerialLoops/Models/SKAvaloniaImage.cs +++ b/src/SerialLoops/Models/SKAvaloniaImage.cs @@ -51,14 +51,11 @@ public SKAvaloniaImage(SKBitmap bitmap) public void Dispose() => throw new NotImplementedException(); public void Draw(DrawingContext context, Rect sourceRect, Rect destRect) { - if (_drawOperation is null) + _drawOperation ??= new() { - _drawOperation = new() - { - Bitmap = _bitmap, - Bounds = destRect, - }; - context.Custom(_drawOperation); - } + Bitmap = _bitmap, + Bounds = destRect, + }; + context.Custom(_drawOperation); } } diff --git a/src/SerialLoops/ViewModels/Editors/ScriptEditorViewModel.cs b/src/SerialLoops/ViewModels/Editors/ScriptEditorViewModel.cs index 677d17b8..2cf860aa 100644 --- a/src/SerialLoops/ViewModels/Editors/ScriptEditorViewModel.cs +++ b/src/SerialLoops/ViewModels/Editors/ScriptEditorViewModel.cs @@ -117,6 +117,9 @@ public enum ClipboardMode public Vector? ScrollPosition { get; set; } + public ObservableCollection UnusedChibis { get; } + public ObservableCollection StartingChibis { get; } + public ScriptEditorViewModel(ScriptItem script, MainWindowViewModel window, ILogger log) : base(script, window, log) { _script = script; @@ -124,6 +127,26 @@ public ScriptEditorViewModel(ScriptItem script, MainWindowViewModel window, ILog _project = window.OpenProject; PopulateScriptCommands(); _script.CalculateGraphEdges(_commands, _log); + + if (_script.Event.StartingChibisSection is not null) + { + StartingChibis = []; + UnusedChibis = []; + StartingChibis.AddRange(_script.Event.StartingChibisSection.Objects.Where(c => c.ChibiIndex > 0).Select(c => new StartingChibiWithImage(c, + ((ChibiItem)_project.Items.First(i => i.Type == ItemDescription.ItemType.Chibi + && ((ChibiItem)i).ChibiIndex == c.ChibiIndex)).ChibiAnimations.First().Value[0].Frame, + StartingChibis, UnusedChibis, _script))); + short[] usedIndices = StartingChibis.Select(c => c.StartingChibi.ChibiIndex).ToArray(); + for (short i = 1; i <= 5; i++) + { + if (usedIndices.Contains(i)) + { + continue; + } + UnusedChibis.Add(new(new StartingChibiEntry() { ChibiIndex = i }, ((ChibiItem)_project.Items.First(c => c.Type == ItemDescription.ItemType.Chibi + && ((ChibiItem)c).ChibiIndex == i)).ChibiAnimations.First().Value[0].Frame, StartingChibis, UnusedChibis, _script)); + } + } } public void PopulateScriptCommands(bool refresh = false) @@ -711,3 +734,66 @@ internal void SetCommands(IEnumerable commands) Commands.AddRange(commands.Select(c => new ScriptCommandTreeItem(c))); } } + +public class StartingChibiWithImage : ReactiveObject +{ + public StartingChibiEntry StartingChibi { get; } + + [Reactive] + public SKBitmap ChibiBitmap { get; set; } + + public ICommand AddStartingChibiCommand { get; } + + public ICommand RemoveStartingChibiCommand { get; } + + public StartingChibiWithImage(StartingChibiEntry startingChibi, SKBitmap chibiBitmap, + ObservableCollection usedChibis, ObservableCollection unusedChibis, + ScriptItem script) + { + StartingChibi = startingChibi; + ChibiBitmap = chibiBitmap; + + AddStartingChibiCommand = ReactiveCommand.Create(() => + { + unusedChibis.Remove(this); + for (short i = 0; i <= usedChibis.Count; i++) + { + if (i == usedChibis.Count) + { + usedChibis.Add(this); + break; + } + + if (usedChibis[i].StartingChibi.ChibiIndex > startingChibi.ChibiIndex) + { + usedChibis.Insert(i, this); + break; + } + } + script.Event.StartingChibisSection.Objects.Add(StartingChibi); + script.UnsavedChanges = true; + + }); + RemoveStartingChibiCommand = ReactiveCommand.Create(() => + { + usedChibis.Remove(this); + for (short i = 0; i <= unusedChibis.Count; i++) + { + if (i == unusedChibis.Count) + { + unusedChibis.Add(this); + break; + } + + if (unusedChibis[i].StartingChibi.ChibiIndex > startingChibi.ChibiIndex) + { + unusedChibis.Insert(i, this); + break; + } + } + script.Event.StartingChibisSection.Objects.Remove( + script.Event.StartingChibisSection.Objects.First(c => c.ChibiIndex == StartingChibi.ChibiIndex)); + script.UnsavedChanges = true; + }); + } +} diff --git a/src/SerialLoops/Views/Editors/ScriptEditorView.axaml b/src/SerialLoops/Views/Editors/ScriptEditorView.axaml index 47814230..e4db7d80 100644 --- a/src/SerialLoops/Views/Editors/ScriptEditorView.axaml +++ b/src/SerialLoops/Views/Editors/ScriptEditorView.axaml @@ -3,6 +3,8 @@ xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:vm="using:SerialLoops.ViewModels.Editors" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" + xmlns:i="using:Avalonia.Xaml.Interactivity" + xmlns:ia="using:Avalonia.Xaml.Interactions.Core" mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450" xmlns:utility="using:SerialLoops.Utility" x:DataType="vm:ScriptEditorViewModel" @@ -47,7 +49,47 @@ Grid.Column="0" Grid.Row="0" Grid.RowSpan="2" Width="256"/> - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +