using Microsoft.Win32; using RDTKEditor.Models; using RhythmBase.Events; using SkiaSharp; using System.ComponentModel; using System.Diagnostics; using System.Reflection; using System.Windows; using System.Windows.Controls; using System.Windows.Shapes; namespace RDTKEditor { /// /// Interaction logic for MainWindow.xaml /// public partial class MainWindow : Window { private readonly RDTKView viewModel = new(); public MainWindow() { InitializeComponent(); } private void OpenFile(object sender, RoutedEventArgs e) { OpenFileDialog openFileDialog = new() { Filter = "关卡文件|*.rdlevel|关卡压缩包 (*.rdzip)|*.rdzip" }; if (openFileDialog.ShowDialog() == true) { string filename = openFileDialog.FileName; viewModel.UpdateLevelByPath(filename); } } private void SaveFile(object sender, RoutedEventArgs e) { OpenFileDialog openFileDialog = new() { Filter = "Text files (*.txt)|*.txt|All files (*.*)|*.*" }; if (openFileDialog.ShowDialog() == true) { string filename = openFileDialog.FileName; viewModel.SaveLevelByPath(filename); } } private void Exit(object sender, RoutedEventArgs e) { Application.Current.Shutdown(); } private void About(object sender, RoutedEventArgs e) { OnUpdateEventProperties(GetProperties(new MoveRow())); //OnUpdateEventProperties([ // new(){ // Verifier = new RDTKPropertyVerifierDefault(), // Name = "Name", // Value = "RDTK Editor", // Type = RDPropertyType.String, // }, // new(){ // Verifier = new RDTKPropertyVerifierDefault(), // Name = "Version", // Value = "1.0.0", // Type = RDPropertyType.String, // }, // new(){ // Verifier = new RDTKPropertyVerifierEnum(typeof(EventType)), // Name = "Description", // Value = "RDTK Editor 是一个简单的节奏医生关卡编辑器。", // Type = RDPropertyType.Enum, // }, // new(){ // Verifier = new RDTKPropertyVerifierBool(), // Name = "测试值", // Value = "true", // Type = RDPropertyType.Bool, // } // ]); //MessageBox.Show("RDTK Editor 是一个简单的节奏医生关卡编辑器。", "关于 RDTK Editor"); } private RDTKProperty[] GetProperties(BaseEvent e) { return [ new RDTKProperty() { Verifier = new RDTKPropertyVerifierDefault(), Name = "类型", Value = e.Type.ToString(), Type = RDPropertyType.String, }, ..e.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance).Select(p => GetProperty(p,e)).ToArray() ]; } private RDTKProperty GetProperty(PropertyInfo property, object obj) { switch (property.PropertyType.Name) { case "Boolean": return new() { Verifier = new RDTKPropertyVerifierBool(), Name = property.Name, Value = property.GetValue(obj)?.ToString() ?? "false", Type = RDPropertyType.Bool, }; case "Enum": return new() { Verifier = new RDTKPropertyVerifierEnum(property.PropertyType), Name = property.Name, Value = property.GetValue(obj)?.ToString() ?? "null", Type = RDPropertyType.Enum, }; case "String": return new() { Verifier = new RDTKPropertyVerifierDefault(), Name = property.Name, Value = property.GetValue(obj)?.ToString() ?? "null", Type = RDPropertyType.String, }; } return new() { Verifier = new RDTKPropertyVerifierDefault(), Name = property.Name, Value = property.GetValue(obj)?.ToString() ?? "null", Type = RDPropertyType.String, }; } internal void OnUpdateEventProperties(RDTKProperty[] properties) { ItemProperties.Items.Clear(); foreach (var property in properties) { StackPanel stackPanel; switch (property.Type) { case RDPropertyType.Bool: stackPanel = new() { Orientation = Orientation.Horizontal, FlowDirection = FlowDirection.LeftToRight, Children = { new Label(){Content = property.Name}, new CheckBox() { IsChecked = bool.Parse( property.Value), } }, }; break; case RDPropertyType.Enum: stackPanel = new() { AllowDrop = true, Orientation = Orientation.Horizontal, FlowDirection = FlowDirection.LeftToRight, Children = { new Label(){Content = property.Name}, new ComboBox() { ItemsSource = Enum.GetValues(((RDTKPropertyVerifierEnum)property.Verifier).EnumType), SelectedValue = property.Value, } }, }; break; case RDPropertyType.String: stackPanel = new() { AllowDrop = true, Orientation = Orientation.Horizontal, FlowDirection = FlowDirection.LeftToRight, Children = { new Label(){Content = property.Name}, new TextBox() { Text = property.Value, } }, }; break; default: stackPanel = new() { Orientation = Orientation.Horizontal, Children = { new Label(){Content = property.Name}, new Label(){Content = property.Value} } }; break; } foreach (var child in stackPanel.Children) { switch (child) { case CheckBox checkBox: checkBox.Checked += (sender, e) => { property.OnChanged("true"); }; checkBox.Unchecked += (sender, e) => { property.OnChanged("false"); }; break; case TextBox textBox: textBox.TextChanged += (sender, e) => { property.OnChanged(textBox.Text); }; break; case ComboBox comboBox: comboBox.SelectionChanged += (sender, e) => { property.OnChanged(comboBox.SelectedValue); }; break; default: break; } } ItemProperties.Items.Add(stackPanel); property.PropertyChanged += (e, s) => UpdateEvent(); } } private void UpdateEvent() { MessageBox.Show("Update Event"); } private void UpdateTimeLine() { Rectangle rectangle = new() { Width = 100, Height = 100, }; timelineCanvas.Children.Add(rectangle); } /*private void mainUI_PaintSurface(object sender, SkiaSharp.Views.Desktop.SKPaintSurfaceEventArgs e) { var sfc = e.Surface; var cvs = sfc.Canvas; cvs.Clear(SKColors.Black); cvs.DrawLine(0, 0, 1600, 900, new() { Color = SKColors.Red, }); }*/ private void mainUI_PaintSurface(object sender, SkiaSharp.Views.Desktop.SKPaintSurfaceEventArgs e) { var sfc = e.Surface; var cvs = sfc.Canvas; var info = e.Info; // 清除画布 cvs.Clear(SKColors.Black); // 获取绘图表面的宽度和高度 float width = info.Width; float height = info.Height; // 设置缩放比例 float scaleX = width / 1600f; float scaleY = height / 900f; // 保存画布状态 cvs.Save(); // 应用缩放 cvs.Scale(scaleX, scaleY); // 绘制内容 cvs.DrawLine(0, 0, 1600, 900, new SKPaint { Color = SKColors.Red, StrokeWidth = 3, IsStroke = true, }); cvs.DrawLine(0, 900, 1600, 0, new SKPaint { Color = SKColors.White, StrokeWidth = 3, IsStroke = true, }); // 恢复画布状态 cvs.Restore(); // 打印绘图表面的尺寸 Debug.Print(info.Size.ToString()); } } public class MainViewModel : INotifyPropertyChanged { public event PropertyChangedEventHandler? PropertyChanged; } }