|
2 | 2 | @using SixLabors.ImageSharp.Formats.Gif |
3 | 3 | @using SixLabors.ImageSharp.PixelFormats |
4 | 4 | @using SpawnDev.MatrixLEDDisplay |
| 5 | +@implements IDisposable |
| 6 | + |
5 | 7 | <div class="display-control"> |
6 | 8 | <div> |
7 | 9 | <RadzenMenu> |
8 | | - <RadzenMenuItem Icon="close" title="Disconnect" Click=@(() => DisplayService.RemoveDisplay(display)) /> |
9 | | - <RadzenMenuItem Icon="transition_dissolve" title="Test pattern" disabled="@(!display.Connected)" Click=@(() => display.SendTestPicture(false)) /> |
10 | | - <RadzenMenuItem Icon="image" title="Test image" disabled="@(!display.Connected)" Click=@(() => LoadPenguinImage(display, false)) /> |
11 | | - <RadzenMenuItem Icon="file_open" title="Load image file" disabled="@(!display.Connected)" Click=@(() => display.SelectAndLoadImage(false)) /> |
12 | | - <RadzenMenuItem Icon="save" title="Save to display" disabled="@(!display.Connected)" Click=@(() => display.SavePicture()) /> |
13 | | - <RadzenMenuItem Icon="replay" title="Reset" disabled="@(!display.Connected)" Click=@(() => display.Reset()) /> |
14 | | - <RadzenMenuItem Icon="power_off" title="Power off" disabled="@(!display.Connected)" Click=@(() => display.PowerOff()) /> |
15 | | - <RadzenMenuItem Icon="power" title="Power on" disabled="@(!display.Connected)" Click=@(() => display.PowerOn()) /> |
16 | | - <RadzenMenuItem Icon="slideshow" title="Slideshow mode" disabled="@(!display.Connected)" Click=@(() => display.StartSlideShowMode()) /> |
17 | | - @* <RadzenMenuItem Icon="dangerous" title="Slideshow mode" disabled="@(!display.Connected)" Click=@(() => display.SendTestSlideShow()) /> *@ |
| 10 | + <RadzenMenuItem Icon="close" disabled="@(Busy)" title="Disconnect" Click=@(() => DisplayService.RemoveDisplay(Display)) /> |
| 11 | + @* <RadzenMenuItem Icon="transition_dissolve" title="Test pattern" disabled="@(!display.Connected)" Click=@(() => display.SendTestPicture(true)) /> |
| 12 | + <RadzenMenuItem Icon="image" title="Test image" disabled="@(!display.Connected)" Click=@(() => LoadPenguinImage(display, true)) /> *@ |
| 13 | + <RadzenMenuItem Icon="file_open" title="Load image file" disabled="@(!Display.Connected || Busy)" Click=@(() => Display.SelectAndLoadImage(true)) /> |
| 14 | + <RadzenMenuItem Icon="replay" title="Reset" disabled="@(!Display.Connected || Busy)" Click=@(() => Display.Reset()) /> |
| 15 | + <RadzenMenuItem Icon="power_off" title="Power off" disabled="@(!Display.Connected || Busy)" Click=@(() => Display.PowerOff()) /> |
| 16 | + <RadzenMenuItem Icon="power" title="Power on" disabled="@(!Display.Connected || Busy)" Click=@(() => Display.PowerOn()) /> |
| 17 | + @* <RadzenMenuItem Icon="slideshow" title="Slideshow mode" disabled="@(!display.Connected)" Click=@(() => display.StartSlideShowMode()) /> *@ |
18 | 18 | </RadzenMenu> |
19 | 19 | </div> |
20 | 20 | <div> |
21 | 21 | <div title="Matrix display gamma correction"> |
22 | | - <label for="gamma">Gamma: @(Math.Round(display.Gamma, 2))</label> |
23 | | - <UISlider Name="gamma" Min="0" Max="1" Value=@display.Gamma Change="@((v) => display.Gamma = v)" /> |
| 22 | + <label for="gamma">Gamma: @(Math.Round(Display.Gamma, 2))</label> |
| 23 | + <UISlider Disabled="@(!Display.Connected || Busy)" Name="gamma" Min="0" Max="1" Value=@Display.Gamma Change="@((v) => Display.Gamma = v)" /> |
24 | 24 | </div> |
25 | 25 | <div title="Used with images that have transparency"> |
26 | | - <label for="background_color">Background: @display.BackgroundColor.HexColor</label> |
27 | | - <input name="background_color" type="color" @onchange="@(e => ColorPicker(e, display))" value="@display.BackgroundColor.HexColor"> |
| 26 | + <label for="background_color">Background: @Display.BackgroundColor.HexColor</label> |
| 27 | + <input disabled="@(!Display.Connected || Busy)" name="background_color" type="color" @onchange="@(e => ColorPicker(e))" value="@Display.BackgroundColor.HexColor"> |
28 | 28 | </div> |
29 | 29 | <div> |
30 | | - <LEDMatrix Data="display.DrawnData" /> |
| 30 | + <LEDMatrix Display="Display" /> |
31 | 31 | </div> |
32 | 32 | </div> |
33 | 33 | </div> |
|
40 | 40 | MatrixLEDDisplayService DisplayService { get; set; } = default!; |
41 | 41 |
|
42 | 42 | [Parameter] |
43 | | - public MIMatrixDisplay display { get; set; } |
| 43 | + public MIMatrixDisplay Display { get; set; } |
| 44 | + |
| 45 | + bool Busy => Display?.Busy ?? false; |
44 | 46 |
|
45 | | - void ColorPicker(ChangeEventArgs args, MIMatrixDisplay display) |
| 47 | + MIMatrixDisplay? _Display; |
| 48 | + void ColorPicker(ChangeEventArgs args) |
46 | 49 | { |
47 | 50 | var newColor = args.Value as string; |
48 | | - display.BackgroundColor.HexColor = newColor!; |
| 51 | + Display.BackgroundColor.HexColor = newColor!; |
| 52 | + _ = Display.Resend(); |
49 | 53 | } |
50 | | - async Task LoadPenguinImage(MIMatrixDisplay display, bool save) |
| 54 | + void DetachDisplayEvents() |
51 | 55 | { |
52 | | - await display.LoadImageFromURL("pixelart/penguin_16.png", save); |
| 56 | + if (_Display == null) return; |
| 57 | + _Display.OnStateChanged -= _Display_OnStateHasChanged; |
| 58 | + _Display = null; |
| 59 | + } |
| 60 | + void _Display_OnStateHasChanged(MIMatrixDisplay display) |
| 61 | + { |
| 62 | + StateHasChanged(); |
| 63 | + } |
| 64 | + bool _attached = false; |
| 65 | + protected override void OnParametersSet() |
| 66 | + { |
| 67 | + if (_Display != Display) |
| 68 | + { |
| 69 | + DetachDisplayEvents(); |
| 70 | + _Display = Display; |
| 71 | + if (_Display != null) |
| 72 | + { |
| 73 | + _Display.OnStateChanged -= _Display_OnStateHasChanged; |
| 74 | + } |
| 75 | + } |
| 76 | + } |
| 77 | + public void Dispose() |
| 78 | + { |
| 79 | + DetachDisplayEvents(); |
53 | 80 | } |
54 | | - |
55 | | - |
56 | 81 | } |
0 commit comments