Skip to content

Commit

Permalink
Add starting chibis to script editor (#453)
Browse files Browse the repository at this point in the history
  • Loading branch information
jonko0493 authored Jan 25, 2025
1 parent 49cc02a commit 7e24a0b
Show file tree
Hide file tree
Showing 3 changed files with 134 additions and 9 deletions.
13 changes: 5 additions & 8 deletions src/SerialLoops/Models/SKAvaloniaImage.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
}
86 changes: 86 additions & 0 deletions src/SerialLoops/ViewModels/Editors/ScriptEditorViewModel.cs
Original file line number Diff line number Diff line change
Expand Up @@ -117,13 +117,36 @@ public enum ClipboardMode

public Vector? ScrollPosition { get; set; }

public ObservableCollection<StartingChibiWithImage> UnusedChibis { get; }
public ObservableCollection<StartingChibiWithImage> StartingChibis { get; }

public ScriptEditorViewModel(ScriptItem script, MainWindowViewModel window, ILogger log) : base(script, window, log)
{
_script = script;
ScriptSections = new(script.Event.ScriptSections.Select(s => new ReactiveScriptSection(s)));
_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)
Expand Down Expand Up @@ -711,3 +734,66 @@ internal void SetCommands(IEnumerable<ScriptItemCommand> 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<StartingChibiWithImage> usedChibis, ObservableCollection<StartingChibiWithImage> 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;
});
}
}
44 changes: 43 additions & 1 deletion src/SerialLoops/Views/Editors/ScriptEditorView.axaml
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down Expand Up @@ -47,7 +49,47 @@
Grid.Column="0" Grid.Row="0" Grid.RowSpan="2" Width="256"/>
<TabControl Grid.Column="1" Grid.Row="0">
<TabControl.Items>
<TabItem Header="Starting Chibis" />
<TabItem Header="Starting Chibis">
<StackPanel Orientation="Vertical" Spacing="10">
<ItemsRepeater ItemsSource="{Binding StartingChibis}" Width="256" Height="86">
<ItemsRepeater.Layout>
<UniformGridLayout MinColumnSpacing="-5" Orientation="Horizontal" ItemsJustification="End"
MaximumRowsOrColumns="5"/>
</ItemsRepeater.Layout>
<ItemsRepeater.ItemTemplate>
<DataTemplate DataType="vm:StartingChibiWithImage">
<Image Source="{Binding ChibiBitmap, Converter={x:Static utility:SLConverters.SKBitmapToAvaloniaConverter}}"
Stretch="None">
<i:Interaction.Behaviors>
<ia:EventTriggerBehavior EventName="PointerPressed" SourceObject="{Binding $parent[Image]}">
<ia:InvokeCommandAction Command="{Binding RemoveStartingChibiCommand}"/>
</ia:EventTriggerBehavior>
</i:Interaction.Behaviors>
</Image>
</DataTemplate>
</ItemsRepeater.ItemTemplate>
</ItemsRepeater>

<ItemsRepeater ItemsSource="{Binding UnusedChibis}" Width="256" Height="86">
<ItemsRepeater.Layout>
<UniformGridLayout MinColumnSpacing="-5" Orientation="Horizontal" ItemsJustification="End"
MaximumRowsOrColumns="5"/>
</ItemsRepeater.Layout>
<ItemsRepeater.ItemTemplate>
<DataTemplate DataType="vm:StartingChibiWithImage">
<Image Source="{Binding ChibiBitmap, Converter={x:Static utility:SLConverters.SKBitmapToAvaloniaConverter}}"
Stretch="None">
<i:Interaction.Behaviors>
<ia:EventTriggerBehavior EventName="PointerPressed" SourceObject="{Binding $parent[Image]}">
<ia:InvokeCommandAction Command="{Binding AddStartingChibiCommand}"/>
</ia:EventTriggerBehavior>
</i:Interaction.Behaviors>
</Image>
</DataTemplate>
</ItemsRepeater.ItemTemplate>
</ItemsRepeater>
</StackPanel>
</TabItem>
<TabItem Header="Map Characters" />
<TabItem Header="Choices">

Expand Down

0 comments on commit 7e24a0b

Please sign in to comment.