Skip to content

Commit

Permalink
Add place editor on Avalonia branch (#449)
Browse files Browse the repository at this point in the history
jonko0493 authored Jan 25, 2025
1 parent f7bd775 commit 38dd669
Showing 5 changed files with 99 additions and 0 deletions.
48 changes: 48 additions & 0 deletions src/SerialLoops/ViewModels/Editors/PlaceEditorViewModel.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
using System.IO;
using Avalonia.Platform;
using HaruhiChokuretsuLib.Util;
using ReactiveUI;
using ReactiveUI.Fody.Helpers;
using SerialLoops.Lib.Items;
using SkiaSharp;

namespace SerialLoops.ViewModels.Editors;

public class PlaceEditorViewModel : EditorViewModel
{
private PlaceItem _place;
private SKTypeface _msGothicHaruhi;

[Reactive]
public SKBitmap Preview { get; set; }

public string PlaceName
{
get => _place.PlaceName;
set
{
_place.PlaceName = value;
this.RaisePropertyChanged();
Preview = _place.GetNewPlaceGraphic(_msGothicHaruhi);
_place.PlaceGraphic.SetImage(Preview);
_place.UnsavedChanges = true;
}
}

public PlaceEditorViewModel(PlaceItem place, MainWindowViewModel window, ILogger log) : base(place, window, log)
{
_place = place;
if (string.IsNullOrEmpty(_place.PlaceName))
{
_place.PlaceName = _place.DisplayName[4..];
}
Preview = _place.GetPreview(window.OpenProject);

using Stream typefaceStream = AssetLoader.Open(new("avares://SerialLoops/Assets/Graphics/MS-Gothic-Haruhi.ttf"));
_msGothicHaruhi = SKTypeface.FromStream(typefaceStream);
if (!PlaceItem.CustomFontMapper.HasFont())
{
PlaceItem.CustomFontMapper.AddFont(_msGothicHaruhi);
}
}
}
17 changes: 17 additions & 0 deletions src/SerialLoops/ViewModels/MainWindowViewModel.cs
Original file line number Diff line number Diff line change
@@ -835,6 +835,23 @@ public void SaveProject_Executed()
OpenProject.Scenario.Selects[groupSelectionItem.Index] = groupSelectionItem.Selection;
changedScenario = true;
break;
case ItemDescription.ItemType.Place:
PlaceItem placeItem = (PlaceItem)item;
if (placeItem.PlaceName != item.DisplayName[4..])
{
placeItem.Rename($"PLC_{placeItem.PlaceName}", OpenProject);
}

MemoryStream placeStream = new();
SKBitmap newPlaceImage =
PlaceItem.Unscramble(PlaceItem.Unscramble(placeItem.GetNewPlaceGraphic(_msGothicHaruhi)));
placeItem.PlaceGraphic.SetImage(newPlaceImage);
newPlaceImage.Encode(placeStream, SKEncodedImageFormat.Png, 1);
IO.WriteBinaryFile(Path.Combine("assets", "graphics", $"{placeItem.PlaceGraphic.Index:X3}.png"),
placeStream.ToArray(), OpenProject, Log);
IO.WriteStringFile(Path.Combine("assets", "graphics", $"{placeItem.PlaceGraphic.Index:X3}.gi"),
placeItem.PlaceGraphic.GetGraphicInfoFile(), OpenProject, Log);
break;
case ItemDescription.ItemType.Item:
((ItemItem)item).Write(OpenProject, Log);
break;
2 changes: 2 additions & 0 deletions src/SerialLoops/ViewModels/Panels/EditorTabsPanelViewModel.cs
Original file line number Diff line number Diff line change
@@ -77,6 +77,8 @@ private EditorViewModel CreateTab(ItemDescription item)
return new LayoutEditorViewModel((LayoutItem)item, MainWindow, _log);
case ItemDescription.ItemType.Map:
return new MapEditorViewModel((MapItem)item, MainWindow, _log);
case ItemDescription.ItemType.Place:
return new PlaceEditorViewModel((PlaceItem)item, MainWindow, _log);
case ItemDescription.ItemType.Puzzle:
return new PuzzleEditorViewModel((PuzzleItem)item, MainWindow, _log);
case ItemDescription.ItemType.Scenario:
20 changes: 20 additions & 0 deletions src/SerialLoops/Views/Editors/PlaceEditorView.axaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
<UserControl 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.Editors"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:assets="using:SerialLoops.Assets"
xmlns:utility="using:SerialLoops.Utility"
mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"
x:DataType="vm:PlaceEditorViewModel"
x:Class="SerialLoops.Views.Editors.PlaceEditorView">
<Grid RowDefinitions="Auto,Auto">
<Image Grid.Row="0" Stretch="None"
Source="{Binding Preview, Converter={x:Static utility:SLConverters.SKBitmapToAvaloniaConverter}}"/>
<StackPanel Grid.Row="1" Orientation="Horizontal" Spacing="3">
<TextBlock Text="{x:Static assets:Strings.Place_Name}"/>
<TextBox Text="{Binding PlaceName}"/>
</StackPanel>
</Grid>
</UserControl>

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

namespace SerialLoops.Views.Editors;

public partial class PlaceEditorView : UserControl
{
public PlaceEditorView()
{
InitializeComponent();
}
}

0 comments on commit 38dd669

Please sign in to comment.