Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add place editor on Avalonia branch #449

Merged
merged 3 commits into from
Jan 25, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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
Expand Up @@ -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;
Expand Down
2 changes: 2 additions & 0 deletions src/SerialLoops/ViewModels/Panels/EditorTabsPanelViewModel.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down
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();
}
}