diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 0000000..044cd02 --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,31 @@ +name: Build VB6 + +on: + push: + branches: + - '*' + pull_request: + branches: + - '*' + +jobs: + build-linux-amd64: + runs-on: ubuntu-latest + + steps: + - name: Checkout code + uses: actions/checkout@v3 + + - name: Setup .NET + uses: actions/setup-dotnet@v3 + with: + dotnet-version: '9.0.x' + + - name: Run Tests + run: dotnet test AvaloniaVisualBasic.Runtime.Tests/AvaloniaVisualBasic.Runtime.Tests.csproj + + - name: Build AvaloniaVisualBasic.Desktop (Linux) + run: dotnet build AvaloniaVisualBasic.Desktop -f net9.0 -o bin/linux/ + + - name: Build AvaloniaVisualBasic.Standalone (Linux) + run: dotnet build AvaloniaVisualBasic.Standalone -f net9.0 -o bin/linux/standalone/ \ No newline at end of file diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml new file mode 100644 index 0000000..85ae69a --- /dev/null +++ b/.github/workflows/publish.yml @@ -0,0 +1,142 @@ +name: Publish Release + +on: + push: + tags: + - '**' + +jobs: + build-windows-amd64: + runs-on: windows-latest + + steps: + - name: Checkout code + uses: actions/checkout@v3 + + - name: Setup .NET + uses: actions/setup-dotnet@v3 + with: + dotnet-version: '9.0.x' + + - name: Build and Publish AvaloniaVisualBasic.Desktop (Windows) + run: dotnet publish AvaloniaVisualBasic.Desktop -f net9.0 -o bin/windows/ -p:PublishAot=true -p:PublishTrimmed=true + + - name: Build and Publish AvaloniaVisualBasic.Standalone (Windows) + run: dotnet publish AvaloniaVisualBasic.Standalone -f net9.0 -o bin/windows/standalone/ -p:PublishAot=true -p:PublishTrimmed=true + + - name: Remove Debug Symbols (Windows) + run: | + find ./bin/windows -name "*.pdb" -type f -delete + find ./bin/windows/standalone -name "*.dll" -type f -delete + mv ./bin/windows/AvaloniaVisualBasic.Desktop.exe ./bin/windows/AvaloniaVisualBasic.exe + shell: bash + + - name: Zip Windows Files + run: | + Compress-Archive -Path './bin/windows/*' -DestinationPath './bin/vb6-windows-amd64.zip' + shell: pwsh + + - name: Upload Windows Artifacts + uses: actions/upload-artifact@v4 + with: + name: windows-bin + path: ./bin/windows/ + + - name: Release + uses: softprops/action-gh-release@v2 + with: + files: ./bin/vb6-windows-amd64.zip + token: ${{ secrets.PAT }} + + build-linux-amd64: + runs-on: ubuntu-latest + + steps: + - name: Checkout code + uses: actions/checkout@v3 + + - name: Setup .NET + uses: actions/setup-dotnet@v3 + with: + dotnet-version: '9.0.x' + + - name: Build and Publish AvaloniaVisualBasic.Desktop (Linux) + run: dotnet publish AvaloniaVisualBasic.Desktop -f net9.0 -o bin/linux/ -p:PublishAot=true -p:PublishTrimmed=true + + - name: Build and Publish AvaloniaVisualBasic.Standalone (Linux) + run: dotnet publish AvaloniaVisualBasic.Standalone -f net9.0 -o bin/linux/standalone/ -p:PublishAot=true -p:PublishTrimmed=true + + - name: Remove Debug Symbols (Linux) + run: | + find ./bin/linux -name "*.dbg" -type f -delete + find ./bin/linux -name "*.pdb" -type f -delete + find ./bin/linux/standalone -name "*.so" -type f -delete + chmod +x ./bin/linux/AvaloniaVisualBasic.Desktop + chmod +x ./bin/linux/standalone/AvaloniaVisualBasic.Standalone + mv ./bin/linux/AvaloniaVisualBasic.Desktop ./bin/linux/AvaloniaVisualBasic + + - name: Tar files + run: | + cd ./bin/linux + tar -cvf vb6-linux-amd64.tar * + gzip vb6-linux-amd64.tar + cd ../../ + + - name: Upload Linux Artifacts + uses: actions/upload-artifact@v4 + with: + name: linux-bin + path: ./bin/linux/vb6-linux-amd64.tar.gz + + - name: Release + uses: softprops/action-gh-release@v2 + with: + files: ./bin/linux/vb6-linux-amd64.tar.gz + token: ${{ secrets.PAT }} + + build-macos-arm64: + runs-on: macos-latest + + steps: + - name: Checkout code + uses: actions/checkout@v3 + + - name: Setup .NET + uses: actions/setup-dotnet@v3 + with: + dotnet-version: '9.0.x' + + - name: Build and Publish AvaloniaVisualBasic.Desktop (macOS) + run: dotnet publish AvaloniaVisualBasic.Desktop -f net9.0 -o bin/macos/ -p:PublishAot=true -p:PublishTrimmed=true + + - name: Build and Publish AvaloniaVisualBasic.Standalone (macOS) + run: dotnet publish AvaloniaVisualBasic.Standalone -f net9.0 -o bin/macos/standalone/ -p:PublishAot=true -p:PublishTrimmed=true + + - name: Remove Debug Symbols (macOS) + run: | + find ./bin/macos -name "*.dbg" -type f -delete + find ./bin/macos -name "*.pdb" -type f -delete + find ./bin/macos -name "*.dSYM" -type d -exec rm -rf {} + + find ./bin/macos/standalone -name "*.dylib" -type f -delete + chmod +x ./bin/macos/AvaloniaVisualBasic.Desktop + chmod +x ./bin/macos/standalone/AvaloniaVisualBasic.Standalone + mv ./bin/macos/AvaloniaVisualBasic.Desktop ./bin/macos/AvaloniaVisualBasic + + - name: Tar files + run: | + cd ./bin/macos + tar -cvf vb6-macos-arm64.tar * + gzip vb6-macos-arm64.tar + cd ../../ + + - name: Upload macOS Artifacts + uses: actions/upload-artifact@v4 + with: + name: macos-bin + path: ./bin/macos/vb6-macos-arm64.tar + + - name: Release + uses: softprops/action-gh-release@v2 + with: + files: ./bin/macos/vb6-macos-arm64.tar.gz + token: ${{ secrets.PAT }} \ No newline at end of file diff --git a/AvaloniaVisualBasic.Desktop/AvaloniaVisualBasic.Desktop.csproj b/AvaloniaVisualBasic.Desktop/AvaloniaVisualBasic.Desktop.csproj index 77b1f92..12e80af 100644 --- a/AvaloniaVisualBasic.Desktop/AvaloniaVisualBasic.Desktop.csproj +++ b/AvaloniaVisualBasic.Desktop/AvaloniaVisualBasic.Desktop.csproj @@ -6,6 +6,7 @@ $(DotNetVersionDesktop) enable true + vb6icon.ico @@ -21,4 +22,10 @@ + + + + vb6icon.ico + + diff --git a/AvaloniaVisualBasic.Desktop/vb6icon.ico b/AvaloniaVisualBasic.Desktop/vb6icon.ico new file mode 100755 index 0000000..296d9dc Binary files /dev/null and b/AvaloniaVisualBasic.Desktop/vb6icon.ico differ diff --git a/AvaloniaVisualBasic.Standalone/App.axaml.cs b/AvaloniaVisualBasic.Standalone/App.axaml.cs index 1b7f5ee..8da74db 100644 --- a/AvaloniaVisualBasic.Standalone/App.axaml.cs +++ b/AvaloniaVisualBasic.Standalone/App.axaml.cs @@ -3,6 +3,7 @@ using Avalonia.Controls; using Avalonia.Controls.ApplicationLifetimes; using Avalonia.Markup.Xaml; +using Avalonia.Platform; using AvaloniaVisualBasic.Runtime; using Classic.Avalonia.Theme; using Classic.CommonControls.Dialogs; @@ -23,6 +24,7 @@ public override void OnFrameworkInitializationCompleted() if (Program.StartupForm != null) { VBLoader.RunForm(Program.StartupForm, default, out var window); + window.Icon = new WindowIcon(AssetLoader.Open(new Uri("avares://AvaloniaVisualBasic.Standalone/form.ico"))); desktop.MainWindow = window; } else @@ -40,6 +42,7 @@ public override void OnFrameworkInitializationCompleted() }; window.Content = msgBox; desktop.MainWindow = window; + window.Icon = new WindowIcon(AssetLoader.Open(new Uri("avares://AvaloniaVisualBasic.Standalone/form.ico"))); msgBox.AcceptRequest += _ => window.Close(); } } diff --git a/AvaloniaVisualBasic.Standalone/AvaloniaVisualBasic.Standalone.csproj b/AvaloniaVisualBasic.Standalone/AvaloniaVisualBasic.Standalone.csproj index e71ef04..dc9cbb1 100644 --- a/AvaloniaVisualBasic.Standalone/AvaloniaVisualBasic.Standalone.csproj +++ b/AvaloniaVisualBasic.Standalone/AvaloniaVisualBasic.Standalone.csproj @@ -10,6 +10,7 @@ true False None + form.ico @@ -33,5 +34,7 @@ + + diff --git a/AvaloniaVisualBasic.Standalone/form.ico b/AvaloniaVisualBasic.Standalone/form.ico new file mode 100644 index 0000000..f95f437 Binary files /dev/null and b/AvaloniaVisualBasic.Standalone/form.ico differ diff --git a/AvaloniaVisualBasic.sln b/AvaloniaVisualBasic.sln index f71cae5..a899ba9 100644 --- a/AvaloniaVisualBasic.sln +++ b/AvaloniaVisualBasic.sln @@ -20,6 +20,8 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "meta", "meta", "{6151C731-2 README.md = README.md LICENSE = LICENSE build_cloudflare.sh = build_cloudflare.sh + .github\workflows\publish.yml = .github\workflows\publish.yml + .github\workflows\build.yml = .github\workflows\build.yml EndProjectSection EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AvaloniaVisualBasic.Standalone", "AvaloniaVisualBasic.Standalone\AvaloniaVisualBasic.Standalone.csproj", "{0C6BC133-E273-4716-83D1-4FD1B0C14E19}" diff --git a/AvaloniaVisualBasic/AvaloniaVisualBasic.csproj b/AvaloniaVisualBasic/AvaloniaVisualBasic.csproj index cdf4658..08d4f24 100644 --- a/AvaloniaVisualBasic/AvaloniaVisualBasic.csproj +++ b/AvaloniaVisualBasic/AvaloniaVisualBasic.csproj @@ -42,5 +42,7 @@ + + diff --git a/AvaloniaVisualBasic/IDE/WindowManager.cs b/AvaloniaVisualBasic/IDE/WindowManager.cs index 7f9a553..61d48f2 100644 --- a/AvaloniaVisualBasic/IDE/WindowManager.cs +++ b/AvaloniaVisualBasic/IDE/WindowManager.cs @@ -83,7 +83,9 @@ public async Task ShowWindow(IDialog dialog) { Content = dialog, DataContext = dialog, - SizeToContent = SizeToContent.WidthAndHeight + SizeToContent = SizeToContent.WidthAndHeight, + ShowActivated = true, + WindowStartupLocation = WindowStartupLocation.CenterOwner }; var lifetime = new TaskCompletionSource(); @@ -225,7 +227,9 @@ void DialogOnCloseRequested(bool result) { Content = dialog, DataContext = dialog, - SizeToContent = SizeToContent.WidthAndHeight + SizeToContent = SizeToContent.WidthAndHeight, + ShowActivated = true, + WindowStartupLocation = WindowStartupLocation.CenterOwner }; return await window.ShowDialog(GetTopWindow(desktop)); } diff --git a/AvaloniaVisualBasic/MainWindow.axaml b/AvaloniaVisualBasic/MainWindow.axaml index 8384b8d..ea2f922 100644 --- a/AvaloniaVisualBasic/MainWindow.axaml +++ b/AvaloniaVisualBasic/MainWindow.axaml @@ -6,7 +6,7 @@ mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450" x:Class="AvaloniaVisualBasic.MainWindow" x:DataType="avaloniaVisualBasic:MainViewViewModel" - Icon="/Icons/vb6.gif" + Icon="/vb6icon.ico" ClosingBehavior="OwnerAndChildWindows" Title="{CompiledBinding Title}"> diff --git a/AvaloniaVisualBasic/Projects/ProjectService.cs b/AvaloniaVisualBasic/Projects/ProjectService.cs index 76f7d49..d1d0879 100644 --- a/AvaloniaVisualBasic/Projects/ProjectService.cs +++ b/AvaloniaVisualBasic/Projects/ProjectService.cs @@ -247,6 +247,23 @@ public async Task EditProjectComponents(ProjectDefinition project) } public async Task MakeProject(ProjectDefinition projectDefinition) + { + try + { + await MakeProjectInternal(projectDefinition); + } + catch (OperationCanceledException) + { + throw; + } + catch (Exception e) + { + await windowManager.MessageBox("Fatal error while making the project:\n" + e.Message, icon: MessageBoxIcon.Information); + throw; + } + } + + private async Task MakeProjectInternal(ProjectDefinition projectDefinition) { if (OperatingSystem.IsBrowser()) { @@ -264,26 +281,35 @@ public async Task MakeProject(ProjectDefinition projectDefinition) if (exePath == null) throw new OperationCanceledException(); - List requiredNativeFiles; + List requiredNativeFiles; if (OperatingSystem.IsWindows()) { requiredNativeFiles = [ - new FileInfo("standalone/av_libglesv2.dll"), - new FileInfo("standalone/AvaloniaVisualBasic.Standalone.exe"), - new FileInfo("standalone/libHarfBuzzSharp.dll"), - new FileInfo("standalone/libSkiaSharp.dll") + [new FileInfo("standalone/av_libglesv2.dll"), new FileInfo("av_libglesv2.dll")], + [new FileInfo("standalone/AvaloniaVisualBasic.Standalone.exe")], + [new FileInfo("standalone/libHarfBuzzSharp.dll"), new FileInfo("libHarfBuzzSharp.dll")], + [new FileInfo("standalone/libSkiaSharp.dll"), new FileInfo("libSkiaSharp.dll")] ]; } else if (OperatingSystem.IsMacOS()) { requiredNativeFiles = [ - new FileInfo("standalone/libAvaloniaNative.dylib"), - new FileInfo("standalone/AvaloniaVisualBasic.Standalone"), - new FileInfo("standalone/libHarfBuzzSharp.dylib"), - new FileInfo("standalone/libSkiaSharp.dylib") + [new FileInfo("standalone/libAvaloniaNative.dylib"), new FileInfo("libAvaloniaNative.dylib")], + [new FileInfo("standalone/AvaloniaVisualBasic.Standalone")], + [new FileInfo("standalone/libHarfBuzzSharp.dylib"), new FileInfo("libHarfBuzzSharp.dylib")], + [new FileInfo("standalone/libSkiaSharp.dylib"), new FileInfo("libSkiaSharp.dylib")] + ]; + } + else if (OperatingSystem.IsLinux()) + { + requiredNativeFiles = + [ + [new FileInfo("standalone/AvaloniaVisualBasic.Standalone")], + [new FileInfo("standalone/libHarfBuzzSharp.so"), new FileInfo("libHarfBuzzSharp.so")], + [new FileInfo("standalone/libSkiaSharp.so"), new FileInfo("libSkiaSharp.so")] ]; } else @@ -292,7 +318,7 @@ public async Task MakeProject(ProjectDefinition projectDefinition) throw new OperationCanceledException(); } - if (requiredNativeFiles.Any(f => !f.Exists)) + if (requiredNativeFiles.Any(files => files.All(f => !f.Exists))) { await windowManager.MessageBox("To Make Project, you need to build standalone runtime first. See the readme for help.", icon: MessageBoxIcon.Information); throw new OperationCanceledException(); @@ -322,8 +348,10 @@ public async Task MakeProject(ProjectDefinition projectDefinition) ZipFile.CreateFromDirectory(tempPath, Path.ChangeExtension(exePath, "dll")!); Directory.Delete(tempPath, true); - foreach (var standaloneFile in requiredNativeFiles) + foreach (var standaloneFile in requiredNativeFiles.Select(f => f.FirstOrDefault(x => x.Exists))) { + if (standaloneFile == null) + throw new Exception($"Required files doesn't exist, even tho it existed few lines above"); var fileName = standaloneFile.Name; if (fileName.StartsWith("AvaloniaVisualBasic.Standalone")) fileName = Path.GetFileName(exePath); diff --git a/AvaloniaVisualBasic/vb6icon.ico b/AvaloniaVisualBasic/vb6icon.ico new file mode 100755 index 0000000..296d9dc Binary files /dev/null and b/AvaloniaVisualBasic/vb6icon.ico differ