diff --git a/Progrart.Browser/Progrart.Browser.csproj b/Progrart.Browser/Progrart.Browser.csproj index 5e25c81..a2044d7 100644 --- a/Progrart.Browser/Progrart.Browser.csproj +++ b/Progrart.Browser/Progrart.Browser.csproj @@ -1,18 +1,18 @@  - - net10.0-browser - Exe - true - true - enable - + + net10.0-browser + Exe + true + true + enable + - - - - + + + + - - - + + + diff --git a/Progrart.Core/Graphics/Rectangle.cs b/Progrart.Core/Graphics/Rectangle.cs index 1a9aeee..ad6ee12 100644 --- a/Progrart.Core/Graphics/Rectangle.cs +++ b/Progrart.Core/Graphics/Rectangle.cs @@ -1,7 +1,87 @@ -namespace Progrart.Core.Graphics +using Jint; +using Jint.Native; +using Progrart.Core.JSExecution; +using SkiaSharp; +using System.Diagnostics; + +namespace Progrart.Core.Graphics { public class Rectangle : BaseElement { + float StrokeWidth; + SKPoint Start; + SKPoint Size; + SKColorF Color; + SKShader? shader = null; + public override void SetupProperties(Engine engine) + { + base.SetupProperties(engine); + if (__object != null) + { + { + JsObject point = new JsObject(engine); + point.Set("x", 0); + point.Set("y", 0); + __object.Set("Position", point); + } + __object.Set("StrokeWidth", 1); + __object.Set("Color", ProgrartFunctions.color(engine, 1, 1, 1, 1)); + { + JsObject point = new JsObject(engine); + point.Set("x", 0); + point.Set("y", 0); + __object.Set("Size", point); + } + + } + + } + public override void LoadProperties() + { + if (__object is not null) + { + StrokeWidth = (float)__object.Get("StrokeWidth").AsNumber(); + { + if (__object.Get("Position") is JsObject Start) + { + this.Start = ProgrartConversion.ObtainSKPointFromJsObject(Start); + } + } + { + if (__object.Get("Size") is JsObject End) + { + this.Size = ProgrartConversion.ObtainSKPointFromJsObject(End); + } + } + { + if (__object.Get("Color") is JsObject Color) + { + this.Color = ProgrartConversion.ObtainSKColorFFromJsObject(Color); + } + } + + if (__object.Get("Shader") is JsObject shaderObj) + shader = ProgrartConversion.ObtainFromJsObject(shaderObj); + } + } + public override void Render(RenderContext context) + { + base.Render(context); + LoadProperties(); + SKPoint FinalStartPos = context.TranslatePoint(Start); + SKPoint FinalEndPos = context.TranslatePoint(Size); + Trace.WriteLine($"Draw Rectangle from {FinalStartPos} to {FinalEndPos} using {Color} with size of {StrokeWidth}."); + context.DrawingCore.canvas.DrawRect( + FinalStartPos.X, FinalStartPos.Y, + FinalEndPos.X, FinalEndPos.Y, + new SKPaint() + { + ColorF = Color, + StrokeWidth = StrokeWidth, + Shader = shader + } + ); + } } } diff --git a/Progrart.Core/JSExecution/ExecutionEngine.cs b/Progrart.Core/JSExecution/ExecutionEngine.cs index 046446f..e856fe4 100644 --- a/Progrart.Core/JSExecution/ExecutionEngine.cs +++ b/Progrart.Core/JSExecution/ExecutionEngine.cs @@ -32,7 +32,6 @@ namespace Progrart.Core.JSExecution public void Dispose() { Engine.Dispose(); - } } } diff --git a/Progrart.Core/JSExecution/ProgrartExecutor.cs b/Progrart.Core/JSExecution/ProgrartExecutor.cs index 4e3fbfd..c6e5021 100644 --- a/Progrart.Core/JSExecution/ProgrartExecutor.cs +++ b/Progrart.Core/JSExecution/ProgrartExecutor.cs @@ -19,7 +19,6 @@ namespace Progrart.Core.JSExecution } public void SetupCalls() { - engine.Engine.SetValue("visual_root", visual_root); Jint.Native.Json.JsonSerializer serializer = new Jint.Native.Json.JsonSerializer(engine.Engine); engine.Engine.SetValue("log", new Action((v) => { @@ -30,7 +29,9 @@ namespace Progrart.Core.JSExecution else Trace.WriteLine(v); })); + engine.Engine.SetValue("visual_root", visual_root); engine.Engine.SetValue("line", line); + engine.Engine.SetValue("rectangle", rectangle); engine.Engine.SetValue("color4", color4); engine.Engine.SetValue("color3", color3); engine.Engine.SetValue("linear_gradient", linear_gradient); @@ -59,7 +60,13 @@ namespace Progrart.Core.JSExecution } public JsObject line() { - return ProgrartFunctions.CreateLine(this); + //return ProgrartFunctions.CreateLine(this); + return ProgrartFunctions.CreateElement(this); + } + public JsObject rectangle() + { + //return ProgrartFunctions.CreateLine(this); + return ProgrartFunctions.CreateElement(this); } public RenderContext RenderImage(int Scale, string script, ExecuteArguments arguments) { diff --git a/Progrart.Core/JSExecution/ProgrartFunctions.cs b/Progrart.Core/JSExecution/ProgrartFunctions.cs index 4517bcd..28130b5 100644 --- a/Progrart.Core/JSExecution/ProgrartFunctions.cs +++ b/Progrart.Core/JSExecution/ProgrartFunctions.cs @@ -118,5 +118,13 @@ namespace Progrart.Core.JSExecution element.SetupProperties(executor.engine.Engine); return obj; } + public static JsObject CreateElement(ProgrartExecutor executor) where T: BaseElement + { + T element=Activator.CreateInstance() as T; + var obj = WrapObject(executor, executor.RegisterObject(element)); + element.__object = obj; + element.SetupProperties(executor.engine.Engine); + return obj; + } } } diff --git a/Progrart/App.axaml b/Progrart/App.axaml index 51aa400..170ffb1 100644 --- a/Progrart/App.axaml +++ b/Progrart/App.axaml @@ -291,8 +291,19 @@ + + + + \ No newline at end of file diff --git a/Progrart/Commands/GenericCommand.cs b/Progrart/Commands/GenericCommand.cs new file mode 100644 index 0000000..dfb475f --- /dev/null +++ b/Progrart/Commands/GenericCommand.cs @@ -0,0 +1,23 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Windows.Input; + +namespace Progrart.Commands +{ + public class GenericCommand : ICommand + { + public event EventHandler? CanExecuteChanged; + public Func? Checker = null; + public Action? onExecute = null; + public bool CanExecute(object? parameter) + { + return Checker?.Invoke(parameter) ?? true; + } + + public void Execute(object? parameter) + { + onExecute?.Invoke(parameter); + } + } +} diff --git a/Progrart/Controls/BaseEditor.axaml b/Progrart/Controls/BaseEditor.axaml index e0194fe..2e24770 100644 --- a/Progrart/Controls/BaseEditor.axaml +++ b/Progrart/Controls/BaseEditor.axaml @@ -1,19 +1,19 @@ - + - + - - - - - - + + + + + + diff --git a/Progrart/Controls/BaseEditor.axaml.cs b/Progrart/Controls/BaseEditor.axaml.cs index db4cf81..492400a 100644 --- a/Progrart/Controls/BaseEditor.axaml.cs +++ b/Progrart/Controls/BaseEditor.axaml.cs @@ -4,6 +4,7 @@ using Avalonia.Input; using Avalonia.Markup.Xaml; using AvaloniaEdit; using AvaloniaEdit.TextMate; +using Progrart.Commands; using System; using System.Windows.Input; using TextMateSharp.Grammars; @@ -12,71 +13,63 @@ namespace Progrart.Controls; public partial class BaseEditor : UserControl { - RegistryOptions _registryOptions; - TextMate.Installation _textMateInstallation; - public string Text - { - get => CodeEditBox.Text; - set => CodeEditBox.Text = value; - } - public Action? onSaveCmd; - public BaseEditor() - { - InitializeComponent(); - { - var _textEditor = CodeEditBox; - _registryOptions = new RegistryOptions(ThemeName.DarkPlus); - _textMateInstallation = _textEditor.InstallTextMate(_registryOptions); - _textMateInstallation.SetGrammar(_registryOptions.GetScopeByLanguageId(_registryOptions.GetLanguageByExtension(".js").Id)); - } - var saveBinding = new KeyBinding - { - Gesture = new KeyGesture(Key.S, KeyModifiers.Control), - Command = new saveCmd() { onSave = Save } - }; + RegistryOptions? _registryOptions; + TextMate.Installation? _textMateInstallation; + public string Text + { + get => CodeEditBox.Text; + set => CodeEditBox.Text = value; + } + public Action? onSaveCmd; + public BaseEditor() + { + InitializeComponent(); - CodeEditBox.KeyBindings.Add(saveBinding); - } - void Save() - { - onSaveCmd?.Invoke(); - } - class saveCmd : ICommand - { - public event EventHandler? CanExecuteChanged; - public Action? onSave; - public bool CanExecute(object? parameter) - { - return true; - } + if (!OperatingSystem.IsBrowser()) + { + var _textEditor = CodeEditBox; + _registryOptions = new RegistryOptions(ThemeName.DarkPlus); + _textMateInstallation = _textEditor.InstallTextMate(_registryOptions); + _textMateInstallation.SetGrammar(_registryOptions.GetScopeByLanguageId(_registryOptions.GetLanguageByExtension(".js").Id)); + } + var saveBinding = new KeyBinding + { + Gesture = new KeyGesture(Key.S, KeyModifiers.Control), + Command = new GenericCommand() { onExecute = (_) => Save() } + }; - public void Execute(object? parameter) - { - onSave?.Invoke(); - } - } - public void SetGrammerByExtension(string extension_name) - { - _textMateInstallation.SetGrammar( - _registryOptions.GetScopeByLanguageId( - _registryOptions.GetLanguageByExtension(extension_name).Id - ) - ); + CodeEditBox.KeyBindings.Add(saveBinding); + } + void Save() + { + onSaveCmd?.Invoke(); + } + public void SetGrammerByExtension(string extension_name) + { + if (OperatingSystem.IsBrowser()) + { + return; + } + _textMateInstallation?.SetGrammar( + _registryOptions?.GetScopeByLanguageId( + _registryOptions.GetLanguageByExtension(extension_name).Id + ) + ); - } + } - private void Copy_Click(object? sender, Avalonia.Interactivity.RoutedEventArgs e) - { - CodeEditBox.Copy(); - } + private void Copy_Click(object? sender, Avalonia.Interactivity.RoutedEventArgs e) + { + CodeEditBox.Copy(); + } - private void Paste_Click(object? sender, Avalonia.Interactivity.RoutedEventArgs e) - { - CodeEditBox.Paste(); - } + private void Paste_Click(object? sender, Avalonia.Interactivity.RoutedEventArgs e) + { + CodeEditBox.Paste(); + } - private void Cut_Click(object? sender, Avalonia.Interactivity.RoutedEventArgs e) - { - CodeEditBox.Cut(); - } + private void Cut_Click(object? sender, Avalonia.Interactivity.RoutedEventArgs e) + { + CodeEditBox.Cut(); + } } \ No newline at end of file diff --git a/Progrart/Pages/ProgrartEditorPage.axaml.cs b/Progrart/Pages/ProgrartEditorPage.axaml.cs index 430f5fe..b2376f1 100644 --- a/Progrart/Pages/ProgrartEditorPage.axaml.cs +++ b/Progrart/Pages/ProgrartEditorPage.axaml.cs @@ -8,6 +8,7 @@ using Progrart.Controls.TabSystem; using Progrart.Core; using Progrart.Core.JSExecution; using Progrart.Pages; +using System; using System.Diagnostics; using System.IO; using System.Threading.Tasks; @@ -73,12 +74,12 @@ public partial class ProgrartEditorPage : UserControl, ITabPage, IEditorPage return false; } - public bool IsSameFile(IStorageFile file) - { - return (this.file?.Path==file.Path); - } + public bool IsSameFile(IStorageFile file) + { + return (this.file?.Path == file.Path); + } - public void LoadDocument(IStorageFile file) + public void LoadDocument(IStorageFile file) { this.file = file; if (btn is not null) @@ -95,10 +96,16 @@ public partial class ProgrartEditorPage : UserControl, ITabPage, IEditorPage using var stream = await file.OpenReadAsync(); using StreamReader sr = new StreamReader(stream); var text = sr.ReadToEnd(); - Dispatcher.UIThread.Invoke(() => + if (OperatingSystem.IsBrowser()) { + CodeEditor.Text = text; - }); + } + else + Dispatcher.UIThread.Invoke(() => + { + CodeEditor.Text = text; + }); }); } diff --git a/Progrart/Views/MainView.axaml b/Progrart/Views/MainView.axaml index af69ecb..5ca9815 100644 --- a/Progrart/Views/MainView.axaml +++ b/Progrart/Views/MainView.axaml @@ -33,7 +33,7 @@ Progart -