From 2d65a93f8d0f4696907ff340176cbe340a9acf03 Mon Sep 17 00:00:00 2001 From: pilvikala Date: Wed, 19 Aug 2026 10:35:02 +0300 Subject: [PATCH 1/5] editor --- .gitignore | 1 + .vscode/tasks.json | 22 + .../Converters/BlockColorConverter.cs | 25 ++ .../Converters/SavingLabelConverter.cs | 16 + src/MapExplorer.App/MainWindow.axaml | 5 + src/MapExplorer.App/MainWindow.axaml.cs | 27 ++ .../ViewModels/EditViewModel.cs | 269 ++++++++++++ .../ViewModels/MainViewModel.cs | 7 + src/MapExplorer.App/Views/EditPanelView.axaml | 182 ++++++++ .../Views/EditPanelView.axaml.cs | 11 + src/MapExplorer.App/Views/MapCanvasControl.cs | 404 +++++++++++++++++- .../Chunk/ChunkSectionCodec.cs | 104 +++++ .../Region/RegionChunkPatcher.cs | 105 +++++ .../Region/RegionFileWriter.cs | 113 +++++ src/MapExplorer.Core/World/EditOverlay.cs | 159 +++++++ src/MapExplorer.Core/World/WorldChunkStore.cs | 15 + src/MapExplorer.Core/World/WorldEditWriter.cs | 86 ++++ src/MapExplorer.Rendering/ChunkRenderer.cs | 18 +- src/MapExplorer.Rendering/Colors.cs | 4 +- .../ChunkSectionCodecTests.cs | 76 ++++ .../EditOverlayTests.cs | 139 ++++++ .../RegionChunkPatcherTests.cs | 133 ++++++ .../RegionFileWriterTests.cs | 60 +++ .../WorldEditWriterTests.cs | 131 ++++++ .../ChunkRendererTests.cs | 19 + 25 files changed, 2110 insertions(+), 21 deletions(-) create mode 100644 .vscode/tasks.json create mode 100644 src/MapExplorer.App/Converters/BlockColorConverter.cs create mode 100644 src/MapExplorer.App/Converters/SavingLabelConverter.cs create mode 100644 src/MapExplorer.App/ViewModels/EditViewModel.cs create mode 100644 src/MapExplorer.App/Views/EditPanelView.axaml create mode 100644 src/MapExplorer.App/Views/EditPanelView.axaml.cs create mode 100644 src/MapExplorer.Core/Chunk/ChunkSectionCodec.cs create mode 100644 src/MapExplorer.Core/Region/RegionChunkPatcher.cs create mode 100644 src/MapExplorer.Core/Region/RegionFileWriter.cs create mode 100644 src/MapExplorer.Core/World/EditOverlay.cs create mode 100644 src/MapExplorer.Core/World/WorldEditWriter.cs create mode 100644 test/MapExplorer.Core.Tests/ChunkSectionCodecTests.cs create mode 100644 test/MapExplorer.Core.Tests/EditOverlayTests.cs create mode 100644 test/MapExplorer.Core.Tests/RegionChunkPatcherTests.cs create mode 100644 test/MapExplorer.Core.Tests/RegionFileWriterTests.cs create mode 100644 test/MapExplorer.Core.Tests/WorldEditWriterTests.cs diff --git a/.gitignore b/.gitignore index 6f1430b..a4b762a 100644 --- a/.gitignore +++ b/.gitignore @@ -9,3 +9,4 @@ obj/ *.user .vs/ publish/ +.vscode/launch.json diff --git a/.vscode/tasks.json b/.vscode/tasks.json new file mode 100644 index 0000000..7f66283 --- /dev/null +++ b/.vscode/tasks.json @@ -0,0 +1,22 @@ +{ + "version": "2.0.0", + "tasks": [ + { + "label": "build", + "command": "/home/michal/.dotnet/dotnet", + "type": "process", + "args": [ + "build", + "${workspaceFolder}/src/MapExplorer.App/MapExplorer.App.csproj", + "/property:GenerateFullPaths=true", + "/consoleloggerparameters:NoSummary" + ], + "options": { + "env": { + "DOTNET_ROOT": "/home/michal/.dotnet" + } + }, + "problemMatcher": "$msCompile" + } + ] +} diff --git a/src/MapExplorer.App/Converters/BlockColorConverter.cs b/src/MapExplorer.App/Converters/BlockColorConverter.cs new file mode 100644 index 0000000..aee4fde --- /dev/null +++ b/src/MapExplorer.App/Converters/BlockColorConverter.cs @@ -0,0 +1,25 @@ +using System.Globalization; +using Avalonia.Data.Converters; +using Avalonia.Media; +using RenderColors = MapExplorer.Rendering.Colors; + +namespace MapExplorer.App.Converters; + +/// Converts a block name (e.g. "minecraft:dirt") to its curated swatch color — used by the +/// edit-mode material palette/search list/recents, which bind directly to plain block-name strings +/// rather than a wrapping view-model per entry (unlike OreOption, this list is filtered/reordered +/// live by search text and MRU order, so a lightweight converter is simpler than keeping a parallel +/// ObservableCollection of wrapper objects in sync). +public sealed class BlockColorConverter : IValueConverter +{ + public static readonly BlockColorConverter Instance = new(); + + public object Convert(object? value, Type targetType, object? parameter, CultureInfo culture) + { + var rgb = RenderColors.GetBlockColor(value as string ?? "minecraft:air"); + return new SolidColorBrush(Color.FromRgb(rgb.R, rgb.G, rgb.B)); + } + + public object ConvertBack(object? value, Type targetType, object? parameter, CultureInfo culture) => + throw new NotSupportedException(); +} diff --git a/src/MapExplorer.App/Converters/SavingLabelConverter.cs b/src/MapExplorer.App/Converters/SavingLabelConverter.cs new file mode 100644 index 0000000..0bdab1a --- /dev/null +++ b/src/MapExplorer.App/Converters/SavingLabelConverter.cs @@ -0,0 +1,16 @@ +using System.Globalization; +using Avalonia.Data.Converters; + +namespace MapExplorer.App.Converters; + +/// Save button label: "Saving…" while EditViewModel.SaveCommand is running, "Save" otherwise. +public sealed class SavingLabelConverter : IValueConverter +{ + public static readonly SavingLabelConverter Instance = new(); + + public object Convert(object? value, Type targetType, object? parameter, CultureInfo culture) => + value is true ? "Saving…" : "Save"; + + public object ConvertBack(object? value, Type targetType, object? parameter, CultureInfo culture) => + throw new NotSupportedException(); +} diff --git a/src/MapExplorer.App/MainWindow.axaml b/src/MapExplorer.App/MainWindow.axaml index 6ad0844..8f4e6ce 100644 --- a/src/MapExplorer.App/MainWindow.axaml +++ b/src/MapExplorer.App/MainWindow.axaml @@ -40,6 +40,8 @@ IsEnabled="{Binding IsEndAvailable}" ToolTip.Tip="{Binding EndTooltip}" /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +