145 lines
4.0 KiB
C#
145 lines
4.0 KiB
C#
using System.ComponentModel;
|
||
using System.Runtime.CompilerServices;
|
||
using System.Windows;
|
||
using System.Windows.Input;
|
||
|
||
namespace SHH.CameraDashboard;
|
||
|
||
public class CameraItemTopViewModel : INotifyPropertyChanged
|
||
{
|
||
private WebApiCameraModel _camera;
|
||
|
||
/// <summary>
|
||
/// 当前选中的摄像头数据
|
||
/// </summary>
|
||
public WebApiCameraModel Camera
|
||
{
|
||
get => _camera;
|
||
set
|
||
{
|
||
if (_camera != value)
|
||
{
|
||
_camera = value;
|
||
OnPropertyChanged();
|
||
OnPropertyChanged(nameof(HasSelection)); // 通知界面是否有选中项
|
||
}
|
||
}
|
||
}
|
||
|
||
public ICommand EditDeviceCommand { get; }
|
||
|
||
/// <summary>
|
||
/// 辅助属性:用于界面判断是否显示内容
|
||
/// </summary>
|
||
public bool HasSelection => Camera != null;
|
||
|
||
public ICommand TogglePlayCommand { get; }
|
||
|
||
public ICommand PtzCommand { get; } // [新增]
|
||
|
||
// [新增] 图像处理命令
|
||
public ICommand ImageProcessCommand { get; }
|
||
|
||
// [新增] 图像订阅命令
|
||
public ICommand ImageSubscribeCommand { get; }
|
||
|
||
public CameraItemTopViewModel()
|
||
{
|
||
// 绑定命令到执行方法
|
||
TogglePlayCommand = new RelayCommand<object>(async _ => await ExecuteTogglePlayAsync());
|
||
|
||
// 2. 初始化命令
|
||
EditDeviceCommand = new RelayCommand<object>(ExecuteEditDevice);
|
||
|
||
PtzCommand = new RelayCommand(ExecutePtz);
|
||
|
||
DeleteCommand = new RelayCommand(ExecuteDelete);
|
||
|
||
// 初始化新命令
|
||
ImageProcessCommand = new RelayCommand(ExecuteImageProcess);
|
||
ImageSubscribeCommand = new RelayCommand(ExecuteImageSubscribe);
|
||
}
|
||
|
||
// [新增] 执行图像处理
|
||
private void ExecuteImageProcess(object obj)
|
||
{
|
||
if (Camera == null) return;
|
||
|
||
// 触发全局事件,打开右侧面板
|
||
AppGlobal.RequestImgProc(this.Camera);
|
||
}
|
||
|
||
// [新增] 执行图像订阅
|
||
private void ExecuteImageSubscribe(object obj)
|
||
{
|
||
if (Camera == null) return;
|
||
|
||
// 不再直接 MessageBox,而是像 Edit/Ptz 一样发出全局请求
|
||
// 这会将操作权交给 MainViewModel,由它在右侧面板加载 View
|
||
AppGlobal.RequestSubscription(this.Camera);
|
||
}
|
||
|
||
private void ExecutePtz(object obj)
|
||
{
|
||
// 这里可以加个判断,比如 Brand=RTSP 或 File 可能不支持云台
|
||
// if (Model.Brand == (int)DeviceBrand.File) return;
|
||
|
||
AppGlobal.RequestPtz(this.Camera);
|
||
}
|
||
|
||
private async Task ExecuteTogglePlayAsync()
|
||
{
|
||
if (Camera == null) return;
|
||
|
||
// 1. 物理离线检查
|
||
if (!Camera.IsPhysicalOnline)
|
||
{
|
||
// 提示:设备断网,无法发送指令
|
||
MessageBox.Show("设备物理离线,无法操作");
|
||
return;
|
||
}
|
||
|
||
try
|
||
{
|
||
// 发送控制指令
|
||
var useServiceNode = AppGlobal.UseServiceNode;
|
||
if (useServiceNode != null)
|
||
{
|
||
bool isPlaying = Camera.Status.Equals("Playing");
|
||
bool isSuccess = await ApiClient.Instance.Cameras.ControlPowerAsync(
|
||
Camera.Id,
|
||
!isPlaying,
|
||
"设备面板"
|
||
);
|
||
}
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// 执行编辑逻辑
|
||
/// </summary>
|
||
private void ExecuteEditDevice(object obj)
|
||
{
|
||
if (Camera == null) return;
|
||
|
||
AppGlobal.RequestEdit(Camera);
|
||
}
|
||
|
||
// 2. 自身的删除命令 (不需要参数,因为我手里有 Model)
|
||
public ICommand DeleteCommand { get; }
|
||
|
||
private void ExecuteDelete(object obj)
|
||
{
|
||
// 直接把手里的数据发出去
|
||
AppGlobal.RequestDelete(this.Camera);
|
||
}
|
||
|
||
|
||
public event PropertyChangedEventHandler? PropertyChanged;
|
||
|
||
protected void OnPropertyChanged([CallerMemberName] string name = "")
|
||
=> PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
|
||
} |