Skip to content

Commit

Permalink
Add tutorial mapping editing on Avalonia branch (#451)
Browse files Browse the repository at this point in the history
  • Loading branch information
jonko0493 authored Jan 25, 2025
1 parent 38dd669 commit eeb322d
Show file tree
Hide file tree
Showing 4 changed files with 136 additions and 0 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
using System.Collections.ObjectModel;
using System.IO;
using System.Linq;
using System.Windows.Input;
using HaruhiChokuretsuLib.Archive.Event;
using HaruhiChokuretsuLib.Util;
using ReactiveUI;
using ReactiveUI.Fody.Helpers;
using SerialLoops.Lib;
using SerialLoops.Lib.Items;
using SerialLoops.ViewModels.Panels;
using SerialLoops.Views.Dialogs;
using IO = SerialLoops.Lib.IO;

namespace SerialLoops.ViewModels.Dialogs;

public class EditTutorialMappingsDialogViewModel : ViewModelBase
{
public ObservableCollection<TutorialMapping> Tutorials { get; }

public ICommand SaveCommand { get; }
public ICommand CancelCommand { get; }

public EditTutorialMappingsDialogViewModel(Project project, EditorTabsPanelViewModel tabs, ILogger log)
{
Tutorials = new(project.TutorialFile.Tutorials.Where(t => t.AssociatedScript > 0)
.Select(t => new TutorialMapping(t, project, tabs)));

SaveCommand = ReactiveCommand.Create<EditTutorialMappingsDialog>(dialog =>
{
foreach (TutorialMapping tutorial in Tutorials)
{
project.TutorialFile.Tutorials.First(t => t.Id == tutorial.Flag)
.AssociatedScript = (short)tutorial.Script.Event.Index;
}
IO.WriteStringFile(Path.Combine("assets", "events", $"{project.TutorialFile.Index:X3}.s"),
project.TutorialFile.GetSource([]), project, log);
dialog.Close();
});
CancelCommand = ReactiveCommand.Create<EditTutorialMappingsDialog>(dialog => dialog.Close());
}
}

public class TutorialMapping(Tutorial tutorial, Project project, EditorTabsPanelViewModel tabs) : ReactiveObject
{
public EditorTabsPanelViewModel Tabs { get; } = tabs;

public ObservableCollection<ScriptItem> Scripts { get; } = new(project.Items
.Where(i => i.Type == ItemDescription.ItemType.Script)
.Cast<ScriptItem>());

[Reactive]
public int Flag { get; set; } = tutorial.Id;

public string TutorialName => $"Tutorial {Flag}";

[Reactive]
public ScriptItem Script { get; set; } = (ScriptItem)project.Items.First(i =>
i.Type == ItemDescription.ItemType.Script && ((ScriptItem)i).Event.Index == tutorial.AssociatedScript);
}
8 changes: 8 additions & 0 deletions src/SerialLoops/ViewModels/MainWindowViewModel.cs
Original file line number Diff line number Diff line change
Expand Up @@ -130,6 +130,7 @@ public MainWindowViewModel()
ApplyHacksCommand = ReactiveCommand.CreateFromTask(ApplyHacksCommand_Executed);
CreateAsmHackCommand = ReactiveCommand.CreateFromTask(CreateAsmHackCommand_Executed);
EditUiTextCommand = ReactiveCommand.CreateFromTask(EditUiTextCommand_Executed);
EditTutorialMappingsCommand = ReactiveCommand.CreateFromTask(EditTutorialMappingsCommand_Executed);
ProjectSettingsCommand = ReactiveCommand.CreateFromTask(ProjectSettingsCommand_Executed);
ExportProjectCommand = ReactiveCommand.CreateFromTask(ExportProjectCommand_Executed);
ExportPatchCommand = ReactiveCommand.CreateFromTask(ExportPatchCommand_Executed);
Expand Down Expand Up @@ -366,6 +367,13 @@ private async Task EditUiTextCommand_Executed()
await editUiTextDialog.ShowDialog(Window);
}

private async Task EditTutorialMappingsCommand_Executed()
{
EditTutorialMappingsDialogViewModel viewModel = new(OpenProject, EditorTabs, Log);
EditTutorialMappingsDialog dialog = new() { DataContext = viewModel };
await dialog.ShowDialog(Window);
}

private async Task ProjectSettingsCommand_Executed()
{
ProjectSettingsDialogViewModel projectSettingsDialogViewModel = new();
Expand Down
56 changes: 56 additions & 0 deletions src/SerialLoops/Views/Dialogs/EditTutorialMappingsDialog.axaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
<Window xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:vm="using:SerialLoops.ViewModels.Dialogs"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:assets="using:SerialLoops.Assets"
xmlns:controls="using:SerialLoops.Controls"
xmlns:gbox="using:GroupBox.Avalonia.Controls"
xmlns:li="using:SerialLoops.Lib.Items"
MinWidth="400" MinHeight="600"
Width="400" Height="600"
mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"
x:DataType="vm:EditTutorialMappingsDialogViewModel"
x:Class="SerialLoops.Views.Dialogs.EditTutorialMappingsDialog"
Title="{x:Static assets:Strings.Edit_Tutorial_Mappings}"
Name="Dialog">
<Grid RowDefinitions="*,Auto">
<ScrollViewer Grid.Row="0">
<ItemsRepeater ItemsSource="{Binding Tutorials}">
<ItemsRepeater.Layout>
<StackLayout Orientation="Vertical" Spacing="15"/>
</ItemsRepeater.Layout>
<ItemsRepeater.ItemTemplate>
<DataTemplate DataType="vm:TutorialMapping">
<gbox:GroupBox Header="{Binding TutorialName}" Theme="{StaticResource GroupBoxClassic}">
<StackPanel Orientation="Horizontal" Margin="10" Spacing="5">
<TextBlock Text="{x:Static assets:Strings.Associated_Script}"/>
<ComboBox ItemsSource="{Binding Scripts}" SelectedItem="{Binding Script}">
<ComboBox.ItemTemplate>
<DataTemplate DataType="li:ScriptItem">
<TextBlock Text="{Binding DisplayName}"/>
</DataTemplate>
</ComboBox.ItemTemplate>
<ComboBox.ItemContainerTheme>
<ControlTheme TargetType="ComboBoxItem" x:DataType="li:ScriptItem" BasedOn="{StaticResource {x:Type ComboBoxItem}}">
<Setter Property="TextSearch.Text" Value="{Binding DisplayName}" />
</ControlTheme>
</ComboBox.ItemContainerTheme>
</ComboBox>
<controls:ItemLink Item="{Binding Script}" Tabs="{Binding Tabs}"/>
</StackPanel>
</gbox:GroupBox>
</DataTemplate>
</ItemsRepeater.ItemTemplate>
</ItemsRepeater>
</ScrollViewer>

<StackPanel Grid.Row="1" Orientation="Horizontal" Spacing="3">
<Button Content="{x:Static assets:Strings.Save}" Command="{Binding SaveCommand}"
CommandParameter="{Binding #Dialog}" HorizontalAlignment="Right"/>
<Button Content="{x:Static assets:Strings.Cancel}" Command="{Binding CancelCommand}"
CommandParameter="{Binding #Dialog}" HorizontalAlignment="Right"/>
</StackPanel>
</Grid>
</Window>

12 changes: 12 additions & 0 deletions src/SerialLoops/Views/Dialogs/EditTutorialMappingsDialog.axaml.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
using Avalonia.Controls;

namespace SerialLoops.Views.Dialogs;

public partial class EditTutorialMappingsDialog : Window
{
public EditTutorialMappingsDialog()
{
InitializeComponent();
}
}

0 comments on commit eeb322d

Please sign in to comment.