using System;
using System.Collections.Generic;
using System.Text;
namespace Shared.Phone.UserCenter.Residence
{
///
/// 编辑房间信息的界面
///
public class EditorRoomInforForm : EditorCommonForm
{
#region ■ 变量声明___________________________
///
/// 结束编辑的事件
///
public Action FinishEditorEvent = null;
///
/// 列表控件
///
private FrameListControl listview = null;
///
/// 房间对象
///
private Common.Room editorRoom = null;
///
/// 克隆对象
///
private Common.Room cloneRoom = null;
///
/// 改变房间图片
///
private bool changedRoomPic = false;
#endregion
#region ■ 初始化_____________________________
///
/// 画面显示(底层会固定调用此方法,借以完成画面创建)
///
/// 编辑的房间对象
public void ShowForm(Common.Room i_editorRoom = null)
{
//弄一点初始值
this.editorRoom = i_editorRoom;
this.cloneRoom = HdlRoomLogic.Current.CloneRoomClass(i_editorRoom);
if (i_editorRoom.HumidityDevice == string.Empty)
{
this.cloneRoom.Humidity = -1000;
}
if (i_editorRoom.TemperatrueDevice == string.Empty)
{
this.cloneRoom.Temperatrue = -1000;
}
//设置头部信息
base.SetTitleText(Language.StringByID(R.MyInternationalizationString.uEditorRoom));
//初始化中部信息
this.InitMiddleFrame();
}
///
/// 初始化中部信息
///
private void InitMiddleFrame()
{
//清空bodyFrame
this.ClearBodyFrame();
var listBackControl = new VerticalFrameControl();
listBackControl.Height = bodyFrameLayout.Height;
bodyFrameLayout.AddChidren(listBackControl);
//加一个白色背景
var frameBack1 = new FrameLayout();
frameBack1.Height = Application.GetRealHeight(450);
frameBack1.Y = Application.GetRealHeight(196);
frameBack1.BackgroundColor = UserCenterColor.Current.White;
frameBack1.SetCornerWithSameRadius(Application.GetRealHeight(58), HDLUtils.RectCornerTopLeft | HDLUtils.RectCornerTopRight);
listBackControl.frameTable.AddChidren(frameBack1);
//初始化信息桌布
var tableContr = new InformationEditorControl();
this.listview = tableContr.InitControl(listBackControl.frameTable, Language.StringByID(R.MyInternationalizationString.uInfoEditor), 1175);
//房间图片底部阴影
var btnShadow = new PicViewControl(853, 593);
btnShadow.Y = Application.GetRealHeight(58);
btnShadow.Gravity = Gravity.CenterHorizontal;
btnShadow.UnSelectedImagePath = "Room/RoomShadow.png";
listBackControl.frameTable.AddChidren(btnShadow);
//房间图片
var btnPic = new ImageView();
btnPic.Y = Application.GetRealHeight(60);
btnPic.Width = this.GetPictrueRealSize(824);
btnPic.Height = this.GetPictrueRealSize(549);
btnPic.Radius = (uint)Application.GetRealHeight(17);
btnPic.Gravity = Gravity.CenterHorizontal;
if (this.editorRoom.BackgroundImageType == 0)
{
btnPic.ImagePath = this.editorRoom.BackgroundImage;
}
else
{
btnPic.ImageBytes = Common.Global.ReadFileByHomeId(this.editorRoom.BackgroundImage);
}
listBackControl.frameTable.AddChidren(btnPic);
//图片遮罩
var btnZhezhao = new FrameLayout();
btnZhezhao.Width = btnPic.Width;
btnZhezhao.Height = btnPic.Height;
btnZhezhao.Y = btnPic.Y;
btnZhezhao.Gravity = Gravity.CenterHorizontal;
btnZhezhao.BackgroundColor = UserCenterColor.Current.PictrueZhezhaoColor;
btnZhezhao.Radius = (uint)Application.GetRealHeight(17);
listBackControl.frameTable.AddChidren(btnZhezhao);
//分享的房间不能编辑
if (this.editorRoom.IsSharedRoom == false)
{
btnZhezhao.MouseUpEventHandler += (sender, e) =>
{
//房间图片选择
this.RoomPictrueSelect(btnPic);
};
}
//变更一下那个白色背景的Y轴,它到图片的中间位置
frameBack1.Y = btnPic.Y + btnPic.Height / 2;
//添加全部菜单
this.AddAllMenuRow(tableContr, btnPic);
}
#endregion
#region ■ 添加菜单___________________________
///
/// 添加全部菜单
///
private void AddAllMenuRow(InformationEditorControl tableContr, ImageView btnPic)
{
//【房间名称】
FrameCaptionInputControl txtRoomName = null;
if (this.editorRoom.IsLove == false)
{
txtRoomName = new FrameCaptionInputControl(Language.StringByID(R.MyInternationalizationString.uRoomName), this.cloneRoom.Name, this.listview.rowSpace / 2);
txtRoomName.txtInput.PlaceholderText = Language.StringByID(R.MyInternationalizationString.uPleaseInputRoomName);
listview.AddChidren(txtRoomName);
txtRoomName.InitControl();
//底线
txtRoomName.AddBottomLine();
}
else
{
//我的喜爱不能编辑名字
var rowRoomName = new FrameCaptionViewControl(Language.StringByID(R.MyInternationalizationString.uRoomName), this.cloneRoom.Name, this.listview.rowSpace / 2);
listview.AddChidren(rowRoomName);
rowRoomName.UseClickStatu = false;
rowRoomName.InitControl();
//底线
rowRoomName.AddBottomLine();
}
//该APP为有楼层的模式才开启这个菜单
if (this.editorRoom.IsLove == false && string.IsNullOrEmpty(this.cloneRoom.FloorId) == false)
{
//【所属楼层】
var btnBelone = new FrameCaptionViewControl(Language.StringByID(R.MyInternationalizationString.uBelongeFloor), Common.Config.Instance.Home.FloorDics[this.cloneRoom.FloorId], this.listview.rowSpace / 2);
listview.AddChidren(btnBelone);
btnBelone.InitControl();
//底线
btnBelone.AddBottomLine();
//分享的房间不能修改
if (this.editorRoom.IsSharedRoom == false)
{
//右箭头
btnBelone.AddRightArrow();
btnBelone.ButtonClickEvent += (sender, e) =>
{
//楼层选择
this.ShowSelectFloor(btnBelone);
};
}
}
//【温度】
var rowTemperature = new FrameRowControl(this.listview.rowSpace / 2);
listview.AddChidren(rowTemperature);
rowTemperature.AddLeftCaption(Language.StringByID(R.MyInternationalizationString.uTemperature), 600);
//右箭头
rowTemperature.AddRightArrow();
var btnTemper = rowTemperature.AddMostRightView(Language.StringByID(R.MyInternationalizationString.uNothing), 300);
//底线
rowTemperature.AddBottomLine();
//分享的房间不能修改 或者当前住宅不是虚拟的
if (this.editorRoom.IsSharedRoom == false && Common.Config.Instance.Home.IsVirtually == false)
{
rowTemperature.ButtonClickEvent += (sender, e) =>
{
//显示温度传感器列表
this.ShowTemperatrueDevice(btnTemper);
};
}
if (string.IsNullOrEmpty(cloneRoom.TemperatrueDevice) == false)
{
//获取温度
this.GetTemperatrueValue(btnTemper, cloneRoom.TemperatrueDevice);
}
//【湿度】
var rowHumidity = new FrameRowControl(this.listview.rowSpace / 2);
listview.AddChidren(rowHumidity);
rowHumidity.AddLeftCaption(Language.StringByID(R.MyInternationalizationString.uHumidity), 600);
//右箭头
rowHumidity.AddRightArrow();
var btnHumi = rowHumidity.AddMostRightView(Language.StringByID(R.MyInternationalizationString.uNothing), 300);
//底线
rowHumidity.AddBottomLine();
//分享的房间不能修改 或者当前住宅不是虚拟的
if (this.editorRoom.IsSharedRoom == false && Common.Config.Instance.Home.IsVirtually == false)
{
rowHumidity.ButtonClickEvent += (sender, e) =>
{
//显示湿度传感器列表
this.ShowHumidityDevice(btnHumi);
};
}
if (string.IsNullOrEmpty(cloneRoom.HumidityDevice) == false)
{
//获取湿度
this.GetHumidityValue(btnHumi, cloneRoom.HumidityDevice);
}
//初始化桌布完成
tableContr.FinishInitControl();
tableContr = null;
//分享的房间不能保存
if (this.editorRoom.IsSharedRoom == true)
{
return;
}
//保存
var btnFinish = new BottomClickButton();
btnFinish.TextID = R.MyInternationalizationString.uSave;
bodyFrameLayout.AddChidren(btnFinish);
btnFinish.ButtonClickEvent += (sender, e) =>
{
if (txtRoomName != null)
{
this.cloneRoom.Name = txtRoomName.Text;
}
//检测能否保存房间
if (this.CheckCanSaveRoom() == false)
{
return;
}
//更改图片
if (this.changedRoomPic == true)
{
if (editorRoom.BackgroundImageType == 1 || editorRoom.BackgroundImageType == 2)
{
//删除掉原来的自定义图片
if (Common.Global.IsExistsByHomeId(editorRoom.BackgroundImage) == true)
{
Common.Global.DeleteFilebyHomeId(editorRoom.BackgroundImage);
}
//备份
HdlAutoBackupLogic.DeleteFile(editorRoom.BackgroundImage);
}
//自定义图片
if (cloneRoom.BackgroundImageType == 1 || cloneRoom.BackgroundImageType == 2)
{
//生成图片
string picName = $"RoomIcon_{DateTime.Now.ToString("yyyyMMddHHmmss")}.png";
string picFullName = System.IO.Path.Combine(Common.Config.Instance.FullPath, picName);
Shared.IO.FileUtils.WriteFileByBytes(picFullName, btnPic.ImageBytes);
cloneRoom.BackgroundImage = picName;
//备份
HdlAutoBackupLogic.AddOrEditorFile(picName);
}
}
bool changedFloor = editorRoom.FloorId != cloneRoom.FloorId;
editorRoom.FloorId = cloneRoom.FloorId;
editorRoom.Name = cloneRoom.Name;
editorRoom.HumidityDevice = cloneRoom.HumidityDevice;
if (cloneRoom.Humidity != -1000)
{
editorRoom.Humidity = cloneRoom.Humidity;
}
editorRoom.TemperatrueDevice = cloneRoom.TemperatrueDevice;
if (cloneRoom.Temperatrue != -1000)
{
editorRoom.Temperatrue = cloneRoom.Temperatrue;
}
editorRoom.BackgroundImage = cloneRoom.BackgroundImage;
editorRoom.BackgroundImageType = cloneRoom.BackgroundImageType;
editorRoom.Save();
FinishEditorEvent?.Invoke(this.editorRoom.Name);
if (changedFloor == false)
{
//刷新左滑的房间列表界面的指定房间的信息
MainPage.ListRoomViewFrom.Instance.RefreshRoomInfo(this.editorRoom);
}
else
{
//刷新左滑的房间列表界面的房间列表信息
MainPage.ListRoomViewFrom.Instance.RefreshListRoom();
}
//算了,这里如果按下保存,则主页需要重新刷新
UserView.UserPage.Instance.RefreshForm = true;
this.CloseForm();
};
}
#endregion
#region ■ 楼层选择___________________________
///
/// 楼层选择
///
///
private void ShowSelectFloor(FrameCaptionViewControl control)
{
var dicFloor = HdlRoomLogic.Current.GetFloorSortList();
var listKeys = new List();
var listName = new List();
int index = 0;
foreach (string keys in dicFloor.Keys)
{
listKeys.Add(keys);
listName.Add(dicFloor[keys]);
if (keys == cloneRoom.FloorId)
{
index = listKeys.Count - 1;
}
}
PickerView.Show(listName, (value) =>
{
control.txtView.Text = listName[value];
//主键修改
cloneRoom.FloorId = listKeys[value];
},
index,
Language.StringByID(R.MyInternationalizationString.uBelongeFloor),
Language.StringByID(R.MyInternationalizationString.uFinish),
Language.StringByID(R.MyInternationalizationString.uCancel));
}
#endregion
#region ■ 温度传感器相关_____________________
///
/// 显示温度传感器列表
///
///
private void ShowTemperatrueDevice(NormalViewControl btnTemper)
{
var listDevice = new List();
foreach (var device in Common.LocalDevice.Current.listAllDevice)
{
//获取温度传感器
if (device is ZigBee.Device.TemperatureSensor && ((ZigBee.Device.TemperatureSensor)device).SensorDiv == 1)
{
listDevice.Add(device);
}
}
var listSelect = new List() { cloneRoom.TemperatrueDevice };
var form = new SelectDeviceForm();
form.AddForm(listDevice, listSelect, true, true);
form.ActionSelectDevice += (list) =>
{
if (list.Count == 0)
{
cloneRoom.TemperatrueDevice = string.Empty;
btnTemper.Text = Language.StringByID(R.MyInternationalizationString.uNothing);
return;
}
cloneRoom.TemperatrueDevice = Common.LocalDevice.Current.GetDeviceMainKeys(list[0]);
//获取温度值
this.GetTemperatrueValue(btnTemper, cloneRoom.TemperatrueDevice);
};
}
///
/// 获取温度值
///
///
///
private void GetTemperatrueValue(NormalViewControl btnTemper, string deviceKey)
{
var device = Common.LocalDevice.Current.GetDevice(deviceKey);
if (device == null)
{
return;
}
if (cloneRoom.Temperatrue == -1000)
{
//没有获取得到过温度
btnTemper.Text = Language.StringByID(R.MyInternationalizationString.Getting);
}
else
{
btnTemper.Text = this.cloneRoom.Temperatrue == 0 ? "0.0℃" : this.cloneRoom.Temperatrue.ToString() + "℃";
btnTemper.Text += " " + Language.StringByID(R.MyInternationalizationString.Getting);
}
HdlGatewayReceiveLogic.Current.RemoveEvent("TemperatrueDevice");
HdlGatewayReceiveLogic.Current.AddAttributeEvent("TemperatrueDevice", ReceiveComandDiv.A设备属性上报, ((report) =>
{
string mainKeys = Common.LocalDevice.Current.GetDeviceMainKeys(report);
if (cloneRoom.TemperatrueDevice != mainKeys || btnTemper == null)
{
return;
}
var localDevice = Common.LocalDevice.Current.GetDevice(mainKeys);
HdlThreadLogic.Current.RunMain(() =>
{
if (((ZigBee.Device.TemperatureSensor)localDevice).Temperatrue == 0)
{
//0℃
btnTemper.Text = "0.0℃";
this.cloneRoom.Temperatrue = 0;
}
else
{
//记录温度
this.cloneRoom.Temperatrue = ((ZigBee.Device.TemperatureSensor)localDevice).Temperatrue;
btnTemper.Text = this.cloneRoom.Temperatrue.ToString() + "℃";
}
}, ShowErrorMode.NO);
}));
//发送获取温度的命令
((ZigBee.Device.TemperatureSensor)device).ReadTemperatureOrHumidity();
}
#endregion
#region ■ 湿度传感器相关_____________________
///
/// 显示湿度传感器列表
///
///
private void ShowHumidityDevice(NormalViewControl btnHumi)
{
var listDevice = new List();
foreach (var device in Common.LocalDevice.Current.listAllDevice)
{
//获取湿度传感器
if (device is ZigBee.Device.TemperatureSensor && ((ZigBee.Device.TemperatureSensor)device).SensorDiv == 2)
{
listDevice.Add(device);
}
else if (device.Type == ZigBee.Device.DeviceType.FreshAirHumiditySensor)
{
listDevice.Add(device);
}
}
var listSelect = new List() { cloneRoom.HumidityDevice };
var form = new SelectDeviceForm();
form.AddForm(listDevice, listSelect, true, true);
form.ActionSelectDevice += (list) =>
{
if (list.Count == 0)
{
cloneRoom.HumidityDevice = string.Empty;
btnHumi.Text = Language.StringByID(R.MyInternationalizationString.uNothing);
return;
}
cloneRoom.HumidityDevice = Common.LocalDevice.Current.GetDeviceMainKeys(list[0]);
//获取湿度值
this.GetHumidityValue(btnHumi, cloneRoom.HumidityDevice);
};
}
///
/// 获取湿度值
///
///
///
private void GetHumidityValue(NormalViewControl btnHumi, string deviceKey)
{
var device = Common.LocalDevice.Current.GetDevice(deviceKey);
if (device == null)
{
return;
}
if (cloneRoom.Humidity == -1000)
{
//没有获取得到过湿度
btnHumi.Text = Language.StringByID(R.MyInternationalizationString.Getting);
}
else
{
btnHumi.Text = this.cloneRoom.Humidity == 0 ? "0.0%" : this.cloneRoom.Humidity.ToString() + "%";
btnHumi.Text += " " + Language.StringByID(R.MyInternationalizationString.Getting);
}
HdlGatewayReceiveLogic.Current.RemoveEvent("HumidityDevice");
HdlGatewayReceiveLogic.Current.AddAttributeEvent("HumidityDevice", ReceiveComandDiv.A设备属性上报, (report) =>
{
string mainKeys = Common.LocalDevice.Current.GetDeviceMainKeys(report);
if (cloneRoom.HumidityDevice != mainKeys || btnHumi == null)
{
return;
}
var localDevice = Common.LocalDevice.Current.GetDevice(mainKeys);
HdlThreadLogic.Current.RunMain(() =>
{
decimal humidity = (decimal)localDevice.GetType().InvokeMember("Humidity", System.Reflection.BindingFlags.GetField, null, localDevice, null);
if (humidity == 0)
{
//0
btnHumi.Text = "0.0%";
this.cloneRoom.Humidity = 0;
}
else
{
//记录湿度
this.cloneRoom.Humidity = humidity;
btnHumi.Text = this.cloneRoom.Humidity.ToString() + "%";
}
}, ShowErrorMode.NO);
});
//发送获取湿度的命令
device.GetType().InvokeMember("ReadTemperatureOrHumidity", System.Reflection.BindingFlags.InvokeMethod, null, device, null);
}
#endregion
#region ■ 房间图片选择_______________________
///
/// 房间图片选择
///
///
private void RoomPictrueSelect(ImageView imageContr)
{
var menuContr = new BottomMenuSelectForm();
menuContr.AddForm(3);
//默认图库
menuContr.AddMenu(Language.StringByID(R.MyInternationalizationString.LocalPicture), () =>
{
var form = new SelectLocalRoomImageForm();
form.AddForm();
form.FinishSelectEvent = (imgPath) =>
{
if (string.IsNullOrEmpty(imgPath) == true)
{
return;
}
this.changedRoomPic = true;
this.cloneRoom.BackgroundImageType = 0;
this.cloneRoom.BackgroundImage = imgPath;
imgPath = IO.FileUtils.GetImageFilePath(imgPath);
imageContr.ImageBytes = IO.FileUtils.ReadFile(imgPath);
};
});
//拍照
menuContr.AddMenu(Language.StringByID(R.MyInternationalizationString.Photograph), () =>
{
//通过相机拍照裁剪
CropImage.TakePicture((imagePath) =>
{
if (string.IsNullOrEmpty(imagePath) == true)
{
return;
}
this.changedRoomPic = true;
this.cloneRoom.BackgroundImageType = 1;
imageContr.ImageBytes = Shared.IO.FileUtils.ReadFile(imagePath);
System.IO.File.Delete(imagePath);
}, "HdlPic", 2, 1);
});
//我的相册
menuContr.AddMenu(Language.StringByID(R.MyInternationalizationString.MyAblums), () =>
{
//从相册选择图片裁剪
CropImage.SelectPicture((imagePath) =>
{
if (string.IsNullOrEmpty(imagePath) == true)
{
return;
}
this.changedRoomPic = true;
this.cloneRoom.BackgroundImageType = 2;
imageContr.ImageBytes = Shared.IO.FileUtils.ReadFile(imagePath);
System.IO.File.Delete(imagePath);
}, "HdlPic", 2, 1);
});
}
#endregion
#region ■ 界面关闭___________________________
///
/// 界面关闭
///
public override void CloseFormBefore()
{
this.FinishEditorEvent = null;
HdlGatewayReceiveLogic.Current.RemoveEvent("TemperatrueDevice");
HdlGatewayReceiveLogic.Current.RemoveEvent("HumidityDevice");
base.CloseFormBefore();
}
#endregion
#region ■ 一般方法___________________________
///
/// 检测能否保存房间
///
///
private bool CheckCanSaveRoom()
{
if (this.cloneRoom.Name == string.Empty)
{
//请输入房间名称
this.ShowMassage(ShowMsgType.Error, Language.StringByID(R.MyInternationalizationString.uPleaseInputRoomName));
return false;
}
if (string.IsNullOrEmpty(this.cloneRoom.FloorId) == true)
{
if (HdlRoomLogic.Current.GetAllListRooms().Find((obj) => obj.Name == this.cloneRoom.Name && obj.Id != this.cloneRoom.Id) != null)
{
this.ShowMassage(ShowMsgType.Error, Language.StringByID(R.MyInternationalizationString.HadSameRoom));
return false;
}
}
else
{
var listRoom = HdlRoomLogic.Current.GetFloorSortRoom(this.cloneRoom.FloorId);
if (listRoom.Find((obj) => obj.Name == this.cloneRoom.Name && obj.Id != this.cloneRoom.Id) != null)
{
this.ShowMassage(ShowMsgType.Error, Language.StringByID(R.MyInternationalizationString.HadSameRoom));
return false;
}
}
return true;
}
#endregion
}
}