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