Skip to content

Commit 955d423

Browse files
committed
Added some starting images
1 parent 02cf952 commit 955d423

17 files changed

Lines changed: 146 additions & 15 deletions

SpawnDev.MatrixLEDDisplay.Demo/Pages/MediaItem.razor

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -71,17 +71,20 @@
7171
},
7272
});
7373
}
74-
options.Add(new ContextMenuItem()
74+
if (!MediaLibraryItem.ReadOnly)
7575
{
76-
Text = $"Remove",
77-
Icon = "delete",
78-
Value = async () =>
76+
options.Add(new ContextMenuItem()
7977
{
80-
var confirm = await DialogService.Confirm($"Remove from media library? {Name}", "Are you sure?");
81-
if (confirm != true) return;
82-
await MediaLibraryManager.Remove(MediaLibraryItem.Name);
83-
},
84-
});
78+
Text = $"Remove",
79+
Icon = "delete",
80+
Value = async () =>
81+
{
82+
var confirm = await DialogService.Confirm($"Remove from media library? {Name}", "Are you sure?");
83+
if (confirm != true) return;
84+
await MediaLibraryManager.Remove(MediaLibraryItem.Name);
85+
},
86+
});
87+
}
8588
ContextMenuService.Open(args, options, OnMenuItemClick);
8689
}
8790
void OnMenuItemClick(MenuItemEventArgs args)

SpawnDev.MatrixLEDDisplay.Demo/Program.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
builder.Services.AddSingleton<AppTrayService>();
3434
builder.Services.AddSingleton<MainLayoutService>();
3535
builder.Services.AddSingleton<ThemeTrayIconService>();
36-
builder.Services.AddSingleton<MediaLibraryManager>();
36+
builder.Services.AddSingleton<AssetManifestService>();
37+
builder.Services.AddSingleton<MediaLibraryManager>();
3738

3839
await builder.Build().BlazorJSRunAsync();
Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
using SpawnDev.BlazorJS;
2+
using System.Text.Json;
3+
4+
namespace SpawnDev.MatrixLEDDisplay.Demo.Services
5+
{
6+
public class AssetManifestService : IAsyncBackgroundService
7+
{
8+
Task? _Ready;
9+
public Task Ready => _Ready ??= InitAsync();
10+
HttpClient HttpClient;
11+
public AssetManifest? AssetManifest { get; private set; }
12+
public AssetManifestService(HttpClient httpClient)
13+
{
14+
HttpClient = httpClient;
15+
}
16+
async Task InitAsync()
17+
{
18+
AssetManifest = await GetAssetManifest();
19+
}
20+
JsonSerializerOptions JsonSerializerOptions = new JsonSerializerOptions { PropertyNameCaseInsensitive = true };
21+
async Task<AssetManifest?> GetAssetManifest()
22+
{
23+
AssetManifest? ret = null;
24+
var assetManifestFile = "service-worker-assets.js";
25+
string? assetManifestResp = null;
26+
try
27+
{
28+
assetManifestResp = await HttpClient.GetStringAsync(assetManifestFile);
29+
}
30+
catch (Exception ex)
31+
{
32+
//JS.Log("Failed to download the asset manifest file", ex.Message);
33+
}
34+
if (!string.IsNullOrEmpty(assetManifestResp))
35+
{
36+
// http starts is coded to be loaded into a serviceWorker context using importScript
37+
// trim off the variable assignment so we can process the json
38+
var start = assetManifestResp.IndexOf('{');
39+
if (start > -1)
40+
{
41+
var end = assetManifestResp.LastIndexOf('}');
42+
if (end > -1)
43+
{
44+
var json = assetManifestResp.Substring(start, 1 + end - start);
45+
try
46+
{
47+
ret = JsonSerializer.Deserialize<AssetManifest>(json, JsonSerializerOptions);
48+
}
49+
catch (Exception ex)
50+
{
51+
//JS.Log("Failed to deserialize the asset manifest file", ex.Message);
52+
}
53+
}
54+
}
55+
}
56+
return ret;
57+
}
58+
}
59+
60+
/// <summary>
61+
/// Asset manifest
62+
/// </summary>
63+
public class AssetManifest
64+
{
65+
/// <summary>
66+
/// Assets
67+
/// </summary>
68+
public List<ManifestAsset> Assets { get; set; }
69+
/// <summary>
70+
/// Version
71+
/// </summary>
72+
public string Version { get; set; }
73+
}
74+
/// <summary>
75+
/// Manifest asset info
76+
/// </summary>
77+
public class ManifestAsset
78+
{
79+
/// <summary>
80+
/// File content hash. This should be the base-64-formatted SHA256 value.
81+
/// </summary>
82+
public string Hash { get; set; }
83+
/// <summary>
84+
/// Asset URL. Normally this will be relative to the application's base href.
85+
/// </summary>
86+
public string Url { get; set; }
87+
}
88+
}

SpawnDev.MatrixLEDDisplay.Demo/Services/MediaLibraryItem.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,13 @@ namespace SpawnDev.MatrixLEDDisplay.Demo.Services
55
public class MediaLibraryItem : IDisposable
66
{
77
public string Name { get; set; }
8-
public string Url { get; set; }
9-
public MediaLibraryItem(string name, Blob blob)
8+
public string Url { get; private set; }
9+
public bool ReadOnly { get; private set; }
10+
public MediaLibraryItem(string name, Blob blob, bool readOnly)
1011
{
1112
Name = name;
1213
Url = URL.CreateObjectURL(blob);
14+
ReadOnly = readOnly;
1315
}
1416
public void Dispose()
1517
{

SpawnDev.MatrixLEDDisplay.Demo/Services/MediaLibraryManager.cs

Lines changed: 33 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,15 +19,20 @@ public class MediaLibraryManager : IAsyncBackgroundService
1919
NotificationService NotificationService;
2020
DialogService DialogService;
2121
public List<MediaLibraryItem> MediaItems { get; private set; } = new List<MediaLibraryItem>();
22-
public MediaLibraryManager(BlazorJSRuntime js, NotificationService notificationService, DialogService dialogService)
22+
HttpClient HttpClient;
23+
AssetManifestService AssetManifestService;
24+
public MediaLibraryManager(BlazorJSRuntime js, HttpClient httpClient, NotificationService notificationService, DialogService dialogService, AssetManifestService assetManifestService)
2325
{
2426
JS = js;
27+
HttpClient = httpClient;
2528
NotificationService = notificationService;
2629
DialogService = dialogService;
30+
AssetManifestService = assetManifestService;
2731
window = JS.Get<Window>("window");
2832
}
2933
async Task InitAsync()
3034
{
35+
await AssetManifestService.Ready;
3136
window.AddEventListener("dragover", Callback.Create<DragEvent>(Window_OnDragOver, callbackGroup));
3237
window.AddEventListener("drop", Callback.Create<DragEvent>(Window_OnDrop, callbackGroup));
3338
LibraryCache = await Cache.OpenCache("MediaLibrary");
@@ -79,12 +84,21 @@ public async Task<bool> Remove(string fileName)
7984
}
8085
async Task UpdateMediaItems()
8186
{
82-
var files = await LibraryCache.GetAllFiles();
8387
var newList = new List<MediaLibraryItem>();
88+
var included = await GetIncludedPixelArt();
89+
foreach (var file in included)
90+
{
91+
using var resp = await JS.Fetch(file);
92+
var fileBlob = await resp.Blob();
93+
var mediaItem = new MediaLibraryItem(file, fileBlob, true);
94+
newList.Add(mediaItem);
95+
}
96+
var files = await LibraryCache.GetAllFiles();
8497
foreach (var file in files)
8598
{
8699
var fileBlob = await LibraryCache.ReadBlob(file);
87-
var mediaItem = new MediaLibraryItem(file, fileBlob);
100+
if (fileBlob == null) continue;
101+
var mediaItem = new MediaLibraryItem(file, fileBlob, false);
88102
newList.Add(mediaItem);
89103
}
90104
var previous = MediaItems.ToList();
@@ -132,5 +146,21 @@ void StateHasChanged()
132146
{
133147
OnStateChanged?.Invoke();
134148
}
149+
async Task<List<string>> GetIncludedPixelArt()
150+
{
151+
var ret = new List<string>();
152+
var assetManifest = AssetManifestService.AssetManifest;
153+
if (assetManifest != null)
154+
{
155+
foreach (var asset in assetManifest.Assets)
156+
{
157+
if (asset.Url.StartsWith("pixelart/"))
158+
{
159+
ret.Add(asset.Url);
160+
}
161+
}
162+
}
163+
return ret;
164+
}
135165
}
136166
}

SpawnDev.MatrixLEDDisplay.Demo/SpawnDev.MatrixLEDDisplay.Demo.csproj

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
<Nullable>enable</Nullable>
66
<ImplicitUsings>enable</ImplicitUsings>
77
<CompressionEnabled>false</CompressionEnabled>
8+
<ServiceWorkerAssetsManifest>service-worker-assets.js</ServiceWorkerAssetsManifest>
89
</PropertyGroup>
910

1011
<ItemGroup>
@@ -13,6 +14,10 @@
1314
<PackageReference Include="Radzen.Blazor" Version="7.3.1" />
1415
</ItemGroup>
1516

17+
<ItemGroup>
18+
<ServiceWorker Include="wwwroot\service-worker.js" PublishedContent="wwwroot\service-worker.published.js" />
19+
</ItemGroup>
20+
1621
<ItemGroup>
1722
<ProjectReference Include="..\SpawnDev.MatrixLEDDisplay\SpawnDev.MatrixLEDDisplay.csproj" />
1823
</ItemGroup>
174 KB
Loading
17.2 KB
Loading
29.2 KB
Loading
12.3 KB
Loading

0 commit comments

Comments
 (0)