First commit
This commit is contained in:
parent
15277cf8eb
commit
861cbbe23c
60
.gitignore
vendored
Normal file
60
.gitignore
vendored
Normal file
@ -0,0 +1,60 @@
|
|||||||
|
## A streamlined .gitignore for modern .NET projects
|
||||||
|
## including temporary files, build results, and
|
||||||
|
## files generated by popular .NET tools. If you are
|
||||||
|
## developing with Visual Studio, the VS .gitignore
|
||||||
|
## https://github.com/github/gitignore/blob/main/VisualStudio.gitignore
|
||||||
|
## has more thorough IDE-specific entries.
|
||||||
|
##
|
||||||
|
## Get latest from https://github.com/github/gitignore/blob/main/Dotnet.gitignore
|
||||||
|
|
||||||
|
# Build results
|
||||||
|
[Dd]ebug/
|
||||||
|
[Dd]ebugPublic/
|
||||||
|
[Rr]elease/
|
||||||
|
[Rr]eleases/
|
||||||
|
x64/
|
||||||
|
x86/
|
||||||
|
[Ww][Ii][Nn]32/
|
||||||
|
[Aa][Rr][Mm]/
|
||||||
|
[Aa][Rr][Mm]64/
|
||||||
|
bld/
|
||||||
|
[Bb]in/
|
||||||
|
[Oo]bj/
|
||||||
|
[Ll]og/
|
||||||
|
[Ll]ogs/
|
||||||
|
|
||||||
|
# .NET Core
|
||||||
|
project.lock.json
|
||||||
|
project.fragment.lock.json
|
||||||
|
artifacts/
|
||||||
|
|
||||||
|
# ASP.NET Scaffolding
|
||||||
|
ScaffoldingReadMe.txt
|
||||||
|
|
||||||
|
# NuGet Packages
|
||||||
|
*.nupkg
|
||||||
|
# NuGet Symbol Packages
|
||||||
|
*.snupkg
|
||||||
|
|
||||||
|
# dotenv environment variables file
|
||||||
|
.env
|
||||||
|
|
||||||
|
# Others
|
||||||
|
~$*
|
||||||
|
*~
|
||||||
|
CodeCoverage/
|
||||||
|
|
||||||
|
# MSBuild Binary and Structured Log
|
||||||
|
*.binlog
|
||||||
|
|
||||||
|
# MSTest test Results
|
||||||
|
[Tt]est[Rr]esult*/
|
||||||
|
[Bb]uild[Ll]og.*
|
||||||
|
|
||||||
|
# NUnit
|
||||||
|
*.VisualState.xml
|
||||||
|
TestResult.xml
|
||||||
|
nunit-*.xml
|
||||||
|
|
||||||
|
temp
|
||||||
|
nuget.config
|
||||||
25
Photino-Boilerplate.csproj
Normal file
25
Photino-Boilerplate.csproj
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
<PropertyGroup>
|
||||||
|
<OutputType>Exe</OutputType>
|
||||||
|
<TargetFramework>net8.0</TargetFramework>
|
||||||
|
<Platforms>AnyCPU</Platforms>
|
||||||
|
<RootNamespace>Photino_Boilerplate</RootNamespace>
|
||||||
|
<ImplicitUsings>enable</ImplicitUsings>
|
||||||
|
<Nullable>enable</Nullable>
|
||||||
|
<PublishTrimmed>false</PublishTrimmed>
|
||||||
|
</PropertyGroup>
|
||||||
|
<Target Name="PackRenderer" BeforeTargets="DispatchToInnerBuild;BeforeBuild">
|
||||||
|
<PropertyGroup>
|
||||||
|
<BrikPackagerDll>$([System.IO.Path]::Combine('$(PkgBrikPackager)', 'lib', 'net8.0', 'BrikPackager.dll'))</BrikPackagerDll>
|
||||||
|
<InputPath>$([System.IO.Path]::Combine('$(MSBuildProjectDirectory)', 'src', 'resources', 'renderer'))</InputPath>
|
||||||
|
<OutputPathFile>$([System.IO.Path]::Combine('$(TargetDir)', 'root.dat'))</OutputPathFile>
|
||||||
|
</PropertyGroup>
|
||||||
|
<Message Importance="high" Text="[] Packaging renderer (Cross-Platform)..." />
|
||||||
|
<Exec Command="dotnet "$(BrikPackagerDll)" --action pack --input "$(InputPath)" --output "$(OutputPathFile)" --key 66" />
|
||||||
|
<Message Importance="high" Text="[] Renderer packed at: $(OutputPathFile)" />
|
||||||
|
</Target>
|
||||||
|
<ItemGroup>
|
||||||
|
<PackageReference Include="BrikPackager" Version="0.0.1" GeneratePathProperty="true" />
|
||||||
|
<PackageReference Include="Photino.NET" Version="4.0.16" />
|
||||||
|
</ItemGroup>
|
||||||
|
</Project>
|
||||||
24
Photino-Boilerplate.sln
Normal file
24
Photino-Boilerplate.sln
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||||
|
# Visual Studio Version 17
|
||||||
|
VisualStudioVersion = 17.5.2.0
|
||||||
|
MinimumVisualStudioVersion = 10.0.40219.1
|
||||||
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Photino-Boilerplate", "Photino-Boilerplate.csproj", "{5FF73963-D009-62ED-7350-FF17EC625A26}"
|
||||||
|
EndProject
|
||||||
|
Global
|
||||||
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
|
Debug|Any CPU = Debug|Any CPU
|
||||||
|
Release|Any CPU = Release|Any CPU
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||||
|
{5FF73963-D009-62ED-7350-FF17EC625A26}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{5FF73963-D009-62ED-7350-FF17EC625A26}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{5FF73963-D009-62ED-7350-FF17EC625A26}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{5FF73963-D009-62ED-7350-FF17EC625A26}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(SolutionProperties) = preSolution
|
||||||
|
HideSolutionNode = FALSE
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(ExtensibilityGlobals) = postSolution
|
||||||
|
SolutionGuid = {5D254170-B473-471E-AD56-26A8F4C4189E}
|
||||||
|
EndGlobalSection
|
||||||
|
EndGlobal
|
||||||
78
src/main/Program.cs
Normal file
78
src/main/Program.cs
Normal file
@ -0,0 +1,78 @@
|
|||||||
|
using System.Reflection;
|
||||||
|
using System.Text.Json;
|
||||||
|
using BrikPackager;
|
||||||
|
using PhotinoBoilerplate.Utils;
|
||||||
|
using Photino.NET;
|
||||||
|
|
||||||
|
namespace PhotinoBoilerplate;
|
||||||
|
|
||||||
|
class Program{
|
||||||
|
|
||||||
|
public static readonly JsonSerializerOptions _jsonOptions = new() { PropertyNamingPolicy = JsonNamingPolicy.CamelCase };
|
||||||
|
private static readonly string __dirname = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location)!;
|
||||||
|
|
||||||
|
[STAThread]
|
||||||
|
static void Main(string[] args) {
|
||||||
|
CreateMainWindow().WaitForClose();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static PhotinoWindow CreateMainWindow() {
|
||||||
|
BrikPackage bpkg = new BrikPackage(Path.Combine(__dirname, "root.dat"), 66);
|
||||||
|
List<string> entries = bpkg.ListEntries();
|
||||||
|
var window = new PhotinoWindow()
|
||||||
|
.SetTitle("Photino Boilerplate")
|
||||||
|
.SetUseOsDefaultLocation(false)
|
||||||
|
.SetUseOsDefaultSize(false)
|
||||||
|
.RegisterCustomSchemeHandler("http", (object sender, string scheme, string url, out string contentType) =>{
|
||||||
|
Uri uri = new Uri(url);
|
||||||
|
switch (uri.Host){
|
||||||
|
case "internal":
|
||||||
|
string internalPath = uri.AbsolutePath;
|
||||||
|
contentType = MimeHelper.GetMimeType(uri.AbsolutePath);
|
||||||
|
byte[] fileData = bpkg.GetFileBytes(internalPath.TrimStart('/'));
|
||||||
|
return fileData != null ? new MemoryStream(fileData) : null;
|
||||||
|
default:
|
||||||
|
contentType = null!;
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
window.WindowCreated += (sender, e) => {
|
||||||
|
SetupBridge(window);
|
||||||
|
WindowHelper.setSize(window, 900, 600);
|
||||||
|
window.Center();
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
window.Load("http://internal/index.html");
|
||||||
|
|
||||||
|
return window;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void SetupBridge(PhotinoWindow window) {
|
||||||
|
window.RegisterWebMessageReceivedHandler(async (object? sender, string message) => {
|
||||||
|
try {
|
||||||
|
var json = JsonDocument.Parse(message);
|
||||||
|
string requestId = json.RootElement.GetProperty("requestId").GetString()!;
|
||||||
|
string method = json.RootElement.GetProperty("functionName").GetString()!;
|
||||||
|
var jsonPayload = json.RootElement.GetProperty("payload");
|
||||||
|
var pw = (PhotinoWindow)sender!;
|
||||||
|
|
||||||
|
object? payload = null;
|
||||||
|
|
||||||
|
switch (method) {
|
||||||
|
case "hello::world":
|
||||||
|
payload = "Hello from C#";
|
||||||
|
break;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
var response = new { requestId, payload };
|
||||||
|
window.SendWebMessage(JsonSerializer.Serialize(response, _jsonOptions));
|
||||||
|
} catch (Exception ex) {
|
||||||
|
Console.WriteLine($"Error stacktrace: {ex.StackTrace}");
|
||||||
|
Console.WriteLine($"Bridge error: {ex.Message}");
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
29
src/main/helpers/Window.cs
Normal file
29
src/main/helpers/Window.cs
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
using Photino.NET;
|
||||||
|
using System.Drawing;
|
||||||
|
|
||||||
|
namespace PhotinoBoilerplate.Utils;
|
||||||
|
|
||||||
|
public static class WindowHelper {
|
||||||
|
|
||||||
|
private const float StandardDpi = 96.0f;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
public static Size GetScaledSize(PhotinoWindow window, int logicalWidth, int logicalHeight) {
|
||||||
|
float currentDpi = window.ScreenDpi > 0 ? window.ScreenDpi : StandardDpi;
|
||||||
|
float scaleFactor = currentDpi / StandardDpi;
|
||||||
|
|
||||||
|
return new Size(
|
||||||
|
(int)(logicalWidth * scaleFactor),
|
||||||
|
(int)(logicalHeight * scaleFactor)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void setSize(PhotinoWindow window, int width, int height) {
|
||||||
|
Size targetSize = GetScaledSize(window, width, height);
|
||||||
|
window
|
||||||
|
.SetResizable(true)
|
||||||
|
.SetSize(targetSize)
|
||||||
|
.SetMinSize(targetSize.Width, targetSize.Height);
|
||||||
|
}
|
||||||
|
}
|
||||||
45
src/resources/renderer/assets/css/index.css
Normal file
45
src/resources/renderer/assets/css/index.css
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
@import url("https://fonts.googleapis.com/css2?family=Poppins:ital,wght@0,100;0,200;0,300;0,400;0,500;0,600;0,700;0,800;0,900;1,100;1,200;1,300;1,400;1,500;1,600;1,700;1,800;1,900&display=swap");
|
||||||
|
|
||||||
|
* {
|
||||||
|
margin: 0px;
|
||||||
|
padding: 0px;
|
||||||
|
box-sizing: border-box;
|
||||||
|
}
|
||||||
|
|
||||||
|
main {
|
||||||
|
display: flex;
|
||||||
|
position: absolute;
|
||||||
|
top: 0px;
|
||||||
|
left: 0px;
|
||||||
|
right: 0px;
|
||||||
|
bottom: 0px;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
flex-direction: column;
|
||||||
|
gap: 10px;
|
||||||
|
color: #cecece;
|
||||||
|
background-color: #404551;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
font-family: "Poppins", sans-serif;
|
||||||
|
}
|
||||||
|
|
||||||
|
button {
|
||||||
|
cursor: pointer;
|
||||||
|
padding: 7px 7px 7px 7px;
|
||||||
|
color: #cecece;
|
||||||
|
font-weight: 500;
|
||||||
|
border: none;
|
||||||
|
outline: none;
|
||||||
|
border-radius: 5px;
|
||||||
|
background-color: #c8850a;
|
||||||
|
transition: .3s all;
|
||||||
|
font-family: "Poppins", sans-serif;
|
||||||
|
}
|
||||||
|
|
||||||
|
button:hover {
|
||||||
|
filter: brightness(0.95);
|
||||||
|
}
|
||||||
|
|
||||||
|
button:active {
|
||||||
|
filter: brightness(1.10);
|
||||||
|
}
|
||||||
4
src/resources/renderer/assets/js/index.js
Normal file
4
src/resources/renderer/assets/js/index.js
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
async function callCSharp() {
|
||||||
|
const result = await system.call("hello::world")
|
||||||
|
alert(result)
|
||||||
|
}
|
||||||
34
src/resources/renderer/assets/js/ipc.js
Normal file
34
src/resources/renderer/assets/js/ipc.js
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
const system = {
|
||||||
|
_pendingRequests: new Map(),
|
||||||
|
|
||||||
|
init: function() {
|
||||||
|
window.external.receiveMessage(response => {
|
||||||
|
try {
|
||||||
|
const res = JSON.parse(response)
|
||||||
|
if (res.requestId && this._pendingRequests.has(res.requestId)) {
|
||||||
|
const { resolve } = this._pendingRequests.get(res.requestId)
|
||||||
|
this._pendingRequests.delete(res.requestId)
|
||||||
|
resolve(res.payload)
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
console.error("Erreur format message :", e)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},
|
||||||
|
|
||||||
|
call: function(functionName, data = {}) {
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
const requestId = Math.random().toString(36).substring(7)
|
||||||
|
|
||||||
|
this._pendingRequests.set(requestId, { resolve, reject })
|
||||||
|
|
||||||
|
window.external.sendMessage(JSON.stringify({
|
||||||
|
requestId: requestId,
|
||||||
|
functionName: functionName,
|
||||||
|
payload: data
|
||||||
|
}))
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
system.init()
|
||||||
24
src/resources/renderer/index.html
Normal file
24
src/resources/renderer/index.html
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
<link rel="stylesheet" href="./assets/css/index.css">
|
||||||
|
<title></title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
|
||||||
|
<main>
|
||||||
|
<h2>
|
||||||
|
Bienvenue dans Photino
|
||||||
|
</h2>
|
||||||
|
<button onclick="callCSharp()">
|
||||||
|
Appellez une fonction C#
|
||||||
|
</button>
|
||||||
|
</main>
|
||||||
|
|
||||||
|
<script src="./assets/js/ipc.js"></script>
|
||||||
|
<script src="./assets/js/index.js"></script>
|
||||||
|
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
Loading…
x
Reference in New Issue
Block a user